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
+
+ GroupButton
+ QPushButton
+
+
DisplayButton
QPushButton
@@ -5567,11 +5770,6 @@ Home
QLabel
-
- GroupButton
- QPushButton
-
-
@@ -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