-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpanel_control_program.py
129 lines (112 loc) · 4.24 KB
/
panel_control_program.py
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
129
from panel import KMiffedPanel
from textual.app import ComposeResult
from textual.message import Message
from textual.widgets import Label
class PanelControlProgram(KMiffedPanel):
#
# Types
#
class SetDataMsg(Message):
"""Set widget data message."""
def __init__(self) -> None:
super().__init__()
class SetControlProgramMsg(Message):
def __init__(self, program: str, program_data: float) -> None:
self.control_program = program
self.program_data = program_data
super().__init__()
#
# Constructor
#
def __init__(self, classes=None, id=None):
self.hovered_item_idx = -1
self.hovered_item_idx_last = 0
self.selected_item_idx = 0
self.programs = [
"manual",
"vspeed",
"attitude",
]
self.program_data = 0.0
super().__init__("Program", classes=classes, id=id)
#
# Public Methods
#
def compose(self) -> ComposeResult:
yield Label("Manual", classes="item-label")
yield Label("Maintain VSpeed", classes="item-label")
yield Label("Maintain Attitude", classes="item-label")
yield Label("Program Data", id="item-program-data")
def set_data(self) -> None:
pass
def on_panel_enter(self) -> None:
KMiffedPanel.on_panel_enter(self)
self.hovered_item_idx = self.hovered_item_idx_last
self._update_items()
def on_panel_exit(self) -> None:
KMiffedPanel.on_panel_exit(self)
self.hovered_item_idx = -1
self._update_items()
def on_panel_key_down(self) -> None:
KMiffedPanel.on_panel_key_down(self)
self.hovered_item_idx += 1
if self.hovered_item_idx >= len(self.items):
self.hovered_item_idx = 0
self.hovered_item_idx_last = self.hovered_item_idx
self._update_items()
def on_panel_key_up(self) -> None:
KMiffedPanel.on_panel_key_up(self)
self.hovered_item_idx -= 1
if self.hovered_item_idx < 0:
self.hovered_item_idx = len(self.items) - 1
self.hovered_item_idx_last = self.hovered_item_idx
self._update_items()
def on_panel_key_select(self) -> None:
KMiffedPanel.on_panel_key_select(self)
self.selected_item_idx = self.hovered_item_idx
self._update_items()
self.post_message(self.SetControlProgramMsg(self.programs[self.selected_item_idx], self.program_data))
# if self.selected_item_idx == 0:
# self.post_message(self.SetControlProgramMsg("manual", 0.0))
# elif self.selected_item_idx == 1:
# self.post_message(self.SetControlProgramMsg("vspeed", 0.0))
# elif self.selected_item_idx == 2:
# self.post_message(self.SetControlProgramMsg("attitude", 0.0))
def on_panel_key_decrement(self) -> None:
self.program_data -= 1.0
self._update_items()
self.post_message(self.SetControlProgramMsg(self.programs[self.selected_item_idx], self.program_data))
def on_panel_key_increment(self) -> None:
self.program_data += 1.0
self._update_items()
self.post_message(self.SetControlProgramMsg(self.programs[self.selected_item_idx], self.program_data))
#
# Event Handlers
#
def on_mount(self) -> None:
# assign title to panel
self.border_title = self.PANEL_TITLE
self.items = self.query(".item-label")
self._update_items()
super().on_mount()
#
# Message Handlers
#
def on_panel_control_program_set_data_msg(self, message: SetDataMsg) -> None:
self.set_data()
#
# Private Methods
#
def _update_items(self):
item_idx = 0
for item in self.items:
if item_idx == self.selected_item_idx:
item.add_class("item-label-selected")
item.remove_class("item-label-hovered")
elif item_idx == self.hovered_item_idx:
item.add_class("item-label-hovered")
else:
item.remove_class("item-label-selected")
item.remove_class("item-label-hovered")
item_idx += 1
self.query_one("#item-program-data").update("Program Data = {:.2f}".format(self.program_data))