Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 45 additions & 37 deletions BlocksScreen/lib/panels/filamentTab.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
import typing
from collections import deque

from devices.amu import AMUManager
Expand Down Expand Up @@ -55,7 +56,8 @@ def __init__(
self.popup_gates: deque = deque()
self._spool_id_map: dict[str, dict] = {}
self._current_field: QtWidgets.QLineEdit | None = None
self._color_target_field = None
self._color_selected_callback: typing.Callable[[str], None] | None = None
self._selected_spool: dict | None = None
self._material_filter: str | None = None
self.moonraker_run = True

Expand Down Expand Up @@ -312,7 +314,9 @@ def _field():
lambda: self._on_show_keyboard(self._popup_name)
)
self._popup_color.clicked.connect(
lambda: self._open_color_wheel(self._popup_color)
lambda: self._open_color_wheel(
self._popup_color.text(), self._popup_color.setText
)
)
self._popup_material.clicked.connect(
lambda: self._on_show_keyboard(self._popup_material)
Expand Down Expand Up @@ -433,7 +437,7 @@ def _build_spool_page(self) -> QtWidgets.QWidget:
self._spool_delegate = EntryDelegate()
self._spool_list_view.setModel(self._spool_model)
self._spool_list_view.setItemDelegate(self._spool_delegate)
self._spool_delegate.item_selected.connect(self._on_spool_selected)
self._spool_delegate.item_selected.connect(self._on_list_item_tapped)
self._spool_load_widget = LoadingOverlayWidget(
frame, LoadingOverlayWidget.AnimationGIF.DEFAULT
)
Expand Down Expand Up @@ -566,7 +570,7 @@ def _add_row(title_text: str) -> QtWidgets.QLabel:
self.accept_btn.setFixedSize(QtCore.QSize(230, 80))
self.accept_btn.setPixmap(QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg"))
self.accept_btn.setFont(font)
self.accept_btn.clicked.connect(lambda: self._on_spool_selected())
self.accept_btn.clicked.connect(self._on_accept_clicked)

frame_2_lay.addWidget(
self.skip_btn, alignment=QtCore.Qt.AlignmentFlag.AlignHCenter
Expand All @@ -581,7 +585,7 @@ def _add_row(title_text: str) -> QtWidgets.QLabel:
return page

def handle_skip_button(self):
"""Map the pending pre-gate gate to an empty spool and dismiss the popup."""
"""Handles the skip button action from the pre-gate popup to send the appropriate G-code to map the gate to no spool."""
gate = self.pre_gate_idx.get("gate", 0)
self._reset_popup()
self.run_gcode.emit(
Expand Down Expand Up @@ -747,34 +751,35 @@ def on_spools_received(self, result: dict) -> None:
)
self._no_spools_label.show()

def _on_spool_selected(self) -> None:
item = self._spool_model.get_selected_item()
if item is None:
@QtCore.pyqtSlot(ListItem)
def _on_list_item_tapped(self, item: ListItem) -> None:
if not item:
return
if item.text == "+ Add Spool":
self.reset_spool_info()
self._add_popup.show()
return
spool = self._spool_id_map.get(item.text)

if self.sender() != self.accept_btn:
if item.text == "+ Add Spool":
self._add_popup.show()
return
if spool is None:
return
self.accept_btn.setEnabled(True)
filament = spool.get("filament") or {}
self.filament_name_label.setText(item.text)
self.material_label.setText(filament.get("material", "N/A"))
self.weight_label.setText(
f"{spool.get('remaining_weight')} g"
if spool.get("remaining_weight") is not None
else "N/A"
)
self.vendor_label.setText(
filament.get("vendor", "N/A").get("name", "N/A")
if filament.get("vendor")
else "N/A"
)

if spool is None:
return
self._selected_spool = spool
self.accept_btn.setEnabled(True)
filament = spool.get("filament") or {}
self.filament_name_label.setText(item.text)
self.material_label.setText(filament.get("material", "N/A"))
self.weight_label.setText(
f"{spool.get('remaining_weight')} g"
if spool.get("remaining_weight") is not None
else "N/A"
)
self.vendor_label.setText(
filament.get("vendor", "N/A").get("name", "N/A")
if filament.get("vendor")
else "N/A"
)

def _on_accept_clicked(self) -> None:
spool = self._selected_spool
if not spool:
return
filament = spool.get("filament") or {}
Expand All @@ -785,6 +790,7 @@ def _on_spool_selected(self) -> None:
f_temp = filament.get("settings_extruder_temp", -1)
gate = self.pre_gate_idx.get("gate", 0)

self._selected_spool = None
self.accept_btn.setEnabled(False)
self.popup.hide()
self._material_filter = None
Expand All @@ -809,6 +815,7 @@ def reset_spool_info(self):
self.material_label.setText("N/A")
self.weight_label.setText("N/A")
self.vendor_label.setText("N/A")
self._selected_spool = None
self.accept_btn.setEnabled(False)

@staticmethod
Expand Down Expand Up @@ -896,18 +903,19 @@ def _on_qwerty_value_selected(self, value: str) -> None:
self._current_field.setText(value)
self._current_field.editingFinished.emit()

def _open_color_wheel(self, field) -> None:
self._color_target_field = field
self._color_wheel.set_color_hex(field.text().strip("#") or "ffffff")
def _open_color_wheel(
self, current_hex: str, on_selected: typing.Callable[[str], None]
) -> None:
self._color_selected_callback = on_selected
self._color_wheel.set_color_hex(current_hex.strip("#") or "ffffff")
self._color_wheel_popup.show()
self._color_wheel_popup.raise_()

@QtCore.pyqtSlot(str, name="on-color-selected")
def _on_color_selected(self, hex_str: str) -> None:
if self._color_target_field is not None:
self._color_target_field.setText(hex_str)
self._color_target_field.editingFinished.emit()
self._color_target_field = None
callback, self._color_selected_callback = self._color_selected_callback, None
if callback is not None:
callback(hex_str)

def _clear_gate_map(self, gate_info) -> None:
"""Blank a gate's map entry when its filament runs out."""
Expand Down
46 changes: 10 additions & 36 deletions BlocksScreen/lib/panels/widgets/amuPage.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import typing

from devices.amu import AMUManager
from devices.amu.models import GateInfo
from lib.panels.widgets.amuWidgets import SpoolCarousel, SpoolInfoPanel
from lib.panels.widgets.basePopup import BasePopup
from lib.utils.blocks_frame import BlocksCustomFrame
Expand All @@ -25,8 +24,8 @@ class AMUpage(QtWidgets.QStackedWidget):
"PyQt_PyObject", str, str, str, int, name="request-keyboard"
)
request_color_wheel: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal(
"PyQt_PyObject", name="request-color-wheel"
)
str, "PyQt_PyObject", name="request-color-wheel"
) # current hex, callback receiving the picked hex
request_change_tab: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal(
int, name="request_change_tab"
)
Expand All @@ -44,14 +43,13 @@ def __init__(

self.amu_manager.mmu_state_changed.connect(self.on_mmu_state_changed)
self.on_mmu_state_changed(self.amu_manager.get_state())
self.info_panel._lbl_color.editingFinished.connect(
lambda: self.amu_manager.set_gate_color(
self.current_index,
self.info_panel._lbl_color.text().strip("#"),
)
self.info_panel.colorSelected.connect(
lambda hx: self.amu_manager.set_gate_color(self.current_index, hx)
)
self.info_panel._lbl_color.clicked.connect(
lambda: self.request_color_wheel.emit(self.info_panel._lbl_color)
self.info_panel.colorSwatchClicked.connect(
lambda hx: self.request_color_wheel.emit(
hx, self.info_panel.set_selected_color
)
)
self.info_panel._lbl_mat.editingFinished.connect(
lambda: self.amu_manager.set_gate_material(
Expand All @@ -73,16 +71,6 @@ def __init__(
500,
)
)
self.info_panel._lbl_weight.clicked.connect(
lambda: self.request_numpad[str, int, "PyQt_PyObject", int, int].emit(
"Weight",
int(self.info_panel._lbl_weight.text().strip("g")),
self._on_gate_weight_change,
0,
9999,
)
)

self.info_panel.request_keypad.connect(self.request_keyboard)
self.info_panel.loadRequested.connect(
lambda: {
Expand Down Expand Up @@ -131,20 +119,10 @@ def on_mmu_state_changed(self, mmu_state):
return
self.status = mmu_state
for i in range(len(mmu_state.gates)):
self.addSpool(mmu_state.gates[i])
self.carousel.addSpool(mmu_state.gates[i], mmu_state.filament_pos)
self.update()
self._on_selection(mmu_state.gate)

def addSpool(self, gate_info: GateInfo):
"""Add or refresh a gate's carousel button from its GateInfo."""
self.carousel.addSpool(
QtGui.QColor("#" + str(gate_info.color)[:6]),
gate_info.index,
gate_info.material,
int(gate_info.temperature or 0),
gate_info.status,
)

def _select_gate(self, idx: int):
self.carousel.selectIndex(self.current_index)
self.amu_manager.select_gate(idx)
Expand All @@ -154,18 +132,14 @@ def _on_selection(self, idx: int):
return
btn = self.carousel.buttons[idx]
self.current_index = idx
self.info_panel.setFilamentStatus(self.status)
self.info_panel.update_for_slot(idx, btn)
self.carousel.selectIndex(idx)
self.info_panel.setFilamentStatus(self.status)

def _on_gate_temp_change(self, _name: str, value: int) -> None:
self.info_panel._lbl_temp.setText(str(value))
self.info_panel._lbl_temp.editingFinished.emit()

def _on_gate_weight_change(self, _name: str, value: int) -> None:
self.info_panel._lbl_weight.setText(str(value))
self.info_panel._lbl_weight.editingFinished.emit()

def _build_ui(self):
self.setMinimumSize(700, 420)
self.setObjectName("fans_page")
Expand Down
Loading
Loading