Skip to content

Commit 78cb182

Browse files
Hide SBML View (#210)
* possibility to hide SBML view. * Allow hiding via rightclick, added as tooltip
1 parent 53e1fcb commit 78cb182

4 files changed

Lines changed: 77 additions & 4 deletions

File tree

src/petab_gui/controllers/mother_controller.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,9 @@ def setup_actions(self):
444444
actions["show_plot"] = QAction("Data Plot", self.view)
445445
actions["show_plot"].setCheckable(True)
446446
actions["show_plot"].setChecked(True)
447+
actions["show_sbml_editor"] = QAction("SBML Editor", self.view)
448+
actions["show_sbml_editor"].setCheckable(True)
449+
actions["show_sbml_editor"].setChecked(True)
447450

448451
# What's This action
449452
actions["whats_this"] = QAction(
@@ -536,6 +539,16 @@ def sync_visibility_with_actions(self):
536539
action.toggled.connect(dock.setVisible)
537540
dock.visibilityChanged.connect(action.setChecked)
538541

542+
# Connect SBML editor visibility toggle
543+
sbml_action = self.actions["show_sbml_editor"]
544+
sbml_widget = self.view.sbml_viewer.sbml_widget
545+
546+
# Store action reference in view for context menus
547+
self.view.sbml_viewer.sbml_toggle_action = sbml_action
548+
549+
# Connect menu action to widget visibility
550+
sbml_action.toggled.connect(sbml_widget.setVisible)
551+
539552
def save_model(self):
540553
options = QFileDialog.Options()
541554
file_name, filtering = QFileDialog.getSaveFileName(

src/petab_gui/models/tooltips.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ def cell_tip(table: str, column: str) -> str:
177177
"<b>SBML (XML) view</b><br>"
178178
"• Edit or paste valid SBML.<br>"
179179
"• Use <i>Forward → Antimony</i> to sync.<br>"
180-
"• Some constructs may not round-trip."
180+
"• Some constructs may not round-trip.<br>"
181+
"• Hide/show via <i>View → SBML Editor</i> menu."
181182
)
182183

183184
ANTIMONY_VIEW_TOOLTIP = (

src/petab_gui/views/sbml_view.py

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""Widget for viewing the SBML model."""
22

3+
import qtawesome as qta
34
from PySide6.QtCore import Qt
45
from PySide6.QtWidgets import (
56
QLabel,
@@ -20,6 +21,9 @@ class SbmlViewer(QWidget):
2021
def __init__(self, parent=None, logger_view=None):
2122
super().__init__(parent)
2223

24+
# Reference to menu action (set by controller)
25+
self.sbml_toggle_action = None
26+
2327
# Main layout for the SBML tab
2428
layout = QVBoxLayout(self)
2529
vertical_splitter = QSplitter(Qt.Vertical)
@@ -36,6 +40,11 @@ def __init__(self, parent=None, logger_view=None):
3640
self.sbml_text_edit.setWhatsThis(
3741
WHATS_THIS["sbml_view"]["sbml_editor"]
3842
)
43+
# Enable custom context menu
44+
self.sbml_text_edit.setContextMenuPolicy(Qt.CustomContextMenu)
45+
self.sbml_text_edit.customContextMenuRequested.connect(
46+
self._show_sbml_context_menu
47+
)
3948
sbml_layout.addWidget(self.sbml_text_edit)
4049

4150
# Add forward changes button for SBML
@@ -51,21 +60,26 @@ def __init__(self, parent=None, logger_view=None):
5160
self.sbml_text_edit.setWhatsThis(
5261
WHATS_THIS["sbml_view"]["antimony_editor"]
5362
)
63+
# Enable custom context menu
64+
self.antimony_text_edit.setContextMenuPolicy(Qt.CustomContextMenu)
65+
self.antimony_text_edit.customContextMenuRequested.connect(
66+
self._show_antimony_context_menu
67+
)
5468
antimony_layout.addWidget(self.antimony_text_edit)
5569

5670
# Add forward changes button for Antimony
5771
self.forward_antimony_button = QPushButton("Forward Changes to SBML")
5872
antimony_layout.addWidget(self.forward_antimony_button)
5973

6074
# Create widgets to hold SBML and Antimony sections
61-
sbml_widget = QWidget()
62-
sbml_widget.setLayout(sbml_layout)
75+
self.sbml_widget = QWidget()
76+
self.sbml_widget.setLayout(sbml_layout)
6377

6478
antimony_widget = QWidget()
6579
antimony_widget.setLayout(antimony_layout)
6680

6781
# Add widgets to the splitter
68-
splitter.addWidget(sbml_widget)
82+
splitter.addWidget(self.sbml_widget)
6983
splitter.addWidget(antimony_widget)
7084

7185
# Add the splitter to the main layout
@@ -75,3 +89,47 @@ def __init__(self, parent=None, logger_view=None):
7589
layout.addWidget(vertical_splitter)
7690
vertical_splitter.setStretchFactor(0, 7)
7791
vertical_splitter.setStretchFactor(1, 3)
92+
93+
def _show_sbml_context_menu(self, position):
94+
"""Show context menu for SBML text edit."""
95+
if not self.sbml_toggle_action:
96+
return
97+
98+
menu = self.sbml_text_edit.createStandardContextMenu()
99+
menu.addSeparator()
100+
101+
# Add hide SBML option
102+
hide_action = menu.addAction(
103+
qta.icon("mdi6.chevron-left"), "Hide SBML Editor"
104+
)
105+
hide_action.triggered.connect(
106+
lambda: self.sbml_toggle_action.setChecked(False)
107+
)
108+
109+
menu.exec(self.sbml_text_edit.mapToGlobal(position))
110+
111+
def _show_antimony_context_menu(self, position):
112+
"""Show context menu for Antimony text edit."""
113+
if not self.sbml_toggle_action:
114+
return
115+
116+
menu = self.antimony_text_edit.createStandardContextMenu()
117+
menu.addSeparator()
118+
119+
# Add show/hide SBML option
120+
if self.sbml_widget.isVisible():
121+
action = menu.addAction(
122+
qta.icon("mdi6.chevron-left"), "Hide SBML Editor"
123+
)
124+
action.triggered.connect(
125+
lambda: self.sbml_toggle_action.setChecked(False)
126+
)
127+
else:
128+
action = menu.addAction(
129+
qta.icon("mdi6.chevron-right"), "Show SBML Editor"
130+
)
131+
action.triggered.connect(
132+
lambda: self.sbml_toggle_action.setChecked(True)
133+
)
134+
135+
menu.exec(self.antimony_text_edit.mapToGlobal(position))

src/petab_gui/views/task_bar.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ def __init__(self, parent, actions):
120120
self.menu.addAction(actions["show_plot"])
121121
self.menu.addAction(actions["show_visualization"])
122122
self.menu.addAction(actions["show_simulation"])
123+
self.menu.addAction(actions["show_sbml_editor"])
123124
self.menu.addSeparator()
124125
self.menu.addAction(actions["reset_view"])
125126
self.menu.addAction(actions["clear_log"])

0 commit comments

Comments
 (0)