Initial Commit

This commit is contained in:
2025-06-01 22:29:01 +12:00
commit 7a0b29c83a
10 changed files with 143 additions and 0 deletions

31
main.py Normal file
View File

@@ -0,0 +1,31 @@
# Standard Library
import sys
# Local Library
from util.gui.logic.app_window_types import MDIApp
from util.gui.logic.characteristics import Characteristics, Window, Toolbar, ToolbarAction, SubWindow
from util.gui.windows import Windows
# External Library
from PySide6.QtWidgets import QApplication, QTextEdit, QMdiSubWindow
def main():
app = QApplication(sys.argv)
characteristics = Characteristics([
Window("Main Window"),
Toolbar("Main Toolbar", [
ToolbarAction("File", lambda app: print("File?")),
ToolbarAction("Connections", lambda app: print("Connections menu")),
ToolbarAction("Create Note", Windows.create_note)
])
])
application = MDIApp(characteristics)
application.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,41 @@
# Local Library
from util.gui.logic.characteristics import Characteristics
# External Library
from PySide6.QtWidgets import (QApplication, QMainWindow, QMdiArea, QMdiSubWindow, QTextEdit, QPushButton, QVBoxLayout, QWidget, QToolBar)
from PySide6.QtGui import QKeySequence, QShortcut
class MDIApp(QMainWindow):
def __init__(self, characteristics: Characteristics):
super().__init__()
self.mdi_area = QMdiArea(self)
self.setCentralWidget(self.mdi_area)
for component in characteristics.components:
component.build(self)
self.fullscreen_shortcut = QShortcut(QKeySequence("F11"), self)
self.fullscreen_shortcut.activated.connect(self.toggle_fullscreen)
def toggle_fullscreen(self):
if self.isFullScreen():
self.showNormal()
else:
self.showFullScreen()
class App(QMainWindow):
def __init__(self, characteristics: Characteristics):
super().__init__()
for component in characteristics.components:
component.build(self)
self.fullscreen_shortcut = QShortcut(QKeySequence("F11"), self)
self.fullscreen_shortcut.activated.connect(self.toggle_fullscreen)
def toggle_fullscreen(self):
if self.isFullScreen():
self.showNormal()
else:
self.showFullScreen()

View File

@@ -0,0 +1,57 @@
# Standard Library
from dataclasses import dataclass
from typing import List, Callable, Protocol
# External Library
from PySide6.QtWidgets import (QToolBar, QMainWindow, QWidget, QMdiArea, QMdiSubWindow)
from PySide6.QtGui import (QAction)
class UIComponent(Protocol):
def build(self, app: QMainWindow):
pass
@dataclass
class ToolbarAction:
name: str
callback: Callable[[QMainWindow], None]
@dataclass
class Toolbar(UIComponent):
name: str
actions: List[ToolbarAction]
def build(self, app: QMainWindow):
toolbar = QToolBar(self.name)
for action in self.actions:
qt_action = QAction(action.name, app)
qt_action.triggered.connect(lambda checked=False, cb=action.callback: cb(app))
toolbar.addAction(qt_action)
app.addToolBar(toolbar)
@dataclass
class SubWindow(UIComponent):
name: str
content_factory: Callable[[], QWidget]
def build(self, app: QMainWindow):
if not hasattr(app, 'mdi_area'):
raise AttributeError("MDI area not found in app")
mdi_area: QMdiArea = getattr(app, 'mdi_area')
sub_window = QMdiSubWindow()
sub_window.setWidget(self.content_factory())
sub_window.setWindowTitle(self.name)
mdi_area.addSubWindow(sub_window)
sub_window.show()
@dataclass
class Window(UIComponent):
title: str
def build(self, app: QMainWindow):
app.setWindowTitle(self.title)
@dataclass
class Characteristics:
components: List[UIComponent]

14
util/gui/windows.py Normal file
View File

@@ -0,0 +1,14 @@
# External Library
from PySide6.QtWidgets import QApplication, QTextEdit, QMdiSubWindow
class Windows:
note_counter = 0
@staticmethod
def create_note(app_instance):
Windows.note_counter += 1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit(f"Notes {Windows.note_counter}"))
sub.setWindowTitle(f"Notes {Windows.note_counter}")
app_instance.mdi_area.addSubWindow(sub)
sub.show()