-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
128 lines (99 loc) · 4.29 KB
/
main.py
File metadata and controls
128 lines (99 loc) · 4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# TODO: Implement something like https://stackoverflow.com/a/8736705 to save
# window positioning state.
# TODO: Save current tab and console toggle state.
from __future__ import annotations
import sys
from PySide6.QtCore import QPoint, QRect, Qt, Slot
from PySide6.QtGui import QKeySequence, QShortcut
from PySide6.QtSerialPort import QSerialPort
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox, QTabWidget
import rc_flipflops
from flipflops.bad_apple import BadApple
from flipflops.console import Console
from flipflops.display import Display
from flipflops.instructions import Instructions
from flipflops.paint import Paint
from flipflops.randomize import Randomize
from flipflops.snake_game import SnakeGame
from flipflops.tool_bar import ToolBar
from flipflops.video_player import VideoPlayer
class FlipFlops(QMainWindow):
def __init__(self) -> None:
super().__init__(documentMode=True)
if self.style().name() == "macos":
self.setUnifiedTitleAndToolBarOnMac(True)
self.setWindowTitle("FlipFlops")
self.setMinimumSize(750, 850)
display = Display()
display.on_open.connect(self._handle_open)
display.on_close.connect(self._handle_close)
display.on_error.connect(self._handle_display_error)
console = Console(display)
self.addDockWidget(Qt.DockWidgetArea.BottomDockWidgetArea, console)
instructions = Instructions()
instructions.hide()
self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, instructions)
tool_bar = ToolBar(display)
tool_bar.on_console_toggle.connect(console.setVisible)
tool_bar.on_instructions_toggle.connect(instructions.setVisible)
self.addToolBar(tool_bar)
self._tabs: QTabWidget = QTabWidget(documentMode=True)
self._video_player: VideoPlayer = VideoPlayer(0, display)
self._video_player.setEnabled(False)
self._tabs.currentChanged.connect(self._video_player.handle_switch)
self._tabs.addTab(self._video_player, "Video Player")
self._bad_apple: BadApple = BadApple(1, display)
self._bad_apple.setEnabled(False)
self._tabs.currentChanged.connect(self._bad_apple.handle_switch)
self._tabs.addTab(self._bad_apple, "Bad Apple!!")
self._randomize: Randomize = Randomize(2, display)
self._randomize.setEnabled(False)
self._tabs.currentChanged.connect(self._randomize.handle_switch)
self._tabs.addTab(self._randomize, "Randomize")
self._paint: Paint = Paint(display)
self._paint.setEnabled(False)
self._tabs.addTab(self._paint, "Paint")
self._snake_game: SnakeGame = SnakeGame(4, display)
self._snake_game.setEnabled(False)
self._tabs.currentChanged.connect(self._snake_game.handle_switch)
self._tabs.addTab(self._snake_game, "Snake Game")
toggle = QShortcut(QKeySequence(Qt.Key.Key_Backslash), self)
toggle.activated.connect(self._handle_toggle)
self.setCentralWidget(self._tabs)
@Slot()
def _handle_toggle(self) -> None:
if self._tabs.currentIndex() == 3:
self._tabs.setCurrentIndex(4)
else:
self._tabs.setCurrentIndex(3)
@Slot()
def _handle_open(self) -> None:
self._video_player.setEnabled(True)
self._bad_apple.setEnabled(True)
self._randomize.setEnabled(True)
self._paint.setEnabled(True)
self._snake_game.setEnabled(True)
@Slot()
def _handle_close(self) -> None:
self._video_player.setEnabled(False)
self._bad_apple.setEnabled(False)
self._randomize.setEnabled(False)
self._paint.setEnabled(False)
self._snake_game.setEnabled(False)
@Slot(QSerialPort.SerialPortError)
def _handle_display_error(self, error: QSerialPort.SerialPortError) -> None:
# TODO: Improve error popup.
QMessageBox.critical(
self,
"FlipFlops",
f"{error.name}: Display serial disconnected unexpectedly.",
)
if __name__ == "__main__":
app = QApplication(sys.argv)
flip_flops = FlipFlops()
flip_flops.show()
flip_flops.move(
flip_flops.screen().geometry().center()
- QRect(QPoint(0, 50), flip_flops.frameGeometry().size()).center()
)
sys.exit(app.exec())