Skip to content

Commit c335f18

Browse files
Reset View (#77)
* intermediate * syncing visibility * misc * more sensible resizing
1 parent f3ee83b commit c335f18

3 files changed

Lines changed: 76 additions & 69 deletions

File tree

src/petab_gui/controllers/mother_controller.py

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -162,26 +162,8 @@ def setup_connections(self):
162162
self.model.sbml.something_changed.connect(
163163
self.unsaved_changes_change
164164
)
165-
# correctly update the visibility even when "x" is clicked in a dock
166-
self.view.measurement_dock.visibilityChanged.connect(
167-
lambda visible: self.actions["show_measurement"].setChecked(
168-
visible)
169-
)
170-
self.view.observable_dock.visibilityChanged.connect(
171-
lambda visible: self.actions["show_observable"].setChecked(visible)
172-
)
173-
self.view.parameter_dock.visibilityChanged.connect(
174-
lambda visible: self.actions["show_parameter"].setChecked(visible)
175-
)
176-
self.view.condition_dock.visibilityChanged.connect(
177-
lambda visible: self.actions["show_condition"].setChecked(visible)
178-
)
179-
self.view.logger_dock.visibilityChanged.connect(
180-
lambda visible: self.actions["show_logger"].setChecked(visible)
181-
)
182-
self.view.plot_dock.visibilityChanged.connect(
183-
lambda visible: self.actions["show_plot"].setChecked(visible)
184-
)
165+
# Visibility
166+
self.sync_visibility_with_actions()
185167
# Recent Files
186168
self.recent_files_manager.open_file.connect(
187169
partial(self.open_file, mode="overwrite")
@@ -342,23 +324,12 @@ def setup_actions(self):
342324
actions["show_plot"].setCheckable(True)
343325
actions["show_plot"].setChecked(True)
344326
# connect actions
345-
actions["show_measurement"].toggled.connect(
346-
lambda checked: self.view.measurement_dock.setVisible(checked)
347-
)
348-
actions["show_observable"].toggled.connect(
349-
lambda checked: self.view.observable_dock.setVisible(checked)
350-
)
351-
actions["show_parameter"].toggled.connect(
352-
lambda checked: self.view.parameter_dock.setVisible(checked)
327+
actions["reset_view"] = QAction(
328+
qta.icon("mdi6.view-grid-plus"),
329+
"Reset View", self.view
353330
)
354-
actions["show_condition"].toggled.connect(
355-
lambda checked: self.view.condition_dock.setVisible(checked)
356-
)
357-
actions["show_logger"].toggled.connect(
358-
lambda checked: self.view.logger_dock.setVisible(checked)
359-
)
360-
actions["show_plot"].toggled.connect(
361-
lambda checked: self.view.plot_dock.setVisible(checked)
331+
actions["reset_view"].triggered.connect(
332+
self.view.default_view
362333
)
363334
# Clear Log
364335
actions["clear_log"] = QAction(
@@ -381,6 +352,30 @@ def setup_actions(self):
381352

382353
return actions
383354

355+
def sync_visibility_with_actions(self):
356+
"""Sync dock visibility and QAction states in both directions."""
357+
358+
dock_map = {
359+
"measurement": self.view.measurement_dock,
360+
"observable": self.view.observable_dock,
361+
"parameter": self.view.parameter_dock,
362+
"condition": self.view.condition_dock,
363+
"logger": self.view.logger_dock,
364+
"plot": self.view.plot_dock,
365+
}
366+
367+
for key, dock in dock_map.items():
368+
action = self.actions[f"show_{key}"]
369+
370+
# Initial sync: block signal to avoid triggering unwanted visibility changes
371+
was_blocked = action.blockSignals(True)
372+
action.setChecked(dock.isVisible())
373+
action.blockSignals(was_blocked)
374+
375+
# Connect QAction ↔ DockWidget syncing
376+
action.toggled.connect(dock.setVisible)
377+
dock.visibilityChanged.connect(action.setChecked)
378+
384379
def save_model(self):
385380
options = QFileDialog.Options()
386381
file_name, _ = QFileDialog.getSaveFileName(

src/petab_gui/views/main_view.py

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -46,38 +46,6 @@ def __init__(self):
4646
self.logger_dock.setWidget(self.logger_views[1])
4747
self.plot_dock = MeasuremenPlotter(self)
4848

49-
# Add docks to the QMainWindow of the data tab
50-
self.data_tab.addDockWidget(
51-
Qt.TopDockWidgetArea,
52-
self.measurement_dock
53-
)
54-
self.data_tab.splitDockWidget(
55-
self.measurement_dock, self.parameter_dock, Qt.Orientation.Vertical
56-
)
57-
self.data_tab.addDockWidget(
58-
Qt.TopDockWidgetArea,
59-
self.observable_dock
60-
)
61-
self.data_tab.splitDockWidget(
62-
self.observable_dock, self.condition_dock, Qt.Orientation.Vertical
63-
)
64-
self.data_tab.addDockWidget(
65-
Qt.BottomDockWidgetArea,
66-
self.logger_dock
67-
)
68-
self.data_tab.addDockWidget(
69-
Qt.BottomDockWidgetArea,
70-
self.plot_dock
71-
)
72-
self.data_tab.tabifyDockWidget(self.plot_dock, self.logger_dock)
73-
# TODO: Needs better initial sizing. @Frank can you help?
74-
self.data_tab.resizeDocks(
75-
[self.logger_dock, self.measurement_dock],
76-
[self.height() * 0.15, self.height() * 0.3],
77-
Qt.Vertical
78-
)
79-
80-
8149
# Connect the visibility changes of the QDockWidget instances to a slot that saves their visibility status
8250
self.dock_visibility = {
8351
self.condition_dock: self.condition_dock.isVisible(),
@@ -87,6 +55,7 @@ def __init__(self):
8755
self.logger_dock: self.logger_dock.isVisible(),
8856
self.plot_dock: self.plot_dock.isVisible(),
8957
}
58+
self.default_view()
9059
self.condition_dock.visibilityChanged.connect(
9160
self.save_dock_visibility
9261
)
@@ -120,6 +89,49 @@ def __init__(self):
12089

12190
self.find_replace_bar = None
12291

92+
def default_view(self):
93+
"""Reset the view to a fixed 3x2 grid using manual geometry."""
94+
if hasattr(self, "dock_visibility"):
95+
for dock in self.dock_visibility:
96+
dock.setParent(None) # fully remove from layout
97+
98+
self.tab_widget.setCurrentIndex(0)
99+
self.data_tab.updateGeometry()
100+
self.data_tab.repaint()
101+
102+
# Get available geometry
103+
available_rect = self.data_tab.contentsRect()
104+
width = available_rect.width() // 2
105+
height = available_rect.height() // 3
106+
x_left = available_rect.left()
107+
x_right = x_left + width
108+
y_positions = [available_rect.top() + i * height for i in range(3)]
109+
110+
# Define dock + positions
111+
layout = [
112+
(self.measurement_dock, x_left, y_positions[0]),
113+
(self.parameter_dock, x_left, y_positions[1]),
114+
(self.logger_dock, x_left, y_positions[2]),
115+
(self.observable_dock, x_right, self.measurement_dock),
116+
(self.condition_dock, x_right, self.parameter_dock),
117+
(self.plot_dock, x_right, self.logger_dock),
118+
]
119+
120+
for dock, x, y in layout:
121+
area = Qt.LeftDockWidgetArea
122+
if x == x_left:
123+
self.data_tab.addDockWidget(area, dock)
124+
dock.setFloating(True)
125+
dock.setGeometry(x, y, width, height)
126+
dock.setFloating(False)
127+
if x == x_right:
128+
self.data_tab.splitDockWidget(
129+
y, dock, Qt.Horizontal
130+
)
131+
132+
if hasattr(self, "dock_visibility"):
133+
for dock in self.dock_visibility:
134+
dock.setVisible(True)
123135

124136
def dragEnterEvent(self, event):
125137
if event.mimeData().hasUrls():
@@ -214,7 +226,6 @@ def load_settings(self):
214226
self.data_tab.restoreGeometry(settings.value("data_tab/geometry"))
215227
self.data_tab.restoreState(settings.value("data_tab/state"))
216228

217-
218229
def save_settings(self):
219230
"""Save the settings to the QSettings object."""
220231
settings = QSettings("petab", "petab_gui")

src/petab_gui/views/task_bar.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ def __init__(self, parent, actions):
106106
self.menu.addAction(actions["show_logger"])
107107
self.menu.addAction(actions["show_plot"])
108108
self.menu.addSeparator()
109+
self.menu.addAction(actions["reset_view"])
109110
self.menu.addAction(actions["clear_log"])
110111

111112

0 commit comments

Comments
 (0)