|
22 | 22 | getColorPickerOverrideRole, |
23 | 23 | getEyedropperActive, |
24 | 24 | setEyedropperActive, |
| 25 | + getCommandPaletteOpen, |
| 26 | + openCommandPalette, |
| 27 | + closeCommandPalette, |
| 28 | + getKeymapOpen, |
| 29 | + setKeymapOpen, |
| 30 | + toggleKeymap, |
25 | 31 | } from '$lib/stores/ui.svelte'; |
26 | 32 | import { |
27 | | - getIsApplying, |
28 | | - setIsApplying, |
29 | 33 | setWallpaperPath, |
30 | | - getPalette, |
31 | | - getWallpaperPath, |
32 | | - getLightMode, |
33 | | - getAdditionalImages, |
34 | | - getExtendedColors, |
35 | | - getAppOverrides, |
36 | | - getAdjustments, |
37 | | - setAdjustments, |
38 | 34 | setPalette, |
39 | | - setAdjustedExtendedColors, |
| 35 | + setAdjustments, |
40 | 36 | setColor, |
41 | 37 | setExtendedColor, |
42 | 38 | setAppOverride, |
43 | 39 | setLightMode, |
44 | 40 | setExtractionMode, |
45 | 41 | } from '$lib/stores/theme.svelte'; |
46 | | - import {getSettings} from '$lib/stores/settings.svelte'; |
| 42 | + import {pushState} from '$lib/stores/history.svelte'; |
47 | 43 | import { |
48 | | - undo as historyUndo, |
49 | | - redo as historyRedo, |
50 | | - pushRedo, |
51 | | - pushState, |
52 | | - pushUndo, |
53 | | - } from '$lib/stores/history.svelte'; |
| 44 | + applyTheme, |
| 45 | + undoAction, |
| 46 | + redoAction, |
| 47 | + } from '$lib/actions/themeActions'; |
| 48 | + import { |
| 49 | + zoomIn, |
| 50 | + zoomOut, |
| 51 | + resetZoom, |
| 52 | + setZoom, |
| 53 | + getZoom, |
| 54 | + } from '$lib/utils/zoom'; |
54 | 55 | import Toast from '$lib/components/shared/Toast.svelte'; |
55 | 56 | import AboutStrip from '$lib/components/layout/AboutStrip.svelte'; |
56 | 57 | import KeymapDialog from '$lib/components/shared/KeymapDialog.svelte'; |
| 58 | + import CommandPalette from '$lib/components/shared/CommandPalette.svelte'; |
57 | 59 | import {initKeyboardShortcuts, registerShortcut} from '$lib/utils/keyboard'; |
58 | 60 | import {hexToRgb} from '$lib/utils/color'; |
| 61 | + import {buildCommands} from '$lib/commands/commands.svelte'; |
59 | 62 | import type {main} from '../wailsjs/go/models'; |
60 | 63 |
|
61 | | - let showKeymap = $state(false); |
62 | 64 | let activeTab = $derived(getActiveTab()); |
| 65 | + let commands = $derived(buildCommands()); |
63 | 66 | let widgetMode = $state(false); |
64 | 67 | let sliderWidget = $state(false); |
65 | 68 | let themesSlider = $state(false); |
|
93 | 96 |
|
94 | 97 | initKeyboardShortcuts(); |
95 | 98 |
|
96 | | - // Ctrl+Z - Undo |
97 | | - registerShortcut('ctrl+z', () => { |
98 | | - const snapshot = historyUndo(); |
99 | | - if (snapshot) { |
100 | | - pushRedo(getPalette(), getExtendedColors(), getAdjustments()); |
101 | | - setPalette(snapshot.palette, true); |
102 | | - setAdjustedExtendedColors(snapshot.extendedColors); |
103 | | - setAdjustments(snapshot.adjustments); |
104 | | - } |
105 | | - }); |
106 | | -
|
107 | | - // Ctrl+Shift+Z - Redo |
108 | | - registerShortcut('ctrl+shift+z', () => { |
109 | | - const snapshot = historyRedo(); |
110 | | - if (snapshot) { |
111 | | - pushUndo(getPalette(), getExtendedColors(), getAdjustments()); |
112 | | - setPalette(snapshot.palette, true); |
113 | | - setAdjustedExtendedColors(snapshot.extendedColors); |
114 | | - setAdjustments(snapshot.adjustments); |
115 | | - } |
116 | | - }); |
117 | | -
|
118 | | - // Ctrl+Enter - Apply theme |
119 | | - registerShortcut('ctrl+enter', async () => { |
120 | | - if (getIsApplying()) return; |
121 | | - setIsApplying(true); |
122 | | - try { |
123 | | - const {ApplyTheme} = await import('../wailsjs/go/main/App'); |
124 | | - const result = await ApplyTheme({ |
125 | | - palette: getPalette(), |
126 | | - wallpaperPath: getWallpaperPath(), |
127 | | - lightMode: getLightMode(), |
128 | | - additionalImages: getAdditionalImages(), |
129 | | - extendedColors: getExtendedColors(), |
130 | | - settings: getSettings(), |
131 | | - appOverrides: getAppOverrides(), |
132 | | - } as unknown as main.ApplyThemeRequest); |
133 | | - if (result.success) showToast('Theme applied'); |
134 | | - } catch { |
135 | | - showToast('Failed to apply theme'); |
136 | | - } finally { |
137 | | - setIsApplying(false); |
138 | | - } |
139 | | - }); |
| 99 | + registerShortcut('ctrl+z', undoAction); |
| 100 | + registerShortcut('ctrl+shift+z', redoAction); |
| 101 | + registerShortcut('ctrl+enter', applyTheme); |
140 | 102 |
|
141 | 103 | // Ctrl+S - Save blueprint |
142 | 104 | registerShortcut('ctrl+s', () => { |
|
185 | 147 | }); |
186 | 148 | }); |
187 | 149 |
|
188 | | - // Ctrl+= / Ctrl+- / Ctrl+0 - Zoom controls |
189 | | - const ZOOM_STEP = 0.1; |
190 | | - const ZOOM_MIN = 0.5; |
191 | | - const ZOOM_MAX = 2.0; |
192 | | - const ZOOM_DEFAULT = 1.0; |
193 | | -
|
194 | | - function getZoom(): number { |
195 | | - return parseFloat(localStorage.getItem('aether-zoom') || '1'); |
196 | | - } |
197 | | -
|
198 | | - function applyZoom(level: number) { |
199 | | - const clamped = Math.min( |
200 | | - ZOOM_MAX, |
201 | | - Math.max(ZOOM_MIN, Math.round(level * 100) / 100) |
202 | | - ); |
203 | | - document.documentElement.style.zoom = String(clamped); |
204 | | - localStorage.setItem('aether-zoom', String(clamped)); |
205 | | - } |
206 | | -
|
207 | | - // Restore saved zoom level |
208 | | - applyZoom(getZoom()); |
209 | | -
|
210 | | - // Ctrl++ (on standard keyboards, + is Shift+=, so e.key is "+") |
211 | | - registerShortcut('ctrl+shift++', () => { |
212 | | - applyZoom(getZoom() + ZOOM_STEP); |
213 | | - }); |
214 | | -
|
215 | | - // Ctrl++ via numpad (no shift needed) |
216 | | - registerShortcut('ctrl++', () => { |
217 | | - applyZoom(getZoom() + ZOOM_STEP); |
218 | | - }); |
219 | | -
|
220 | | - registerShortcut('ctrl+-', () => { |
221 | | - applyZoom(getZoom() - ZOOM_STEP); |
222 | | - }); |
223 | | -
|
224 | | - registerShortcut('ctrl+0', () => { |
225 | | - applyZoom(ZOOM_DEFAULT); |
226 | | - }); |
| 150 | + setZoom(getZoom()); |
| 151 | + registerShortcut('ctrl+shift++', zoomIn); |
| 152 | + registerShortcut('ctrl++', zoomIn); |
| 153 | + registerShortcut('ctrl+-', zoomOut); |
| 154 | + registerShortcut('ctrl+0', resetZoom); |
227 | 155 |
|
228 | 156 | // Ctrl+K - Show keymap |
229 | 157 | registerShortcut('ctrl+k', () => { |
230 | | - showKeymap = !showKeymap; |
| 158 | + toggleKeymap(); |
| 159 | + }); |
| 160 | +
|
| 161 | + // Ctrl+P - Command palette |
| 162 | + registerShortcut('ctrl+p', () => { |
| 163 | + if (getCommandPaletteOpen()) closeCommandPalette(); |
| 164 | + else openCommandPalette(); |
231 | 165 | }); |
232 | 166 |
|
233 | | - // Escape - Close modals |
234 | 167 | registerShortcut('escape', () => { |
235 | | - if (getEyedropperActive()) setEyedropperActive(false); |
| 168 | + if (getCommandPaletteOpen()) closeCommandPalette(); |
| 169 | + else if (getEyedropperActive()) setEyedropperActive(false); |
236 | 170 | else if (getColorPickerOpen()) closeColorPicker(); |
237 | | - else if (showKeymap) showKeymap = false; |
| 171 | + else if (getKeymapOpen()) setKeymapOpen(false); |
238 | 172 | }); |
239 | 173 |
|
240 | 174 | // Listen for events from Go |
|
407 | 341 | <ActionBar /> |
408 | 342 | <AboutStrip /> |
409 | 343 | <Toast /> |
410 | | - <KeymapDialog open={showKeymap} onclose={() => (showKeymap = false)} /> |
| 344 | + <KeymapDialog |
| 345 | + open={getKeymapOpen()} |
| 346 | + onclose={() => setKeymapOpen(false)} |
| 347 | + /> |
| 348 | + <CommandPalette |
| 349 | + open={getCommandPaletteOpen()} |
| 350 | + {commands} |
| 351 | + onclose={closeCommandPalette} |
| 352 | + /> |
411 | 353 | </div> |
412 | 354 | {/if} |
0 commit comments