7
7
from RATapi .utils .enums import Calculations , Geometries , LayerModels
8
8
9
9
from rascal2 .config import path_for
10
- from rascal2 .widgets .project .models import ParameterFieldWidget , ProjectFieldWidget
10
+ from rascal2 .widgets .project .models import LayerFieldWidget , ParameterFieldWidget , ProjectFieldWidget
11
11
12
12
13
13
class ProjectWidget (QtWidgets .QWidget ):
@@ -34,7 +34,7 @@ def __init__(self, parent):
34
34
self .tabs = {
35
35
"Parameters" : ["parameters" ],
36
36
"Experimental Parameters" : ["scalefactors" , "bulk_in" , "bulk_out" ],
37
- "Layers" : [],
37
+ "Layers" : ["layers" ],
38
38
"Data" : [],
39
39
"Backgrounds" : [],
40
40
"Contrasts" : [],
@@ -62,49 +62,66 @@ def __init__(self, parent):
62
62
def create_project_view (self ) -> None :
63
63
"""Creates the project (non-edit) view"""
64
64
project_widget = QtWidgets .QWidget ()
65
- main_layout = QtWidgets .QGridLayout ()
66
- main_layout .setVerticalSpacing (20 )
65
+ main_layout = QtWidgets .QVBoxLayout ()
66
+ main_layout .setSpacing (20 )
67
67
68
68
self .edit_project_button = QtWidgets .QPushButton (
69
69
"Edit Project" , self , objectName = "bluebutton" , icon = QtGui .QIcon (path_for ("edit.png" ))
70
70
)
71
71
self .edit_project_button .clicked .connect (self .show_edit_view )
72
- main_layout .addWidget (self .edit_project_button , 0 , 5 )
72
+ button_layout = QtWidgets .QHBoxLayout ()
73
+ button_layout .setAlignment (QtCore .Qt .AlignmentFlag .AlignRight )
74
+ button_layout .addWidget (self .edit_project_button )
75
+
76
+ main_layout .addLayout (button_layout )
77
+
78
+ settings_layout = QtWidgets .QHBoxLayout ()
79
+ settings_layout .setAlignment (QtCore .Qt .AlignmentFlag .AlignHCenter )
80
+
81
+ absorption_label = QtWidgets .QLabel ("Absorption:" , self , objectName = "boldlabel" )
82
+ self .absorption_checkbox = QtWidgets .QCheckBox ()
83
+ # this is how you make a checkbox read-only but still checkable from inside code...
84
+ self .absorption_checkbox .setAttribute (QtCore .Qt .WidgetAttribute .WA_TransparentForMouseEvents )
85
+
86
+ settings_layout .addWidget (absorption_label )
87
+ settings_layout .addWidget (self .absorption_checkbox )
73
88
74
89
self .calculation_label = QtWidgets .QLabel ("Calculation:" , self , objectName = "boldlabel" )
75
90
76
91
self .calculation_type = QtWidgets .QLineEdit (self )
77
92
self .calculation_type .setAlignment (QtCore .Qt .AlignmentFlag .AlignCenter )
78
93
self .calculation_type .setReadOnly (True )
79
94
80
- main_layout .addWidget (self .calculation_label , 1 , 0 , 1 , 1 )
81
- main_layout .addWidget (self .calculation_type , 1 , 1 , 1 , 1 )
95
+ settings_layout .addWidget (self .calculation_label )
96
+ settings_layout .addWidget (self .calculation_type )
82
97
83
98
self .model_type_label = QtWidgets .QLabel ("Model Type:" , self , objectName = "boldlabel" )
84
99
85
100
self .model_type = QtWidgets .QLineEdit (self )
86
101
self .model_type .setAlignment (QtCore .Qt .AlignmentFlag .AlignCenter )
87
102
self .model_type .setReadOnly (True )
88
103
89
- main_layout .addWidget (self .model_type_label , 1 , 2 , 1 , 1 )
90
- main_layout .addWidget (self .model_type , 1 , 3 , 1 , 1 )
104
+ settings_layout .addWidget (self .model_type_label )
105
+ settings_layout .addWidget (self .model_type )
91
106
92
107
self .geometry_label = QtWidgets .QLabel ("Geometry:" , self , objectName = "boldlabel" )
93
108
94
109
self .geometry_type = QtWidgets .QLineEdit (self )
95
110
self .geometry_type .setAlignment (QtCore .Qt .AlignmentFlag .AlignCenter )
96
111
self .geometry_type .setReadOnly (True )
97
112
98
- main_layout .addWidget (self .geometry_label , 1 , 4 , 1 , 1 )
99
- main_layout .addWidget (self .geometry_type , 1 , 5 , 1 , 1 )
113
+ settings_layout .addWidget (self .geometry_label )
114
+ settings_layout .addWidget (self .geometry_type )
115
+
116
+ main_layout .addLayout (settings_layout )
100
117
101
118
self .project_tab = QtWidgets .QTabWidget ()
102
119
103
120
for tab , fields in self .tabs .items ():
104
121
widget = self .view_tabs [tab ] = ProjectTabWidget (fields , self )
105
122
self .project_tab .addTab (widget , tab )
106
123
107
- main_layout .addWidget (self .project_tab , 2 , 0 , 1 , 6 )
124
+ main_layout .addWidget (self .project_tab )
108
125
project_widget .setLayout (main_layout )
109
126
110
127
return project_widget
@@ -124,38 +141,58 @@ def create_edit_view(self) -> None:
124
141
self .cancel_button .setIcon (QtGui .QIcon (path_for ("cancel-dark.png" )))
125
142
self .cancel_button .clicked .connect (self .cancel_changes )
126
143
127
- layout = QtWidgets .QHBoxLayout ()
128
- layout .setAlignment (QtCore .Qt .AlignmentFlag .AlignRight )
129
- layout .addWidget (self .save_project_button )
130
- layout .addWidget (self .cancel_button )
131
- main_layout .addLayout (layout )
144
+ buttons_layout = QtWidgets .QHBoxLayout ()
145
+ buttons_layout .setAlignment (QtCore .Qt .AlignmentFlag .AlignRight )
146
+ buttons_layout .addWidget (self .save_project_button )
147
+ buttons_layout .addWidget (self .cancel_button )
148
+ main_layout .addLayout (buttons_layout )
149
+
150
+ settings_layout = QtWidgets .QHBoxLayout ()
151
+ settings_layout .setAlignment (QtCore .Qt .AlignmentFlag .AlignHCenter )
152
+
153
+ absorption_label = QtWidgets .QLabel ("Absorption:" , self , objectName = "boldlabel" )
154
+ self .edit_absorption_checkbox = QtWidgets .QCheckBox ()
155
+
156
+ settings_layout .addWidget (absorption_label )
157
+ settings_layout .addWidget (self .edit_absorption_checkbox )
132
158
133
159
self .edit_calculation_label = QtWidgets .QLabel ("Calculation:" , self , objectName = "boldlabel" )
134
160
135
161
self .calculation_combobox = QtWidgets .QComboBox (self )
162
+ self .calculation_combobox .setSizePolicy (
163
+ QtWidgets .QSizePolicy .Policy .MinimumExpanding , QtWidgets .QSizePolicy .Policy .Fixed
164
+ )
136
165
self .calculation_combobox .addItems ([calc for calc in Calculations ])
137
166
138
- layout = QtWidgets .QHBoxLayout ()
139
- layout .addWidget (self .edit_calculation_label )
140
- layout .addWidget (self .calculation_combobox )
167
+ settings_layout .addWidget (self .edit_calculation_label )
168
+ settings_layout .addWidget (self .calculation_combobox )
141
169
142
170
self .edit_model_type_label = QtWidgets .QLabel ("Model Type:" , self , objectName = "boldlabel" )
143
171
144
172
self .model_combobox = QtWidgets .QComboBox (self )
173
+ self .model_combobox .setSizePolicy (
174
+ QtWidgets .QSizePolicy .Policy .MinimumExpanding , QtWidgets .QSizePolicy .Policy .Fixed
175
+ )
145
176
self .model_combobox .addItems ([model for model in LayerModels ])
146
177
147
- layout .addWidget (self .edit_model_type_label )
148
- layout .addWidget (self .model_combobox )
178
+ settings_layout .addWidget (self .edit_model_type_label )
179
+ settings_layout .addWidget (self .model_combobox )
149
180
150
181
self .edit_geometry_label = QtWidgets .QLabel ("Geometry:" , self , objectName = "boldlabel" )
151
182
152
183
self .geometry_combobox = QtWidgets .QComboBox (self )
184
+ self .geometry_combobox .setSizePolicy (
185
+ QtWidgets .QSizePolicy .Policy .MinimumExpanding , QtWidgets .QSizePolicy .Policy .Fixed
186
+ )
153
187
self .geometry_combobox .addItems ([geo for geo in Geometries ])
154
188
155
- layout .addWidget (self .edit_geometry_label )
156
- layout .addWidget (self .geometry_combobox )
157
- main_layout .addLayout (layout )
189
+ settings_layout .addWidget (self .edit_geometry_label )
190
+ settings_layout .addWidget (self .geometry_combobox )
191
+ main_layout .addLayout (settings_layout )
158
192
193
+ self .edit_absorption_checkbox .checkStateChanged .connect (
194
+ lambda s : self .update_draft_project ({"absorption" : s == QtCore .Qt .CheckState .Checked })
195
+ )
159
196
self .calculation_combobox .currentTextChanged .connect (lambda s : self .update_draft_project ({"calculation" : s }))
160
197
self .calculation_combobox .currentTextChanged .connect (lambda : self .handle_domains_tab ())
161
198
self .model_combobox .currentTextChanged .connect (lambda s : self .update_draft_project ({"model" : s }))
@@ -166,6 +203,10 @@ def create_edit_view(self) -> None:
166
203
widget = self .edit_tabs [tab ] = ProjectTabWidget (fields , self , edit_mode = True )
167
204
self .edit_project_tab .addTab (widget , tab )
168
205
206
+ self .edit_absorption_checkbox .checkStateChanged .connect (
207
+ lambda s : self .edit_tabs ["Layers" ].tables ["layers" ].set_absorption (s == QtCore .Qt .CheckState .Checked )
208
+ )
209
+
169
210
main_layout .addWidget (self .edit_project_tab )
170
211
171
212
edit_project_widget .setLayout (main_layout )
@@ -178,10 +219,12 @@ def update_project_view(self) -> None:
178
219
# because we don't want validation errors going off while editing the model is in-progress
179
220
self .draft_project : dict = create_draft_project (self .parent_model .project )
180
221
222
+ self .absorption_checkbox .setChecked (self .parent_model .project .absorption )
181
223
self .calculation_type .setText (self .parent_model .project .calculation )
182
224
self .model_type .setText (self .parent_model .project .model )
183
225
self .geometry_type .setText (self .parent_model .project .geometry )
184
226
227
+ self .edit_absorption_checkbox .setChecked (self .parent_model .project .absorption )
185
228
self .calculation_combobox .setCurrentText (self .parent_model .project .calculation )
186
229
self .model_combobox .setCurrentText (self .parent_model .project .model )
187
230
self .geometry_combobox .setCurrentText (self .parent_model .project .geometry )
@@ -271,6 +314,8 @@ def __init__(self, fields: list[str], parent, edit_mode: bool = False):
271
314
for field in self .fields :
272
315
if field in RATapi .project .parameter_class_lists :
273
316
self .tables [field ] = ParameterFieldWidget (field , self )
317
+ elif field == "layers" :
318
+ self .tables [field ] = LayerFieldWidget (field , self )
274
319
else :
275
320
self .tables [field ] = ProjectFieldWidget (field , self )
276
321
layout .addWidget (self .tables [field ])
@@ -302,6 +347,8 @@ def update_model(self, new_model):
302
347
table .update_model (classlist )
303
348
if self .edit_mode :
304
349
table .edit ()
350
+ if "layers" in self .tables :
351
+ self .tables ["layers" ].set_absorption (new_model ["absorption" ])
305
352
306
353
def handle_controls_update (self , controls ):
307
354
"""Reflect changes to the Controls object."""
0 commit comments