Skip to content

Commit 7e76b2a

Browse files
authored
Refactors slider (#165)
1 parent 394bb35 commit 7e76b2a

19 files changed

+526
-1200
lines changed

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ extend-ignore-names = ['allKeys',
4949
'isClean',
5050
'mergeWith',
5151
'mouseDoubleClickEvent',
52+
'paintEvent',
5253
'resizeEvent',
5354
'rowCount',
5455
'setClean',

rascal2/core/writer.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,7 @@ def write_result_to_zipped_csvs(filename, results):
4949
if not isinstance(results, BayesResults):
5050
return
5151

52-
procedure_field = (
53-
"nestedSamplerOutput" if results.nestedSamplerOutput.nestSamples.shape != (1, 2) else "dreamOutput"
54-
)
52+
procedure_field = "nestedSamplerOutput" if results.from_procedure() == "ns" else "dreamOutput"
5553
for inner_class in ["predictionIntervals", "confidenceIntervals", procedure_field]:
5654
subclass = getattr(results, inner_class)
5755

rascal2/static/style.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,3 +455,11 @@ MultiSelectList QToolButton {
455455
padding: 0;
456456
margin: 0;
457457
}
458+
459+
/*****************************
460+
LabeledSlider Styles
461+
*****************************/
462+
463+
LabeledSlider{
464+
border: 1px solid #999;
465+
}

rascal2/ui/presenter.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,22 +170,30 @@ def interrupt_terminal(self):
170170
"""Sends an interrupt signal to the RAT runner."""
171171
self.runner.interrupt()
172172

173-
def quick_run(self):
174-
"""Run rat calculation with calculate procedure.
173+
def quick_run(self, project=None):
174+
"""Run rat calculation with calculate procedure on the given project.
175+
The project in the MainWindowModel is used if no project is provided.
176+
177+
Parameters
178+
----------
179+
project : Optional[ratapi.Project]
180+
The project to use for run
175181
176182
Returns
177183
-------
178184
results : Union[ratapi.outputs.Results, ratapi.outputs.BayesResults]
179185
The calculation results.
180186
"""
187+
if project is None:
188+
project = self.model.project
181189
if ratapi.wrappers.MatlabWrapper.loader is None and any(
182190
[file.language == "matlab" for file in self.model.project.custom_files]
183191
):
184192
matlab_helper = MatlabHelper()
185193
result = get_matlab_engine(matlab_helper.ready_event, matlab_helper.engine_output)
186194
if isinstance(result, Exception):
187195
raise result
188-
return rat.run(self.model.project, rat.Controls(display="off"))[1]
196+
return rat.run(project, rat.Controls(display="off"))[1]
189197

190198
def run(self):
191199
"""Run rat using multiprocessing."""
@@ -242,7 +250,7 @@ def handle_event(self):
242250
case LogData():
243251
self.view.logging.log(event.level, event.msg)
244252

245-
def edit_project(self, updated_project: dict, preview: bool = False) -> None:
253+
def edit_project(self, updated_project: dict, preview: bool = True) -> None:
246254
"""Edit the Project with a dictionary of attributes.
247255
248256
Parameters

rascal2/ui/view.py

Lines changed: 30 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from rascal2.dialogs.settings_dialog import SettingsDialog
99
from rascal2.dialogs.startup_dialog import PROJECT_FILES, LoadDialog, LoadR1Dialog, NewProjectDialog, StartupDialog
1010
from rascal2.settings import MDIGeometries, Settings, get_global_settings
11-
from rascal2.widgets import ControlsWidget, PlotWidget, SlidersViewWidget, TerminalWidget
11+
from rascal2.widgets import ControlsWidget, PlotWidget, TerminalWidget
1212
from rascal2.widgets.project import ProjectWidget
1313
from rascal2.widgets.startup import StartUpWidget
1414

@@ -22,13 +22,8 @@ class MainWindowView(QtWidgets.QMainWindow):
2222

2323
def __init__(self):
2424
super().__init__()
25-
# Public interface
26-
self.disabled_elements = []
27-
self.show_sliders = False # no one displays sliders initially except got from configuration
28-
# (not implemented yet)
2925

3026
self.setWindowTitle(MAIN_WINDOW_TITLE)
31-
3227
window_icon = QtGui.QIcon(path_for("logo.png"))
3328

3429
self.undo_stack = QtGui.QUndoStack(self)
@@ -43,22 +38,12 @@ def __init__(self):
4338
self.plot_widget = PlotWidget(self)
4439
self.terminal_widget = TerminalWidget()
4540
self.controls_widget = ControlsWidget(self)
46-
self.sliders_view_widget = SlidersViewWidget(self)
4741
self.project_widget = ProjectWidget(self)
4842

49-
## protected interface and public properties construction
50-
51-
# define menu controlling switch between table and slider views
52-
self._sliders_menu_control_text = {
53-
"ShowSliders": "&Show Sliders", # if state is show sliders, click will show them
54-
"HideSliders": "&Hide Sliders",
55-
} # if state is show table, click will show sliders
43+
self.disabled_elements = []
5644

5745
self.create_actions()
58-
59-
main_menu = self.menuBar()
60-
self.add_submenus(main_menu)
61-
46+
self.create_menus()
6247
self.create_toolbar()
6348
self.create_status_bar()
6449

@@ -172,30 +157,22 @@ def create_actions(self):
172157
self.settings_action.setEnabled(False)
173158
self.disabled_elements.append(self.settings_action)
174159

175-
open_help_action = QtGui.QAction("&Help", self)
176-
open_help_action.setStatusTip("Open Documentation")
177-
open_help_action.setIcon(QtGui.QIcon(path_for("help.png")))
178-
open_help_action.triggered.connect(self.open_docs)
179-
self.open_help_action = open_help_action
180-
181-
# done this way expecting the value "show_sliders" being stored
182-
# in configuration in a future + "show_sliders" is public for this reason
183-
if self.show_sliders:
184-
# if show_sliders state is True, action will be hide
185-
show_or_hide_slider_action = QtGui.QAction(self._sliders_menu_control_text["HideSliders"], self)
186-
else:
187-
# if display_sliders state is False, action will be show
188-
show_or_hide_slider_action = QtGui.QAction(self._sliders_menu_control_text["ShowSliders"], self)
189-
show_or_hide_slider_action.setStatusTip("Show or Hide Sliders")
190-
show_or_hide_slider_action.triggered.connect(lambda: self.show_or_hide_sliders(None))
191-
self._show_or_hide_slider_action = show_or_hide_slider_action
192-
self._show_or_hide_slider_action.setEnabled(False)
193-
self.disabled_elements.append(self._show_or_hide_slider_action)
194-
195-
open_about_action = QtGui.QAction("&About", self)
196-
open_about_action.setStatusTip("Report RAT version&info")
197-
open_about_action.triggered.connect(self.open_about_info)
198-
self.open_about_action = open_about_action
160+
self.open_help_action = QtGui.QAction("&Help", self)
161+
self.open_help_action.setStatusTip("Open Documentation")
162+
self.open_help_action.setIcon(QtGui.QIcon(path_for("help.png")))
163+
self.open_help_action.triggered.connect(self.open_docs)
164+
165+
self.toggle_slider_action = QtGui.QAction("Show &Sliders", self)
166+
self.toggle_slider_action.setProperty("show_text", "Show &Sliders")
167+
self.toggle_slider_action.setProperty("hide_text", "Hide &Sliders")
168+
self.toggle_slider_action.setStatusTip("Show or Hide Sliders")
169+
self.toggle_slider_action.triggered.connect(self.toggle_sliders)
170+
self.toggle_slider_action.setEnabled(False)
171+
self.disabled_elements.append(self.toggle_slider_action)
172+
173+
self.open_about_action = QtGui.QAction("&About", self)
174+
self.open_about_action.setStatusTip("Report RAT version&info")
175+
self.open_about_action.triggered.connect(self.open_about_info)
199176

200177
self.exit_action = QtGui.QAction("E&xit", self)
201178
self.exit_action.setStatusTip(f"Quit {MAIN_WINDOW_TITLE}")
@@ -231,13 +208,12 @@ def create_actions(self):
231208
self.setup_matlab_action.setStatusTip("Set the path of the MATLAB executable")
232209
self.setup_matlab_action.triggered.connect(lambda: self.show_settings_dialog(tab_name="Matlab"))
233210

234-
def add_submenus(self, main_menu: QtWidgets.QMenuBar):
211+
def create_menus(self):
235212
"""Add sub menus to the main menu bar"""
236-
213+
main_menu = self.menuBar()
237214
main_menu.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.PreventContextMenu)
238215

239216
file_menu = main_menu.addMenu("&File")
240-
file_menu.setObjectName("&File")
241217
file_menu.addAction(self.new_project_action)
242218
file_menu.addSeparator()
243219
file_menu.addAction(self.open_project_action)
@@ -253,56 +229,37 @@ def add_submenus(self, main_menu: QtWidgets.QMenuBar):
253229
file_menu.addAction(self.exit_action)
254230

255231
edit_menu = main_menu.addMenu("&Edit")
256-
edit_menu.setObjectName("&Edit")
257232
edit_menu.addAction(self.undo_action)
258233
edit_menu.addAction(self.redo_action)
259234
edit_menu.addAction(self.undo_view_action)
260235

261236
windows_menu = main_menu.addMenu("&Windows")
262-
windows_menu.setObjectName("&Windows")
263237
windows_menu.addAction(self.tile_windows_action)
264238
windows_menu.addAction(self.reset_windows_action)
265239
windows_menu.addAction(self.save_default_windows_action)
266240
windows_menu.setEnabled(False)
267241
self.disabled_elements.append(windows_menu)
268242

269243
tools_menu = main_menu.addMenu("&Tools")
270-
tools_menu.setObjectName("&Tools")
271-
tools_menu.addAction(self._show_or_hide_slider_action)
244+
tools_menu.addAction(self.toggle_slider_action)
272245
tools_menu.addSeparator()
273246
tools_menu.addAction(self.clear_terminal_action)
274247
tools_menu.addSeparator()
275248
tools_menu.addAction(self.setup_matlab_action)
276249

277250
help_menu = main_menu.addMenu("&Help")
278-
help_menu.setObjectName("&Help")
279251
help_menu.addAction(self.open_about_action)
280252
help_menu.addAction(self.open_help_action)
281253

282-
def show_or_hide_sliders(self, do_show_sliders=None):
283-
"""Depending on current state, show or hide sliders for
284-
table properties within Project class view.
285-
286-
Parameters:
287-
-----------
288-
289-
do_show_sliders: bool,default None
290-
if provided, sets self.show_sliders logical variable into the requested state
291-
(True/False), forcing sliders widget to appear/disappear. if None, applies not to current state.
292-
"""
293-
if do_show_sliders is None:
294-
self.show_sliders = not self.show_sliders
295-
else:
296-
self.show_sliders = do_show_sliders
297-
298-
if self.show_sliders:
299-
self._show_or_hide_slider_action.setText(self._sliders_menu_control_text["HideSliders"])
300-
self.sliders_view_widget.show()
301-
self.project_widget.setWindowTitle("Sliders View")
302-
self.project_widget.stacked_widget.setCurrentIndex(2)
254+
def toggle_sliders(self):
255+
"""Toggles sliders for the fitted parameters in project class view."""
256+
show_text = self.toggle_slider_action.property("show_text")
257+
if self.toggle_slider_action.text() == show_text:
258+
hide_text = self.toggle_slider_action.property("hide_text")
259+
self.toggle_slider_action.setText(hide_text)
260+
self.project_widget.show_slider_view()
303261
else:
304-
self._show_or_hide_slider_action.setText(self._sliders_menu_control_text["ShowSliders"])
305-
self.sliders_view_widget.hide()
262+
self.toggle_slider_action.setText(show_text)
306263
self.project_widget.show_project_view()
307264

308265
def open_about_info(self):

rascal2/widgets/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from rascal2.widgets.controls import ControlsWidget
22
from rascal2.widgets.inputs import AdaptiveDoubleSpinBox, MultiSelectComboBox, MultiSelectList, get_validated_input
33
from rascal2.widgets.plot import PlotWidget
4-
from rascal2.widgets.sliders_view import SlidersViewWidget
4+
from rascal2.widgets.project.slider_view import SliderViewWidget
55
from rascal2.widgets.terminal import TerminalWidget
66

77
__all__ = [
@@ -12,5 +12,5 @@
1212
"MultiSelectList",
1313
"PlotWidget",
1414
"TerminalWidget",
15-
"SlidersViewWidget",
15+
"SliderViewWidget",
1616
]

rascal2/widgets/plot.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -244,14 +244,12 @@ def update_figure_size(self):
244244

245245
def show_result_summary(self, results):
246246
"""Show log z and log z error in summary label"""
247-
if isinstance(results, ratapi.outputs.BayesResults):
248-
samples = results.nestedSamplerOutput.nestSamples
249-
if samples.shape != (1, 2):
250-
self.result_summary.setText(
251-
f"log (Z) = {results.nestedSamplerOutput.logZ:.5f}\n"
252-
f"log (Z) error = {results.nestedSamplerOutput.logZErr:.5f}"
253-
)
254-
self.result_summary.setVisible(True)
247+
if isinstance(results, ratapi.outputs.BayesResults) and results.from_procedure() == "ns":
248+
self.result_summary.setText(
249+
f"log (Z) = {results.nestedSamplerOutput.logZ:.5f}\n"
250+
f"log (Z) error = {results.nestedSamplerOutput.logZErr:.5f}"
251+
)
252+
self.result_summary.setVisible(True)
255253

256254
def make_interaction_layout(self):
257255
"""Make layout with pan, zoom, and reset button.

rascal2/widgets/project/project.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
from rascal2.config import path_for
1313
from rascal2.widgets.project.lists import ContrastWidget, DataWidget
14+
from rascal2.widgets.project.slider_view import SliderViewWidget
1415
from rascal2.widgets.project.tables import (
1516
BackgroundsFieldWidget,
1617
CustomFileWidget,
@@ -41,6 +42,7 @@ def __init__(self, parent):
4142
self.parent_model = self.parent.presenter.model
4243

4344
self.parent_model.project_updated.connect(self.update_project_view)
45+
self.parent_model.project_updated.connect(self.update_slider_view)
4446
self.parent_model.controls_updated.connect(self.handle_controls_update)
4547

4648
self.tabs = {
@@ -72,7 +74,6 @@ def __init__(self, parent):
7274
self.stacked_widget = QtWidgets.QStackedWidget()
7375
self.stacked_widget.addWidget(project_view)
7476
self.stacked_widget.addWidget(project_edit)
75-
self.stacked_widget.addWidget(self.parent.sliders_view_widget)
7677

7778
layout = QtWidgets.QVBoxLayout()
7879
layout.setContentsMargins(0, 0, 0, 0)
@@ -85,8 +86,8 @@ def create_project_view(self) -> QtWidgets.QWidget:
8586
main_layout = QtWidgets.QVBoxLayout()
8687
main_layout.setSpacing(20)
8788

88-
show_sliders_button = QtWidgets.QPushButton("Show sliders", self, objectName="ShowSliders")
89-
show_sliders_button.clicked.connect(lambda: self.parent.show_or_hide_sliders(True))
89+
show_sliders_button = QtWidgets.QPushButton("Show sliders", self)
90+
show_sliders_button.clicked.connect(self.parent.toggle_sliders)
9091

9192
self.edit_project_button = QtWidgets.QPushButton("Edit Project", self, icon=QtGui.QIcon(path_for("edit.png")))
9293
self.edit_project_button.clicked.connect(self.show_edit_view)
@@ -246,6 +247,26 @@ def create_edit_view(self) -> QtWidgets.QWidget:
246247

247248
return edit_project_widget
248249

250+
def show_slider_view(self):
251+
"""Create slider view and make it visible."""
252+
if self.stacked_widget.count() == 3:
253+
# 3 widgets means slider view already exist
254+
# (with project view and edit view) so delete before replacing with new one
255+
old_slider_widget = self.stacked_widget.widget(2)
256+
self.stacked_widget.removeWidget(old_slider_widget)
257+
old_slider_widget.deleteLater()
258+
slider_view = SliderViewWidget(create_draft_project(self.parent_model.project), self.parent)
259+
self.stacked_widget.addWidget(slider_view)
260+
self.stacked_widget.setCurrentIndex(2)
261+
262+
def update_slider_view(self):
263+
"""Update the slider view if the project changes when it is opened."""
264+
if self.stacked_widget.currentIndex() == 2:
265+
# slider view is the 3rd widget in the layout
266+
widget = self.stacked_widget.widget(2)
267+
widget.draft_project = create_draft_project(self.parent_model.project)
268+
widget.initialize()
269+
249270
def update_project_view(self, update_tab_index=None) -> None:
250271
"""Updates the project view."""
251272

0 commit comments

Comments
 (0)