Skip to content
Merged
53 changes: 22 additions & 31 deletions BlocksScreen/events.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
"""Collection of all custom events used by the application"""

import typing
from PyQt6.QtCore import QEvent


Expand All @@ -14,9 +13,7 @@ class WebSocketConnecting(QEvent):
WebsocketConnectingEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(WebSocketConnecting, self).__init__(
WebSocketConnecting.WebsocketConnectingEvent
)
super().__init__(WebSocketConnecting.WebsocketConnectingEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -38,13 +35,11 @@ class WebSocketMessageReceived(QEvent):

def __init__(
self,
method: typing.Optional[str] = None,
data: typing.Optional[dict] = None,
metadata: typing.Optional[dict] = None,
method: str | None = None,
data: dict | None = None,
metadata: dict | None = None,
):
super(WebSocketMessageReceived, self).__init__(
WebSocketMessageReceived.WebsocketMessageReceivedEvent
)
super().__init__(WebSocketMessageReceived.WebsocketMessageReceivedEvent)
self.method = method
self.data = data
self.metadata = metadata
Expand All @@ -65,7 +60,7 @@ class WebSocketOpen(QEvent):
WebsocketOpenEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(WebSocketOpen, self).__init__(WebSocketOpen.WebsocketOpenEvent)
super().__init__(WebSocketOpen.WebsocketOpenEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -86,7 +81,7 @@ class WebSocketError(QEvent):
WebsocketErrorEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(WebSocketError, self).__init__(WebSocketError.WebsocketErrorEvent)
super().__init__(WebSocketError.WebsocketErrorEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -107,9 +102,7 @@ class WebSocketDisconnected(QEvent):
WebsocketDisconnectedEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(WebSocketDisconnected, self).__init__(
WebSocketDisconnected.WebsocketDisconnectedEvent
)
super().__init__(WebSocketDisconnected.WebsocketDisconnectedEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -131,7 +124,7 @@ class WebSocketClose(QEvent):
WebsocketCloseEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(WebSocketClose, self).__init__(WebSocketClose.WebsocketCloseEvent)
super().__init__(WebSocketClose.WebsocketCloseEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -153,7 +146,7 @@ class KlippyShutdown(QEvent):

def __init__(self, data, *args, **kwargs):
QEvent.__instancecheck__(self)
super(KlippyShutdown, self).__init__(KlippyShutdown.KlippyShutdownEvent)
super().__init__(KlippyShutdown.KlippyShutdownEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -180,7 +173,7 @@ class KlippyReady(QEvent):
KlippyReadyEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(KlippyReady, self).__init__(KlippyReady.KlippyReadyEvent)
super().__init__(KlippyReady.KlippyReadyEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -201,9 +194,7 @@ class KlippyDisconnected(QEvent):
KlippyDisconnectedEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(KlippyDisconnected, self).__init__(
KlippyDisconnected.KlippyDisconnectedEvent
)
super().__init__(KlippyDisconnected.KlippyDisconnectedEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -224,7 +215,7 @@ class KlippyError(QEvent):
KlippyErrorEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, message, *args, **kwargs):
super(KlippyError, self).__init__(KlippyError.KlippyErrorEvent)
super().__init__(KlippyError.KlippyErrorEvent)
self.data = data
self.message = message

Expand Down Expand Up @@ -272,7 +263,7 @@ class PrintStart(QEvent):
PrintStartEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, filename, *args, **kwargs):
super(PrintStart, self).__init__(PrintStart.PrintStartEvent)
super().__init__(PrintStart.PrintStartEvent)
self.file = filename
self.file_metadata = kwargs
self.kwargs = kwargs
Expand All @@ -293,7 +284,7 @@ class PrintComplete(QEvent):
PrintCompleteEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(PrintComplete, self).__init__(PrintComplete.PrintCompleteEvent)
super().__init__(PrintComplete.PrintCompleteEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -314,7 +305,7 @@ class PrintPause(QEvent):
PrintPauseEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(PrintPause, self).__init__(PrintPause.PrintPauseEvent)
super().__init__(PrintPause.PrintPauseEvent)

self.data = data
self.args = args
Expand All @@ -336,7 +327,7 @@ class PrintResume(QEvent):
PrintResumeEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(PrintResume, self).__init__(PrintResume.PrintResumeEvent)
super().__init__(PrintResume.PrintResumeEvent)

self.data = data
self.args = args
Expand All @@ -358,7 +349,7 @@ class PrintCancelled(QEvent):
PrintCancelledEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(PrintCancelled, self).__init__(PrintCancelled.PrintCancelledEvent)
super().__init__(PrintCancelled.PrintCancelledEvent)

self.data = data
self.args = args
Expand All @@ -380,7 +371,7 @@ class PrintError(QEvent):
PrintErrorEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(PrintError, self).__init__(PrintError.PrintErrorEvent)
super().__init__(PrintError.PrintErrorEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -401,7 +392,7 @@ class NetworkAdded(QEvent):
NetworkAddedEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(NetworkAdded, self).__init__(NetworkAdded.NetworkAddedEvent)
super().__init__(NetworkAdded.NetworkAddedEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -422,7 +413,7 @@ class NetworkDeleted(QEvent):
NetworkDeletedEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(NetworkDeleted, self).__init__(NetworkDeleted.NetworkDeletedEvent)
super().__init__(NetworkDeleted.NetworkDeletedEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand All @@ -443,7 +434,7 @@ class NetworkScan(QEvent):
NetworkScanEvent = QEvent.Type(QEvent.registerEventType())

def __init__(self, data, *args, **kwargs):
super(NetworkScan, self).__init__(NetworkScan.NetworkScanEvent)
super().__init__(NetworkScan.NetworkScanEvent)
self.data = data
self.args = args
self.kwargs = kwargs
Expand Down
31 changes: 13 additions & 18 deletions BlocksScreen/lib/filament.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# Class that represents a filament spool

from typing import Optional
import enum


Expand Down Expand Up @@ -29,17 +28,18 @@ def __init__(
self,
name: str,
temperature: int,
brand: Optional[str] = None,
spool_type: Optional[SpoolMaterial] = None,
spool_weight: Optional[float] = None,
brand: str | None = None,
spool_type: SpoolMaterial | None = None,
spool_weight: float | None = None,
):
if not isinstance(name, str) or not isinstance(temperature, int):
raise TypeError("__init__() invalid argument type")

self._name: str = name
self._temperature: int = temperature
self._weight: Optional[float] = None
self._brand: Optional[str] = brand
self._weight: float | None = None
self._brand: str | None = brand
self._spool_type: Filament.SpoolMaterial | None = None

if spool_type is not None and spool_type in self.SpoolMaterial:
self._spool_type = spool_type
Expand All @@ -55,32 +55,27 @@ def temperature(self) -> int:
return self._temperature

@property
def weight(self) -> Optional[float]:
if self._weight is None:
return
def weight(self) -> float | None:
return self._weight

@weight.setter
def weight(self, new_value: float):
self._weight = new_value

@property
def brand(self) -> Optional[str]:
def brand(self) -> str | None:
return self._brand

@brand.setter
def brand(self, new_value: str) -> Optional[str]:
def brand(self, new_value: str) -> None:
self._brand = new_value

@property
def spool_type(self) -> Optional[SpoolMaterial]:
def spool_type(self) -> SpoolMaterial | None:
return self._spool_type

@spool_type.setter
def spool_type(self, new):
if new not in self.SpoolMaterial:
if isinstance(new, self.SpoolMaterial):
raise ValueError(
"Spool Material type is invalid"
) # Correct type but invalid option
def spool_type(self, new) -> None:
if new is not None and not isinstance(new, self.SpoolMaterial):
raise TypeError(f"Spool Material type is invalid: {new!r}")
self._spool_type = new
25 changes: 12 additions & 13 deletions BlocksScreen/lib/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from pathlib import Path

import events
from events import ReceivedFileData
from lib.moonrakerComm import MoonWebSocket
from PyQt6 import QtCore, QtGui, QtWidgets

Expand All @@ -29,7 +28,7 @@ class FileAction(Enum):
UNKNOWN = auto()

@classmethod
def from_string(cls, action: str) -> "FileAction":
def from_string(cls, action: str) -> FileAction:
"""Convert Moonraker action string to enum."""
mapping = {
"create_file": cls.CREATE_FILE,
Expand All @@ -54,7 +53,7 @@ class FileMetadata:

filename: str = ""
thumbnail_images: list[QtGui.QImage] = field(default_factory=list)
filament_total: typing.Union[dict, str, float] = field(default_factory=dict)
filament_total: dict | str | float = field(default_factory=dict)
estimated_time: int = 0
layer_count: int = -1
total_layer: int = -1
Expand All @@ -74,8 +73,8 @@ class FileMetadata:
slicer_version: str = "Unknown"
gcode_start_byte: int = 0
gcode_end_byte: int = 0
print_start_time: typing.Optional[float] = None
job_id: typing.Optional[str] = None
print_start_time: float | None = None
job_id: str | None = None

def to_dict(self) -> dict:
"""Convert to dictionary for signal emission."""
Expand Down Expand Up @@ -109,7 +108,7 @@ def to_dict(self) -> dict:
@classmethod
def from_dict(
cls, data: dict, thumbnail_images: list[QtGui.QImage]
) -> "FileMetadata":
) -> FileMetadata:
"""
`Create FileMetadata from Moonraker API response.`

Expand Down Expand Up @@ -255,7 +254,7 @@ def is_loaded(self) -> bool:
"""Check if initial load is complete."""
return self._initial_load_complete

def get_file_metadata(self, filename: str) -> typing.Optional[FileMetadata]:
def get_file_metadata(self, filename: str) -> FileMetadata | None:
"""Get cached metadata for a file."""
return self._files_metadata.get(filename.removeprefix("/"))

Expand All @@ -279,7 +278,7 @@ def initial_load(self) -> None:
self._initial_load_complete = False
self.request_dir_info[str, bool].emit("", True)

def handle_filelist_changed(self, data: typing.Union[dict, list]) -> None:
def handle_filelist_changed(self, data: dict | list) -> None:
"""Handle notify_filelist_changed from Moonraker."""
if isinstance(data, dict) and "params" in data:
data = data.get("params", [])
Expand Down Expand Up @@ -492,7 +491,7 @@ def _process_metadata(self, data: dict) -> None:
self.fileinfo.emit(metadata.to_dict())
logger.debug(f"Metadata loaded for: {filename}")

def handle_metadata_error(self, error_data: typing.Union[str, dict]) -> None:
def handle_metadata_error(self, error_data: str | dict) -> None:
"""
Handle metadata request error from Moonraker.

Expand Down Expand Up @@ -538,7 +537,7 @@ def _preload_usb_contents(self, usb_path: str) -> None:
self._usb_preload_queue.append(usb_path)
self.ws.api.get_dir_information(usb_path, True)

def get_cached_usb_files(self, usb_path: str) -> typing.Optional[list[dict]]:
def get_cached_usb_files(self, usb_path: str) -> list[dict] | None:
"""
Get cached files for a USB path if available.

Expand Down Expand Up @@ -646,7 +645,7 @@ def on_request_fileinfo(self, filename: str) -> None:
@QtCore.pyqtSlot(str, bool, name="get_dir_info")
def get_dir_information(
self, directory: str = "", extended: bool = True
) -> typing.Optional[list]:
) -> list | None:
"""Get directory information."""
self._current_directory = directory

Expand All @@ -669,8 +668,8 @@ def eventFilter(self, obj: QtCore.QObject, event: QtCore.QEvent) -> bool:

def event(self, event: QtCore.QEvent) -> bool:
"""Handle object-level events."""
if event.type() == ReceivedFileData.type():
if isinstance(event, ReceivedFileData):
if event.type() == events.ReceivedFileData.type():
if isinstance(event, events.ReceivedFileData):
self.handle_message_received(event.method, event.data, event.params)
return True
return super().event(event)
Expand Down
2 changes: 1 addition & 1 deletion BlocksScreen/lib/klipper_message_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import enum
import re
from dataclasses import dataclass
from typing import Callable
from collections.abc import Callable


class MessageSource(enum.Enum):
Expand Down
2 changes: 1 addition & 1 deletion BlocksScreen/lib/machine.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class MachineControl(QtCore.QObject):
service_restart = QtCore.pyqtSignal(str, name="service-restart")

def __init__(self, parent: typing.Optional["QtCore.QObject"]) -> None:
super(MachineControl, self).__init__(parent)
super().__init__(parent)
self.setObjectName("MachineControl")

@QtCore.pyqtSlot(name="machine_restart")
Expand Down
Loading
Loading