Skip to content

Commit f064b34

Browse files
committed
Fixed plotter storing correct tab when switching plot types
1 parent 855c517 commit f064b34

File tree

2 files changed

+74
-22
lines changed

2 files changed

+74
-22
lines changed

src/ert/gui/tools/plot/plot_window.py

+27-12
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535
STATISTICS = "Statistics"
3636
STD_DEV = "Std Dev"
3737

38+
RESPONSE_DEFAULT = 0
39+
GEN_KW_DEFAULT = 2
40+
STD_DEV_DEFAULT = 6
41+
3842
logger = logging.getLogger(__name__)
3943

4044
from qtpy.QtWidgets import (
@@ -137,7 +141,15 @@ def __init__(self, config_file: str, parent: QWidget | None):
137141
self.addPlotWidget(CROSS_ENSEMBLE_STATISTICS, CrossEnsembleStatisticsPlot())
138142
self.addPlotWidget(STD_DEV, StdDevPlot())
139143
self._central_tab.currentChanged.connect(self.currentTabChanged)
140-
self._prev_tab_widget: QWidget | None = None
144+
145+
self._prev_tab_widget_index = -1
146+
self._current_tab_index = -1
147+
self._prev_key_dimensionality = -1
148+
self._prev_tab_widget_index_map: dict[int, int] = {
149+
2: RESPONSE_DEFAULT,
150+
1: GEN_KW_DEFAULT,
151+
3: STD_DEV_DEFAULT,
152+
}
141153

142154
QApplication.setOverrideCursor(Qt.CursorShape.WaitCursor)
143155
try:
@@ -166,6 +178,7 @@ def __init__(self, config_file: str, parent: QWidget | None):
166178

167179
@Slot(int)
168180
def currentTabChanged(self, index: Any) -> None:
181+
self._current_tab_index = index
169182
self.updatePlot()
170183

171184
@Slot(int)
@@ -334,7 +347,6 @@ def keySelected(self) -> None:
334347
for widget in self._plot_widgets
335348
if widget._plotter.dimensionality == key_def.dimensionality
336349
]
337-
338350
current_widget = self._central_tab.currentWidget()
339351

340352
# Enabling/disabling tab triggers the
@@ -350,17 +362,20 @@ def keySelected(self) -> None:
350362
)
351363
self._central_tab.currentChanged.connect(self.currentTabChanged)
352364

353-
# Remember which tab widget was selected when switching between
354-
# both same and different data-types.
355-
if current_widget in available_widgets:
356-
self._central_tab.setCurrentWidget(current_widget)
357-
else:
358-
if self._prev_tab_widget is None:
359-
self._central_tab.setCurrentWidget(available_widgets[0])
360-
else:
361-
self._central_tab.setCurrentWidget(self._prev_tab_widget)
362-
self._prev_tab_widget = current_widget
365+
if 0 < self._prev_key_dimensionality != key_def.dimensionality:
366+
if self._current_tab_index == -1:
367+
self._current_tab_index = self._prev_tab_widget_index
368+
self._prev_tab_widget_index_map[self._prev_key_dimensionality] = (
369+
self._current_tab_index
370+
)
371+
current_widget = self._central_tab.widget(
372+
self._prev_tab_widget_index_map[key_def.dimensionality]
373+
)
374+
self._current_tab_index = -1
363375

376+
self._central_tab.setCurrentWidget(current_widget)
377+
self._prev_tab_widget_index = self._central_tab.currentIndex()
378+
self._prev_key_dimensionality = key_def.dimensionality
364379
self.updatePlot()
365380

366381
def toggleCustomizeDialog(self) -> None:

tests/ert/ui_tests/gui/test_main_window.py

+47-10
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,12 @@
4646
from ert.gui.tools.plot.plot_ensemble_selection_widget import (
4747
EnsembleSelectListWidget,
4848
)
49-
from ert.gui.tools.plot.plot_window import PlotApi, PlotWindow
49+
from ert.gui.tools.plot.plot_window import (
50+
GEN_KW_DEFAULT,
51+
RESPONSE_DEFAULT,
52+
PlotApi,
53+
PlotWindow,
54+
)
5055
from ert.plugins import ErtPluginManager
5156
from ert.run_models import (
5257
EnsembleExperiment,
@@ -341,21 +346,53 @@ def test_that_the_plot_window_contains_the_expected_elements(
341346
"Std Dev",
342347
}
343348

344-
# Cycle through showing all the tabs and plot each data key
345-
346349
model = data_keys.model()
347350
assert model is not None
351+
352+
def click_plotter_item(pos: int) -> None:
353+
center = data_keys.visualRect(model.index(pos, 0)).center()
354+
viewport = data_keys.viewport()
355+
center = viewport.mapToGlobal(center)
356+
local_pos = viewport.mapFromGlobal(center)
357+
qtbot.mouseClick(data_keys.viewport(), Qt.LeftButton, pos=local_pos)
358+
359+
def click_tab_index(pos: int) -> None:
360+
tab_bar = plot_window._central_tab.tabBar()
361+
tab_center = tab_bar.tabRect(pos).center()
362+
qtbot.mouseClick(tab_bar, Qt.LeftButton, pos=tab_center)
363+
364+
# make sure plotter remembers plot types selected previously
365+
response_index = 0
366+
gen_kw_index = 1
367+
response_alternate_index = 1
368+
gen_kw_alternate_index = 3
369+
370+
# check default selections
371+
click_plotter_item(response_index)
372+
assert plot_window._central_tab.currentIndex() == RESPONSE_DEFAULT
373+
click_plotter_item(gen_kw_index)
374+
assert plot_window._central_tab.currentIndex() == GEN_KW_DEFAULT
375+
376+
# alter selections
377+
click_plotter_item(response_index)
378+
click_tab_index(response_alternate_index)
379+
click_plotter_item(gen_kw_index)
380+
click_tab_index(gen_kw_alternate_index)
381+
382+
# verify previous selections still valid
383+
click_plotter_item(response_index)
384+
assert plot_window._central_tab.currentIndex() == response_alternate_index
385+
click_plotter_item(gen_kw_index)
386+
assert plot_window._central_tab.currentIndex() == gen_kw_alternate_index
387+
388+
# finally click all items
348389
for i in range(model.rowCount()):
349-
index = model.index(i, 0)
350-
qtbot.mouseClick(
351-
data_types.data_type_keys_widget,
352-
Qt.LeftButton,
353-
pos=data_types.data_type_keys_widget.visualRect(index).center(),
354-
)
390+
click_plotter_item(i)
355391
for tab_index in range(plot_window._central_tab.count()):
356392
if not plot_window._central_tab.isTabEnabled(tab_index):
357393
continue
358-
plot_window._central_tab.setCurrentIndex(tab_index)
394+
click_tab_index(tab_index)
395+
359396
plot_window.close()
360397

361398

0 commit comments

Comments
 (0)