@gtkx/testing 1.0.0-rc.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/accessible-native.d.ts +16 -0
- package/dist/accessible-native.d.ts.map +1 -0
- package/dist/accessible-native.js +206 -0
- package/dist/accessible-native.js.map +1 -0
- package/dist/act.d.ts +1 -3
- package/dist/act.d.ts.map +1 -1
- package/dist/act.js +1 -1
- package/dist/act.js.map +1 -1
- package/dist/build-queries.d.ts +27 -10
- package/dist/build-queries.d.ts.map +1 -1
- package/dist/build-queries.js +22 -24
- package/dist/build-queries.js.map +1 -1
- package/dist/cleanup-registry.d.ts +1 -1
- package/dist/cleanup-registry.d.ts.map +1 -1
- package/dist/cleanup-registry.js.map +1 -1
- package/dist/config.d.ts +8 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +10 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +10 -1
- package/dist/errors.js.map +1 -1
- package/dist/fire-event.d.ts +35 -6
- package/dist/fire-event.d.ts.map +1 -1
- package/dist/fire-event.js +23 -7
- package/dist/fire-event.js.map +1 -1
- package/dist/frame-sync.d.ts +3 -2
- package/dist/frame-sync.d.ts.map +1 -1
- package/dist/frame-sync.js +19 -9
- package/dist/frame-sync.js.map +1 -1
- package/dist/harness-window.d.ts +5 -0
- package/dist/harness-window.d.ts.map +1 -0
- package/dist/harness-window.js +17 -0
- package/dist/harness-window.js.map +1 -0
- package/dist/index.d.ts +14 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +5 -0
- package/dist/internal.js.map +1 -0
- package/dist/matchers.d.ts +88 -46
- package/dist/matchers.d.ts.map +1 -1
- package/dist/matchers.js +178 -20
- package/dist/matchers.js.map +1 -1
- package/dist/pretty-format.d.ts +2 -0
- package/dist/pretty-format.d.ts.map +1 -0
- package/dist/pretty-format.js +2 -0
- package/dist/pretty-format.js.map +1 -0
- package/dist/pretty-widget.d.ts +5 -2
- package/dist/pretty-widget.d.ts.map +1 -1
- package/dist/pretty-widget.js +75 -57
- package/dist/pretty-widget.js.map +1 -1
- package/dist/production.d.ts +8 -0
- package/dist/production.d.ts.map +1 -0
- package/dist/production.js +34 -0
- package/dist/production.js.map +1 -0
- package/dist/queries.d.ts +98 -56
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +123 -83
- package/dist/queries.js.map +1 -1
- package/dist/query-helpers.d.ts +44 -0
- package/dist/query-helpers.d.ts.map +1 -0
- package/dist/query-helpers.js +57 -0
- package/dist/query-helpers.js.map +1 -0
- package/dist/render-children.d.ts +9 -0
- package/dist/render-children.d.ts.map +1 -0
- package/dist/render-children.js +11 -0
- package/dist/render-children.js.map +1 -0
- package/dist/render.d.ts +12 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +52 -16
- package/dist/render.js.map +1 -1
- package/dist/role-helpers.d.ts +12 -3
- package/dist/role-helpers.d.ts.map +1 -1
- package/dist/role-helpers.js +15 -5
- package/dist/role-helpers.js.map +1 -1
- package/dist/role-naming.d.ts +5 -0
- package/dist/role-naming.d.ts.map +1 -0
- package/dist/role-naming.js +96 -0
- package/dist/role-naming.js.map +1 -0
- package/dist/screenshot.d.ts +12 -20
- package/dist/screenshot.d.ts.map +1 -1
- package/dist/screenshot.js +179 -93
- package/dist/screenshot.js.map +1 -1
- package/dist/timers.d.ts +9 -0
- package/dist/timers.d.ts.map +1 -0
- package/dist/timers.js +21 -0
- package/dist/timers.js.map +1 -0
- package/dist/traversal.d.ts +7 -1
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +40 -6
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +32 -15
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/user-event/adjustment.d.ts +3 -0
- package/dist/user-event/adjustment.d.ts.map +1 -1
- package/dist/user-event/adjustment.js +25 -3
- package/dist/user-event/adjustment.js.map +1 -1
- package/dist/user-event/click.d.ts +44 -8
- package/dist/user-event/click.d.ts.map +1 -1
- package/dist/user-event/click.js +176 -44
- package/dist/user-event/click.js.map +1 -1
- package/dist/user-event/column-header-click.d.ts +4 -0
- package/dist/user-event/column-header-click.d.ts.map +1 -0
- package/dist/user-event/column-header-click.js +55 -0
- package/dist/user-event/column-header-click.js.map +1 -0
- package/dist/user-event/event-wrapper.d.ts.map +1 -1
- package/dist/user-event/event-wrapper.js +34 -20
- package/dist/user-event/event-wrapper.js.map +1 -1
- package/dist/user-event/index.d.ts +80 -13
- package/dist/user-event/index.d.ts.map +1 -1
- package/dist/user-event/index.js +44 -26
- package/dist/user-event/index.js.map +1 -1
- package/dist/user-event/indexed-children.d.ts +10 -0
- package/dist/user-event/indexed-children.d.ts.map +1 -0
- package/dist/user-event/indexed-children.js +50 -0
- package/dist/user-event/indexed-children.js.map +1 -0
- package/dist/user-event/keyboard.d.ts.map +1 -1
- package/dist/user-event/keyboard.js +115 -31
- package/dist/user-event/keyboard.js.map +1 -1
- package/dist/user-event/list-row-click.d.ts +4 -0
- package/dist/user-event/list-row-click.d.ts.map +1 -0
- package/dist/user-event/list-row-click.js +38 -0
- package/dist/user-event/list-row-click.js.map +1 -0
- package/dist/user-event/native-click.d.ts +6 -0
- package/dist/user-event/native-click.d.ts.map +1 -0
- package/dist/user-event/native-click.js +36 -0
- package/dist/user-event/native-click.js.map +1 -0
- package/dist/user-event/notebook-tab-click.d.ts +5 -0
- package/dist/user-event/notebook-tab-click.d.ts.map +1 -0
- package/dist/user-event/notebook-tab-click.js +39 -0
- package/dist/user-event/notebook-tab-click.js.map +1 -0
- package/dist/user-event/pointer.d.ts +1 -1
- package/dist/user-event/pointer.d.ts.map +1 -1
- package/dist/user-event/pointer.js +33 -9
- package/dist/user-event/pointer.js.map +1 -1
- package/dist/user-event/selection.d.ts +11 -8
- package/dist/user-event/selection.d.ts.map +1 -1
- package/dist/user-event/selection.js +49 -38
- package/dist/user-event/selection.js.map +1 -1
- package/dist/user-event/text.d.ts +12 -5
- package/dist/user-event/text.d.ts.map +1 -1
- package/dist/user-event/text.js +151 -46
- package/dist/user-event/text.js.map +1 -1
- package/dist/wait-for.d.ts.map +1 -1
- package/dist/wait-for.js +4 -3
- package/dist/wait-for.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +14 -26
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +135 -190
- package/dist/widget-accessible-properties.js.map +1 -1
- package/dist/widget-getters.d.ts +11 -0
- package/dist/widget-getters.d.ts.map +1 -0
- package/dist/widget-getters.js +46 -0
- package/dist/widget-getters.js.map +1 -0
- package/dist/window-state.d.ts +10 -0
- package/dist/window-state.d.ts.map +1 -0
- package/dist/window-state.js +41 -0
- package/dist/window-state.js.map +1 -0
- package/dist/within.d.ts +3 -2
- package/dist/within.d.ts.map +1 -1
- package/dist/within.js +3 -2
- package/dist/within.js.map +1 -1
- package/package.json +21 -8
- package/src/accessible-native.ts +333 -0
- package/src/act.ts +1 -1
- package/src/build-queries.ts +47 -41
- package/src/cleanup-registry.ts +1 -1
- package/src/config.ts +10 -1
- package/src/errors.ts +12 -1
- package/src/fire-event.ts +61 -8
- package/src/frame-sync.ts +30 -9
- package/src/harness-window.ts +23 -0
- package/src/index.ts +18 -11
- package/src/internal.ts +12 -0
- package/src/matchers.ts +457 -72
- package/src/pretty-format.ts +1 -0
- package/src/pretty-widget.ts +98 -70
- package/src/production.ts +51 -0
- package/src/queries.ts +127 -89
- package/src/query-helpers.ts +97 -0
- package/src/render-children.ts +25 -0
- package/src/render.tsx +77 -17
- package/src/role-helpers.ts +16 -5
- package/src/role-naming.ts +99 -0
- package/src/screenshot.ts +266 -104
- package/src/timers.ts +31 -0
- package/src/traversal.ts +66 -6
- package/src/types.ts +34 -17
- package/src/user-event/adjustment.ts +31 -3
- package/src/user-event/click.ts +248 -52
- package/src/user-event/column-header-click.ts +76 -0
- package/src/user-event/event-wrapper.ts +41 -23
- package/src/user-event/index.ts +130 -40
- package/src/user-event/indexed-children.ts +75 -0
- package/src/user-event/keyboard.ts +161 -43
- package/src/user-event/list-row-click.ts +54 -0
- package/src/user-event/native-click.ts +51 -0
- package/src/user-event/notebook-tab-click.ts +57 -0
- package/src/user-event/pointer.ts +48 -9
- package/src/user-event/selection.ts +67 -41
- package/src/user-event/text.ts +192 -46
- package/src/wait-for.ts +4 -4
- package/src/widget-accessible-properties.ts +183 -230
- package/src/widget-getters.ts +85 -0
- package/src/window-state.ts +70 -0
- package/src/within.ts +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/user-event/keyboard.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport type { UserEventState } from \"./state.js\";\nimport { getEditableDelegate } from \"../editable.js\";\nimport { fireEvent } from \"../fire-event.js\";\nimport { getOrCreateControllers } from \"./controller.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\n/** Options for `userEvent.tab`. */\ntype TabOptions = {\n /** Move focus backward instead of forward. */\n isShiftHeld?: boolean;\n};\n\ntype KeyAction = { keyval: number; isPress: boolean };\ntype ParseStep = { actions: KeyAction[]; next: number };\n\nconst KEY_MAP: Record<string, number> = {\n Enter: Gdk.KEY_Return,\n Tab: Gdk.KEY_Tab,\n Escape: Gdk.KEY_Escape,\n Backspace: Gdk.KEY_BackSpace,\n Delete: Gdk.KEY_Delete,\n ArrowUp: Gdk.KEY_Up,\n ArrowDown: Gdk.KEY_Down,\n ArrowLeft: Gdk.KEY_Left,\n ArrowRight: Gdk.KEY_Right,\n Home: Gdk.KEY_Home,\n End: Gdk.KEY_End,\n PageUp: Gdk.KEY_Page_Up,\n PageDown: Gdk.KEY_Page_Down,\n Space: Gdk.KEY_space,\n Shift: Gdk.KEY_Shift_L,\n Control: Gdk.KEY_Control_L,\n Alt: Gdk.KEY_Alt_L,\n Meta: Gdk.KEY_Meta_L,\n F1: Gdk.KEY_F1,\n F2: Gdk.KEY_F2,\n F3: Gdk.KEY_F3,\n F4: Gdk.KEY_F4,\n F5: Gdk.KEY_F5,\n F6: Gdk.KEY_F6,\n F7: Gdk.KEY_F7,\n F8: Gdk.KEY_F8,\n F9: Gdk.KEY_F9,\n F10: Gdk.KEY_F10,\n F11: Gdk.KEY_F11,\n F12: Gdk.KEY_F12,\n};\n\nconst MODIFIER_KEYVAL_TO_MASK: Record<number, number> = {\n [Gdk.KEY_Shift_L]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Shift_R]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Control_L]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Control_R]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Alt_L]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Alt_R]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Meta_L]: Gdk.ModifierType.META_MASK,\n [Gdk.KEY_Meta_R]: Gdk.ModifierType.META_MASK,\n};\n\n/** Moves focus within the widget's root, forward by default and backward when `isShiftHeld` is set. */\nconst tab = (widget: Gtk.Widget, options?: TabOptions): Promise<void> =>\n wrapEvent(widget, () => {\n const direction = options?.isShiftHeld ? Gtk.DirectionType.TAB_BACKWARD : Gtk.DirectionType.TAB_FORWARD;\n const root = widget.getRoot();\n\n if (root) {\n root.childFocus(direction);\n }\n });\n\nconst parseKeyToken = (token: string): { keyval: number; isPress: boolean; isRelease: boolean } => {\n let keyName = token;\n let isPress = true;\n let isRelease = true;\n\n if (keyName.startsWith(\"/\")) {\n keyName = keyName.slice(1);\n isPress = false;\n } else if (keyName.endsWith(\">\")) {\n keyName = keyName.slice(0, -1);\n isRelease = false;\n }\n\n const keyval = KEY_MAP[keyName];\n\n if (keyval === undefined) {\n throw new Error(`Unknown key: {${keyName}}`);\n }\n\n return { keyval, isPress, isRelease };\n};\n\nconst parseCharAt = (input: string, i: number): ParseStep => {\n const keyval = input.codePointAt(i) ?? 0;\n\n return {\n actions: [\n { keyval, isPress: true },\n { keyval, isPress: false },\n ],\n next: i + 1,\n };\n};\n\nconst parseBraceAt = (input: string, i: number): ParseStep | null => {\n const endBrace = input.indexOf(\"}\", i);\n\n if (endBrace === -1) {\n return null;\n }\n\n const { keyval, isPress, isRelease } = parseKeyToken(input.slice(i + 1, endBrace));\n const actions: KeyAction[] = [];\n\n if (isPress) {\n actions.push({ keyval, isPress: true });\n }\n\n if (isRelease) {\n actions.push({ keyval, isPress: false });\n }\n\n return { actions, next: endBrace + 1 };\n};\n\nconst parseStepAt = (input: string, i: number): ParseStep | null =>\n input[i] === \"{\" ? parseBraceAt(input, i) : parseCharAt(input, i);\n\nconst parseKeyboardInput = (input: string): KeyAction[] => {\n const actions: KeyAction[] = [];\n let i = 0;\n\n while (i < input.length) {\n const step = parseStepAt(input, i);\n\n if (step === null) {\n break;\n }\n\n actions.push(...step.actions);\n i = step.next;\n }\n\n return actions;\n};\n\nconst updateModifierState = (state: UserEventState, action: KeyAction): void => {\n const mask = MODIFIER_KEYVAL_TO_MASK[action.keyval];\n\n if (!mask) {\n return;\n }\n\n if (action.isPress) {\n state.modifierState |= mask;\n } else {\n state.modifierState &= ~mask;\n }\n};\n\nconst isTriggerMatch = (\n trigger: Gtk.ShortcutTrigger | null,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (trigger instanceof Gtk.KeyvalTrigger) {\n return trigger.getKeyval() === keyval && trigger.getModifiers() === modifiers;\n }\n\n if (trigger instanceof Gtk.AlternativeTrigger) {\n return (\n isTriggerMatch(trigger.getFirst(), keyval, modifiers) ||\n isTriggerMatch(trigger.getSecond(), keyval, modifiers)\n );\n }\n\n return false;\n};\n\nconst didActivateShortcut = (\n shortcut: Gtk.Shortcut,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (!isTriggerMatch(shortcut.getTrigger(), keyval, modifiers)) {\n return false;\n }\n\n const action = shortcut.getAction();\n\n if (action instanceof Gtk.SignalAction && action.getSignalName() === \"move-focus\") {\n return false;\n }\n\n return action?.activate(0 as Gtk.ShortcutActionFlags, widget, shortcut.getArguments()) ?? false;\n};\n\nconst didActivateMatchingShortcut = (\n controller: Gtk.ShortcutController,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: number,\n): boolean => {\n const count = controller.getNItems();\n\n for (let j = 0; j < count; j++) {\n const shortcut = controller.getItem(j);\n\n if (!(shortcut instanceof Gtk.Shortcut)) {\n continue;\n }\n\n if (didActivateShortcut(shortcut, widget, keyval, modifiers)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst didDispatchShortcutsOnWidget = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean => {\n const controllers = widget.observeControllers();\n\n for (let i = 0; i < controllers.getNItems(); i++) {\n const controller = controllers.getItem(i);\n\n if (\n controller instanceof Gtk.ShortcutController &&\n didActivateMatchingShortcut(controller, widget, keyval, modifiers)\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst didDispatchShortcuts = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean => {\n const delegate = getEditableDelegate(widget);\n\n if (delegate && didDispatchShortcutsOnWidget(delegate, keyval, modifiers)) {\n return true;\n }\n\n for (let current: Gtk.Widget | null = widget; current; current = current.getParent()) {\n if (didDispatchShortcutsOnWidget(current, keyval, modifiers)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst handleKeyPress = async (widget: Gtk.Widget, keyval: number, modifiers: number): Promise<void> => {\n const isHandled = didDispatchShortcuts(widget, keyval, modifiers);\n\n if (!isHandled && keyval === Gdk.KEY_Return && widget instanceof Gtk.Editable) {\n await fireEvent(widget, \"activate\");\n }\n};\n\nconst applyKeyAction = async (\n widget: Gtk.Widget,\n controllers: Gtk.EventControllerKey[],\n state: UserEventState,\n action: KeyAction,\n): Promise<void> => {\n updateModifierState(state, action);\n const signalName = action.isPress ? \"key-pressed\" : \"key-released\";\n\n for (const controller of controllers) {\n controller.emit(signalName, action.keyval, 0, state.modifierState);\n }\n\n if (action.isPress) {\n await handleKeyPress(widget, action.keyval, state.modifierState);\n }\n};\n\nconst keyboard = (state: UserEventState, widget: Gtk.Widget, input: string): Promise<void> =>\n wrapEvent(widget, async () => {\n const controllers = getOrCreateControllers(widget, Gtk.EventControllerKey);\n\n for (const action of parseKeyboardInput(input)) {\n await applyKeyAction(widget, controllers, state, action);\n }\n });\n\nexport { tab, keyboard, type TabOptions };\n"]}
|
|
1
|
+
{"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/user-event/keyboard.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as Gio from \"@gtkx/gi/gio\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { hasSignalListener } from \"@gtkx/runtime/internal\";\nimport type { UserEventState } from \"./state.js\";\nimport { getEditableDelegate } from \"../editable.js\";\nimport { fireEvent } from \"../fire-event.js\";\nimport { ancestors, descendants } from \"../traversal.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\n/** Options for `userEvent.tab`. */\ntype TabOptions = {\n /** Move focus backward instead of forward. */\n isShiftHeld?: boolean;\n};\n\ntype KeyAction = { keyval: number; isPress: boolean };\ntype ParseStep = { actions: KeyAction[]; next: number };\ntype KeyStopController = Gtk.EventControllerKey | Gtk.ShortcutController;\ntype KeyStop = { widget: Gtk.Widget; controller: KeyStopController };\n\nconst KEY_MAP: Record<string, number> = {\n Enter: Gdk.KEY_Return,\n Tab: Gdk.KEY_Tab,\n Escape: Gdk.KEY_Escape,\n Backspace: Gdk.KEY_BackSpace,\n Delete: Gdk.KEY_Delete,\n ArrowUp: Gdk.KEY_Up,\n ArrowDown: Gdk.KEY_Down,\n ArrowLeft: Gdk.KEY_Left,\n ArrowRight: Gdk.KEY_Right,\n Home: Gdk.KEY_Home,\n End: Gdk.KEY_End,\n PageUp: Gdk.KEY_Page_Up,\n PageDown: Gdk.KEY_Page_Down,\n Space: Gdk.KEY_space,\n Shift: Gdk.KEY_Shift_L,\n Control: Gdk.KEY_Control_L,\n Alt: Gdk.KEY_Alt_L,\n Meta: Gdk.KEY_Meta_L,\n F1: Gdk.KEY_F1,\n F2: Gdk.KEY_F2,\n F3: Gdk.KEY_F3,\n F4: Gdk.KEY_F4,\n F5: Gdk.KEY_F5,\n F6: Gdk.KEY_F6,\n F7: Gdk.KEY_F7,\n F8: Gdk.KEY_F8,\n F9: Gdk.KEY_F9,\n F10: Gdk.KEY_F10,\n F11: Gdk.KEY_F11,\n F12: Gdk.KEY_F12,\n};\n\nconst KEY_CONTROLLER_SIGNALS = [\"key-pressed\", \"key-released\"];\n\nconst MODIFIER_KEYVAL_TO_MASK: Record<number, number> = {\n [Gdk.KEY_Shift_L]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Shift_R]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Control_L]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Control_R]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Alt_L]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Alt_R]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Meta_L]: Gdk.ModifierType.META_MASK,\n [Gdk.KEY_Meta_R]: Gdk.ModifierType.META_MASK,\n};\n\n/** Moves focus within the widget's root, forward by default and backward when `isShiftHeld` is set. */\nconst tab = (widget: Gtk.Widget, options?: TabOptions): Promise<void> =>\n wrapEvent(widget, () => {\n const direction = options?.isShiftHeld ? Gtk.DirectionType.TAB_BACKWARD : Gtk.DirectionType.TAB_FORWARD;\n const root = widget.getRoot();\n\n if (root) {\n root.childFocus(direction);\n }\n });\n\nconst parseKeyToken = (token: string): { keyval: number; isPress: boolean; isRelease: boolean } => {\n let keyName = token;\n let isPress = true;\n let isRelease = true;\n\n if (keyName.startsWith(\"/\")) {\n keyName = keyName.slice(1);\n isPress = false;\n } else if (keyName.endsWith(\">\")) {\n keyName = keyName.slice(0, -1);\n isRelease = false;\n }\n\n const keyval = KEY_MAP[keyName];\n\n if (keyval === undefined) {\n throw new Error(`Unknown key: {${keyName}}`);\n }\n\n return { keyval, isPress, isRelease };\n};\n\nconst parseCharAt = (input: string, i: number): ParseStep => {\n const keyval = input.codePointAt(i) ?? 0;\n\n return {\n actions: [\n { keyval, isPress: true },\n { keyval, isPress: false },\n ],\n next: i + 1,\n };\n};\n\nconst parseBraceAt = (input: string, i: number): ParseStep | null => {\n const endBrace = input.indexOf(\"}\", i);\n\n if (endBrace === -1) {\n return null;\n }\n\n const { keyval, isPress, isRelease } = parseKeyToken(input.slice(i + 1, endBrace));\n const actions: KeyAction[] = [];\n\n if (isPress) {\n actions.push({ keyval, isPress: true });\n }\n\n if (isRelease) {\n actions.push({ keyval, isPress: false });\n }\n\n return { actions, next: endBrace + 1 };\n};\n\nconst parseStepAt = (input: string, i: number): ParseStep | null =>\n input[i] === \"{\" ? parseBraceAt(input, i) : parseCharAt(input, i);\n\nconst parseKeyboardInput = (input: string): KeyAction[] => {\n const actions: KeyAction[] = [];\n let i = 0;\n\n while (i < input.length) {\n const step = parseStepAt(input, i);\n\n if (step === null) {\n break;\n }\n\n actions.push(...step.actions);\n i = step.next;\n }\n\n return actions;\n};\n\nconst updateModifierState = (state: UserEventState, action: KeyAction): void => {\n const mask = MODIFIER_KEYVAL_TO_MASK[action.keyval];\n\n if (!mask) {\n return;\n }\n\n if (action.isPress) {\n state.modifierState |= mask;\n } else {\n state.modifierState &= ~mask;\n }\n};\n\nconst isTriggerMatch = (\n trigger: Gtk.ShortcutTrigger | null,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (trigger instanceof Gtk.KeyvalTrigger) {\n return trigger.getKeyval() === keyval && trigger.getModifiers() === modifiers;\n }\n\n if (trigger instanceof Gtk.AlternativeTrigger) {\n return (\n isTriggerMatch(trigger.getFirst(), keyval, modifiers) ||\n isTriggerMatch(trigger.getSecond(), keyval, modifiers)\n );\n }\n\n return false;\n};\n\nconst controllersOn = function* (widget: Gtk.Widget): Generator<Gtk.EventController> {\n const controllers = widget.observeControllers();\n const count = controllers.getNItems();\n\n for (let i = 0; i < count; i++) {\n const controller = controllers.getItem(i);\n\n if (controller instanceof Gtk.EventController) {\n yield controller;\n }\n }\n};\n\nconst hasShortcut = (controller: Gtk.ShortcutController, shortcut: Gtk.Shortcut): boolean => {\n const count = controller.getNItems();\n\n for (let i = 0; i < count; i++) {\n if (controller.getItem(i) === shortcut) {\n return true;\n }\n }\n\n return false;\n};\n\nconst isManagingShortcut = (controller: Gtk.EventController, shortcut: Gtk.Shortcut): boolean =>\n controller instanceof Gtk.ShortcutController &&\n controller.getScope() !== Gtk.ShortcutScope.LOCAL &&\n hasShortcut(controller, shortcut);\n\nconst managedShortcutHost = (manager: Gtk.Widget, shortcut: Gtk.Shortcut): Gtk.Widget | null => {\n for (const current of [manager, ...descendants(manager)]) {\n if (controllersOn(current).some((controller) => isManagingShortcut(controller, shortcut))) {\n return current;\n }\n }\n\n return null;\n};\n\nconst isMovingFocus = (action: Gtk.ShortcutAction): boolean =>\n action instanceof Gtk.SignalAction && action.getSignalName() === \"move-focus\";\n\nconst isShortcutLive = (host: Gtk.Widget): boolean => host.isSensitive() && host.getMapped();\n\nconst didRunShortcutAction = (shortcut: Gtk.Shortcut, host: Gtk.Widget): boolean => {\n const action = shortcut.getAction();\n\n if (action === null || isMovingFocus(action) || !isShortcutLive(host)) {\n return false;\n }\n\n return action.activate(0 as Gtk.ShortcutActionFlags, host, shortcut.getArguments());\n};\n\nconst didActivateShortcut = (\n shortcut: Gtk.Shortcut,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (!isTriggerMatch(shortcut.getTrigger(), keyval, modifiers)) {\n return false;\n }\n\n return didRunShortcutAction(shortcut, managedShortcutHost(widget, shortcut) ?? widget);\n};\n\nconst didActivateMatchingShortcut = (\n controller: Gtk.ShortcutController,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: number,\n): boolean => {\n const count = controller.getNItems();\n\n for (let j = 0; j < count; j++) {\n const shortcut = controller.getItem(j);\n\n if (!(shortcut instanceof Gtk.Shortcut)) {\n continue;\n }\n\n if (didActivateShortcut(shortcut, widget, keyval, modifiers)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst isAccelMatch = (accel: string, keyval: number, modifiers: Gdk.ModifierType): boolean => {\n const [isParsed, accelKeyval, accelModifiers] = Gtk.acceleratorParse(accel);\n\n return isParsed && accelKeyval === keyval && accelModifiers === modifiers;\n};\n\nconst hasMatchingAccel = (\n application: Gtk.Application,\n detailedActionName: string,\n keyval: number,\n modifiers: number,\n): boolean =>\n application.getAccelsForAction(detailedActionName).some((accel) => isAccelMatch(accel, keyval, modifiers));\n\nconst didActivateDetailedAction = (window: Gtk.Window, detailedActionName: string): boolean => {\n const [isParsed, actionName, target] = Gio.Action.parseDetailedName(detailedActionName);\n\n return isParsed && window.activateAction(actionName, target);\n};\n\nconst didDispatchAccelsOnWindow = (window: Gtk.Window, keyval: number, modifiers: number): boolean => {\n const application = window.getApplication();\n\n if (!application) {\n return false;\n }\n\n for (const detailedActionName of application.listActionDescriptions()) {\n if (hasMatchingAccel(application, detailedActionName, keyval, modifiers)) {\n return didActivateDetailedAction(window, detailedActionName);\n }\n }\n\n return false;\n};\n\nconst didDispatchApplicationAccels = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean => {\n const root = widget.getRoot();\n\n return root instanceof Gtk.Window && didDispatchAccelsOnWindow(root, keyval, modifiers);\n};\n\nconst isKeyStopController = (controller: Gtk.EventController): controller is KeyStopController => {\n if (controller instanceof Gtk.ShortcutController) {\n return controller.getScope() === Gtk.ShortcutScope.LOCAL;\n }\n\n return controller instanceof Gtk.EventControllerKey && hasSignalListener(controller, KEY_CONTROLLER_SIGNALS);\n};\n\nconst keyStopsInPhase = (widget: Gtk.Widget, phase: Gtk.PropagationPhase): KeyStop[] => {\n const stops: KeyStop[] = [];\n\n for (const controller of controllersOn(widget)) {\n if (controller.getPropagationPhase() === phase && isKeyStopController(controller)) {\n stops.push({ widget, controller });\n }\n }\n\n return stops;\n};\n\nconst propagationChain = (widget: Gtk.Widget): Gtk.Widget[] => {\n const delegate = getEditableDelegate(widget);\n const below = delegate === null ? [] : [delegate];\n\n return [...below, widget, ...ancestors(widget)];\n};\n\nconst keyPropagationChain = (widget: Gtk.Widget): KeyStop[] => {\n const chain = propagationChain(widget);\n const [eventWidget = widget] = chain;\n\n return [\n ...chain.toReversed().flatMap((current) => keyStopsInPhase(current, Gtk.PropagationPhase.CAPTURE)),\n ...keyStopsInPhase(eventWidget, Gtk.PropagationPhase.TARGET),\n ...chain.flatMap((current) => keyStopsInPhase(current, Gtk.PropagationPhase.BUBBLE)),\n ];\n};\n\nconst didStopHandlePress = (stop: KeyStop, keyval: number, modifiers: Gdk.ModifierType): boolean => {\n const { controller, widget } = stop;\n\n if (controller instanceof Gtk.ShortcutController) {\n return didActivateMatchingShortcut(controller, widget, keyval, modifiers);\n }\n\n return controller.emit(\"key-pressed\", keyval, 0, modifiers);\n};\n\nconst didHandlePress = (widget: Gtk.Widget, keyval: number, modifiers: Gdk.ModifierType): boolean =>\n didDispatchApplicationAccels(widget, keyval, modifiers) ||\n keyPropagationChain(widget).some((stop) => didStopHandlePress(stop, keyval, modifiers));\n\nconst emitKeyReleased = (widget: Gtk.Widget, keyval: number, modifiers: Gdk.ModifierType): void => {\n for (const stop of keyPropagationChain(widget)) {\n if (stop.controller instanceof Gtk.EventControllerKey) {\n stop.controller.emit(\"key-released\", keyval, 0, modifiers);\n }\n }\n};\n\nconst applyKeyPress = async (widget: Gtk.Widget, keyval: number, modifiers: Gdk.ModifierType): Promise<void> => {\n if (didHandlePress(widget, keyval, modifiers)) {\n return;\n }\n\n if (keyval === Gdk.KEY_Return && widget instanceof Gtk.Editable) {\n await fireEvent(widget, \"activate\");\n }\n};\n\nconst applyKeyAction = async (widget: Gtk.Widget, state: UserEventState, action: KeyAction): Promise<void> => {\n updateModifierState(state, action);\n\n if (action.isPress) {\n await applyKeyPress(widget, action.keyval, state.modifierState);\n\n return;\n }\n\n emitKeyReleased(widget, action.keyval, state.modifierState);\n};\n\nconst keyboard = (state: UserEventState, widget: Gtk.Widget, input: string): Promise<void> =>\n wrapEvent(widget, async () => {\n for (const action of parseKeyboardInput(input)) {\n await applyKeyAction(widget, state, action);\n }\n });\n\nexport { tab, keyboard, type TabOptions };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-row-click.d.ts","sourceRoot":"","sources":["../../src/user-event/list-row-click.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AA+CzC,QAAA,MAAM,aAAa,GAAI,KAAK,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,KAAG,IAIxD,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as GLib from "@gtkx/gi/glib";
|
|
2
|
+
import { ancestors } from "../traversal.js";
|
|
3
|
+
import { callBooleanGetter, hasWidgetMethod } from "../widget-getters.js";
|
|
4
|
+
const SELECT_ACTION = "listitem.select";
|
|
5
|
+
const SINGLE_CLICK_ACTIVATE_GETTER = "getSingleClickActivate";
|
|
6
|
+
const DOUBLE_CLICK_PRESS = 2;
|
|
7
|
+
const viewFor = (row) => {
|
|
8
|
+
for (const ancestor of ancestors(row)) {
|
|
9
|
+
if (hasWidgetMethod(ancestor, SINGLE_CLICK_ACTIVATE_GETTER)) {
|
|
10
|
+
return ancestor;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
};
|
|
15
|
+
const isViewSingleClickActivating = (row) => {
|
|
16
|
+
const view = viewFor(row);
|
|
17
|
+
return view === null ? false : callBooleanGetter(view, SINGLE_CLICK_ACTIVATE_GETTER) ?? false;
|
|
18
|
+
};
|
|
19
|
+
const selectRow = (row) => {
|
|
20
|
+
row.activateAction(SELECT_ACTION, GLib.Variant.newTuple([GLib.Variant.newBoolean(false), GLib.Variant.newBoolean(false)]));
|
|
21
|
+
};
|
|
22
|
+
const isRowActivatedByPress = (row, press) => press === DOUBLE_CLICK_PRESS || isViewSingleClickActivating(row);
|
|
23
|
+
const applyRowPress = (row, press) => {
|
|
24
|
+
if (row.getFocusOnClick()) {
|
|
25
|
+
row.grabFocus();
|
|
26
|
+
}
|
|
27
|
+
selectRow(row);
|
|
28
|
+
if (isRowActivatedByPress(row, press)) {
|
|
29
|
+
row.activate();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const applyRowClick = (row, nPress) => {
|
|
33
|
+
for (let press = 1; press <= nPress; press++) {
|
|
34
|
+
applyRowPress(row, press);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
export { applyRowClick };
|
|
38
|
+
//# sourceMappingURL=list-row-click.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-row-click.js","sourceRoot":"","sources":["../../src/user-event/list-row-click.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,aAAa,GAAG,iBAAiB,CAAC;AACxC,MAAM,4BAA4B,GAAG,wBAAwB,CAAC;AAC9D,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,OAAO,GAAG,CAAC,GAAe,EAAqB,EAAE;IACnD,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,eAAe,CAAC,QAAQ,EAAE,4BAA4B,CAAC,EAAE,CAAC;YAC1D,OAAO,QAAQ,CAAC;QACpB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAAC,GAAe,EAAW,EAAE;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1B,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,4BAA4B,CAAC,IAAI,KAAK,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,GAAe,EAAQ,EAAE;IACxC,GAAG,CAAC,cAAc,CACd,aAAa,EACb,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAC1F,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,GAAe,EAAE,KAAa,EAAW,EAAE,CACtE,KAAK,KAAK,kBAAkB,IAAI,2BAA2B,CAAC,GAAG,CAAC,CAAC;AAErE,MAAM,aAAa,GAAG,CAAC,GAAe,EAAE,KAAa,EAAQ,EAAE;IAC3D,IAAI,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC;QACxB,GAAG,CAAC,SAAS,EAAE,CAAC;IACpB,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,CAAC;IAEf,IAAI,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACnB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,GAAe,EAAE,MAAc,EAAQ,EAAE;IAC5D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport * as GLib from \"@gtkx/gi/glib\";\nimport { ancestors } from \"../traversal.js\";\nimport { callBooleanGetter, hasWidgetMethod } from \"../widget-getters.js\";\n\nconst SELECT_ACTION = \"listitem.select\";\nconst SINGLE_CLICK_ACTIVATE_GETTER = \"getSingleClickActivate\";\nconst DOUBLE_CLICK_PRESS = 2;\n\nconst viewFor = (row: Gtk.Widget): Gtk.Widget | null => {\n for (const ancestor of ancestors(row)) {\n if (hasWidgetMethod(ancestor, SINGLE_CLICK_ACTIVATE_GETTER)) {\n return ancestor;\n }\n }\n\n return null;\n};\n\nconst isViewSingleClickActivating = (row: Gtk.Widget): boolean => {\n const view = viewFor(row);\n\n return view === null ? false : callBooleanGetter(view, SINGLE_CLICK_ACTIVATE_GETTER) ?? false;\n};\n\nconst selectRow = (row: Gtk.Widget): void => {\n row.activateAction(\n SELECT_ACTION,\n GLib.Variant.newTuple([GLib.Variant.newBoolean(false), GLib.Variant.newBoolean(false)]),\n );\n};\n\nconst isRowActivatedByPress = (row: Gtk.Widget, press: number): boolean =>\n press === DOUBLE_CLICK_PRESS || isViewSingleClickActivating(row);\n\nconst applyRowPress = (row: Gtk.Widget, press: number): void => {\n if (row.getFocusOnClick()) {\n row.grabFocus();\n }\n\n selectRow(row);\n\n if (isRowActivatedByPress(row, press)) {\n row.activate();\n }\n};\n\nconst applyRowClick = (row: Gtk.Widget, nPress: number): void => {\n for (let press = 1; press <= nPress; press++) {\n applyRowPress(row, press);\n }\n};\n\nexport { applyRowClick };\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
type NativeClick = (widget: Gtk.Widget, nPress: number) => void;
|
|
3
|
+
declare const isClickTransparent: (widget: Gtk.Widget) => boolean;
|
|
4
|
+
declare const nativeClickFor: (widget: Gtk.Widget, isClicked: boolean) => NativeClick | null;
|
|
5
|
+
export { isClickTransparent, type NativeClick, nativeClickFor };
|
|
6
|
+
//# sourceMappingURL=native-click.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-click.d.ts","sourceRoot":"","sources":["../../src/user-event/native-click.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAMpC,KAAK,WAAW,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAWhE,QAAA,MAAM,kBAAkB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OACsB,CAAC;AAgBxE,QAAA,MAAM,cAAc,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,WAAW,OAAO,KAAG,WAAW,GAAG,IAc9E,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,KAAK,WAAW,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { getWidgetTypeName } from "../widget-getters.js";
|
|
3
|
+
import { applyHeaderClick } from "./column-header-click.js";
|
|
4
|
+
import { applyRowClick } from "./list-row-click.js";
|
|
5
|
+
import { applyTabClick, isNotebookTab } from "./notebook-tab-click.js";
|
|
6
|
+
const COLUMN_ROW_TYPE_NAME = "GtkColumnViewRowWidget";
|
|
7
|
+
const ROW_TYPE_NAMES = new Set([COLUMN_ROW_TYPE_NAME, "GtkListItemWidget"]);
|
|
8
|
+
const CELL_TYPE_NAME = "GtkColumnViewCellWidget";
|
|
9
|
+
const TITLE_TYPE_NAME = "GtkColumnViewTitle";
|
|
10
|
+
const TOGGLE_EXPAND_ACTION = "listitem.toggle-expand";
|
|
11
|
+
const isHeaderRow = (widget) => getWidgetTypeName(widget) === COLUMN_ROW_TYPE_NAME && widget.getParent() instanceof Gtk.ColumnView;
|
|
12
|
+
const isClickTransparent = (widget) => getWidgetTypeName(widget) === CELL_TYPE_NAME || isHeaderRow(widget);
|
|
13
|
+
const isExpanderToggling = (widget) => widget instanceof Gtk.TreeExpander &&
|
|
14
|
+
widget.getListRow()?.isExpandable() === true &&
|
|
15
|
+
!widget.getHideExpander();
|
|
16
|
+
const isColumnHeader = (widget) => getWidgetTypeName(widget) === TITLE_TYPE_NAME;
|
|
17
|
+
const isFactoryRow = (widget) => ROW_TYPE_NAMES.has(getWidgetTypeName(widget) ?? "");
|
|
18
|
+
const toggleExpander = (widget, nPress) => {
|
|
19
|
+
for (let press = 1; press <= nPress; press++) {
|
|
20
|
+
widget.activateAction(TOGGLE_EXPAND_ACTION, null);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const nativeClickFor = (widget, isClicked) => {
|
|
24
|
+
if (isClicked && isExpanderToggling(widget)) {
|
|
25
|
+
return toggleExpander;
|
|
26
|
+
}
|
|
27
|
+
if (isColumnHeader(widget)) {
|
|
28
|
+
return applyHeaderClick;
|
|
29
|
+
}
|
|
30
|
+
if (isNotebookTab(widget)) {
|
|
31
|
+
return applyTabClick;
|
|
32
|
+
}
|
|
33
|
+
return isFactoryRow(widget) ? applyRowClick : null;
|
|
34
|
+
};
|
|
35
|
+
export { isClickTransparent, nativeClickFor };
|
|
36
|
+
//# sourceMappingURL=native-click.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-click.js","sourceRoot":"","sources":["../../src/user-event/native-click.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAIvE,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AACtD,MAAM,cAAc,GAAgB,IAAI,GAAG,CAAC,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC,CAAC;AACzF,MAAM,cAAc,GAAG,yBAAyB,CAAC;AACjD,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAC7C,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAEtD,MAAM,WAAW,GAAG,CAAC,MAAkB,EAAW,EAAE,CAChD,iBAAiB,CAAC,MAAM,CAAC,KAAK,oBAAoB,IAAI,MAAM,CAAC,SAAS,EAAE,YAAY,GAAG,CAAC,UAAU,CAAC;AAEvG,MAAM,kBAAkB,GAAG,CAAC,MAAkB,EAAW,EAAE,CACvD,iBAAiB,CAAC,MAAM,CAAC,KAAK,cAAc,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAExE,MAAM,kBAAkB,GAAG,CAAC,MAAkB,EAAW,EAAE,CACvD,MAAM,YAAY,GAAG,CAAC,YAAY;IAClC,MAAM,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,KAAK,IAAI;IAC5C,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;AAE9B,MAAM,cAAc,GAAG,CAAC,MAAkB,EAAW,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,eAAe,CAAC;AACtG,MAAM,YAAY,GAAG,CAAC,MAAkB,EAAW,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAE1G,MAAM,cAAc,GAAG,CAAC,MAAkB,EAAE,MAAc,EAAQ,EAAE;IAChE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,MAAkB,EAAE,SAAkB,EAAsB,EAAE;IAClF,IAAI,SAAS,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,gBAAgB,CAAC;IAC5B,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAoB,cAAc,EAAE,CAAC","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { getWidgetTypeName } from \"../widget-getters.js\";\nimport { applyHeaderClick } from \"./column-header-click.js\";\nimport { applyRowClick } from \"./list-row-click.js\";\nimport { applyTabClick, isNotebookTab } from \"./notebook-tab-click.js\";\n\ntype NativeClick = (widget: Gtk.Widget, nPress: number) => void;\n\nconst COLUMN_ROW_TYPE_NAME = \"GtkColumnViewRowWidget\";\nconst ROW_TYPE_NAMES: Set<string> = new Set([COLUMN_ROW_TYPE_NAME, \"GtkListItemWidget\"]);\nconst CELL_TYPE_NAME = \"GtkColumnViewCellWidget\";\nconst TITLE_TYPE_NAME = \"GtkColumnViewTitle\";\nconst TOGGLE_EXPAND_ACTION = \"listitem.toggle-expand\";\n\nconst isHeaderRow = (widget: Gtk.Widget): boolean =>\n getWidgetTypeName(widget) === COLUMN_ROW_TYPE_NAME && widget.getParent() instanceof Gtk.ColumnView;\n\nconst isClickTransparent = (widget: Gtk.Widget): boolean =>\n getWidgetTypeName(widget) === CELL_TYPE_NAME || isHeaderRow(widget);\n\nconst isExpanderToggling = (widget: Gtk.Widget): boolean =>\n widget instanceof Gtk.TreeExpander &&\n widget.getListRow()?.isExpandable() === true &&\n !widget.getHideExpander();\n\nconst isColumnHeader = (widget: Gtk.Widget): boolean => getWidgetTypeName(widget) === TITLE_TYPE_NAME;\nconst isFactoryRow = (widget: Gtk.Widget): boolean => ROW_TYPE_NAMES.has(getWidgetTypeName(widget) ?? \"\");\n\nconst toggleExpander = (widget: Gtk.Widget, nPress: number): void => {\n for (let press = 1; press <= nPress; press++) {\n widget.activateAction(TOGGLE_EXPAND_ACTION, null);\n }\n};\n\nconst nativeClickFor = (widget: Gtk.Widget, isClicked: boolean): NativeClick | null => {\n if (isClicked && isExpanderToggling(widget)) {\n return toggleExpander;\n }\n\n if (isColumnHeader(widget)) {\n return applyHeaderClick;\n }\n\n if (isNotebookTab(widget)) {\n return applyTabClick;\n }\n\n return isFactoryRow(widget) ? applyRowClick : null;\n};\n\nexport { isClickTransparent, type NativeClick, nativeClickFor };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-tab-click.d.ts","sourceRoot":"","sources":["../../src/user-event/notebook-tab-click.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAwCpC,QAAA,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAA0C,CAAC;AAEvF,QAAA,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,IAY3C,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { ancestorFor } from "../traversal.js";
|
|
3
|
+
const tabLabelsFor = (notebook) => {
|
|
4
|
+
const labels = [];
|
|
5
|
+
for (let index = 0; index < notebook.getNPages(); index++) {
|
|
6
|
+
const child = notebook.getNthPage(index);
|
|
7
|
+
labels.push(child === null ? null : notebook.getPage(child).tab);
|
|
8
|
+
}
|
|
9
|
+
return labels;
|
|
10
|
+
};
|
|
11
|
+
const isNested = (outer, inner) => outer === inner || inner.isAncestor(outer);
|
|
12
|
+
const isSameTab = (tab, label) => label !== null && (isNested(tab, label) || isNested(label, tab));
|
|
13
|
+
const tabIndexFor = (notebook, tab) => {
|
|
14
|
+
const matches = tabLabelsFor(notebook)
|
|
15
|
+
.map((label, index) => (isSameTab(tab, label) ? index : -1))
|
|
16
|
+
.filter((index) => index >= 0);
|
|
17
|
+
return matches.length === 1 ? matches[0] ?? -1 : -1;
|
|
18
|
+
};
|
|
19
|
+
const notebookTabFor = (widget) => {
|
|
20
|
+
if (widget.getAccessibleRole() !== Gtk.AccessibleRole.TAB) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const notebook = ancestorFor(widget, Gtk.Notebook);
|
|
24
|
+
const index = notebook === null ? -1 : tabIndexFor(notebook, widget);
|
|
25
|
+
return notebook === null || index < 0 ? null : { notebook, index };
|
|
26
|
+
};
|
|
27
|
+
const isNotebookTab = (widget) => notebookTabFor(widget) !== null;
|
|
28
|
+
const applyTabClick = (widget) => {
|
|
29
|
+
const tab = notebookTabFor(widget);
|
|
30
|
+
if (tab === null) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (tab.notebook.getFocusOnClick()) {
|
|
34
|
+
tab.notebook.grabFocus();
|
|
35
|
+
}
|
|
36
|
+
tab.notebook.setCurrentPage(tab.index);
|
|
37
|
+
};
|
|
38
|
+
export { applyTabClick, isNotebookTab };
|
|
39
|
+
//# sourceMappingURL=notebook-tab-click.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-tab-click.js","sourceRoot":"","sources":["../../src/user-event/notebook-tab-click.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { ancestorFor } from \"../traversal.js\";\n\ntype NotebookTab = { notebook: Gtk.Notebook; index: number };\n\nconst tabLabelsFor = (notebook: Gtk.Notebook): (Gtk.Widget | null)[] => {\n const labels: (Gtk.Widget | null)[] = [];\n\n for (let index = 0; index < notebook.getNPages(); index++) {\n const child = notebook.getNthPage(index);\n labels.push(child === null ? null : notebook.getPage(child).tab);\n }\n\n return labels;\n};\n\nconst isNested = (outer: Gtk.Widget, inner: Gtk.Widget): boolean => outer === inner || inner.isAncestor(outer);\n\nconst isSameTab = (tab: Gtk.Widget, label: Gtk.Widget | null): boolean =>\n label !== null && (isNested(tab, label) || isNested(label, tab));\n\nconst tabIndexFor = (notebook: Gtk.Notebook, tab: Gtk.Widget): number => {\n const matches = tabLabelsFor(notebook)\n .map((label, index) => (isSameTab(tab, label) ? index : -1))\n .filter((index) => index >= 0);\n\n return matches.length === 1 ? matches[0] ?? -1 : -1;\n};\n\nconst notebookTabFor = (widget: Gtk.Widget): NotebookTab | null => {\n if (widget.getAccessibleRole() !== Gtk.AccessibleRole.TAB) {\n return null;\n }\n\n const notebook = ancestorFor(widget, Gtk.Notebook);\n const index = notebook === null ? -1 : tabIndexFor(notebook, widget);\n\n return notebook === null || index < 0 ? null : { notebook, index };\n};\n\nconst isNotebookTab = (widget: Gtk.Widget): boolean => notebookTabFor(widget) !== null;\n\nconst applyTabClick = (widget: Gtk.Widget): void => {\n const tab = notebookTabFor(widget);\n\n if (tab === null) {\n return;\n }\n\n if (tab.notebook.getFocusOnClick()) {\n tab.notebook.grabFocus();\n }\n\n tab.notebook.setCurrentPage(tab.index);\n};\n\nexport { applyTabClick, isNotebookTab };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD;;;GAGG;AACH,KAAK,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;AAoE9F,QAAA,MAAM,OAAO,GAAI,OAAO,cAAc,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAGxF,CAAC;AAEP,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,CAAC"}
|
|
@@ -1,25 +1,49 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { emitPress, emitRelease } from "./click.js";
|
|
3
|
-
import { getOrCreateControllers } from "./controller.js";
|
|
1
|
+
import { clickGestures, emitClickPhase, getAuthoredClickGestures } from "./click.js";
|
|
4
2
|
import { wrapEvent } from "./event-wrapper.js";
|
|
3
|
+
import { isClickTransparent, nativeClickFor } from "./native-click.js";
|
|
5
4
|
const PRESS_INPUTS = new Set(["[MouseLeft>]", "down"]);
|
|
6
5
|
const RELEASE_INPUTS = new Set(["[/MouseLeft]", "up"]);
|
|
7
6
|
const CLICK_INPUTS = new Set(["[MouseLeft]", "click"]);
|
|
7
|
+
const pointerWidgetFor = (widget) => {
|
|
8
|
+
let current = widget;
|
|
9
|
+
while (isClickTransparent(current)) {
|
|
10
|
+
const parent = current.getParent();
|
|
11
|
+
if (parent === null) {
|
|
12
|
+
return current;
|
|
13
|
+
}
|
|
14
|
+
current = parent;
|
|
15
|
+
}
|
|
16
|
+
return current;
|
|
17
|
+
};
|
|
18
|
+
const pointerGesturesFor = (widget, native) => native === null ? clickGestures(widget) : getAuthoredClickGestures(widget);
|
|
19
|
+
const pointerTargetFor = (widget) => {
|
|
20
|
+
const target = pointerWidgetFor(widget);
|
|
21
|
+
const native = nativeClickFor(target, true);
|
|
22
|
+
return { widget: target, gestures: pointerGesturesFor(target, native), native };
|
|
23
|
+
};
|
|
24
|
+
const pressPointer = ({ widget, gestures }) => {
|
|
25
|
+
emitClickPhase(widget, gestures, 1, "pressed");
|
|
26
|
+
};
|
|
27
|
+
const releasePointer = ({ widget, gestures, native }) => {
|
|
28
|
+
emitClickPhase(widget, gestures, 1, "released");
|
|
29
|
+
native?.(widget, 1);
|
|
30
|
+
};
|
|
31
|
+
const isPointerPressable = (target) => target.native !== null || target.gestures.length > 0;
|
|
8
32
|
const applyPointerInput = (widget, state, input) => {
|
|
9
|
-
const
|
|
33
|
+
const target = pointerTargetFor(widget);
|
|
10
34
|
if (CLICK_INPUTS.has(input)) {
|
|
11
|
-
|
|
12
|
-
|
|
35
|
+
pressPointer(target);
|
|
36
|
+
releasePointer(target);
|
|
13
37
|
state.isMouseLeftDown = false;
|
|
14
38
|
return;
|
|
15
39
|
}
|
|
16
|
-
if (PRESS_INPUTS.has(input) && !state.isMouseLeftDown) {
|
|
17
|
-
|
|
40
|
+
if (PRESS_INPUTS.has(input) && !state.isMouseLeftDown && isPointerPressable(target)) {
|
|
41
|
+
pressPointer(target);
|
|
18
42
|
state.isMouseLeftDown = true;
|
|
19
43
|
return;
|
|
20
44
|
}
|
|
21
45
|
if (RELEASE_INPUTS.has(input) && state.isMouseLeftDown) {
|
|
22
|
-
|
|
46
|
+
releasePointer(target);
|
|
23
47
|
state.isMouseLeftDown = false;
|
|
24
48
|
}
|
|
25
49
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer.js","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pointer.js","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport type { NativeClick } from \"./native-click.js\";\nimport type { UserEventState } from \"./state.js\";\nimport { clickGestures, emitClickPhase, getAuthoredClickGestures } from \"./click.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\nimport { isClickTransparent, nativeClickFor } from \"./native-click.js\";\n\n/**\n * A pointer action token: a full click (`click`, `[MouseLeft]`), a button press (`down`,\n * `[MouseLeft>]`), or a button release (`up`, `[/MouseLeft]`).\n */\ntype PointerInput = \"click\" | \"down\" | \"up\" | \"[MouseLeft]\" | \"[MouseLeft>]\" | \"[/MouseLeft]\";\ntype PointerTarget = { widget: Gtk.Widget; gestures: Gtk.GestureClick[]; native: NativeClick | null };\n\nconst PRESS_INPUTS: Set<PointerInput> = new Set([\"[MouseLeft>]\", \"down\"]);\nconst RELEASE_INPUTS: Set<PointerInput> = new Set([\"[/MouseLeft]\", \"up\"]);\nconst CLICK_INPUTS: Set<PointerInput> = new Set([\"[MouseLeft]\", \"click\"]);\n\nconst pointerWidgetFor = (widget: Gtk.Widget): Gtk.Widget => {\n let current = widget;\n\n while (isClickTransparent(current)) {\n const parent = current.getParent();\n\n if (parent === null) {\n return current;\n }\n\n current = parent;\n }\n\n return current;\n};\n\nconst pointerGesturesFor = (widget: Gtk.Widget, native: NativeClick | null): Gtk.GestureClick[] =>\n native === null ? clickGestures(widget) : getAuthoredClickGestures(widget);\n\nconst pointerTargetFor = (widget: Gtk.Widget): PointerTarget => {\n const target = pointerWidgetFor(widget);\n const native = nativeClickFor(target, true);\n\n return { widget: target, gestures: pointerGesturesFor(target, native), native };\n};\n\nconst pressPointer = ({ widget, gestures }: PointerTarget): void => {\n emitClickPhase(widget, gestures, 1, \"pressed\");\n};\n\nconst releasePointer = ({ widget, gestures, native }: PointerTarget): void => {\n emitClickPhase(widget, gestures, 1, \"released\");\n native?.(widget, 1);\n};\n\nconst isPointerPressable = (target: PointerTarget): boolean => target.native !== null || target.gestures.length > 0;\n\nconst applyPointerInput = (widget: Gtk.Widget, state: UserEventState, input: PointerInput): void => {\n const target = pointerTargetFor(widget);\n\n if (CLICK_INPUTS.has(input)) {\n pressPointer(target);\n releasePointer(target);\n state.isMouseLeftDown = false;\n\n return;\n }\n\n if (PRESS_INPUTS.has(input) && !state.isMouseLeftDown && isPointerPressable(target)) {\n pressPointer(target);\n state.isMouseLeftDown = true;\n\n return;\n }\n\n if (RELEASE_INPUTS.has(input) && state.isMouseLeftDown) {\n releasePointer(target);\n state.isMouseLeftDown = false;\n }\n};\n\nconst pointer = (state: UserEventState, widget: Gtk.Widget, input: PointerInput): Promise<void> =>\n wrapEvent(widget, () => {\n applyPointerInput(widget, state, input);\n });\n\nexport { pointer, type PointerInput };\n"]}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
2
|
/**
|
|
3
3
|
* Selects the items at the given positions through a list, grid, or column view's selection model,
|
|
4
|
-
* by setting the
|
|
5
|
-
* array clears a view's
|
|
4
|
+
* by setting the selected position of a widget with the COMBO_BOX role, or by selecting the indexed
|
|
5
|
+
* children of a list box or flow box through their container. An empty array clears a view's
|
|
6
|
+
* selection. The children are never activated, so no row-activated handler runs.
|
|
6
7
|
*
|
|
7
|
-
* @throws When a view has no selection model, when a
|
|
8
|
-
*
|
|
8
|
+
* @throws When a view has no selection model, when a COMBO_BOX-role widget is given more than one
|
|
9
|
+
* position or exposes no `setSelected`, or when the widget's role is none of COMBO_BOX, GRID, or
|
|
10
|
+
* LIST.
|
|
9
11
|
*/
|
|
10
12
|
declare const selectOptions: (widget: Gtk.Widget, values: number | number[]) => Promise<void>;
|
|
11
13
|
/**
|
|
12
|
-
* Unselects the items at the given positions in a list, grid, or column view, or the
|
|
13
|
-
*
|
|
14
|
+
* Unselects the items at the given positions in a list, grid, or column view, or unselects the
|
|
15
|
+
* indexed children of a list box or flow box through their container. A child that is not selected
|
|
16
|
+
* is left alone, and no child is activated.
|
|
14
17
|
*
|
|
15
|
-
* @throws When a view has no selection model,
|
|
16
|
-
*
|
|
18
|
+
* @throws When a view has no selection model, when the widget's role is none of COMBO_BOX, GRID, or
|
|
19
|
+
* LIST, or when it exposes no indexed children.
|
|
17
20
|
*/
|
|
18
21
|
declare const deselectOptions: (widget: Gtk.Widget, values: number | number[]) => Promise<void>;
|
|
19
22
|
export { selectOptions, deselectOptions };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/user-event/selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/user-event/selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AA6JpC;;;;;;;;;GASG;AACH,QAAA,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACd,CAAC;AAoBtE;;;;;;;GAOG;AACH,QAAA,MAAM,eAAe,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACZ,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
2
|
import { formatRoleList } from "../role-helpers.js";
|
|
3
|
+
import { getCallableMethod } from "../widget-getters.js";
|
|
3
4
|
import { wrapEvent } from "./event-wrapper.js";
|
|
4
|
-
|
|
5
|
+
import { getChildAtIndex, hasIndexedChildren, isChildSelected, selectContainerChild, unselectContainerChild, } from "./indexed-children.js";
|
|
6
|
+
const SELECTABLE_ROLES = new Set([
|
|
7
|
+
Gtk.AccessibleRole.COMBO_BOX,
|
|
8
|
+
Gtk.AccessibleRole.GRID,
|
|
9
|
+
Gtk.AccessibleRole.LIST,
|
|
10
|
+
]);
|
|
5
11
|
const isSelectable = (widget) => {
|
|
6
12
|
return SELECTABLE_ROLES.has(widget.getAccessibleRole());
|
|
7
13
|
};
|
|
@@ -24,35 +30,31 @@ const selectListViewItems = (selectionModel, positions, isExclusive) => {
|
|
|
24
30
|
selectionModel.setSelection(selected, mask);
|
|
25
31
|
};
|
|
26
32
|
const isListView = (widget) => widget instanceof Gtk.ListView || widget instanceof Gtk.GridView || widget instanceof Gtk.ColumnView;
|
|
27
|
-
const
|
|
33
|
+
const getIndexSelector = (widget) => getCallableMethod(widget, "setSelected");
|
|
34
|
+
const selectDropDownOption = (widget, valueArray) => {
|
|
35
|
+
const setSelected = getIndexSelector(widget);
|
|
36
|
+
if (!setSelected) {
|
|
37
|
+
throw new TypeError("Cannot select options: the COMBO_BOX role needs a widget exposing setSelected");
|
|
38
|
+
}
|
|
28
39
|
if (valueArray.length > 1) {
|
|
29
|
-
throw new Error("Cannot select multiple options:
|
|
40
|
+
throw new Error("Cannot select multiple options: a drop-down only supports single selection");
|
|
30
41
|
}
|
|
31
42
|
const [selection] = valueArray;
|
|
32
|
-
if (selection
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
if (widget instanceof Gtk.DropDown) {
|
|
36
|
-
widget.setSelected(selection);
|
|
43
|
+
if (selection !== undefined) {
|
|
44
|
+
setSelected(selection);
|
|
37
45
|
}
|
|
38
|
-
else if (widget instanceof Gtk.ComboBox) {
|
|
39
|
-
widget.setActive(selection);
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
const selectListBoxRow = (listBox, row) => {
|
|
43
|
-
listBox.selectRow(row);
|
|
44
|
-
row.activate();
|
|
45
46
|
};
|
|
46
|
-
const
|
|
47
|
-
|
|
47
|
+
const unselectChildRow = (container, child) => {
|
|
48
|
+
if (isChildSelected(child)) {
|
|
49
|
+
unselectContainerChild(container, child);
|
|
50
|
+
}
|
|
48
51
|
};
|
|
49
|
-
const
|
|
52
|
+
const applyIndexedChildren = (widget, valueArray, apply) => {
|
|
50
53
|
for (const value of valueArray) {
|
|
51
|
-
const
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
+
const child = getChildAtIndex(widget, value);
|
|
55
|
+
if (child) {
|
|
56
|
+
apply(widget, child);
|
|
54
57
|
}
|
|
55
|
-
apply(listBox, row);
|
|
56
58
|
}
|
|
57
59
|
};
|
|
58
60
|
const requireSelectionModel = (widget, verb) => {
|
|
@@ -67,17 +69,22 @@ const selectInListView = (widget, valueArray) => {
|
|
|
67
69
|
const isMultiSelection = selectionModel instanceof Gtk.MultiSelection;
|
|
68
70
|
selectListViewItems(selectionModel, valueArray, !isMultiSelection);
|
|
69
71
|
};
|
|
70
|
-
const
|
|
72
|
+
const requireSelectableRole = (widget, verb) => {
|
|
71
73
|
if (!isSelectable(widget)) {
|
|
72
|
-
throw new Error(`Cannot
|
|
74
|
+
throw new Error(`Cannot ${verb} options: expected selectable widget (${formatRoleList(SELECTABLE_ROLES)})`);
|
|
73
75
|
}
|
|
76
|
+
};
|
|
77
|
+
const selectByRole = (widget, valueArray) => {
|
|
78
|
+
requireSelectableRole(widget, "select");
|
|
74
79
|
const role = widget.getAccessibleRole();
|
|
75
80
|
if (role === Gtk.AccessibleRole.COMBO_BOX) {
|
|
76
|
-
|
|
81
|
+
selectDropDownOption(widget, valueArray);
|
|
82
|
+
return;
|
|
77
83
|
}
|
|
78
|
-
|
|
79
|
-
|
|
84
|
+
if (!hasIndexedChildren(widget)) {
|
|
85
|
+
throw new TypeError("Cannot select options: the widget exposes no children to select by index");
|
|
80
86
|
}
|
|
87
|
+
applyIndexedChildren(widget, valueArray, selectContainerChild);
|
|
81
88
|
};
|
|
82
89
|
const runSelectionEvent = (widget, values, inListView, byRole) => wrapEvent(widget, () => {
|
|
83
90
|
const valueArray = Array.isArray(values) ? values : [values];
|
|
@@ -89,11 +96,13 @@ const runSelectionEvent = (widget, values, inListView, byRole) => wrapEvent(widg
|
|
|
89
96
|
});
|
|
90
97
|
/**
|
|
91
98
|
* Selects the items at the given positions through a list, grid, or column view's selection model,
|
|
92
|
-
* by setting the
|
|
93
|
-
* array clears a view's
|
|
99
|
+
* by setting the selected position of a widget with the COMBO_BOX role, or by selecting the indexed
|
|
100
|
+
* children of a list box or flow box through their container. An empty array clears a view's
|
|
101
|
+
* selection. The children are never activated, so no row-activated handler runs.
|
|
94
102
|
*
|
|
95
|
-
* @throws When a view has no selection model, when a
|
|
96
|
-
*
|
|
103
|
+
* @throws When a view has no selection model, when a COMBO_BOX-role widget is given more than one
|
|
104
|
+
* position or exposes no `setSelected`, or when the widget's role is none of COMBO_BOX, GRID, or
|
|
105
|
+
* LIST.
|
|
97
106
|
*/
|
|
98
107
|
const selectOptions = (widget, values) => runSelectionEvent(widget, values, selectInListView, selectByRole);
|
|
99
108
|
const deselectInListView = (widget, valueArray) => {
|
|
@@ -103,17 +112,19 @@ const deselectInListView = (widget, valueArray) => {
|
|
|
103
112
|
}
|
|
104
113
|
};
|
|
105
114
|
const deselectByRole = (widget, valueArray) => {
|
|
106
|
-
|
|
107
|
-
|
|
115
|
+
requireSelectableRole(widget, "deselect");
|
|
116
|
+
if (!hasIndexedChildren(widget)) {
|
|
117
|
+
throw new TypeError("Cannot deselect options: the widget exposes no children to deselect by index");
|
|
108
118
|
}
|
|
109
|
-
|
|
119
|
+
applyIndexedChildren(widget, valueArray, unselectChildRow);
|
|
110
120
|
};
|
|
111
121
|
/**
|
|
112
|
-
* Unselects the items at the given positions in a list, grid, or column view, or the
|
|
113
|
-
*
|
|
122
|
+
* Unselects the items at the given positions in a list, grid, or column view, or unselects the
|
|
123
|
+
* indexed children of a list box or flow box through their container. A child that is not selected
|
|
124
|
+
* is left alone, and no child is activated.
|
|
114
125
|
*
|
|
115
|
-
* @throws When a view has no selection model,
|
|
116
|
-
*
|
|
126
|
+
* @throws When a view has no selection model, when the widget's role is none of COMBO_BOX, GRID, or
|
|
127
|
+
* LIST, or when it exposes no indexed children.
|
|
117
128
|
*/
|
|
118
129
|
const deselectOptions = (widget, values) => runSelectionEvent(widget, values, deselectInListView, deselectByRole);
|
|
119
130
|
export { selectOptions, deselectOptions };
|