kopia lustrzana https://github.com/NanoVNA-Saver/nanovna-saver
				
				
				
			
							rodzic
							
								
									e0da70f7e5
								
							
						
					
					
						commit
						e9a85b665f
					
				|  | @ -24,7 +24,7 @@ from PySide6 import QtCore, QtGui, QtWidgets | |||
| from PySide6.QtCore import Qt, Signal | ||||
| from PySide6.QtGui import QAction, QColor, QColorConstants | ||||
| 
 | ||||
| from ..Defaults import app_config | ||||
| from ..Defaults import get_app_config | ||||
| from ..Marker.Widget import Marker | ||||
| from ..RFTools import Datapoint | ||||
| 
 | ||||
|  | @ -92,6 +92,7 @@ class ChartMarker(QtWidgets.QWidget): | |||
|         self.qp = qp | ||||
| 
 | ||||
|     def draw(self, x: int, y: int, color: QtGui.QColor, text: str = ""): | ||||
|         app_config = get_app_config() | ||||
|         offset = int(app_config.chart.marker_size // 2) | ||||
|         if app_config.chart.marker_at_tip: | ||||
|             y -= offset | ||||
|  | @ -179,7 +180,7 @@ class Chart(QtWidgets.QWidget): | |||
|         self.update() | ||||
| 
 | ||||
|     def setMarkerSize(self, size) -> None: | ||||
|         app_config.chart.marker_size = size | ||||
|         get_app_config().chart.marker_size = size | ||||
|         self.update() | ||||
| 
 | ||||
|     def setSweepTitle(self, title) -> None: | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ from PySide6.QtWidgets import QCheckBox, QSizePolicy | |||
| 
 | ||||
| from NanoVNASaver import NanoVNASaver | ||||
| 
 | ||||
| from ..Defaults import app_config | ||||
| from ..Defaults import get_app_config | ||||
| from ..Marker.Widget import Marker | ||||
| from .Control import Control | ||||
| 
 | ||||
|  | @ -32,6 +32,7 @@ logger = logging.getLogger(__name__) | |||
| 
 | ||||
| class ShowButton(QtWidgets.QPushButton): | ||||
|     def setText(self, text: str = ""): | ||||
|         app_config = get_app_config() | ||||
|         if not text: | ||||
|             text = ( | ||||
|                 "Show data" if app_config.gui.markers_hidden else "Hide data" | ||||
|  | @ -44,6 +45,7 @@ class MarkerControl(Control): | |||
|     def __init__(self, app: NanoVNASaver): | ||||
|         super().__init__(app, "Markers") | ||||
| 
 | ||||
|         app_config = get_app_config() | ||||
|         for i in range(app_config.chart.marker_count): | ||||
|             marker = Marker("", self.app.settings) | ||||
|             # marker.setFixedHeight(20) | ||||
|  | @ -86,6 +88,7 @@ class MarkerControl(Control): | |||
| 
 | ||||
|     def toggle_frame(self): | ||||
|         def settings(hidden: bool): | ||||
|             app_config = get_app_config() | ||||
|             app_config.gui.markers_hidden = not hidden | ||||
|             self.app.marker_frame.setHidden(app_config.gui.markers_hidden) | ||||
|             self.showMarkerButton.setText() | ||||
|  |  | |||
|  | @ -22,6 +22,7 @@ from PySide6 import QtCore, QtWidgets | |||
| 
 | ||||
| from NanoVNASaver import NanoVNASaver | ||||
| 
 | ||||
| from ..Defaults import SweepConfig, get_app_config | ||||
| from ..Formatting import ( | ||||
|     format_frequency_short, | ||||
|     format_frequency_sweep, | ||||
|  | @ -37,6 +38,7 @@ class SweepControl(Control): | |||
|     def __init__(self, app: NanoVNASaver): | ||||
|         super().__init__(app, "Sweep control") | ||||
| 
 | ||||
|         sweep_settings = self.get_settings() | ||||
|         line = QtWidgets.QFrame() | ||||
|         line.setFrameShape(QtWidgets.QFrame.Shape.VLine) | ||||
| 
 | ||||
|  | @ -48,7 +50,7 @@ class SweepControl(Control): | |||
|         input_layout.addLayout(input_right_layout) | ||||
|         self.layout.addRow(input_layout) | ||||
| 
 | ||||
|         self.input_start = FrequencyInputWidget() | ||||
|         self.input_start = FrequencyInputWidget(sweep_settings.start) | ||||
|         self.input_start.setFixedHeight(20) | ||||
|         self.input_start.setMinimumWidth(60) | ||||
|         self.input_start.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) | ||||
|  | @ -56,14 +58,14 @@ class SweepControl(Control): | |||
|         self.input_start.textChanged.connect(self.update_step_size) | ||||
|         input_left_layout.addRow(QtWidgets.QLabel("Start"), self.input_start) | ||||
| 
 | ||||
|         self.input_end = FrequencyInputWidget() | ||||
|         self.input_end = FrequencyInputWidget(sweep_settings.end) | ||||
|         self.input_end.setFixedHeight(20) | ||||
|         self.input_end.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) | ||||
|         self.input_end.textEdited.connect(self.update_center_span) | ||||
|         self.input_end.textChanged.connect(self.update_step_size) | ||||
|         input_left_layout.addRow(QtWidgets.QLabel("Stop"), self.input_end) | ||||
| 
 | ||||
|         self.input_center = FrequencyInputWidget() | ||||
|         self.input_center = FrequencyInputWidget(sweep_settings.center) | ||||
|         self.input_center.setFixedHeight(20) | ||||
|         self.input_center.setMinimumWidth(60) | ||||
|         self.input_center.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) | ||||
|  | @ -71,16 +73,14 @@ class SweepControl(Control): | |||
| 
 | ||||
|         input_right_layout.addRow(QtWidgets.QLabel("Center"), self.input_center) | ||||
| 
 | ||||
|         self.input_span = FrequencyInputWidget() | ||||
|         self.input_span = FrequencyInputWidget(sweep_settings.span) | ||||
|         self.input_span.setFixedHeight(20) | ||||
|         self.input_span.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) | ||||
|         self.input_span.textEdited.connect(self.update_start_end) | ||||
| 
 | ||||
|         input_right_layout.addRow(QtWidgets.QLabel("Span"), self.input_span) | ||||
| 
 | ||||
|         self.input_segments = QtWidgets.QLineEdit( | ||||
|             self.app.settings.value("Segments", "1") | ||||
|         ) | ||||
|         self.input_segments = QtWidgets.QLineEdit(sweep_settings.segments) | ||||
|         self.input_segments.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) | ||||
|         self.input_segments.setFixedHeight(20) | ||||
|         self.input_segments.setFixedWidth(60) | ||||
|  | @ -229,3 +229,14 @@ class SweepControl(Control): | |||
| 
 | ||||
|     def update_sweep_btn(self, enabled: bool) -> None: | ||||
|         self.btn_start.setEnabled(enabled) | ||||
| 
 | ||||
|     def get_settings(self) -> SweepConfig: | ||||
|         return get_app_config().sweep_settings | ||||
| 
 | ||||
|     def store_settings(self) -> None: | ||||
|         settings = self.get_settings() | ||||
|         settings.start = self.input_start.text() | ||||
|         settings.end = self.input_end.text() | ||||
|         settings.center = self.input_center.text() | ||||
|         settings.span = self.input_span.text() | ||||
|         settings.segments = self.input_segments.text() | ||||
|  |  | |||
|  | @ -123,6 +123,13 @@ class MarkersConfig: | |||
|         default_factory=lambda: QColor(QColorConstants.LightGray) | ||||
|     ) | ||||
| 
 | ||||
| @dataclass | ||||
| class SweepConfig: | ||||
|     start: str = "" | ||||
|     end: str = "" | ||||
|     center: str = "" | ||||
|     span: str = "" | ||||
|     segments: str = "1" | ||||
| 
 | ||||
| @dataclass | ||||
| class AppConfig: | ||||
|  | @ -131,60 +138,25 @@ class AppConfig: | |||
|     chart: ChartConfig = field(default_factory=ChartConfig) | ||||
|     chart_colors: ChartColorsConfig = field(default_factory=ChartColorsConfig) | ||||
|     markers: MarkersConfig = field(default_factory=MarkersConfig) | ||||
| 
 | ||||
| 
 | ||||
| app_config = AppConfig() | ||||
| 
 | ||||
| 
 | ||||
| def restore_config(settings: "AppSettings") -> AppConfig: | ||||
|     result = AppConfig() | ||||
|     for field_it in fields(result): | ||||
|         value = settings.restore_dataclass( | ||||
|             field_it.name.upper(), getattr(result, field_it.name) | ||||
|         ) | ||||
|         setattr(result, field_it.name, value) | ||||
|     logger.debug("restored\n(\n%s\n)", result) | ||||
|     return result | ||||
| 
 | ||||
| 
 | ||||
| def store_config(settings: "AppSettings", data: AppConfig | None = None) -> None: | ||||
|     data = data or app_config | ||||
|     logger.debug("storing\n(\n%s\n)", data) | ||||
|     assert isinstance(data, AppConfig) | ||||
|     for field_it in fields(data): | ||||
|         data_class = getattr(data, field_it.name) | ||||
|         assert is_dataclass(data_class) | ||||
|         settings.store_dataclass(field_it.name.upper(), data_class) | ||||
| 
 | ||||
| 
 | ||||
| def _from_type(data) -> str: | ||||
|     type_map = { | ||||
|         bytearray: bytearray.hex, | ||||
|         QColor: QColor.getRgb, | ||||
|         QByteArray: QByteArray.toHex, | ||||
|     } | ||||
|     return ( | ||||
|         f"{type_map[type(data)](data)}" if type(data) in type_map else f"{data}" | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| def _to_type(data: object, data_type: type) -> object: | ||||
|     type_map = { | ||||
|         bool: lambda x: x.lower() == "true", | ||||
|         bytearray: bytearray.fromhex, | ||||
|         list: literal_eval, | ||||
|         tuple: literal_eval, | ||||
|         QColor: lambda x: QColor.fromRgb(*literal_eval(x)), | ||||
|         QByteArray: lambda x: QByteArray.fromHex(literal_eval(x)), | ||||
|     } | ||||
|     return ( | ||||
|         type_map[data_type](data) if data_type in type_map else data_type(data) | ||||
|     ) | ||||
|     sweep_settings: SweepConfig = field(default_factory=SweepConfig) | ||||
| 
 | ||||
| 
 | ||||
| # noinspection PyDataclass | ||||
| class AppSettings(QSettings): | ||||
|     def store_dataclass(self, name: str, data: object) -> None: | ||||
| 
 | ||||
|     def __init__(self, organization: str = "NanoVNASaver", application: str = "NanoVNASaver") -> None: | ||||
|         super().__init__( | ||||
|             QSettings.Format.IniFormat, | ||||
|             QSettings.Scope.UserScope, | ||||
|             organization, | ||||
|             application) | ||||
| 
 | ||||
|         self._app_config = AppConfig() | ||||
| 
 | ||||
|     def get_app_config(self) -> AppConfig: | ||||
|         return _app_config | ||||
| 
 | ||||
|     def _store_dataclass(self, name: str, data: object) -> None: | ||||
|         assert is_dataclass(data) | ||||
|         self.beginGroup(name) | ||||
|         for field_it in fields(data): | ||||
|  | @ -200,10 +172,10 @@ class AppSettings(QSettings): | |||
|                     field_it.type, | ||||
|                 ) | ||||
|                 raise TypeError from exc | ||||
|             self.setValue(field_it.name, _from_type(value)) | ||||
|             self.setValue(field_it.name, AppSettings._from_type(value)) | ||||
|         self.endGroup() | ||||
| 
 | ||||
|     def restore_dataclass(self, name: str, data: object) -> object: | ||||
|     def _restore_dataclass(self, name: str, data: object) -> object: | ||||
|         assert is_dataclass(data) | ||||
| 
 | ||||
|         result = replace(data) | ||||
|  | @ -215,8 +187,64 @@ class AppSettings(QSettings): | |||
|                 setattr(result, field_it.name, default) | ||||
|                 continue | ||||
|             try: | ||||
|                 setattr(result, field_it.name, _to_type(value, field_it.type)) | ||||
|                 setattr(result, field_it.name, AppSettings._to_type(value, field_it.type)) | ||||
|             except TypeError: | ||||
|                 setattr(result, field_it.name, default) | ||||
|         self.endGroup() | ||||
|         return result | ||||
| 
 | ||||
|     def restore_config(self) -> AppConfig: | ||||
|         logger.info("Loading settings from: %s", self.fileName()) | ||||
| 
 | ||||
|         result = AppConfig() | ||||
|         for field_it in fields(result): | ||||
|             value = self._restore_dataclass( | ||||
|                 field_it.name.upper(), getattr(result, field_it.name) | ||||
|             ) | ||||
|             setattr(result, field_it.name, value) | ||||
|         logger.debug("restored\n(\n%s\n)", result) | ||||
|         self._app_config = result | ||||
|         return get_app_config() | ||||
| 
 | ||||
| 
 | ||||
|     def store_config(self) -> None: | ||||
|         logger.info("Saving settings to: %s", self.fileName()) | ||||
| 
 | ||||
|         logger.debug("storing\n(\n%s\n)", _app_config) | ||||
|         for field_it in fields(_app_config): | ||||
|             data_class = getattr(_app_config, field_it.name) | ||||
|             assert is_dataclass(data_class) | ||||
|             self._store_dataclass(field_it.name.upper(), data_class) | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def _from_type(data) -> str: | ||||
|         type_map = { | ||||
|             bytearray: bytearray.hex, | ||||
|             QColor: QColor.getRgb, | ||||
|             QByteArray: QByteArray.toHex, | ||||
|         } | ||||
|         return ( | ||||
|             f"{type_map[type(data)](data)}" if type(data) in type_map else f"{data}" | ||||
|         ) | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def _to_type(data: object, data_type: type) -> object: | ||||
|         type_map = { | ||||
|             bool: lambda x: x.lower() == "true", | ||||
|             bytearray: bytearray.fromhex, | ||||
|             list: literal_eval, | ||||
|             tuple: literal_eval, | ||||
|             QColor: lambda x: QColor.fromRgb(*literal_eval(x)), | ||||
|             QByteArray: lambda x: QByteArray.fromHex(literal_eval(x)), | ||||
|         } | ||||
|         return ( | ||||
|             type_map[data_type](data) if data_type in type_map else data_type(data) | ||||
|         ) | ||||
| 
 | ||||
| 
 | ||||
| APP_SETTINGS = AppSettings() | ||||
| 
 | ||||
| _app_config = AppConfig() | ||||
| 
 | ||||
| def get_app_config() -> AppConfig: | ||||
|     return APP_SETTINGS.get_app_config() | ||||
|  |  | |||
|  | @ -18,7 +18,6 @@ | |||
| #  along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| import contextlib | ||||
| import logging | ||||
| import sys | ||||
| import threading | ||||
| from time import localtime, strftime | ||||
| 
 | ||||
|  | @ -55,7 +54,7 @@ from .Charts.Chart import Chart | |||
| from .Controls.MarkerControl import MarkerControl | ||||
| from .Controls.SerialControl import SerialControl | ||||
| from .Controls.SweepControl import SweepControl | ||||
| from .Defaults import AppSettings, app_config, restore_config, store_config | ||||
| from .Defaults import AppSettings, get_app_config | ||||
| from .Formatting import format_frequency, format_gain, format_vswr | ||||
| from .Hardware.Hardware import Interface | ||||
| from .Hardware.VNA import VNA | ||||
|  | @ -94,14 +93,8 @@ class NanoVNASaver(QWidget): | |||
|         self.communicate = Communicate() | ||||
|         self.s21att = 0.0 | ||||
|         self.setWindowIcon(get_window_icon()) | ||||
|         self.settings = AppSettings( | ||||
|             QtCore.QSettings.Format.IniFormat, | ||||
|             QtCore.QSettings.Scope.UserScope, | ||||
|             "NanoVNASaver", | ||||
|             "NanoVNASaver", | ||||
|         ) | ||||
|         logger.info("Settings from: %s", self.settings.fileName()) | ||||
|         app_config = restore_config(self.settings) | ||||
|         self.settings = AppSettings() | ||||
|         app_config = self.settings.restore_config() | ||||
|         self.threadpool = QtCore.QThreadPool() | ||||
|         self.sweep = Sweep() | ||||
|         self.worker = SweepWorker(self) | ||||
|  | @ -492,8 +485,6 @@ class NanoVNASaver(QWidget): | |||
|         self.s21_max_gain_label.setText("") | ||||
|         self.tdr_result_label.setText("") | ||||
| 
 | ||||
|         self.settings.setValue("Segments", self.sweep_control.get_segments()) | ||||
| 
 | ||||
|         logger.debug("Starting worker thread") | ||||
|         self.threadpool.start(self.worker) | ||||
| 
 | ||||
|  | @ -690,17 +681,20 @@ class NanoVNASaver(QWidget): | |||
|         self.bands.saveSettings() | ||||
|         self.threadpool.waitForDone(2500) | ||||
| 
 | ||||
|         app_config = get_app_config() | ||||
|         app_config.chart.marker_count = Marker.count() | ||||
|         app_config.gui.window_width = self.width() | ||||
|         app_config.gui.window_height = self.height() | ||||
|         app_config.gui.splitter_sizes = self.splitter.saveState() | ||||
|         store_config(self.settings, app_config) | ||||
| 
 | ||||
|         self.sweep_control.store_settings() | ||||
| 
 | ||||
|         self.settings.store_config() | ||||
| 
 | ||||
|         # Dosconnect connected devices and release serial port | ||||
|         self.serial_control.disconnect_device() | ||||
| 
 | ||||
|         a0.accept() | ||||
|         sys.exit() | ||||
| 
 | ||||
|     def changeFont(self, font: QtGui.QFont) -> None: | ||||
|         qf_new = QtGui.QFontMetricsF(font) | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ from PySide6.QtGui import QColor, QColorConstants, QPalette, QShortcut | |||
| from NanoVNASaver import NanoVNASaver | ||||
| 
 | ||||
| from ..Charts.Chart import Chart, ChartColors | ||||
| from ..Defaults import app_config, store_config | ||||
| from ..Defaults import get_app_config | ||||
| from ..Marker.Widget import Marker | ||||
| from .Bands import BandsWindow | ||||
| from .Defaults import make_scrollable | ||||
|  | @ -68,6 +68,7 @@ class DisplaySettingsWindow(QtWidgets.QWidget): | |||
|         ) | ||||
|         display_options_layout.addRow("", self.returnloss_is_positive) | ||||
| 
 | ||||
|         app_config = get_app_config() | ||||
|         self.returnloss_is_positive.setChecked( | ||||
|             app_config.chart.returnloss_is_positive | ||||
|         ) | ||||
|  | @ -185,7 +186,7 @@ class DisplaySettingsWindow(QtWidgets.QWidget): | |||
|         self.font_dropdown.setMinimumHeight(20) | ||||
|         self.font_dropdown.addItems(["7", "8", "9", "10", "11", "12"]) | ||||
|         self.font_dropdown.setCurrentText(str(app_config.gui.font_size)) | ||||
|         self.changeFont() | ||||
|         self.changeFont(str(app_config.gui.font_size)) | ||||
| 
 | ||||
|         self.font_dropdown.currentTextChanged.connect(self.changeFont) | ||||
|         font_options_layout.addRow("Font size", self.font_dropdown) | ||||
|  | @ -422,6 +423,7 @@ class DisplaySettingsWindow(QtWidgets.QWidget): | |||
| 
 | ||||
|     def changeReturnLoss(self) -> None: | ||||
|         state = self.returnloss_is_positive.isChecked() | ||||
|         app_config = get_app_config() | ||||
|         app_config.chart.returnloss_is_positive = bool(state) | ||||
|         for m in self.app.markers: | ||||
|             m.returnloss_is_positive = state | ||||
|  | @ -433,43 +435,51 @@ class DisplaySettingsWindow(QtWidgets.QWidget): | |||
| 
 | ||||
|     def changeShowLines(self) -> None: | ||||
|         state = self.show_lines_option.isChecked() | ||||
|         app_config = get_app_config() | ||||
|         app_config.chart.show_lines = bool(state) | ||||
|         for c in self.app.subscribing_charts: | ||||
|             c.setDrawLines(state) | ||||
| 
 | ||||
|     def changeShowMarkerNumber(self) -> None: | ||||
|         app_config = get_app_config() | ||||
|         app_config.chart.marker_label = bool( | ||||
|             self.show_marker_number_option.isChecked() | ||||
|         ) | ||||
|         self.updateCharts() | ||||
| 
 | ||||
|     def changeFilledMarkers(self): | ||||
|         app_config = get_app_config() | ||||
|         app_config.chart.marker_filled = bool( | ||||
|             self.filled_marker_option.isChecked() | ||||
|         ) | ||||
|         self.updateCharts() | ||||
| 
 | ||||
|     def changeMarkerAtTip(self) -> None: | ||||
|         app_config = get_app_config() | ||||
|         app_config.chart.marker_at_tip = bool(self.marker_at_tip.isChecked()) | ||||
|         self.updateCharts() | ||||
| 
 | ||||
|     def changePointSize(self, size: int) -> None: | ||||
|         app_config = get_app_config() | ||||
|         app_config.chart.point_size = size | ||||
|         for c in self.app.subscribing_charts: | ||||
|             c.setPointSize(size) | ||||
| 
 | ||||
|     def changeLineThickness(self, size: int) -> None: | ||||
|         app_config = get_app_config() | ||||
|         app_config.chart.line_thickness = size | ||||
|         for c in self.app.subscribing_charts: | ||||
|             c.setLineThickness(size) | ||||
| 
 | ||||
|     def changeMarkerSize(self, size: int) -> None: | ||||
|         app_config = get_app_config() | ||||
|         app_config.chart.marker_size = size | ||||
|         self.markerSizeInput.setValue(size) | ||||
|         self.updateCharts() | ||||
| 
 | ||||
|     def changeDarkMode(self) -> None: | ||||
|         state = self.dark_mode_option.isChecked() | ||||
|         app_config = get_app_config() | ||||
|         app_config.gui.dark_mode = bool(state) | ||||
|         Chart.color.foreground = QColor(QColorConstants.LightGray) | ||||
|         if state: | ||||
|  | @ -516,8 +526,9 @@ class DisplaySettingsWindow(QtWidgets.QWidget): | |||
|         for c in self.app.subscribing_charts: | ||||
|             c.update() | ||||
| 
 | ||||
|     def changeFont(self) -> None: | ||||
|         font_size = int(self.font_dropdown.currentText()) | ||||
|     def changeFont(self, new_font_size: str) -> None: | ||||
|         font_size = int(new_font_size) | ||||
|         app_config = get_app_config() | ||||
|         app_config.gui.font_size = font_size | ||||
|         app: QtWidgets.QApplication = QtWidgets.QApplication.instance() | ||||
|         font = app.font() | ||||
|  | @ -607,4 +618,4 @@ class DisplaySettingsWindow(QtWidgets.QWidget): | |||
|     def updateCharts(self) -> None: | ||||
|         for c in self.app.subscribing_charts: | ||||
|             c.update() | ||||
|         store_config(self.app.settings, app_config) | ||||
|         self.app.settings.sync() | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ | |||
| import unittest | ||||
| from dataclasses import dataclass, field | ||||
| 
 | ||||
| from NanoVNASaver.Defaults import AppConfig, AppSettings, GuiConfig, QSettings, restore_config, store_config | ||||
| from NanoVNASaver.Defaults import AppSettings, GuiConfig | ||||
| 
 | ||||
| 
 | ||||
| @dataclass | ||||
|  | @ -38,14 +38,10 @@ class TestCases(unittest.TestCase): | |||
| 
 | ||||
|     def setUp(self) -> None: | ||||
|         self.settings_1 = AppSettings( | ||||
|             QSettings.Format.IniFormat, | ||||
|             QSettings.Scope.UserScope, | ||||
|             "NanoVNASaver", | ||||
|             "Test_1", | ||||
|         ) | ||||
|         self.settings_2 = AppSettings( | ||||
|             QSettings.Format.IniFormat, | ||||
|             QSettings.Scope.UserScope, | ||||
|             "NanoVNASaver", | ||||
|             "Test_2", | ||||
|         ) | ||||
|  | @ -59,8 +55,8 @@ class TestCases(unittest.TestCase): | |||
|         ) | ||||
| 
 | ||||
|     def test_store_dataclass(self): | ||||
|         self.settings_1.store_dataclass("Section1", self.config_1) | ||||
|         self.settings_1.store_dataclass("Section2", self.config_2) | ||||
|         self.settings_1._store_dataclass("Section1", self.config_1) | ||||
|         self.settings_1._store_dataclass("Section2", self.config_2) | ||||
|         illegal_config = TConfig( | ||||
|             my_int=4, | ||||
|             my_float=3.0, | ||||
|  | @ -69,11 +65,11 @@ class TestCases(unittest.TestCase): | |||
|             my_list=(4, 5, 6), | ||||
|         ) | ||||
|         with self.assertRaises(TypeError): | ||||
|             self.settings_1.store_dataclass("SectionX", illegal_config) | ||||
|             self.settings_1._store_dataclass("SectionX", illegal_config) | ||||
| 
 | ||||
|     def test_restore_dataclass(self): | ||||
|         tc_1 = self.settings_1.restore_dataclass("Section1", self.config_1) | ||||
|         tc_2 = self.settings_1.restore_dataclass("Section2", self.config_2) | ||||
|         tc_1 = self.settings_1._restore_dataclass("Section1", self.config_1) | ||||
|         tc_2 = self.settings_1._restore_dataclass("Section2", self.config_2) | ||||
|         self.assertNotEqual(tc_1, tc_2) | ||||
|         self.assertEqual(tc_1, self.config_1) | ||||
|         self.assertEqual(tc_2, self.config_2) | ||||
|  | @ -86,14 +82,15 @@ class TestCases(unittest.TestCase): | |||
|         self.assertIsInstance(tc_2.my_float, float) | ||||
| 
 | ||||
|     def test_restore_empty(self): | ||||
|         tc_3 = self.settings_1.restore_dataclass("Section3", TConfig()) | ||||
|         tc_3 = self.settings_1._restore_dataclass("Section3", TConfig()) | ||||
|         self.assertEqual(tc_3, TConfig()) | ||||
| 
 | ||||
|     def test_store(self): | ||||
|         tc_1 = AppConfig() | ||||
|         tc_1 = self.settings_2.get_app_config() | ||||
|         tc_1.gui.dark_mode = not tc_1.gui.dark_mode | ||||
|         store_config(self.settings_2, tc_1) | ||||
|         tc_2 = restore_config(self.settings_2) | ||||
| 
 | ||||
|         self.settings_2.store_config() | ||||
|         tc_2 = self.settings_2.restore_config() | ||||
|         print(f"\n{tc_1}\n{tc_2}\n") | ||||
|         self.assertEqual(tc_1, tc_2) | ||||
|         self.assertNotEqual(tc_2.gui, GuiConfig()) | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Maxim Medvedev
						Maxim Medvedev