diff --git a/BlocksScreen/lib/panels/widgets/sensorWidget.py b/BlocksScreen/lib/panels/widgets/sensorWidget.py index 5223ac8..e0ed995 100644 --- a/BlocksScreen/lib/panels/widgets/sensorWidget.py +++ b/BlocksScreen/lib/panels/widgets/sensorWidget.py @@ -1,4 +1,5 @@ import enum +import typing from lib.utils.blocks_label import BlocksLabel from lib.utils.toggleAnimatedButton import ToggleAnimatedButton @@ -30,8 +31,12 @@ class SensorState(enum.IntEnum): OFF = False ON = True + run_gcode_signal: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal( + str, name="run_gcode" + ) + def __init__(self, parent, sensor_name: str): - super(SensorWidget, self).__init__(parent) + super().__init__(parent) self.name = str(sensor_name).split(" ")[1] self.sensor_type: SensorWidget.SensorType = ( self.SensorType.SWITCH @@ -40,18 +45,18 @@ def __init__(self, parent, sensor_name: str): ) self.setObjectName(self.name) - self.setMinimumSize(parent.contentsRect().width(), 60) + self.setMinimumSize(250, 250) self.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) self._sensor_type: SensorWidget.SensorType = self.SensorType.SWITCH self._flags: SensorWidget.SensorFlags = self.SensorFlags.CLICKABLE self.filament_state: SensorWidget.FilamentState = ( - SensorWidget.FilamentState.MISSING + SensorWidget.FilamentState.PRESENT ) - self.sensor_state: SensorWidget.SensorState = SensorWidget.SensorState.OFF + self.sensor_state: SensorWidget.SensorState = SensorWidget.SensorState.ON self._icon_label = None self._text_label = None - self._text: str = str(self.sensor_type.name) + " Sensor: " + str(self.name) + 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" @@ -60,6 +65,7 @@ def __init__(self, parent, sensor_name: str): ":/filament_related/media/btn_icons/filament_sensor_off.svg" ) self._setupUI() + self.toggle_button.stateChange.connect(self.toggle_sensor_state) @property def type(self) -> SensorType: @@ -90,24 +96,40 @@ def text(self, new_text) -> None: self._text_label.setText(f"{new_text}") self._text = new_text - @QtCore.pyqtSlot(bool, name="change_fil_sensor_state") + @QtCore.pyqtSlot(FilamentState, name="change_fil_sensor_state") def change_fil_sensor_state(self, state: FilamentState): - """Change filament sensor state""" - if isinstance(state, SensorWidget.FilamentState): - self.filament_state = state + """Invert the filament state in response to a Klipper update""" + if not isinstance(state, SensorWidget.FilamentState): + return + self.filament_state = SensorWidget.FilamentState(not state.value) + self.update() + + def toggle_button_state(self, state: ToggleAnimatedButton.State) -> None: + """Called when the Klipper firmware reports an update to the filament sensor state""" + self.toggle_button.setDisabled(False) + if state.value != self.sensor_state.value: + self.sensor_state = self.SensorState(state.value) + self.toggle_button.state = ToggleAnimatedButton.State( + self.sensor_state.value + ) + self.update() + + @QtCore.pyqtSlot(ToggleAnimatedButton.State, name="state-change") + def toggle_sensor_state(self, state: ToggleAnimatedButton.State) -> None: + """Emit the appropriate G-Code command to change the filament sensor state.""" + if state.value != self.sensor_state.value: + self.toggle_button.setDisabled(True) + self.run_gcode_signal.emit( + f"SET_FILAMENT_SENSOR SENSOR={self.text} ENABLE={int(state.value)}" + ) + self.update() + + def resizeEvent(self, a0: QtGui.QResizeEvent) -> None: + """Handle widget resize events.""" + return super().resizeEvent(a0) def paintEvent(self, a0: QtGui.QPaintEvent) -> None: """Re-implemented method, paint widget""" - # if ( - # self._scaled_select_on_pixmap is not None - # and self._scaled_select_off_pixmap is not None - # ): # Update the toggle button pixmap which indicates the sensor state - # self._button_icon_label.setPixmap( - # self._scaled_select_on_pixmap - # if self.sensor_state == SensorWidget.SensorState.ON - # else self._scaled_select_off_pixmap - # ) - style_painter = QtWidgets.QStylePainter(self) style_painter.setRenderHint(style_painter.RenderHint.Antialiasing, True) style_painter.setRenderHint( @@ -116,79 +138,128 @@ def paintEvent(self, a0: QtGui.QPaintEvent) -> None: style_painter.setRenderHint( style_painter.RenderHint.LosslessImageRendering, True ) - - if self.filament_state == SensorWidget.FilamentState.PRESENT: - _color = QtGui.QColor(2, 204, 59, 100) - else: - _color = QtGui.QColor(204, 50, 50, 100) - _brush = QtGui.QBrush() - _brush.setColor(_color) - - _brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - pen = style_painter.pen() - pen.setStyle(QtCore.Qt.PenStyle.NoPen) if self._icon_label: self._icon_label.setPixmap( self.icon_pixmap_fp if self.filament_state == self.FilamentState.PRESENT else self.icon_pixmap_fnp ) - background_rect = QtGui.QPainterPath() - background_rect.addRoundedRect( - self.contentsRect().toRectF(), - 15, - 15, - QtCore.Qt.SizeMode.AbsoluteSize, - ) - style_painter.setBrush(_brush) - style_painter.fillPath(background_rect, _brush) - style_painter.end() + _font = QtGui.QFont() + _font.setPointSize(20) + style_painter.setFont(_font) - @property - def toggle_sensor_gcode_command(self) -> str: - """Toggle filament sensor""" - self.sensor_state = ( - SensorWidget.SensorState.ON - if self.sensor_state == SensorWidget.SensorState.OFF - else SensorWidget.SensorState.OFF + label_name = self._text_label_name_ + label_detected = self._text_label_detected + label_state = self._text_label_state + + palette = label_name.palette() + palette.setColor(palette.ColorRole.WindowText, QtGui.QColorConstants.White) + style_painter.drawItemText( + label_name.geometry(), + label_name.alignment(), + palette, + True, + label_name.text(), + QtGui.QPalette.ColorRole.WindowText, + ) + + _font.setPointSize(16) + style_painter.setFont(_font) + filament_text = self.filament_state.name.capitalize() + tab_spacer = 12 * "\t" + style_painter.drawItemText( + label_state.geometry(), + label_state.alignment(), + palette, + True, + f"Filament: {tab_spacer}{filament_text}", + QtGui.QPalette.ColorRole.WindowText, ) - return str( - f"SET_FILAMENT_SENSOR SENSOR={self.text} ENABLE={not self.sensor_state.value}" + + sensor_state_text = self.sensor_state.name.capitalize() + tab_spacer += 3 * "\t" + style_painter.drawItemText( + label_detected.geometry(), + label_detected.alignment(), + palette, + True, + f"Enable: {tab_spacer}{sensor_state_text}", + QtGui.QPalette.ColorRole.WindowText, ) + style_painter.end() def _setupUI(self): _policy = QtWidgets.QSizePolicy.Policy.MinimumExpanding size_policy = QtWidgets.QSizePolicy(_policy, _policy) size_policy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) self.setSizePolicy(size_policy) - self.sensor_horizontal_layout = QtWidgets.QHBoxLayout() - self.sensor_horizontal_layout.setGeometry(QtCore.QRect(0, 0, 640, 60)) - self.sensor_horizontal_layout.setObjectName("sensorHorizontalLayout") + self.sensor_vertical_layout = QtWidgets.QVBoxLayout() + self.sensor_vertical_layout.setObjectName("sensorVerticalLayout") self._icon_label = BlocksLabel(self) size_policy.setHeightForWidth(self._icon_label.sizePolicy().hasHeightForWidth()) + parent_width = self.parentWidget().width() self._icon_label.setSizePolicy(size_policy) - self._icon_label.setMinimumSize(60, 60) - self._icon_label.setMaximumSize(60, 60) + self._icon_label.setMinimumSize(120, 100) + self._icon_label.setPixmap( self.icon_pixmap_fp if self.filament_state == self.FilamentState.PRESENT else self.icon_pixmap_fnp ) - self.sensor_horizontal_layout.addWidget(self._icon_label) - self._text_label = QtWidgets.QLabel(parent=self) - size_policy.setHeightForWidth(self._text_label.sizePolicy().hasHeightForWidth()) - self._text_label.setMinimumSize(100, 60) - self._text_label.setMaximumSize(500, 60) - _font = QtGui.QFont() - _font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferAntialias) - _font.setPointSize(18) - palette = self._text_label.palette() - palette.setColor(palette.ColorRole.WindowText, QtGui.QColorConstants.White) - self._text_label.setPalette(palette) - self._text_label.setFont(_font) - self._text_label.setText(str(self._text)) - self.sensor_horizontal_layout.addWidget(self._text_label) + self._text_label_name_ = QtWidgets.QLabel(parent=self) + size_policy.setHeightForWidth( + self._text_label_name_.sizePolicy().hasHeightForWidth() + ) + self._text_label_name_.setMinimumSize(self.rect().width(), 40) + self._text_label_name_.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + palette = self._text_label_name_.palette() + palette.setColor( + palette.ColorRole.WindowText, QtGui.QColorConstants.Transparent + ) + self._text_label_name_.setPalette(palette) + self._text_label_name_.setText(str(self._text)) + self._icon_label.setSizePolicy(size_policy) + + self._text_label_detected = QtWidgets.QLabel(parent=self) + size_policy.setHeightForWidth( + self._text_label_detected.sizePolicy().hasHeightForWidth() + ) + self._text_label_detected.setMinimumSize(parent_width, 20) + + self._text_label_detected.setPalette(palette) + self._text_label_detected.setText(f"Filament: {self.filament_state}") + + self._text_label_state = QtWidgets.QLabel(parent=self) + size_policy.setHeightForWidth( + self._text_label_state.sizePolicy().hasHeightForWidth() + ) + self._text_label_state.setMinimumSize(parent_width, 20) + + self._text_label_state.setPalette(palette) + self._text_label_state.setText(f"Enable: {self.sensor_state.name}") + + self._icon_label.setSizePolicy(size_policy) self.toggle_button = ToggleAnimatedButton(self) - self.toggle_button.setMaximumWidth(100) - self.sensor_horizontal_layout.addWidget(self.toggle_button) - self.setLayout(self.sensor_horizontal_layout) + self.toggle_button.setMinimumSize(100, 50) + self.toggle_button.state = ToggleAnimatedButton.State.ON + + self.sensor_vertical_layout.addWidget( + self._icon_label, alignment=QtCore.Qt.AlignmentFlag.AlignCenter + ) + self.sensor_vertical_layout.addWidget( + self._text_label_name_, alignment=QtCore.Qt.AlignmentFlag.AlignCenter + ) + self.sensor_vertical_layout.addStretch() + self.sensor_vertical_layout.addWidget( + self._text_label_state, alignment=QtCore.Qt.AlignmentFlag.AlignLeft + ) + self.sensor_vertical_layout.addStretch() + self.sensor_vertical_layout.addWidget( + self._text_label_detected, alignment=QtCore.Qt.AlignmentFlag.AlignLeft + ) + self.sensor_vertical_layout.addStretch() + self.sensor_vertical_layout.addWidget( + self.toggle_button, alignment=QtCore.Qt.AlignmentFlag.AlignCenter + ) + + self.setLayout(self.sensor_vertical_layout) diff --git a/BlocksScreen/lib/panels/widgets/sensorsPanel.py b/BlocksScreen/lib/panels/widgets/sensorsPanel.py index 51a5b2c..29eea5e 100644 --- a/BlocksScreen/lib/panels/widgets/sensorsPanel.py +++ b/BlocksScreen/lib/panels/widgets/sensorsPanel.py @@ -1,7 +1,9 @@ import typing -from lib.panels.widgets.sensorWidget import SensorWidget +from lib.utils.blocks_frame import BlocksCustomFrame from lib.utils.icon_button import IconButton +from lib.panels.widgets.sensorWidget import SensorWidget +from lib.utils.list_model import EntryDelegate, EntryListModel, ListItem from PyQt6 import QtCore, QtGui, QtWidgets @@ -15,80 +17,85 @@ class SensorsWindow(QtWidgets.QWidget): request_back: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal( name="request_back" ) - sensor_list: list[SensorWidget] = [] def __init__(self, parent): super(SensorsWindow, self).__init__(parent) + self.model = EntryListModel() + self.entry_delegate = EntryDelegate() + self.sensor_tracking_widget = {} + self.current_widget = None + self.sensor_list: list[SensorWidget] = [] self._setupUi() self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground, True) self.setAttribute(QtCore.Qt.WidgetAttribute.WA_AcceptTouchEvents, True) self.setTabletTracking(True) - self.fs_sensors_list.itemClicked.connect(self.handle_sensor_clicked) - self.fs_sensors_list.itemClicked self.fs_back_button.clicked.connect(self.request_back) + def reset_view_model(self) -> None: + """Clears items from ListView + (Resets `QAbstractListModel` by clearing entries) + """ + self.model.clear() + self.entry_delegate.clear() + @QtCore.pyqtSlot(dict, name="handle_available_fil_sensors") def handle_available_fil_sensors(self, sensors: dict) -> None: - """Handle available filament sensors, create `SensorWidget` for each detected - sensor - """ + """Handle available filament sensors, create `SensorWidget` for each detected sensor""" if not isinstance(sensors, dict): return + self.reset_view_model() filtered_sensors = list( filter( lambda printer_obj: str(printer_obj).startswith( "filament_switch_sensor" ) - or str(printer_obj).startswith("filament_motion_sensor"), + or str(printer_obj).startswith("filament_motion_sensor") + or str(printer_obj).startswith("cutter_sensor"), sensors.keys(), ) ) if filtered_sensors: - self.fs_sensors_list.setRowHidden(self.fs_sensors_list.row(self.item), True) self.sensor_list = [ self.create_sensor_widget(name=sensor) for sensor in filtered_sensors ] + self.model.setData(self.model.index(0), True, EntryListModel.EnableRole) else: - self.fs_sensors_list.setRowHidden( - self.fs_sensors_list.row(self.item), False - ) + self.no_update_placeholder.show() @QtCore.pyqtSlot(str, str, bool, name="handle_fil_state_change") def handle_fil_state_change( self, sensor_name: str, parameter: str, value: bool ) -> None: - """Handle filament state chage""" - if sensor_name in self.sensor_list: - _split = sensor_name.split(" ") - _item = self.fs_sensors_list.findChild( - SensorWidget, - name=_split[1], - options=QtCore.Qt.FindChildOption.FindChildrenRecursively, - ) + """Handle Klipper signals for filament sensor changes""" + _item = self.sensor_tracking_widget.get(sensor_name) + if _item: if parameter == "filament_detected": - if isinstance(_item, SensorWidget) and hasattr( - _item, "change_fil_sensor_state" - ): - _item.change_fil_sensor_state(SensorWidget.FilamentState.PRESENT) - _item.repaint() - elif parameter == "filament_missing": - if isinstance(_item, SensorWidget) and hasattr( - _item, "change_fil_sensor_state" - ): - _item.change_fil_sensor_state(SensorWidget.FilamentState.MISSING) - _item.repaint() + state = SensorWidget.FilamentState(not value) + _item.change_fil_sensor_state(state) elif parameter == "enabled": - if _item and isinstance(_item, SensorWidget): - self.run_gcode_signal.emit(_item.toggle_sensor_gcode_command) - - @QtCore.pyqtSlot(QtWidgets.QListWidgetItem, name="handle_sensor_clicked") - def handle_sensor_clicked(self, sensor: QtWidgets.QListWidgetItem) -> None: - """Handle filament sensor clicked""" - _item = self.fs_sensors_list.itemWidget(sensor) - # FIXME: This is just not working - _item.toggle_button.state = ~_item.toggle_button.state - if _item and isinstance(_item, SensorWidget): - self.run_gcode_signal.emit(_item.toggle_sensor_gcode_command) + _item.toggle_button_state(SensorWidget.SensorState(value)) + + def showEvent(self, event: QtGui.QShowEvent | None) -> None: + """Re-add clients to update list""" + return super().showEvent(event) + + @QtCore.pyqtSlot(ListItem, name="on-item-clicked") + def on_item_clicked(self, item: ListItem) -> None: + """Setup information for the currently clicked list item on the info box. + Keeps track of the list item + """ + if not item: + return + + if self.current_widget: + self.current_widget.hide() + + name_id = item.text + current_widget = self.sensor_tracking_widget.get(name_id) + if current_widget is None: + return + self.current_widget = current_widget + self.current_widget.show() def create_sensor_widget(self, name: str) -> SensorWidget: """Creates a sensor row to be added to the QListWidget @@ -96,132 +103,271 @@ def create_sensor_widget(self, name: str) -> SensorWidget: Args: name (str): The name of the filament sensor object """ - _item_widget = SensorWidget(self.fs_sensors_list, name) - _list_item = QtWidgets.QListWidgetItem() - _list_item.setFlags(~QtCore.Qt.ItemFlag.ItemIsEditable) - _list_item.setSizeHint( - QtCore.QSize(self.fs_sensors_list.contentsRect().width(), 80) - ) - _item_widget.toggle_button.stateChange.connect( - lambda: self.fs_sensors_list.itemClicked.emit(_item_widget) - ) + _item_widget = SensorWidget(self.infobox_frame, name) + self.info_box_layout.addWidget(_item_widget) - self.fs_sensors_list.setItemWidget(_list_item, _item_widget) + if self.current_widget: + _item_widget.hide() + else: + _item_widget.show() + self.current_widget = _item_widget + name_id = str(name).split(" ")[1] + item = ListItem( + text=name_id, + right_text="", + right_icon=self.pixmap, + left_icon=None, + callback=None, + selected=False, + allow_check=False, + _lfontsize=17, + _rfontsize=12, + height=80, + notificate=False, + ) + _item_widget.run_gcode_signal.connect(self.run_gcode_signal) + self.sensor_tracking_widget[name_id] = _item_widget + self.model.add_item(item) return _item_widget - def _setupUi(self): - self.setObjectName("filament_sensors_page") + def _setupUi(self) -> None: + """Setup UI for updatePage""" + font_id = QtGui.QFontDatabase.addApplicationFont( + ":/font/media/fonts for text/Momcake-Bold.ttf" + ) + font_family = QtGui.QFontDatabase.applicationFontFamilies(font_id)[0] sizePolicy = QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding, ) - self.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) + sizePolicy.setHorizontalStretch(1) + sizePolicy.setVerticalStretch(1) self.setSizePolicy(sizePolicy) - self.setMinimumSize(QtCore.QSize(710, 410)) + self.setMinimumSize(QtCore.QSize(710, 400)) self.setMaximumSize(QtCore.QSize(720, 420)) - self.content_vertical_layout = QtWidgets.QVBoxLayout() - self.content_vertical_layout.setObjectName("contentVerticalLayout") - self.fs_header_layout = QtWidgets.QHBoxLayout() - self.fs_header_layout.setContentsMargins(0, 0, 0, 0) - self.fs_header_layout.setObjectName("fs_header_layout") - self.fs_header_layout.setGeometry(QtCore.QRect(10, 10, 691, 71)) - self.fs_page_title = QtWidgets.QLabel(parent=self) - sizePolicy.setHeightForWidth( - self.fs_page_title.sizePolicy().hasHeightForWidth() - ) - self.fs_page_title.setSizePolicy(sizePolicy) - self.fs_page_title.setMinimumSize(QtCore.QSize(300, 71)) - self.fs_page_title.setMaximumSize(QtCore.QSize(16777215, 71)) + self.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) + self.update_page_content_layout = QtWidgets.QVBoxLayout() + self.update_page_content_layout.setContentsMargins(15, 15, 2, 2) + + self.header_content_layout = QtWidgets.QHBoxLayout() + self.header_content_layout.setAlignment(QtCore.Qt.AlignmentFlag.AlignTop) + self.fs_page_title = QtWidgets.QLabel(self) + self.fs_page_title.setMinimumSize(QtCore.QSize(100, 60)) + self.fs_page_title.setMaximumSize(QtCore.QSize(16777215, 60)) font = QtGui.QFont() - font.setPointSize(22) - palette = QtGui.QPalette() - palette.setColor(palette.ColorRole.WindowText, QtGui.QColorConstants.White) - self.fs_page_title.setPalette(palette) + font.setFamily(font_family) + font.setPointSize(24) + palette = self.fs_page_title.palette() + palette.setColor(palette.ColorRole.WindowText, QtGui.QColor("#FFFFFF")) self.fs_page_title.setFont(font) + self.fs_page_title.setPalette(palette) + self.fs_page_title.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft) + self.fs_page_title.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.fs_page_title.setObjectName("fs_page_title") - self.fs_header_layout.addWidget(self.fs_page_title, 0) + self.fs_page_title.setText("Filament Sensors") + self.header_content_layout.addWidget(self.fs_page_title, 0) self.fs_back_button = IconButton(self) - sizePolicy.setHeightForWidth( - self.fs_back_button.sizePolicy().hasHeightForWidth() - ) - self.fs_back_button.setSizePolicy(sizePolicy) 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.setObjectName("fs_back_button") - self.fs_header_layout.addWidget( - self.fs_back_button, - 0, + self.header_content_layout.addWidget(self.fs_back_button, 0) + self.update_page_content_layout.addLayout(self.header_content_layout, 0) + + self.main_content_layout = QtWidgets.QHBoxLayout() + self.main_content_layout.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + + self.sensor_buttons_frame = BlocksCustomFrame(self) + + self.sensor_buttons_frame.setMinimumSize(QtCore.QSize(320, 300)) + self.sensor_buttons_frame.setMaximumSize(QtCore.QSize(450, 500)) + + palette = QtGui.QPalette() + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Active, + QtGui.QPalette.ColorRole.Button, + brush, ) - self.content_vertical_layout.addLayout(self.fs_header_layout) - self.fs_sensors_list = QtWidgets.QListWidget(self) - sizePolicy = QtWidgets.QSizePolicy( - QtWidgets.QSizePolicy.Policy.MinimumExpanding, - QtWidgets.QSizePolicy.Policy.MinimumExpanding, + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.NoBrush) + palette.setBrush( + QtGui.QPalette.ColorGroup.Active, + QtGui.QPalette.ColorRole.Base, + brush, ) - sizePolicy.setHorizontalStretch(1) - sizePolicy.setVerticalStretch(1) - sizePolicy.setHeightForWidth( - self.fs_sensors_list.sizePolicy().hasHeightForWidth() + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Active, + QtGui.QPalette.ColorRole.Window, + brush, ) - self.fs_sensors_list.setSizePolicy(sizePolicy) - self.fs_sensors_list.setMinimumSize(QtCore.QSize(650, 300)) - self.fs_sensors_list.setMaximumSize(QtCore.QSize(700, 300)) - self.fs_sensors_list.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) - self.fs_sensors_list.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.fs_sensors_list.setObjectName("fs_sensors_list") - self.fs_sensors_list.setViewMode(self.fs_sensors_list.ViewMode.ListMode) - self.fs_sensors_list.setItemAlignment( - QtCore.Qt.AlignmentFlag.AlignHCenter | QtCore.Qt.AlignmentFlag.AlignVCenter - ) - self.fs_sensors_list.setFlow(self.fs_sensors_list.Flow.TopToBottom) - self.fs_sensors_list.setFrameStyle(0) - palette = self.fs_sensors_list.palette() - palette.setColor(palette.ColorRole.Base, QtGui.QColorConstants.Transparent) + brush = QtGui.QBrush(QtGui.QColor(0, 120, 215, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Active, + QtGui.QPalette.ColorRole.Highlight, + brush, + ) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Active, + QtGui.QPalette.ColorRole.Link, + brush, + ) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Inactive, + QtGui.QPalette.ColorRole.Button, + brush, + ) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.NoBrush) + palette.setBrush( + QtGui.QPalette.ColorGroup.Inactive, + QtGui.QPalette.ColorRole.Base, + brush, + ) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Inactive, + QtGui.QPalette.ColorRole.Window, + brush, + ) + brush = QtGui.QBrush(QtGui.QColor(0, 120, 215, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Inactive, + QtGui.QPalette.ColorRole.Highlight, + brush, + ) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Inactive, + QtGui.QPalette.ColorRole.Link, + brush, + ) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Disabled, + QtGui.QPalette.ColorRole.Button, + brush, + ) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.NoBrush) + palette.setBrush( + QtGui.QPalette.ColorGroup.Disabled, + QtGui.QPalette.ColorRole.Base, + brush, + ) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Disabled, + QtGui.QPalette.ColorRole.Window, + brush, + ) + brush = QtGui.QBrush(QtGui.QColor(0, 120, 215, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Disabled, + QtGui.QPalette.ColorRole.Highlight, + brush, + ) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush( + QtGui.QPalette.ColorGroup.Disabled, + QtGui.QPalette.ColorRole.Link, + brush, + ) + self.fs_sensors_list = QtWidgets.QListView(self.sensor_buttons_frame) + self.fs_sensors_list.setModel(self.model) + self.fs_sensors_list.setItemDelegate(self.entry_delegate) + self.entry_delegate.item_selected.connect(self.on_item_clicked) + self.fs_sensors_list.setMouseTracking(True) + self.fs_sensors_list.setTabletTracking(True) + self.fs_sensors_list.setSpacing(7) self.fs_sensors_list.setPalette(palette) - self.fs_sensors_list.setDropIndicatorShown(False) - self.fs_sensors_list.setAcceptDrops(False) + self.fs_sensors_list.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.fs_sensors_list.setStyleSheet("background-color:transparent") + self.fs_sensors_list.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.fs_sensors_list.setMinimumSize(self.sensor_buttons_frame.size()) + self.fs_sensors_list.setFrameShape(QtWidgets.QFrame.Shape.NoFrame) + self.fs_sensors_list.setVerticalScrollBarPolicy( + QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff + ) + self.fs_sensors_list.setHorizontalScrollBarPolicy( + QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff + ) + self.fs_sensors_list.setSizeAdjustPolicy( + QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents + ) + self.fs_sensors_list.setAutoScroll(False) self.fs_sensors_list.setProperty("showDropIndicator", False) - self.content_vertical_layout.setStretch(0, 0) - self.content_vertical_layout.setStretch(1, 1) - self.content_vertical_layout.addWidget( + self.fs_sensors_list.setDefaultDropAction(QtCore.Qt.DropAction.IgnoreAction) + self.fs_sensors_list.setAlternatingRowColors(False) + self.fs_sensors_list.setSelectionMode( + QtWidgets.QAbstractItemView.SelectionMode.NoSelection + ) + self.fs_sensors_list.setSelectionBehavior( + QtWidgets.QAbstractItemView.SelectionBehavior.SelectItems + ) + self.fs_sensors_list.setVerticalScrollMode( + QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel + ) + self.fs_sensors_list.setHorizontalScrollMode( + QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel + ) + QtWidgets.QScroller.grabGesture( self.fs_sensors_list, - 1, - QtCore.Qt.AlignmentFlag.AlignHCenter | QtCore.Qt.AlignmentFlag.AlignVCenter, + QtWidgets.QScroller.ScrollerGestureType.TouchGesture, ) - - font = QtGui.QFont() - font.setPointSize(25) - - self.item = QtWidgets.QListWidgetItem() - self.item.setSizeHint( - QtCore.QSize(self.fs_sensors_list.width(), self.fs_sensors_list.height()) + QtWidgets.QScroller.grabGesture( + self.fs_sensors_list, + QtWidgets.QScroller.ScrollerGestureType.LeftMouseButtonGesture, ) + self.sensor_buttons_layout = QtWidgets.QVBoxLayout() + self.sensor_buttons_layout.setContentsMargins(15, 20, 20, 5) + self.sensor_buttons_layout.addWidget(self.fs_sensors_list, 0) + self.sensor_buttons_frame.setLayout(self.sensor_buttons_layout) - self.label = QtWidgets.QLabel("No sensors found") - self.label.setFont(font) - self.label.setStyleSheet("color: gray;") - self.label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) - self.label.hide() + self.main_content_layout.addWidget(self.sensor_buttons_frame, 0) - self.fs_sensors_list.addItem(self.item) - self.fs_sensors_list.setItemWidget(self.item, self.label) + self.infobox_frame = BlocksCustomFrame() + self.infobox_frame.setMinimumSize(QtCore.QSize(250, 300)) + self.infobox_frame.setMaximumSize(QtCore.QSize(450, 500)) - self.content_vertical_layout.addSpacing(5) - self.setLayout(self.content_vertical_layout) - self._retranslateUi() + self.info_box_layout = QtWidgets.QVBoxLayout() + self.info_box_layout.setContentsMargins(0, 0, 0, 0) - def _retranslateUi(self): - _translate = QtCore.QCoreApplication.translate - self.setWindowTitle(_translate("filament_sensors_page", "Form")) - self.fs_page_title.setText( - _translate("filament_sensors_page", "Filament Sensors") - ) - self.fs_back_button.setProperty( - "button_type", _translate("filament_sensors_page", "icon") + font = QtGui.QFont() + font.setFamily(font_family) + font.setPointSize(20) + self.version_box = QtWidgets.QHBoxLayout() + self.no_update_placeholder = QtWidgets.QLabel(self) + self.no_update_placeholder.setMinimumSize(QtCore.QSize(200, 60)) + self.no_update_placeholder.setMaximumSize(QtCore.QSize(300, 60)) + self.no_update_placeholder.setFont(font) + self.no_update_placeholder.setPalette(palette) + self.no_update_placeholder.setSizePolicy(sizePolicy) + self.no_update_placeholder.setText("No Sensors Available") + self.no_update_placeholder.setWordWrap(True) + self.no_update_placeholder.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + 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.no_update_placeholder.hide() + self.infobox_frame.setLayout(self.info_box_layout) + self.main_content_layout.addWidget(self.infobox_frame, 1) + self.update_page_content_layout.addLayout(self.main_content_layout, 1) + self.setLayout(self.update_page_content_layout)