From 1a4795235889412c0b075072850245fb5b493b2a Mon Sep 17 00:00:00 2001 From: Joppe Blondel Date: Mon, 20 Jul 2026 11:52:34 +0200 Subject: [PATCH] Fixed some small stuff --- BEdit/.gitignore | 1 + BEdit/README.md | 3 +- BEdit/src/bedit/app.py | 8 ++--- BEdit/src/bedit/icon_editor.py | 5 +-- BEdit/src/bedit/main_window.py | 5 +-- BEdit/src/bedit/preferences.py | 6 ++++ BEdit/src/bedit/settings_dialog.py | 51 +++++++++++++++++++++++------- BEdit/src/bedit/workspace/view.py | 11 +++++-- 8 files changed, 66 insertions(+), 24 deletions(-) create mode 100644 BEdit/src/bedit/preferences.py diff --git a/BEdit/.gitignore b/BEdit/.gitignore index 4dde1fc..36c0f0f 100644 --- a/BEdit/.gitignore +++ b/BEdit/.gitignore @@ -8,3 +8,4 @@ dist/ .idea/ .vscode/* !.vscode/tasks.json +.ruff_cache \ No newline at end of file diff --git a/BEdit/README.md b/BEdit/README.md index 38af704..7c09107 100644 --- a/BEdit/README.md +++ b/BEdit/README.md @@ -169,7 +169,8 @@ never own a graph. Vector icons can contain rectangles, circles, ellipses, lines, triangles, and text. Each element owns its geometry, fill, stroke, and line style; ports keep their icon anchor in `properties.iconPosition`. The port type registry controls which types may connect (currently `signal` only). -Graph and icon grid sizes are configured independently in Settings. The +The workspace grid size, its finer snapping size, and the icon grid size are +configured independently in Settings. The recursive model is under `src/bedit/document/`, library loading and the live Current Document tree are under `src/bedit/library/`, and graphics are isolated under `src/bedit/workspace/`. diff --git a/BEdit/src/bedit/app.py b/BEdit/src/bedit/app.py index 68d7ccb..7d02232 100644 --- a/BEdit/src/bedit/app.py +++ b/BEdit/src/bedit/app.py @@ -39,11 +39,11 @@ def apply_light_theme(app: QApplication) -> None: def main() -> int: - app = QApplication(sys.argv) - app.setApplicationName("BEdit") - app.setApplicationDisplayName("BEdit") - app.setOrganizationName("BEdit") + QCoreApplication.setApplicationName("BEdit") + QCoreApplication.setOrganizationName("BEdit") QCoreApplication.setApplicationVersion("0.1.0") + app = QApplication(sys.argv) + app.setApplicationDisplayName("BEdit") apply_light_theme(app) window = MainWindow() diff --git a/BEdit/src/bedit/icon_editor.py b/BEdit/src/bedit/icon_editor.py index 6dbf2df..503317e 100644 --- a/BEdit/src/bedit/icon_editor.py +++ b/BEdit/src/bedit/icon_editor.py @@ -1,6 +1,6 @@ from copy import deepcopy -from PySide6.QtCore import QPointF, QRectF, QSettings, Qt +from PySide6.QtCore import QPointF, QRectF, Qt from PySide6.QtGui import QColor, QPainter, QPen, QPolygonF from PySide6.QtWidgets import ( QColorDialog, @@ -29,10 +29,11 @@ from PySide6.QtWidgets import ( from bedit.document.model import Component, Icon, Port from bedit.icon_renderer import _pen +from bedit.preferences import application_settings def _icon_grid_size() -> int: - return QSettings().value("grid/iconSize", 8, type=int) + return application_settings().value("grid/iconSize", 8, type=int) def _snap(value: float) -> float: diff --git a/BEdit/src/bedit/main_window.py b/BEdit/src/bedit/main_window.py index 4bb388a..bc384ca 100644 --- a/BEdit/src/bedit/main_window.py +++ b/BEdit/src/bedit/main_window.py @@ -2,7 +2,7 @@ import json from copy import deepcopy from pathlib import Path -from PySide6.QtCore import QSettings, QSize, Qt, Slot +from PySide6.QtCore import QSize, Qt, Slot from PySide6.QtGui import QAction, QCloseEvent from PySide6.QtWidgets import QFileDialog, QMainWindow, QMenu, QMessageBox, QToolBar @@ -21,6 +21,7 @@ from bedit.library.tree_model import ( ) from bedit.settings_dialog import SettingsDialog from bedit.port_options_dialog import PortOptionsDialog +from bedit.preferences import application_settings from bedit.ui_main_window import Ui_MainWindow @@ -36,7 +37,7 @@ class MainWindow(QMainWindow): "background: transparent; color: #202020;" ) self._create_camera_toolbar() - self.settings = QSettings() + self.settings = application_settings() self.libraries = LibraryRepository(self) self.document_controller = DocumentController(self) diff --git a/BEdit/src/bedit/preferences.py b/BEdit/src/bedit/preferences.py new file mode 100644 index 0000000..5277286 --- /dev/null +++ b/BEdit/src/bedit/preferences.py @@ -0,0 +1,6 @@ +from PySide6.QtCore import QSettings + + +def application_settings() -> QSettings: + """Return BEdit's explicit, disk-backed settings store.""" + return QSettings("BEdit", "BEdit") diff --git a/BEdit/src/bedit/settings_dialog.py b/BEdit/src/bedit/settings_dialog.py index 77c0503..24708b1 100644 --- a/BEdit/src/bedit/settings_dialog.py +++ b/BEdit/src/bedit/settings_dialog.py @@ -4,6 +4,7 @@ from PySide6.QtCore import QSettings, Signal from PySide6.QtWidgets import QDialog, QFileDialog, QFormLayout, QGroupBox, QSpinBox from bedit.library.repository import default_library_paths +from bedit.preferences import application_settings from bedit.ui_settings_dialog import Ui_SettingsDialog @@ -19,15 +20,20 @@ class SettingsDialog(QDialog): self.grid_group = QGroupBox("Editor grids", self.ui.generalTab) grid_form = QFormLayout(self.grid_group) self.graph_grid_spin = QSpinBox() - self.graph_grid_spin.setRange(2, 256) + self.graph_grid_spin.setRange(8, 512) self.graph_grid_spin.setSuffix(" units") + self.graph_snap_spin = QSpinBox() + self.graph_snap_spin.setRange(1, 128) + self.graph_snap_spin.setSuffix(" units") + self.graph_grid_spin.valueChanged.connect(self.graph_snap_spin.setMaximum) self.icon_grid_spin = QSpinBox() self.icon_grid_spin.setRange(1, 64) self.icon_grid_spin.setSuffix(" units") - grid_form.addRow("Graph grid size:", self.graph_grid_spin) + grid_form.addRow("Workspace grid size:", self.graph_grid_spin) + grid_form.addRow("Workspace snapping size:", self.graph_snap_spin) grid_form.addRow("Icon grid size:", self.icon_grid_spin) self.ui.generalLayout.insertWidget(1, self.grid_group) - self.settings = QSettings() + self.settings = application_settings() self.ui.addLibraryFileButton.clicked.connect(self._add_library_file) self.ui.addLibraryFolderButton.clicked.connect(self._add_library_folder) self.ui.removeLibraryPathButton.clicked.connect(self._remove_library_path) @@ -35,21 +41,32 @@ class SettingsDialog(QDialog): self._load_settings() def _load_settings(self) -> None: + enabled = self.settings.value("autosave/enabled", None) + if enabled is None: + enabled = self.settings.value("General/autosaveEnabled", False) + interval = self.settings.value("autosave/intervalMinutes", None) + if interval is None: + interval = self.settings.value("General/autosaveInterval", 5) self.ui.autosaveGroupBox.setChecked( - self.settings.value("general/autosaveEnabled", False, type=bool) - ) - self.ui.autosaveIntervalSpinBox.setValue( - self.settings.value("general/autosaveInterval", 5, type=int) + self._as_bool(enabled) ) + self.ui.autosaveIntervalSpinBox.setValue(int(interval)) self.ui.libraryPathsList.clear() self.ui.libraryPathsList.addItems(self.library_paths(self.settings)) self.graph_grid_spin.setValue(self.graph_grid_size(self.settings)) + self.graph_snap_spin.setValue(self.graph_snap_size(self.settings)) self.icon_grid_spin.setValue(self.icon_grid_size(self.settings)) self._update_remove_button() + @staticmethod + def _as_bool(value) -> bool: + if isinstance(value, str): + return value.strip().lower() in {"1", "true", "yes", "on"} + return bool(value) + @staticmethod def library_paths(settings: QSettings | None = None) -> list[str]: - settings = settings or QSettings() + settings = settings if settings is not None else application_settings() value = settings.value("libraries/paths", default_library_paths()) if isinstance(value, str): return [value] @@ -57,11 +74,18 @@ class SettingsDialog(QDialog): @staticmethod def graph_grid_size(settings: QSettings | None = None) -> int: - return (settings or QSettings()).value("grid/graphSize", 32, type=int) + settings = settings if settings is not None else application_settings() + return settings.value("grid/graphSize", 64, type=int) + + @staticmethod + def graph_snap_size(settings: QSettings | None = None) -> int: + settings = settings if settings is not None else application_settings() + return settings.value("grid/graphSnapSize", 8, type=int) @staticmethod def icon_grid_size(settings: QSettings | None = None) -> int: - return (settings or QSettings()).value("grid/iconSize", 8, type=int) + settings = settings if settings is not None else application_settings() + return settings.value("grid/iconSize", 8, type=int) def _add_library_file(self) -> None: path, _ = QFileDialog.getOpenFileName( @@ -95,16 +119,19 @@ class SettingsDialog(QDialog): self.ui.removeLibraryPathButton.setEnabled(bool(self.ui.libraryPathsList.selectedItems())) def accept(self) -> None: - self.settings.setValue("general/autosaveEnabled", self.ui.autosaveGroupBox.isChecked()) + self.settings.setValue("autosave/enabled", self.ui.autosaveGroupBox.isChecked()) self.settings.setValue( - "general/autosaveInterval", self.ui.autosaveIntervalSpinBox.value() + "autosave/intervalMinutes", self.ui.autosaveIntervalSpinBox.value() ) + self.settings.remove("General/autosaveEnabled") + self.settings.remove("General/autosaveInterval") paths = [ self.ui.libraryPathsList.item(row).text() for row in range(self.ui.libraryPathsList.count()) ] self.settings.setValue("libraries/paths", paths) self.settings.setValue("grid/graphSize", self.graph_grid_spin.value()) + self.settings.setValue("grid/graphSnapSize", self.graph_snap_spin.value()) self.settings.setValue("grid/iconSize", self.icon_grid_spin.value()) self.settings.sync() self.settingsChanged.emit() diff --git a/BEdit/src/bedit/workspace/view.py b/BEdit/src/bedit/workspace/view.py index cbde5ba..eea4f8b 100644 --- a/BEdit/src/bedit/workspace/view.py +++ b/BEdit/src/bedit/workspace/view.py @@ -1,6 +1,6 @@ import json -from PySide6.QtCore import QMimeData, QPointF, QRectF, QSettings, Qt, Signal +from PySide6.QtCore import QMimeData, QPointF, QRectF, Qt, Signal from PySide6.QtGui import ( QColor, QDragEnterEvent, @@ -32,17 +32,22 @@ from bedit.document.controller import DocumentController from bedit.document.model import Component, Connection, Endpoint, Port from bedit.library.tree_model import COMPONENT_MIME_TYPE from bedit.icon_renderer import icon_bounds, paint_icon +from bedit.preferences import application_settings SELECTION_MIME_TYPE = "application/x-bedit-selection" +def _graph_snap_size() -> int: + return application_settings().value("grid/graphSnapSize", 8, type=int) + + def _graph_grid_size() -> int: - return QSettings().value("grid/graphSize", 32, type=int) + return application_settings().value("grid/graphSize", 64, type=int) def _snapped(position: QPointF) -> QPointF: - grid = _graph_grid_size() + grid = _graph_snap_size() return QPointF(round(position.x() / grid) * grid, round(position.y() / grid) * grid)