99from lib .panels .widgets .printcorePage import SwapPrintcorePage
1010from lib .panels .widgets .probeHelperPage import ProbeHelper
1111from lib .printer import Printer
12- from lib .ui .controlStackedWidget_ui import Ui_controlStackedWidget
12+ from lib .ui .controlStackedWidget_ui import Ui_controlStackedWidget
1313from PyQt6 import QtCore , QtGui , QtWidgets
1414
1515from lib .panels .widgets .popupDialogWidget import Popup
1919from lib .panels .widgets .optionCardWidget import OptionCard
2020from helper_methods import normalize
2121
22+
2223class ControlTab (QtWidgets .QStackedWidget ):
2324 """Printer Control Stacked Widget"""
2425
@@ -84,7 +85,7 @@ def __init__(
8485 self .sliderPage = SliderPage (self )
8586 self .addWidget (self .sliderPage )
8687 self .sliderPage .request_back .connect (self .back_button )
87-
88+
8889 self .probe_helper_page .request_page_view .connect (
8990 partial (self .change_page , self .indexOf (self .probe_helper_page ))
9091 )
@@ -282,72 +283,84 @@ def __init__(
282283 self .panel .cooldown_btn .hide ()
283284 self .panel .cp_switch_print_core_btn .hide ()
284285
285- self .printer .fan_update [str , str , float ].connect (
286- self .on_fan_object_update
287- )
288- self .printer .fan_update [str , str , int ].connect (
289- self .on_fan_object_update
290- )
286+ self .printer .fan_update [str , str , float ].connect (self .on_fan_object_update )
287+ self .printer .fan_update [str , str , int ].connect (self .on_fan_object_update )
291288
292289 @QtCore .pyqtSlot (str , str , float , name = "on_fan_update" )
293290 @QtCore .pyqtSlot (str , str , int , name = "on_fan_update" )
294291 def on_fan_object_update (
295292 self , name : str , field : str , new_value : int | float
296293 ) -> None :
297- """Slot Method that receives information from fan objects
294+ """Slot that receives updates from fan objects.
298295
299296 Args:
300- name (str): fan object name
301- field (str): field name
302- new_value (int | float): New value for field name
297+ name (str): Fan object name
298+ field (str): Field name
299+ new_value (int | float): New value for the field
303300 """
304- if "speed" in field :
305- if not self .tune_display_buttons .get (name , None ):
306- if name in ("fan" , "fan_generic" ):
307- if "blower" in name .lower ():
308- _icon = QtGui .QPixmap (
309- ":/temperature_related/media/btn_icons/blower.svg"
310- )
311- else :
312- _icon = QtGui .QPixmap (":/temperature_related/media/btn_icons/fan.svg" )
313-
314- _card = OptionCard (self , name , str (name ), _icon ) # type: ignore
315- _card .setObjectName (str (name ))
316- self .card_options .update ({str (name ): _card })
317- self .panel .fans_content_layout .addWidget (_card )
318-
319- if not hasattr (self .card_options .get (name ), "continue_clicked" ):
320- del _card
321- self .card_options .pop (name )
322- return
323-
324- self .card_options .get (name ).setMode (True )
325- self .card_options .get (name ).secondtext .setText (f"{ new_value } %" )
326- self .card_options .get (name ).continue_clicked .connect (
327- lambda : self .on_slidePage_request (
328- str (name ),
329- self .card_options .get (name ).secondtext .text ().replace ("%" , "" ),
330- self .on_slider_change ,
331- 0 ,
332- 100 ,
333- )
334- )
335- self .tune_display_buttons [name ] = self .card_options .get (name ) #{self.card_options.get(name),True,self.card_options.get(name).secondtext.text().replace("%", "")}
301+ if "speed" not in field :
302+ return
336303
304+ # Check if this fan already has a display button
305+ fan_card = self .tune_display_buttons .get (name )
337306
338- self .card_options .get (name )
339- self .update ()
340- _display_button = self .tune_display_buttons .get (name )
341- if not _display_button :
307+ # Create a new card if it doesn't exist
308+ if fan_card is None :
309+ if not name .startswith (("fan" , "fan_generic" )):
342310 return
343- _display_button .secondtext .setText (
344- f"{ new_value * 100 :.0f} %"
311+
312+ icon_path = (
313+ ":/temperature_related/media/btn_icons/blower.svg"
314+ if "blower" in name .lower ()
315+ else ":/temperature_related/media/btn_icons/fan.svg"
345316 )
317+ icon = QtGui .QPixmap (icon_path )
318+ if name == "fan_generic Auxiliary_Cooling_Fans" :
319+ name = "Auxiliary\n cooling fans"
320+ elif name == "fan_generic CHAMBER_EXHAUST" :
321+ name = "Exhaust"
322+ elif name == "fan_generic Part_Cooling_Fan" :
323+ name = "Cooling fan"
324+ else :
325+ name = name .removeprefix ("fan_generic" )
326+
327+ card = OptionCard (self , name , str (name ), icon ) # type: ignore
328+ card .setObjectName (str (name ))
329+
330+ # Add card to layout and record reference
331+ self .card_options [name ] = card
332+ self .panel .fans_content_layout .addWidget (card )
333+
334+ # If the card doesn't have expected UI properties, discard it
335+ if not hasattr (card , "continue_clicked" ):
336+ del card
337+ self .card_options .pop (name , None )
338+ return
339+
340+ card .setMode (True )
341+ card .secondtext .setText (f"{ new_value } %" )
342+ card .continue_clicked .connect (
343+ lambda : self .on_slidePage_request (
344+ str (name ),
345+ card .secondtext .text ().replace ("%" , "" ),
346+ self .on_slider_change ,
347+ 0 ,
348+ 100 ,
349+ )
350+ )
351+
352+ self .tune_display_buttons [name ] = card
353+ self .update ()
354+ fan_card = card # reuse for next section
355+
356+ # Update existing card value display
357+ if fan_card :
358+ # Only multiply by 100 if it seems like a normalized value (0–1)
359+ value_percent = new_value * 100 if new_value <= 1 else new_value
360+ fan_card .secondtext .setText (f"{ value_percent :.0f} %" )
346361
347362 @QtCore .pyqtSlot (str , int , "PyQt_PyObject" , name = "on_slidePage_request" )
348- @QtCore .pyqtSlot (
349- str , int , "PyQt_PyObject" , int , int , name = "on_slidePage_request"
350- )
363+ @QtCore .pyqtSlot (str , int , "PyQt_PyObject" , int , int , name = "on_slidePage_request" )
351364 def on_slidePage_request (
352365 self ,
353366 name : str ,
@@ -363,7 +376,6 @@ def on_slidePage_request(
363376 self .sliderPage .set_slider_maximum (max_value )
364377 self .change_page (self .indexOf (self .sliderPage ))
365378
366-
367379 @QtCore .pyqtSlot (str , int , name = "on_slider_change" )
368380 def on_slider_change (self , name : str , new_value : int ) -> None :
369381 if "speed" in name .lower ():
@@ -397,9 +409,8 @@ def create_display_button(self, name: str) -> DisplayButton:
397409 font .setPointSize (16 )
398410 display_button .setFont (font )
399411 return display_button
400-
401- def handle_printcoreupdate (self , value :dict ):
402412
413+ def handle_printcoreupdate (self , value : dict ):
403414 if value ["swapping" ] == "idle" :
404415 return
405416
0 commit comments