26
26
if TYPE_CHECKING :
27
27
from artisanlib .main import ApplicationWindow # noqa: F401 # pylint: disable=unused-import
28
28
29
- from artisanlib .util import deltaLabelUTF8 , setDeviceDebugLogLevel , argb_colorname2rgba_colorname , rgba_colorname2argb_colorname , toInt
29
+ from artisanlib .util import (deltaLabelUTF8 , setDeviceDebugLogLevel , argb_colorname2rgba_colorname , rgba_colorname2argb_colorname ,
30
+ toInt , weight_units , convertWeight )
30
31
from artisanlib .dialogs import ArtisanResizeablDialog
31
32
from artisanlib .widgets import MyContentLimitedQComboBox , MyQComboBox , MyQDoubleSpinBox , wait_cursor
32
33
from artisanlib .scale import SUPPORTED_SCALES , ScaleSpecs
@@ -1453,6 +1454,8 @@ def __init__(self, parent:QWidget, aw:'ApplicationWindow', activeTab:int = 0) ->
1453
1454
1454
1455
self .scale1_devices :ScaleSpecs = [] # discovered scale1 devices
1455
1456
self .scale2_devices :ScaleSpecs = [] # discovered scale2 devices
1457
+ self .scale1_weight :Optional [float ] = None # weight of scale 1 in g
1458
+ self .scale2_weight :Optional [float ] = None # weight of scale 2 in g
1456
1459
1457
1460
scale1ModelLabel = QLabel (QApplication .translate ('Label' ,'Model' ))
1458
1461
self .scale1ModelComboBox = QComboBox ()
@@ -1463,6 +1466,13 @@ def __init__(self, parent:QWidget, aw:'ApplicationWindow', activeTab:int = 0) ->
1463
1466
self .scale1NameComboBox .setMinimumWidth (150 )
1464
1467
self .scale1ScanButton = QPushButton (QApplication .translate ('Button' , 'Scan' ))
1465
1468
self .scale1ScanButton .setFocusPolicy (Qt .FocusPolicy .NoFocus )
1469
+ self .scale1Weight = QLabel () # displays the current reading
1470
+ self .scale1Weight .setAlignment (Qt .AlignmentFlag .AlignRight | Qt .AlignmentFlag .AlignVCenter )
1471
+ self .scale1Weight .setMinimumWidth (40 )
1472
+ self .scale1Weight .setEnabled (False )
1473
+ self .scale1TareButton = QPushButton (QApplication .translate ('Button' , 'Tare' ))
1474
+ self .scale1TareButton .setFocusPolicy (Qt .FocusPolicy .NoFocus )
1475
+ self .scale1TareButton .setEnabled (False )
1466
1476
if self .aw .scale1_model is None :
1467
1477
self .scale1NameComboBox .setEnabled (False )
1468
1478
self .scale1ScanButton .setEnabled (False )
@@ -1475,6 +1485,8 @@ def __init__(self, parent:QWidget, aw:'ApplicationWindow', activeTab:int = 0) ->
1475
1485
self .scale1ModelComboBox .currentIndexChanged .connect (self .scale1ModelChanged )
1476
1486
self .scale1NameComboBox .currentIndexChanged .connect (self .scale1NameChanged )
1477
1487
self .scale1ScanButton .clicked .connect (self .scanScale1 )
1488
+ self .scale1TareButton .clicked .connect (self .tareScale1 )
1489
+ self .update_scale1_weight (None )
1478
1490
1479
1491
if self .aw .scale1_name and self .aw .scale1_id :
1480
1492
self .updateScale1devices ([(self .aw .scale1_name , self .aw .scale1_id )])
@@ -1485,11 +1497,18 @@ def __init__(self, parent:QWidget, aw:'ApplicationWindow', activeTab:int = 0) ->
1485
1497
scale1Grid .addWidget (self .scale1NameLabel ,1 ,0 )
1486
1498
scale1Grid .addWidget (self .scale1NameComboBox ,1 ,1 )
1487
1499
scale1Grid .addWidget (self .scale1ScanButton ,1 ,2 )
1500
+ scale1Grid .addWidget (self .scale1Weight ,1 ,3 ,Qt .AlignmentFlag .AlignCenter )
1501
+ scale1Grid .addWidget (self .scale1TareButton ,1 ,4 ,Qt .AlignmentFlag .AlignRight )
1502
+ scale1Grid .setHorizontalSpacing (10 )
1503
+ scale1Grid .setVerticalSpacing (10 )
1504
+ scale1Grid .setContentsMargins (10 ,10 ,10 ,10 )
1488
1505
scale1HLayout = QHBoxLayout ()
1489
1506
scale1HLayout .addLayout (scale1Grid )
1490
1507
scale1HLayout .addStretch ()
1508
+ scale1HLayout .setContentsMargins (0 ,0 ,0 ,0 )
1491
1509
scale1Layout = QVBoxLayout ()
1492
1510
scale1Layout .addLayout (scale1HLayout )
1511
+ scale1Layout .setContentsMargins (0 ,0 ,0 ,0 )
1493
1512
1494
1513
scale2ModelLabel = QLabel (QApplication .translate ('Label' ,'Model' ))
1495
1514
self .scale2ModelComboBox = QComboBox ()
@@ -1500,6 +1519,13 @@ def __init__(self, parent:QWidget, aw:'ApplicationWindow', activeTab:int = 0) ->
1500
1519
self .scale2NameComboBox .setMinimumWidth (150 )
1501
1520
self .scale2ScanButton = QPushButton (QApplication .translate ('Button' , 'Scan' ))
1502
1521
self .scale2ScanButton .setFocusPolicy (Qt .FocusPolicy .NoFocus )
1522
+ self .scale2Weight = QLabel () # displays the current reading
1523
+ self .scale2Weight .setAlignment (Qt .AlignmentFlag .AlignRight | Qt .AlignmentFlag .AlignVCenter )
1524
+ self .scale2Weight .setMinimumWidth (40 )
1525
+ self .scale2Weight .setEnabled (False )
1526
+ self .scale2TareButton = QPushButton (QApplication .translate ('Button' , 'Tare' ))
1527
+ self .scale2TareButton .setFocusPolicy (Qt .FocusPolicy .NoFocus )
1528
+ self .scale2TareButton .setEnabled (False )
1503
1529
if self .aw .scale2_model is None :
1504
1530
self .scale2NameComboBox .setEnabled (False )
1505
1531
self .scale2ScanButton .setEnabled (False )
@@ -1512,6 +1538,8 @@ def __init__(self, parent:QWidget, aw:'ApplicationWindow', activeTab:int = 0) ->
1512
1538
self .scale2ModelComboBox .currentIndexChanged .connect (self .scale2ModelChanged )
1513
1539
self .scale2NameComboBox .currentIndexChanged .connect (self .scale2NameChanged )
1514
1540
self .scale2ScanButton .clicked .connect (self .scanScale2 )
1541
+ self .scale2TareButton .clicked .connect (self .tareScale2 )
1542
+ self .update_scale2_weight (None )
1515
1543
1516
1544
if self .aw .scale2_name and self .aw .scale2_id :
1517
1545
self .updateScale2devices ([(self .aw .scale2_name , self .aw .scale2_id )])
@@ -1522,11 +1550,18 @@ def __init__(self, parent:QWidget, aw:'ApplicationWindow', activeTab:int = 0) ->
1522
1550
scale2Grid .addWidget (self .scale2NameLabel ,1 ,0 )
1523
1551
scale2Grid .addWidget (self .scale2NameComboBox ,1 ,1 )
1524
1552
scale2Grid .addWidget (self .scale2ScanButton ,1 ,2 )
1553
+ scale2Grid .addWidget (self .scale2Weight ,1 ,3 ,Qt .AlignmentFlag .AlignCenter )
1554
+ scale2Grid .addWidget (self .scale2TareButton ,1 ,4 ,Qt .AlignmentFlag .AlignRight )
1555
+ scale2Grid .setHorizontalSpacing (10 )
1556
+ scale2Grid .setVerticalSpacing (10 )
1557
+ scale2Grid .setContentsMargins (10 ,10 ,10 ,10 )
1525
1558
scale2HLayout = QHBoxLayout ()
1559
+ scale2HLayout .setContentsMargins (0 ,0 ,0 ,0 )
1526
1560
scale2HLayout .addLayout (scale2Grid )
1527
1561
scale2HLayout .addStretch ()
1528
1562
scale2Layout = QVBoxLayout ()
1529
1563
scale2Layout .addLayout (scale2HLayout )
1564
+ scale2Layout .setContentsMargins (0 ,0 ,0 ,0 )
1530
1565
1531
1566
self .taskWebDisplayGreenURL = QLabel ()
1532
1567
self .taskWebDisplayGreenURL .setOpenExternalLinks (True )
@@ -1712,14 +1747,50 @@ def scale1NameChanged(self, i:int) -> None:
1712
1747
scale = self .aw .scale_manager .get_scale (self .aw .scale1_model , self .aw .scale1_id , self .aw .scale1_name )
1713
1748
self .aw .scale_manager .set_scale1 (scale )
1714
1749
if scale is not None :
1715
- scale .set_connected_handler (lambda : self .aw .sendmessageSignal .emit (QApplication .translate ('Message' , '{} connected' ).format (self .aw .scale1_name ),True ,None ))
1716
- scale .set_disconnected_handler (lambda : self .aw .sendmessageSignal .emit (QApplication .translate ('Message' , '{} disconnected' ).format (self .aw .scale1_name ),True ,None ))
1717
- scale .connect ()
1750
+ scale .set_connected_handler (self .scale1connected )
1751
+ scale .set_disconnected_handler (self .scale1disconnected )
1752
+ scale .weight_changed_signal .connect (self .scale1_weight_changed ) # type:ignore[call-overload]
1753
+ scale .connect_scale ()
1718
1754
# i == -1 if self.scale1NameComboBox is empty!
1719
1755
else :
1720
1756
scale1 = self .aw .scale_manager .get_scale1 ()
1721
1757
if scale1 is not None :
1722
- scale1 .disconnect ()
1758
+ scale1 .weight_changed_signal .disconnect () # type:ignore[call-overload]
1759
+ scale1 .disconnect_scale ()
1760
+
1761
+ def scale1connected (self ) -> None :
1762
+ self .aw .sendmessageSignal .emit (QApplication .translate ('Message' , '{} connected' ).format (self .aw .scale1_name ),True ,None )
1763
+ self .scale1Weight .setEnabled (True )
1764
+ self .scale1TareButton .setEnabled (True )
1765
+
1766
+ def scale1disconnected (self ) -> None :
1767
+ self .aw .sendmessageSignal .emit (QApplication .translate ('Message' , '{} disconnected' ).format (self .aw .scale1_name ),True ,None )
1768
+ self .scale1Weight .setEnabled (False )
1769
+ self .scale1TareButton .setEnabled (False )
1770
+ self .update_scale1_weight (None )
1771
+
1772
+ @pyqtSlot (int )
1773
+ def scale1_weight_changed (self , w :int ) -> None :
1774
+ self .update_scale1_weight (w )
1775
+
1776
+ # returns formated weight converted to current weight unit
1777
+ def format_scale_weight (self , w :Optional [float ]) -> str :
1778
+ if w is None :
1779
+ return ''
1780
+ unit = weight_units .index (self .aw .qmc .weight [2 ])
1781
+ if unit == 0 : # g selected
1782
+ # metric
1783
+ return f'{ w :.0f} g' # never show decimals for g
1784
+ if unit == 1 : # kg selected
1785
+ # metric (always keep the accuracy to the g
1786
+ return f'{ w / 1000 :.3f} kg'
1787
+ # non-metric
1788
+ v = convertWeight (w ,0 ,weight_units .index (self .aw .qmc .weight [2 ]))
1789
+ return f'{ v :.2f} { self .aw .qmc .weight [2 ].lower ()} '
1790
+
1791
+ def update_scale1_weight (self , weight :Optional [float ]) -> None :
1792
+ self .scale1_weight = weight
1793
+ self .scale1Weight .setText (self .format_scale_weight (self .scale1_weight ))
1723
1794
1724
1795
def updateScale1devices (self , devices :ScaleSpecs ) -> None :
1725
1796
self .scale1_devices = devices
@@ -1739,6 +1810,12 @@ def scanScale1(self, _:bool = False) -> None:
1739
1810
else :
1740
1811
self .scale1NameComboBox .setEnabled (False )
1741
1812
1813
+ @pyqtSlot (bool )
1814
+ def tareScale1 (self , _ :bool = False ) -> None :
1815
+ scale = self .aw .scale_manager .get_scale1 ()
1816
+ if scale is not None :
1817
+ scale .tare_scale ()
1818
+
1742
1819
@pyqtSlot (int )
1743
1820
def scale2ModelChanged (self , i :int ) -> None :
1744
1821
if i > 0 and len (SUPPORTED_SCALES ) > i - 1 and len (SUPPORTED_SCALES [i - 1 ]) > 0 :
@@ -1760,12 +1837,35 @@ def scale2NameChanged(self, i:int) -> None:
1760
1837
scale = self .aw .scale_manager .get_scale (self .aw .scale2_model , self .aw .scale2_id , self .aw .scale2_name )
1761
1838
self .aw .scale_manager .set_scale2 (scale )
1762
1839
if scale is not None :
1763
- scale .connect ()
1840
+ scale .set_connected_handler (self .scale2connected )
1841
+ scale .set_disconnected_handler (self .scale2disconnected )
1842
+ scale .weight_changed_signal .connect (self .scale2_weight_changed ) # type:ignore[call-overload]
1843
+ scale .connect_scale ()
1764
1844
# i == -1 if self.scale2NameComboBox is empty!
1765
1845
else :
1766
1846
scale2 = self .aw .scale_manager .get_scale2 ()
1767
1847
if scale2 is not None :
1768
- scale2 .disconnect ()
1848
+ scale2 .weight_changed_signal .disconnect () # type:ignore[call-overload]
1849
+ scale2 .disconnect_scale ()
1850
+
1851
+ @pyqtSlot (int )
1852
+ def scale2_weight_changed (self , w :int ) -> None :
1853
+ self .update_scale2_weight (w )
1854
+
1855
+ def update_scale2_weight (self , weight :Optional [float ]) -> None :
1856
+ self .scale2_weight = weight
1857
+ self .scale2Weight .setText (self .format_scale_weight (self .scale2_weight ))
1858
+
1859
+ def scale2connected (self ) -> None :
1860
+ self .aw .sendmessageSignal .emit (QApplication .translate ('Message' , '{} connected' ).format (self .aw .scale2_name ),True ,None )
1861
+ self .scale2Weight .setEnabled (True )
1862
+ self .scale2TareButton .setEnabled (True )
1863
+
1864
+ def scale2disconnected (self ) -> None :
1865
+ self .aw .sendmessageSignal .emit (QApplication .translate ('Message' , '{} disconnected' ).format (self .aw .scale2_name ),True ,None )
1866
+ self .scale2Weight .setEnabled (False )
1867
+ self .scale2TareButton .setEnabled (False )
1868
+ self .update_scale2_weight (None )
1769
1869
1770
1870
def updateScale2devices (self , devices :ScaleSpecs ) -> None :
1771
1871
self .scale2_devices = devices
@@ -1785,6 +1885,11 @@ def scanScale2(self, _:bool = False) -> None:
1785
1885
else :
1786
1886
self .scale2NameComboBox .setEnabled (False )
1787
1887
1888
+ @pyqtSlot (bool )
1889
+ def tareScale2 (self , _ :bool = False ) -> None :
1890
+ scale = self .aw .scale_manager .get_scale2 ()
1891
+ if scale is not None :
1892
+ scale .tare_scale ()
1788
1893
1789
1894
@pyqtSlot (bool )
1790
1895
def taskWebDisplayGreen (self , b :bool = False ) -> None :
0 commit comments