Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 26 additions & 15 deletions src/qus/analysis_loading/analysis_loading_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,20 +65,7 @@ def _setup_analysis_options(self) -> None:
"""Setup available analysis types and functions in the view."""
analysis_types, analysis_functions = self._model.get_analysis_types()

# Automatically select "Paramap" as the analysis type
paramap_type = "paramap"
if paramap_type in analysis_types:
self._selected_analysis_type = paramap_type
if self._model.set_analysis_type(paramap_type):
# Get available functions for Paramap analysis
available_functions = self._model.get_analysis_functions(
paramap_type, self._image_data.spatial_dims)
# Skip analysis type selection and go directly to function selection
self._view_coordinator.show_function_selection(available_functions)
else:
self._view_coordinator.show_error("Failed to set Paramap analysis type")
else:
self._view_coordinator.show_error("Paramap analysis type not available")
self._view_coordinator.show_analysis_type_selection(analysis_types)

def _on_user_action(self, action_name: str, action_data: Any) -> None:
"""
Expand All @@ -89,7 +76,9 @@ def _on_user_action(self, action_name: str, action_data: Any) -> None:
action_data: Data associated with the action
"""

if action_name == "analysis_functions_selected":
if action_name == "analysis_type_selected":
self._handle_analysis_type_selection(action_data)
elif action_name == "analysis_functions_selected":
self._handle_analysis_functions_selection(action_data)
elif action_name == "analysis_execution_started":
self._handle_analysis_execution(action_data)
Expand Down Expand Up @@ -150,6 +139,28 @@ def _on_analysis_error(self, error_message: str) -> None:
self._view_coordinator.show_error(error_message)
self._analysis_running = False

def _handle_analysis_type_selection(self, selected_type: str) -> None:
"""
Handle analysis type selection.

Args:
selected_type: String containing selected analysis type
"""
self._selected_analysis_type = selected_type

if not self._model.set_analysis_type(selected_type):
self._view_coordinator.show_error(
f"Failed to set analysis type: {selected_type}"
)
return

available_functions = self._model.get_analysis_functions(
selected_type,
self._image_data.spatial_dims
)

self._view_coordinator.show_function_selection(available_functions)

def _handle_analysis_functions_selection(self, selected_func_names: List[str]) -> None:
"""
Handle analysis functions selection.
Expand Down
42 changes: 37 additions & 5 deletions src/qus/analysis_loading/analysis_loading_view_coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from src.qus.mvc.base_view import BaseViewMixin
from .views.analysis_function_selection_widget import AnalysisFunctionSelectionWidget
from .views.analysis_params_widget import AnalysisParamsWidget
from .views.analysis_type_selection_widget import AnalysisTypeSelectionWidget
from engines.qus.quantus.data_objs import UltrasoundRfImage, BmodeSeg, RfAnalysisConfig
from engines.qus.quantus.analysis.paramap.framework import ParamapAnalysis

Expand Down Expand Up @@ -49,9 +50,7 @@ def __init__(self, image_data: UltrasoundRfImage, seg_data: BmodeSeg, config_dat
# Widget instances
self._function_selection_widget: Optional[AnalysisFunctionSelectionWidget] = None
self._params_widget: Optional[AnalysisParamsWidget] = None

# Note: Analysis type selection is now skipped - Paramap is automatically selected
# The controller will call show_function_selection directly
self._type_selection_widget: Optional[AnalysisTypeSelectionWidget] = None

# ============================================================================
# CONTROLLER INPUT ROUTING - Route inputs from controller to appropriate widget
Expand Down Expand Up @@ -102,6 +101,27 @@ def clear_error(self) -> None:
# NAVIGATION METHODS - Methods to show different widgets
# ============================================================================

def show_analysis_type_selection(self, analysis_types: Dict) -> None:
"""
Show the analysis type selection widget.

Args:
analysis_types: Dictionary of analysis types
"""
if self._type_selection_widget is None:
self._type_selection_widget = AnalysisTypeSelectionWidget(
self._image_data,
analysis_types
)
self._type_selection_widget.analysis_type_selected.connect(self._on_analysis_type_selected)
self._type_selection_widget.back_requested.connect(self.back_requested.emit)
self._type_selection_widget.close_requested.connect(self.close_requested.emit)

self.addWidget(self._type_selection_widget)

self.setCurrentWidget(self._type_selection_widget)
self._type_selection_widget.clear_error()

def show_function_selection(self, available_functions: Dict) -> None:
"""
Show the analysis function selection widget.
Expand All @@ -116,6 +136,8 @@ def show_function_selection(self, available_functions: Dict) -> None:
self._function_selection_widget.back_requested.connect(self._on_function_selection_back)
self._function_selection_widget.close_requested.connect(self.close_requested.emit)
self.addWidget(self._function_selection_widget)
else:
self._function_selection_widget.set_functions(available_functions)

self.setCurrentWidget(self._function_selection_widget)
self._function_selection_widget.clear_error()
Expand All @@ -142,6 +164,15 @@ def show_params_configuration(self, required_params: Dict[str, Dict[str, str]],
# EVENT HANDLERS - Handle events from child widgets
# ============================================================================

def _on_analysis_type_selected(self, selected_type: str) -> None:
"""
Handle analysis type selection.

Args:
selected_type: String containing selected analysis type
"""
self._emit_user_action("analysis_type_selected", selected_type)

def _on_functions_selected(self, selected_func_names: List[str]) -> None:
"""
Handle analysis functions selection.
Expand All @@ -162,8 +193,9 @@ def _on_params_configured(self, params: dict) -> None:

def _on_function_selection_back(self) -> None:
"""Handle back navigation from function selection."""
# Since we skip analysis type selection, go back to the main application flow
self.back_requested.emit()
# Go back to type selection
if self._type_selection_widget:
self.setCurrentWidget(self._type_selection_widget)

def _on_params_back(self) -> None:
"""Handle back navigation from parameters configuration."""
Expand Down
Loading