diff --git a/BlocksScreen/lib/panels/controlTab.py b/BlocksScreen/lib/panels/controlTab.py index 9e81d323..8bb36df6 100644 --- a/BlocksScreen/lib/panels/controlTab.py +++ b/BlocksScreen/lib/panels/controlTab.py @@ -272,12 +272,6 @@ def __init__( ) ) - self.path = { - "fan_cage": QtGui.QPixmap(":/fan_related/media/btn_icons/fan_cage.svg"), - "blower": QtGui.QPixmap(":/fan_related/media/btn_icons/blower.svg"), - "fan": QtGui.QPixmap(":/fan_related/media/btn_icons/fan.svg"), - } - self.panel.cp_z_tilt_btn.clicked.connect(lambda: self.handle_ztilt()) self.printcores_page.pc_accept.clicked.connect(self.handle_swapcore) diff --git a/BlocksScreen/lib/panels/filamentTab.py b/BlocksScreen/lib/panels/filamentTab.py index 015e7915..ecb692c3 100644 --- a/BlocksScreen/lib/panels/filamentTab.py +++ b/BlocksScreen/lib/panels/filamentTab.py @@ -18,6 +18,7 @@ from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_frame import BlocksCustomFrame from lib.utils.blocks_linedit import BlocksCustomLinEdit +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from lib.utils.list_model import EntryDelegate, EntryListModel, ListItem from PyQt6 import QtCore, QtGui, QtWidgets @@ -175,7 +176,7 @@ def _build_form_page(self) -> QtWidgets.QWidget: back_btn = IconButton(page) back_btn.setFixedSize(QtCore.QSize(60, 60)) back_btn.setFlat(True) - back_btn.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + back_btn.setPixmap(BlocksPixmap.get(Icon.BACK)) back_btn.clicked.connect(lambda: self.popup.hide()) hdr.addWidget(back_btn) @@ -290,9 +291,7 @@ def _update_swatch(): skip_btn.setText("Skip") skip_btn.setFont(font) skip_btn.clicked.connect(self.handle_skip_button) - skip_btn.setPixmap( - QtGui.QPixmap(":/arrow_icons/media/btn_icons/right_arrow.svg") - ) + skip_btn.setPixmap(BlocksPixmap.get(Icon.RIGHT_ARROW)) btn_row.addWidget(skip_btn) accept_btn = BlocksCustomButton(page) @@ -300,7 +299,7 @@ def _update_swatch(): accept_btn.setText("Accept") accept_btn.setFont(font) accept_btn.clicked.connect(self.on_popup_accept) - accept_btn.setPixmap(QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg")) + accept_btn.setPixmap(BlocksPixmap.get(Icon.YES)) btn_row.addWidget(accept_btn) root.addLayout(btn_row) @@ -331,7 +330,7 @@ def _build_spool_page(self) -> QtWidgets.QWidget: back_btn = IconButton(page) back_btn.setFixedSize(QtCore.QSize(60, 60)) back_btn.setFlat(True) - back_btn.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + back_btn.setPixmap(BlocksPixmap.get(Icon.BACK)) back_btn.clicked.connect(lambda: self.popup.hide()) hdr.addWidget(back_btn) @@ -486,15 +485,13 @@ def _add_row(title_text: str) -> QtWidgets.QLabel: self.skip_btn.setText("Skip") self.skip_btn.setFixedSize(QtCore.QSize(230, 80)) self.skip_btn.setFont(font) - self.skip_btn.setPixmap( - QtGui.QPixmap(":/arrow_icons/media/btn_icons/right_arrow.svg") - ) + self.skip_btn.setPixmap(BlocksPixmap.get(Icon.RIGHT_ARROW)) self.skip_btn.clicked.connect(self.handle_skip_button) self.accept_btn = BlocksCustomButton(frame_2) self.accept_btn.setText("Accept") self.accept_btn.setFixedSize(QtCore.QSize(230, 80)) - self.accept_btn.setPixmap(QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg")) + self.accept_btn.setPixmap(BlocksPixmap.get(Icon.YES)) self.accept_btn.setFont(font) self.accept_btn.clicked.connect(lambda: self._on_spool_selected()) @@ -958,7 +955,7 @@ def setupUi(self): self.fp_button_1.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) self.fp_button_1.setProperty( "icon_pixmap", - QtGui.QPixmap(":/filament_related/media/btn_icons/load_filament.svg"), + BlocksPixmap.get(Icon.LOAD_FILAMENT), ) self.fp_button_1.setObjectName("fp_button_1") @@ -973,7 +970,7 @@ def setupUi(self): self.fp_button_2.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) self.fp_button_2.setProperty( "icon_pixmap", - QtGui.QPixmap(":/filament_related/media/btn_icons/base dados spool 1.svg"), + BlocksPixmap.get(Icon.BASE_DADOS_SPOOL_1), ) self.fp_button_2.setObjectName("fp_button_2") diff --git a/BlocksScreen/lib/panels/printTab.py b/BlocksScreen/lib/panels/printTab.py index 41e83b4c..72ea79dd 100644 --- a/BlocksScreen/lib/panels/printTab.py +++ b/BlocksScreen/lib/panels/printTab.py @@ -17,6 +17,7 @@ from lib.panels.widgets.tunePage import TuneWidget from lib.printer import Printer from lib.utils.blocks_button import BlocksCustomButton +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.display_button import DisplayButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -541,9 +542,7 @@ def setupMainPrintPage(self) -> None: self.main_print_btn.setStyleSheet("") self.main_print_btn.setAutoDefault(False) self.main_print_btn.setFlat(True) - self.main_print_btn.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/print.svg") - ) + self.main_print_btn.setProperty("icon_pixmap", BlocksPixmap.get(Icon.PRINT)) self.main_print_btn.setObjectName("main_print_btn") self.save_config_btn = DisplayButton(parent=self.print_page) self.save_config_btn.setGeometry(QtCore.QRect(540, 20, 170, 50)) @@ -555,9 +554,7 @@ def setupMainPrintPage(self) -> None: self.save_config_btn.setContextMenuPolicy( QtCore.Qt.ContextMenuPolicy.NoContextMenu ) - self.save_config_btn.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/save.svg") - ) + self.save_config_btn.setProperty("icon_pixmap", BlocksPixmap.get(Icon.SAVE)) self.save_config_btn.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) self.save_config_btn.setStyleSheet("") self.save_config_btn.setAutoDefault(False) diff --git a/BlocksScreen/lib/panels/utilitiesTab.py b/BlocksScreen/lib/panels/utilitiesTab.py index eaf85855..88f341b5 100644 --- a/BlocksScreen/lib/panels/utilitiesTab.py +++ b/BlocksScreen/lib/panels/utilitiesTab.py @@ -12,8 +12,9 @@ from lib.printer import Printer from lib.ui.utilitiesStackedWidget_ui import Ui_utilitiesStackedWidget from lib.utils.blocks_button import BlocksCustomButton +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.toggleAnimatedButton import ToggleAnimatedButton -from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6 import QtCore, QtWidgets @dataclass @@ -127,7 +128,7 @@ def __init__( self._is_timeout_timer.timeout.connect(self._on_is_timeout) # --- PixMap --- - self._led_pixmap = QtGui.QPixmap(":/ui/media/btn_icons/LEDs.svg") + self._led_pixmap = BlocksPixmap.get(Icon.LEDS) # --- UI Setup --- self.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) self.panel.update_btn.clicked.connect( @@ -204,16 +205,14 @@ def __init__( self.printer.printer_config.connect(self.on_printer_config_received) self.printer.gcode_move_update.connect(self.on_gcode_move_update) - self.panel.update_btn.setPixmap( - QtGui.QPixmap(":/system/media/btn_icons/update-software-icon.svg") - ) + self.panel.update_btn.setPixmap(BlocksPixmap.get(Icon.UPDATE_SOFTWARE_ICON)) # ---- Input Shaper ---- self.automatic_is = OptionCard( self, "Automatic\nInput Shaper", "Automatic Input Shaper", - QtGui.QPixmap(":/input_shaper/media/btn_icons/input_shaper_auto.svg"), + BlocksPixmap.get(Icon.INPUT_SHAPER_AUTO), ) # type: ignore self.automatic_is.setObjectName("Automatic_IS_Card") self.panel.is_content_layout.addWidget( @@ -227,7 +226,7 @@ def __init__( self, "Manual\nInput Shaper", "Manual Input Shaper", - QtGui.QPixmap(":/input_shaper/media/btn_icons/input_shaper_manual.svg"), + BlocksPixmap.get(Icon.INPUT_SHAPER_MANUAL), ) # type: ignore self.manual_is.setObjectName("Manual_IS_Card") self.panel.is_content_layout.addWidget( diff --git a/BlocksScreen/lib/panels/widgets/addFilamentPage.py b/BlocksScreen/lib/panels/widgets/addFilamentPage.py index 08e4b09a..e7122d7b 100644 --- a/BlocksScreen/lib/panels/widgets/addFilamentPage.py +++ b/BlocksScreen/lib/panels/widgets/addFilamentPage.py @@ -7,6 +7,7 @@ from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_frame import BlocksCustomFrame from lib.utils.blocks_linedit import BlocksCustomLinEdit +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -242,7 +243,7 @@ def _make_field(parent: QtWidgets.QWidget) -> BlocksCustomLinEdit: back_btn = IconButton(self) back_btn.setFixedSize(QtCore.QSize(60, 60)) back_btn.setFlat(True) - back_btn.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + back_btn.setPixmap(BlocksPixmap.get(Icon.BACK)) back_btn.clicked.connect(self.cancelled) hdr.addWidget(back_btn) root.addLayout(hdr) @@ -367,8 +368,6 @@ def _make_field(parent: QtWidgets.QWidget) -> BlocksCustomLinEdit: submit_btn.setFixedSize(220, 80) submit_btn.setFont(_f(16)) submit_btn.setText("Add\nFilament") - submit_btn.setPixmap( - QtGui.QPixmap(":/filament_related/media/btn_icons/add filament.svg") - ) + submit_btn.setPixmap(BlocksPixmap.get(Icon.ADD_FILAMENT)) submit_btn.clicked.connect(self._on_submit) root.addWidget(submit_btn, alignment=QtCore.Qt.AlignmentFlag.AlignCenter) diff --git a/BlocksScreen/lib/panels/widgets/addSpoolPage.py b/BlocksScreen/lib/panels/widgets/addSpoolPage.py index 9c082991..1d1a5b16 100644 --- a/BlocksScreen/lib/panels/widgets/addSpoolPage.py +++ b/BlocksScreen/lib/panels/widgets/addSpoolPage.py @@ -7,6 +7,7 @@ from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_frame import BlocksCustomFrame from lib.utils.blocks_linedit import BlocksCustomLinEdit +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from lib.utils.list_model import EntryDelegate, EntryListModel, ListItem from PyQt6 import QtCore, QtGui, QtWidgets @@ -286,7 +287,7 @@ def _key_lbl(text: str) -> QtWidgets.QLabel: back_btn = IconButton(self) back_btn.setFixedSize(QtCore.QSize(60, 60)) back_btn.setFlat(True) - back_btn.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + back_btn.setPixmap(BlocksPixmap.get(Icon.BACK)) back_btn.clicked.connect(self.cancelled) hdr.addWidget(back_btn) root.addLayout(hdr) @@ -383,9 +384,7 @@ def _field(label: str) -> BlocksCustomLinEdit: self._submit_btn.setText("Add Spool") self._submit_btn.setEnabled(False) self._submit_btn.clicked.connect(self._on_submit) - self._submit_btn.setPixmap( - QtGui.QPixmap(":/filament_related/media/btn_icons/add spool.svg") - ) + self._submit_btn.setPixmap(BlocksPixmap.get(Icon.ADD_SPOOL)) right_lay.addWidget(self._submit_btn) body.addWidget(right_frame, 1) diff --git a/BlocksScreen/lib/panels/widgets/amuPage.py b/BlocksScreen/lib/panels/widgets/amuPage.py index e11729a8..7c561e1f 100644 --- a/BlocksScreen/lib/panels/widgets/amuPage.py +++ b/BlocksScreen/lib/panels/widgets/amuPage.py @@ -4,6 +4,7 @@ from devices.amu.models import GateInfo from lib.panels.widgets.amuWidgets import SpoolCarousel, SpoolInfoPanel from lib.utils.blocks_frame import BlocksCustomFrame +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -217,9 +218,7 @@ def _build_ui(self): self.main_back_button.setSizePolicy(sizePolicy) self.main_back_button.setMinimumSize(QtCore.QSize(60, 60)) self.main_back_button.setMaximumSize(QtCore.QSize(60, 60)) - self.main_back_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg") - ) + self.main_back_button.setProperty("icon_pixmap", BlocksPixmap.get(Icon.BACK)) self.main_back_button.setObjectName("main_back_button") self.filament_page_header_layout.addWidget(self.main_back_button) diff --git a/BlocksScreen/lib/panels/widgets/amuWidgets.py b/BlocksScreen/lib/panels/widgets/amuWidgets.py index 81e53404..46aa40c8 100644 --- a/BlocksScreen/lib/panels/widgets/amuWidgets.py +++ b/BlocksScreen/lib/panels/widgets/amuWidgets.py @@ -3,6 +3,7 @@ from devices.amu.models import GateStatus from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_linedit import BlocksCustomLinEdit +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -21,12 +22,8 @@ def __init__(self, parent=None): self.weight = 0 self.setCheckable(True) self.setMinimumHeight(100) - self._icon = QtGui.QPixmap( - ":/filament_related/media/btn_icons/loaded_spool.svg" - ) - self._unloaded_icon = QtGui.QPixmap( - ":/filament_related/media/btn_icons/half_spoll.svg" - ) + self._icon = BlocksPixmap.get(Icon.LOADED_SPOOL) + self._unloaded_icon = BlocksPixmap.get(Icon.HALF_SPOLL) def setColor(self, qc: QtGui.QColor): """sets button color @@ -213,13 +210,9 @@ def _build_ui(self): root = QtWidgets.QHBoxLayout(self) self.left_arrow = IconButton(self) - self.left_arrow.setPixmap( - QtGui.QPixmap(":/arrow_icons/media/btn_icons/arrow_left.svg") - ) + self.left_arrow.setPixmap(BlocksPixmap.get(Icon.ARROW_LEFT)) self.right_arrow = IconButton(self) - self.right_arrow.setPixmap( - QtGui.QPixmap(":/arrow_icons/media/btn_icons/arrow_right.svg") - ) + self.right_arrow.setPixmap(BlocksPixmap.get(Icon.ARROW_RIGHT)) self.right_arrow.setFixedWidth(60) self.left_arrow.setFixedWidth(60) @@ -449,27 +442,19 @@ def make_val(text="—", edit: bool = True, type: str = "keypad"): self._btn_load.setText("Load") self._btn_load.setFixedSize(140, 60) self._btn_load.setFont(font) - self._btn_load.setPixmap( - QtGui.QPixmap(":/filament_related/media/btn_icons/load_filament.svg") - ) + self._btn_load.setPixmap(BlocksPixmap.get(Icon.LOAD_FILAMENT)) self._btn_unload = BlocksCustomButton(self) self._btn_unload.setText("Unload") self._btn_unload.setFont(font) - self._btn_unload.setPixmap( - QtGui.QPixmap(":/filament_related/media/btn_icons/unload_filament.svg") - ) + self._btn_unload.setPixmap(BlocksPixmap.get(Icon.UNLOAD_FILAMENT)) self._btn_unload.setFixedSize(140, 60) self._btn_purge = BlocksCustomButton(self) self._btn_purge.setText("Eject") self._btn_purge.setFont(font) - self._btn_purge.setPixmap( - QtGui.QPixmap(":/filament_related/media/btn_icons/eject.svg") - ) + self._btn_purge.setPixmap(BlocksPixmap.get(Icon.EJECT)) self._btn_purge.setFixedSize(140, 60) self._btn_cut = BlocksCustomButton(self) - self._btn_cut.setPixmap( - QtGui.QPixmap(":/filament_related/media/btn_icons/check gate 1.svg") - ) + self._btn_cut.setPixmap(BlocksPixmap.get(Icon.CHECK_GATE_1)) self._btn_cut.setText("Check\nGates") self._btn_cut.setFont(font) self._btn_cut.setFixedSize(140, 60) diff --git a/BlocksScreen/lib/panels/widgets/babystepPage.py b/BlocksScreen/lib/panels/widgets/babystepPage.py index 000e1135..c03d0fe2 100644 --- a/BlocksScreen/lib/panels/widgets/babystepPage.py +++ b/BlocksScreen/lib/panels/widgets/babystepPage.py @@ -2,6 +2,7 @@ import typing from lib.utils.blocks_label import BlocksLabel +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.check_button import BlocksCustomCheckButton from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -179,7 +180,7 @@ def _setupUI(self) -> None: self.babystep_back_btn.setMinimumSize(QtCore.QSize(60, 60)) self.babystep_back_btn.setMaximumSize(QtCore.QSize(60, 60)) self.babystep_back_btn.setFlat(True) - self.babystep_back_btn.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + self.babystep_back_btn.setPixmap(BlocksPixmap.get(Icon.BACK)) header.addWidget(self.babystep_back_btn, 0) main_vlayout.addLayout(header) @@ -226,9 +227,7 @@ def _setupUI(self) -> None: self.bbp_babystep_graphic.setLayoutDirection( QtCore.Qt.LayoutDirection.RightToLeft ) - self.bbp_babystep_graphic.setPixmap( - QtGui.QPixmap(":/graphics/media/graphics/babystep_graphic.png") - ) + self.bbp_babystep_graphic.setPixmap(BlocksPixmap.source(Icon.BABYSTEP_GRAPHIC)) self.bbp_babystep_graphic.setScaledContents(False) self.bbp_babystep_graphic.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) @@ -283,9 +282,7 @@ def _setupUI(self) -> None: self.bbp_mvup.setMinimumSize(QtCore.QSize(80, 80)) self.bbp_mvup.setMaximumSize(QtCore.QSize(80, 80)) self.bbp_mvup.setFlat(True) - self.bbp_mvup.setPixmap( - QtGui.QPixmap(":/baby_step/media/btn_icons/move_nozzle_close.svg") - ) + self.bbp_mvup.setPixmap(BlocksPixmap.get(Icon.MOVE_NOZZLE_CLOSE)) move_layout.addWidget(self.bbp_mvup, 0, QtCore.Qt.AlignmentFlag.AlignRight) self.bbp_mvdown = IconButton(parent=self) @@ -293,9 +290,7 @@ def _setupUI(self) -> None: self.bbp_mvdown.setMinimumSize(QtCore.QSize(80, 80)) self.bbp_mvdown.setMaximumSize(QtCore.QSize(80, 80)) self.bbp_mvdown.setFlat(True) - self.bbp_mvdown.setPixmap( - QtGui.QPixmap(":/baby_step/media/btn_icons/move_nozzle_away.svg") - ) + self.bbp_mvdown.setPixmap(BlocksPixmap.get(Icon.MOVE_NOZZLE_AWAY)) move_layout.addWidget(self.bbp_mvdown, 0, QtCore.Qt.AlignmentFlag.AlignRight) content.addLayout(move_layout) diff --git a/BlocksScreen/lib/panels/widgets/bannerPopup.py b/BlocksScreen/lib/panels/widgets/bannerPopup.py index 7db54547..daa560d2 100644 --- a/BlocksScreen/lib/panels/widgets/bannerPopup.py +++ b/BlocksScreen/lib/panels/widgets/bannerPopup.py @@ -1,6 +1,7 @@ import enum from collections import deque +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -137,7 +138,7 @@ def _add_popup(self) -> None: message_type = message_entry.get("type") message = "Unknown Event" - icon = ":ui/media/btn_icons/info.svg" + icon = Icon.INFO # TODO: missing usb icons match message_type: @@ -149,11 +150,11 @@ def _add_popup(self) -> None: # icon = "" case BannerPopup.MessageType.CORRUPTED: message = "Usb Corrupted" - icon = ":/ui/media/btn_icons/troubleshoot.svg" + icon = Icon.TROUBLESHOOT end_rect = self._calculate_target_geometry() start_rect = end_rect.translated(end_rect.width() * 2, 0) - self.icon_label.setPixmap(QtGui.QPixmap(icon)) + self.icon_label.setPixmap(BlocksPixmap.get(icon)) self.slide_in_animation.setStartValue(start_rect) self.slide_in_animation.setEndValue(end_rect) diff --git a/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py b/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py index e149d76b..4618994f 100644 --- a/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py +++ b/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py @@ -7,6 +7,7 @@ from lib.printer import Printer from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_frame import BlocksCustomFrame +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -448,9 +449,7 @@ def _setupUi(self): self.main_back_button.setSizePolicy(sizePolicy) self.main_back_button.setMinimumSize(QtCore.QSize(60, 60)) self.main_back_button.setMaximumSize(QtCore.QSize(60, 60)) - self.main_back_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg") - ) + self.main_back_button.setProperty("icon_pixmap", BlocksPixmap.get(Icon.BACK)) self.main_back_button.setObjectName("main_back_button") self.filament_page_header_layout.addWidget(self.main_back_button) @@ -527,7 +526,7 @@ def _setupUi(self): self.filament_page_load_btn.setFont(font) self.filament_page_load_btn.setProperty( "icon_pixmap", - QtGui.QPixmap(":/filament_related/media/btn_icons/load_filament.svg"), + BlocksPixmap.get(Icon.LOAD_FILAMENT), ) self.filament_page_load_btn.setObjectName("filament_page_load_btn") self.horizontalLayout.addWidget(self.filament_page_load_btn) @@ -542,7 +541,7 @@ def _setupUi(self): self.filament_page_unload_btn.setFont(font) self.filament_page_unload_btn.setProperty( "icon_pixmap", - QtGui.QPixmap(":/filament_related/media/btn_icons/unload_filament.svg"), + BlocksPixmap.get(Icon.UNLOAD_FILAMENT), ) self.filament_page_unload_btn.setObjectName("filament_page_unload_btn") @@ -609,7 +608,7 @@ def _setupUi(self): self.load_header_back_button.setMinimumSize(QtCore.QSize(60, 60)) self.load_header_back_button.setMaximumSize(QtCore.QSize(60, 60)) self.load_header_back_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg") + "icon_pixmap", BlocksPixmap.get(Icon.BACK) ) self.load_header_back_button.setObjectName("load_header_back_button") self.load_page_header_layout.addWidget(self.load_header_back_button) @@ -639,7 +638,7 @@ def _setupUi(self): ( "load_pla_btn", "PLA", - ":/top_bar_icons/media/topbar/pla_filament_topbar.svg", + Icon.PLA_FILAMENT_TOPBAR, 0, 0, FilamentTypes.PLA, @@ -647,7 +646,7 @@ def _setupUi(self): ( "load_petg_btn", "PETG", - ":/top_bar_icons/media/topbar/petg_filament_topbar.svg", + Icon.PETG_FILAMENT_TOPBAR, 0, 1, FilamentTypes.PETG, @@ -655,7 +654,7 @@ def _setupUi(self): ( "load_abs_btn", "ABS", - ":/top_bar_icons/media/topbar/abs_filament_topbar.svg", + Icon.ABS_FILAMENT_TOPBAR, 1, 0, FilamentTypes.ABS, @@ -663,7 +662,7 @@ def _setupUi(self): ( "load_PP_btn", "PP", - ":/top_bar_icons/media/topbar/pp_filament_topbar.svg", + Icon.PP_FILAMENT_TOPBAR, 1, 1, FilamentTypes.PP, @@ -671,7 +670,7 @@ def _setupUi(self): ( "load_nylon_btn", "NYLON", - ":/top_bar_icons/media/topbar/nylon_filament_topbar.svg", + Icon.NYLON_FILAMENT_TOPBAR, 2, 0, FilamentTypes.NYLON, @@ -679,7 +678,7 @@ def _setupUi(self): ( "load_PC_btn", "PC", - ":/top_bar_icons/media/topbar/pc_filament_topbar.svg", + Icon.PC_FILAMENT_TOPBAR, 2, 1, FilamentTypes.PC, @@ -691,7 +690,7 @@ def _setupUi(self): font.setPointSize(19) font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferAntialias) - for obj_name, text, pixmap_path, row, col, _filament_type in filament_buttons: + for obj_name, text, icon, row, col, _filament_type in filament_buttons: btn = BlocksCustomButton(parent=self.load_page) btn.setMinimumSize(QtCore.QSize(200, 80)) btn.setMaximumSize(QtCore.QSize(200, 80)) @@ -701,7 +700,7 @@ def _setupUi(self): btn.clicked.connect( partial(self.change_page, self.indexOf(self.filament_control_page)) ) - btn.setProperty("icon_pixmap", QtGui.QPixmap(pixmap_path)) + btn.setProperty("icon_pixmap", BlocksPixmap.get(icon)) btn.setObjectName(obj_name) self.load_page_content_layout.addWidget(btn, row, col, 1, 1) self.filament_buttons_list.append((btn, _filament_type)) diff --git a/BlocksScreen/lib/panels/widgets/cancelPage.py b/BlocksScreen/lib/panels/widgets/cancelPage.py index dd33b52e..8188a811 100644 --- a/BlocksScreen/lib/panels/widgets/cancelPage.py +++ b/BlocksScreen/lib/panels/widgets/cancelPage.py @@ -1,6 +1,7 @@ from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_frame import BlocksCustomFrame from lib.utils.blocks_label import BlocksLabel +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from PyQt6 import QtCore, QtGui, QtWidgets import typing @@ -202,9 +203,7 @@ def _setupUI(self) -> None: font = QtGui.QFont("Momcake", 18) self.confirm_button.setFont(font) self.confirm_button.setFlat(True) - self.confirm_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg") - ) + self.confirm_button.setProperty("icon_pixmap", BlocksPixmap.get(Icon.YES)) self.confirm_button.setText("Reprint") # 2. Align buttons to the right self.cf_confirm_layout.addWidget( @@ -216,9 +215,7 @@ def _setupUI(self) -> None: self.refuse_button.setMaximumSize(QtCore.QSize(250, 70)) self.refuse_button.setFont(font) self.refuse_button.setFlat(True) - self.refuse_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/dialog/media/btn_icons/no.svg") - ) + self.refuse_button.setProperty("icon_pixmap", BlocksPixmap.get(Icon.NO)) self.refuse_button.setText("Ignore") # 2. Align buttons to the right self.cf_confirm_layout.addWidget( diff --git a/BlocksScreen/lib/panels/widgets/colorWheelWidget.py b/BlocksScreen/lib/panels/widgets/colorWheelWidget.py index f4a28e9e..67845189 100644 --- a/BlocksScreen/lib/panels/widgets/colorWheelWidget.py +++ b/BlocksScreen/lib/panels/widgets/colorWheelWidget.py @@ -3,6 +3,7 @@ from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_frame import BlocksCustomFrame from lib.utils.blocks_label import BlocksLabel +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.blocks_slider import BlocksSlider from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -225,7 +226,7 @@ def _lbl( back_btn = IconButton(self) back_btn.setFixedSize(60, 60) back_btn.setFlat(True) - back_btn.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + back_btn.setPixmap(BlocksPixmap.get(Icon.BACK)) back_btn.clicked.connect(self.request_back) header.addWidget(back_btn) root.addLayout(header) diff --git a/BlocksScreen/lib/panels/widgets/confirmPage.py b/BlocksScreen/lib/panels/widgets/confirmPage.py index 0f35ba39..b0ecebde 100644 --- a/BlocksScreen/lib/panels/widgets/confirmPage.py +++ b/BlocksScreen/lib/panels/widgets/confirmPage.py @@ -5,6 +5,7 @@ from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_frame import BlocksCustomFrame from lib.utils.blocks_label import BlocksLabel +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -194,9 +195,7 @@ def _setupUI(self) -> None: self.back_btn.setMinimumSize(QtCore.QSize(60, 60)) self.back_btn.setMaximumSize(QtCore.QSize(60, 60)) self.back_btn.setFlat(True) - self.back_btn.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg") - ) + self.back_btn.setProperty("icon_pixmap", BlocksPixmap.get(Icon.BACK)) self.cf_header_title.addWidget( self.back_btn, 0, QtCore.Qt.AlignmentFlag.AlignLeft ) @@ -248,9 +247,7 @@ def _setupUI(self) -> None: font = QtGui.QFont("Momcake", 18) self.confirm_button.setFont(font) self.confirm_button.setFlat(True) - self.confirm_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg") - ) + self.confirm_button.setProperty("icon_pixmap", BlocksPixmap.get(Icon.YES)) self.confirm_button.setText("Print") # 2. Align buttons to the right self.cf_confirm_layout.addWidget( @@ -263,7 +260,7 @@ def _setupUI(self) -> None: self.delete_file_button.setFont(font) self.delete_file_button.setFlat(True) self.delete_file_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/garbage-icon.svg") + "icon_pixmap", BlocksPixmap.get(Icon.GARBAGE_ICON) ) self.delete_file_button.setText("Delete") # 2. Align buttons to the right diff --git a/BlocksScreen/lib/panels/widgets/connectionPage.py b/BlocksScreen/lib/panels/widgets/connectionPage.py index 5921446e..f0f85a39 100644 --- a/BlocksScreen/lib/panels/widgets/connectionPage.py +++ b/BlocksScreen/lib/panels/widgets/connectionPage.py @@ -6,6 +6,7 @@ from events import KlippyDisconnected, KlippyReady from lib.moonrakerComm import MoonWebSocket from lib.utils.blocks_frame import BlocksCustomFrame +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -416,7 +417,7 @@ def _setupUI(self) -> None: ) self.reboot_system_button.setFlat(True) self.reboot_system_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/system/media/btn_icons/reboot.svg") + "icon_pixmap", BlocksPixmap.get(Icon.REBOOT) ) self.reboot_system_button.setProperty("has_text", True) self.reboot_system_button.setProperty("text_formatting", "bottom") @@ -441,7 +442,7 @@ def _setupUI(self) -> None: ) self.restart_klipper_button.setFlat(True) self.restart_klipper_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/system/media/btn_icons/restart_klipper.svg") + "icon_pixmap", BlocksPixmap.get(Icon.RESTART_KLIPPER) ) self.restart_klipper_button.setProperty("has_text", True) self.restart_klipper_button.setProperty("text_formatting", "bottom") @@ -460,7 +461,7 @@ def _setupUI(self) -> None: self.notification_button.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.notification_button.setFlat(True) self.notification_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/notification.svg") + "icon_pixmap", BlocksPixmap.get(Icon.NOTIFICATION) ) self.notification_button.setProperty("has_text", True) self.notification_button.setProperty("text_formatting", "bottom") @@ -486,7 +487,7 @@ def _setupUI(self) -> None: self.update_page_button.setFlat(True) self.update_page_button.setProperty( "icon_pixmap", - QtGui.QPixmap(":/system/media/btn_icons/update-software-icon.svg"), + BlocksPixmap.get(Icon.UPDATE_SOFTWARE_ICON), ) self.update_page_button.setProperty("has_text", True) self.update_page_button.setProperty("text_formatting", "bottom") @@ -505,9 +506,7 @@ def _setupUI(self) -> None: self.wifi_button.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.wifi_button.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) self.wifi_button.setFlat(True) - self.wifi_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/network/media/btn_icons/wifi_config.svg") - ) + self.wifi_button.setProperty("icon_pixmap", BlocksPixmap.get(Icon.WIFI_CONFIG)) self.wifi_button.setProperty("has_text", True) self.wifi_button.setProperty("text_formatting", "bottom") self.wifi_button.setProperty("class", "system_control_btn") diff --git a/BlocksScreen/lib/panels/widgets/inputshaperPage.py b/BlocksScreen/lib/panels/widgets/inputshaperPage.py index addde31e..384041de 100644 --- a/BlocksScreen/lib/panels/widgets/inputshaperPage.py +++ b/BlocksScreen/lib/panels/widgets/inputshaperPage.py @@ -2,6 +2,7 @@ from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_frame import BlocksCustomFrame +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.fonts import register_momcake from lib.utils.icon_button import IconButton from lib.utils.list_model import EntryDelegate, EntryListModel, ListItem @@ -124,7 +125,7 @@ def add_type_entry(self, cli_name: str, recommended: str = "") -> None: item = ListItem( text=cli_name, right_text=recommended, - right_icon=QtGui.QPixmap(":/arrow_icons/media/btn_icons/right_arrow.svg"), + right_icon=BlocksPixmap.get(Icon.RIGHT_ARROW), selected=False, _lfontsize=17, _rfontsize=9, @@ -176,7 +177,7 @@ def _setupUI(self) -> None: self.update_back_btn.setMinimumSize(QtCore.QSize(60, 60)) self.update_back_btn.setMaximumSize(QtCore.QSize(60, 60)) self.update_back_btn.setFlat(True) - self.update_back_btn.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + self.update_back_btn.setPixmap(BlocksPixmap.get(Icon.BACK)) self.header_content_layout.addWidget(self.update_back_btn, 0) self.update_page_content_layout.addLayout(self.header_content_layout, 0) @@ -431,7 +432,7 @@ def _setupUI(self) -> None: self.action_btn.setPalette(palette) self.action_btn.setSizePolicy(sizePolicy) self.action_btn.setText("Confirm") - self.action_btn.setPixmap(QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg")) + self.action_btn.setPixmap(BlocksPixmap.get(Icon.YES)) self.button_box.addWidget( self.action_btn, 0, diff --git a/BlocksScreen/lib/panels/widgets/jobStatusPage.py b/BlocksScreen/lib/panels/widgets/jobStatusPage.py index e479df6b..e79e3b9a 100644 --- a/BlocksScreen/lib/panels/widgets/jobStatusPage.py +++ b/BlocksScreen/lib/panels/widgets/jobStatusPage.py @@ -10,6 +10,7 @@ from lib.panels.widgets.basePopup import BasePopup from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_label import BlocksLabel +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.blocks_progressbar import CustomProgressBar from lib.utils.display_button import DisplayButton from lib.utils.flowguard import FlowguardWidget @@ -260,17 +261,13 @@ def _handle_print_state(self, state: str) -> None: self._layer_frozen = True self.pause_printing_btn.setEnabled(True) self.pause_printing_btn.setText("Resume") - self.pause_printing_btn.setPixmap( - QtGui.QPixmap(":/ui/media/btn_icons/play.svg") - ) + self.pause_printing_btn.setPixmap(BlocksPixmap.get(Icon.PLAY)) self._awaiting_resume = False event_state = "pause" elif lstate == "printing": self._layer_frozen = False self.pause_printing_btn.setText("Pause") - self.pause_printing_btn.setPixmap( - QtGui.QPixmap(":/ui/media/btn_icons/pause.svg") - ) + self.pause_printing_btn.setPixmap(BlocksPixmap.get(Icon.PAUSE)) if self._internal_print_status != "printing": self._awaiting_resume = True self._resume_baseline = self._file_position @@ -525,7 +522,7 @@ def _setupUI(self) -> None: self.js_file_name_icon.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.js_file_name_icon.setProperty( "icon_pixmap", - QtGui.QPixmap(":/files/media/btn_icons/file_icon.svg"), + BlocksPixmap.get(Icon.FILE_ICON), ) self.js_file_name_icon.setObjectName("js_file_name_icon") self.js_file_name_label = BlocksLabel(parent=self) @@ -545,27 +542,21 @@ def _setupUI(self) -> None: self.pause_printing_btn.setMinimumSize(QtCore.QSize(200, 80)) self.pause_printing_btn.setMaximumSize(QtCore.QSize(200, 80)) self.pause_printing_btn.setFont(font) - self.pause_printing_btn.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/pause.svg") - ) + self.pause_printing_btn.setProperty("icon_pixmap", BlocksPixmap.get(Icon.PAUSE)) self.pause_printing_btn.setObjectName("pause_printing_btn") self.stop_printing_btn = BlocksCustomButton(self) self.stop_printing_btn.setSizePolicy(sizePolicy) self.stop_printing_btn.setMinimumSize(QtCore.QSize(200, 80)) self.stop_printing_btn.setMaximumSize(QtCore.QSize(200, 80)) self.stop_printing_btn.setFont(font) - self.stop_printing_btn.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/stop.svg") - ) + self.stop_printing_btn.setProperty("icon_pixmap", BlocksPixmap.get(Icon.STOP)) self.stop_printing_btn.setObjectName("stop_printing_btn") self.tune_menu_btn = BlocksCustomButton(self) self.tune_menu_btn.setSizePolicy(sizePolicy) self.tune_menu_btn.setMinimumSize(QtCore.QSize(200, 60)) self.tune_menu_btn.setMaximumSize(QtCore.QSize(200, 80)) self.tune_menu_btn.setFont(font) - self.tune_menu_btn.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/tune.svg") - ) + self.tune_menu_btn.setProperty("icon_pixmap", BlocksPixmap.get(Icon.TUNE)) self.tune_menu_btn.setObjectName("tune_menu_btn") self.job_status_btn_layout.addWidget(self.pause_printing_btn) self.job_status_btn_layout.addWidget(self.stop_printing_btn) @@ -590,7 +581,7 @@ def _setupUI(self) -> None: self.layer_display_button.setSizePolicy(sizePolicy) self.layer_display_button.setMinimumSize(QtCore.QSize(200, 80)) self.layer_display_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/layers.svg") + "icon_pixmap", BlocksPixmap.get(Icon.LAYERS) ) self.layer_display_button.setObjectName("layer_display_button") self.print_time_display_button = DisplayButton(self) @@ -599,7 +590,7 @@ def _setupUI(self) -> None: self.print_time_display_button.setSizePolicy(sizePolicy) self.print_time_display_button.setMinimumSize(QtCore.QSize(200, 80)) self.print_time_display_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/time.svg") + "icon_pixmap", BlocksPixmap.get(Icon.TIME) ) self.print_time_display_button.setObjectName("print_time_display_button") self.job_stats_display_layout.addWidget( diff --git a/BlocksScreen/lib/panels/widgets/keyboardPage.py b/BlocksScreen/lib/panels/widgets/keyboardPage.py index 243302f4..f4742810 100644 --- a/BlocksScreen/lib/panels/widgets/keyboardPage.py +++ b/BlocksScreen/lib/panels/widgets/keyboardPage.py @@ -1,5 +1,6 @@ import typing +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -427,9 +428,7 @@ def _setup_ui(self) -> None: self.numpad_back_btn.setMaximumSize(QtCore.QSize(60, 60)) self.numpad_back_btn.setIconSize(QtCore.QSize(16, 16)) self.numpad_back_btn.setFlat(True) - self.numpad_back_btn.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg") - ) + self.numpad_back_btn.setProperty("icon_pixmap", BlocksPixmap.get(Icon.BACK)) self.numpad_back_btn.setProperty("button_type", "icon") self.numpad_back_btn.setObjectName("numpad_back_btn") diff --git a/BlocksScreen/lib/panels/widgets/notificationPage.py b/BlocksScreen/lib/panels/widgets/notificationPage.py index d21de8b9..749f6caa 100644 --- a/BlocksScreen/lib/panels/widgets/notificationPage.py +++ b/BlocksScreen/lib/panels/widgets/notificationPage.py @@ -4,6 +4,7 @@ from lib.panels.widgets.popupDialogWidget import Popup from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_frame import BlocksCustomFrame +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from lib.utils.list_model import EntryDelegate, EntryListModel, ListItem from PyQt6 import QtCore, QtGui, QtWidgets @@ -21,9 +22,9 @@ class NotificationPage(QtWidgets.QWidget): def __init__(self, parent=None) -> None: super().__init__(parent) - self._ICON_INFO = QtGui.QPixmap(":/ui/media/btn_icons/info.svg") - self._ICON_WARN = QtGui.QPixmap(":/ui/media/btn_icons/troubleshoot.svg") - self._ICON_ERROR = QtGui.QPixmap(":/ui/media/btn_icons/error.svg") + self._ICON_INFO = BlocksPixmap.get(Icon.INFO) + self._ICON_WARN = BlocksPixmap.get(Icon.TROUBLESHOOT) + self._ICON_ERROR = BlocksPixmap.get(Icon.ERROR) self._setupUI() self.cli_tracking: deque = deque() self.selected_item: ListItem | None = None @@ -222,7 +223,7 @@ def _setupUI(self) -> None: self.update_back_btn.setMinimumSize(QtCore.QSize(60, 60)) self.update_back_btn.setMaximumSize(QtCore.QSize(60, 60)) self.update_back_btn.setFlat(True) - self.update_back_btn.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + self.update_back_btn.setPixmap(BlocksPixmap.get(Icon.BACK)) self.header_content_layout.addWidget( self.update_back_btn ) # alignment=QtCore.Qt.AlignmentFlag.AlignCenter) @@ -372,9 +373,7 @@ def _setupUI(self) -> None: self.delete_btn.setSizePolicy(sizePolicy) self.delete_btn.setText("Delete") self.delete_btn.setEnabled(False) - self.delete_btn.setPixmap( - QtGui.QPixmap(":/ui/media/btn_icons/garbage-icon.svg") - ) + self.delete_btn.setPixmap(BlocksPixmap.get(Icon.GARBAGE_ICON)) self.button_box.addWidget( self.delete_btn, 0, QtCore.Qt.AlignmentFlag.AlignCenter ) @@ -387,9 +386,7 @@ def _setupUI(self) -> None: self.delete_all_btn.setPalette(palette) self.delete_all_btn.setSizePolicy(sizePolicy) self.delete_all_btn.setText("Delete all") - self.delete_all_btn.setPixmap( - QtGui.QPixmap(":/ui/media/btn_icons/garbage-icon.svg") - ) + self.delete_all_btn.setPixmap(BlocksPixmap.get(Icon.GARBAGE_ICON)) self.button_box.addWidget( self.delete_all_btn, 0, QtCore.Qt.AlignmentFlag.AlignCenter ) diff --git a/BlocksScreen/lib/panels/widgets/numpadPage.py b/BlocksScreen/lib/panels/widgets/numpadPage.py index b904645c..a7788b0e 100644 --- a/BlocksScreen/lib/panels/widgets/numpadPage.py +++ b/BlocksScreen/lib/panels/widgets/numpadPage.py @@ -1,3 +1,4 @@ +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from lib.utils.blocks_label import BlocksLabel from lib.utils.numpad_button import NumpadButton @@ -165,7 +166,7 @@ def _setupUI(self) -> None: self.numpad_back_btn.setSizePolicy(sizePolicy) self.numpad_back_btn.setMinimumSize(QtCore.QSize(60, 60)) self.numpad_back_btn.setMaximumSize(QtCore.QSize(60, 60)) - self.numpad_back_btn.setPixmap(QtGui.QPixmap(":ui/media/btn_icons/back.svg")) + self.numpad_back_btn.setPixmap(BlocksPixmap.get(Icon.BACK)) self.numpad_back_btn.setObjectName("numpad_back_btn") self.header_layout.addWidget( self.numpad_back_btn, @@ -366,7 +367,7 @@ def _setupUI(self) -> None: self.numpad_enter.setSizePolicy(sizePolicy) self.numpad_enter.setMinimumSize(QtCore.QSize(60, 60)) self.numpad_enter.setFlat(True) - self.numpad_enter.setPixmap(QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg")) + self.numpad_enter.setPixmap(BlocksPixmap.get(Icon.YES)) self.numpad_enter.setObjectName("numpad_enter") self.button_grid_layout.addWidget( self.numpad_enter, 3, 0, 1, 1, QtCore.Qt.AlignmentFlag.AlignCenter @@ -376,7 +377,7 @@ def _setupUI(self) -> None: self.numpad_clear.setSizePolicy(sizePolicy) self.numpad_clear.setMinimumSize(QtCore.QSize(60, 60)) self.numpad_clear.setFlat(True) - self.numpad_clear.setPixmap(QtGui.QPixmap(":/dialog/media/btn_icons/no.svg")) + self.numpad_clear.setPixmap(BlocksPixmap.get(Icon.NO)) self.numpad_clear.setObjectName("numpad_clear") self.button_grid_layout.addWidget( self.numpad_clear, 3, 2, 1, 1, QtCore.Qt.AlignmentFlag.AlignCenter diff --git a/BlocksScreen/lib/panels/widgets/optionCardWidget.py b/BlocksScreen/lib/panels/widgets/optionCardWidget.py index 6fbfe20d..d501b94d 100644 --- a/BlocksScreen/lib/panels/widgets/optionCardWidget.py +++ b/BlocksScreen/lib/panels/widgets/optionCardWidget.py @@ -1,5 +1,6 @@ import typing +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from PyQt6 import QtCore, QtGui, QtWidgets from lib.utils.icon_button import IconButton @@ -268,7 +269,7 @@ def _setupUi(self, option_card): self.continue_button.setFlat(True) self.continue_button.setProperty( "icon_pixmap", - QtGui.QPixmap(":/arrow_icons/media/btn_icons/right_arrow.svg"), + BlocksPixmap.get(Icon.RIGHT_ARROW), ) self.continue_button.setObjectName("continue_button") diff --git a/BlocksScreen/lib/panels/widgets/popupDialogWidget.py b/BlocksScreen/lib/panels/widgets/popupDialogWidget.py index 51519dcc..978558a8 100644 --- a/BlocksScreen/lib/panels/widgets/popupDialogWidget.py +++ b/BlocksScreen/lib/panels/widgets/popupDialogWidget.py @@ -2,6 +2,7 @@ from collections import deque from typing import Deque +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -31,10 +32,10 @@ def __init__(self, parent) -> None: self.persistent_notifications: Deque = deque() self.message_type: Popup.MessageType = Popup.MessageType.INFO self.default_background_color = QtGui.QColor(164, 164, 164) - self.info_icon = QtGui.QPixmap(":ui/media/btn_icons/info.svg") + self.info_icon = BlocksPixmap.get(Icon.INFO) # no warning asset exists yet; the yellow ColorCode carries the severity - self.warning_icon = QtGui.QPixmap(":ui/media/btn_icons/error.svg") - self.error_icon = QtGui.QPixmap(":ui/media/btn_icons/error.svg") + self.warning_icon = BlocksPixmap.get(Icon.ERROR) + self.error_icon = BlocksPixmap.get(Icon.ERROR) self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground, True) self.setMouseTracking(True) self.setWindowFlags( @@ -190,9 +191,7 @@ def _add_popup(self) -> None: self.slide_in_animation.setEndValue(end_rect) self.slide_out_animation.setStartValue(end_rect) self.slide_out_animation.setEndValue(start_rect) - self.actionbtn.setPixmap( - QtGui.QPixmap(":/arrow_icons/media/btn_icons/right_arrow.svg") - ) + self.actionbtn.setPixmap(BlocksPixmap.get(Icon.RIGHT_ARROW)) self.setGeometry(end_rect) self.text_label.setText(message) self.text_label.setFixedHeight( diff --git a/BlocksScreen/lib/panels/widgets/printcorePage.py b/BlocksScreen/lib/panels/widgets/printcorePage.py index c2683cd1..10acb289 100644 --- a/BlocksScreen/lib/panels/widgets/printcorePage.py +++ b/BlocksScreen/lib/panels/widgets/printcorePage.py @@ -1,4 +1,5 @@ from lib.utils.blocks_button import BlocksCustomButton +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from PyQt6 import QtCore, QtGui, QtWidgets @@ -100,9 +101,7 @@ def _setupUI(self) -> None: self.pc_cancel = BlocksCustomButton(parent=self) self.pc_cancel.setMinimumSize(QtCore.QSize(250, 80)) self.pc_cancel.setMaximumSize(QtCore.QSize(250, 80)) - self.pc_cancel.setProperty( - "icon_pixmap", QtGui.QPixmap(":/dialog/media/btn_icons/no.svg") - ) + self.pc_cancel.setProperty("icon_pixmap", BlocksPixmap.get(Icon.NO)) self.pc_cancel.setObjectName("pc_cancel") self.pc_cancel.setFont(font) self.pc_cancel.setText("Cancel") @@ -110,9 +109,7 @@ def _setupUI(self) -> None: self.pc_accept = BlocksCustomButton(parent=self) self.pc_accept.setMinimumSize(QtCore.QSize(250, 80)) self.pc_accept.setMaximumSize(QtCore.QSize(250, 80)) - self.pc_accept.setProperty( - "icon_pixmap", QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg") - ) + self.pc_accept.setProperty("icon_pixmap", BlocksPixmap.get(Icon.YES)) self.pc_accept.setObjectName("pc_accept") self.pc_accept.setFont(font) self.pc_accept.setText("Continue?") diff --git a/BlocksScreen/lib/panels/widgets/probeHelperPage.py b/BlocksScreen/lib/panels/widgets/probeHelperPage.py index 4eaa7a5a..21ff1562 100644 --- a/BlocksScreen/lib/panels/widgets/probeHelperPage.py +++ b/BlocksScreen/lib/panels/widgets/probeHelperPage.py @@ -5,6 +5,7 @@ from lib.panels.widgets.optionCardWidget import OptionCard from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_label import BlocksLabel +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.check_button import BlocksCustomCheckButton from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -98,14 +99,10 @@ def __init__(self, parent: QtWidgets.QWidget) -> None: self.setObjectName("probe_offset_page") self._setupUi() - self.inductive_icon = QtGui.QPixmap( - ":/z_levelling/media/btn_icons/inductive.svg" - ) - self.bltouch_icon = QtGui.QPixmap(":/z_levelling/media/btn_icons/bltouch.svg") - self.endstop_icon = QtGui.QPixmap( - ":/extruder_related/media/btn_icons/switch_zoom.svg" - ) - self.eddy_icon = QtGui.QPixmap(":/z_levelling/media/btn_icons/eddy_mech.svg") + self.inductive_icon = BlocksPixmap.get(Icon.INDUCTIVE) + self.bltouch_icon = BlocksPixmap.get(Icon.BLTOUCH) + self.endstop_icon = BlocksPixmap.get(Icon.SWITCH_ZOOM) + self.eddy_icon = BlocksPixmap.get(Icon.EDDY_MECH) self._toggle_tool_buttons(False) self.mb_raise_nozzle.clicked.connect(lambda: self.handle_nozzle_move("raise")) self.mb_lower_nozzle.clicked.connect(lambda: self.handle_nozzle_move("lower")) @@ -788,7 +785,7 @@ def _setupUi(self) -> None: self.accept_button.setGeometry(QtCore.QRect(480, 340, 170, 60)) self.accept_button.setText("Accept") self.accept_button.setObjectName("accept_button") - self.accept_button.setPixmap(QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg")) + self.accept_button.setPixmap(BlocksPixmap.get(Icon.YES)) self.accept_button.setVisible(False) font = QtGui.QFont() font.setPointSize(15) @@ -798,7 +795,7 @@ def _setupUi(self) -> None: self.abort_button.setGeometry(QtCore.QRect(300, 340, 170, 60)) self.abort_button.setText("Abort") self.abort_button.setObjectName("abort_button") - self.abort_button.setPixmap(QtGui.QPixmap(":/dialog/media/btn_icons/no.svg")) + self.abort_button.setPixmap(BlocksPixmap.get(Icon.NO)) self.abort_button.setVisible(False) font = QtGui.QFont() font.setPointSize(15) @@ -826,7 +823,7 @@ def _setupUi(self) -> None: self.po_back_button.setMaximumSize(QtCore.QSize(60, 60)) self.po_back_button.setText("") self.po_back_button.setFlat(True) - self.po_back_button.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + self.po_back_button.setPixmap(BlocksPixmap.get(Icon.BACK)) self.po_back_button.setObjectName("po_back_button") self.bbp_header_layout.addWidget( @@ -910,9 +907,7 @@ def _setupUi(self) -> None: self.tool_image = QtWidgets.QLabel(parent=self.frame_2) self.tool_image.setGeometry(QtCore.QRect(0, 30, 371, 121)) self.tool_image.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft) - self.tool_image.setPixmap( - QtGui.QPixmap(":/graphics/media/graphics/babystep_graphic.png") - ) + self.tool_image.setPixmap(BlocksPixmap.source(Icon.BABYSTEP_GRAPHIC)) self.tool_image.setScaledContents(False) self.tool_image.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.tool_image.setObjectName("tool_image") @@ -968,9 +963,7 @@ def _setupUi(self) -> None: self.mb_lower_nozzle.setMaximumSize(QtCore.QSize(80, 80)) self.mb_lower_nozzle.setText("") self.mb_lower_nozzle.setFlat(True) - self.mb_lower_nozzle.setPixmap( - QtGui.QPixmap(":/baby_step/media/btn_icons/move_nozzle_close.svg") - ) + self.mb_lower_nozzle.setPixmap(BlocksPixmap.get(Icon.MOVE_NOZZLE_CLOSE)) self.mb_lower_nozzle.setObjectName("bbp_away_from_bed") self.bbp_option_button_group = QtWidgets.QButtonGroup(self) self.bbp_option_button_group.setObjectName("bbp_option_button_group") @@ -987,9 +980,7 @@ def _setupUi(self) -> None: self.mb_raise_nozzle.setMaximumSize(QtCore.QSize(80, 80)) self.mb_raise_nozzle.setText("") self.mb_raise_nozzle.setFlat(True) - self.mb_raise_nozzle.setPixmap( - QtGui.QPixmap(":/baby_step/media/btn_icons/move_nozzle_away.svg") - ) + self.mb_raise_nozzle.setPixmap(BlocksPixmap.get(Icon.MOVE_NOZZLE_AWAY)) self.mb_raise_nozzle.setObjectName("bbp_close_to_bed") self.bbp_option_button_group.addButton(self.mb_raise_nozzle) self.bbp_buttons_layout.addWidget( diff --git a/BlocksScreen/lib/panels/widgets/sensorWidget.py b/BlocksScreen/lib/panels/widgets/sensorWidget.py index c479e5dc..f3f4c734 100644 --- a/BlocksScreen/lib/panels/widgets/sensorWidget.py +++ b/BlocksScreen/lib/panels/widgets/sensorWidget.py @@ -2,6 +2,7 @@ import typing from lib.utils.blocks_label import BlocksLabel +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.toggleAnimatedButton import ToggleAnimatedButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -58,12 +59,10 @@ def __init__(self, parent, sensor_name: str): self._text_label = None self._text = self.name self._item_rect: QtCore.QRect = QtCore.QRect() - self.icon_pixmap_fp: QtGui.QPixmap = QtGui.QPixmap( - ":/filament_related/media/btn_icons/filament_sensor_turn_on.svg" - ) - self.icon_pixmap_fnp: QtGui.QPixmap = QtGui.QPixmap( - ":/filament_related/media/btn_icons/filament_sensor_off.svg" + self.icon_pixmap_fp: QtGui.QPixmap = BlocksPixmap.get( + Icon.FILAMENT_SENSOR_TURN_ON ) + self.icon_pixmap_fnp: QtGui.QPixmap = BlocksPixmap.get(Icon.FILAMENT_SENSOR_OFF) self._setupUI() self.toggle_button.stateChange.connect(self.toggle_sensor_state) diff --git a/BlocksScreen/lib/panels/widgets/sensorsPanel.py b/BlocksScreen/lib/panels/widgets/sensorsPanel.py index b1823977..4851141d 100644 --- a/BlocksScreen/lib/panels/widgets/sensorsPanel.py +++ b/BlocksScreen/lib/panels/widgets/sensorsPanel.py @@ -2,6 +2,7 @@ from lib.panels.widgets.sensorWidget import SensorWidget from lib.utils.blocks_frame import BlocksCustomFrame +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.fonts import register_momcake from lib.utils.icon_button import IconButton from lib.utils.list_model import EntryDelegate, EntryListModel, ListItem @@ -166,7 +167,7 @@ def _setupUi(self) -> None: self.fs_back_button.setMinimumSize(QtCore.QSize(60, 60)) self.fs_back_button.setMaximumSize(QtCore.QSize(60, 60)) self.fs_back_button.setFlat(True) - self.fs_back_button.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + self.fs_back_button.setPixmap(BlocksPixmap.get(Icon.BACK)) self.header_content_layout.addWidget(self.fs_back_button, 0) self.update_page_content_layout.addLayout(self.header_content_layout, 0) @@ -360,7 +361,7 @@ def _setupUi(self) -> None: self.info_box_layout.addWidget( self.no_update_placeholder, 0, QtCore.Qt.AlignmentFlag.AlignBottom ) - self.pixmap = QtGui.QPixmap(":/ui/media/btn_icons/info.svg") + self.pixmap = BlocksPixmap.get(Icon.INFO) self.no_update_placeholder.hide() self.infobox_frame.setLayout(self.info_box_layout) self.main_content_layout.addWidget(self.infobox_frame, 1) diff --git a/BlocksScreen/lib/panels/widgets/slider_selector_page.py b/BlocksScreen/lib/panels/widgets/slider_selector_page.py index da6d6b36..6cd7af2d 100644 --- a/BlocksScreen/lib/panels/widgets/slider_selector_page.py +++ b/BlocksScreen/lib/panels/widgets/slider_selector_page.py @@ -1,5 +1,6 @@ import typing +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.blocks_slider import BlocksSlider from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -21,13 +22,9 @@ class SliderPage(QtWidgets.QWidget): def __init__(self, parent) -> None: super().__init__(parent) self.name: str = "" - self.increase_button_icon = QtGui.QPixmap( - ":/arrow_icons/media/btn_icons/right_arrow.svg" - ) - self.decrease_button_icon = QtGui.QPixmap( - ":/arrow_icons/media/btn_icons/left_arrow.svg" - ) - self.background = QtGui.QPixmap(":/background/media/1st_background.png") + self.increase_button_icon = BlocksPixmap.get(Icon.RIGHT_ARROW) + self.decrease_button_icon = BlocksPixmap.get(Icon.LEFT_ARROW) + self.background = BlocksPixmap.source(Icon.BACKGROUND_1ST) self.setStyleSheet( "#SliderPage{background-image: url(:/background/media/1st_background.png);}\n" ) @@ -128,7 +125,7 @@ def _setupUI(self) -> None: ) self.back_button = IconButton(self) - self.back_button.setPixmap(QtGui.QPixmap(":ui/media/btn_icons/back.svg")) + self.back_button.setPixmap(BlocksPixmap.get(Icon.BACK)) self.back_button.has_text = False self.back_button.setMinimumSize(QtCore.QSize(60, 60)) self.back_button.setMaximumSize(QtCore.QSize(60, 60)) diff --git a/BlocksScreen/lib/panels/widgets/spoolmanPage.py b/BlocksScreen/lib/panels/widgets/spoolmanPage.py index 0bb774bc..fd670325 100644 --- a/BlocksScreen/lib/panels/widgets/spoolmanPage.py +++ b/BlocksScreen/lib/panels/widgets/spoolmanPage.py @@ -5,6 +5,7 @@ from lib.panels.widgets.addSpoolPage import AddSpoolPage from lib.panels.widgets.basePopup import BasePopup from lib.utils.blocks_frame import BlocksCustomFrame +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.icon_button import IconButton from lib.utils.list_model import EntryDelegate, EntryListModel, ListItem from PyQt6 import QtCore, QtGui, QtWidgets @@ -337,14 +338,14 @@ def _setupUI(self) -> None: # noqa: N802 header_layout.setSpacing(0) header_layout.setContentsMargins(0, 0, 0, 0) - def _icon_btn(icon_path: str) -> IconButton: + def _icon_btn(icon: Icon) -> IconButton: btn = IconButton(self) btn.setFixedSize(QtCore.QSize(60, 60)) btn.setFlat(True) - btn.setPixmap(QtGui.QPixmap(icon_path)) + btn.setPixmap(BlocksPixmap.get(icon)) return btn - self.reload_btn = _icon_btn(":/ui/media/btn_icons/refresh.svg") + self.reload_btn = _icon_btn(Icon.REFRESH) header_layout.addWidget(self.reload_btn) title_font = QtGui.QFont() @@ -359,9 +360,7 @@ def _icon_btn(icon_path: str) -> IconButton: self.main_back_button = IconButton(parent=self) self.main_back_button.setMinimumSize(QtCore.QSize(60, 60)) self.main_back_button.setMaximumSize(QtCore.QSize(60, 60)) - self.main_back_button.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg") - ) + self.main_back_button.setProperty("icon_pixmap", BlocksPixmap.get(Icon.BACK)) self.main_back_button.setObjectName("main_back_button") header_layout.addWidget(self.main_back_button) @@ -474,9 +473,7 @@ def _add_row(title_text: str) -> QtWidgets.QLabel: self.delete_btn = IconButton(self) self.delete_btn.setFixedSize(QtCore.QSize(60, 60)) self.delete_btn.setFlat(True) - self.delete_btn.setPixmap( - QtGui.QPixmap(":/ui/media/btn_icons/garbage-icon.svg") - ) + self.delete_btn.setPixmap(BlocksPixmap.get(Icon.GARBAGE_ICON)) normal_layout.addWidget(self.delete_btn, 0) info_layout.addWidget(button_widget, 0, QtCore.Qt.AlignmentFlag.AlignCenter) diff --git a/BlocksScreen/lib/panels/widgets/troubleshootPage.py b/BlocksScreen/lib/panels/widgets/troubleshootPage.py index 0c327ac7..144b8ef2 100644 --- a/BlocksScreen/lib/panels/widgets/troubleshootPage.py +++ b/BlocksScreen/lib/panels/widgets/troubleshootPage.py @@ -1,3 +1,4 @@ +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from PyQt6 import QtCore, QtGui, QtWidgets from lib.utils.icon_button import IconButton @@ -109,9 +110,7 @@ def _setupUI(self) -> None: self.tb_back_btn.setStyleSheet("") self.tb_back_btn.setAutoDefault(False) self.tb_back_btn.setFlat(True) - self.tb_back_btn.setProperty( - "icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg") - ) + self.tb_back_btn.setProperty("icon_pixmap", BlocksPixmap.get(Icon.BACK)) self.tb_back_btn.setObjectName("tb_back_btn") self.leds_slider_header_layout_2.addWidget(self.tb_back_btn) self.verticalLayout.addLayout(self.leds_slider_header_layout_2) diff --git a/BlocksScreen/lib/panels/widgets/tunePage.py b/BlocksScreen/lib/panels/widgets/tunePage.py index 03997315..bf2775d7 100644 --- a/BlocksScreen/lib/panels/widgets/tunePage.py +++ b/BlocksScreen/lib/panels/widgets/tunePage.py @@ -3,6 +3,7 @@ import typing from lib.utils.blocks_button import BlocksCustomButton +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.display_button import DisplayButton from lib.utils.icon_button import IconButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -282,7 +283,7 @@ def _setupUI(self) -> None: self.tune_back_btn.setMinimumSize(QtCore.QSize(60, 60)) self.tune_back_btn.setMaximumSize(QtCore.QSize(60, 60)) self.tune_back_btn.setFlat(True) - self.tune_back_btn.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + self.tune_back_btn.setPixmap(BlocksPixmap.get(Icon.BACK)) self.tune_header.addWidget( self.tune_back_btn, 0, @@ -311,9 +312,7 @@ def _setupUI(self) -> None: ) self.tune_babystep_menu_btn.setAutoDefault(False) self.tune_babystep_menu_btn.setFlat(True) - self.tune_babystep_menu_btn.setPixmap( - QtGui.QPixmap(":/z_levelling/media/btn_icons/baby_step_icon.svg") - ) + self.tune_babystep_menu_btn.setPixmap(BlocksPixmap.get(Icon.BABY_STEP_ICON)) self.tune_babystep_menu_btn.setObjectName("tune_babystep_menu_btn") self.tune_menu_buttons.addWidget( self.tune_babystep_menu_btn, @@ -338,9 +337,7 @@ def _setupUI(self) -> None: ) self.tune_change_filament_btn.setAutoDefault(False) self.tune_change_filament_btn.setFlat(True) - self.tune_change_filament_btn.setPixmap( - QtGui.QPixmap(":/filament_related/media/btn_icons/change_filament.svg") - ) + self.tune_change_filament_btn.setPixmap(BlocksPixmap.get(Icon.CHANGE_FILAMENT)) self.tune_change_filament_btn.setObjectName("tune_change_filament_btn") self.tune_menu_buttons.addWidget( self.tune_change_filament_btn, @@ -363,9 +360,7 @@ def _setupUI(self) -> None: self.sensors_menu_btn.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) self.sensors_menu_btn.setAutoDefault(False) self.sensors_menu_btn.setFlat(True) - self.sensors_menu_btn.setPixmap( - QtGui.QPixmap(":/filament_related/media/btn_icons/filament_sensor.svg") - ) + self.sensors_menu_btn.setPixmap(BlocksPixmap.get(Icon.FILAMENT_SENSOR)) self.sensors_menu_btn.setObjectName("sensors_menu_btn") self.tune_menu_buttons.addWidget(self.sensors_menu_btn) self.tune_content.addLayout(self.tune_menu_buttons, 0) @@ -414,9 +409,7 @@ def _setupUI(self) -> None: self.bed_display.setFont(font) self.bed_display.setText("") self.bed_display.setFlat(True) - self.bed_display.setPixmap( - QtGui.QPixmap(":/temperature_related/media/btn_icons/temperature_plate.svg") - ) + self.bed_display.setPixmap(BlocksPixmap.get(Icon.TEMPERATURE_PLATE)) self.bed_display.setObjectName("bed_display") self.tune_display_vertical_child_layout_1.addWidget(self.bed_display) self.extruder_display = DisplayButton(parent=self) @@ -429,9 +422,7 @@ def _setupUI(self) -> None: self.extruder_display.setMaximumSize(QtCore.QSize(150, 60)) self.extruder_display.setText("") self.extruder_display.setFlat(True) - self.extruder_display.setPixmap( - QtGui.QPixmap(":/temperature_related/media/btn_icons/temperature.svg") - ) + self.extruder_display.setPixmap(BlocksPixmap.get(Icon.TEMPERATURE)) self.extruder_display.setObjectName("extruder_display") self.tune_display_vertical_child_layout_1.addWidget(self.extruder_display) self.speed_display = DisplayButton(parent=self) @@ -444,9 +435,7 @@ def _setupUI(self) -> None: self.speed_display.setMaximumSize(QtCore.QSize(150, 60)) self.speed_display.setFont(font) self.speed_display.setFlat(True) - self.speed_display.setPixmap( - QtGui.QPixmap(":/motion/media/btn_icons/speed.svg") - ) + self.speed_display.setPixmap(BlocksPixmap.get(Icon.SPEED)) self.speed_display.setObjectName("speed_display") self.tune_display_vertical_child_layout_3.addWidget(self.speed_display) self.tune_content.addLayout(self.tune_display_horizontal_parent_layout, 1) @@ -461,9 +450,9 @@ def _setupUI(self) -> None: self.setContentsMargins(2, 2, 2, 2) self.path = { - "fan_cage": QtGui.QPixmap(":/fan_related/media/btn_icons/fan_cage.svg"), - "blower": QtGui.QPixmap(":/fan_related/media/btn_icons/blower.svg"), - "fan": QtGui.QPixmap(":/fan_related/media/btn_icons/fan.svg"), + "fan_cage": BlocksPixmap.get(Icon.FAN_CAGE), + "blower": BlocksPixmap.get(Icon.BLOWER), + "fan": BlocksPixmap.get(Icon.FAN), } self._retranslateUI() diff --git a/BlocksScreen/lib/panels/widgets/updatePage.py b/BlocksScreen/lib/panels/widgets/updatePage.py index afe8e708..3d2463f9 100644 --- a/BlocksScreen/lib/panels/widgets/updatePage.py +++ b/BlocksScreen/lib/panels/widgets/updatePage.py @@ -5,6 +5,7 @@ import typing from types import MappingProxyType +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.fonts import register_momcake from PyQt6 import QtCore, QtGui, QtWidgets @@ -493,8 +494,7 @@ def show_loading(self, loading: bool = False) -> None: self.disable_popups.emit(loading) def _setupUI(self) -> None: - # Qt files the Thin and Bold faces under one family, so both ids gave the - # same name here; the weight is chosen per QFont, not per family. + # Thin and Bold share one family; weight is chosen per QFont, not per family. self._font_family = register_momcake() _title_family = self._font_family @@ -520,7 +520,7 @@ def _setupUI(self) -> None: self.update_back_btn = IconButton(self) self.update_back_btn.setFixedSize(QtCore.QSize(66, 66)) self.update_back_btn.setFlat(True) - self.update_back_btn.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + self.update_back_btn.setPixmap(BlocksPixmap.get(Icon.BACK)) header.addWidget(self.update_back_btn) title = QtWidgets.QLabel("Update Manager", self) @@ -544,7 +544,7 @@ def _setupUI(self) -> None: self.reload_btn = IconButton(self) self.reload_btn.setFixedSize(QtCore.QSize(66, 66)) self.reload_btn.setFlat(True) - self.reload_btn.setPixmap(QtGui.QPixmap(":/ui/media/btn_icons/refresh.svg")) + self.reload_btn.setPixmap(BlocksPixmap.get(Icon.REFRESH)) header.addWidget(self.reload_btn) content.addLayout(header, 0) @@ -608,9 +608,7 @@ def _setupUI(self) -> None: self.update_all_btn.setMaximumSize(QtCore.QSize(360, 70)) self.update_all_btn.setFont(QtGui.QFont(self._font_family, 22)) self.update_all_btn.setText("Update") - self.update_all_btn.setPixmap( - QtGui.QPixmap(":/system/media/btn_icons/update-software-icon.svg") - ) + self.update_all_btn.setPixmap(BlocksPixmap.get(Icon.UPDATE_SOFTWARE_ICON)) content.addWidget(self.update_all_btn, 0, QtCore.Qt.AlignmentFlag.AlignCenter) self.update_all_btn.hide() @@ -626,7 +624,7 @@ def _setupUI(self) -> None: self._toast_timer.setInterval(12000) self._toast_timer.timeout.connect(self._toast.hide) - _arrow = QtGui.QPixmap(":/arrow_icons/media/btn_icons/arrow_right.svg") + _arrow = BlocksPixmap.get(Icon.ARROW_RIGHT) self._chevron_right: QtGui.QPixmap = _arrow self._chevron_down: QtGui.QPixmap = _arrow.transformed( QtGui.QTransform().rotate(90), diff --git a/BlocksScreen/lib/utils/blocks_pixmap.py b/BlocksScreen/lib/utils/blocks_pixmap.py index 419f0c11..f4e2ba28 100644 --- a/BlocksScreen/lib/utils/blocks_pixmap.py +++ b/BlocksScreen/lib/utils/blocks_pixmap.py @@ -1,23 +1,11 @@ -"""One load-once registry for every Qt resource pixmap the panel draws. - -Loading an icon by path yields its intrinsic buffer, which for most of the -btn_icons is a 600x600 RGBA surface costing 1.37 MiB even when it is painted at -32px. Going through QIcon instead makes QSvgIconEngine rasterize at the -requested size: measured on the RF50, the whole set costs 16.1 MiB at 64px -against 273.0 MiB intrinsic, and loads in 278 ms against 848 ms. - -Every path lives in the Icon enum so a typo is a NameError rather than Qt's -silent null pixmap, and tests/util/test_blocks_pixmap_unit.py proves each member -still resolves. -""" +"""Load-once pixmap registry: 16.1 MiB at 64px against 273.0 MiB intrinsic on the RF50.""" from enum import StrEnum from typing import ClassVar from PyQt6 import QtCore, QtGui -# Setup-time callers cannot know their paint size, and the widgets rescale anyway; -# 128 clears the tallest button (90px hole, 0.8 fill) at 64 KiB a surface. +# Widgets rescale anyway; 128 clears the tallest button at 64 KiB a surface. ICON_SIZE = QtCore.QSize(128, 128) @@ -124,7 +112,8 @@ class BlocksPixmap: _icons: ClassVar[dict[str, QtGui.QIcon]] = {} _pixmaps: ClassVar[dict[tuple[str, int, int], QtGui.QPixmap]] = {} - _MAX_PIXMAPS = 64 + # An evicted entry a widget still holds only mints a duplicate. + _MAX_PIXMAPS = len(Icon) * 2 @classmethod def icon(cls, icon: Icon | str) -> QtGui.QIcon: diff --git a/BlocksScreen/lib/utils/blocks_togglebutton.py b/BlocksScreen/lib/utils/blocks_togglebutton.py index c97e8f1f..60b004c1 100644 --- a/BlocksScreen/lib/utils/blocks_togglebutton.py +++ b/BlocksScreen/lib/utils/blocks_togglebutton.py @@ -1,4 +1,5 @@ from lib.utils.blocks_label import BlocksLabel +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from lib.utils.toggleAnimatedButton import ToggleAnimatedButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -13,8 +14,8 @@ def __init__(self, parent): self._icon_label = None self._text_label = None self._text: str = "la test" - self.icon_pixmap_fp: QtGui.QPixmap = QtGui.QPixmap( - ":/filament_related/media/btn_icons/filament_sensor_turn_on.svg" + self.icon_pixmap_fp: QtGui.QPixmap = BlocksPixmap.get( + Icon.FILAMENT_SENSOR_TURN_ON ) self._setupUI() diff --git a/BlocksScreen/lib/utils/fonts.py b/BlocksScreen/lib/utils/fonts.py index f092ab39..2e0867cd 100644 --- a/BlocksScreen/lib/utils/fonts.py +++ b/BlocksScreen/lib/utils/fonts.py @@ -1,12 +1,4 @@ -"""Single registration point for the bundled Momcake faces. - -Qt files both Momcake-Thin.ttf and Momcake-Bold.ttf under one family whose real -name matches neither file: "Momcake Pro". Asking for "Momcake-Thin" or "Momcake" -silently resolves to the system default, which is how every topbar filament icon -ended up rendering in a fallback face. Registration is also process-global and -permanent, so doing it once here removes the ordering race that came from three -page constructors each registering on first visit. -""" +"""Registers the bundled Momcake faces once; Qt files both .ttf under 'Momcake Pro'.""" import functools import logging @@ -15,8 +7,7 @@ _logger = logging.getLogger(__name__) -# Must stay in sync with the font-family the topbar .svg assets declare; -# tests/ui/test_resource_keys_unit.py fails if the two ever drift apart. +# Must match the topbar .svg font-family; test_resource_keys_unit.py guards the drift. MOMCAKE_FAMILY = "Momcake Pro" _FONT_PATHS = ( diff --git a/BlocksScreen/lib/utils/list_model.py b/BlocksScreen/lib/utils/list_model.py index a1a6377c..470766fb 100644 --- a/BlocksScreen/lib/utils/list_model.py +++ b/BlocksScreen/lib/utils/list_model.py @@ -1,6 +1,7 @@ import typing from dataclasses import dataclass, field +from lib.utils.blocks_pixmap import BlocksPixmap, Icon from PyQt6 import QtCore, QtGui, QtWidgets # pylint: disable=import-error @@ -423,9 +424,9 @@ def paint( return if item.allow_expand and item.needs_expansion: item.right_icon = ( - QtGui.QPixmap(":/arrow_icons/media/btn_icons/arrow_down.svg") + BlocksPixmap.get(Icon.ARROW_DOWN) if item.is_expanded - else QtGui.QPixmap(":/arrow_icons/media/btn_icons/arrow_right.svg") + else BlocksPixmap.get(Icon.ARROW_RIGHT) ) # Background Color diff --git a/tests/network/conftest.py b/tests/network/conftest.py index e37d84df..05650e0c 100644 --- a/tests/network/conftest.py +++ b/tests/network/conftest.py @@ -281,8 +281,7 @@ def set_value(self, val): sys.modules[_mod_name] = _stub sys.modules["BlocksScreen." + _mod_name] = _stub -# blocks_pixmap is a pure-PyQt6 leaf: alias the real module so the identity -# assertions in test_network_ui.py compare real cache entries, not mock children. +# Pure-PyQt6 leaf: alias the real module so identity assertions see real cache entries. sys.modules["lib.utils.blocks_pixmap"] = importlib.import_module( "BlocksScreen.lib.utils.blocks_pixmap" ) diff --git a/tests/network/test_network_ui.py b/tests/network/test_network_ui.py index b0dbf3aa..801978d9 100644 --- a/tests/network/test_network_ui.py +++ b/tests/network/test_network_ui.py @@ -973,11 +973,11 @@ def _stub_init(self, *_a, **_kw): @pytest.mark.unit class TestHelperClasses: def test_wifi_icon_provider_picks_the_asset_for_the_signal(self, qapp): + """75% signal picks the 4-bar protected asset.""" from BlocksScreen.lib.panels.networkWindow import WifiIconProvider from BlocksScreen.lib.utils.blocks_pixmap import BlocksPixmap, Icon - # Identity, not isNull: this suite never imports the _rc blobs, so every - # pixmap here is null and only the cache key tells the assets apart. + # Identity not isNull: no _rc blob is imported here, so every pixmap is null. px = WifiIconProvider.get_pixmap(75, is_protected=True) assert px is BlocksPixmap.get(Icon.WIFI_4BAR_PROTECTED) diff --git a/tests/ui/test_resource_keys_unit.py b/tests/ui/test_resource_keys_unit.py index b3db8b08..4cb23d95 100644 --- a/tests/ui/test_resource_keys_unit.py +++ b/tests/ui/test_resource_keys_unit.py @@ -1,14 +1,4 @@ -"""Guards Qt resource keys: no broken ':/' literal, no stale blob, no font fallback. - -Qt resolves an unknown ':/' key to a null QPixmap with no exception, no warning -and no log line, and it substitutes the system face for an unknown font-family -just as quietly. The only feedback is a blank rectangle or the wrong typeface on -the panel, which is how the keys in XFAIL_KEYS survived for months and how all 10 -topbar filament icons shipped in a fallback font. These tests turn that silent -failure into a red test. - -Scans .py and .ui: Designer stores keys as bare element text, 56 such sites. -""" +"""Guards Qt resource keys: no broken ':/' literal, no stale blob, no font fallback.""" import importlib import re @@ -20,9 +10,7 @@ RESOURCES = PKG_ROOT / "lib" / "ui" / "resources" RC_PACKAGE = "BlocksScreen.lib.ui.resources" -# Known-broken keys. This dict may only ever shrink: test_xfail_keys_are_still_broken -# fails once an entry stops being broken. Emptied 2026-09-01 when Icon replaced the -# last f-string key template. +# Known-broken keys, may only shrink; emptied 2026-09-01 when Icon replaced the templates. XFAIL_KEYS: dict[str, str] = {} # Text scan not AST (misses .ui XML); '/' drops ": %s", spaces admit Momcake keys. @@ -31,8 +19,10 @@ # .ui keys are unquoted element text: :/x/y.svg. _UI_LITERAL = re.compile(r">(:/?[^<\s][^<]*/[^<]*)<") -# Matches the CSS in an .svg