DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
daqconf
python
daqconf
cider
widgets
popups
file_io.py
Go to the documentation of this file.
1
2
from
typing
import
Dict
3
from
os
import
environ
4
5
from
textual.screen
import
ModalScreen, Screen
6
from
textual.app
import
ComposeResult
7
from
textual.widgets
import
Input, Button, Static
8
from
textual.containers
import
Horizontal, Container
9
10
from
daqconf.cider.widgets.configuration_controller
import
ConfigurationController
11
12
class
__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
55
class
SaveWithMessage
(
__MenuWithButtons
):
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
"""
60
self.
_button_labels
= {
61
"save"
: {
"label"
:
"Save"
,
"variant"
:
"success"
}
62
}
63
64
super().
__init__
(self.
_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_action
(input.value)
74
case _:
75
return
76
77
class
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
94
class
OpenFile
(
__MenuWithButtons
):
95
def
__init__
(self, name: str |
None
=
None
, id: str |
None
=
None
, classes: str |
None
=
None
) ->
None
:
96
97
self.
_button_labels
= {
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
,
"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_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
139
class
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
164
class
RenameConfigObject
(
__MenuWithButtons
):
165
def
__init__
(self, name: str |
None
=
None
, id: str |
None
=
None
, classes: str |
None
=
None
) ->
None
:
166
167
self.
_button_labels
= {
168
"rename"
: {
"label"
:
"Rename"
,
"variant"
:
"success"
}
169
}
170
"""
171
Concrete class for opening a configuration file
172
"""
173
174
super().
__init__
(self.
_button_labels
,
""
, name, id, classes)
175
176
# Bit hacky but "shrug"
177
self.
_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_action
(input.value)
208
209
case _:
210
return
211
212
class
RenameConfigObjectScreen
(Screen):
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()
file_io.OpenFileScreen
Definition
file_io.py:139
file_io.OpenFileScreen.on_mount
None on_mount(self)
Definition
file_io.py:157
file_io.OpenFileScreen.__init__
None __init__(self, str|None name=None, str|None id=None, str|None classes=None)
Definition
file_io.py:146
file_io.OpenFileScreen._controller
_controller
Definition
file_io.py:151
file_io.OpenFileScreen.compose
ComposeResult compose(self)
Definition
file_io.py:154
file_io.OpenFile
Definition
file_io.py:94
file_io.OpenFile.input_action
input_action(self, str new_config)
Definition
file_io.py:108
file_io.OpenFile.button_actions
button_actions(self, str|None button_id)
Definition
file_io.py:118
file_io.OpenFile.__init__
None __init__(self, str|None name=None, str|None id=None, str|None classes=None)
Definition
file_io.py:95
file_io.RenameConfigObjectScreen
Definition
file_io.py:212
file_io.RenameConfigObjectScreen.on_mount
None on_mount(self)
Definition
file_io.py:223
file_io.RenameConfigObjectScreen.compose
ComposeResult compose(self)
Definition
file_io.py:220
file_io.RenameConfigObject
Definition
file_io.py:164
file_io.RenameConfigObject.input_action
input_action(self, str new_file_name)
Definition
file_io.py:180
file_io.RenameConfigObject.__init__
None __init__(self, str|None name=None, str|None id=None, str|None classes=None)
Definition
file_io.py:165
file_io.RenameConfigObject.button_actions
button_actions(self, str|None button_id)
Definition
file_io.py:195
file_io.SaveWithMessageScreen
Definition
file_io.py:77
file_io.SaveWithMessageScreen.compose
ComposeResult compose(self)
Definition
file_io.py:85
file_io.SaveWithMessageScreen.on_mount
None on_mount(self)
Definition
file_io.py:88
file_io.SaveWithMessage
Definition
file_io.py:55
file_io.SaveWithMessage.input_action
input_action(self, str message)
Definition
file_io.py:66
file_io.SaveWithMessage.button_actions
button_actions(self, str button_id)
Definition
file_io.py:69
file_io.SaveWithMessage.__init__
None __init__(self, str|None name=None, str|None id=None, str|None classes=None)
Definition
file_io.py:56
file_io.__MenuWithButtons
Definition
file_io.py:12
file_io.__MenuWithButtons._config_controller
_config_controller
Definition
file_io.py:20
file_io.__MenuWithButtons._main_screen
_main_screen
Definition
file_io.py:19
file_io.__MenuWithButtons.__init__
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
file_io.__MenuWithButtons.input_action
input_action(self, str message)
Definition
file_io.py:38
file_io.__MenuWithButtons.on_button_pressed
on_button_pressed(self, Button.Pressed event)
Definition
file_io.py:46
file_io.__MenuWithButtons.on_input_submitted
on_input_submitted(self, event)
Definition
file_io.py:41
file_io.__MenuWithButtons._button_labels
_button_labels
Definition
file_io.py:18
file_io.__MenuWithButtons.compose
compose(self)
Definition
file_io.py:23
file_io.__MenuWithButtons._input_message
_input_message
Definition
file_io.py:21
file_io.__MenuWithButtons.button_actions
button_actions(self, str|None button_id)
Definition
file_io.py:35
Generated on
for DUNE-DAQ by
1.17.0