3
3
import datetime
4
4
import functools
5
5
import webbrowser
6
- from typing import TYPE_CHECKING , Optional
6
+ from typing import Dict , Optional
7
7
8
8
from qtpy .QtCore import QSize , Qt , Signal , Slot
9
9
from qtpy .QtGui import QCloseEvent , QCursor , QIcon
28
28
from ert .gui .tools .event_viewer import EventViewerTool , GUILogHandler
29
29
from ert .gui .tools .export import ExportTool
30
30
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
33
33
from ert .gui .tools .plugins import PluginHandler , PluginsTool
34
34
from ert .gui .tools .workflows import WorkflowsTool
35
35
from ert .plugins import ErtPluginManager
36
36
37
- if TYPE_CHECKING :
38
- from ert .gui .tools import Tool
39
-
40
37
BUTTON_STYLE_SHEET : str = """
41
38
QPushButton {
42
39
border: 2px solid darkgrey;
@@ -83,40 +80,48 @@ def __init__(
83
80
self .log_handler = log_handler
84
81
85
82
self .setWindowTitle (f"ERT - { config_file } - { find_ert_info ()} " )
86
- self .dialog_panels : list [RunDialog ] = []
87
- self .central_panels : list [QWidget ] = []
88
-
89
83
self .plugin_manager = plugin_manager
90
84
self .central_widget = QFrame (self )
91
85
self .central_layout = QHBoxLayout (self .central_widget )
92
86
self .central_layout .setContentsMargins (0 , 0 , 0 , 0 )
87
+ self .central_layout .setSpacing (0 )
93
88
self .central_widget .setLayout (self .central_layout )
94
-
95
89
self .facade = LibresFacade (self .ert_config )
96
-
97
90
self .side_frame = QFrame (self )
98
- self .side_frame .setFrameShape (QFrame .Box )
99
91
self .vbox_layout = QVBoxLayout (self .side_frame )
100
92
self .side_frame .setLayout (self .vbox_layout )
101
93
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 ] = {}
105
95
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" )
110
98
)
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 )
111
114
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" ))
113
117
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
+ )
117
123
self .results_button .setEnabled (False )
118
- menu = QMenu ()
119
- self .results_button .setMenu (menu )
124
+ self .results_button .setMenu (QMenu ())
120
125
121
126
self .vbox_layout .addStretch ()
122
127
self .central_layout .addWidget (self .side_frame )
@@ -128,44 +133,34 @@ def __init__(
128
133
self .__add_tools_menu ()
129
134
self .__add_help_menu ()
130
135
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
+
131
148
@Slot (object )
132
149
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 () :
134
151
widget .setVisible (False )
135
152
136
- self .dialog_panels .append (run_dialog )
137
-
138
153
run_dialog .setParent (self )
139
154
self .central_layout .addWidget (run_dialog )
140
155
self .results_button .setEnabled (True )
141
156
date_time = datetime .datetime .utcnow ().strftime ("%Y-%d-%m %H:%M:%S" )
157
+ self .central_panels_map [date_time ] = run_dialog
142
158
act = self .results_button .menu ()
143
159
144
160
if act :
145
161
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 )
169
164
170
165
def post_init (self ) -> None :
171
166
experiment_panel = ExperimentPanel (
@@ -175,7 +170,7 @@ def post_init(self) -> None:
175
170
self .facade .get_ensemble_size (),
176
171
)
177
172
self .central_layout .addWidget (experiment_panel )
178
- self .central_panels . append ( experiment_panel )
173
+ self .central_panels_map [ "Start Simulation" ] = experiment_panel
179
174
180
175
experiment_panel .experiment_started .connect (self .slot_add_widget )
181
176
@@ -189,46 +184,31 @@ def post_init(self) -> None:
189
184
self .plugins_tool .setParent (self )
190
185
self .menuBar ().addMenu (self .plugins_tool .get_menu ())
191
186
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 :
193
198
button = QPushButton (self .side_frame )
194
199
button .setFixedSize (80 , 80 )
195
200
button .setCursor (QCursor (Qt .PointingHandCursor ))
196
201
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 )
205
207
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 )
214
208
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
232
212
233
213
def __add_help_menu (self ) -> None :
234
214
menuBar = self .menuBar ()
0 commit comments