mirror of
https://github.com/gnuradio/gnuradio-companion.git
synced 2025-12-10 17:46:12 -06:00
173 lines
6.4 KiB
Python
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()
|