72 lines
3.0 KiB
Markdown
72 lines
3.0 KiB
Markdown
# Implementation: Separate per-filter settings dialogs
|
|
|
|
## Changes required
|
|
|
|
### 1. HcieAppState additions
|
|
**File:** `crates/hcie-gui-egui/src/app/mod.rs`
|
|
- Add to `HcieAppState` (or `HcieApp` if using a struct-level state):
|
|
- `pub filter_selected_id: String`
|
|
- `pub filter_params_open: bool`
|
|
- `pub filter_preview_active: bool`
|
|
- `pub filter_sky_path: String`
|
|
- Initialize to defaults in the struct constructor.
|
|
|
|
### 2. Filter dialog redesign
|
|
**File:** `crates/hcie-gui-egui/src/app/filter_dialog.rs`
|
|
- Replace the monolithic filter dialog with two windows:
|
|
1. **Main filter dialog** — filter list only + common controls (Close, Undo Last Filter, Apply-to-New-Layer)
|
|
2. **Per-filter settings window** — opened when a filter is selected
|
|
|
|
### 3. New functions in filter_dialog.rs
|
|
- `show_filter_list_window(app, ctx)` — shows the filter category tree
|
|
- Calls `egui_panel_filters::show_filter_list_ui(...)`
|
|
- On filter click: set `app.filter_selected_id`, open `app.filter_params_open = true`
|
|
- `show_filter_params_window(app, ctx)` — shows the selected filter's controls
|
|
- Uses `get_filter_panel(filter_id)` to get the panel spec
|
|
- Renders `render_module_panel` for the parameter widgets
|
|
- Renders sky-path input for `sky_replacement`
|
|
- Buttons: **Preview / Stop Preview**, **Apply**, **Reset**, **Close**
|
|
- Close button sets `filter_params_open = false`
|
|
|
|
### 4. Preview feature
|
|
- In `show_filter_params_window`:
|
|
- If `filter_preview_active` is true:
|
|
- On widget change: call `engine.filter_preview_restore()` + `engine.filter_preview_begin()` + `engine.apply_filter_preview(id, params)`
|
|
- Show "Stop Preview" button instead of "Preview"
|
|
- If not previewing:
|
|
- "Preview" button starts preview: `engine.filter_preview_begin()`, then apply once
|
|
- Set `filter_preview_active = true`
|
|
- On window close: if preview active, call `engine.filter_preview_restore()` and clear flag
|
|
|
|
### 5. Reset feature
|
|
- "Reset" button:
|
|
- Re-initialize all widget values to defaults from `get_filter_panel(filter_id)`
|
|
- If preview active, also restore original pixels and stop preview
|
|
- Keep window open
|
|
|
|
### 6. Apply feature
|
|
- "Apply" button:
|
|
- Compile params with `compile_filter_params`
|
|
- If preview active, restore first
|
|
- Call `engine.apply_filter(id, params)`
|
|
- Clear `filter_selected_id`, set `filter_params_open = false`
|
|
|
|
### 7. is_raster check
|
|
- Pass `is_raster` from the engine to both windows
|
|
- Main filter list shows the mismatch warning if not raster
|
|
- Per-filter window is disabled/hidden if not raster
|
|
|
|
### 8. FilterType to string ID mapping
|
|
**File:** `crates/hcie-gui-egui/src/app/menus.rs`
|
|
- Add a helper function `filter_type_to_id(ft: FilterType) -> &'static str`
|
|
- Map each menu item's filter type to the corresponding ID string
|
|
- Update menu handlers to set both `app.show_filter = true` and `app.filter_selected_id = id`
|
|
|
|
## Implementation order
|
|
1. Add state fields to HcieApp
|
|
2. Implement `show_filter_params_window`
|
|
3. Implement `show_filter_list_window`
|
|
4. Update main filter dialog to use new windows
|
|
5. Add preview/reset logic
|
|
6. Update menus
|