Skip to content

Commit 96acb65

Browse files
committed
refactor main_window and add app state signals for full aplication signaling
1 parent d383a3e commit 96acb65

4 files changed

Lines changed: 90 additions & 51 deletions

File tree

src/config/app_state.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from PyQt6.QtGui import QPixmap
88

99
from src.backend.rule_manager import RuleManager
10+
from src.signals.signal_emitter import ApplicationStatusEmitter, ApplicationStatusEnum
1011

1112

1213
class AppState:
@@ -18,6 +19,7 @@ def __init__(self):
1819
def _init(self):
1920
self.rule_manager: RuleManager = RuleManager()
2021
self.main_image_path: Optional[str] = None
22+
self.signal_emitter = ApplicationStatusEmitter()
2123

2224
@classmethod
2325
def instance(cls):
@@ -37,3 +39,10 @@ def ruleManager(cls):
3739
@classmethod
3840
def setImagePath(cls, image_path):
3941
cls.instance().main_image_path = image_path
42+
cls.instance().signal_emitter.application_status_signal.emit(ApplicationStatusEnum.IMAGE_LOADED, "")
43+
44+
@classmethod
45+
def setStatus(cls, status_type: ApplicationStatusEnum, message: str):
46+
if status_type == ApplicationStatusEnum.IMAGE_LOADED:
47+
raise ValueError(f"Application status {status_type} is not allowed for messaging")
48+
cls.instance().signal_emitter.application_status_signal.emit(status_type, message)

src/main_window.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import sys
2+
3+
from PyQt6.QtCore import Qt
4+
from PyQt6.QtGui import QPixmap, QAction
5+
from PyQt6.QtWidgets import QMainWindow, QFileDialog, QScrollArea, QMessageBox
6+
7+
from src.dialogs.dialog_config_settings import ConfigSettingsDialog
8+
from src.dockwidgets.dockwidget_mapper_generator import MapperGeneratorDockwidget
9+
from src.widgets.widget_image_selector import ImageSelectorWidget
10+
from src.config.app_state import AppState
11+
from src.signals.signal_emitter import ApplicationStatusEnum
12+
13+
14+
class MainWindow(QMainWindow):
15+
def __init__(self, parent=None):
16+
super().__init__(parent)
17+
self.setWindowTitle("Simple DDNet Automapper")
18+
self.resize(800, 600) # Set initial size if needed
19+
self.central_widget = ImageSelectorWidget(self)
20+
# scroll_area = QScrollArea(self)
21+
# scroll_area.setWidget(self.central_widget)
22+
self.setCentralWidget(self.central_widget)
23+
24+
# Main layout
25+
self.mapper_generator = MapperGeneratorDockwidget()
26+
self.mapper_generator.setAllowedAreas(
27+
Qt.DockWidgetArea.LeftDockWidgetArea | Qt.DockWidgetArea.RightDockWidgetArea)
28+
self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.mapper_generator)
29+
self.mapper_generator.setDisabled(True) # disable until image is loaded
30+
31+
# Create menu bar
32+
menubar = self.menuBar()
33+
34+
# Create File menu
35+
file_menu = menubar.addMenu('&File')
36+
37+
# Add Open action to File menu
38+
open_action = QAction('&Open', self)
39+
open_action.setShortcut('Ctrl+O')
40+
open_action.triggered.connect(self.central_widget.select_image)
41+
file_menu.addAction(open_action)
42+
43+
# Add Settings action to File menu
44+
settings_action = QAction('&Settings', self)
45+
settings_action.triggered.connect(self.openSettings)
46+
file_menu.addAction(settings_action)
47+
48+
# Create Help menu
49+
help_menu = menubar.addMenu('&Help')
50+
51+
# Add About action to Help menu
52+
about_action = QAction('&About', self)
53+
about_action.triggered.connect(self.showAbout)
54+
help_menu.addAction(about_action)
55+
56+
# connect app to app state signal emitter
57+
AppState.instance().signal_emitter.application_status_signal.connect(self.statusUpdateReceived)
58+
59+
def openSettings(self):
60+
ConfigSettingsDialog(self).exec()
61+
62+
def showAbout(self):
63+
QMessageBox.about(self, 'About', 'This is a PyQt6 menu example.')
64+
65+
def statusUpdateReceived(self, status_type: ApplicationStatusEnum, message: str):
66+
if status_type == ApplicationStatusEnum.IMAGE_LOADED:
67+
self.mapper_generator.setEnabled(True)
68+
# TODO set status dockwidget "Successfully loaded image"
69+
pass

src/signals/signal_emitter.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
from PyQt6.QtCore import pyqtSignal, QObject
2+
from enum import Enum
23

34

45
class ConfigurationClickedEmitter(QObject):
56
neighbor_signal = pyqtSignal(int, name="NeighborClick")
67
modification_signal = pyqtSignal(int, bool, name="ModificationSignal")
8+
9+
10+
class ApplicationStatusEnum(Enum):
11+
IMAGE_LOADED = "ImageLoaded"
12+
WARNING = "Warning"
13+
INFO = "Info"
14+
15+
16+
class ApplicationStatusEmitter(QObject):
17+
application_status_signal = pyqtSignal(ApplicationStatusEnum, str, name="ApplicationStatus")

viewer.py

Lines changed: 1 addition & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,57 +7,7 @@
77
from src.dialogs.dialog_config_settings import ConfigSettingsDialog
88
from src.dockwidgets.dockwidget_mapper_generator import MapperGeneratorDockwidget
99
from src.widgets.widget_image_selector import ImageSelectorWidget
10-
11-
12-
class MainWindow(QMainWindow):
13-
def __init__(self, parent=None):
14-
super().__init__(parent)
15-
self.setWindowTitle("Simple DDNet Automapper")
16-
self.resize(800, 600) # Set initial size if needed
17-
self.central_widget = ImageSelectorWidget(self)
18-
# scroll_area = QScrollArea(self)
19-
# scroll_area.setWidget(self.central_widget)
20-
self.setCentralWidget(self.central_widget)
21-
22-
# Main layout
23-
# main_layout = QHBoxLayout(self.central_widget)
24-
self.create_dock_windows()
25-
26-
# Create menu bar
27-
menubar = self.menuBar()
28-
29-
# Create File menu
30-
file_menu = menubar.addMenu('&File')
31-
32-
# Add Open action to File menu
33-
open_action = QAction('&Open', self)
34-
open_action.setShortcut('Ctrl+O')
35-
open_action.triggered.connect(self.central_widget.select_image)
36-
file_menu.addAction(open_action)
37-
38-
# Add Settings action to File menu
39-
settings_action = QAction('&Settings', self)
40-
settings_action.triggered.connect(self.openSettings)
41-
file_menu.addAction(settings_action)
42-
43-
# Create Help menu
44-
help_menu = menubar.addMenu('&Help')
45-
46-
# Add About action to Help menu
47-
about_action = QAction('&About', self)
48-
about_action.triggered.connect(self.showAbout)
49-
help_menu.addAction(about_action)
50-
51-
def create_dock_windows(self):
52-
dock = MapperGeneratorDockwidget()
53-
dock.setAllowedAreas(Qt.DockWidgetArea.LeftDockWidgetArea | Qt.DockWidgetArea.RightDockWidgetArea)
54-
self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, dock)
55-
56-
def openSettings(self):
57-
ConfigSettingsDialog(self).exec()
58-
59-
def showAbout(self):
60-
QMessageBox.about(self, 'About', 'This is a PyQt6 menu example.')
10+
from src.main_window import MainWindow
6111

6212

6313
def main():

0 commit comments

Comments
 (0)