diff options
Diffstat (limited to 'gr-qtgui/python/qtgui/msgcheckbox.py')
-rw-r--r-- | gr-qtgui/python/qtgui/msgcheckbox.py | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/gr-qtgui/python/qtgui/msgcheckbox.py b/gr-qtgui/python/qtgui/msgcheckbox.py new file mode 100644 index 0000000000..8d2a52ae07 --- /dev/null +++ b/gr-qtgui/python/qtgui/msgcheckbox.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright 2020 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +# + +from PyQt5 import Qt +from PyQt5.QtWidgets import QFrame, QVBoxLayout +from PyQt5.QtCore import Qt as Qtc + +from gnuradio import gr +import pmt + +class CheckBoxEx(Qt.QCheckBox): + def __init__(self, lbl, callback=None): + Qt.QCheckBox.__init__(self) + self.setText(lbl) + self.callback = callback + + self.stateChanged.connect(self.onToggleClicked) + + def onToggleClicked(self): + if self.callback is not None: + self.callback(super().isChecked()) + +class MsgCheckBox(gr.sync_block, QFrame): + """ + This block creates a variable checkbox. Leave the label blank to + use the variable id as the label. A checkbox selects between + two values of similar type, but will stay depressed until + clicked again. The variable will take on one value or the other + depending on whether the button is pressed or released. + + This control will also produce a state message matching the + set values. + """ + def __init__(self, callback, lbl, pressedReleasedDict, initPressed, alignment, + valignment, outputmsgname='value'): + gr.sync_block.__init__(self, name="MsgCheckBox", in_sig=None, out_sig=None) + QFrame.__init__(self) + + self.outputmsgname = outputmsgname + self.chkBox = CheckBoxEx(lbl, self.onToggleClicked) + + layout = QVBoxLayout() + + layout.addWidget(self.chkBox) + + if alignment == 1: + halign = Qtc.AlignCenter + elif alignment == 2: + halign = Qtc.AlignLeft + else: + halign = Qtc.AlignRight + + if valignment == 1: + valign = Qtc.AlignVCenter + elif valignment == 2: + valign = Qtc.AlignTop + else: + valign = Qtc.AlignBottom + + layout.setAlignment(halign | valign) + self.setLayout(layout) + + self.callback = callback + self.pressReleasedDict = pressedReleasedDict + + self.message_port_register_out(pmt.intern("state")) + + if initPressed: + self.chkctl.setChecked(True) + + self.show() + + def onToggleClicked(self, checked): + if self.chkBox.isChecked(): + self.callback(self.pressReleasedDict['Pressed']) + + if type(self.pressReleasedDict['Pressed']) == bool: + self.message_port_pub(pmt.intern("state"), + pmt.cons(pmt.intern(self.outputmsgname), + pmt.from_bool(self.pressReleasedDict['Pressed']))) + elif type(self.pressReleasedDict['Pressed']) == int: + self.message_port_pub(pmt.intern("state"), + pmt.cons(pmt.intern(self.outputmsgname), + pmt.from_long(self.pressReleasedDict['Pressed']))) + elif type(self.pressReleasedDict['Pressed']) == float: + self.message_port_pub(pmt.intern("state"), + pmt.cons(pmt.intern(self.outputmsgname), + pmt.from_float(self.pressReleasedDict['Pressed']))) + else: + self.message_port_pub(pmt.intern("state"), + pmt.cons(pmt.intern(self.outputmsgname), + pmt.intern(self.pressReleasedDict['Pressed']))) + else: + self.callback(self.pressReleasedDict['Released']) + + if type(self.pressReleasedDict['Released']) == bool: + self.message_port_pub(pmt.intern("state"), + pmt.cons(pmt.intern(self.outputmsgname), + pmt.from_bool(self.pressReleasedDict['Released']))) + elif type(self.pressReleasedDict['Released']) == int: + self.message_port_pub(pmt.intern("state"), + pmt.cons(pmt.intern(self.outputmsgname), + pmt.from_long(self.pressReleasedDict['Released']))) + elif type(self.pressReleasedDict['Released']) == float: + self.message_port_pub(pmt.intern("state"), + pmt.cons(pmt.intern(self.outputmsgname), + pmt.from_float(self.pressReleasedDict['Released']))) + else: + self.message_port_pub(pmt.intern("state"), + pmt.cons(pmt.intern(self.outputmsgname), + pmt.intern(self.pressReleasedDict['Released']))) |