123 lines
7.5 KiB
Markdown
123 lines
7.5 KiB
Markdown
# Asset Processor GUI Refactor Plan
|
|
|
|
This document outlines the plan to refactor the Asset Processor GUI based on user requirements.
|
|
|
|
## Goals
|
|
|
|
1. **Improve File Visibility:** Display all files found within an asset in the preview list, including those that don't match the preset, are moved to 'Extra', or have errors, along with their status.
|
|
2. **Integrate Preset Editor:** Move the preset editing functionality from the separate dialog into a collapsible panel within the main window.
|
|
|
|
## Goal 1: Improve File Visibility in Preview List
|
|
|
|
**Problem:** The current preview (`PredictionHandler` calling `AssetProcessor.predict_output_structure`) only shows files that successfully match a map type rule and get a predicted output name. It doesn't show files that are ignored, moved to 'Extra', or encounter errors during classification.
|
|
|
|
**Solution:** Leverage the more comprehensive classification logic already present in `AssetProcessor._inventory_and_classify_files` for the GUI preview.
|
|
|
|
**Plan Steps:**
|
|
|
|
1. **Modify `asset_processor.py`:**
|
|
* Create a new method in `AssetProcessor`, perhaps named `get_detailed_file_predictions()`.
|
|
* This new method will perform the core steps of `_setup_workspace()`, `_extract_input()`, and `_inventory_and_classify_files()`.
|
|
* It will then iterate through *all* categories in `self.classified_files` ('maps', 'models', 'extra', 'ignored').
|
|
* For each file, it will determine a 'status' (e.g., "Mapped", "Model", "Extra", "Ignored", "Error") and attempt to predict the output name (similar to `predict_output_structure` for maps, maybe just the original name for others).
|
|
* It will return a more detailed list of dictionaries, each containing: `{'original_path': str, 'predicted_name': str | None, 'status': str, 'details': str | None}`.
|
|
* Crucially, this method will *not* perform the actual processing (`_process_maps`, `_merge_maps`, etc.) or file moving, only the classification and prediction. It should also include cleanup (`_cleanup_workspace`).
|
|
2. **Modify `gui/prediction_handler.py`:**
|
|
* Update `PredictionHandler.run_prediction` to call the new `AssetProcessor.get_detailed_file_predictions()` method instead of `predict_output_structure()`.
|
|
* Adapt the code that processes the results to handle the new dictionary format (including the 'status' and 'details' fields).
|
|
* Emit this enhanced list via the `prediction_results_ready` signal.
|
|
3. **Modify `gui/main_window.py`:**
|
|
* In `setup_ui`, add a new column to `self.preview_table` for "Status". Adjust column count and header labels.
|
|
* In `on_prediction_results_ready`, populate the new "Status" column using the data received from `PredictionHandler`.
|
|
* Consider adding tooltips to the status column to show the 'details' (e.g., the reason for being ignored or moved to extra).
|
|
* Optionally, use background colors or icons in the status column for better visual distinction.
|
|
|
|
## Goal 2: Integrate Preset Editor into Main Window
|
|
|
|
**Problem:** Preset editing requires opening a separate modal dialog, interrupting the main workflow.
|
|
|
|
**Solution:** Embed the preset editing controls directly into the main window within a collapsible panel.
|
|
|
|
**Plan Steps:**
|
|
|
|
1. **Modify `gui/main_window.py` - UI Changes:**
|
|
* Remove the "Manage Presets" button (`self.manage_presets_button`).
|
|
* Add a collapsible panel (potentially using a `QFrame` with show/hide logic triggered by a button, or a `QDockWidget` if more appropriate) to the left side of the main layout.
|
|
* Inside this panel:
|
|
* Add the `QListWidget` for displaying presets (`self.preset_list`).
|
|
* Add the "New" and "Delete" buttons below the list. (The "Load" button becomes implicit - selecting a preset in the list loads it into the editor).
|
|
* Recreate the `QTabWidget` (`self.preset_editor_tabs`) with the "General & Naming" and "Mapping & Rules" tabs.
|
|
* Recreate *all* the widgets currently inside the `PresetEditorDialog` tabs (QLineEdit, QTextEdit, QSpinBox, QListWidget+controls, QTableWidget+controls) within the corresponding tabs in the main window's panel. Give them appropriate instance names (e.g., `self.editor_preset_name`, `self.editor_supplier_name`, etc.).
|
|
* Add "Save" and "Save As..." buttons within the collapsible panel, likely at the bottom.
|
|
2. **Modify `gui/main_window.py` - Logic Integration:**
|
|
* Adapt the `populate_presets` method to populate the new `self.preset_list` in the panel.
|
|
* Connect `self.preset_list.currentItemChanged` to a new method `load_selected_preset_for_editing`. This method will handle checking for unsaved changes in the editor panel and then load the selected preset's data into the editor widgets (similar to `PresetEditorDialog.load_preset`).
|
|
* Implement `save_preset`, `save_preset_as`, `new_preset`, `delete_preset` methods directly within `MainWindow`, adapting the logic from `PresetEditorDialog`. These will interact with the editor widgets in the panel.
|
|
* Implement `check_unsaved_changes` logic for the editor panel, prompting the user if they try to load/create/delete a preset or close the application with unsaved edits in the panel.
|
|
* Connect the editor widgets' change signals (`textChanged`, `valueChanged`, `itemChanged`, etc.) to a `mark_editor_unsaved` method in `MainWindow`.
|
|
* Ensure the main preset selection `QComboBox` (`self.preset_combo`) is repopulated when presets are saved/deleted via the editor panel.
|
|
3. **Cleanup:**
|
|
* Delete the `gui/preset_editor_dialog.py` file.
|
|
* Remove imports and references to `PresetEditorDialog` from `gui/main_window.py`.
|
|
|
|
## Visual Plan
|
|
|
|
**Current Layout:**
|
|
|
|
```mermaid
|
|
graph TD
|
|
subgraph "Current Main Window Layout"
|
|
A[Preset Combo + Manage Button] --> B(Drag & Drop Area);
|
|
B --> C{File Preview Table};
|
|
C --> D[Progress Bar];
|
|
D --> E[Options + Start/Cancel Buttons];
|
|
end
|
|
|
|
subgraph "Current Preset Editor (Separate Dialog)"
|
|
F[Preset List + Load/New/Delete] --> G{Tab Widget};
|
|
subgraph "Tab Widget"
|
|
G1[General & Naming Tab]
|
|
G2[Mapping & Rules Tab]
|
|
end
|
|
G --> H[Save / Save As / Close Buttons];
|
|
end
|
|
|
|
A -- Manage Button Click --> F;
|
|
|
|
style F fill:#f9f,stroke:#333,stroke-width:2px
|
|
style G fill:#f9f,stroke:#333,stroke-width:2px
|
|
style H fill:#f9f,stroke:#333,stroke-width:2px
|
|
```
|
|
|
|
**Proposed Layout:**
|
|
|
|
```mermaid
|
|
graph TD
|
|
subgraph "Proposed Main Window Layout"
|
|
direction LR
|
|
subgraph "Collapsible Preset Editor Panel (Left)"
|
|
P_List[Preset List] --> P_Buttons[New / Delete Buttons]
|
|
P_Buttons --> P_Tabs{Tab Widget}
|
|
subgraph "Editor Tabs"
|
|
P_Tab1[General & Naming]
|
|
P_Tab2[Mapping & Rules]
|
|
end
|
|
P_Tabs --> P_Save[Save / Save As Buttons]
|
|
end
|
|
|
|
subgraph "Main Area (Right)"
|
|
M_Preset[Preset Combo (for processing)] --> M_DragDrop(Drag & Drop Area)
|
|
M_DragDrop --> M_Preview{File Preview Table (with Status Column)}
|
|
M_Preview --> M_Progress[Progress Bar]
|
|
M_Progress --> M_Controls[Options + Start/Cancel Buttons]
|
|
end
|
|
|
|
P_List -- Selection Loads --> P_Tabs;
|
|
P_Save -- Updates --> P_List;
|
|
P_List -- Updates --> M_Preset;
|
|
|
|
style M_Preview fill:#ccf,stroke:#333,stroke-width:2px
|
|
style P_List fill:#cfc,stroke:#333,stroke-width:2px
|
|
style P_Tabs fill:#cfc,stroke:#333,stroke-width:2px
|
|
style P_Save fill:#cfc,stroke:#333,stroke-width:2px
|
|
end |