Skip to content
Merged

Patch #167

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
94cf29d
Build(deps): Bump requests from 2.32.3 to 2.32.4 in /scripts (#105)
dependabot[bot] Nov 26, 2025
3e3583b
Hugoclsc/feature/GitHub actions (#107)
HugoCLSC Nov 28, 2025
420a3e1
Hugoclsc/feature/GitHub actions (#113)
HugoCLSC Dec 5, 2025
bc1156c
Hugoclsc/feature/GitHub actions (#114)
HugoCLSC Dec 5, 2025
ca9eb86
Hugoclsc/feature/GitHub actions (#115)
HugoCLSC Dec 5, 2025
69deb3b
Hugoclsc/feature/GitHub actions (#116)
HugoCLSC Dec 5, 2025
8229438
Refactor/tests compliance (#117)
HugoCLSC Dec 10, 2025
8e48a21
ADD: added overriedCursor to blank cursor (#118)
Robert0Mart Dec 11, 2025
e852346
ADD: color degrade when ON/OFF (#120)
Robert0Mart Dec 11, 2025
868d0fd
Bugfix label overlap (#121)
Robert0Mart Dec 11, 2025
eb18055
Bugfix: Delete file handling and QDialog class refactoring (#128)
HugoCLSC Dec 12, 2025
260b126
Work fan page (#119)
Robert0Mart Dec 12, 2025
70e2c43
Fix issues intruduced in Bugfix label overlap #121 (#129)
HugoCLSC Dec 12, 2025
f703fc6
Fix Merge problems introduced on the previous pull requests (#131)
HugoCLSC Dec 15, 2025
ca9b7f0
Added standard pull request template (#133)
HugoCLSC Dec 15, 2025
3b91e46
Bugfix: fixed white dot on list_model.py (#130)
Robert0Mart Dec 15, 2025
6f4c3e3
Bugfix thumbnail not working (#123)
Robert0Mart Dec 18, 2025
6fbc375
Bugfix uninitilized variable access introduced on #123 (#141)
HugoCLSC Jan 2, 2026
de9fe96
Refactor `SensorPanel`: replace `QListWidgetItem` with `EntryListMode…
gmmcosta15 Jan 2, 2026
4d973b6
Refactor `filesPage.py`: Changed Files List `QtWidgets.QListWidgetIte…
gmmcosta15 Jan 2, 2026
d013f12
Work group button refactor (#137)
Robert0Mart Jan 2, 2026
db29de9
Bugfix `tunePage`: Add clickability and distinct icons to controllabl…
gmmcosta15 Jan 2, 2026
c3bfa56
Work display info UI (#140)
Robert0Mart Jan 2, 2026
11c8572
Work input shapper rework (#134)
Robert0Mart Jan 5, 2026
5339d51
Work connnectivity update page (#139)
Robert0Mart Jan 12, 2026
0e7a3e7
Bugfix/tab unlocking (#147)
Robert0Mart Jan 12, 2026
4ece704
jobStatusPage: only load filedata when printer is printing (#150)
gmmcosta15 Jan 12, 2026
fa53e8c
Bugfix/inputshaper page (#148)
Robert0Mart Jan 14, 2026
1465ea1
work popup features (#144)
Robert0Mart Jan 14, 2026
dd13e39
Improvement/Apply Z‑offset changes immediately, with an option to sav…
gmmcosta15 Jan 14, 2026
95d956f
Work network priority (#122)
Robert0Mart Jan 14, 2026
102a746
Bugfix: fixed loadwidget default being placeholder (gif) (#145)
Robert0Mart Jan 14, 2026
a9a486b
Bugfix/after merge fix (#151)
Robert0Mart Jan 14, 2026
646d997
Merge branch 'main' into dev
HugoCLSC Jan 14, 2026
1a3f83e
Fans controlling UI wasnt working (#153)
gmmcosta15 Jan 14, 2026
92e7e54
Bugfix/update page & Popup logic (#154)
Robert0Mart Jan 14, 2026
ca26de5
bugfix: ipv4 ip command error fix (#155)
gmmcosta15 Jan 15, 2026
0dd5d86
bugfix: fans_widget on tunepage are stacked (#156)
gmmcosta15 Jan 16, 2026
25f2afe
Merge branch 'main' into dev
HugoCLSC Jan 16, 2026
c17c7ae
Merge remote-tracking branch 'origin/main' into dev
HugoCLSC Jan 16, 2026
a5f3600
bugfix ztilt loadscreen (#158)
Robert0Mart Jan 19, 2026
7b1fdb7
Merge remote-tracking branch 'origin/main' into dev
HugoCLSC Jan 19, 2026
a17c8eb
bugfix: inputshaper load not hiding (#161)
Robert0Mart Jan 19, 2026
14a6084
bugfix/popup show right arrow (#163)
gmmcosta15 Jan 20, 2026
d0144bf
swap lower and raise nozzle icons (#164)
gmmcosta15 Jan 20, 2026
d62879f
Refactor loadscreen on the project (#165)
Robert0Mart Jan 20, 2026
61ff8fd
Merge remote-tracking branch 'origin/main' into dev
HugoCLSC Jan 21, 2026
5a6732c
Deleted Unused `ztilt_state` variable from control tab (#166)
HugoCLSC Jan 21, 2026
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
41 changes: 14 additions & 27 deletions BlocksScreen/lib/panels/controlTab.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@

from helper_methods import normalize
from lib.moonrakerComm import MoonWebSocket
from lib.panels.widgets.basePopup import BasePopup
from lib.panels.widgets.loadWidget import LoadingOverlayWidget
from lib.panels.widgets.numpadPage import CustomNumpad
from lib.panels.widgets.optionCardWidget import OptionCard
from lib.panels.widgets.popupDialogWidget import Popup
Expand Down Expand Up @@ -47,6 +45,7 @@ class ControlTab(QtWidgets.QStackedWidget):
request_file_info: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal(
str, name="request-file-info"
)
call_load_panel = QtCore.pyqtSignal(bool, str, name="call-load-panel")
tune_display_buttons: dict = {}
card_options: dict = {}

Expand Down Expand Up @@ -77,15 +76,10 @@ def __init__(
self.move_speed: float = 25.0
self.probe_helper_page = ProbeHelper(self)
self.addWidget(self.probe_helper_page)
self.probe_helper_page.call_load_panel.connect(self.call_load_panel)
self.printcores_page = SwapPrintcorePage(self)
self.addWidget(self.printcores_page)

self.loadscreen = BasePopup(self, floating=False, dialog=False)
self.loadwidget = LoadingOverlayWidget(
self, LoadingOverlayWidget.AnimationGIF.DEFAULT
)
self.loadscreen.add_widget(self.loadwidget)

self.sliderPage = SliderPage(self)
self.addWidget(self.sliderPage)
self.sliderPage.request_back.connect(self.back_button)
Expand Down Expand Up @@ -298,9 +292,7 @@ def __init__(

def _handle_z_tilt_object_update(self, value, state):
if state:
self.ztilt_state = state
if self.loadscreen.isVisible():
self.loadscreen.hide()
self.call_load_panel.emit(False, "")

@QtCore.pyqtSlot(str, str, float, name="on_fan_update")
@QtCore.pyqtSlot(str, str, int, name="on_fan_update")
Expand Down Expand Up @@ -425,17 +417,16 @@ def handle_printcoreupdate(self, value: dict):
return

if value["swapping"] == "in_pos":
self.loadscreen.hide()
self.call_load_panel.emit(False, "")
self.printcores_page.show()
self.disable_popups.emit(True)
self.printcores_page.setText(
"Please Insert Print Core \n \n Afterwards click continue"
)
if value["swapping"] == "unloading":
self.loadwidget.set_status_message("Unloading print core")

self.call_load_panel.emit(True, "Unloading print core")
if value["swapping"] == "cleaning":
self.loadwidget.set_status_message("Cleaning print core")
self.call_load_panel.emit(True, "Cleaning print core")

def _handle_gcode_response(self, messages: list):
"""Handle gcode response for Z-tilt adjustment"""
Expand All @@ -458,20 +449,17 @@ def _handle_gcode_response(self, messages: list):
probed_range = float(match.group(3))
tolerance = float(match.group(4))
if retries_done == retries_total:
self.loadscreen.hide()
self.call_load_panel.emit(False, "")
return

self.loadwidget.set_status_message(
f"Retries: {retries_done}/{retries_total} | Range: {probed_range:.6f} | Tolerance: {tolerance:.6f}"
self.call_load_panel.emit(
True,
f"Retries: {retries_done}/{retries_total} | Range: {probed_range:.6f} | Tolerance: {tolerance:.6f}",
)

def handle_ztilt(self):
"""Handle Z-Tilt Adjustment"""
self.loadscreen.show()
self.loadwidget.set_status_message(
"Please wait, performing Z-axis calibration."
)
self.run_gcode_signal.emit("G28\nM400\nZ_TILT_ADJUST")
self.call_load_panel.emit(True, "Please wait, performing Z-axis calibration.")
self.run_gcode_signal.emit("Z_TILT_ADJUST")

@QtCore.pyqtSlot(str, name="on-klippy-status")
def on_klippy_status(self, state: str):
Expand All @@ -487,8 +475,7 @@ def on_klippy_status(self, state: str):
def show_swapcore(self):
"""Show swap printcore"""
self.run_gcode_signal.emit("CHANGE_PRINTCORES")
self.loadscreen.show()
self.loadwidget.set_status_message("Preparing to swap print core")
self.call_load_panel.emit(True, "Preparing to swap print core")

def handle_swapcore(self):
"""Handle swap printcore routine finish"""
Expand Down Expand Up @@ -660,7 +647,7 @@ def on_toolhead_update(self, field: str, values: list) -> None:
self.panel.mva_z_value_label.setText(f"{values[2]:.3f}")

if values[0] == "252,50" and values[1] == "250" and values[2] == "50":
self.loadscreen.hide
self.call_load_panel.emit(False, "")
self.toolhead_info.update({f"{field}": values})

@QtCore.pyqtSlot(str, str, float, name="on-extruder-update")
Expand Down
57 changes: 28 additions & 29 deletions BlocksScreen/lib/panels/filamentTab.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
from lib.filament import Filament
from lib.ui.filamentStackedWidget_ui import Ui_filamentStackedWidget

from lib.panels.widgets.loadWidget import LoadingOverlayWidget
from lib.panels.widgets.basePopup import BasePopup
from lib.panels.widgets.popupDialogWidget import Popup
from PyQt6 import QtCore, QtGui, QtWidgets

Expand All @@ -19,6 +17,7 @@ class FilamentTab(QtWidgets.QStackedWidget):
request_change_page = QtCore.pyqtSignal(int, int, name="request_change_page")
request_toolhead_count = QtCore.pyqtSignal(int, name="toolhead_number_received")
run_gcode = QtCore.pyqtSignal(str, name="run_gcode")
call_load_panel = QtCore.pyqtSignal(bool, str, name="call-load-panel")

class FilamentTypes(enum.Enum):
PLA = Filament(name="PLA", temperature=220)
Expand All @@ -42,11 +41,6 @@ def __init__(self, parent: QtWidgets.QWidget, printer: Printer, ws, /) -> None:
self.target_temp: int = 0
self.current_temp: int = 0
self.popup = Popup(self)
self.loadscreen = BasePopup(self, floating=False, dialog=False)
self.loadwidget = LoadingOverlayWidget(
self, LoadingOverlayWidget.AnimationGIF.DEFAULT
)
self.loadscreen.add_widget(self.loadwidget)
self.has_load_unload_objects = None
self._filament_state = self.FilamentStates.UNKNOWN
self._sensor_states = {}
Expand Down Expand Up @@ -130,34 +124,39 @@ def on_extruder_update(
"""Handle extruder update"""
if not self.isVisible:
return

if self.target_temp != 0:
if self.current_temp == self.target_temp:
self.loadwidget.set_status_message("Extruder heated up \n Please wait")
return
if field == "temperature":
self.current_temp = round(new_value, 0)
self.loadwidget.set_status_message(
f"Heating up ({new_value}/{self.target_temp}) \n Please wait"
)
if field == "target":
self.target_temp = round(new_value, 0)
self.loadwidget.set_status_message("Heating up \n Please wait")
if not self.loadignore or not self.unloadignore:
if self.target_temp != 0:
if self.current_temp == self.target_temp:
if self.isVisible:
self.call_load_panel.emit(
True, "Extruder heated up \n Please wait"
)
return
if field == "temperature":
self.current_temp = round(new_value, 0)
if self.isVisible:
self.call_load_panel.emit(
True,
f"Heating up ({new_value}/{self.target_temp}) \n Please wait",
)
if field == "target":
self.target_temp = round(new_value, 0)
if self.isVisible:
self.call_load_panel.emit(True, "Heating up \n Please wait")

@QtCore.pyqtSlot(bool, name="on_load_filament")
def on_load_filament(self, status: bool):
"""Handle load filament object updated"""
if self.loadignore:
self.loadignore = False
return

if not self.isVisible:
return
if status:
self.loadscreen.show()
self.call_load_panel.emit(True, "Loading Filament")
else:
self.target_temp = 0
self.loadscreen.hide()
self.call_load_panel.emit(False, "")
self._filament_state = self.FilamentStates.LOADED
self.handle_filament_state()

Expand All @@ -167,14 +166,12 @@ def on_unload_filament(self, status: bool):
if self.unloadignore:
self.unloadignore = False
return

if not self.isVisible:
return

if status:
self.loadscreen.show()
self.call_load_panel.emit(True, "Unloading Filament")
else:
self.loadscreen.hide()
self.call_load_panel.emit(False, "")
self.target_temp = 0
self._filament_state = self.FilamentStates.UNLOADED
self.handle_filament_state()
Expand All @@ -197,7 +194,8 @@ def load_filament(self, toolhead: int = 0, temp: int = 220) -> None:
message="Filament is already loaded.",
)
return
self.loadscreen.show()
self.loadignore = False
self.call_load_panel.emit(True, "Loading Filament")
self.run_gcode.emit(f"LOAD_FILAMENT TOOLHEAD=load_toolhead TEMPERATURE={temp}")

@QtCore.pyqtSlot(str, int, name="unload_filament")
Expand All @@ -220,7 +218,8 @@ def unload_filament(self, toolhead: int = 0, temp: int = 220) -> None:
return

self.find_routine_objects()
self.loadscreen.show()
self.unload_filament = False
self.call_load_panel.emit(True, "Unloading Filament")
self.run_gcode.emit(f"UNLOAD_FILAMENT TEMPERATURE={temp}")

def handle_filament_state(self):
Expand Down
47 changes: 40 additions & 7 deletions BlocksScreen/lib/panels/mainWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
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 @@ -63,6 +65,7 @@ class MainWindow(QtWidgets.QMainWindow):
on_update_message: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal(
dict, name="on-update-message"
)
call_load_panel = QtCore.pyqtSignal(bool, str, name="call-load-panel")

def __init__(self):
super(MainWindow, self).__init__()
Expand Down Expand Up @@ -140,6 +143,7 @@ def __init__(self):
slot=self.mc.restart_klipper_service
)
self.conn_window.reboot_clicked.connect(slot=self.mc.machine_restart)

self.printer_object_report_signal.connect(
self.printer.on_object_report_received
)
Expand Down Expand Up @@ -175,11 +179,46 @@ def __init__(self):
self.conn_window.update_button_clicked.connect(self.show_update_page)
self.ui.extruder_temp_display.display_format = "upper_downer"
self.ui.bed_temp_display.display_format = "upper_downer"

self.controlPanel.call_load_panel.connect(self.show_LoadScreen)
self.filamentPanel.call_load_panel.connect(self.show_LoadScreen)
self.printPanel.call_load_panel.connect(self.show_LoadScreen)
self.utilitiesPanel.call_load_panel.connect(self.show_LoadScreen)
self.conn_window.call_load_panel.connect(self.show_LoadScreen)

self.loadscreen = BasePopup(self, floating=False, dialog=False)
self.loadwidget = LoadingOverlayWidget(
self, LoadingOverlayWidget.AnimationGIF.DEFAULT
)
self.loadscreen.add_widget(self.loadwidget)
if self.config.has_section("server"):
# @ Start websocket connection with moonraker
self.bo_ws_startup.emit()
self.reset_tab_indexes()

@QtCore.pyqtSlot(bool, str, name="show-load-page")
def show_LoadScreen(self, show: bool = True, msg: str = ""):
_sender = self.sender()

if _sender == self.filamentPanel:
if not self.filamentPanel.isVisible():
return
if _sender == self.controlPanel:
if not self.controlPanel.isVisible():
return
if _sender == self.printPanel:
if not self.printPanel.isVisible():
return
if _sender == self.utilitiesPanel:
if not self.utilitiesPanel.isVisible():
return

self.loadwidget.set_status_message(msg)
if show:
self.loadscreen.show()
else:
self.loadscreen.hide()

@QtCore.pyqtSlot(bool, name="show-update-page")
def show_update_page(self, fullscreen: bool):
"""Slot for displaying update Panel"""
Expand Down Expand Up @@ -365,7 +404,7 @@ def global_change_page(self, tab_index: int, panel_index: int) -> None:
"Panel page index expected type int, %s", str(type(panel_index))
)

self.printPanel.loadscreen.hide()
self.show_LoadScreen(False)
current_page = [
self.ui.main_content_widget.currentIndex(),
self.current_panel_index(),
Expand Down Expand Up @@ -575,9 +614,6 @@ def _handle_notify_gcode_response_message(self, method, data, metadata) -> None:
message=str(_message),
userInput=True,
)
if not self.controlPanel.ztilt_state:
if self.controlPanel.loadscreen.isVisible():
self.controlPanel.loadscreen.hide()

@api_handler
def _handle_error_message(self, method, data, metadata) -> None:
Expand All @@ -599,9 +635,6 @@ def _handle_error_message(self, method, data, metadata) -> None:
message=str(text),
userInput=True,
)
if not self.controlPanel.ztilt_state:
if self.controlPanel.loadscreen.isVisible():
self.controlPanel.loadscreen.hide()

@api_handler
def _handle_notify_cpu_throttled_message(self, method, data, metadata) -> None:
Expand Down
12 changes: 2 additions & 10 deletions BlocksScreen/lib/panels/printTab.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
from lib.panels.widgets.confirmPage import ConfirmWidget
from lib.panels.widgets.filesPage import FilesPage
from lib.panels.widgets.jobStatusPage import JobStatusWidget
from lib.panels.widgets.loadWidget import LoadingOverlayWidget
from lib.panels.widgets.numpadPage import CustomNumpad
from lib.panels.widgets.sensorsPanel import SensorsWindow
from lib.panels.widgets.slider_selector_page import SliderPage
Expand Down Expand Up @@ -63,6 +62,7 @@ class PrintTab(QtWidgets.QStackedWidget):
on_cancel_print: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal(
name="on_cancel_print"
)
call_load_panel = QtCore.pyqtSignal(bool, str, name="call-load-panel")

_z_offset: float = 0.0
_active_z_offset: float = 0.0
Expand Down Expand Up @@ -92,12 +92,6 @@ def __init__(
self.numpadPage.request_back.connect(self.back_button)
self.addWidget(self.numpadPage)

self.loadscreen = BasePopup(self, floating=False, dialog=False)
self.loadwidget = LoadingOverlayWidget(
self, LoadingOverlayWidget.AnimationGIF.DEFAULT
)
self.loadscreen.add_widget(self.loadwidget)

self.file_data: Files = file_data
self.filesPage_widget = FilesPage(self)
self.addWidget(self.filesPage_widget)
Expand Down Expand Up @@ -372,9 +366,7 @@ def setProperty(self, name: str, value: typing.Any) -> bool:
def handle_cancel_print(self) -> None:
"""Handles the print cancel action"""
self.ws.api.cancel_print()
self.loadscreen.show()
self.loadscreen.setModal(True)
self.loadwidget.set_status_message("Cancelling print...\nPlease wait")
self.call_load_panel.emit(True, "Cancelling print...\nPlease wait")

def change_page(self, index: int) -> None:
"""Requests a page change page to the global manager
Expand Down
Loading