Import LinuxCNC source tree
This commit is contained in:
179
lib/python/qtvcp/widgets/hal_label.py
Normal file
179
lib/python/qtvcp/widgets/hal_label.py
Normal file
@@ -0,0 +1,179 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# Qtvcp widget
|
||||
# Copyright (c) 2017 Chris Morley
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
###############################################################################
|
||||
|
||||
|
||||
import hal
|
||||
from qtvcp.widgets.widget_baseclass import _HalWidgetBase
|
||||
from qtpy.QtCore import Property, Slot
|
||||
from qtvcp.widgets.simple_widgets import ScaledLabel
|
||||
from qtvcp import logger
|
||||
|
||||
# Instantiate the libraries with global reference
|
||||
# LOG is for running code logging
|
||||
LOG = logger.getLogger(__name__)
|
||||
|
||||
# Force the log level for this module
|
||||
# LOG.setLevel(logger.INFO) # One of DEBUG, INFO, WARNING, ERROR, CRITICAL
|
||||
|
||||
|
||||
################################################################
|
||||
class HALLabel(ScaledLabel, _HalWidgetBase):
|
||||
def __init__(self, parent=None):
|
||||
super(HALLabel, self).__init__(parent)
|
||||
self._textTemplate = '%f'
|
||||
self.istate = False
|
||||
self._pin_name = ''
|
||||
self._bit_pin_type = True
|
||||
self._s32_pin_type = False
|
||||
self._float_pin_type = False
|
||||
self._use_multi_label = False
|
||||
self._multi_label_list = ['Label 0','Label 1','Label 2']
|
||||
|
||||
def _hal_init(self):
|
||||
super()._hal_init()
|
||||
if self._pin_name == '':
|
||||
pname = self.HAL_NAME_
|
||||
else:
|
||||
pname = self._pin_name
|
||||
if self._bit_pin_type:
|
||||
self.hal_pin = self.HAL_GCOMP_.newpin(pname, hal.HAL_BIT, hal.HAL_IN)
|
||||
self.hal_pin.value_changed.connect(lambda data: self._setText(data))
|
||||
elif self._float_pin_type:
|
||||
self.hal_pin = self.HAL_GCOMP_.newpin(pname, hal.HAL_FLOAT, hal.HAL_IN)
|
||||
self.hal_pin.value_changed.connect(lambda data: self._setText(data))
|
||||
elif self._s32_pin_type or self._use_multi_label:
|
||||
self.hal_pin = self.HAL_GCOMP_.newpin(pname, hal.HAL_S32, hal.HAL_IN)
|
||||
if self._s32_pin_type:
|
||||
self.hal_pin.value_changed.connect(lambda data: self._setText(data))
|
||||
else:
|
||||
self.hal_pin.value_changed.connect(lambda data: self._changeText(data))
|
||||
|
||||
# display formatted text
|
||||
def _setText(self, data):
|
||||
try:
|
||||
tmpl = lambda s: str(self._textTemplate) % s
|
||||
self.setText(tmpl(data))
|
||||
except Exception as e:
|
||||
LOG.warning('Widget "{}" format error: {}'.format(self.objectName(),e))
|
||||
|
||||
# select text from a list
|
||||
def _changeText(self, data):
|
||||
if data < 0 or data >= len(self._multi_label_list):
|
||||
self.setText('')
|
||||
else:
|
||||
self._setText(self._multi_label_list[data])
|
||||
|
||||
# one can connect signals to this widget to
|
||||
# feed an input that gets formatted by this widget.
|
||||
@Slot(float)
|
||||
@Slot(int)
|
||||
@Slot(bool)
|
||||
def setDisplay(self, data):
|
||||
self._setText(data)
|
||||
|
||||
@Slot(int)
|
||||
def selectLabel(self,data):
|
||||
self._changeText(data)
|
||||
|
||||
#########################################################################
|
||||
# This is how designer can interact with our widget properties.
|
||||
# designer will show the Property properties in the editor
|
||||
# it will use the get set and reset calls to do those actions
|
||||
########################################################################
|
||||
|
||||
def _toggle_properties(self, picked):
|
||||
data = ('bit_pin_type', 's32_pin_type',
|
||||
'float_pin_type','use_multi_label')
|
||||
|
||||
for i in data:
|
||||
if not i == picked:
|
||||
self[i] = False
|
||||
|
||||
def set_pin_name(self, value):
|
||||
self._pin_name = value
|
||||
def get_pin_name(self):
|
||||
return self._pin_name
|
||||
def reset_pin_name(self):
|
||||
self._pin_name = ''
|
||||
|
||||
def set_bit_pin_type(self, value):
|
||||
self._bit_pin_type = value
|
||||
if value:
|
||||
self._toggle_properties('bit_pin_type')
|
||||
def get_bit_pin_type(self):
|
||||
return self._bit_pin_type
|
||||
def reset_bit_pin_type(self):
|
||||
self._bit_pin_type = ''
|
||||
|
||||
def set_s32_pin_type(self, value):
|
||||
self._s32_pin_type = value
|
||||
if value:
|
||||
self._toggle_properties('s32_pin_type')
|
||||
def get_s32_pin_type(self):
|
||||
return self._s32_pin_type
|
||||
def reset_s32_pin_type(self):
|
||||
self._s32_pin_type = ''
|
||||
|
||||
def set_float_pin_type(self, value):
|
||||
self._float_pin_type = value
|
||||
if value:
|
||||
self._toggle_properties('float_pin_type')
|
||||
def get_float_pin_type(self):
|
||||
return self._float_pin_type
|
||||
def reset_float_pin_type(self):
|
||||
self._float_pin_type = ''
|
||||
|
||||
def set_use_multi_label(self, value):
|
||||
self._use_multi_label = value
|
||||
if value:
|
||||
self._toggle_properties('use_multi_label')
|
||||
def get_use_multi_label(self):
|
||||
return self._use_multi_label
|
||||
def reset_use_multi_label(self):
|
||||
self._use_multi_label = ''
|
||||
|
||||
def set_textTemplate(self, data):
|
||||
self._textTemplate = data
|
||||
def get_textTemplate(self):
|
||||
return self._textTemplate
|
||||
def reset_textTemplate(self):
|
||||
self._textTemplate = '%d'
|
||||
|
||||
def set_multi_label_l(self, data):
|
||||
self._multi_label_list = data
|
||||
def get_multi_label_l(self):
|
||||
return self._multi_label_list
|
||||
def reset_multi_label_l(self):
|
||||
self._multi_label_list = ['Label 0','Label 1','Label 2']
|
||||
|
||||
# designer will show these properties in this order:
|
||||
pin_name = Property(str, get_pin_name, set_pin_name, reset_pin_name)
|
||||
bit_pin_type = Property(bool, get_bit_pin_type, set_bit_pin_type, reset_bit_pin_type)
|
||||
s32_pin_type = Property(bool, get_s32_pin_type, set_s32_pin_type, reset_s32_pin_type)
|
||||
float_pin_type = Property(bool, get_float_pin_type, set_float_pin_type, reset_float_pin_type)
|
||||
use_multi_label = Property(bool, get_use_multi_label, set_use_multi_label, reset_use_multi_label)
|
||||
textTemplate = Property(str, get_textTemplate, set_textTemplate, reset_textTemplate)
|
||||
|
||||
multi_label_list = Property('QStringList',
|
||||
get_multi_label_l, set_multi_label_l, reset_multi_label_l)
|
||||
##############################
|
||||
# required class boiler code #
|
||||
##############################
|
||||
|
||||
def __getitem__(self, item):
|
||||
return getattr(self, item)
|
||||
def __setitem__(self, item, value):
|
||||
return setattr(self, item, value)
|
||||
Reference in New Issue
Block a user