Skip to content

Commit ba3d524

Browse files
fix: added data converter as dialog
1 parent 303ca20 commit ba3d524

4 files changed

Lines changed: 45 additions & 33 deletions

File tree

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""Data conversion GUI components."""
22

3-
from .data_conversion_widget import DataConversionWidget
3+
from .data_conversion_widget import AutomaticConversionDialog, AutomaticConversionWidget
44

5-
__all__ = ["DataConversionWidget"]
5+
__all__ = ["AutomaticConversionDialog", "AutomaticConversionWidget"]

‎loopstructural/gui/data_conversion/data_conversion_widget.py‎

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""Data conversion widget displayed inside the LoopStructural dock."""
1+
"""Data conversion widgets and dialog for LoopStructural."""
22

33
from __future__ import annotations
44

@@ -8,6 +8,8 @@
88
from PyQt5.QtCore import Qt
99
from PyQt5.QtWidgets import (
1010
QComboBox,
11+
QDialog,
12+
QDialogButtonBox,
1113
QFormLayout,
1214
QHBoxLayout,
1315
QLabel,
@@ -290,16 +292,16 @@ def _collect_data_sources(self) -> Dict[Datatype | str, str]:
290292
data_sources[data_type] = path
291293
return data_sources
292294

293-
def _handle_run_conversion(self) -> None:
295+
def _handle_run_conversion(self) -> bool:
294296
converter_option = self.current_converter()
295297
if converter_option is None:
296298
self._update_status("Please select a converter before running.", error=True)
297-
return
299+
return False
298300

299301
sources = self._collect_data_sources()
300302
if not sources:
301303
self._update_status("Select at least one data source layer before running.", error=True)
302-
return
304+
return False
303305

304306
loop_converter: Any = None
305307
result: Any = None
@@ -314,7 +316,7 @@ def _handle_run_conversion(self) -> None:
314316
added_layers = self._add_layers_to_project_group(layers)
315317
except Exception as exc: # pragma: no cover - UI feedback
316318
self._update_status(f"Conversion failed: {exc}", error=True)
317-
return
319+
return False
318320

319321
if added_layers:
320322
message = (
@@ -325,6 +327,7 @@ def _handle_run_conversion(self) -> None:
325327
else:
326328
message = "Conversion completed successfully."
327329
self._update_status(message)
330+
return True
328331

329332
def _update_status(self, message: str, *, error: bool = False) -> None:
330333
color = "#c00000" if error else "#006400"
@@ -572,37 +575,38 @@ def _default_converter_options(self) -> List[ConverterOption]:
572575
return options
573576

574577

575-
class DataConversionWidget(QWidget):
576-
"""High level widget that exposes automatic conversion."""
578+
class AutomaticConversionDialog(QDialog):
579+
"""Dialog wrapper for the automatic conversion workflow."""
577580

578581
def __init__(
579582
self,
580583
parent: Optional[QWidget] = None,
581584
*,
582-
data_manager: Any = None,
583585
converters: Optional[Iterable[Any]] = None,
584586
project: Optional[QgsProject] = None,
585587
):
586588
super().__init__(parent)
587-
self.data_manager = data_manager
589+
self.setWindowTitle("Data Converter")
588590
self.project = project or QgsProject.instance()
589591

590592
layout = QVBoxLayout(self)
591593
description = QLabel("Convert geological datasets for use within LoopStructural.")
592594
description.setWordWrap(True)
593595
layout.addWidget(description)
594596

595-
self.automatic_widget = AutomaticConversionWidget(self, converters=converters, project=self.project)
596-
layout.addWidget(self.automatic_widget)
597+
self.widget = AutomaticConversionWidget(self, converters=converters, project=self.project)
598+
layout.addWidget(self.widget)
599+
self.widget.run_button.hide()
597600

598-
def set_converters(self, converters: Iterable[Any]) -> None:
599-
"""Update the converter options displayed in the automatic tab."""
600-
self.automatic_widget.set_converters(converters)
601+
self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, self)
602+
self.button_box.accepted.connect(self._run_and_accept)
603+
self.button_box.rejected.connect(self.reject)
604+
layout.addWidget(self.button_box)
601605

602-
def get_active_configuration(self) -> Dict[str, Any]:
603-
"""Return a serialisable summary of the current tab selection."""
604-
converter = self.automatic_widget.current_converter()
605-
return {
606-
"mode": "automatic",
607-
"converter": converter.to_dict() if converter else None,
608-
}
606+
def _run_and_accept(self) -> None:
607+
if self.widget._handle_run_conversion():
608+
self.accept()
609+
610+
def set_converters(self, converters: Iterable[Any]) -> None:
611+
"""Update the converter options displayed in the dialog."""
612+
self.widget.set_converters(converters)

‎loopstructural/gui/loop_widget.py‎

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
from PyQt5.QtWidgets import QTabWidget, QVBoxLayout, QWidget
99

10-
from .data_conversion import DataConversionWidget
1110
from .modelling.modelling_widget import ModellingWidget
1211
from .visualisation.visualisation_widget import VisualisationWidget
1312

@@ -51,12 +50,6 @@ def __init__(
5150
self.visualisation_widget = VisualisationWidget(
5251
self, mapCanvas=self.mapCanvas, logger=self.logger, model_manager=self.model_manager
5352
)
54-
self.data_conversion_widget = DataConversionWidget(
55-
self,
56-
data_manager=self.data_manager,
57-
project=self.data_manager.project if self.data_manager else None,
58-
)
59-
tabWidget.addTab(self.data_conversion_widget, "Data Conversion")
6053
tabWidget.addTab(self.modelling_widget, "Modelling")
6154
tabWidget.addTab(self.visualisation_widget, "Visualisation")
6255

@@ -80,6 +73,3 @@ def get_visualisation_widget(self):
8073
"""
8174
return self.visualisation_widget
8275

83-
def get_data_conversion_widget(self):
84-
"""Return the data conversion widget instance."""
85-
return self.data_conversion_widget

‎loopstructural/plugin_main.py‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,17 +140,24 @@ def initGui(self):
140140
self.tr("LoopStructural Modelling"),
141141
self.iface.mainWindow(),
142142
)
143+
self.action_data_conversion = QAction(
144+
self.tr("LoopStructural Data Conversion"),
145+
self.iface.mainWindow(),
146+
)
147+
self.action_data_conversion.triggered.connect(self.show_data_conversion_dialog)
143148
self.action_visualisation = QAction(
144149
QIcon(os.path.dirname(__file__) + "/3D_icon.png"),
145150
self.tr("LoopStructural Visualisation"),
146151
self.iface.mainWindow(),
147152
)
148153

149154
self.toolbar.addAction(self.action_modelling)
155+
self.toolbar.addAction(self.action_data_conversion)
150156
self.toolbar.addAction(self.action_fault_topology)
151157
# -- Menu
152158
self.iface.addPluginToMenu(__title__, self.action_settings)
153159
self.iface.addPluginToMenu(__title__, self.action_help)
160+
self.iface.addPluginToMenu(__title__, self.action_data_conversion)
154161
self.initProcessing()
155162

156163
# Map2Loop tool actions
@@ -338,6 +345,16 @@ def show_sampler_dialog(self):
338345
)
339346
dialog.exec_()
340347

348+
def show_data_conversion_dialog(self):
349+
"""Show the data conversion dialog."""
350+
from loopstructural.gui.data_conversion import AutomaticConversionDialog
351+
352+
dialog = AutomaticConversionDialog(
353+
self.iface.mainWindow(),
354+
project=self.data_manager.project if self.data_manager else None,
355+
)
356+
dialog.exec_()
357+
341358
def show_sorter_dialog(self):
342359
"""Show the automatic stratigraphic sorter dialog."""
343360
from loopstructural.gui.map2loop_tools import SorterDialog
@@ -449,6 +466,7 @@ def unload(self):
449466
for attr in (
450467
"action_help",
451468
"action_settings",
469+
"action_data_conversion",
452470
"action_sampler",
453471
"action_sorter",
454472
"action_user_sorter",

0 commit comments

Comments
 (0)