def __init__(self): self.data = None self.classifier = None self.selected = None self.model = CustomRuleViewerTableModel(parent=self) self.model.set_horizontal_header_labels( [ "IF conditions", "", "THEN class", "Distribution", "Probabilities [%]", "Quality", "Length", ] ) self.proxy_model = QSortFilterProxyModel(parent=self) self.proxy_model.setSourceModel(self.model) self.proxy_model.setSortRole(self.model.SortRole) self.view = gui.TableView(self, wordWrap=False) self.view.setModel(self.proxy_model) self.view.verticalHeader().setVisible(True) self.view.horizontalHeader().setStretchLastSection(False) self.view.selectionModel().selectionChanged.connect(self.commit) self.dist_item_delegate = DistributionItemDelegate(self) self.view.setItemDelegateForColumn(3, self.dist_item_delegate) self.mainArea.layout().setContentsMargins(0, 0, 0, 0) self.mainArea.layout().addWidget(self.view) bottom_box = gui.hBox(widget=self.mainArea, box=None, margin=0, spacing=0) original_order_button = QPushButton("Restore original order", autoDefault=False) original_order_button.setFixedWidth(180) bottom_box.layout().addWidget(original_order_button) original_order_button.clicked.connect(self.restore_original_order) gui.separator(bottom_box, width=5, height=0) gui.checkBox( widget=bottom_box, master=self, value="compact_view", label="Compact view", callback=self.on_update, )
def __init__(self, title, text, parent=None): super().__init__(parent) self.setLayout(QVBoxLayout()) self.title_le = QLineEdit() self.title_le.setPlaceholderText("Document title") self.title_le.setText(title) self.title_le.editingFinished.connect(self._on_text_changed) self.text_area = CustomQPlainTextEdit() self.text_area.setPlaceholderText("Document text") self.text_area.setPlainText(text) self.text_area.editingFinished.connect(self._on_text_changed) remove_button = QPushButton("x") remove_button.setFixedWidth(35) remove_button.setFocusPolicy(Qt.NoFocus) remove_button.clicked.connect(self._on_remove_clicked) box = gui.hBox(self) box.layout().addWidget(self.title_le) box.layout().addWidget(remove_button) self.layout().addWidget(self.text_area)
def __init__(self): self.data = None self.classifier = None self.selected = None self.model = CustomRuleViewerTableModel(parent=self) self.model.set_horizontal_header_labels( ["IF conditions", "", "THEN class", "Distribution", "Probabilities [%]", "Quality", "Length"]) self.proxy_model = QSortFilterProxyModel(parent=self) self.proxy_model.setSourceModel(self.model) self.proxy_model.setSortRole(self.model.SortRole) self.view = gui.TableView(self, wordWrap=False) self.view.setModel(self.proxy_model) self.view.verticalHeader().setVisible(True) self.view.horizontalHeader().setStretchLastSection(False) self.view.selectionModel().selectionChanged.connect(self.commit) self.dist_item_delegate = DistributionItemDelegate(self) self.view.setItemDelegateForColumn(3, self.dist_item_delegate) self.mainArea.layout().setContentsMargins(0, 0, 0, 0) self.mainArea.layout().addWidget(self.view) bottom_box = gui.hBox(widget=self.mainArea, box=None, margin=0, spacing=0) original_order_button = QPushButton( "Restore original order", autoDefault=False) original_order_button.setFixedWidth(180) bottom_box.layout().addWidget(original_order_button) original_order_button.clicked.connect(self.restore_original_order) gui.separator(bottom_box, width=5, height=0) gui.checkBox(widget=bottom_box, master=self, value="compact_view", label="Compact view", callback=self.on_update) self.report_button.setFixedWidth(180) bottom_box.layout().addWidget(self.report_button)
class OSK(QWidget): def __init__(self, rWidget=None): super(OSK, self).__init__() self.showFullScreen() self._rWidget = rWidget self.layout = QVBoxLayout(self) self.currentText = QLabel(self) self.currentText.setAlignment(Qt.AlignCenter) if rWidget is not None: self.currentText.setText(rWidget.text()) self.layout.addWidget(self.currentText) keyLayout = [['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-'], ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'], ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'], ['z', 'x', 'c', 'v', 'b', 'n', 'm']] for l in keyLayout: panel = QWidget(self) panel.layout = QHBoxLayout(panel) for key in l: button = OSKKey(key, self, parent=self) panel.layout.addWidget(button) self.layout.addWidget(panel) contolPanel = QWidget(self) contolPanel.layout = QHBoxLayout(contolPanel) self._shift = QPushButton('Shift', self) self._shift.setCheckable(True) self._shift.setFixedWidth(150) contolPanel.layout.addWidget(self._shift) spaceBar = OSKKey('space', self, parent=self) spaceBar.rKey = ' ' spaceBar.setFixedWidth(2 * self.window().geometry().width() / 3) contolPanel.layout.addWidget(spaceBar) bkspc = OSKKey('delete', self, parent=self) bkspc.rKey = '<<' contolPanel.layout.addWidget(bkspc) self.layout.addWidget(contolPanel) self.closeButton = QPushButton("OK", self) self.closeButton.clicked.connect(self.__closeButtonAction) self.layout.addWidget(self.closeButton) def onClick(self, key): if self.rWidget is not None: if key == '<<': self.rWidget.setText(self.rWidget.text()[:-1]) elif self._shift.isChecked(): self.rWidget.setText(self.rWidget.text() + key.upper()) self._shift.setChecked(False) else: self.rWidget.setText(self.rWidget.text() + key) self.currentText.setText(self.rWidget.text()) def __closeButtonAction(self): self.parent().hide() @property def rWidget(self): return self._rWidget @rWidget.setter def rWidget(self, value): if not isinstance(value, QWidget) and value is not None: raise TypeError( "Supplied return Widget is not of type QWidget: %s" % type(value).__name__) else: self._rWidget = value self.currentText.setText(value.text())
def get_button(label, callback): button = QPushButton(label, self) button.setFlat(True) button.setFixedWidth(12) button.clicked.connect(callback) return button
class MainUI(QWidget): def __init__(self): super().__init__() self.left = Config.geometry[0] self.top = Config.geometry[1] self.width = Config.geometry[2] self.height = Config.geometry[3] self.setLayout(QHBoxLayout(self)) # Init logger self.logger = Logger('mainUI', 'UI : Main') # Read in user prefs self.prefs = {} self.loadPrefs() # Load configured objects self.lights = Lights() self.lights.load() self.obas = OBAs() self.obas.load() self.tracs = Tracs() self.tracs.load() # Init I2C control if 'i2cAddress' in self.prefs.keys(): _address = self.prefs['i2cAddress'] else: _address = Config.defaultI2CAddress if 'i2cBus' in self.prefs.keys(): _bus = self.prefs['i2cBus'] else: _bus = Config.defaultI2CBus if 'i2cDebug' in self.prefs.keys(): _debug = self.prefs['i2cDebug'] else: _debug = False self._i2cBus = I2CBus(int(_bus), str(_address), bool(_debug)) del _bus, _address, _debug # Create menu frame self._sidebarMenu = QFrame(self) self._sidebarMenu.layout = QVBoxLayout(self._sidebarMenu) self._sidebarMenu.setMaximumWidth(Config.menuWidth + 50) self._sidebarMenu.setMaximumHeight(Config.geometry[3]) self._sidebarMenu.setStyleSheet( "QFrame{border-right: 1px solid black}") # Create menu _container = QWidget() _container.layout = QVBoxLayout() _container.setLayout(_container.layout) _scroll = QScrollArea() _scroll.setWidget(_container) _scroll.setWidgetResizable(True) self._sidebarMenu.layout.addWidget(_scroll) for _key in [ 'enableOBA', 'enableLighting', 'enableTracControl', 'enableCamViewer', 'enableGyro' ]: if _key in self.prefs.keys(): if self.prefs[_key]: _title = { 'enableOBA': 'control_oba', 'enableLighting': 'control_light', 'enableTracControl': 'control_trac', 'enableCamViewer': 'control_cam', 'enableGyro': 'control_gyro' }[_key] _icon = { 'enableOBA': Config.faIcon("wind"), 'enableLighting': Config.faIcon("lightbulb"), 'enableTracControl': Config.icon("tracControl", "rearDiff")['path'], 'enableCamViewer': Config.faIcon("camera"), 'enableGyro': Config.faIcon("truck-pickup") }[_key] _button = MenuButton(panel=_title, parent=self) _button.setIcon(QIcon(_icon)) _container.layout.addWidget(_button) _settingsButton = MenuButton(panel="config_prefs", parent=self) _settingsButton.setIcon(QIcon(Config.faIcon("user-cog"))) _container.layout.addWidget(_settingsButton) del _container, _scroll, _key, _settingsButton, _title, _icon, _button # Create version info label self._version = QLabel('v%s' % Config.version, self) self._version.setAlignment(Qt.AlignCenter) self._version.setFixedWidth(Config.menuWidth) self._version.setStyleSheet("QLabel{border: none}") self._sidebarMenu.layout.addWidget(self._version) # Create OSK button self._oskButton = QPushButton('', self) self._oskButton.setIcon(QIcon(Config.faIcon('keyboard'))) self._oskButton.setFixedWidth(Config.menuWidth) self._oskButton.clicked.connect(self.showOSK) self._sidebarMenu.layout.addWidget(self._oskButton) # Add menu frame to main UI self.layout().addWidget(self._sidebarMenu) # Create main UI panel self._mainPanel = QWidget(self) self._mainPanel.setLayout(QVBoxLayout(self._mainPanel)) self.layout().addWidget(self._mainPanel) # Init default UI for _key in [ 'enableOBA', 'enableLighting', 'enableTracControl', 'enableCamViewer', 'enableGyro' ]: _cUI = None _uiName = None if _key in self.prefs.keys(): if self.prefs[_key]: if _key == 'enableOBA': _cUI = OBAControlUI(self.obas.obas, self) _uiName = 'control_oba' elif _key == 'enableLighting': _cUI = LightControlUI(self.lights.lights, self) _uiName = 'control_light' elif _key == 'enableTracControl': _cUI = TracControlUI(self.tracs.tracs, self) _uiName = 'control_trac' elif _key == 'enableCamViewer': _cUI = CamViewer(0) _uiName = 'control_cam' elif _key == 'enableGryo': _cUI = Gyrometer() _uiName = 'control_gyro' if _cUI is not None: break if _cUI is None: _cUI = UserPrefUI(self.prefs, parent=self) _uiName = 'config_prefs' self._currentUI = {'name': _uiName, 'obj': _cUI} _cUI.setParent(self) self._mainPanel.layout().addWidget(_cUI) _cUI.show() # Create button panel self._btnPanel = QWidget(self) self._btnPanel.setLayout(QHBoxLayout(self._btnPanel)) self._mainPanel.layout().addWidget(self._btnPanel) # Create Config button self._configButton = QPushButton('Configure', self) self._configButton.setFixedHeight(50) self._configButton.setIcon(QIcon(Config.faIcon('cog'))) self._configButton.clicked.connect(self.__configButtonAction) self._btnPanel.layout().addWidget(self._configButton) # Create Night Mode button self._nightModeButton = QPushButton('', self) self._nightModeButton.setFixedHeight(50) self._nightModeButton.setIcon( QIcon({ True: Config.faIcon('sun'), False: Config.faIcon('moon') }[self.prefs['nightMode']])) self._nightModeButton.setText({ True: 'Day Mode', False: 'Night Mode' }[self.prefs['nightMode']]) self._nightModeButton.clicked.connect(self.toggleNightMode) self._btnPanel.layout().addWidget(self._nightModeButton) self.setNightMode(self.prefs['nightMode']) def closeEvent(self, event): self.savePrefs() self._i2cBus.deEnergizeAll() super(MainUI, self).closeEvent(event) def availablePins(self, value=None): if not self.prefs['allowDuplicatePins']: _pins = Config.outputPinList for _light in self.lights.lights: if _light.outputPin in _pins: _pins.remove(_light.outputPin) for _oba in self.obas.obas: if _oba.outputPin in _pins: _pins.remove(_oba.outputPin) for _trac in self.tracs.tracs: if _trac.outputPin in _pins: _pins.remove(_trac.outputPin) else: _pins = Config.outputPinList _pins.sort() return _pins def setOutputPin(self, pin, state): fx = { True: self.i2cBus.energizeRelay, False: self.i2cBus.deEnergizeRelay }[state] fx(pin) def disableConfigButtons(self): for _ctrl in [self.configButton]: _ctrl.setEnabled(False) del _ctrl def enableConfigButtons(self): for _ctrl in [self.configButton]: _ctrl.setEnabled(True) del _ctrl def loadUI(self, ui, idx=None): if 'cam' in self.currentUI['name']: self.currentUI['obj'].stop() if 'gyro' in self.currentUI['name']: self.currentUI['obj'].stopSerial() self.currentUI['obj'].stopRotation() self.currentUI['obj'].hide() self.mainPanel.layout().removeWidget(self.currentUI['obj']) self.mainPanel.layout().removeWidget(self.btnPanel) _mode = ui.split('_')[0] _type = ui.split('_')[1] _ui = None if _mode == 'control': if _type == 'gyro': self.configButton.setText("Calibrate") else: self.configButton.setText("Configure") if _type == 'light': _ui = LightControlUI(self.lights.lights, self) elif _type == 'oba': _ui = OBAControlUI(self.obas.obas, self) elif _type == 'trac': _ui = TracControlUI(self.tracs.tracs, self) elif _type == 'cam': _ui = CamViewer(0) _ui.start() elif _type == 'gyro': _ui = Gyrometer(parent=self) _ui.startSerial() _ui.startRotation() elif _mode == 'config': if _type == 'light': _ui = LightConfigUI(self.lights.lights, self) elif _type == 'oba': _ui = OBAConfigUI(self.obas.obas, self) elif _type == 'trac': _ui = TracConfigUI(self.tracs.tracs, self) elif _type == 'prefs': _ui = UserPrefUI(self.prefs, self) elif _mode == 'edit': if _type == 'light': _ui = EditLightUI(self.lights.lights[idx], self) elif _type == 'oba': _ui = EditOBAUI(self.obas.obas[idx], self) elif _type == 'trac': _ui = EditTracUI(self.tracs.tracs[idx], self) elif _mode == 'create': if _type == 'light': _ui = AddLightUI(self) elif _type == 'oba': _ui = AddOBAUI(self) elif _type == 'trac': _ui = AddTracUI(self) if _ui is not None: _ui.setParent(self) self.mainPanel.layout().addWidget(_ui) _ui.show() self.currentUI = {'name': ui, 'obj': _ui} self.mainPanel.layout().addWidget(self.btnPanel) def toggleNightMode(self): _mode = self.prefs['nightMode'] _value = {False: Config.dayBright, True: Config.nightBright}[not _mode] self.nightModeButton.setIcon({ False: QIcon(Config.faIcon('sun')), True: QIcon(Config.faIcon('moon')) }[not _mode]) self.nightModeButton.setText({ False: 'Day Mode', True: 'Night Mode' }[not _mode]) os.system("echo %s > /sys/class/backlight/rpi_backlight/brightness" % _value) self.prefs['nightMode'] = not _mode self.savePrefs() self.logger.log('Night mode %s: backlight set to %s' % (not _mode, _value)) del _mode, _value def setNightMode(self, mode): _value = {False: Config.dayBright, True: Config.nightBright}[mode] self.nightModeButton.setIcon({ False: QIcon(Config.faIcon('sun')), True: QIcon(Config.faIcon('moon')) }[mode]) self.nightModeButton.setText({ False: 'Day Mode', True: 'Night Mode' }[mode]) os.system("echo %s > /sys/class/backlight/rpi_backlight/brightness" % _value) del _value def loadPrefs(self): _pPrefs = open(Config.prefs, 'rb') _prefs = pickle.load(_pPrefs) for key in _prefs: self.prefs[key] = _prefs[key] _pPrefs.close() del _pPrefs, _prefs def savePrefs(self): _pPrefs = open(Config.prefs, 'wb') pickle.dump(self.prefs, _pPrefs) _pPrefs.close() def showOSK(self): if self.window().dock.isHidden(): self.window().dock.show() else: self.window().dock.hide() def __configButtonAction(self): if self.currentUI['name'] not in ['control_camera', 'control_gyro']: self.disableConfigButtons() self.mainPanel.layout().removeWidget(self.currentUI['obj']) self.loadUI(self.currentUI['name'].replace('control', 'config')) elif self.currentUI['name'] == 'control_gyro': self.currentUI['obj'].calibrate() @property def mainPanel(self): return self._mainPanel @property def btnPanel(self): return self._btnPanel @property def nightModeButton(self): return self._nightModeButton @property def configButton(self): return self._configButton @property def currentUI(self): return self._currentUI @currentUI.setter def currentUI(self, value): self._currentUI = value @property def i2cBus(self): return self._i2cBus