Skip to content

Commit

Permalink
Fix resizing of experiment manager on macos (#8039)
Browse files Browse the repository at this point in the history
* Fix resizing of experiment manager on macos

* Fix tests
  • Loading branch information
frode-aarstad committed Jun 6, 2024
1 parent 10cfe53 commit ba78c6b
Show file tree
Hide file tree
Showing 7 changed files with 167 additions and 158 deletions.
1 change: 1 addition & 0 deletions src/ert/gui/ertwidgets/storage_info_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,7 @@ def __init__(self) -> None:
self._ensemble_widget = _EnsembleWidget()
self._realization_widget = _RealizationWidget()
empty_widget = QWidget()
self.setMinimumWidth(200)

self._content_layout = QStackedLayout()
self._content_layout.insertWidget(_WidgetType.EMPTY_WIDGET, empty_widget)
Expand Down
7 changes: 4 additions & 3 deletions src/ert/gui/ertwidgets/storage_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def __init__(
self._notifier = notifier
self._ert_config = ert_config
self._ensemble_size = ensemble_size
self.setMinimumWidth(700)
self.setMinimumWidth(500)

self._tree_view = QTreeView(self)
storage_model = StorageModel(self._notifier.storage)
Expand All @@ -84,8 +84,9 @@ def __init__(
selection_model = QItemSelectionModel(proxy_model)
self._tree_view.setSelectionModel(selection_model)
self._tree_view.selectionModel().currentChanged.connect(self._currentChanged)
self._tree_view.setColumnWidth(0, 350)
self._tree_view.setColumnWidth(1, 150)
self._tree_view.setColumnWidth(0, 225)
self._tree_view.setColumnWidth(1, 125)
self._tree_view.setColumnWidth(2, 100)

self._create_experiment_button = AddWidget(self._addItem)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from typing import TYPE_CHECKING, List, Tuple

from qtpy.QtCore import Qt
from qtpy.QtCore import QEvent, QObject, Qt
from qtpy.QtWidgets import (
QHBoxLayout,
QLabel,
Expand All @@ -14,6 +14,7 @@

from ert.config import ErtConfig
from ert.enkf_main import sample_prior
from ert.gui.ertnotifier import ErtNotifier
from ert.gui.ertwidgets import showWaitCursorWhileWaiting
from ert.gui.ertwidgets.checklist import CheckList
from ert.gui.ertwidgets.ensembleselector import EnsembleSelector
Expand Down Expand Up @@ -57,16 +58,18 @@ def createRow(*widgets: CheckList) -> QHBoxLayout:


class EnsembleInitializationConfigurationPanel(QTabWidget):
@showWaitCursorWhileWaiting
def __init__(
self, config: ErtConfig, notifier: ErtNotifier, ensemble_size: int
) -> None:
def __init__(self, config: ErtConfig, notifier: ErtNotifier, ensemble_size: int):
QTabWidget.__init__(self)
self.ert_config = config
self.ensemble_size = ensemble_size
self.notifier = notifier
self._addCreateNewEnsembleTab()
self._addInitializeFromScratchTab()
self.installEventFilter(self)

self.setWindowTitle("Manage experiments")
self.setMinimumWidth(850)
self.setMinimumHeight(250)

def _addCreateNewEnsembleTab(self) -> None:
panel = QWidget()
Expand All @@ -79,7 +82,7 @@ def _addCreateNewEnsembleTab(self) -> None:
self._storage_info_widget = StorageInfoWidget()

layout.addWidget(storage_widget)
layout.addWidget(self._storage_info_widget)
layout.addWidget(self._storage_info_widget, stretch=1)
panel.setLayout(layout)

storage_widget.onSelectExperiment.connect(
Expand Down Expand Up @@ -135,8 +138,12 @@ def update_button_state() -> None:
initialize_button.clicked.connect(target_ensemble.populate)

layout.addWidget(initialize_button, 0, Qt.AlignmentFlag.AlignCenter)

layout.addSpacing(10)

panel.setLayout(layout)

self.addTab(panel, "Initialize from scratch")

def eventFilter(self, watched: QObject, event: QEvent):
if event.type() == QEvent.Type.Close:
self.notifier.emitErtChange()
return super().eventFilter(watched, event)
27 changes: 14 additions & 13 deletions src/ert/gui/tools/manage_experiments/manage_experiments_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,34 @@

from typing import TYPE_CHECKING

from qtpy.QtCore import Qt
from qtpy.QtGui import QIcon

from ert.gui.ertwidgets.closabledialog import ClosableDialog
from ert.gui.tools import Tool
from ert.gui.tools.manage_experiments.ensemble_init_configuration import (
EnsembleInitializationConfigurationPanel,
)

if TYPE_CHECKING:
from ert.config import ErtConfig
from ert.gui.ertnotifier import ErtNotifier


class ManageExperimentsTool(Tool):
def __init__(self, config: ErtConfig, notifier, ensemble_size: int):
def __init__(self, config: ErtConfig, notifier: ErtNotifier, ensemble_size: int):
super().__init__("Manage experiments", QIcon("img:build_wrench.svg"))
self.notifier = notifier
self.ert_config = config
self.ensemble_size = ensemble_size
super().__init__("Manage experiments", QIcon("img:build_wrench.svg"))
self._ensemble_management_widget = None

def trigger(self):
ensemble_management_widget = EnsembleInitializationConfigurationPanel(
self.ert_config, self.notifier, self.ensemble_size
)

dialog = ClosableDialog(
"Manage experiments", ensemble_management_widget, self.parent()
)
dialog.setObjectName("manage-experiments")
dialog.exec_()
self.notifier.emitErtChange()
if not self._ensemble_management_widget:
self._ensemble_management_widget = EnsembleInitializationConfigurationPanel(
self.ert_config, self.notifier, self.ensemble_size
)
self._ensemble_management_widget.setWindowModality(
Qt.WindowModality.ApplicationModal
)

self._ensemble_management_widget.show()
49 changes: 20 additions & 29 deletions tests/unit_tests/gui/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,26 +43,15 @@
from ert.gui.simulation.run_dialog import RunDialog
from ert.gui.simulation.view import RealizationWidget
from ert.gui.tools.load_results.load_results_panel import LoadResultsPanel
from ert.gui.tools.manage_experiments.ensemble_init_configuration import (
EnsembleInitializationConfigurationPanel,
from ert.gui.tools.manage_experiments.manage_experiments_tool import (
ManageExperimentsTool,
)
from ert.run_models import EnsembleExperiment, MultipleDataAssimilation
from ert.services import StorageService
from ert.storage import Storage, open_storage
from tests.unit_tests.gui.simulation.test_run_path_dialog import handle_run_path_dialog


def with_manage_tool(gui, qtbot: QtBot, callback) -> None:
def handle_manage_dialog():
dialog = wait_for_child(gui, qtbot, ClosableDialog, name="manage-experiments")
cases_panel = get_child(dialog, EnsembleInitializationConfigurationPanel)
callback(dialog, cases_panel)

QTimer.singleShot(1000, handle_manage_dialog)
manage_tool = gui.tools["Manage experiments"]
manage_tool.trigger()


@pytest.fixture
def opened_main_window(
source_root, tmp_path, monkeypatch
Expand Down Expand Up @@ -548,27 +537,29 @@ def handle_popup_dialog():
def add_experiment_manually(
qtbot, gui, experiment_name="My experiment", ensemble_name="default"
):
def handle_dialog(dialog, experiments_panel):
# Open the create new experiment tab
experiments_panel.setCurrentIndex(0)
current_tab = experiments_panel.currentWidget()
assert current_tab.objectName() == "create_new_ensemble_tab"
storage_widget = get_child(current_tab, StorageWidget)
add_widget = get_child(storage_widget, AddWidget)
manage_tool = gui.tools["Manage experiments"]
manage_tool.trigger()

def handle_add_dialog():
dialog = wait_for_child(gui, qtbot, CreateExperimentDialog)
dialog._experiment_edit.setText(experiment_name)
dialog._ensemble_edit.setText(ensemble_name)
assert isinstance(manage_tool, ManageExperimentsTool)
experiments_panel = manage_tool._ensemble_management_widget

qtbot.mouseClick(dialog._ok_button, Qt.MouseButton.LeftButton)
# Open the create new experiment tab
experiments_panel.setCurrentIndex(0)
current_tab = experiments_panel.currentWidget()
assert current_tab.objectName() == "create_new_ensemble_tab"
storage_widget = get_child(current_tab, StorageWidget)

QTimer.singleShot(1000, handle_add_dialog)
qtbot.mouseClick(add_widget.addButton, Qt.MouseButton.LeftButton)
def handle_add_dialog():
dialog = wait_for_child(current_tab, qtbot, CreateExperimentDialog)
dialog._experiment_edit.setText(experiment_name)
dialog._ensemble_edit.setText(ensemble_name)
qtbot.mouseClick(dialog._ok_button, Qt.MouseButton.LeftButton)

dialog.close()
QTimer.singleShot(1000, handle_add_dialog)
add_widget = get_child(storage_widget, AddWidget)
qtbot.mouseClick(add_widget.addButton, Qt.MouseButton.LeftButton)

with_manage_tool(gui, qtbot, handle_dialog)
experiments_panel.close()


V = TypeVar("V")
Expand Down
40 changes: 23 additions & 17 deletions tests/unit_tests/gui/test_full_manual_update_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,13 @@
from ert.gui.simulation.evaluate_ensemble_panel import EvaluateEnsemblePanel
from ert.gui.simulation.experiment_panel import ExperimentPanel
from ert.gui.simulation.run_dialog import RunDialog
from ert.gui.tools.manage_experiments.manage_experiments_tool import (
ManageExperimentsTool,
)
from ert.run_models.evaluate_ensemble import EvaluateEnsemble
from ert.validation import rangestring_to_mask

from .conftest import get_child, wait_for_child, with_manage_tool
from .conftest import get_child, wait_for_child


def test_that_the_manual_analysis_tool_works(ensemble_experiment_has_run, qtbot):
Expand Down Expand Up @@ -71,22 +74,25 @@ def handle_dialog():
analysis_tool.trigger()

# Open the manage experiments dialog
def handle_manage_dialog(dialog, cases_panel):
# In the "create new case" tab, it should now contain "iter-1"
cases_panel.setCurrentIndex(0)
current_tab = cases_panel.currentWidget()
assert current_tab.objectName() == "create_new_ensemble_tab"
storage_widget = get_child(current_tab, StorageWidget)
tree_view = get_child(storage_widget, QTreeView)
tree_view.expandAll()

model = tree_view.model()
assert model is not None and model.rowCount() == 2
assert "iter-1" in model.index(1, 0, model.index(1, 0)).data(0)

dialog.close()

with_manage_tool(gui, qtbot, handle_manage_dialog)
manage_tool = gui.tools["Manage experiments"]
manage_tool.trigger()

assert isinstance(manage_tool, ManageExperimentsTool)
experiments_panel = manage_tool._ensemble_management_widget

# In the "create new case" tab, it should now contain "iter-1"
experiments_panel.setCurrentIndex(0)
current_tab = experiments_panel.currentWidget()
assert current_tab.objectName() == "create_new_ensemble_tab"
storage_widget = get_child(current_tab, StorageWidget)
tree_view = get_child(storage_widget, QTreeView)
tree_view.expandAll()

model = tree_view.model()
assert model is not None and model.rowCount() == 2
assert "iter-1" in model.index(1, 0, model.index(1, 0)).data(0)

experiments_panel.close()

with contextlib.suppress(FileNotFoundError):
shutil.rmtree("poly_out")
Expand Down
Loading

0 comments on commit ba78c6b

Please sign in to comment.