Fixed some small stuff

This commit is contained in:
2026-07-20 11:52:34 +02:00
parent 8df5c2a8f9
commit 1a47952358
8 changed files with 66 additions and 24 deletions

1
BEdit/.gitignore vendored
View File

@@ -8,3 +8,4 @@ dist/
.idea/
.vscode/*
!.vscode/tasks.json
.ruff_cache

View File

@@ -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/`.

View File

@@ -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()

View File

@@ -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:

View File

@@ -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)

View File

@@ -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")

View File

@@ -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()

View File

@@ -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)