diff --git a/BlocksScreen/lib/panels/controlTab.py b/BlocksScreen/lib/panels/controlTab.py index a66ba1e6..3cadfc87 100644 --- a/BlocksScreen/lib/panels/controlTab.py +++ b/BlocksScreen/lib/panels/controlTab.py @@ -13,6 +13,12 @@ from PyQt6 import QtCore, QtGui, QtWidgets from lib.panels.widgets.popupDialogWidget import Popup +from lib.utils.display_button import DisplayButton +from lib.panels.widgets.slider_selector_page import SliderPage + +from lib.panels.widgets.optionCardWidget import OptionCard +from helper_methods import normalize + class ControlTab(QtWidgets.QStackedWidget): """Printer Control Stacked Widget""" @@ -41,6 +47,8 @@ class ControlTab(QtWidgets.QStackedWidget): request_file_info: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal( str, name="request-file-info" ) + tune_display_buttons: dict = {} + card_options: dict = {} def __init__( self, @@ -73,6 +81,11 @@ def __init__( self.addWidget(self.printcores_page) self.loadpage = LoadScreen(self, LoadScreen.AnimationGIF.DEFAULT) self.addWidget(self.loadpage) + + self.sliderPage = SliderPage(self) + self.addWidget(self.sliderPage) + self.sliderPage.request_back.connect(self.back_button) + self.probe_helper_page.request_page_view.connect( partial(self.change_page, self.indexOf(self.probe_helper_page)) ) @@ -107,6 +120,10 @@ def __init__( self.panel.cp_temperature_btn.clicked.connect( partial(self.change_page, self.indexOf(self.panel.temperature_page)) ) + self.panel.cp_fans_btn.clicked.connect( + partial(self.change_page, self.indexOf(self.panel.fans_page)) + ) + self.panel.fans_back_btn.clicked.connect(self.back_button) self.panel.cp_switch_print_core_btn.clicked.connect(self.show_swapcore) # self.panel.cp_printer_settings_btn.clicked.connect( # partial( @@ -258,9 +275,7 @@ def __init__( ) ) - self.panel.cp_z_tilt_btn.clicked.connect( - lambda: self.handle_ztilt() - ) + self.panel.cp_z_tilt_btn.clicked.connect(lambda: self.handle_ztilt()) self.printcores_page.pc_accept.clicked.connect(self.handle_swapcore) @@ -274,9 +289,134 @@ def __init__( self.panel.cooldown_btn.hide() self.panel.cp_switch_print_core_btn.hide() + self.printer.fan_update[str, str, float].connect(self.on_fan_object_update) + self.printer.fan_update[str, str, int].connect(self.on_fan_object_update) + + @QtCore.pyqtSlot(str, str, float, name="on_fan_update") + @QtCore.pyqtSlot(str, str, int, name="on_fan_update") + def on_fan_object_update( + self, name: str, field: str, new_value: int | float + ) -> None: + """Slot that receives updates from fan objects. + + Args: + name (str): Fan object name + field (str): Field name + new_value (int | float): New value for the field + """ + if "speed" not in field: + return + + # Check if this fan already has a display button + fan_card = self.tune_display_buttons.get(name) + + # Create a new card if it doesn't exist + if fan_card is None: + if not name.startswith(("fan", "fan_generic")): + return + + icon_path = ( + ":/temperature_related/media/btn_icons/blower.svg" + if "blower" in name.lower() + else ":/temperature_related/media/btn_icons/fan.svg" + ) + icon = QtGui.QPixmap(icon_path) + if name == "fan_generic Auxiliary_Cooling_Fans": + name = "Auxiliary\ncooling fans" + elif name == "fan_generic CHAMBER_EXHAUST": + name = "Exhaust" + elif name == "fan_generic Part_Cooling_Fan": + name = "Cooling fan" + else: + name = name.removeprefix("fan_generic") + + card = OptionCard(self, name, str(name), icon) # type: ignore + card.setObjectName(str(name)) + + # Add card to layout and record reference + self.card_options[name] = card + self.panel.fans_content_layout.addWidget(card) + + # If the card doesn't have expected UI properties, discard it + if not hasattr(card, "continue_clicked"): + del card + self.card_options.pop(name, None) + return + + card.setMode(True) + card.secondtext.setText(f"{new_value}%") + card.continue_clicked.connect( + lambda: self.on_slidePage_request( + str(name), + card.secondtext.text().replace("%", ""), + self.on_slider_change, + 0, + 100, + ) + ) + + self.tune_display_buttons[name] = card + self.update() + fan_card = card # reuse for next section - def handle_printcoreupdate(self, value:dict): + # Update existing card value display + if fan_card: + # Only multiply by 100 if it seems like a normalized value (0–1) + value_percent = new_value * 100 if new_value <= 1 else new_value + fan_card.secondtext.setText(f"{value_percent:.0f}%") + @QtCore.pyqtSlot(str, int, "PyQt_PyObject", name="on_slidePage_request") + @QtCore.pyqtSlot(str, int, "PyQt_PyObject", int, int, name="on_slidePage_request") + def on_slidePage_request( + self, + name: str, + current_value: int, + callback, + min_value: int = 0, + max_value: int = 100, + ) -> None: + self.sliderPage.value_selected.connect(callback) + self.sliderPage.set_name(name) + self.sliderPage.set_slider_position(int(current_value)) + self.sliderPage.set_slider_minimum(min_value) + self.sliderPage.set_slider_maximum(max_value) + self.change_page(self.indexOf(self.sliderPage)) + + @QtCore.pyqtSlot(str, int, name="on_slider_change") + def on_slider_change(self, name: str, new_value: int) -> None: + if "speed" in name.lower(): + self.speed_factor_override = new_value / 100 + self.run_gcode_signal.emit(f"M220 S{new_value}") + + if "fan" in name.lower(): + if name.lower() == "fan": + self.run_gcode_signal.emit( + f"M106 S{int(round((normalize(float(new_value / 100), 0.0, 1.0, 0, 255))))}" + ) # [0, 255] Range + else: + self.run_gcode_signal.emit( + f"SET_FAN_SPEED FAN={name} SPEED={float(new_value / 100.00)}" + ) # [0.0, 1.0] Range + + def create_display_button(self, name: str) -> DisplayButton: + """Create and return a DisplayButton + + Args: + name (str): Name for the display button + + Returns: + DisplayButton: The created DisplayButton object + """ + display_button = DisplayButton() + display_button.setObjectName(str(name + "_display")) + display_button.setMinimumSize(QtCore.QSize(150, 50)) + display_button.setMaximumSize(QtCore.QSize(150, 80)) + font = QtGui.QFont() + font.setPointSize(16) + display_button.setFont(font) + return display_button + + def handle_printcoreupdate(self, value: dict): if value["swapping"] == "idle": return @@ -289,14 +429,10 @@ def handle_printcoreupdate(self, value:dict): ) if value["swapping"] == "unloading": self.loadpage.set_status_message("Unloading print core") - + if value["swapping"] == "cleaning": self.loadpage.set_status_message("Cleaning print core") - - - - def _handle_gcode_response(self, messages: list): """Handle gcode response for Z-tilt adjustment""" pattern = r"Retries:\s*(\d+)/(\d+).*?range:\s*([\d.]+)\s*tolerance:\s*([\d.]+)" @@ -305,7 +441,11 @@ def _handle_gcode_response(self, messages: list): if not msg_list: continue - if "Retries:" in msg_list and "range:" in msg_list and "tolerance:" in msg_list: + if ( + "Retries:" in msg_list + and "range:" in msg_list + and "tolerance:" in msg_list + ): print("Match candidate:", msg_list) match = re.search(pattern, msg_list) print("Regex match:", match) @@ -327,7 +467,6 @@ def _handle_gcode_response(self, messages: list): f"Retries: {retries_done}/{retries_total} | Range: {probed_range:.6f} | Tolerance: {tolerance:.6f}" ) - def handle_ztilt(self): """Handle Z-Tilt Adjustment""" self.loadpage.show() @@ -351,7 +490,6 @@ def show_swapcore(self): self.loadpage.show() self.loadpage.set_status_message("Preparing to swap print core") - def handle_swapcore(self): """Handle swap printcore routine finish""" self.printcores_page.setText("Executing \n Firmware Restart") @@ -521,7 +659,7 @@ def on_toolhead_update(self, field: str, values: list) -> None: self.panel.mva_y_value_label.setText(f"{values[1]:.2f}") self.panel.mva_z_value_label.setText(f"{values[2]:.3f}") - if values[0] == "252,50" and values[1] == "250" and values[2] == "50": + if values[0] == "252,50" and values[1] == "250" and values[2] == "50": self.loadpage.hide self.toolhead_info.update({f"{field}": values}) diff --git a/BlocksScreen/lib/panels/widgets/optionCardWidget.py b/BlocksScreen/lib/panels/widgets/optionCardWidget.py index 81cb3bdb..24f48eb8 100644 --- a/BlocksScreen/lib/panels/widgets/optionCardWidget.py +++ b/BlocksScreen/lib/panels/widgets/optionCardWidget.py @@ -5,8 +5,8 @@ from lib.utils.icon_button import IconButton -class OptionCard(QtWidgets.QFrame): - continue_clicked: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal( +class OptionCard(QtWidgets.QAbstractButton): + clicked: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal( "PyQt_PyObject", name="continue_clicked" ) @@ -25,10 +25,10 @@ def __init__( self.icon_background_color = QtGui.QColor(150, 150, 130, 80) self.name = name self.card_text = text + self.doubleT: bool = False self.setupUi(self) - self.continue_button.clicked.connect( - lambda: self.continue_clicked.emit(self) - ) + + self.setMode(False) self.set_card_icon(icon) self.set_card_text(text) @@ -41,7 +41,13 @@ def enable_button(self) -> None: self.repaint() def set_card_icon(self, pixmap: QtGui.QPixmap) -> None: - self.option_icon.setPixmap(pixmap) + scaled = pixmap.scaled( + 300, + 300, + QtCore.Qt.AspectRatioMode.IgnoreAspectRatio, + QtCore.Qt.TransformationMode.SmoothTransformation + ) + self.option_icon.setPixmap(scaled) self.repaint() def set_card_text(self, text: str) -> None: @@ -78,8 +84,51 @@ def leaveEvent(self, a0: QtCore.QEvent) -> None: return super().leaveEvent(a0) def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None: + self.clicked.emit(self) self.update() return super().mousePressEvent(a0) + + def setMode(self, double_mode: bool = False): + """Set the mode of the layout: single or double text.""" + self.doubleT = double_mode + + # Clear existing widgets from layout before adding new ones + while self.verticalLayout.count(): + item = self.verticalLayout.takeAt(0) + widget = item.widget() + if widget is not None: + widget.setParent(None) + + + + if self.doubleT: + self.verticalLayout.addWidget( + self.option_icon, + 0, + QtCore.Qt.AlignmentFlag.AlignHCenter + | QtCore.Qt.AlignmentFlag.AlignBottom, + ) + self.verticalLayout.addWidget( + self.secondtext, 0, QtCore.Qt.AlignmentFlag.AlignHCenter + ) + self.verticalLayout.addWidget( + self.line_separator, 0, QtCore.Qt.AlignmentFlag.AlignCenter + ) + self.verticalLayout.addWidget(self.option_text) + self.verticalLayout.addItem(self.spacer) + self.secondtext.show() + else: + self.verticalLayout.addWidget( + self.option_icon, 0, QtCore.Qt.AlignmentFlag.AlignCenter + ) + self.verticalLayout.addWidget( + self.line_separator, 0, QtCore.Qt.AlignmentFlag.AlignCenter + ) + self.verticalLayout.addWidget(self.option_text) + self.verticalLayout.addWidget(self.continue_button) + + self.update() + def paintEvent(self, a0: QtGui.QPaintEvent) -> None: # Rounded background edges @@ -157,40 +206,40 @@ def setupUi(self, option_card): self.option_icon = BlocksLabel(parent=option_card) self.option_icon.setMinimumSize(QtCore.QSize(200, 150)) self.option_icon.setObjectName("option_icon") - self.verticalLayout.addWidget( - self.option_icon, 0, QtCore.Qt.AlignmentFlag.AlignHCenter + self.option_icon.setScaledContents(True) + _button_font = QtGui.QFont() + _button_font.setBold(True) + _button_font.setPointSize(20) + self.secondtext = QtWidgets.QLabel(parent=option_card) + self.secondtext.setText("%") + self.secondtext.setStyleSheet("color:white") + self.secondtext.setFont(_button_font) + self.secondtext.setObjectName("option_text") + self.secondtext.setWordWrap(True) + self.secondtext.setAlignment( + QtCore.Qt.AlignmentFlag.AlignCenter ) + self.secondtext.hide() self.line_separator = QtWidgets.QFrame(parent=option_card) self.line_separator.setFrameShape(QtWidgets.QFrame.Shape.HLine) self.line_separator.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) self.line_separator.setMinimumSize(150, 2) self.line_separator.setMaximumSize(200, 5) self.line_separator.setObjectName("line_separator") - self.verticalLayout.addWidget( - self.line_separator, - 0, - QtCore.Qt.AlignmentFlag.AlignHCenter - | QtCore.Qt.AlignmentFlag.AlignVCenter, - ) self.option_text = QtWidgets.QLabel(parent=option_card) self.option_text.setMinimumSize(QtCore.QSize(200, 50)) self.option_text.setObjectName("option_text") - self.verticalLayout.addWidget( - self.option_text, - ) - self.continue_button = IconButton(parent=option_card) + self.option_text.setWordWrap(True) + self.option_text.setStyleSheet("color:white") self.option_text.setAlignment( - QtCore.Qt.AlignmentFlag.AlignHCenter - | QtCore.Qt.AlignmentFlag.AlignVCenter + QtCore.Qt.AlignmentFlag.AlignCenter ) - self.option_text.setWordWrap(True) - _button_font = QtGui.QFont() - _button_font.setBold(True) _palette = self.option_text.palette() _palette.setColor(QtGui.QPalette.ColorRole.WindowText, self.text_color) self.option_text.setPalette(_palette) - _button_font.setPointSize(15) + self.option_text.setFont(_button_font) + self.continue_button = IconButton(parent=option_card) sizePolicy = QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding, @@ -209,8 +258,13 @@ def setupUi(self, option_card): QtGui.QPixmap(":/arrow_icons/media/btn_icons/right_arrow.svg"), ) self.continue_button.setObjectName("continue_button") - self.verticalLayout.addWidget(self.continue_button) + self.spacer = QtWidgets.QSpacerItem( + 20, + 40, + QtWidgets.QSizePolicy.Policy.Minimum, + QtWidgets.QSizePolicy.Policy.Expanding, + ) self.retranslateUi(option_card) QtCore.QMetaObject.connectSlotsByName(option_card) diff --git a/BlocksScreen/lib/ui/controlStackedWidget.ui b/BlocksScreen/lib/ui/controlStackedWidget.ui index 949bf57e..92475345 100644 --- a/BlocksScreen/lib/ui/controlStackedWidget.ui +++ b/BlocksScreen/lib/ui/controlStackedWidget.ui @@ -32,7 +32,7 @@ StackedWidget - 0 + 7 @@ -102,8 +102,8 @@ - - + + 0 @@ -146,8 +146,7 @@ - Motion -Control + Z-Tilt false @@ -159,12 +158,12 @@ Control menu_btn - :/motion/media/btn_icons/axis_maintenance.svg + :/z_levelling/media/btn_icons/bed_levelling.svg - - + + 0 @@ -207,8 +206,8 @@ Control - Nozzle -Calibration + Temp. +Control false @@ -220,12 +219,12 @@ Calibration menu_btn - :/z_levelling/media/btn_icons/bed_levelling.svg + :/temperature_related/media/btn_icons/temperature.svg - - + + 0 @@ -268,8 +267,8 @@ Calibration - Temp. -Control + Nozzle +Calibration false @@ -281,12 +280,12 @@ Control menu_btn - :/temperature_related/media/btn_icons/temperature.svg + :/z_levelling/media/btn_icons/bed_levelling.svg - - + + 0 @@ -329,7 +328,8 @@ Control - Z-Tilt + Motion +Control false @@ -341,12 +341,12 @@ Control menu_btn - :/z_levelling/media/btn_icons/bed_levelling.svg + :/motion/media/btn_icons/axis_maintenance.svg - + 0 @@ -389,8 +389,7 @@ Control - Swap -Print Core + Fans false @@ -402,12 +401,12 @@ Print Core menu_btn - :/extruder_related/media/btn_icons/switch_print_core.svg + :/temperature_related/media/btn_icons/fan.svg - + 0 @@ -426,6 +425,45 @@ Print Core 80 + + + Momcake + 19 + false + PreferAntialias + + + + false + + + true + + + Qt::NoContextMenu + + + Qt::LeftToRight + + + + + + Swap +Print Core + + + false + + + true + + + menu_btn + + + :/extruder_related/media/btn_icons/switch_print_core.svg + @@ -5545,6 +5583,166 @@ Home + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 24 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 60 + 20 + + + + + + + + + 0 + 0 + + + + + Momcake + 24 + + + + background: transparent; color: white; + + + Fans + + + Qt::AlignCenter + + + title_text + + + + + + + + 0 + 0 + + + + + 60 + 60 + + + + + 60 + 60 + + + + + Momcake + 20 + false + PreferAntialias + + + + false + + + true + + + Qt::NoContextMenu + + + Qt::LeftToRight + + + + + + Back + + + false + + + true + + + menu_btn + + + icon + + + :/ui/media/btn_icons/back.svg + + + + + + + + + Qt::Vertical + + + + 20 + 111 + + + + + + + + + + + Qt::Vertical + + + + 20 + 111 + + + + + + @@ -5557,6 +5755,11 @@ Home QPushButton
lib.utils.icon_button
+ + GroupButton + QPushButton +
lib.utils.group_button
+
DisplayButton QPushButton @@ -5567,11 +5770,6 @@ Home QLabel
lib.utils.blocks_label
- - GroupButton - QPushButton -
lib.utils.group_button
-
@@ -5583,9 +5781,9 @@ Home + + - - diff --git a/BlocksScreen/lib/ui/controlStackedWidget_ui.py b/BlocksScreen/lib/ui/controlStackedWidget_ui.py index c4d67b04..ea38d5b5 100644 --- a/BlocksScreen/lib/ui/controlStackedWidget_ui.py +++ b/BlocksScreen/lib/ui/controlStackedWidget_ui.py @@ -54,30 +54,54 @@ def setupUi(self, controlStackedWidget): self.verticalLayout.addLayout(self.cp_header_layout) self.cp_content_layout = QtWidgets.QGridLayout() self.cp_content_layout.setObjectName("cp_content_layout") - self.cp_motion_btn = BlocksCustomButton(parent=self.control_page) + self.cp_z_tilt_btn = BlocksCustomButton(parent=self.control_page) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.cp_motion_btn.sizePolicy().hasHeightForWidth()) - self.cp_motion_btn.setSizePolicy(sizePolicy) - self.cp_motion_btn.setMinimumSize(QtCore.QSize(10, 80)) - self.cp_motion_btn.setMaximumSize(QtCore.QSize(250, 80)) + sizePolicy.setHeightForWidth(self.cp_z_tilt_btn.sizePolicy().hasHeightForWidth()) + self.cp_z_tilt_btn.setSizePolicy(sizePolicy) + self.cp_z_tilt_btn.setMinimumSize(QtCore.QSize(10, 80)) + self.cp_z_tilt_btn.setMaximumSize(QtCore.QSize(250, 80)) font = QtGui.QFont() font.setFamily("Momcake") font.setPointSize(19) font.setItalic(False) font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferAntialias) - self.cp_motion_btn.setFont(font) - self.cp_motion_btn.setMouseTracking(False) - self.cp_motion_btn.setTabletTracking(True) - self.cp_motion_btn.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) - self.cp_motion_btn.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) - self.cp_motion_btn.setStyleSheet("") - self.cp_motion_btn.setAutoDefault(False) - self.cp_motion_btn.setFlat(True) - self.cp_motion_btn.setProperty("icon_pixmap", QtGui.QPixmap(":/motion/media/btn_icons/axis_maintenance.svg")) - self.cp_motion_btn.setObjectName("cp_motion_btn") - self.cp_content_layout.addWidget(self.cp_motion_btn, 0, 0, 1, 1) + self.cp_z_tilt_btn.setFont(font) + self.cp_z_tilt_btn.setMouseTracking(False) + self.cp_z_tilt_btn.setTabletTracking(True) + self.cp_z_tilt_btn.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) + self.cp_z_tilt_btn.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) + self.cp_z_tilt_btn.setStyleSheet("") + self.cp_z_tilt_btn.setAutoDefault(False) + self.cp_z_tilt_btn.setFlat(True) + self.cp_z_tilt_btn.setProperty("icon_pixmap", QtGui.QPixmap(":/z_levelling/media/btn_icons/bed_levelling.svg")) + self.cp_z_tilt_btn.setObjectName("cp_z_tilt_btn") + self.cp_content_layout.addWidget(self.cp_z_tilt_btn, 1, 1, 1, 1) + self.cp_temperature_btn = BlocksCustomButton(parent=self.control_page) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.cp_temperature_btn.sizePolicy().hasHeightForWidth()) + self.cp_temperature_btn.setSizePolicy(sizePolicy) + self.cp_temperature_btn.setMinimumSize(QtCore.QSize(10, 80)) + self.cp_temperature_btn.setMaximumSize(QtCore.QSize(250, 80)) + font = QtGui.QFont() + font.setFamily("Momcake") + font.setPointSize(19) + font.setItalic(False) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferAntialias) + self.cp_temperature_btn.setFont(font) + self.cp_temperature_btn.setMouseTracking(False) + self.cp_temperature_btn.setTabletTracking(True) + self.cp_temperature_btn.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) + self.cp_temperature_btn.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) + self.cp_temperature_btn.setStyleSheet("") + self.cp_temperature_btn.setAutoDefault(False) + self.cp_temperature_btn.setFlat(True) + self.cp_temperature_btn.setProperty("icon_pixmap", QtGui.QPixmap(":/temperature_related/media/btn_icons/temperature.svg")) + self.cp_temperature_btn.setObjectName("cp_temperature_btn") + self.cp_content_layout.addWidget(self.cp_temperature_btn, 0, 1, 1, 1) self.cp_nozzles_calibration_btn = BlocksCustomButton(parent=self.control_page) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) @@ -102,54 +126,54 @@ def setupUi(self, controlStackedWidget): self.cp_nozzles_calibration_btn.setProperty("icon_pixmap", QtGui.QPixmap(":/z_levelling/media/btn_icons/bed_levelling.svg")) self.cp_nozzles_calibration_btn.setObjectName("cp_nozzles_calibration_btn") self.cp_content_layout.addWidget(self.cp_nozzles_calibration_btn, 1, 0, 1, 1) - self.cp_temperature_btn = BlocksCustomButton(parent=self.control_page) + self.cp_motion_btn = BlocksCustomButton(parent=self.control_page) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.cp_temperature_btn.sizePolicy().hasHeightForWidth()) - self.cp_temperature_btn.setSizePolicy(sizePolicy) - self.cp_temperature_btn.setMinimumSize(QtCore.QSize(10, 80)) - self.cp_temperature_btn.setMaximumSize(QtCore.QSize(250, 80)) + sizePolicy.setHeightForWidth(self.cp_motion_btn.sizePolicy().hasHeightForWidth()) + self.cp_motion_btn.setSizePolicy(sizePolicy) + self.cp_motion_btn.setMinimumSize(QtCore.QSize(10, 80)) + self.cp_motion_btn.setMaximumSize(QtCore.QSize(250, 80)) font = QtGui.QFont() font.setFamily("Momcake") font.setPointSize(19) font.setItalic(False) font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferAntialias) - self.cp_temperature_btn.setFont(font) - self.cp_temperature_btn.setMouseTracking(False) - self.cp_temperature_btn.setTabletTracking(True) - self.cp_temperature_btn.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) - self.cp_temperature_btn.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) - self.cp_temperature_btn.setStyleSheet("") - self.cp_temperature_btn.setAutoDefault(False) - self.cp_temperature_btn.setFlat(True) - self.cp_temperature_btn.setProperty("icon_pixmap", QtGui.QPixmap(":/temperature_related/media/btn_icons/temperature.svg")) - self.cp_temperature_btn.setObjectName("cp_temperature_btn") - self.cp_content_layout.addWidget(self.cp_temperature_btn, 0, 1, 1, 1) - self.cp_z_tilt_btn = BlocksCustomButton(parent=self.control_page) + self.cp_motion_btn.setFont(font) + self.cp_motion_btn.setMouseTracking(False) + self.cp_motion_btn.setTabletTracking(True) + self.cp_motion_btn.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) + self.cp_motion_btn.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) + self.cp_motion_btn.setStyleSheet("") + self.cp_motion_btn.setAutoDefault(False) + self.cp_motion_btn.setFlat(True) + self.cp_motion_btn.setProperty("icon_pixmap", QtGui.QPixmap(":/motion/media/btn_icons/axis_maintenance.svg")) + self.cp_motion_btn.setObjectName("cp_motion_btn") + self.cp_content_layout.addWidget(self.cp_motion_btn, 0, 0, 1, 1) + self.cp_fans_btn = BlocksCustomButton(parent=self.control_page) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.cp_z_tilt_btn.sizePolicy().hasHeightForWidth()) - self.cp_z_tilt_btn.setSizePolicy(sizePolicy) - self.cp_z_tilt_btn.setMinimumSize(QtCore.QSize(10, 80)) - self.cp_z_tilt_btn.setMaximumSize(QtCore.QSize(250, 80)) + sizePolicy.setHeightForWidth(self.cp_fans_btn.sizePolicy().hasHeightForWidth()) + self.cp_fans_btn.setSizePolicy(sizePolicy) + self.cp_fans_btn.setMinimumSize(QtCore.QSize(10, 80)) + self.cp_fans_btn.setMaximumSize(QtCore.QSize(250, 80)) font = QtGui.QFont() font.setFamily("Momcake") font.setPointSize(19) font.setItalic(False) font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferAntialias) - self.cp_z_tilt_btn.setFont(font) - self.cp_z_tilt_btn.setMouseTracking(False) - self.cp_z_tilt_btn.setTabletTracking(True) - self.cp_z_tilt_btn.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) - self.cp_z_tilt_btn.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) - self.cp_z_tilt_btn.setStyleSheet("") - self.cp_z_tilt_btn.setAutoDefault(False) - self.cp_z_tilt_btn.setFlat(True) - self.cp_z_tilt_btn.setProperty("icon_pixmap", QtGui.QPixmap(":/z_levelling/media/btn_icons/bed_levelling.svg")) - self.cp_z_tilt_btn.setObjectName("cp_z_tilt_btn") - self.cp_content_layout.addWidget(self.cp_z_tilt_btn, 1, 1, 1, 1) + self.cp_fans_btn.setFont(font) + self.cp_fans_btn.setMouseTracking(False) + self.cp_fans_btn.setTabletTracking(True) + self.cp_fans_btn.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) + self.cp_fans_btn.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) + self.cp_fans_btn.setStyleSheet("") + self.cp_fans_btn.setAutoDefault(False) + self.cp_fans_btn.setFlat(True) + self.cp_fans_btn.setProperty("icon_pixmap", QtGui.QPixmap(":/temperature_related/media/btn_icons/fan.svg")) + self.cp_fans_btn.setObjectName("cp_fans_btn") + self.cp_content_layout.addWidget(self.cp_fans_btn, 2, 0, 1, 1) self.cp_switch_print_core_btn = BlocksCustomButton(parent=self.control_page) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) @@ -173,17 +197,7 @@ def setupUi(self, controlStackedWidget): self.cp_switch_print_core_btn.setFlat(True) self.cp_switch_print_core_btn.setProperty("icon_pixmap", QtGui.QPixmap(":/extruder_related/media/btn_icons/switch_print_core.svg")) self.cp_switch_print_core_btn.setObjectName("cp_switch_print_core_btn") - self.cp_content_layout.addWidget(self.cp_switch_print_core_btn, 2, 0, 1, 1) - self.blank_2 = QtWidgets.QWidget(parent=self.control_page) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.blank_2.sizePolicy().hasHeightForWidth()) - self.blank_2.setSizePolicy(sizePolicy) - self.blank_2.setMinimumSize(QtCore.QSize(10, 80)) - self.blank_2.setMaximumSize(QtCore.QSize(250, 80)) - self.blank_2.setObjectName("blank_2") - self.cp_content_layout.addWidget(self.blank_2, 2, 1, 1, 1) + self.cp_content_layout.addWidget(self.cp_switch_print_core_btn, 2, 1, 1, 1) self.verticalLayout.addLayout(self.cp_content_layout) controlStackedWidget.addWidget(self.control_page) self.motion_page = QtWidgets.QWidget() @@ -1981,9 +1995,66 @@ def setupUi(self, controlStackedWidget): self.printer_setting_content_layout.setContentsMargins(0, 0, 0, 0) self.printer_setting_content_layout.setObjectName("printer_setting_content_layout") controlStackedWidget.addWidget(self.printer_settings_page) + self.fans_page = QtWidgets.QWidget() + self.fans_page.setObjectName("fans_page") + self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.fans_page) + self.verticalLayout_5.setObjectName("verticalLayout_5") + spacerItem9 = QtWidgets.QSpacerItem(20, 24, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum) + self.verticalLayout_5.addItem(spacerItem9) + self.fans_header_layout = QtWidgets.QHBoxLayout() + self.fans_header_layout.setObjectName("fans_header_layout") + spacerItem10 = QtWidgets.QSpacerItem(60, 20, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum) + self.fans_header_layout.addItem(spacerItem10) + self.fans_title_label = QtWidgets.QLabel(parent=self.fans_page) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.fans_title_label.sizePolicy().hasHeightForWidth()) + self.fans_title_label.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Momcake") + font.setPointSize(24) + self.fans_title_label.setFont(font) + self.fans_title_label.setStyleSheet("background: transparent; color: white;") + self.fans_title_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.fans_title_label.setObjectName("fans_title_label") + self.fans_header_layout.addWidget(self.fans_title_label) + self.fans_back_btn = IconButton(parent=self.fans_page) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.fans_back_btn.sizePolicy().hasHeightForWidth()) + self.fans_back_btn.setSizePolicy(sizePolicy) + self.fans_back_btn.setMinimumSize(QtCore.QSize(60, 60)) + self.fans_back_btn.setMaximumSize(QtCore.QSize(60, 60)) + font = QtGui.QFont() + font.setFamily("Momcake") + font.setPointSize(20) + font.setItalic(False) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferAntialias) + self.fans_back_btn.setFont(font) + self.fans_back_btn.setMouseTracking(False) + self.fans_back_btn.setTabletTracking(True) + self.fans_back_btn.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) + self.fans_back_btn.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) + self.fans_back_btn.setStyleSheet("") + self.fans_back_btn.setAutoDefault(False) + self.fans_back_btn.setFlat(True) + self.fans_back_btn.setProperty("icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + self.fans_back_btn.setObjectName("fans_back_btn") + self.fans_header_layout.addWidget(self.fans_back_btn) + self.verticalLayout_5.addLayout(self.fans_header_layout) + spacerItem11 = QtWidgets.QSpacerItem(20, 111, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout_5.addItem(spacerItem11) + self.fans_content_layout = QtWidgets.QHBoxLayout() + self.fans_content_layout.setObjectName("fans_content_layout") + self.verticalLayout_5.addLayout(self.fans_content_layout) + spacerItem12 = QtWidgets.QSpacerItem(20, 111, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout_5.addItem(spacerItem12) + controlStackedWidget.addWidget(self.fans_page) self.retranslateUi(controlStackedWidget) - controlStackedWidget.setCurrentIndex(0) + controlStackedWidget.setCurrentIndex(7) QtCore.QMetaObject.connectSlotsByName(controlStackedWidget) def retranslateUi(self, controlStackedWidget): @@ -1991,17 +2062,19 @@ def retranslateUi(self, controlStackedWidget): controlStackedWidget.setWindowTitle(_translate("controlStackedWidget", "StackedWidget")) self.cp_header_title.setText(_translate("controlStackedWidget", "Control")) self.cp_header_title.setProperty("class", _translate("controlStackedWidget", "title_text")) - self.cp_motion_btn.setText(_translate("controlStackedWidget", "Motion\n" + self.cp_z_tilt_btn.setText(_translate("controlStackedWidget", "Z-Tilt")) + self.cp_z_tilt_btn.setProperty("class", _translate("controlStackedWidget", "menu_btn")) + self.cp_temperature_btn.setText(_translate("controlStackedWidget", "Temp.\n" "Control")) - self.cp_motion_btn.setProperty("class", _translate("controlStackedWidget", "menu_btn")) + self.cp_temperature_btn.setProperty("class", _translate("controlStackedWidget", "menu_btn")) self.cp_nozzles_calibration_btn.setText(_translate("controlStackedWidget", "Nozzle\n" "Calibration")) self.cp_nozzles_calibration_btn.setProperty("class", _translate("controlStackedWidget", "menu_btn")) - self.cp_temperature_btn.setText(_translate("controlStackedWidget", "Temp.\n" + self.cp_motion_btn.setText(_translate("controlStackedWidget", "Motion\n" "Control")) - self.cp_temperature_btn.setProperty("class", _translate("controlStackedWidget", "menu_btn")) - self.cp_z_tilt_btn.setText(_translate("controlStackedWidget", "Z-Tilt")) - self.cp_z_tilt_btn.setProperty("class", _translate("controlStackedWidget", "menu_btn")) + self.cp_motion_btn.setProperty("class", _translate("controlStackedWidget", "menu_btn")) + self.cp_fans_btn.setText(_translate("controlStackedWidget", "Fans")) + self.cp_fans_btn.setProperty("class", _translate("controlStackedWidget", "menu_btn")) self.cp_switch_print_core_btn.setText(_translate("controlStackedWidget", "Swap\n" "Print Core")) self.cp_switch_print_core_btn.setProperty("class", _translate("controlStackedWidget", "menu_btn")) @@ -2109,6 +2182,11 @@ def retranslateUi(self, controlStackedWidget): self.printer_settings_back_btn.setText(_translate("controlStackedWidget", "Back")) self.printer_settings_back_btn.setProperty("class", _translate("controlStackedWidget", "menu_btn")) self.printer_settings_back_btn.setProperty("button_type", _translate("controlStackedWidget", "icon")) + self.fans_title_label.setText(_translate("controlStackedWidget", "Fans")) + self.fans_title_label.setProperty("class", _translate("controlStackedWidget", "title_text")) + self.fans_back_btn.setText(_translate("controlStackedWidget", "Back")) + self.fans_back_btn.setProperty("class", _translate("controlStackedWidget", "menu_btn")) + self.fans_back_btn.setProperty("button_type", _translate("controlStackedWidget", "icon")) from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_label import BlocksLabel from lib.utils.display_button import DisplayButton