mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
feat(avalonia): implement preview hotkey setting and update migration checklist
- Add PreviewHotkey property to HotkeySettingsViewModel
- Add preview hotkey UI to HotkeySettingsPage
- Implement dynamic hotkey handling in MainWindow code-behind
- Remove hardcoded F1 keybinding from XAML
- Update AVALONIA_MIGRATION_CHECKLIST.md with accurate progress:
- Overall progress: 60-65% (was 35-40%)
- Plugin Store: 95% done (was 0%)
- Plugin Settings: 90% done (was 33%)
- Proxy Settings: 100% done (was 59%)
💘 Generated with Crush
Assisted-by: Kimi for Coding via Crush <crush@charm.land>
This commit is contained in:
parent
0e90bc1c18
commit
b0dfd0b86c
5 changed files with 205 additions and 77 deletions
|
|
@ -1,7 +1,7 @@
|
|||
# Flow.Launcher Avalonia Migration Checklist
|
||||
|
||||
> **Overall Progress: ~35-40%**
|
||||
> Last Updated: January 2026
|
||||
> **Overall Progress: ~60-65%**
|
||||
> Last Updated: February 2026
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -27,6 +27,7 @@
|
|||
| HotkeyControl | `HotkeyControl.xaml` | :white_check_mark: Done | Button control |
|
||||
| HotkeyRecorderDialog | `HotkeyControlDialog.xaml` | :white_check_mark: Done | Global hook + modifier tracking |
|
||||
| ResultListBox | `ResultListBox.xaml` | :white_check_mark: Done | Results display |
|
||||
| PreviewPanel | `PreviewPanel.xaml` | :white_check_mark: Done | Result preview |
|
||||
| WelcomeWindow | `WelcomeWindow.xaml` | :x: Missing | First-run setup wizard |
|
||||
| ReportWindow | `ReportWindow.xaml` | :x: Missing | Error reporting dialog |
|
||||
| ReleaseNotesWindow | `ReleaseNotesWindow.xaml` | :x: Missing | Changelog display |
|
||||
|
|
@ -37,18 +38,18 @@
|
|||
| Msg | `Msg.xaml` | :x: Missing | Simple message dialog |
|
||||
| MsgWithButton | `MsgWithButton.xaml` | :x: Missing | Message with action button |
|
||||
| ProgressBoxEx | `ProgressBoxEx.xaml` | :x: Missing | Progress dialog |
|
||||
| ActionKeywords | `ActionKeywords.xaml` | :x: Missing | Action keyword editor |
|
||||
| ActionKeywords | `ActionKeywords.xaml` | :x: Missing | Action keyword editor (using dialog instead) |
|
||||
| CustomQueryHotkeySetting | `CustomQueryHotkeySetting.xaml` | :x: Missing | Custom hotkey dialog |
|
||||
| CustomShortcutSetting | `CustomShortcutSetting.xaml` | :x: Missing | Shortcut editor |
|
||||
|
||||
**Progress: 5/19 (26%)**
|
||||
**Progress: 6/19 (32%)**
|
||||
|
||||
---
|
||||
|
||||
## 2. Settings Pages
|
||||
|
||||
### 2.1 General Settings (`SettingsPaneGeneral.xaml` - 538 lines)
|
||||
**Avalonia: ~270 lines (~50%)**
|
||||
**Avalonia: ~270 lines (~95% DONE)**
|
||||
|
||||
| Setting | Status | Binding Property |
|
||||
|---------|--------|------------------|
|
||||
|
|
@ -86,8 +87,8 @@
|
|||
| **Language Section** |
|
||||
| Language selector | :white_check_mark: Done | `SelectedLanguage` |
|
||||
| **Paths** |
|
||||
| Python directory | :white_check_mark: Done | `PythonPath` (display + select) |
|
||||
| Node directory | :white_check_mark: Done | `NodePath` (display + select) |
|
||||
| Python directory | :white_check_mark: Done | `PythonPath` (display) |
|
||||
| Node directory | :white_check_mark: Done | `NodePath` (display) |
|
||||
| **Not Yet Implemented** |
|
||||
| Select browser | :x: Missing | Opens `SelectBrowserWindow` |
|
||||
| Select file manager | :x: Missing | Opens `SelectFileManagerWindow` |
|
||||
|
|
@ -97,7 +98,7 @@
|
|||
| Korean IME settings | :x: Missing | ExCard with registry toggle |
|
||||
|
||||
### 2.2 Theme Settings (`SettingsPaneTheme.xaml` - 803 lines)
|
||||
**Avalonia: 66 lines (~8%)**
|
||||
**Avalonia: ~70 lines (~35% DONE)**
|
||||
|
||||
| Setting | Status | Notes |
|
||||
|---------|--------|-------|
|
||||
|
|
@ -109,10 +110,10 @@
|
|||
| Window height slider | :x: Missing | `Settings.WindowHeightSize` |
|
||||
| Item height slider | :x: Missing | `Settings.ItemHeightSize` |
|
||||
| **Font Settings** |
|
||||
| Query box font | :x: Missing | `Settings.QueryBoxFont` |
|
||||
| Query box font size | :x: Missing | `Settings.QueryBoxFontSize` |
|
||||
| Result font | :x: Missing | `Settings.ResultFont` |
|
||||
| Result font size | :x: Missing | `Settings.ResultItemFontSize` |
|
||||
| Query box font | :x: Missing | `Settings.QueryBoxFont` (font family) |
|
||||
| Query box font size | :white_check_mark: Done | `Settings.QueryBoxFontSize` |
|
||||
| Result font | :x: Missing | `Settings.ResultFont` (font family) |
|
||||
| Result font size | :white_check_mark: Done | `Settings.ResultItemFontSize` |
|
||||
| Result sub font size | :x: Missing | `Settings.ResultSubItemFontSize` |
|
||||
| **Appearance** |
|
||||
| Color scheme | :white_check_mark: Done | Light/Dark/System |
|
||||
|
|
@ -120,7 +121,8 @@
|
|||
| Use clock | :x: Missing | `Settings.UseDate` |
|
||||
| Clock format | :x: Missing | `Settings.TimeFormat` |
|
||||
| Date format | :x: Missing | `Settings.DateFormat` |
|
||||
| Use glyph icons | :x: Missing | `Settings.UseGlyphIcons` |
|
||||
| Use glyph icons | :white_check_mark: Done | `Settings.UseGlyphIcons` |
|
||||
| Max results | :white_check_mark: Done | `Settings.MaxResultsToShow` |
|
||||
| **Backdrop** |
|
||||
| Use system backdrop | :x: Missing | `Settings.UseSystemBackdrop` |
|
||||
| Backdrop type | :x: Missing | Mica/Acrylic/etc |
|
||||
|
|
@ -129,7 +131,7 @@
|
|||
| Double-click icon action | :x: Missing | `Settings.DoubleClickIconAction` |
|
||||
|
||||
### 2.3 Hotkey Settings (`SettingsPaneHotkey.xaml` - 463 lines)
|
||||
**Avalonia: 26 lines (~6%)**
|
||||
**Avalonia: ~26 lines (~10% DONE)**
|
||||
|
||||
| Hotkey | Status | Setting Property |
|
||||
|--------|--------|------------------|
|
||||
|
|
@ -149,59 +151,72 @@
|
|||
| Add custom hotkey | :x: Missing | Opens editor dialog |
|
||||
|
||||
### 2.4 Plugin Settings (`SettingsPanePlugins.xaml` - 141 lines)
|
||||
**Avalonia: 47 lines (~33%)**
|
||||
**Avalonia: ~170 lines (~90% DONE)**
|
||||
|
||||
| Feature | Status | Notes |
|
||||
|---------|--------|-------|
|
||||
| Plugin list | :white_check_mark: Done | Basic list view |
|
||||
| Plugin list | :white_check_mark: Done | Expandable list view |
|
||||
| Plugin icon | :white_check_mark: Done | Shows icon |
|
||||
| Plugin name | :white_check_mark: Done | Shows name |
|
||||
| Plugin enable/disable | :x: Missing | Toggle switch |
|
||||
| Plugin details panel | :x: Missing | Description, author, website |
|
||||
| Plugin settings UI | :x: Missing | `IPluginSettingProvider` integration |
|
||||
| Action keywords editor | :x: Missing | Opens `ActionKeywords` dialog |
|
||||
| Plugin priority | :x: Missing | Drag to reorder |
|
||||
| Plugin enable/disable | :white_check_mark: Done | Toggle switch |
|
||||
| Plugin details panel | :white_check_mark: Done | Description, author, version, init/query time |
|
||||
| Plugin settings UI | :white_check_mark: Done | `IPluginSettingProvider` integration (Avalonia + WPF fallback) |
|
||||
| Action keywords editor | :white_check_mark: Done | Dialog-based editor |
|
||||
| Plugin priority | :white_check_mark: Done | Number box |
|
||||
| Search delay per plugin | :white_check_mark: Done | Number box |
|
||||
| Home page enable/disable | :white_check_mark: Done | Toggle switch |
|
||||
| Display mode selector | :white_check_mark: Done | OnOff/Priority/SearchDelay/HomeOnOff |
|
||||
| Plugin directory button | :white_check_mark: Done | Opens folder |
|
||||
| Source code link | :white_check_mark: Done | Opens website |
|
||||
| Uninstall plugin | :white_check_mark: Done | With confirmation dialog |
|
||||
| Help dialog | :white_check_mark: Done | Priority/search delay/home tips |
|
||||
|
||||
### 2.5 Plugin Store (`SettingsPanePluginStore.xaml` - 400 lines)
|
||||
**Avalonia: 0 lines (0%)**
|
||||
**Avalonia: ~200 lines (~95% DONE)**
|
||||
|
||||
| Feature | Status | Notes |
|
||||
|---------|--------|-------|
|
||||
| Plugin search | :x: Missing | Search box |
|
||||
| Plugin grid | :x: Missing | Grid of available plugins |
|
||||
| Plugin card | :x: Missing | Icon, name, description, install button |
|
||||
| Install plugin | :x: Missing | Download and install |
|
||||
| Update plugin | :x: Missing | Update available indicator |
|
||||
| Uninstall plugin | :x: Missing | Remove plugin |
|
||||
| Plugin filter | :x: Missing | Filter by category |
|
||||
| Plugin search | :white_check_mark: Done | Search box with fuzzy search |
|
||||
| Plugin grid | :white_check_mark: Done | ItemsRepeater with UniformGridLayout |
|
||||
| Plugin card | :white_check_mark: Done | Icon, name, description, author |
|
||||
| Install plugin | :white_check_mark: Done | Download and install |
|
||||
| Update plugin | :white_check_mark: Done | Update available indicator + button |
|
||||
| Uninstall plugin | :white_check_mark: Done | Remove plugin |
|
||||
| Plugin filter | :white_check_mark: Done | Filter by language (.NET/Python/Node/Executable) |
|
||||
| Refresh plugins | :white_check_mark: Done | Button to refresh manifest |
|
||||
| Check updates | :white_check_mark: Done | Check for plugin updates |
|
||||
| Local install | :white_check_mark: Done | Install from .zip file |
|
||||
| Loading indicator | :white_check_mark: Done | Progress ring while loading |
|
||||
| Flyout details | :white_check_mark: Done | Full details on click |
|
||||
| Website/Source links | :white_check_mark: Done | Open in browser |
|
||||
|
||||
### 2.6 Proxy Settings (`SettingsPaneProxy.xaml` - 80 lines)
|
||||
**Avalonia: 47 lines (~59%)**
|
||||
**Avalonia: ~47 lines (~100% DONE)**
|
||||
|
||||
| Setting | Status | Notes |
|
||||
|---------|--------|-------|
|
||||
| Enable proxy | :white_check_mark: Done | Toggle |
|
||||
| Proxy server | :white_check_mark: Done | Text input |
|
||||
| Proxy port | :white_check_mark: Done | Number input |
|
||||
| Proxy username | :x: Missing | Text input |
|
||||
| Proxy password | :x: Missing | Password input |
|
||||
| Proxy username | :white_check_mark: Done | Text input |
|
||||
| Proxy password | :white_check_mark: Done | Password input (masked) |
|
||||
|
||||
### 2.7 About Settings (`SettingsPaneAbout.xaml` - 184 lines)
|
||||
**Avalonia: 25 lines (~14%)**
|
||||
**Avalonia: ~25 lines (~40% DONE)**
|
||||
|
||||
| Feature | Status | Notes |
|
||||
|---------|--------|-------|
|
||||
| Version display | :white_check_mark: Done | Shows version |
|
||||
| Check for updates | :x: Missing | Button + status |
|
||||
| Homepage link | :x: Missing | HyperLink |
|
||||
| Homepage link | :white_check_mark: Done | Button |
|
||||
| Documentation link | :x: Missing | HyperLink |
|
||||
| GitHub link | :x: Missing | HyperLink |
|
||||
| GitHub link | :white_check_mark: Done | Button |
|
||||
| Discord link | :x: Missing | HyperLink |
|
||||
| Release notes | :x: Missing | Opens `ReleaseNotesWindow` |
|
||||
| Open logs folder | :x: Missing | Button |
|
||||
| Open settings folder | :x: Missing | Button |
|
||||
|
||||
**Settings Progress: ~550/2609 lines (~21%)**
|
||||
**Settings Progress: ~1100/2609 lines (~42%)**
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -212,16 +227,18 @@
|
|||
| Card | `Card.xaml.cs` | :white_check_mark: Done | Settings card with icon, title, subtitle |
|
||||
| ExCard | `ExCard.xaml.cs` | :white_check_mark: Done | Expandable card with nested content |
|
||||
| CardGroup | `CardGroup.xaml.cs` | :white_check_mark: Done | Groups cards with rounded corners |
|
||||
| HotkeyControl | `HotkeyControl.xaml` | :white_check_mark: Done | Hotkey display and recording |
|
||||
| HotkeyRecorderDialog | `HotkeyControlDialog.xaml` | :white_check_mark: Done | Dialog for recording hotkeys |
|
||||
| InfoBar | `InfoBar.xaml.cs` | :x: Missing | Information/warning banner |
|
||||
| HyperLink | `HyperLink.xaml.cs` | :x: Missing | Clickable link control |
|
||||
| HotkeyDisplay | `HotkeyDisplay.xaml.cs` | :x: Missing | Displays hotkey as key badges |
|
||||
| InstalledPluginDisplay | `InstalledPluginDisplay.xaml.cs` | :x: Missing | Plugin info card |
|
||||
| InstalledPluginDisplayKeyword | `InstalledPluginDisplayKeyword.xaml.cs` | :x: Missing | Keyword badge |
|
||||
| InstalledPluginDisplayBottomData | `InstalledPluginDisplayBottomData.xaml.cs` | :x: Missing | Plugin metadata footer |
|
||||
| InstalledPluginDisplay | `InstalledPluginDisplay.xaml.cs` | :x: Missing | Plugin info card (replaced by Expander) |
|
||||
| InstalledPluginDisplayKeyword | `InstalledPluginDisplayKeyword.xaml.cs` | :x: Missing | Keyword badge (integrated) |
|
||||
| InstalledPluginDisplayBottomData | `InstalledPluginDisplayBottomData.xaml.cs` | :x: Missing | Plugin metadata footer (integrated) |
|
||||
|
||||
**Progress: 3/9 (33%)**
|
||||
**Progress: 5/9 (56%)**
|
||||
|
||||
> Note: Using FluentAvalonia's `SettingsExpander` for most settings pages instead of custom Card controls.
|
||||
> Note: Using FluentAvalonia's `SettingsExpander` for most settings pages instead of custom Card controls. Plugin display uses native Avalonia Expander.
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -229,13 +246,19 @@
|
|||
|
||||
| ViewModel | WPF Lines | Avalonia Lines | Status | Notes |
|
||||
|-----------|-----------|----------------|--------|-------|
|
||||
| MainViewModel | 2292 | ~420 | :yellow_circle: 18% | Core query works, missing history/clipboard |
|
||||
| MainViewModel | 2292 | ~490 | :yellow_circle: 21% | Core query works, missing history/clipboard |
|
||||
| ResultsViewModel | ~200 | ~150 | :white_check_mark: 75% | Core functionality done |
|
||||
| ResultViewModel | ~300 | ~200 | :white_check_mark: 67% | Basic display done |
|
||||
| SettingWindowViewModel | ~100 | ~50 | :yellow_circle: 50% | Navigation works |
|
||||
| GeneralSettingsViewModel | ~100 | ~400 | :white_check_mark: 95% | Most settings implemented |
|
||||
| PluginViewModel | ~150 | ~30 | :yellow_circle: 20% | Basic list only |
|
||||
| PluginStoreItemViewModel | ~100 | 0 | :x: 0% | Not started |
|
||||
| GeneralSettingsViewModel | ~100 | ~390 | :white_check_mark: 95% | Most settings implemented |
|
||||
| ThemeSettingsViewModel | ~150 | ~116 | :yellow_circle: 77% | Basic theme + fonts done |
|
||||
| HotkeySettingsViewModel | ~200 | ~31 | :yellow_circle: 15% | Only toggle hotkey done |
|
||||
| PluginsSettingsViewModel | ~300 | ~220 | :white_check_mark: 73% | Full plugin management |
|
||||
| PluginStoreSettingsViewModel | ~250 | ~200 | :white_check_mark: 80% | Store functionality complete |
|
||||
| PluginStoreItemViewModel | ~100 | ~113 | :white_check_mark: 95% | Item display + actions |
|
||||
| PluginItemViewModel | N/A | ~277 | :white_check_mark: 90% | Individual plugin management |
|
||||
| ProxySettingsViewModel | ~80 | ~81 | :white_check_mark: 100% | All proxy settings |
|
||||
| AboutSettingsViewModel | ~100 | ~28 | :yellow_circle: 28% | Basic version + links |
|
||||
| WelcomeViewModel | ~80 | 0 | :x: 0% | Not started |
|
||||
| SelectBrowserViewModel | ~50 | 0 | :x: 0% | Not started |
|
||||
| SelectFileManagerViewModel | ~50 | 0 | :x: 0% | Not started |
|
||||
|
|
@ -251,7 +274,7 @@
|
|||
- [ ] Window position memory
|
||||
- [ ] IME mode control
|
||||
|
||||
**Progress: ~25%**
|
||||
**Progress: ~45%**
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -263,6 +286,7 @@
|
|||
| ImageLoader | :white_check_mark: Done | Image caching/loading |
|
||||
| FontLoader | :white_check_mark: Done | Font loading |
|
||||
| GlobalHotkey | :white_check_mark: Done | In Infrastructure project |
|
||||
| TextBlockHelper | :white_check_mark: Done | Text formatting helpers |
|
||||
| AutoStartup | :x: Missing | Windows startup registration |
|
||||
| SingleInstance | :x: Missing | Prevent multiple instances |
|
||||
| ErrorReporting | :x: Missing | Error logging/reporting |
|
||||
|
|
@ -273,7 +297,7 @@
|
|||
| DataWebRequestFactory | :x: Missing | Web requests with proxy |
|
||||
| SyntaxSugars | :x: Missing | Extension methods |
|
||||
|
||||
**Progress: 4/13 (31%)**
|
||||
**Progress: 5/13 (38%)**
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -281,9 +305,11 @@
|
|||
|
||||
| Converter | Status | Description |
|
||||
|-----------|--------|-------------|
|
||||
| HighlightTextConverter | :white_check_mark: Done | Bold gold highlighting for matched characters |
|
||||
| BoolToIsVisibleConverter | :white_check_mark: Done | Boolean to IsVisible |
|
||||
| TranslationConverter | :white_check_mark: Done | Localization converter |
|
||||
| CommonConverters | :white_check_mark: Done | Various common converters |
|
||||
| HighlightTextConverter | :x: Missing | Bold gold highlighting for matched characters |
|
||||
| QuerySuggestionBoxConverter | :yellow_circle: Stub | Not implemented |
|
||||
| BoolToVisibilityConverter | :white_check_mark: Done | Boolean to visibility |
|
||||
| TextConverter | :x: Missing | Text transformations |
|
||||
| SizeRatioConverter | :x: Missing | Size calculations |
|
||||
| BadgePositionConverter | :x: Missing | Badge positioning |
|
||||
|
|
@ -296,7 +322,7 @@
|
|||
| BorderClipConverter | :x: Missing | Border clipping geometry |
|
||||
| BoolToIMEConversionModeConverter | :x: Missing | IME mode conversion |
|
||||
|
||||
**Progress: 3/14 (21%)**
|
||||
**Progress: 3/16 (19%)**
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -321,10 +347,10 @@
|
|||
|---------|--------|-------|
|
||||
| Show/Hide toggle | :white_check_mark: Done | Global hotkey works |
|
||||
| Window dragging | :white_check_mark: Done | Drag to move |
|
||||
| Hide on focus loss | :x: Missing | Deactivate handling |
|
||||
| Hide on focus loss | :white_check_mark: Done | Deactivate handling |
|
||||
| Position memory | :x: Missing | Remember last position |
|
||||
| Multi-monitor | :x: Missing | Position on specific monitor |
|
||||
| Topmost mode | :x: Missing | Always on top option |
|
||||
| Topmost mode | :white_check_mark: Done | Always on top option |
|
||||
|
||||
### System Integration
|
||||
| Feature | Status | Notes |
|
||||
|
|
@ -340,13 +366,14 @@
|
|||
|---------|--------|-------|
|
||||
| Load plugins | :white_check_mark: Done | Via PluginManager |
|
||||
| Plugin queries | :white_check_mark: Done | Action keywords work |
|
||||
| Plugin settings UI | :x: Missing | IPluginSettingProvider |
|
||||
| Plugin install | :x: Missing | From store |
|
||||
| Plugin update | :x: Missing | Check/apply updates |
|
||||
| Python plugins | :x: Missing | Python path config |
|
||||
| Node plugins | :x: Missing | Node path config |
|
||||
| Plugin settings UI | :white_check_mark: Done | IPluginSettingProvider (Avalonia native + WPF fallback) |
|
||||
| Plugin install | :white_check_mark: Done | From store |
|
||||
| Plugin update | :white_check_mark: Done | Check/apply updates |
|
||||
| Plugin uninstall | :white_check_mark: Done | With confirmation |
|
||||
| Python plugins | :white_check_mark: Partial | Python path config (display only) |
|
||||
| Node plugins | :white_check_mark: Partial | Node path config (display only) |
|
||||
|
||||
**Progress: ~45%**
|
||||
**Progress: ~55%**
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -358,13 +385,13 @@
|
|||
| Custom themes | :x: Missing | Load from .xaml files |
|
||||
| Theme list | :x: Missing | Browse available themes |
|
||||
| Theme preview | :x: Missing | Live preview in settings |
|
||||
| Font customization | :x: Missing | Query/result fonts |
|
||||
| Font customization | :yellow_circle: Partial | Font sizes done, font families missing |
|
||||
| Size customization | :x: Missing | Window/item sizes |
|
||||
| Animation speed | :x: Missing | Transition speed |
|
||||
| Backdrop effects | :x: Missing | Mica/Acrylic |
|
||||
| Icon themes | :x: Missing | Glyph/image icons |
|
||||
|
||||
**Progress: ~15%**
|
||||
**Progress: ~20%**
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -376,9 +403,9 @@
|
|||
| Result list | :x: Missing | Item entrance animation |
|
||||
| Context menu | :x: Missing | Menu slide animation |
|
||||
| Settings navigation | :x: Missing | Page transitions |
|
||||
| Progress indicators | :x: Missing | Loading spinners |
|
||||
| Progress indicators | :white_check_mark: Done | Loading spinners (FluentAvalonia) |
|
||||
|
||||
**Progress: 0%**
|
||||
**Progress: ~10%**
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -389,13 +416,13 @@
|
|||
2. [ ] **History cycling** - Up/Down arrow through history
|
||||
3. [x] **GeneralSettingsPage** - Essential settings (startup, behavior) - DONE
|
||||
4. [x] **Card/ExCard controls** - Required for all settings pages - DONE (using FluentAvalonia SettingsExpander)
|
||||
5. [ ] **Hide on focus loss** - Expected behavior
|
||||
5. [x] **Hide on focus loss** - Expected behavior - DONE
|
||||
|
||||
### Medium Priority (Feature Completeness)
|
||||
6. [ ] **HotkeySettingsPage** - All keyboard shortcuts
|
||||
7. [ ] **ThemeSettingsPage** - Theme selection and customization
|
||||
8. [ ] **Plugin settings UI** - IPluginSettingProvider integration
|
||||
9. [ ] **Plugin Store** - Install/update plugins
|
||||
6. [ ] **HotkeySettingsPage** - All keyboard shortcuts (only toggle done)
|
||||
7. [ ] **ThemeSettingsPage** - Theme selection and customization (partial)
|
||||
8. [x] **Plugin settings UI** - IPluginSettingProvider integration - DONE
|
||||
9. [x] **Plugin Store** - Install/update plugins - DONE
|
||||
10. [ ] **Auto-start** - Windows startup registration
|
||||
|
||||
### Lower Priority (Polish)
|
||||
|
|
@ -448,18 +475,35 @@ Flow.Launcher.Avalonia/
|
|||
│ └── SettingPages/
|
||||
│ ├── SettingsWindow.axaml
|
||||
│ ├── GeneralSettingsPage.axaml (~270 lines)
|
||||
│ ├── ThemeSettingsPage.axaml (66 lines)
|
||||
│ ├── HotkeySettingsPage.axaml (26 lines)
|
||||
│ ├── PluginsSettingsPage.axaml (47 lines)
|
||||
│ ├── ProxySettingsPage.axaml (47 lines)
|
||||
│ └── AboutSettingsPage.axaml (25 lines)
|
||||
│ ├── ThemeSettingsPage.axaml (~70 lines)
|
||||
│ ├── HotkeySettingsPage.axaml (~26 lines)
|
||||
│ ├── PluginsSettingsPage.axaml (~170 lines)
|
||||
│ ├── PluginStoreSettingsPage.axaml (~200 lines)
|
||||
│ ├── ProxySettingsPage.axaml (~47 lines)
|
||||
│ └── AboutSettingsPage.axaml (~25 lines)
|
||||
├── ViewModel/
|
||||
│ ├── MainViewModel.cs (~420 lines)
|
||||
│ ├── MainViewModel.cs (~490 lines)
|
||||
│ ├── SettingPages/
|
||||
│ │ └── GeneralSettingsViewModel.cs (~400 lines)
|
||||
│ │ ├── GeneralSettingsViewModel.cs (~390 lines)
|
||||
│ │ ├── ThemeSettingsViewModel.cs (~116 lines)
|
||||
│ │ ├── HotkeySettingsViewModel.cs (~31 lines)
|
||||
│ │ ├── PluginsSettingsViewModel.cs (~220 lines)
|
||||
│ │ ├── PluginStoreSettingsViewModel.cs (~200 lines)
|
||||
│ │ ├── PluginStoreItemViewModel.cs (~113 lines)
|
||||
│ │ ├── PluginItemViewModel.cs (~277 lines)
|
||||
│ │ ├── ProxySettingsViewModel.cs (~81 lines)
|
||||
│ │ └── AboutSettingsViewModel.cs (~28 lines)
|
||||
│ └── ...
|
||||
├── Helper/ (4 files)
|
||||
├── Converters/ (3 files)
|
||||
├── Helper/
|
||||
│ ├── FontLoader.cs
|
||||
│ ├── GlobalHotkey.cs
|
||||
│ ├── HotKeyMapper.cs
|
||||
│ ├── ImageLoader.cs
|
||||
│ └── TextBlockHelper.cs
|
||||
├── Converters/
|
||||
│ ├── BoolToIsVisibleConverter.cs
|
||||
│ ├── CommonConverters.cs
|
||||
│ └── TranslationConverter.cs
|
||||
└── Themes/
|
||||
├── Base.axaml
|
||||
└── Resources.axaml
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
<KeyBinding Gesture="Up" Command="{Binding SelectPrevItemCommand}" />
|
||||
<KeyBinding Gesture="Shift+Enter" Command="{Binding LoadContextMenuCommand}" />
|
||||
<KeyBinding Gesture="Ctrl+OemComma" Command="{Binding OpenSettingsCommand}" />
|
||||
<KeyBinding Gesture="F1" Command="{Binding TogglePreviewCommand}" />
|
||||
<!-- Preview hotkey is handled dynamically in code-behind to support customization -->
|
||||
</Window.KeyBindings>
|
||||
|
||||
<!-- Main container with rounded corners and background -->
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ using CommunityToolkit.Mvvm.DependencyInjection;
|
|||
using Flow.Launcher.Avalonia.ViewModel;
|
||||
using Flow.Launcher.Infrastructure.UserSettings;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
#if DEBUG
|
||||
using Avalonia.Diagnostics;
|
||||
#endif
|
||||
|
|
@ -17,6 +18,8 @@ public partial class MainWindow : Window
|
|||
{
|
||||
private MainViewModel? _viewModel;
|
||||
private TextBox? _queryTextBox;
|
||||
private Settings? _settings;
|
||||
private KeyGesture? _previewHotkeyGesture;
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
|
|
@ -28,6 +31,11 @@ public partial class MainWindow : Window
|
|||
_viewModel.ShowRequested += () => ShowAndFocus();
|
||||
DataContext = _viewModel;
|
||||
|
||||
// Get settings for hotkey configuration
|
||||
_settings = Ioc.Default.GetRequiredService<Settings>();
|
||||
_settings.PropertyChanged += OnSettingsPropertyChanged;
|
||||
UpdatePreviewHotkeyGesture();
|
||||
|
||||
// Get reference to the query text box
|
||||
_queryTextBox = this.FindControl<TextBox>("QueryTextBox");
|
||||
|
||||
|
|
@ -39,6 +47,51 @@ public partial class MainWindow : Window
|
|||
#endif
|
||||
}
|
||||
|
||||
private void OnSettingsPropertyChanged(object? sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
if (e.PropertyName == nameof(Settings.PreviewHotkey))
|
||||
{
|
||||
UpdatePreviewHotkeyGesture();
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdatePreviewHotkeyGesture()
|
||||
{
|
||||
if (_settings == null) return;
|
||||
_previewHotkeyGesture = ParseKeyGesture(_settings.PreviewHotkey);
|
||||
}
|
||||
|
||||
private static KeyGesture? ParseKeyGesture(string hotkey)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(hotkey)) return null;
|
||||
|
||||
try
|
||||
{
|
||||
// Try parsing as a standard key gesture
|
||||
return KeyGesture.Parse(hotkey);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Fallback: manual parsing for common formats
|
||||
var parts = hotkey.Split('+', StringSplitOptions.RemoveEmptyEntries);
|
||||
if (parts.Length == 0) return null;
|
||||
|
||||
var keyPart = parts[^1].Trim();
|
||||
if (!Enum.TryParse<Key>(keyPart, true, out var key))
|
||||
return null;
|
||||
|
||||
var modifiers = KeyModifiers.None;
|
||||
for (int i = 0; i < parts.Length - 1; i++)
|
||||
{
|
||||
var mod = parts[i].Trim();
|
||||
if (Enum.TryParse<KeyModifiers>(mod, true, out var parsedMod))
|
||||
modifiers |= parsedMod;
|
||||
}
|
||||
|
||||
return new KeyGesture(key, modifiers);
|
||||
}
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
|
|
@ -83,6 +136,16 @@ public partial class MainWindow : Window
|
|||
{
|
||||
base.OnKeyDown(e);
|
||||
|
||||
// Handle Preview hotkey dynamically
|
||||
if (_previewHotkeyGesture != null &&
|
||||
e.Key == _previewHotkeyGesture.Key &&
|
||||
e.KeyModifiers == _previewHotkeyGesture.KeyModifiers)
|
||||
{
|
||||
_viewModel?.TogglePreviewCommand.Execute(null);
|
||||
e.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle Escape to hide window (handled by command, but keep as fallback)
|
||||
if (e.Key == Key.Escape)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -28,4 +28,17 @@ public partial class HotkeySettingsViewModel : ObservableObject
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string PreviewHotkey
|
||||
{
|
||||
get => _settings.PreviewHotkey;
|
||||
set
|
||||
{
|
||||
if (_settings.PreviewHotkey != value)
|
||||
{
|
||||
_settings.PreviewHotkey = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,6 +20,14 @@
|
|||
<controls:HotkeyControl Hotkey="{Binding ToggleHotkey, Mode=TwoWay}" MinWidth="150" />
|
||||
</ui:SettingsExpander.Footer>
|
||||
</ui:SettingsExpander>
|
||||
|
||||
<ui:SettingsExpander Header="{i18n:Localize previewHotkey}"
|
||||
Description="{i18n:Localize previewHotkeyToolTip}"
|
||||
IconSource="PreviewLink">
|
||||
<ui:SettingsExpander.Footer>
|
||||
<controls:HotkeyControl Hotkey="{Binding PreviewHotkey, Mode=TwoWay}" MinWidth="150" />
|
||||
</ui:SettingsExpander.Footer>
|
||||
</ui:SettingsExpander>
|
||||
|
||||
<TextBlock Text="{i18n:Localize hotkeyFormatTip}" Foreground="Gray" FontSize="12" />
|
||||
</StackPanel>
|
||||
|
|
|
|||
Loading…
Reference in a new issue