@@ -124,6 +124,7 @@ const wf = inject(injectionKeys.core);
124124const ssbm = inject (injectionKeys .builderManager );
125125
126126const tracking = useWriterTracking (wf );
127+ const toasts = useToasts ();
127128
128129const {
129130 candidateId,
@@ -146,14 +147,20 @@ const {
146147 isCutAllowed,
147148 isDeleteAllowed,
148149 isGoToParentAllowed,
150+ isGoToChildAllowed,
151+ isGoToNextSiblingAllowed,
152+ isGoToPrevSiblingAllowed,
149153 pasteComponent,
150154 copyComponent,
151155 removeComponentsSubtree,
152156 goToParent,
157+ goToChild,
158+ goToNextSibling,
159+ goToPrevSibling,
160+ moveComponentToParent,
161+ moveComponentInsideNextSibling,
153162} = useComponentActions (wf , ssbm , tracking );
154163
155- const toasts = useToasts ();
156-
157164const builderMode = computed (() => ssbm .getMode ());
158165const selectedId = computed (() => ssbm .firstSelectedId .value );
159166
@@ -192,37 +199,63 @@ async function handleKeydown(ev: KeyboardEvent) {
192199 removeComponentsSubtree (... componentIds );
193200 return ;
194201 }
195- if (ev .key == " ArrowUp" && isModifierKeyActive && ev .shiftKey ) {
196- if (! isGoToParentAllowed (selectedId )) return ;
197- goToParent (selectedId , selectedInstancePath );
198- return ;
199- }
200- if (ev .key == " ArrowUp" && isModifierKeyActive ) {
201- moveComponentUp (selectedId );
202- return ;
203- }
204- if (ev .key == " ArrowDown" && isModifierKeyActive ) {
205- moveComponentDown (selectedId );
206- return ;
207- }
208- if (ev .key == " v" && isModifierKeyActive ) {
209- if (! isPasteAllowed (selectedId )) return ;
210- try {
211- await pasteComponent (selectedId );
212- } catch (error ) {
213- toasts .pushToast ({ type: " error" , message: String (error ) });
202+ if (! isModifierKeyActive ) return ;
203+
204+ if (ev .shiftKey ) {
205+ switch (ev .key ) {
206+ case " ArrowDown" :
207+ ev .preventDefault ();
208+ if (isGoToNextSiblingAllowed (selectedId ))
209+ goToNextSibling (selectedId );
210+ break ;
211+ case " ArrowUp" :
212+ ev .preventDefault ();
213+ if (isGoToPrevSiblingAllowed (selectedId ))
214+ goToPrevSibling (selectedId );
215+ break ;
216+ case " ArrowLeft" :
217+ ev .preventDefault ();
218+ if (isGoToParentAllowed (selectedId ))
219+ goToParent (selectedId , selectedInstancePath );
220+ break ;
221+ case " ArrowRight" :
222+ ev .preventDefault ();
223+ if (isGoToChildAllowed (selectedId )) goToChild (selectedId );
224+ break ;
225+ }
226+ } else {
227+ switch (ev .key ) {
228+ case " ArrowDown" :
229+ ev .preventDefault ();
230+ moveComponentDown (selectedId );
231+ break ;
232+ case " ArrowUp" :
233+ ev .preventDefault ();
234+ moveComponentUp (selectedId );
235+ break ;
236+ case " ArrowLeft" :
237+ ev .preventDefault ();
238+ moveComponentToParent (selectedId );
239+ break ;
240+ case " ArrowRight" :
241+ ev .preventDefault ();
242+ moveComponentInsideNextSibling (selectedId );
243+ break ;
244+ case " v" :
245+ if (! isPasteAllowed (selectedId )) return ;
246+ try {
247+ await pasteComponent (selectedId );
248+ } catch (error ) {
249+ toasts .pushToast ({ type: " error" , message: String (error ) });
250+ }
251+ break ;
252+ case " c" :
253+ if (isCopyAllowed (selectedId )) copyComponent (selectedId );
254+ break ;
255+ case " x" :
256+ if (isCutAllowed (selectedId )) cutComponent (selectedId );
257+ break ;
214258 }
215- return ;
216- }
217- if (ev .key == " c" && isModifierKeyActive ) {
218- if (! isCopyAllowed (selectedId )) return ;
219- copyComponent (selectedId );
220- return ;
221- }
222- if (ev .key == " x" && isModifierKeyActive ) {
223- if (! isCutAllowed (selectedId )) return ;
224- cutComponent (selectedId );
225- return ;
226259 }
227260}
228261
0 commit comments