Skip to content

Commit 81bc635

Browse files
committed
Make all windows embedded into the central layout
1 parent b5574bb commit 81bc635

File tree

2 files changed

+68
-91
lines changed

2 files changed

+68
-91
lines changed

src/ert/gui/main_window.py

+66-86
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import datetime
44
import functools
55
import webbrowser
6-
from typing import TYPE_CHECKING, Optional
6+
from typing import Dict, Optional
77

88
from qtpy.QtCore import QSize, Qt, Signal, Slot
99
from qtpy.QtGui import QCloseEvent, QCursor, QIcon
@@ -28,15 +28,12 @@
2828
from ert.gui.tools.event_viewer import EventViewerTool, GUILogHandler
2929
from ert.gui.tools.export import ExportTool
3030
from ert.gui.tools.load_results import LoadResultsTool
31-
from ert.gui.tools.manage_experiments import ManageExperimentsTool
32-
from ert.gui.tools.plot import PlotTool
31+
from ert.gui.tools.manage_experiments import ManageExperimentsPanel
32+
from ert.gui.tools.plot.plot_window import PlotWindow
3333
from ert.gui.tools.plugins import PluginHandler, PluginsTool
3434
from ert.gui.tools.workflows import WorkflowsTool
3535
from ert.plugins import ErtPluginManager
3636

37-
if TYPE_CHECKING:
38-
from ert.gui.tools import Tool
39-
4037
BUTTON_STYLE_SHEET: str = """
4138
QPushButton {
4239
border: 2px solid darkgrey;
@@ -83,40 +80,48 @@ def __init__(
8380
self.log_handler = log_handler
8481

8582
self.setWindowTitle(f"ERT - {config_file} - {find_ert_info()}")
86-
self.dialog_panels: list[RunDialog] = []
87-
self.central_panels: list[QWidget] = []
88-
8983
self.plugin_manager = plugin_manager
9084
self.central_widget = QFrame(self)
9185
self.central_layout = QHBoxLayout(self.central_widget)
9286
self.central_layout.setContentsMargins(0, 0, 0, 0)
87+
self.central_layout.setSpacing(0)
9388
self.central_widget.setLayout(self.central_layout)
94-
9589
self.facade = LibresFacade(self.ert_config)
96-
9790
self.side_frame = QFrame(self)
98-
self.side_frame.setFrameShape(QFrame.Box)
9991
self.vbox_layout = QVBoxLayout(self.side_frame)
10092
self.side_frame.setLayout(self.vbox_layout)
10193

102-
self.add_experiment_button()
103-
self._plot_tool = PlotTool(self.config_file, self)
104-
self._create_sidebar_button(self._plot_tool)
94+
self.central_panels_map: Dict[str, QWidget] = {}
10595

106-
self._manage_experiments_tool = ManageExperimentsTool(
107-
self.ert_config,
108-
self.notifier,
109-
self.ert_config.model_config.num_realizations,
96+
button = self._add_sidebar_button(
97+
"Start Simulation", QIcon("img:play_circle_outlined.svg")
11098
)
99+
menu = QMenu()
100+
menu.setStyleSheet(MENU_ITEM_STYLE_SHEET)
101+
102+
for sim_mode in [
103+
"Single test run",
104+
"Ensemble Experiment",
105+
"Manual Update",
106+
"ES MDA",
107+
"Ensemble Smoother",
108+
]:
109+
act = menu.addAction(sim_mode)
110+
act.triggered.connect(self.select_central_widget)
111+
# todo use sim modes to select correct panels directly
112+
act.setProperty("index", "Start Simulation")
113+
button.setMenu(menu)
111114

112-
self._create_sidebar_button(self._manage_experiments_tool)
115+
self._plot_window: Optional[PlotWindow] = None
116+
self._add_sidebar_button("Create plot", QIcon("img:timeline.svg"))
113117

114-
self.results_button = self._create_sidebar_button()
115-
self.results_button.setIcon(QIcon("img:in_progress.svg"))
116-
self.results_button.setToolTip("Show Results")
118+
self._manage_experiments_panel: Optional[ManageExperimentsPanel] = None
119+
self._add_sidebar_button("Manage experiments", QIcon("img:build_wrench.svg"))
120+
self.results_button = self._add_sidebar_button(
121+
"Show Results", QIcon("img:in_progress.svg")
122+
)
117123
self.results_button.setEnabled(False)
118-
menu = QMenu()
119-
self.results_button.setMenu(menu)
124+
self.results_button.setMenu(QMenu())
120125

121126
self.vbox_layout.addStretch()
122127
self.central_layout.addWidget(self.side_frame)
@@ -128,44 +133,34 @@ def __init__(
128133
self.__add_tools_menu()
129134
self.__add_help_menu()
130135

136+
def select_central_widget(self):
137+
actor = self.sender()
138+
index_name = actor.property("index")
139+
140+
if index_name == "Create plot" and not self._plot_window:
141+
self._plot_window = PlotWindow(self.config_file, self)
142+
self.central_layout.addWidget(self._plot_window)
143+
self.central_panels_map["Create plot"] = self._plot_window
144+
145+
for i, widget in self.central_panels_map.items():
146+
widget.setVisible(i == index_name)
147+
131148
@Slot(object)
132149
def slot_add_widget(self, run_dialog: RunDialog) -> None:
133-
for widget in self.central_panels:
150+
for widget in self.central_panels_map.values():
134151
widget.setVisible(False)
135152

136-
self.dialog_panels.append(run_dialog)
137-
138153
run_dialog.setParent(self)
139154
self.central_layout.addWidget(run_dialog)
140155
self.results_button.setEnabled(True)
141156
date_time = datetime.datetime.utcnow().strftime("%Y-%d-%m %H:%M:%S")
157+
self.central_panels_map[date_time] = run_dialog
142158
act = self.results_button.menu()
143159

144160
if act:
145161
act.addAction(date_time)
146-
act.setProperty("index", len(self.dialog_panels) - 1)
147-
act.triggered.connect(self.select_dialog_panel)
148-
149-
def select_dialog_panel(self) -> None:
150-
actor = self.sender()
151-
index = int(actor.property("index")) if actor else 0
152-
153-
for w in self.central_panels:
154-
w.hide()
155-
156-
for i in range(len(self.dialog_panels)):
157-
should_be_visible = i == index
158-
self.dialog_panels[i].setVisible(should_be_visible)
159-
160-
def select_widget(self) -> None:
161-
index = 0
162-
163-
for w in self.dialog_panels:
164-
w.hide()
165-
166-
for i in range(len(self.central_panels)):
167-
should_be_visible = i == index
168-
self.central_panels[i].setVisible(should_be_visible)
162+
act.setProperty("index", date_time)
163+
act.triggered.connect(self.select_central_widget)
169164

170165
def post_init(self) -> None:
171166
experiment_panel = ExperimentPanel(
@@ -175,7 +170,7 @@ def post_init(self) -> None:
175170
self.facade.get_ensemble_size(),
176171
)
177172
self.central_layout.addWidget(experiment_panel)
178-
self.central_panels.append(experiment_panel)
173+
self.central_panels_map["Start Simulation"] = experiment_panel
179174

180175
experiment_panel.experiment_started.connect(self.slot_add_widget)
181176

@@ -189,46 +184,31 @@ def post_init(self) -> None:
189184
self.plugins_tool.setParent(self)
190185
self.menuBar().addMenu(self.plugins_tool.get_menu())
191186

192-
def _create_sidebar_button(self, tool: Optional[Tool] = None) -> QPushButton:
187+
self._manage_experiments_panel = ManageExperimentsPanel(
188+
self.ert_config,
189+
self.notifier,
190+
self.ert_config.model_config.num_realizations,
191+
)
192+
193+
self.central_panels_map["Manage experiments"] = self._manage_experiments_panel
194+
self._manage_experiments_panel.hide()
195+
self.central_layout.addWidget(self._manage_experiments_panel)
196+
197+
def _add_sidebar_button(self, name: str, icon: QIcon) -> QPushButton:
193198
button = QPushButton(self.side_frame)
194199
button.setFixedSize(80, 80)
195200
button.setCursor(QCursor(Qt.PointingHandCursor))
196201
button.setStyleSheet(BUTTON_STYLE_SHEET)
197-
padding = 30
198-
button.setIconSize(
199-
QSize(button.size().width() - padding, button.size().height() - padding)
200-
)
201-
if tool:
202-
button.setIcon(QIcon(tool.getIcon()))
203-
button.setToolTip(tool.getName())
204-
button.clicked.connect(tool.trigger)
202+
pad = 30
203+
icon_size = QSize(button.size().width() - pad, button.size().height() - pad)
204+
button.setIconSize(icon_size)
205+
button.setIcon(icon)
206+
button.setToolTip(name)
205207
self.vbox_layout.addWidget(button)
206-
button.setProperty("index", len(self.central_panels) - 1)
207-
return button
208-
209-
def add_experiment_button(self) -> None:
210-
button = self._create_sidebar_button()
211-
button.setIcon(QIcon("img:play_circle_outlined.svg"))
212-
button.setToolTip("Start Simulation")
213-
button.clicked.connect(self.select_widget)
214208

215-
menu = QMenu()
216-
menu.setStyleSheet(MENU_ITEM_STYLE_SHEET)
217-
218-
for sim_mode in [
219-
"Single test run",
220-
"Ensemble Experiment",
221-
"Manual Update",
222-
"ES MDA",
223-
"Ensemble Smoother",
224-
]:
225-
act = menu.addAction(sim_mode)
226-
act.triggered.connect(self.select_widget)
227-
button.setMenu(menu)
228-
229-
def toggle_visibility(self) -> None:
230-
for panel in self.central_panels:
231-
panel.show()
209+
button.clicked.connect(self.select_central_widget)
210+
button.setProperty("index", name)
211+
return button
232212

233213
def __add_help_menu(self) -> None:
234214
menuBar = self.menuBar()

src/ert/gui/simulation/experiment_panel.py

+2-5
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,14 @@ def __init__(
8989
)
9090

9191
experiment_type_layout = QHBoxLayout()
92-
experiment_type_layout.addSpacing(10)
92+
experiment_type_layout.setContentsMargins(0, 0, 0, 0)
9393
experiment_type_layout.addWidget(
9494
QLabel("Experiment type:"), 0, Qt.AlignmentFlag.AlignVCenter
9595
)
9696
experiment_type_layout.addWidget(
9797
self._experiment_type_combo, 0, Qt.AlignmentFlag.AlignVCenter
9898
)
9999

100-
experiment_type_layout.addSpacing(20)
101-
102100
self.run_button = QToolButton()
103101
self.run_button.setObjectName("run_experiment")
104102
self.run_button.setText(EXPERIMENT_READY_TO_RUN_BUTTON_MESSAGE)
@@ -110,9 +108,8 @@ def __init__(
110108
experiment_type_layout.addWidget(self.run_button)
111109
experiment_type_layout.addStretch(1)
112110

113-
layout.addSpacing(5)
111+
layout.setContentsMargins(0, 0, 10, 10)
114112
layout.addLayout(experiment_type_layout)
115-
layout.addSpacing(10)
116113

117114
self._experiment_stack = QStackedWidget()
118115
self._experiment_stack.setLineWidth(1)

0 commit comments

Comments
 (0)