Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
800 changes: 657 additions & 143 deletions BlocksScreen/lib/files.py

Large diffs are not rendered by default.

40 changes: 25 additions & 15 deletions BlocksScreen/lib/panels/mainWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@
from lib.panels.networkWindow import NetworkControlWindow
from lib.panels.printTab import PrintTab
from lib.panels.utilitiesTab import UtilitiesTab
from lib.panels.widgets.basePopup import BasePopup
from lib.panels.widgets.connectionPage import ConnectionPage
from lib.panels.widgets.loadWidget import LoadingOverlayWidget
from lib.panels.widgets.popupDialogWidget import Popup
from lib.panels.widgets.updatePage import UpdatePage
from lib.printer import Printer
from lib.ui.mainWindow_ui import Ui_MainWindow # With header
from lib.panels.widgets.updatePage import UpdatePage
from lib.panels.widgets.basePopup import BasePopup
from lib.panels.widgets.loadWidget import LoadingOverlayWidget

# from lib.ui.mainWindow_v2_ui import Ui_MainWindow # No header
from lib.ui.resources.background_resources_rc import *
Expand Down Expand Up @@ -578,7 +578,7 @@ def _handle_notify_klippy_message(self, method, data, metadata) -> None:
@api_handler
def _handle_notify_filelist_changed_message(self, method, data, metadata) -> None:
"""Handle websocket file list messages"""
...
self.file_data.handle_filelist_changed(data)

@api_handler
def _handle_notify_service_state_changed_message(
Expand Down Expand Up @@ -617,24 +617,34 @@ def _handle_notify_gcode_response_message(self, method, data, metadata) -> None:

@api_handler
def _handle_error_message(self, method, data, metadata) -> None:
"""Handle error messages"""
"""Handle error messages from Moonraker API."""
self.handle_error_response[list].emit([data, metadata])
if "metadata" in data.get("message", "").lower():
# Quick fix, don't care about no metadata errors
return
if self._popup_toggle:
return
text = data
if isinstance(data, dict):
if "message" in data:
text = f"{data['message']}"
else:
text = data

text = data.get("message", str(data)) if isinstance(data, dict) else str(data)
lower_text = text.lower()

# Metadata errors - silent, handled by files_manager
if "metadata" in lower_text:
self.file_data.handle_metadata_error(text)
return

# File not found - silent
if "file" in lower_text and "does not exist" in lower_text:
return

# Directory not found - navigate back + show popup
if "does not exist" in lower_text:
self.printPanel.filesPage_widget.back_btn.click()

# Show popup for all other errors (including directory errors)
self.popup.new_message(
message_type=Popup.MessageType.ERROR,
message=str(text),
message=text,
userInput=True,
)
_logger.error(text)

@api_handler
def _handle_notify_cpu_throttled_message(self, method, data, metadata) -> None:
Expand Down
15 changes: 15 additions & 0 deletions BlocksScreen/lib/panels/printTab.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,23 @@ def __init__(
self.filesPage_widget.request_dir_info[str].connect(
self.file_data.request_dir_info[str]
)
self.filesPage_widget.request_scan_metadata.connect(
self.ws.api.scan_gcode_metadata
)
self.file_data.metadata_error.connect(self.filesPage_widget.on_metadata_error)
self.filesPage_widget.request_dir_info.connect(self.file_data.request_dir_info)
self.file_data.on_file_list.connect(self.filesPage_widget.on_file_list)
self.file_data.file_added.connect(self.filesPage_widget.on_file_added)
self.file_data.file_removed.connect(self.filesPage_widget.on_file_removed)
self.file_data.file_modified.connect(self.filesPage_widget.on_file_modified)
self.file_data.dir_added.connect(self.filesPage_widget.on_dir_added)
self.file_data.dir_removed.connect(self.filesPage_widget.on_dir_removed)
self.file_data.full_refresh_needed.connect(
self.filesPage_widget.on_full_refresh_needed
)
self.file_data.usb_files_loaded.connect(
self.filesPage_widget.on_usb_files_loaded
)
self.jobStatusPage_widget = JobStatusWidget(self)
self.addWidget(self.jobStatusPage_widget)
self.confirmPage_widget.on_accept.connect(
Expand Down
17 changes: 8 additions & 9 deletions BlocksScreen/lib/panels/widgets/confirmPage.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def __init__(self, parent) -> None:
self._setupUI()
self.setMouseTracking(True)
self.setAttribute(QtCore.Qt.WidgetAttribute.WA_AcceptTouchEvents, True)
self.thumbnail: QtGui.QImage = QtGui.QImage()
self.thumbnail: QtGui.QImage = self._blocksthumbnail
self._thumbnails: typing.List = []
self.directory = "gcodes"
self.filename = ""
Expand All @@ -42,17 +42,19 @@ def __init__(self, parent) -> None:
@QtCore.pyqtSlot(str, dict, name="on_show_widget")
def on_show_widget(self, text: str, filedata: dict | None = None) -> None:
"""Handle widget show"""
if not filedata:
return
directory = os.path.dirname(text)
filename = os.path.basename(text)
self.directory = directory
self.filename = filename
self.cf_file_name.setText(self.filename)
if not filedata:
return
self._thumbnails = filedata.get("thumbnail_images", [])
if self._thumbnails:
_biggest_thumbnail = self._thumbnails[-1] # Show last which is biggest
self.thumbnail = QtGui.QImage(_biggest_thumbnail)
else:
self.thumbnail = self._blocksthumbnail
_total_filament = filedata.get("filament_weight_total")
_estimated_time = filedata.get("estimated_time")
if isinstance(_estimated_time, str):
Expand Down Expand Up @@ -114,12 +116,6 @@ def paintEvent(self, event: QtGui.QPaintEvent) -> None:
self._scene = QtWidgets.QGraphicsScene(self)
self.cf_thumbnail.setScene(self._scene)

# Pick thumbnail or fallback logo
if self.thumbnail.isNull():
self.thumbnail = QtGui.QImage(
"BlocksScreen/lib/ui/resources/media/logoblocks400x300.png"
)

# Scene rectangle (available display area)
graphics_rect = self.cf_thumbnail.rect().toRectF()

Expand Down Expand Up @@ -323,3 +319,6 @@ def _setupUI(self) -> None:
QtCore.Qt.AlignmentFlag.AlignRight | QtCore.Qt.AlignmentFlag.AlignVCenter,
)
self.verticalLayout_4.addLayout(self.cf_content_vertical_layout)
self._blocksthumbnail = QtGui.QImage(
"BlocksScreen/lib/ui/resources/media/logoblocks400x300.png"
)
Loading
Loading