kopia lustrzana https://github.com/NanoVNA-Saver/nanovna-saver
some gui settings
rodzic
a3a0d9d4b0
commit
a148200c74
|
@ -17,22 +17,26 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import base64
|
||||
import dataclasses as DC
|
||||
import logging
|
||||
import json
|
||||
from ssl import DefaultVerifyPaths
|
||||
from tkinter.messagebox import NO
|
||||
|
||||
from PyQt5.QtCore import QSettings
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# pylint: disable=too-few-public-methods
|
||||
@DC.dataclass
|
||||
class GUI:
|
||||
window_height: int = 950
|
||||
window_width: int = 1433
|
||||
font_size: int = 8
|
||||
dark_mode: bool = False
|
||||
splitter_sizes: list = DC.field(default_factory=lambda: [])
|
||||
splitter_sizes: bytearray = DC.field(default_factory=bytearray)
|
||||
|
||||
@DC.dataclass
|
||||
class ChartMarker:
|
||||
|
@ -55,13 +59,13 @@ def restore(settings: 'AppSettings') -> CFG:
|
|||
value = settings.restore_dataclass(field.name.upper(),
|
||||
getattr(result, field.name))
|
||||
setattr(result, field.name, value)
|
||||
logger.debug(f"restored {result}")
|
||||
logger.debug("restored\n(\n%s\n)", result)
|
||||
return result
|
||||
|
||||
|
||||
def store(settings: 'AppSettings', data: CFG) -> None:
|
||||
assert type(data) is CFG
|
||||
logger.debug(f"storing {data}")
|
||||
assert isinstance(data, CFG)
|
||||
logger.debug("storing\n(\n%s\n)", data)
|
||||
for field in DC.fields(data):
|
||||
data_class = getattr(data, field.name)
|
||||
assert DC.is_dataclass(data_class)
|
||||
|
@ -75,10 +79,13 @@ class AppSettings(QSettings):
|
|||
for field in DC.fields(data):
|
||||
value = getattr(data, field.name)
|
||||
if field.type not in (int, float, str):
|
||||
value = json.dumps(value)
|
||||
try:
|
||||
value = json.dumps(value)
|
||||
except TypeError:
|
||||
value = field.type(value).hex()
|
||||
self.setValue(field.name, value)
|
||||
self.endGroup()
|
||||
|
||||
|
||||
def restore_dataclass(self, name: str, data: object) -> object:
|
||||
assert DC.is_dataclass(data)
|
||||
|
||||
|
@ -87,17 +94,19 @@ class AppSettings(QSettings):
|
|||
for field in DC.fields(data):
|
||||
value = None
|
||||
if field.type in (int, float, str):
|
||||
value = self.value(field.name,
|
||||
value = self.value(field.name,
|
||||
type=field.type,
|
||||
defaultValue=field.default)
|
||||
else:
|
||||
value = field.type(json.loads(
|
||||
self.value(field.name,
|
||||
type=str,
|
||||
defaultValue=json.dumps(
|
||||
getattr(data, field.name)
|
||||
))))
|
||||
setattr(result, field.name, value)
|
||||
default = getattr(data, field.name)
|
||||
try:
|
||||
value = json.loads(
|
||||
self.value(field.name, type=str,
|
||||
defaultValue=json.dumps(default)))
|
||||
except TypeError:
|
||||
value = self.value(field.name)
|
||||
value = bytes.fromhex(value) if value is str else default
|
||||
setattr(result, field.name, field.type(value))
|
||||
self.endGroup()
|
||||
|
||||
|
||||
return result
|
||||
|
|
|
@ -123,9 +123,8 @@ class NanoVNASaver(QtWidgets.QWidget):
|
|||
outer.addWidget(scrollarea)
|
||||
self.setLayout(outer)
|
||||
scrollarea.setWidgetResizable(True)
|
||||
window_width = self.settings.value("WindowWidth", 1350, type=int)
|
||||
window_height = self.settings.value("WindowHeight", 950, type=int)
|
||||
self.resize(window_width, window_height)
|
||||
self.resize(Defaults.cfg.gui.window_width,
|
||||
Defaults.cfg.gui.window_height)
|
||||
scrollarea.setSizePolicy(
|
||||
QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
|
||||
self.setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding,
|
||||
|
@ -213,10 +212,7 @@ class NanoVNASaver(QtWidgets.QWidget):
|
|||
self.splitter.addWidget(self.marker_frame)
|
||||
self.splitter.addWidget(chart_widget)
|
||||
|
||||
try:
|
||||
self.splitter.restoreState(self.settings.value("SplitterSizes"))
|
||||
except TypeError:
|
||||
pass
|
||||
self.splitter.restoreState(Defaults.cfg.gui.splitter_sizes)
|
||||
|
||||
layout.addLayout(left_column)
|
||||
layout.addWidget(self.splitter, 2)
|
||||
|
@ -643,14 +639,15 @@ class NanoVNASaver(QtWidgets.QWidget):
|
|||
self.settings.setValue("MarkerCount", Marker.count())
|
||||
for marker in self.markers:
|
||||
marker.update_settings()
|
||||
|
||||
self.settings.setValue("WindowHeight", self.height())
|
||||
self.settings.setValue("WindowWidth", self.width())
|
||||
self.settings.setValue("SplitterSizes", self.splitter.saveState())
|
||||
|
||||
self.settings.sync()
|
||||
self.bands.saveSettings()
|
||||
self.threadpool.waitForDone(2500)
|
||||
|
||||
Defaults.cfg.gui.window_width = self.width()
|
||||
Defaults.cfg.gui.window_height = self.height()
|
||||
Defaults.cfg.gui.splitter_sizes = self.splitter.saveState()
|
||||
Defaults.store(self.settings, Defaults.cfg)
|
||||
|
||||
a0.accept()
|
||||
sys.exit()
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ class TConfig:
|
|||
my_str: str = "Hello World"
|
||||
my_bool: bool = True
|
||||
my_list: list = field(default_factory=lambda: [1, 2, 3])
|
||||
my_bytearray: bytearray = field(default_factory=lambda: bytearray((1,2,3)))
|
||||
|
||||
|
||||
class TestCases(unittest.TestCase):
|
||||
|
@ -77,5 +78,6 @@ class TestCases(unittest.TestCase):
|
|||
tc_1.gui.dark_mode = not tc_1.gui.dark_mode
|
||||
CFG.store(self.settings_2, tc_1)
|
||||
tc_2 = CFG.restore(self.settings_2)
|
||||
print(f"\n{tc_1}\n{tc_2}\n")
|
||||
self.assertEqual(tc_1, tc_2)
|
||||
self.assertNotEqual(tc_2.gui, CFG.GUI())
|
Ładowanie…
Reference in New Issue