Files
linuxcncAllWasm/share/qtvcp/panels/test_panel/test_panel_handler.py
2026-08-20 06:17:39 +08:00

200 lines
7.3 KiB
Python

############################
# **** IMPORT SECTION **** #
############################
import sys
import shutil
from qtpy.QtCore import *
from qtpy.QtGui import *
from qtpy.QtWidgets import *
from qtvcp.core import Status
###########################################
# **** instantiate libraries section **** #
###########################################
STATUS = Status()
###################################
# **** HANDLER CLASS SECTION **** #
###################################
class HandlerClass:
########################
# **** INITIALIZE **** #
########################
# widgets allows access to widgets from the qtvcp files
# at this point the widgets and hal pins are not instantiated
def __init__(self, halcomp,widgets,paths):
self.w = widgets
self.timer = QTimer()
self.timer.timeout.connect(self.announceLEDText)
self.lastLED_1 = 0
self.lastLED_2 = 0
self.lastLED_3 = 0
self.lastLED_4 = 0
self.timer.start(1000)
##########################################
# Special Functions called from QTVCP
##########################################
# at this point:
# the widgets are instantiated.
# the HAL pins are built but HAL is not set ready
def initialized__(self):
# make sure scalewidgets get proper starting values
self.w.dial_1.valueChanged.emit(self.w.dial_1.value())
self.w.dial_2.valueChanged.emit(self.w.dial_2.value())
self.w.dial_3.valueChanged.emit(self.w.dial_3.value())
self.w.dial_4.valueChanged.emit(self.w.dial_4.value())
# speak text when return pressed
self.w.lineEdit_led_1.returnPressed.connect(lambda : self.announceText(self.w.lineEdit_led_1))
self.w.lineEdit_led_2.returnPressed.connect(lambda : self.announceText(self.w.lineEdit_led_2))
self.w.lineEdit_led_3.returnPressed.connect(lambda : self.announceText(self.w.lineEdit_led_3))
self.w.lineEdit_led_4.returnPressed.connect(lambda : self.announceText(self.w.lineEdit_led_4))
if shutil.which('urxvt') is not None:
term = embterminal(name='urxvt')
self.w.dockWidget.setWidget(term)
elif shutil.which('xterm') is not None:
term = embterminal(name='xterm')
self.w.dockWidget.setWidget(term)
else:
self.w.dockWidget.setWidget(
QLabel('''terminal program urxvt not available. \
Try sudo apt install rxvt-unicode-256color'''))
########################
# callbacks from STATUS #
########################
#######################
# callbacks from form #
#######################
def actionTriggered(self, data):
if data == self.w.actionSetD1_50_50:
self.w.dial_1.setMinimum(-50)
self.w.dial_1.setMaximum(50)
self.w.dockWidget_2.setWindowTitle('Dial 1 (+-50)')
elif data == self.w.actionSetD1_100_100:
self.w.dial_1.setMinimum(-100)
self.w.dial_1.setMaximum(100)
self.w.dockWidget_2.setWindowTitle('Dial 1 (+-100)')
elif data == self.w.actionSetD1_1000_1000:
self.w.dial_1.setMinimum(-1000)
self.w.dial_1.setMaximum(1000)
self.w.dockWidget_2.setWindowTitle('Dial 1 (+-1000)')
elif data == self.w.actionSetD1_0_100:
self.w.dial_1.setMinimum(0)
self.w.dial_1.setMaximum(100)
self.w.dockWidget_2.setWindowTitle('Dial 1 (0-100)')
elif data == self.w.actionSetD1_0_360:
self.w.dial_1.setMinimum(0)
self.w.dial_1.setMaximum(360)
self.w.dockWidget_2.setWindowTitle('Dial 1 (0-360)')
elif data == self.w.actionSetD1_0_1000:
self.w.dial_1.setMinimum(0)
self.w.dial_1.setMaximum(1000)
self.w.dockWidget_2.setWindowTitle('Dial 1 (0-1000)')
elif data == self.w.actionSetD2_50_50:
self.w.dial_2.setMinimum(-50)
self.w.dial_2.setMaximum(50)
self.w.dockWidget_3.setWindowTitle('Dial 2 (+-50)')
elif data == self.w.actionSetD2_100_100:
self.w.dial_2.setMinimum(-100)
self.w.dial_2.setMaximum(100)
self.w.dockWidget_3.setWindowTitle('Dial 1 (+-100)')
elif data == self.w.actionSetD2_1000_1000:
self.w.dial_2.setMinimum(-1000)
self.w.dial_2.setMaximum(1000)
self.w.dockWidget_3.setWindowTitle('Dial 1 (+-1000)')
elif data == self.w.actionSetD2_0_100:
self.w.dial_2.setMinimum(0)
self.w.dial_2.setMaximum(100)
self.w.dockWidget_3.setWindowTitle('Dial 2 (0-100)')
elif data == self.w.actionSetD2_0_360:
self.w.dial_2.setMinimum(0)
self.w.dial_2.setMaximum(360)
self.w.dockWidget_3.setWindowTitle('Dial 2 (0-360)')
elif data == self.w.actionSetD2_0_1000:
self.w.dial_2.setMinimum(0)
self.w.dial_2.setMaximum(1000)
self.w.dockWidget_3.setWindowTitle('Dial 2 (0-1000)')
def announceLEDText(self):
# speak led label contents on state change, if checked
for i in range(1,5):
if self.w['actionLED_{}'.format(i)].isChecked():
data = self.w['led_{}'.format(i)].getState()
if self['lastLED_{}'.format(i)] != data:
name = self.w['lineEdit_led_{}'.format(i)].text()
STATUS.emit('play-sound', 'SPEAK {} {}'.format(name,data))
self['lastLED_{}'.format(i)] = data
def announceText(self, widget):
STATUS.emit('play-sound', 'SPEAK {}'.format(widget.text()))
#####################
# general functions #
#####################
#####################
# KEY BINDING CALLS #
#####################
###########################
# **** closing event **** #
###########################
##############################
# required class boiler code #
##############################
def __getitem__(self, item):
return getattr(self, item)
def __setitem__(self, item, value):
return setattr(self, item, value)
class embterminal(QWidget):
def __init__(self, parent=None, name=None):
super(embterminal, self).__init__(parent)
self.process = QProcess(self)
self.w = QWindow()
self.terminal = QWidget.createWindowContainer(self.w)
self.terminal.setMinimumSize(550,100)
self.terminal.setMaximumSize(550,100)
layout = QVBoxLayout(self)
layout.addWidget(self.terminal)
size_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.setSizePolicy(size_policy)
# xterm
if name == 'xterm':
self.process.start(
'xterm',['-bg','black','-fg','green', '-cr','green',
'-bd', 'green', '-fa', 'Monospace', '-fs', '10',
'-into', str(int(self.w.winId()))])
else:
# Works also with urxvt:
self.process.start(
'urxvt',['-bg','black','-fg','green', '-cr','green',
'-bd', 'green', '--font', 'xft:Monospace:size=10', '-embed', str(int(self.w.winId()))])
def sizeHint(self):
return QSize(550, 100)
################################
# required handler boiler code #
################################
def get_handlers(halcomp,widgets,paths):
return [HandlerClass(halcomp,widgets,paths)]