Håkon Vågsether ee6fc4a419 grc: Add GRC Qt
Signed-off-by: Håkon Vågsether <hakon.vagsether@gmail.com>
2024-03-15 15:11:27 -04:00

173 lines
6.4 KiB
Python

from __future__ import absolute_import, print_function
# Standard modules
import logging
import yaml
from qtpy.QtCore import Qt, QSettings
from qtpy.QtWidgets import (QLineEdit, QTabWidget, QDialog,
QScrollArea, QVBoxLayout, QCheckBox,
QComboBox, QHBoxLayout, QDialogButtonBox,
QLabel, QWidget, QFormLayout)
from ..properties import Paths
from gnuradio import gr
# Logging
log = logging.getLogger(f"grc.application.{__name__}")
class PreferencesDialog(QDialog):
pref_dict = {}
def __init__(self, qsettings):
super(QDialog, self).__init__()
self.qsettings = qsettings
self.setMinimumSize(600, 400)
self.setModal(True)
self.setWindowTitle("GRC Preferences")
self.tab_widget = QTabWidget()
self.rt_prefs = QSettings(gr.userconf_path() + "/config.conf", QSettings.IniFormat)
with open(Paths.AVAILABLE_PREFS_YML) as available_prefs_yml:
self.pref_dict = yaml.safe_load(available_prefs_yml)
self.populate_tabs()
buttons = QDialogButtonBox.Save | QDialogButtonBox.Cancel
self.buttonBox = QDialogButtonBox(buttons)
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
self.layout = QVBoxLayout()
self.layout.addWidget(self.tab_widget)
self.layout.addWidget(self.buttonBox)
self.setLayout(self.layout)
def new_tab_widget(self) -> QWidget:
widget = QWidget()
vbox = QVBoxLayout()
scroll = QScrollArea()
scroll.setWidgetResizable(True)
content = QWidget()
widget.form = QFormLayout(content)
widget.setLayout(vbox)
vbox.addWidget(scroll)
scroll.setWidget(content)
return widget
def populate_tabs(self) -> None:
for cat in self.pref_dict['categories']:
tab = cat['tab'] = self.new_tab_widget()
self.tab_widget.addTab(tab, cat['name'])
for item in cat['items']:
full_key = cat['key'] + '/' + item['key']
item['_label'] = QLabel(item['name'])
if item['dtype'] == 'bool':
item['_edit'] = QCheckBox()
if self.qsettings.contains(full_key):
value = self.qsettings.value(full_key, False, type=bool)
item['_edit'].setChecked(value)
else:
item['_edit'].setChecked(item['default'])
self.qsettings.setValue(full_key, item['default'])
elif item['dtype'] == 'enum':
item['_edit'] = QComboBox()
for opt in item['option_labels']:
item['_edit'].addItem(opt)
index = item['options'].index(self.qsettings.value(full_key, item['default'], type=str))
item['_edit'].setCurrentIndex(index)
else:
if self.qsettings.contains(full_key):
item['_edit'] = QLineEdit(self.qsettings.value(full_key))
else:
item['_edit'] = QLineEdit(str(item['default']))
self.qsettings.setValue(full_key, item['default'])
item['_line'] = QHBoxLayout()
if 'tooltip' in item.keys():
item['_label'].setToolTip(item['tooltip'])
item['_edit'].setToolTip(item['tooltip'])
tab.form.addRow(item['_label'], item['_edit'])
rt_tab = self.new_tab_widget()
for rt_cat in self.pref_dict['runtime']:
for item in rt_cat['items']:
full_key = rt_cat['key'] + '/' + item['key']
item['_label'] = QLabel(item['name'])
if item['dtype'] == 'bool':
item['_edit'] = QCheckBox()
if self.rt_prefs.contains(full_key):
value = self.rt_prefs.value(full_key, False, type=bool)
item['_edit'].setChecked(value)
else:
item['_edit'].setChecked(item['default'])
self.rt_prefs.setValue(full_key, item['default'])
elif item['dtype'] == 'enum':
item['_edit'] = QComboBox()
for opt in item['option_labels']:
item['_edit'].addItem(opt)
index = item['options'].index(self.rt_prefs.value(full_key, item['default'], type=str))
item['_edit'].setCurrentIndex(index)
else:
if self.rt_prefs.contains(full_key):
item['_edit'] = QLineEdit(self.rt_prefs.value(full_key))
else:
item['_edit'] = QLineEdit(str(item['default']))
self.rt_prefs.setValue(full_key, item['default'])
item['_line'] = QHBoxLayout()
if 'tooltip' in item.keys():
item['_label'].setToolTip(item['tooltip'])
item['_edit'].setToolTip(item['tooltip'])
rt_tab.form.addRow(item['_label'], item['_edit'])
self.tab_widget.addTab(rt_tab, 'Runtime')
def save_all(self):
log.debug(f'Writing changes to {self.qsettings.fileName()}')
for cat in self.pref_dict['categories']:
for item in cat['items']:
full_key = cat['key'] + '/' + item['key']
if item['dtype'] == 'bool':
self.qsettings.setValue(full_key, item['_edit'].isChecked())
elif item['dtype'] == 'enum':
self.qsettings.setValue(full_key, item['options'][item['_edit'].currentIndex()])
else:
self.qsettings.setValue(full_key, item['_edit'].text())
self.qsettings.sync()
for rt_cat in self.pref_dict['runtime']:
for item in rt_cat['items']:
full_key = rt_cat['key'] + '/' + item['key']
if item['dtype'] == 'bool':
self.rt_prefs.setValue(full_key, item['_edit'].isChecked())
elif item['dtype'] == 'enum':
self.rt_prefs.setValue(full_key, item['options'][item['_edit'].currentIndex()])
else:
self.rt_prefs.setValue(full_key, item['_edit'].text())
self.rt_prefs.sync()