Ver Fonte

fix: Alt or ⌥ key to select script name in `exec` order (#1905)

+ select the name on double-click
tophf há 2 anos atrás
pai
commit
34323dbb5a
2 ficheiros alterados com 32 adições e 6 exclusões
  1. 28 3
      src/options/utils/dragging.js
  2. 4 3
      src/options/views/tab-installed.vue

+ 28 - 3
src/options/utils/dragging.js

@@ -27,6 +27,7 @@ let longPressEvent;
 let longPressTimer;
 let offsetX;
 let offsetY;
+/** @type {HTMLElement} */
 let original;
 let parent;
 let parentOnDrop;
@@ -38,11 +39,35 @@ let scrollTimestamp;
 let xyCache;
 
 export default function toggleDragging(listEl, moveScript, state) {
+  const onOff = state ? addEventListener : removeEventListener;
   parent = listEl;
   parentOnDrop = moveScript;
-  parent::(state ? addEventListener : removeEventListener)(
-    eventNames.start,
-    isTouch ? onTouchStart : onDragStart);
+  parent::onOff(eventNames.start, isTouch ? onTouchStart : onDragStart);
+  if (!isTouch) {
+    parent::onOff('dblclick', onDblClick, true);
+    parent::onOff('mousedown', onMouseDown, true);
+    if (!state) onMouseUp();
+  }
+}
+
+function onDblClick(evt) {
+  const selection = getSelection();
+  const el = evt.target.closest('.script-name');
+  if (el) {
+    selection.removeAllRanges();
+    selection.selectAllChildren(el);
+  }
+}
+
+/** @param {MouseEvent} e */
+function onMouseDown(e) {
+  if (!e.altKey && scriptFromEvent(e)) original.draggable = true;
+  parent::addEventListener('mouseup', onMouseUp, true);
+}
+
+function onMouseUp() {
+  if (original) original.draggable = false;
+  parent::removeEventListener('mouseup', onMouseUp, true);
 }
 
 function onDrop() {

+ 4 - 3
src/options/views/tab-installed.vue

@@ -142,7 +142,7 @@
 import { computed, reactive, nextTick, onMounted, watch, ref } from 'vue';
 import { i18n, sendCmdDirectly, debounce, makePause, noop, trueJoin } from '@/common';
 import options from '@/common/options';
-import { showConfirmation, showMessage, vFocus } from '@/common/ui';
+import { isTouch, showConfirmation, showMessage, vFocus } from '@/common/ui';
 import hookSetting from '@/common/hook-setting';
 import { forEachKey } from '@/common/object';
 import { setRoute, lastRoute } from '@/common/router';
@@ -251,7 +251,8 @@ const state = reactive({
 });
 
 const showRecycle = computed(() => store.route.paths[0] === TAB_RECYCLE);
-const draggable = computed(() => !showRecycle.value && filters.sort === 'exec');
+const draggableRaw = computed(() => !showRecycle.value && filters.sort === 'exec');
+const draggable = computed(() => isTouch && draggableRaw.value);
 const currentSortCompare = computed(() => filterOptions.sort[filters.sort]?.compare);
 const selectedScript = computed(() => state.filteredScripts[state.focusedIndex]);
 const message = computed(() => {
@@ -657,7 +658,7 @@ export default {
   setup() {
     resetList();
     watch(showRecycle, resetList);
-    watch(() => store.canRenderScripts && refList.value && draggable.value,
+    watch(() => store.canRenderScripts && refList.value && draggableRaw.value,
       state => toggleDragging(refList.value, moveScript, state));
     watch(() => state.search, scheduleSearch);
     watch(() => [filters.sort, filters.showEnabledFirst], debouncedUpdate);