|
@@ -1,6 +1,7 @@
|
1
|
1
|
"""
|
2
|
2
|
Provides the graphical front-end for Piket.
|
3
|
3
|
"""
|
|
4
|
+import collections
|
4
|
5
|
import logging
|
5
|
6
|
import os
|
6
|
7
|
import sys
|
|
@@ -29,8 +30,8 @@ try:
|
29
|
30
|
except ImportError:
|
30
|
31
|
dbus = None
|
31
|
32
|
|
32
|
|
-from piket_client.sound import PLOP_WAVE
|
33
|
|
-from piket_client.model import Person, ConsumptionType
|
|
33
|
+from piket_client.sound import PLOP_WAVE, UNDO_WAVE
|
|
34
|
+from piket_client.model import Person, ConsumptionType, Consumption
|
34
|
35
|
import piket_client.logger
|
35
|
36
|
|
36
|
37
|
LOG = logging.getLogger(__name__)
|
|
@@ -44,12 +45,15 @@ def plop() -> None:
|
44
|
45
|
class NameButton(QPushButton):
|
45
|
46
|
""" Wraps a QPushButton to provide a counter. """
|
46
|
47
|
|
|
48
|
+ consumption_created = Signal(Consumption)
|
|
49
|
+
|
47
|
50
|
def __init__(self, person: Person, active_id: str, *args, **kwargs) -> None:
|
48
|
51
|
self.person = person
|
49
|
52
|
self.active_id = active_id
|
50
|
53
|
|
51
|
54
|
super().__init__(self.current_label, *args, **kwargs)
|
52
|
55
|
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
|
|
56
|
+ self.consumption_created.connect(self.window().consumption_added)
|
53
|
57
|
|
54
|
58
|
self.clicked.connect(self.process_click)
|
55
|
59
|
|
|
@@ -78,9 +82,11 @@ class NameButton(QPushButton):
|
78
|
82
|
|
79
|
83
|
def process_click(self) -> None:
|
80
|
84
|
""" Process a click on this button. """
|
81
|
|
- if self.person.add_consumption(self.active_id):
|
|
85
|
+ result = self.person.add_consumption(self.active_id)
|
|
86
|
+ if result:
|
82
|
87
|
plop()
|
83
|
88
|
self.setText(self.current_label)
|
|
89
|
+ self.consumption_created.emit(result)
|
84
|
90
|
else:
|
85
|
91
|
print("Jantoeternuitje, kapot")
|
86
|
92
|
|
|
@@ -91,8 +97,8 @@ class NameButtons(QWidget):
|
91
|
97
|
|
92
|
98
|
new_id_set = Signal(str)
|
93
|
99
|
|
94
|
|
- def __init__(self, consumption_type_id: str) -> None:
|
95
|
|
- super().__init__()
|
|
100
|
+ def __init__(self, consumption_type_id: str, *args, **kwargs) -> None:
|
|
101
|
+ super().__init__(*args, **kwargs)
|
96
|
102
|
|
97
|
103
|
self.layout = None
|
98
|
104
|
self.layout = QGridLayout()
|
|
@@ -143,6 +149,8 @@ class PiketMainWindow(QMainWindow):
|
143
|
149
|
self.main_widget = None
|
144
|
150
|
self.toolbar = None
|
145
|
151
|
self.osk = None
|
|
152
|
+ self.undo_action = None
|
|
153
|
+ self.undo_queue = collections.deque([], 20)
|
146
|
154
|
self.init_ui()
|
147
|
155
|
|
148
|
156
|
def init_ui(self) -> None:
|
|
@@ -174,7 +182,10 @@ class PiketMainWindow(QMainWindow):
|
174
|
182
|
self.toolbar.addAction(
|
175
|
183
|
self.load_icon("add_person.svg"), "Nieuw persoon", self.add_person
|
176
|
184
|
)
|
177
|
|
- self.toolbar.addAction(self.load_icon("undo.svg"), "Oeps")
|
|
185
|
+ self.undo_action = self.toolbar.addAction(
|
|
186
|
+ self.load_icon("undo.svg"), "Oeps", self.do_undo
|
|
187
|
+ )
|
|
188
|
+ self.undo_action.setDisabled(True)
|
178
|
189
|
|
179
|
190
|
self.toolbar.addAction(
|
180
|
191
|
self.load_icon("quit.svg"), "Afsluiten", self.confirm_quit
|
|
@@ -231,7 +242,7 @@ class PiketMainWindow(QMainWindow):
|
231
|
242
|
self.addToolBar(self.toolbar)
|
232
|
243
|
|
233
|
244
|
# Initialize main widget
|
234
|
|
- self.main_widget = NameButtons(ag.actions()[0].data())
|
|
245
|
+ self.main_widget = NameButtons(ag.actions()[0].data(), self)
|
235
|
246
|
self.consumption_type_changed.connect(self.main_widget.consumption_type_changed)
|
236
|
247
|
self.setCentralWidget(self.main_widget)
|
237
|
248
|
|
|
@@ -282,6 +293,31 @@ class PiketMainWindow(QMainWindow):
|
282
|
293
|
LOG.warning("Shutdown by user.")
|
283
|
294
|
QApplication.instance().quit()
|
284
|
295
|
|
|
296
|
+ def do_undo(self) -> None:
|
|
297
|
+ """ Undo the last marked consumption. """
|
|
298
|
+ UNDO_WAVE.play()
|
|
299
|
+
|
|
300
|
+ to_undo = self.undo_queue.pop()
|
|
301
|
+ LOG.warning("Undoing consumption %s", to_undo)
|
|
302
|
+
|
|
303
|
+ result = to_undo.reverse()
|
|
304
|
+
|
|
305
|
+ if not result or not result.reversed:
|
|
306
|
+ LOG.error("Reversed consumption %s but was not reversed!", to_undo)
|
|
307
|
+ self.undo_queue.append(to_undo)
|
|
308
|
+
|
|
309
|
+ elif not self.undo_queue:
|
|
310
|
+ self.undo_action.setDisabled(True)
|
|
311
|
+
|
|
312
|
+ self.main_widget.init_ui()
|
|
313
|
+
|
|
314
|
+ @Slot(Consumption)
|
|
315
|
+ def consumption_added(self, consumption):
|
|
316
|
+ """ Mark an added consumption in the queue. """
|
|
317
|
+
|
|
318
|
+ self.undo_queue.append(consumption)
|
|
319
|
+ self.undo_action.setDisabled(False)
|
|
320
|
+
|
285
|
321
|
@staticmethod
|
286
|
322
|
def create_spacer() -> QWidget:
|
287
|
323
|
""" Return an empty QWidget that automatically expands. """
|