DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
file_io.py
Go to the documentation of this file.
2from typing import Dict
3from os import environ
4
5from textual.screen import ModalScreen, Screen
6from textual.app import ComposeResult
7from textual.widgets import Input, Button, Static
8from textual.containers import Horizontal, Container
9
10from daqconf.cider.widgets.configuration_controller import ConfigurationController
11
12class __MenuWithButtons(Static):
13 def __init__(self, button_labels: Dict[str, Dict[str, str]], input_message: str="", name: str | None=None, id: str | None = None, classes: str | None = None) -> None:
14 super().__init__(name=name, id=id, classes=classes)
15 """Base class for popups with N buttons and a single input field
16 """
17
18 self._button_labels = button_labels
19 self._main_screen = self.app.get_screen("main")
20 self._config_controller = self._main_screen.query_one(ConfigurationController)
21 self._input_message = input_message
22
23 def compose(self):
24 """Generates interfaxce
25 """
26 with Container(id="save_box"):
27 yield Input(placeholder=self._input_message, classes="save_message")
28 with Horizontal(classes="buttons"):
29 # Add buttons
30 for button_text, button_properties in self._button_labels.items():
31 yield Button(button_properties["label"], id=button_text, variant=button_properties["variant"])
32 yield Button("Cancel", id="cancel", variant="error")
33 # Add input field
34
35 def button_actions(self, button_id: str| None):
36 raise NotImplementedError("button_actions should be implemented in the child class")
37
38 def input_action(self, message: str):
39 raise NotImplementedError("input_action should be implemented in the child class")
40
41 def on_input_submitted(self, event):
42 if event.value:
43 self.input_action(event.value)
44 self.app.screen.dismiss(result="yay")
45
46 def on_button_pressed(self, event: Button.Pressed):
47 if event.button.id != "cancel":
48 self.button_actions(event.button.id)
49
50 # Cancel button does this too but no need to check!
51 self.app.screen.dismiss(result="yay")
52
53
54
56 def __init__(self, name: str | None = None, id: str | None = None, classes: str | None = None) -> None:
57 """
58 Concrete class for saving configuration with a message
59 """
61 "save" : {"label": "Save", "variant": "success"}
62 }
63
64 super().__init__(self._button_labels_button_labels, "Enter update message", name, id, classes)
65
66 def input_action(self, message: str):
67 self._config_controller.commit_configuration(message)
68
69 def button_actions(self, button_id: str):
70 match button_id:
71 case "save":
72 input = self.query_one(Input)
73 self.input_actioninput_action(input.value)
74 case _:
75 return
76
77class SaveWithMessageScreen(ModalScreen[bool]):
78 css_file_path = f"{environ.get('DAQCONF_SHARE')}/config/textual_dbe/textual_css"
79
80 CSS_PATH = f"{css_file_path}/save_menu_layout.tcss"
81 """
82 Splash screen for saving to file
83 """
84
85 def compose(self)->ComposeResult:
86 yield SaveWithMessage()
87
88 def on_mount(self) -> None:
89 message_box = self.query_one(SaveWithMessage)
90 message_box.focus()
91
92
93
95 def __init__(self, name: str | None = None, id: str | None = None, classes: str | None = None) -> None:
96
98 "open" : {"label": "Open", "variant": "success"},
99 "browse" : {"label": "Browse [DOESN'T WORK]", "variant": "warning"}
100 }
101 """
102 Concrete class for opening a configuration file
103 """
104
105 super().__init__(self._button_labels_button_labels, "Enter file path", name, id, classes)
106
107
108 def input_action(self, new_config: str):
109 """
110 Add new handler based on config name
111 """
112 try:
113 self._main_screen.update_with_new_input(new_config)
114 except Exception as e:
115 logger = self._main_screen.query_one("RichLogWError")
116 logger.write_error(e)
117
118 def button_actions(self, button_id: str | None):
119 """Open file or browse for file (not implemented)
120
121 Arguments:
122 button_id -- Button label
123 """
124 match button_id:
125 case "open":
126 input = self.query_one(Input)
127
128 # Safety check to avoid empty input
129 if input:
130 self.input_actioninput_action(input.value)
131
132 case "browse":
133 logger = self._main_screen.query_one("RichLogWError")
134 logger.write_error("Sorry not done this yet, please enter full file path and hit enter/open!")
135 case _:
136 return
137
138
139class OpenFileScreen(Screen):
140
141 # HACKY WAY TO GET THE CSS TO WORK
142 css_file_path = f"{environ.get('DAQCONF_SHARE')}/config/textual_dbe/textual_css"
143
144 CSS_PATH = f"{css_file_path}/save_menu_layout.tcss"
145
146 def __init__(self, name: str | None=None, id: str | None = None, classes: str | None = None) -> None:
147 """Add in configuration screen
148 """
149 super().__init__(name=name, id=id, classes=classes)
150 main_screen = self.app.get_screen("main")
151 self._controller = main_screen.query_one(ConfigurationController)
152
153
154 def compose(self)->ComposeResult:
155 yield OpenFile()
156
157 def on_mount(self) -> None:
158 message_box = self.query_one(OpenFile)
159 message_box.focus()
160
161
162
163
165 def __init__(self, name: str | None = None, id: str | None = None, classes: str | None = None) -> None:
166
168 "rename" : {"label": "Rename", "variant": "success"}
169 }
170 """
171 Concrete class for opening a configuration file
172 """
173
174 super().__init__(self._button_labels_button_labels, "", name, id, classes)
175
176 # Bit hacky but "shrug"
177 self._input_message_input_message = getattr(self._config_controller.current_dal, "id")
178
179
180 def input_action(self, new_file_name: str):
181 """
182 Add new handler based on config name
183 """
184 try:
185 self._config_controller.rename_dal(new_file_name)
186 main_screen = self.app.get_screen("main")
187 selection_menu = main_screen.query_exactly_one("SelectionPanel")
188 selection_menu.refresh(recompose=True)
189 selection_menu.restore_menu_state()
190
191 except Exception as e:
192 logger = self._main_screen.query_one("RichLogWError")
193 logger.write_error(e)
194
195 def button_actions(self, button_id: str | None):
196 """Open file or browse for file (not implemented)
197
198 Arguments:
199 button_id -- Button label
200 """
201 match button_id:
202 case "rename":
203 input = self.query_one(Input)
204
205 # Safety check to avoid empty input
206 if input:
207 self.input_actioninput_action(input.value)
208
209 case _:
210 return
211
213 css_file_path = f"{environ.get('DAQCONF_SHARE')}/config/textual_dbe/textual_css"
214
215 CSS_PATH = f"{css_file_path}/save_menu_layout.tcss"
216 """
217 Splash screen for saving to file
218 """
219
220 def compose(self)->ComposeResult:
221 yield RenameConfigObject()
222
223 def on_mount(self) -> None:
224 message_box = self.query_one(RenameConfigObject)
225 message_box.focus()
None on_mount(self)
Definition file_io.py:157
None __init__(self, str|None name=None, str|None id=None, str|None classes=None)
Definition file_io.py:146
ComposeResult compose(self)
Definition file_io.py:154
input_action(self, str new_config)
Definition file_io.py:108
button_actions(self, str|None button_id)
Definition file_io.py:118
None __init__(self, str|None name=None, str|None id=None, str|None classes=None)
Definition file_io.py:95
dict _button_labels
Definition file_io.py:97
ComposeResult compose(self)
Definition file_io.py:220
input_action(self, str new_file_name)
Definition file_io.py:180
None __init__(self, str|None name=None, str|None id=None, str|None classes=None)
Definition file_io.py:165
button_actions(self, str|None button_id)
Definition file_io.py:195
ComposeResult compose(self)
Definition file_io.py:85
input_action(self, str message)
Definition file_io.py:66
button_actions(self, str button_id)
Definition file_io.py:69
None __init__(self, str|None name=None, str|None id=None, str|None classes=None)
Definition file_io.py:56
None __init__(self, Dict[str, Dict[str, str]] button_labels, str input_message="", str|None name=None, str|None id=None, str|None classes=None)
Definition file_io.py:13
input_action(self, str message)
Definition file_io.py:38
on_button_pressed(self, Button.Pressed event)
Definition file_io.py:46
on_input_submitted(self, event)
Definition file_io.py:41
button_actions(self, str|None button_id)
Definition file_io.py:35