Fixed some small stuff
This commit is contained in:
1
BEdit/.gitignore
vendored
1
BEdit/.gitignore
vendored
@@ -8,3 +8,4 @@ dist/
|
|||||||
.idea/
|
.idea/
|
||||||
.vscode/*
|
.vscode/*
|
||||||
!.vscode/tasks.json
|
!.vscode/tasks.json
|
||||||
|
.ruff_cache
|
||||||
@@ -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
|
lines, triangles, and text. Each element owns its geometry, fill, stroke, and
|
||||||
line style; ports keep their icon anchor in `properties.iconPosition`. The
|
line style; ports keep their icon anchor in `properties.iconPosition`. The
|
||||||
port type registry controls which types may connect (currently `signal` only).
|
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
|
recursive model is under `src/bedit/document/`, library loading
|
||||||
and the live Current Document tree are under `src/bedit/library/`, and graphics
|
and the live Current Document tree are under `src/bedit/library/`, and graphics
|
||||||
are isolated under `src/bedit/workspace/`.
|
are isolated under `src/bedit/workspace/`.
|
||||||
|
|||||||
@@ -39,11 +39,11 @@ def apply_light_theme(app: QApplication) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def main() -> int:
|
def main() -> int:
|
||||||
app = QApplication(sys.argv)
|
QCoreApplication.setApplicationName("BEdit")
|
||||||
app.setApplicationName("BEdit")
|
QCoreApplication.setOrganizationName("BEdit")
|
||||||
app.setApplicationDisplayName("BEdit")
|
|
||||||
app.setOrganizationName("BEdit")
|
|
||||||
QCoreApplication.setApplicationVersion("0.1.0")
|
QCoreApplication.setApplicationVersion("0.1.0")
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
app.setApplicationDisplayName("BEdit")
|
||||||
|
|
||||||
apply_light_theme(app)
|
apply_light_theme(app)
|
||||||
window = MainWindow()
|
window = MainWindow()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from copy import deepcopy
|
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.QtGui import QColor, QPainter, QPen, QPolygonF
|
||||||
from PySide6.QtWidgets import (
|
from PySide6.QtWidgets import (
|
||||||
QColorDialog,
|
QColorDialog,
|
||||||
@@ -29,10 +29,11 @@ from PySide6.QtWidgets import (
|
|||||||
|
|
||||||
from bedit.document.model import Component, Icon, Port
|
from bedit.document.model import Component, Icon, Port
|
||||||
from bedit.icon_renderer import _pen
|
from bedit.icon_renderer import _pen
|
||||||
|
from bedit.preferences import application_settings
|
||||||
|
|
||||||
|
|
||||||
def _icon_grid_size() -> int:
|
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:
|
def _snap(value: float) -> float:
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import json
|
|||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from pathlib import Path
|
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.QtGui import QAction, QCloseEvent
|
||||||
from PySide6.QtWidgets import QFileDialog, QMainWindow, QMenu, QMessageBox, QToolBar
|
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.settings_dialog import SettingsDialog
|
||||||
from bedit.port_options_dialog import PortOptionsDialog
|
from bedit.port_options_dialog import PortOptionsDialog
|
||||||
|
from bedit.preferences import application_settings
|
||||||
from bedit.ui_main_window import Ui_MainWindow
|
from bedit.ui_main_window import Ui_MainWindow
|
||||||
|
|
||||||
|
|
||||||
@@ -36,7 +37,7 @@ class MainWindow(QMainWindow):
|
|||||||
"background: transparent; color: #202020;"
|
"background: transparent; color: #202020;"
|
||||||
)
|
)
|
||||||
self._create_camera_toolbar()
|
self._create_camera_toolbar()
|
||||||
self.settings = QSettings()
|
self.settings = application_settings()
|
||||||
|
|
||||||
self.libraries = LibraryRepository(self)
|
self.libraries = LibraryRepository(self)
|
||||||
self.document_controller = DocumentController(self)
|
self.document_controller = DocumentController(self)
|
||||||
|
|||||||
6
BEdit/src/bedit/preferences.py
Normal file
6
BEdit/src/bedit/preferences.py
Normal 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")
|
||||||
@@ -4,6 +4,7 @@ from PySide6.QtCore import QSettings, Signal
|
|||||||
from PySide6.QtWidgets import QDialog, QFileDialog, QFormLayout, QGroupBox, QSpinBox
|
from PySide6.QtWidgets import QDialog, QFileDialog, QFormLayout, QGroupBox, QSpinBox
|
||||||
|
|
||||||
from bedit.library.repository import default_library_paths
|
from bedit.library.repository import default_library_paths
|
||||||
|
from bedit.preferences import application_settings
|
||||||
from bedit.ui_settings_dialog import Ui_SettingsDialog
|
from bedit.ui_settings_dialog import Ui_SettingsDialog
|
||||||
|
|
||||||
|
|
||||||
@@ -19,15 +20,20 @@ class SettingsDialog(QDialog):
|
|||||||
self.grid_group = QGroupBox("Editor grids", self.ui.generalTab)
|
self.grid_group = QGroupBox("Editor grids", self.ui.generalTab)
|
||||||
grid_form = QFormLayout(self.grid_group)
|
grid_form = QFormLayout(self.grid_group)
|
||||||
self.graph_grid_spin = QSpinBox()
|
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_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 = QSpinBox()
|
||||||
self.icon_grid_spin.setRange(1, 64)
|
self.icon_grid_spin.setRange(1, 64)
|
||||||
self.icon_grid_spin.setSuffix(" units")
|
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)
|
grid_form.addRow("Icon grid size:", self.icon_grid_spin)
|
||||||
self.ui.generalLayout.insertWidget(1, self.grid_group)
|
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.addLibraryFileButton.clicked.connect(self._add_library_file)
|
||||||
self.ui.addLibraryFolderButton.clicked.connect(self._add_library_folder)
|
self.ui.addLibraryFolderButton.clicked.connect(self._add_library_folder)
|
||||||
self.ui.removeLibraryPathButton.clicked.connect(self._remove_library_path)
|
self.ui.removeLibraryPathButton.clicked.connect(self._remove_library_path)
|
||||||
@@ -35,21 +41,32 @@ class SettingsDialog(QDialog):
|
|||||||
self._load_settings()
|
self._load_settings()
|
||||||
|
|
||||||
def _load_settings(self) -> None:
|
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.ui.autosaveGroupBox.setChecked(
|
||||||
self.settings.value("general/autosaveEnabled", False, type=bool)
|
self._as_bool(enabled)
|
||||||
)
|
|
||||||
self.ui.autosaveIntervalSpinBox.setValue(
|
|
||||||
self.settings.value("general/autosaveInterval", 5, type=int)
|
|
||||||
)
|
)
|
||||||
|
self.ui.autosaveIntervalSpinBox.setValue(int(interval))
|
||||||
self.ui.libraryPathsList.clear()
|
self.ui.libraryPathsList.clear()
|
||||||
self.ui.libraryPathsList.addItems(self.library_paths(self.settings))
|
self.ui.libraryPathsList.addItems(self.library_paths(self.settings))
|
||||||
self.graph_grid_spin.setValue(self.graph_grid_size(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.icon_grid_spin.setValue(self.icon_grid_size(self.settings))
|
||||||
self._update_remove_button()
|
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
|
@staticmethod
|
||||||
def library_paths(settings: QSettings | None = None) -> list[str]:
|
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())
|
value = settings.value("libraries/paths", default_library_paths())
|
||||||
if isinstance(value, str):
|
if isinstance(value, str):
|
||||||
return [value]
|
return [value]
|
||||||
@@ -57,11 +74,18 @@ class SettingsDialog(QDialog):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def graph_grid_size(settings: QSettings | None = None) -> int:
|
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
|
@staticmethod
|
||||||
def icon_grid_size(settings: QSettings | None = None) -> int:
|
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:
|
def _add_library_file(self) -> None:
|
||||||
path, _ = QFileDialog.getOpenFileName(
|
path, _ = QFileDialog.getOpenFileName(
|
||||||
@@ -95,16 +119,19 @@ class SettingsDialog(QDialog):
|
|||||||
self.ui.removeLibraryPathButton.setEnabled(bool(self.ui.libraryPathsList.selectedItems()))
|
self.ui.removeLibraryPathButton.setEnabled(bool(self.ui.libraryPathsList.selectedItems()))
|
||||||
|
|
||||||
def accept(self) -> None:
|
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(
|
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 = [
|
paths = [
|
||||||
self.ui.libraryPathsList.item(row).text()
|
self.ui.libraryPathsList.item(row).text()
|
||||||
for row in range(self.ui.libraryPathsList.count())
|
for row in range(self.ui.libraryPathsList.count())
|
||||||
]
|
]
|
||||||
self.settings.setValue("libraries/paths", paths)
|
self.settings.setValue("libraries/paths", paths)
|
||||||
self.settings.setValue("grid/graphSize", self.graph_grid_spin.value())
|
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.setValue("grid/iconSize", self.icon_grid_spin.value())
|
||||||
self.settings.sync()
|
self.settings.sync()
|
||||||
self.settingsChanged.emit()
|
self.settingsChanged.emit()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import json
|
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 (
|
from PySide6.QtGui import (
|
||||||
QColor,
|
QColor,
|
||||||
QDragEnterEvent,
|
QDragEnterEvent,
|
||||||
@@ -32,17 +32,22 @@ from bedit.document.controller import DocumentController
|
|||||||
from bedit.document.model import Component, Connection, Endpoint, Port
|
from bedit.document.model import Component, Connection, Endpoint, Port
|
||||||
from bedit.library.tree_model import COMPONENT_MIME_TYPE
|
from bedit.library.tree_model import COMPONENT_MIME_TYPE
|
||||||
from bedit.icon_renderer import icon_bounds, paint_icon
|
from bedit.icon_renderer import icon_bounds, paint_icon
|
||||||
|
from bedit.preferences import application_settings
|
||||||
|
|
||||||
|
|
||||||
SELECTION_MIME_TYPE = "application/x-bedit-selection"
|
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:
|
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:
|
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)
|
return QPointF(round(position.x() / grid) * grid, round(position.y() / grid) * grid)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user