@gtkx/testing 1.5.0 → 2.0.0-beta.1
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/config.d.ts.map +1 -1
- package/dist/config.js +1 -3
- package/dist/config.js.map +1 -1
- package/dist/queries.d.ts +30 -126
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +30 -126
- package/dist/queries.js.map +1 -1
- package/dist/screenshot.d.ts.map +1 -1
- package/dist/screenshot.js +1 -3
- package/dist/screenshot.js.map +1 -1
- package/dist/user-event/adjustment.d.ts +2 -14
- package/dist/user-event/adjustment.d.ts.map +1 -1
- package/dist/user-event/adjustment.js +2 -14
- package/dist/user-event/adjustment.js.map +1 -1
- package/dist/user-event/click.d.ts +3 -41
- package/dist/user-event/click.d.ts.map +1 -1
- package/dist/user-event/click.js +3 -41
- package/dist/user-event/click.js.map +1 -1
- package/dist/user-event/gesture.d.ts +9 -43
- package/dist/user-event/gesture.d.ts.map +1 -1
- package/dist/user-event/gesture.js +9 -43
- package/dist/user-event/gesture.js.map +1 -1
- package/dist/user-event/index.d.ts +16 -85
- package/dist/user-event/index.d.ts.map +1 -1
- package/dist/user-event/index.js +1 -5
- package/dist/user-event/index.js.map +1 -1
- package/dist/user-event/keyboard.d.ts +1 -1
- package/dist/user-event/keyboard.d.ts.map +1 -1
- package/dist/user-event/keyboard.js +1 -1
- package/dist/user-event/keyboard.js.map +1 -1
- package/dist/user-event/selection.d.ts +2 -18
- package/dist/user-event/selection.d.ts.map +1 -1
- package/dist/user-event/selection.js +3 -21
- package/dist/user-event/selection.js.map +1 -1
- package/dist/user-event/text.d.ts +5 -34
- package/dist/user-event/text.d.ts.map +1 -1
- package/dist/user-event/text.js +5 -34
- package/dist/user-event/text.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +14 -34
- package/dist/widget-accessible-properties.js.map +1 -1
- package/package.json +12 -8
- package/src/config.ts +1 -3
- package/src/queries.ts +30 -126
- package/src/screenshot.ts +1 -3
- package/src/user-event/adjustment.ts +2 -14
- package/src/user-event/click.ts +3 -41
- package/src/user-event/gesture.ts +9 -43
- package/src/user-event/index.ts +16 -85
- package/src/user-event/keyboard.ts +1 -1
- package/src/user-event/selection.ts +3 -21
- package/src/user-event/text.ts +5 -34
- package/src/widget-accessible-properties.ts +22 -44
|
@@ -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 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"]}
|
|
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. */\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"]}
|
|
@@ -1,23 +1,7 @@
|
|
|
1
1
|
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
-
/**
|
|
3
|
-
* Selects the items at the given positions through a list, grid, or column view's selection model,
|
|
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.
|
|
7
|
-
*
|
|
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.
|
|
11
|
-
*/
|
|
2
|
+
/** Selects positions without activating them. */
|
|
12
3
|
declare const selectOptions: (widget: Gtk.Widget, values: number | number[]) => Promise<void>;
|
|
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.
|
|
17
|
-
*
|
|
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.
|
|
20
|
-
*/
|
|
4
|
+
/** Unselects positions without activating them. */
|
|
21
5
|
declare const deselectOptions: (widget: Gtk.Widget, values: number | number[]) => Promise<void>;
|
|
22
6
|
export { selectOptions, deselectOptions };
|
|
23
7
|
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -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;AA2JpC,iDAAiD;AACjD,QAAA,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACd,CAAC;AAoBtE,mDAAmD;AACnD,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"}
|
|
@@ -8,9 +8,7 @@ const SELECTABLE_ROLES = new Set([
|
|
|
8
8
|
Gtk.AccessibleRole.GRID,
|
|
9
9
|
Gtk.AccessibleRole.LIST,
|
|
10
10
|
]);
|
|
11
|
-
const isSelectable = (widget) =>
|
|
12
|
-
return SELECTABLE_ROLES.has(widget.getAccessibleRole());
|
|
13
|
-
};
|
|
11
|
+
const isSelectable = (widget) => SELECTABLE_ROLES.has(widget.getAccessibleRole());
|
|
14
12
|
const selectListViewItems = (selectionModel, positions, isExclusive) => {
|
|
15
13
|
if (positions.length === 0) {
|
|
16
14
|
selectionModel.unselectRange(0, selectionModel.getNItems());
|
|
@@ -94,16 +92,7 @@ const runSelectionEvent = (widget, values, inListView, byRole) => wrapEvent(widg
|
|
|
94
92
|
}
|
|
95
93
|
byRole(widget, valueArray);
|
|
96
94
|
});
|
|
97
|
-
/**
|
|
98
|
-
* Selects the items at the given positions through a list, grid, or column view's selection model,
|
|
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.
|
|
102
|
-
*
|
|
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.
|
|
106
|
-
*/
|
|
95
|
+
/** Selects positions without activating them. */
|
|
107
96
|
const selectOptions = (widget, values) => runSelectionEvent(widget, values, selectInListView, selectByRole);
|
|
108
97
|
const deselectInListView = (widget, valueArray) => {
|
|
109
98
|
const selectionModel = requireSelectionModel(widget, "deselect");
|
|
@@ -118,14 +107,7 @@ const deselectByRole = (widget, valueArray) => {
|
|
|
118
107
|
}
|
|
119
108
|
applyIndexedChildren(widget, valueArray, unselectChildRow);
|
|
120
109
|
};
|
|
121
|
-
/**
|
|
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.
|
|
125
|
-
*
|
|
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.
|
|
128
|
-
*/
|
|
110
|
+
/** Unselects positions without activating them. */
|
|
129
111
|
const deselectOptions = (widget, values) => runSelectionEvent(widget, values, deselectInListView, deselectByRole);
|
|
130
112
|
export { selectOptions, deselectOptions };
|
|
131
113
|
//# sourceMappingURL=selection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/user-event/selection.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { formatRoleList } from \"../role-helpers.js\";\nimport { getCallableMethod } from \"../widget-getters.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\nimport {\n getChildAtIndex,\n hasIndexedChildren,\n isChildSelected,\n selectContainerChild,\n unselectContainerChild,\n} from \"./indexed-children.js\";\n\ntype CollectionWidget = Gtk.ListView | Gtk.GridView | Gtk.ColumnView;\ntype IndexedChildAction = (container: Gtk.Widget, child: Gtk.Widget) => void;\n\nconst SELECTABLE_ROLES: Set<Gtk.AccessibleRole> = new Set([\n Gtk.AccessibleRole.COMBO_BOX,\n Gtk.AccessibleRole.GRID,\n Gtk.AccessibleRole.LIST,\n]);\n\nconst isSelectable = (widget: Gtk.Widget): boolean => {\n return SELECTABLE_ROLES.has(widget.getAccessibleRole());\n};\n\nconst selectListViewItems = (\n selectionModel: Gtk.SelectionModel,\n positions: number[],\n isExclusive: boolean,\n): void => {\n if (positions.length === 0) {\n selectionModel.unselectRange(0, selectionModel.getNItems());\n\n return;\n }\n\n const [first] = positions;\n\n if (isExclusive && first !== undefined && positions.length === 1) {\n selectionModel.selectItem(first, true);\n\n return;\n }\n\n const nItems = selectionModel.getNItems();\n const selected = Gtk.Bitset.newEmpty();\n const mask = Gtk.Bitset.newRange(0, nItems);\n\n for (const pos of positions) {\n selected.add(pos);\n }\n\n selectionModel.setSelection(selected, mask);\n};\n\nconst isListView = (widget: Gtk.Widget): widget is CollectionWidget =>\n widget instanceof Gtk.ListView || widget instanceof Gtk.GridView || widget instanceof Gtk.ColumnView;\n\nconst getIndexSelector = (widget: Gtk.Widget): ((position: number) => void) | null =>\n getCallableMethod<[number], unknown>(widget, \"setSelected\");\n\nconst selectDropDownOption = (widget: Gtk.Widget, valueArray: number[]): void => {\n const setSelected = getIndexSelector(widget);\n\n if (!setSelected) {\n throw new TypeError(\"Cannot select options: the COMBO_BOX role needs a widget exposing setSelected\");\n }\n\n if (valueArray.length > 1) {\n throw new Error(\"Cannot select multiple options: a drop-down only supports single selection\");\n }\n\n const [selection] = valueArray;\n\n if (selection !== undefined) {\n setSelected(selection);\n }\n};\n\nconst unselectChildRow = (container: Gtk.Widget, child: Gtk.Widget): void => {\n if (isChildSelected(child)) {\n unselectContainerChild(container, child);\n }\n};\n\nconst applyIndexedChildren = (widget: Gtk.Widget, valueArray: number[], apply: IndexedChildAction): void => {\n for (const value of valueArray) {\n const child = getChildAtIndex(widget, value);\n\n if (child) {\n apply(widget, child);\n }\n }\n};\n\nconst requireSelectionModel = (\n widget: CollectionWidget,\n verb: string,\n): Gtk.SelectionModel => {\n const selectionModel = widget.getModel();\n\n if (selectionModel === null) {\n throw new Error(`Cannot ${verb} options: list view has no selection model`);\n }\n\n return selectionModel;\n};\n\nconst selectInListView = (widget: CollectionWidget, valueArray: number[]): void => {\n const selectionModel = requireSelectionModel(widget, \"select\");\n const isMultiSelection = selectionModel instanceof Gtk.MultiSelection;\n selectListViewItems(selectionModel, valueArray, !isMultiSelection);\n};\n\nconst requireSelectableRole = (widget: Gtk.Widget, verb: string): void => {\n if (!isSelectable(widget)) {\n throw new Error(\n `Cannot ${verb} options: expected selectable widget (${formatRoleList(SELECTABLE_ROLES)})`,\n );\n }\n};\n\nconst selectByRole = (widget: Gtk.Widget, valueArray: number[]): void => {\n requireSelectableRole(widget, \"select\");\n const role = widget.getAccessibleRole();\n\n if (role === Gtk.AccessibleRole.COMBO_BOX) {\n selectDropDownOption(widget, valueArray);\n\n return;\n }\n\n if (!hasIndexedChildren(widget)) {\n throw new TypeError(\"Cannot select options: the widget exposes no children to select by index\");\n }\n\n applyIndexedChildren(widget, valueArray, selectContainerChild);\n};\n\nconst runSelectionEvent = (\n widget: Gtk.Widget,\n values: number | number[],\n inListView: (view: Gtk.ListView | Gtk.GridView | Gtk.ColumnView, valueArray: number[]) => void,\n byRole: (widget: Gtk.Widget, valueArray: number[]) => void,\n): Promise<void> =>\n wrapEvent(widget, () => {\n const valueArray = Array.isArray(values) ? values : [values];\n\n if (isListView(widget)) {\n inListView(widget, valueArray);\n\n return;\n }\n\n byRole(widget, valueArray);\n });\n\n/**\n * Selects the items at the given positions through a list, grid, or column view's selection model,\n * by setting the selected position of a widget with the COMBO_BOX role, or by selecting the indexed\n * children of a list box or flow box through their container. An empty array clears a view's\n * selection. The children are never activated, so no row-activated handler runs.\n *\n * @throws When a view has no selection model, when a COMBO_BOX-role widget is given more than one\n * position or exposes no `setSelected`, or when the widget's role is none of COMBO_BOX, GRID, or\n * LIST.\n */\nconst selectOptions = (widget: Gtk.Widget, values: number | number[]): Promise<void> =>\n runSelectionEvent(widget, values, selectInListView, selectByRole);\n\nconst deselectInListView = (widget: Gtk.ListView | Gtk.GridView | Gtk.ColumnView, valueArray: number[]): void => {\n const selectionModel = requireSelectionModel(widget, \"deselect\");\n\n for (const pos of valueArray) {\n selectionModel.unselectItem(pos);\n }\n};\n\nconst deselectByRole = (widget: Gtk.Widget, valueArray: number[]): void => {\n requireSelectableRole(widget, \"deselect\");\n\n if (!hasIndexedChildren(widget)) {\n throw new TypeError(\"Cannot deselect options: the widget exposes no children to deselect by index\");\n }\n\n applyIndexedChildren(widget, valueArray, unselectChildRow);\n};\n\n/**\n * Unselects the items at the given positions in a list, grid, or column view, or unselects the\n * indexed children of a list box or flow box through their container. A child that is not selected\n * is left alone, and no child is activated.\n *\n * @throws When a view has no selection model, when the widget's role is none of COMBO_BOX, GRID, or\n * LIST, or when it exposes no indexed children.\n */\nconst deselectOptions = (widget: Gtk.Widget, values: number | number[]): Promise<void> =>\n runSelectionEvent(widget, values, deselectInListView, deselectByRole);\n\nexport { selectOptions, deselectOptions };\n"]}
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/user-event/selection.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { formatRoleList } from \"../role-helpers.js\";\nimport { getCallableMethod } from \"../widget-getters.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\nimport {\n getChildAtIndex,\n hasIndexedChildren,\n isChildSelected,\n selectContainerChild,\n unselectContainerChild,\n} from \"./indexed-children.js\";\n\ntype CollectionWidget = Gtk.ListView | Gtk.GridView | Gtk.ColumnView;\ntype IndexedChildAction = (container: Gtk.Widget, child: Gtk.Widget) => void;\n\nconst SELECTABLE_ROLES: Set<Gtk.AccessibleRole> = new Set([\n Gtk.AccessibleRole.COMBO_BOX,\n Gtk.AccessibleRole.GRID,\n Gtk.AccessibleRole.LIST,\n]);\n\nconst isSelectable = (widget: Gtk.Widget): boolean => SELECTABLE_ROLES.has(widget.getAccessibleRole());\n\nconst selectListViewItems = (\n selectionModel: Gtk.SelectionModel,\n positions: number[],\n isExclusive: boolean,\n): void => {\n if (positions.length === 0) {\n selectionModel.unselectRange(0, selectionModel.getNItems());\n\n return;\n }\n\n const [first] = positions;\n\n if (isExclusive && first !== undefined && positions.length === 1) {\n selectionModel.selectItem(first, true);\n\n return;\n }\n\n const nItems = selectionModel.getNItems();\n const selected = Gtk.Bitset.newEmpty();\n const mask = Gtk.Bitset.newRange(0, nItems);\n\n for (const pos of positions) {\n selected.add(pos);\n }\n\n selectionModel.setSelection(selected, mask);\n};\n\nconst isListView = (widget: Gtk.Widget): widget is CollectionWidget =>\n widget instanceof Gtk.ListView || widget instanceof Gtk.GridView || widget instanceof Gtk.ColumnView;\n\nconst getIndexSelector = (widget: Gtk.Widget): ((position: number) => void) | null =>\n getCallableMethod<[number], unknown>(widget, \"setSelected\");\n\nconst selectDropDownOption = (widget: Gtk.Widget, valueArray: number[]): void => {\n const setSelected = getIndexSelector(widget);\n\n if (!setSelected) {\n throw new TypeError(\"Cannot select options: the COMBO_BOX role needs a widget exposing setSelected\");\n }\n\n if (valueArray.length > 1) {\n throw new Error(\"Cannot select multiple options: a drop-down only supports single selection\");\n }\n\n const [selection] = valueArray;\n\n if (selection !== undefined) {\n setSelected(selection);\n }\n};\n\nconst unselectChildRow = (container: Gtk.Widget, child: Gtk.Widget): void => {\n if (isChildSelected(child)) {\n unselectContainerChild(container, child);\n }\n};\n\nconst applyIndexedChildren = (widget: Gtk.Widget, valueArray: number[], apply: IndexedChildAction): void => {\n for (const value of valueArray) {\n const child = getChildAtIndex(widget, value);\n\n if (child) {\n apply(widget, child);\n }\n }\n};\n\nconst requireSelectionModel = (\n widget: CollectionWidget,\n verb: string,\n): Gtk.SelectionModel => {\n const selectionModel = widget.getModel();\n\n if (selectionModel === null) {\n throw new Error(`Cannot ${verb} options: list view has no selection model`);\n }\n\n return selectionModel;\n};\n\nconst selectInListView = (widget: CollectionWidget, valueArray: number[]): void => {\n const selectionModel = requireSelectionModel(widget, \"select\");\n const isMultiSelection = selectionModel instanceof Gtk.MultiSelection;\n selectListViewItems(selectionModel, valueArray, !isMultiSelection);\n};\n\nconst requireSelectableRole = (widget: Gtk.Widget, verb: string): void => {\n if (!isSelectable(widget)) {\n throw new Error(\n `Cannot ${verb} options: expected selectable widget (${formatRoleList(SELECTABLE_ROLES)})`,\n );\n }\n};\n\nconst selectByRole = (widget: Gtk.Widget, valueArray: number[]): void => {\n requireSelectableRole(widget, \"select\");\n const role = widget.getAccessibleRole();\n\n if (role === Gtk.AccessibleRole.COMBO_BOX) {\n selectDropDownOption(widget, valueArray);\n\n return;\n }\n\n if (!hasIndexedChildren(widget)) {\n throw new TypeError(\"Cannot select options: the widget exposes no children to select by index\");\n }\n\n applyIndexedChildren(widget, valueArray, selectContainerChild);\n};\n\nconst runSelectionEvent = (\n widget: Gtk.Widget,\n values: number | number[],\n inListView: (view: Gtk.ListView | Gtk.GridView | Gtk.ColumnView, valueArray: number[]) => void,\n byRole: (widget: Gtk.Widget, valueArray: number[]) => void,\n): Promise<void> =>\n wrapEvent(widget, () => {\n const valueArray = Array.isArray(values) ? values : [values];\n\n if (isListView(widget)) {\n inListView(widget, valueArray);\n\n return;\n }\n\n byRole(widget, valueArray);\n });\n\n/** Selects positions without activating them. */\nconst selectOptions = (widget: Gtk.Widget, values: number | number[]): Promise<void> =>\n runSelectionEvent(widget, values, selectInListView, selectByRole);\n\nconst deselectInListView = (widget: Gtk.ListView | Gtk.GridView | Gtk.ColumnView, valueArray: number[]): void => {\n const selectionModel = requireSelectionModel(widget, \"deselect\");\n\n for (const pos of valueArray) {\n selectionModel.unselectItem(pos);\n }\n};\n\nconst deselectByRole = (widget: Gtk.Widget, valueArray: number[]): void => {\n requireSelectableRole(widget, \"deselect\");\n\n if (!hasIndexedChildren(widget)) {\n throw new TypeError(\"Cannot deselect options: the widget exposes no children to deselect by index\");\n }\n\n applyIndexedChildren(widget, valueArray, unselectChildRow);\n};\n\n/** Unselects positions without activating them. */\nconst deselectOptions = (widget: Gtk.Widget, values: number | number[]): Promise<void> =>\n runSelectionEvent(widget, values, deselectInListView, deselectByRole);\n\nexport { selectOptions, deselectOptions };\n"]}
|
|
@@ -9,44 +9,15 @@ type TypeOptions = {
|
|
|
9
9
|
initialSelectionEnd?: number | undefined;
|
|
10
10
|
};
|
|
11
11
|
declare const resetClipboard: () => void;
|
|
12
|
-
/**
|
|
13
|
-
* Focuses the widget unless `shouldFocus` is false, applies any initial selection, and inserts the
|
|
14
|
-
* text at the cursor, deleting the text the widget has selected first, the way typing over a
|
|
15
|
-
* selection does in GTK4. Focusing works the way clicking into the widget does, leaving its text
|
|
16
|
-
* unselected: a `Gtk.Editable` takes its caret to the end of its text, a `Gtk.TextView` keeps the
|
|
17
|
-
* caret where it stands, and the replaced text stays on the widget's undo stack either way.
|
|
18
|
-
*
|
|
19
|
-
* @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.
|
|
20
|
-
*/
|
|
12
|
+
/** Types into an editable widget. */
|
|
21
13
|
declare const type: (widget: Gtk.Widget, text: string, options?: TypeOptions) => Promise<void>;
|
|
22
|
-
/**
|
|
23
|
-
* Focuses an editable widget and deletes its whole text through the widget's own editing API, so the
|
|
24
|
-
* deletion emits the signals an edit made by hand emits. Text a tag protects is detected before the
|
|
25
|
-
* deletion runs, leaving such a widget untouched. A widget that writes a new value back in response
|
|
26
|
-
* to the deletion, as an input mask does, is cleared successfully and keeps whatever it wrote.
|
|
27
|
-
*
|
|
28
|
-
* @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView, when it refuses edits, when
|
|
29
|
-
* a tag protects part of its text, or when a handler blocks the deletion.
|
|
30
|
-
*/
|
|
14
|
+
/** Deletes all text from an editable widget. */
|
|
31
15
|
declare const clear: (widget: Gtk.Widget) => Promise<void>;
|
|
32
|
-
/**
|
|
33
|
-
* Writes an editable widget's selected text to its clipboard, or the empty string when nothing is selected.
|
|
34
|
-
*
|
|
35
|
-
* @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.
|
|
36
|
-
*/
|
|
16
|
+
/** Copies the current selection. */
|
|
37
17
|
declare const copy: (widget: Gtk.Widget) => Promise<void>;
|
|
38
|
-
/**
|
|
39
|
-
* Writes an editable widget's selected text to its clipboard, then deletes that selection.
|
|
40
|
-
*
|
|
41
|
-
* @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.
|
|
42
|
-
*/
|
|
18
|
+
/** Cuts the current selection. */
|
|
43
19
|
declare const cut: (widget: Gtk.Widget) => Promise<void>;
|
|
44
|
-
/**
|
|
45
|
-
* Inserts the given text at an editable widget's cursor, reading the clipboard instead when no text
|
|
46
|
-
* is given, and deleting the text the widget has selected first, the way a paste does in GTK4.
|
|
47
|
-
*
|
|
48
|
-
* @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.
|
|
49
|
-
*/
|
|
20
|
+
/** Pastes text or clipboard contents. */
|
|
50
21
|
declare const paste: (widget: Gtk.Widget, text?: string) => Promise<void>;
|
|
51
22
|
export { resetClipboard, type, clear, copy, cut, paste, type TypeOptions };
|
|
52
23
|
//# sourceMappingURL=text.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/user-event/text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAcpC,oCAAoC;AACpC,KAAK,WAAW,GAAG;IACf,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,+FAA+F;IAC/F,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C,CAAC;AAgKF,QAAA,MAAM,cAAc,QAAO,IAE1B,CAAC;AAeF
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/user-event/text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAcpC,oCAAoC;AACpC,KAAK,WAAW,GAAG;IACf,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,+FAA+F;IAC/F,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C,CAAC;AAgKF,QAAA,MAAM,cAAc,QAAO,IAE1B,CAAC;AAeF,qCAAqC;AACrC,QAAA,MAAM,IAAI,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,MAAM,EAAE,UAAU,WAAW,KAAG,OAAO,CAAC,IAAI,CAQ9E,CAAC;AAuEP,gDAAgD;AAChD,QAAA,MAAM,KAAK,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,CAAC,IAAI,CACmB,CAAC;AAEpE,oCAAoC;AACpC,QAAA,MAAM,IAAI,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,CAAC,IAAI,CAGzC,CAAC;AAEP,kCAAkC;AAClC,QAAA,MAAM,GAAG,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,CAAC,IAAI,CAIxC,CAAC;AAEP,yCAAyC;AACzC,QAAA,MAAM,KAAK,GAAU,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAUpE,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,CAAC"}
|
package/dist/user-event/text.js
CHANGED
|
@@ -128,15 +128,7 @@ const runEditableEvent = (widget, failure, action) => wrapEvent(widget, () => {
|
|
|
128
128
|
}
|
|
129
129
|
action(widget);
|
|
130
130
|
});
|
|
131
|
-
/**
|
|
132
|
-
* Focuses the widget unless `shouldFocus` is false, applies any initial selection, and inserts the
|
|
133
|
-
* text at the cursor, deleting the text the widget has selected first, the way typing over a
|
|
134
|
-
* selection does in GTK4. Focusing works the way clicking into the widget does, leaving its text
|
|
135
|
-
* unselected: a `Gtk.Editable` takes its caret to the end of its text, a `Gtk.TextView` keeps the
|
|
136
|
-
* caret where it stands, and the replaced text stays on the widget's undo stack either way.
|
|
137
|
-
*
|
|
138
|
-
* @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.
|
|
139
|
-
*/
|
|
131
|
+
/** Types into an editable widget. */
|
|
140
132
|
const type = (widget, text, options) => runEditableEvent(widget, "Cannot type into element", (editable) => {
|
|
141
133
|
if (options?.shouldFocus ?? true) {
|
|
142
134
|
focusEditable(editable);
|
|
@@ -195,39 +187,18 @@ const clearEditable = (editable) => {
|
|
|
195
187
|
throw new Error(CLEAR_REFUSED);
|
|
196
188
|
}
|
|
197
189
|
};
|
|
198
|
-
/**
|
|
199
|
-
* Focuses an editable widget and deletes its whole text through the widget's own editing API, so the
|
|
200
|
-
* deletion emits the signals an edit made by hand emits. Text a tag protects is detected before the
|
|
201
|
-
* deletion runs, leaving such a widget untouched. A widget that writes a new value back in response
|
|
202
|
-
* to the deletion, as an input mask does, is cleared successfully and keeps whatever it wrote.
|
|
203
|
-
*
|
|
204
|
-
* @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView, when it refuses edits, when
|
|
205
|
-
* a tag protects part of its text, or when a handler blocks the deletion.
|
|
206
|
-
*/
|
|
190
|
+
/** Deletes all text from an editable widget. */
|
|
207
191
|
const clear = (widget) => runEditableEvent(widget, "Cannot clear element", clearEditable);
|
|
208
|
-
/**
|
|
209
|
-
* Writes an editable widget's selected text to its clipboard, or the empty string when nothing is selected.
|
|
210
|
-
*
|
|
211
|
-
* @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.
|
|
212
|
-
*/
|
|
192
|
+
/** Copies the current selection. */
|
|
213
193
|
const copy = (widget) => runEditableEvent(widget, "Cannot copy", (editable) => {
|
|
214
194
|
writeClipboardText(editable, readSelection(editable));
|
|
215
195
|
});
|
|
216
|
-
/**
|
|
217
|
-
* Writes an editable widget's selected text to its clipboard, then deletes that selection.
|
|
218
|
-
*
|
|
219
|
-
* @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.
|
|
220
|
-
*/
|
|
196
|
+
/** Cuts the current selection. */
|
|
221
197
|
const cut = (widget) => runEditableEvent(widget, "Cannot cut", (editable) => {
|
|
222
198
|
writeClipboardText(editable, readSelection(editable));
|
|
223
199
|
deleteSelection(editable);
|
|
224
200
|
});
|
|
225
|
-
/**
|
|
226
|
-
* Inserts the given text at an editable widget's cursor, reading the clipboard instead when no text
|
|
227
|
-
* is given, and deleting the text the widget has selected first, the way a paste does in GTK4.
|
|
228
|
-
*
|
|
229
|
-
* @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.
|
|
230
|
-
*/
|
|
201
|
+
/** Pastes text or clipboard contents. */
|
|
231
202
|
const paste = async (widget, text) => {
|
|
232
203
|
if (!isEditable(widget)) {
|
|
233
204
|
throw new Error(`Cannot paste: ${EDITABLE_REQUIRED}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/user-event/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,cAAc,EAAuB,mBAAmB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAmB/C,MAAM,iBAAiB,GAAG,6BAA6B,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC;AACzF,MAAM,aAAa,GAAG,qEAAqE,CAAC;AAC5F,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC;AAE7B,MAAM,gBAAgB,GAAG,CAAC,MAAkB,EAAW,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,IAAI,CAAC;AAC3G,MAAM,aAAa,GAAG,CAAC,MAAsB,EAAU,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC3F,MAAM,eAAe,GAAG,CAAC,MAAoB,EAAW,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAC;AAE1F,MAAM,eAAe,GAAG,CAAC,MAAoB,EAAmB,EAAE;IAC9D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;IAEvD,OAAO,QAAQ,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAsB,EAAU,EAAE;IAC1D,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;IAE7D,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,MAAsB,EAAQ,EAAE;IACrD,IAAI,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAEhD,OAAO;IACX,CAAC;IAED,MAAM,CAAC,eAAe,EAAE,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAoB,EAAQ,EAAE;IACtD,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;IAC7D,MAAM,CAAC,SAAS,EAAE,CAAC;IAEnB,IAAI,UAAU,EAAE,CAAC;QACb,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEhC,OAAO;IACX,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,MAAsB,EAAQ,EAAE;IACnD,IAAI,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnB,OAAO;IACX,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE3B,OAAO;IACX,CAAC;IAED,MAAM,CAAC,yBAAyB,EAAE,CAAC;IAEnC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAC1C,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAoB,EAAE,IAAY,EAAE,IAAgB,EAAQ,EAAE;IACtF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,CAAC,eAAe,EAAE,CAAC;IAEzB,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;QAEhF,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM,GAAG,uBAAuB,EAAE,CAAC;YACxD,MAAM,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,CAAC,eAAe,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,aAAa,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAgB,EAAE,IAAY,EAAQ,EAAE;IAChE,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,MAAoB,EAAE,IAAY,EAAQ,EAAE;IACjE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO;IACX,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnE,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAsB,EAAE,IAAY,EAAE,IAAgB,EAAQ,EAAE;IACxF,IAAI,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAEvC,OAAO;IACX,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE9B,OAAO;IACX,CAAC;IAED,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,MAAsB,EAAQ,EAAE;IACnD,IAAI,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAE3F,OAAO;IACX,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,MAAsB,EAAE,OAAoB,EAAQ,EAAE;IACjF,IAAI,OAAO,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO;IACX,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,mBAAmB,IAAI,KAAK,CAAC;IAEjD,IAAI,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QAE/E,OAAO;IACX,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAkB,EAAE,IAAY,EAAQ,EAAE;IAClE,MAAM,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,GAAS,EAAE;IAC9B,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CACrB,MAAkB,EAClB,OAAe,EACf,MAA0C,EAC7B,EAAE,CACf,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE;IACnB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,KAAK,iBAAiB,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC,CAAC,CAAC;AAEP;;;;;;;;GAQG;AACH,MAAM,IAAI,GAAG,CAAC,MAAkB,EAAE,IAAY,EAAE,OAAqB,EAAiB,EAAE,CACpF,gBAAgB,CAAC,MAAM,EAAE,0BAA0B,EAAE,CAAC,QAAQ,EAAE,EAAE;IAC9D,IAAI,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE,CAAC;QAC/B,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,qBAAqB,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC/C,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEP,MAAM,kBAAkB,GAAG,CAAC,IAAkB,EAAE,iBAA0B,EAAW,EAAE;IACnF,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,MAAsB,EAAW,EAAE,CACzD,MAAM,YAAY,GAAG,CAAC,QAAQ,IAAI,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AAElH,MAAM,oBAAoB,GAAG,CAAC,QAAwB,EAAQ,EAAE;IAC5D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,MAAsB,EAA+B,EAAE,CAC9E,MAAM,YAAY,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAEpG,MAAM,iBAAiB,GAAG,CAAC,OAA0B,EAAE,MAAc,EAAE,KAAiB,EAAW,EAAE;IACjG,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,MAAM,KAAK,GAAG,GAAS,EAAE;QACrB,SAAS,GAAG,IAAI,CAAC;IACrB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAEhC,IAAI,CAAC;QACD,KAAK,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,MAAsB,EAAW,EAAE;IACzD,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEpD,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE;QAC3C,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACrD,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/B,aAAa,CAAC,QAAQ,CAAC,CAAC;IAExB,IAAI,gBAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;QACpC,OAAO;IACX,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,KAAK,GAAG,CAAC,MAAkB,EAAiB,EAAE,CAChD,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAC;AAEpE;;;;GAIG;AACH,MAAM,IAAI,GAAG,CAAC,MAAkB,EAAiB,EAAE,CAC/C,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,QAAQ,EAAE,EAAE;IACjD,kBAAkB,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEP;;;;GAIG;AACH,MAAM,GAAG,GAAG,CAAC,MAAkB,EAAiB,EAAE,CAC9C,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE;IAChD,kBAAkB,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,eAAe,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEP;;;;;GAKG;AACH,MAAM,KAAK,GAAG,KAAK,EAAE,MAAkB,EAAE,IAAa,EAAiB,EAAE;IACrE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,iBAAiB,iBAAiB,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAEhF,MAAM,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE;QACzB,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAoB,CAAC","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { EDITABLE_ROLES, type EditableTarget, getEditableDelegate, isEditable, readEditableText } from \"../editable.js\";\nimport { formatRoleList } from \"../role-helpers.js\";\nimport { getWidgetSelection } from \"../widget-accessible-properties.js\";\nimport { callBooleanGetter } from \"../widget-getters.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\ntype SignalWatchTarget = {\n on(signal: string, handler: (...args: unknown[]) => unknown, isAfter?: boolean): unknown;\n off(signal: string, handler: (...args: unknown[]) => unknown): unknown;\n};\n\ntype InsertKind = \"typing\" | \"pasting\";\n\n/** Options for `userEvent.type`. */\ntype TypeOptions = {\n /** Focus the widget before typing; defaults to true. */\n shouldFocus?: boolean | undefined;\n /** Select from this offset before typing, replacing the selected range with the typed text. */\n initialSelectionStart?: number | undefined;\n /** End offset of the initial selection (defaults to the start offset). */\n initialSelectionEnd?: number | undefined;\n};\n\nconst EDITABLE_REQUIRED = `expected editable widget (${formatRoleList(EDITABLE_ROLES)})`;\nconst CLEAR_REFUSED = \"Cannot clear element: the widget refuses to delete part of its text\";\nconst SELECTION_DELETE_COUNT = 1;\nconst SINGLE_CHARACTER_LENGTH = 1;\nconst TEXT_END_POSITION = -1;\n\nconst isWidgetEditable = (widget: Gtk.Widget): boolean => callBooleanGetter(widget, \"getEditable\") ?? true;\nconst readSelection = (widget: EditableTarget): string => getWidgetSelection(widget) ?? \"\";\nconst hasSelectedText = (widget: Gtk.Editable): boolean => widget.getSelectionBounds()[0];\n\nconst getDelegateText = (widget: Gtk.Editable): Gtk.Text | null => {\n const delegate = getEditableDelegate(widget) ?? widget;\n\n return delegate instanceof Gtk.Text ? delegate : null;\n};\n\nconst getSelectionLength = (buffer: Gtk.TextBuffer): number => {\n const [isSelected, start, end] = buffer.getSelectionBounds();\n\n return isSelected ? end.getOffset() - start.getOffset() : 0;\n};\n\nconst deleteSelection = (widget: EditableTarget): void => {\n if (widget instanceof Gtk.TextView) {\n widget.getBuffer().deleteSelection(false, true);\n\n return;\n }\n\n widget.deleteSelection();\n};\n\nconst focusPlainEditable = (widget: Gtk.Editable): void => {\n const [isSelected, start, end] = widget.getSelectionBounds();\n widget.grabFocus();\n\n if (isSelected) {\n widget.selectRegion(start, end);\n\n return;\n }\n\n widget.setPosition(TEXT_END_POSITION);\n};\n\nconst focusEditable = (widget: EditableTarget): void => {\n if (widget instanceof Gtk.TextView) {\n widget.grabFocus();\n\n return;\n }\n\n const target = getDelegateText(widget);\n\n if (target === null) {\n focusPlainEditable(widget);\n\n return;\n }\n\n target.grabFocusWithoutSelecting();\n\n if (!hasSelectedText(widget)) {\n widget.setPosition(TEXT_END_POSITION);\n }\n};\n\nconst insertTextViewText = (widget: Gtk.TextView, text: string, kind: InsertKind): void => {\n const buffer = widget.getBuffer();\n const length = getSelectionLength(buffer);\n buffer.beginUserAction();\n\n if (length > 0) {\n widget.emit(\"delete-from-cursor\", Gtk.DeleteType.CHARS, SELECTION_DELETE_COUNT);\n\n if (kind === \"typing\" && length > SINGLE_CHARACTER_LENGTH) {\n buffer.endUserAction();\n buffer.beginUserAction();\n }\n }\n\n widget.emit(\"insert-at-cursor\", text);\n buffer.endUserAction();\n};\n\nconst insertDelegateText = (target: Gtk.Text, text: string): void => {\n if (hasSelectedText(target)) {\n target.emit(\"delete-from-cursor\", Gtk.DeleteType.CHARS, SELECTION_DELETE_COUNT);\n }\n\n target.emit(\"insert-at-cursor\", text);\n};\n\nconst insertPlainText = (widget: Gtk.Editable, text: string): void => {\n if (!isWidgetEditable(widget)) {\n return;\n }\n\n if (hasSelectedText(widget)) {\n widget.deleteSelection();\n }\n\n const position = widget.getPosition();\n const newPosition = widget.insertText(text, text.length, position);\n widget.setPosition(newPosition);\n};\n\nconst insertEditableText = (widget: EditableTarget, text: string, kind: InsertKind): void => {\n if (widget instanceof Gtk.TextView) {\n insertTextViewText(widget, text, kind);\n\n return;\n }\n\n const target = getDelegateText(widget);\n\n if (target === null) {\n insertPlainText(widget, text);\n\n return;\n }\n\n insertDelegateText(target, text);\n};\n\nconst deleteAllText = (widget: EditableTarget): void => {\n if (widget instanceof Gtk.TextView) {\n const buffer = widget.getBuffer();\n buffer.deleteInteractive(buffer.getStartIter(), buffer.getEndIter(), widget.getEditable());\n\n return;\n }\n\n widget.deleteText(0, -1);\n};\n\nconst applyInitialSelection = (widget: EditableTarget, options: TypeOptions): void => {\n if (options.initialSelectionStart === undefined) {\n return;\n }\n\n const start = options.initialSelectionStart;\n const end = options.initialSelectionEnd ?? start;\n\n if (widget instanceof Gtk.TextView) {\n const buffer = widget.getBuffer();\n buffer.selectRange(buffer.getIterAtOffset(start), buffer.getIterAtOffset(end));\n\n return;\n }\n\n widget.selectRegion(start, end);\n};\n\nconst writeClipboardText = (widget: Gtk.Widget, text: string): void => {\n widget.getClipboard().set(text);\n};\n\nconst resetClipboard = (): void => {\n Gdk.Display.getDefault()?.getClipboard().setContent(null);\n};\n\nconst runEditableEvent = (\n widget: Gtk.Widget,\n failure: string,\n action: (editable: EditableTarget) => void,\n): Promise<void> =>\n wrapEvent(widget, () => {\n if (!isEditable(widget)) {\n throw new Error(`${failure}: ${EDITABLE_REQUIRED}`);\n }\n\n action(widget);\n });\n\n/**\n * Focuses the widget unless `shouldFocus` is false, applies any initial selection, and inserts the\n * text at the cursor, deleting the text the widget has selected first, the way typing over a\n * selection does in GTK4. Focusing works the way clicking into the widget does, leaving its text\n * unselected: a `Gtk.Editable` takes its caret to the end of its text, a `Gtk.TextView` keeps the\n * caret where it stands, and the replaced text stays on the widget's undo stack either way.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst type = (widget: Gtk.Widget, text: string, options?: TypeOptions): Promise<void> =>\n runEditableEvent(widget, \"Cannot type into element\", (editable) => {\n if (options?.shouldFocus ?? true) {\n focusEditable(editable);\n }\n\n applyInitialSelection(editable, options ?? {});\n insertEditableText(editable, text, \"typing\");\n });\n\nconst hasNonEditableChar = (iter: Gtk.TextIter, isDefaultEditable: boolean): boolean => {\n while (!iter.isEnd()) {\n if (!iter.editable(isDefaultEditable)) {\n return true;\n }\n\n if (!iter.forwardChar()) {\n return false;\n }\n }\n\n return false;\n};\n\nconst hasProtectedText = (widget: EditableTarget): boolean =>\n widget instanceof Gtk.TextView && hasNonEditableChar(widget.getBuffer().getStartIter(), widget.getEditable());\n\nconst requireClearableText = (editable: EditableTarget): void => {\n if (!isWidgetEditable(editable)) {\n throw new Error(\"Cannot clear element: the widget is not editable\");\n }\n\n if (hasProtectedText(editable)) {\n throw new Error(CLEAR_REFUSED);\n }\n};\n\nconst deletionSignalFor = (widget: EditableTarget): [SignalWatchTarget, string] =>\n widget instanceof Gtk.TextView ? [widget.getBuffer(), \"delete-range\"] : [widget, \"delete-text\"];\n\nconst isDeletionApplied = (emitter: SignalWatchTarget, signal: string, apply: () => void): boolean => {\n let isApplied = false;\n\n const watch = (): void => {\n isApplied = true;\n };\n\n emitter.on(signal, watch, true);\n\n try {\n apply();\n } finally {\n emitter.off(signal, watch);\n }\n\n return isApplied;\n};\n\nconst didDeleteAllText = (widget: EditableTarget): boolean => {\n const [emitter, signal] = deletionSignalFor(widget);\n\n return isDeletionApplied(emitter, signal, () => {\n deleteAllText(widget);\n });\n};\n\nconst clearEditable = (editable: EditableTarget): void => {\n requireClearableText(editable);\n focusEditable(editable);\n\n if (readEditableText(editable) === \"\") {\n return;\n }\n\n if (!didDeleteAllText(editable)) {\n throw new Error(CLEAR_REFUSED);\n }\n};\n\n/**\n * Focuses an editable widget and deletes its whole text through the widget's own editing API, so the\n * deletion emits the signals an edit made by hand emits. Text a tag protects is detected before the\n * deletion runs, leaving such a widget untouched. A widget that writes a new value back in response\n * to the deletion, as an input mask does, is cleared successfully and keeps whatever it wrote.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView, when it refuses edits, when\n * a tag protects part of its text, or when a handler blocks the deletion.\n */\nconst clear = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot clear element\", clearEditable);\n\n/**\n * Writes an editable widget's selected text to its clipboard, or the empty string when nothing is selected.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst copy = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot copy\", (editable) => {\n writeClipboardText(editable, readSelection(editable));\n });\n\n/**\n * Writes an editable widget's selected text to its clipboard, then deletes that selection.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst cut = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot cut\", (editable) => {\n writeClipboardText(editable, readSelection(editable));\n deleteSelection(editable);\n });\n\n/**\n * Inserts the given text at an editable widget's cursor, reading the clipboard instead when no text\n * is given, and deleting the text the widget has selected first, the way a paste does in GTK4.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst paste = async (widget: Gtk.Widget, text?: string): Promise<void> => {\n if (!isEditable(widget)) {\n throw new Error(`Cannot paste: ${EDITABLE_REQUIRED}`);\n }\n\n const content = text ?? (await widget.getClipboard().readTextAsync(null)) ?? \"\";\n\n await wrapEvent(widget, () => {\n insertEditableText(widget, content, \"pasting\");\n });\n};\n\nexport { resetClipboard, type, clear, copy, cut, paste, type TypeOptions };\n"]}
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/user-event/text.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { EDITABLE_ROLES, type EditableTarget, getEditableDelegate, isEditable, readEditableText } from \"../editable.js\";\nimport { formatRoleList } from \"../role-helpers.js\";\nimport { getWidgetSelection } from \"../widget-accessible-properties.js\";\nimport { callBooleanGetter } from \"../widget-getters.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\ntype SignalWatchTarget = {\n on(signal: string, handler: (...args: unknown[]) => unknown, isAfter?: boolean): unknown;\n off(signal: string, handler: (...args: unknown[]) => unknown): unknown;\n};\n\ntype InsertKind = \"typing\" | \"pasting\";\n\n/** Options for `userEvent.type`. */\ntype TypeOptions = {\n /** Focus the widget before typing; defaults to true. */\n shouldFocus?: boolean | undefined;\n /** Select from this offset before typing, replacing the selected range with the typed text. */\n initialSelectionStart?: number | undefined;\n /** End offset of the initial selection (defaults to the start offset). */\n initialSelectionEnd?: number | undefined;\n};\n\nconst EDITABLE_REQUIRED = `expected editable widget (${formatRoleList(EDITABLE_ROLES)})`;\nconst CLEAR_REFUSED = \"Cannot clear element: the widget refuses to delete part of its text\";\nconst SELECTION_DELETE_COUNT = 1;\nconst SINGLE_CHARACTER_LENGTH = 1;\nconst TEXT_END_POSITION = -1;\n\nconst isWidgetEditable = (widget: Gtk.Widget): boolean => callBooleanGetter(widget, \"getEditable\") ?? true;\nconst readSelection = (widget: EditableTarget): string => getWidgetSelection(widget) ?? \"\";\nconst hasSelectedText = (widget: Gtk.Editable): boolean => widget.getSelectionBounds()[0];\n\nconst getDelegateText = (widget: Gtk.Editable): Gtk.Text | null => {\n const delegate = getEditableDelegate(widget) ?? widget;\n\n return delegate instanceof Gtk.Text ? delegate : null;\n};\n\nconst getSelectionLength = (buffer: Gtk.TextBuffer): number => {\n const [isSelected, start, end] = buffer.getSelectionBounds();\n\n return isSelected ? end.getOffset() - start.getOffset() : 0;\n};\n\nconst deleteSelection = (widget: EditableTarget): void => {\n if (widget instanceof Gtk.TextView) {\n widget.getBuffer().deleteSelection(false, true);\n\n return;\n }\n\n widget.deleteSelection();\n};\n\nconst focusPlainEditable = (widget: Gtk.Editable): void => {\n const [isSelected, start, end] = widget.getSelectionBounds();\n widget.grabFocus();\n\n if (isSelected) {\n widget.selectRegion(start, end);\n\n return;\n }\n\n widget.setPosition(TEXT_END_POSITION);\n};\n\nconst focusEditable = (widget: EditableTarget): void => {\n if (widget instanceof Gtk.TextView) {\n widget.grabFocus();\n\n return;\n }\n\n const target = getDelegateText(widget);\n\n if (target === null) {\n focusPlainEditable(widget);\n\n return;\n }\n\n target.grabFocusWithoutSelecting();\n\n if (!hasSelectedText(widget)) {\n widget.setPosition(TEXT_END_POSITION);\n }\n};\n\nconst insertTextViewText = (widget: Gtk.TextView, text: string, kind: InsertKind): void => {\n const buffer = widget.getBuffer();\n const length = getSelectionLength(buffer);\n buffer.beginUserAction();\n\n if (length > 0) {\n widget.emit(\"delete-from-cursor\", Gtk.DeleteType.CHARS, SELECTION_DELETE_COUNT);\n\n if (kind === \"typing\" && length > SINGLE_CHARACTER_LENGTH) {\n buffer.endUserAction();\n buffer.beginUserAction();\n }\n }\n\n widget.emit(\"insert-at-cursor\", text);\n buffer.endUserAction();\n};\n\nconst insertDelegateText = (target: Gtk.Text, text: string): void => {\n if (hasSelectedText(target)) {\n target.emit(\"delete-from-cursor\", Gtk.DeleteType.CHARS, SELECTION_DELETE_COUNT);\n }\n\n target.emit(\"insert-at-cursor\", text);\n};\n\nconst insertPlainText = (widget: Gtk.Editable, text: string): void => {\n if (!isWidgetEditable(widget)) {\n return;\n }\n\n if (hasSelectedText(widget)) {\n widget.deleteSelection();\n }\n\n const position = widget.getPosition();\n const newPosition = widget.insertText(text, text.length, position);\n widget.setPosition(newPosition);\n};\n\nconst insertEditableText = (widget: EditableTarget, text: string, kind: InsertKind): void => {\n if (widget instanceof Gtk.TextView) {\n insertTextViewText(widget, text, kind);\n\n return;\n }\n\n const target = getDelegateText(widget);\n\n if (target === null) {\n insertPlainText(widget, text);\n\n return;\n }\n\n insertDelegateText(target, text);\n};\n\nconst deleteAllText = (widget: EditableTarget): void => {\n if (widget instanceof Gtk.TextView) {\n const buffer = widget.getBuffer();\n buffer.deleteInteractive(buffer.getStartIter(), buffer.getEndIter(), widget.getEditable());\n\n return;\n }\n\n widget.deleteText(0, -1);\n};\n\nconst applyInitialSelection = (widget: EditableTarget, options: TypeOptions): void => {\n if (options.initialSelectionStart === undefined) {\n return;\n }\n\n const start = options.initialSelectionStart;\n const end = options.initialSelectionEnd ?? start;\n\n if (widget instanceof Gtk.TextView) {\n const buffer = widget.getBuffer();\n buffer.selectRange(buffer.getIterAtOffset(start), buffer.getIterAtOffset(end));\n\n return;\n }\n\n widget.selectRegion(start, end);\n};\n\nconst writeClipboardText = (widget: Gtk.Widget, text: string): void => {\n widget.getClipboard().set(text);\n};\n\nconst resetClipboard = (): void => {\n Gdk.Display.getDefault()?.getClipboard().setContent(null);\n};\n\nconst runEditableEvent = (\n widget: Gtk.Widget,\n failure: string,\n action: (editable: EditableTarget) => void,\n): Promise<void> =>\n wrapEvent(widget, () => {\n if (!isEditable(widget)) {\n throw new Error(`${failure}: ${EDITABLE_REQUIRED}`);\n }\n\n action(widget);\n });\n\n/** Types into an editable widget. */\nconst type = (widget: Gtk.Widget, text: string, options?: TypeOptions): Promise<void> =>\n runEditableEvent(widget, \"Cannot type into element\", (editable) => {\n if (options?.shouldFocus ?? true) {\n focusEditable(editable);\n }\n\n applyInitialSelection(editable, options ?? {});\n insertEditableText(editable, text, \"typing\");\n });\n\nconst hasNonEditableChar = (iter: Gtk.TextIter, isDefaultEditable: boolean): boolean => {\n while (!iter.isEnd()) {\n if (!iter.editable(isDefaultEditable)) {\n return true;\n }\n\n if (!iter.forwardChar()) {\n return false;\n }\n }\n\n return false;\n};\n\nconst hasProtectedText = (widget: EditableTarget): boolean =>\n widget instanceof Gtk.TextView && hasNonEditableChar(widget.getBuffer().getStartIter(), widget.getEditable());\n\nconst requireClearableText = (editable: EditableTarget): void => {\n if (!isWidgetEditable(editable)) {\n throw new Error(\"Cannot clear element: the widget is not editable\");\n }\n\n if (hasProtectedText(editable)) {\n throw new Error(CLEAR_REFUSED);\n }\n};\n\nconst deletionSignalFor = (widget: EditableTarget): [SignalWatchTarget, string] =>\n widget instanceof Gtk.TextView ? [widget.getBuffer(), \"delete-range\"] : [widget, \"delete-text\"];\n\nconst isDeletionApplied = (emitter: SignalWatchTarget, signal: string, apply: () => void): boolean => {\n let isApplied = false;\n\n const watch = (): void => {\n isApplied = true;\n };\n\n emitter.on(signal, watch, true);\n\n try {\n apply();\n } finally {\n emitter.off(signal, watch);\n }\n\n return isApplied;\n};\n\nconst didDeleteAllText = (widget: EditableTarget): boolean => {\n const [emitter, signal] = deletionSignalFor(widget);\n\n return isDeletionApplied(emitter, signal, () => {\n deleteAllText(widget);\n });\n};\n\nconst clearEditable = (editable: EditableTarget): void => {\n requireClearableText(editable);\n focusEditable(editable);\n\n if (readEditableText(editable) === \"\") {\n return;\n }\n\n if (!didDeleteAllText(editable)) {\n throw new Error(CLEAR_REFUSED);\n }\n};\n\n/** Deletes all text from an editable widget. */\nconst clear = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot clear element\", clearEditable);\n\n/** Copies the current selection. */\nconst copy = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot copy\", (editable) => {\n writeClipboardText(editable, readSelection(editable));\n });\n\n/** Cuts the current selection. */\nconst cut = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot cut\", (editable) => {\n writeClipboardText(editable, readSelection(editable));\n deleteSelection(editable);\n });\n\n/** Pastes text or clipboard contents. */\nconst paste = async (widget: Gtk.Widget, text?: string): Promise<void> => {\n if (!isEditable(widget)) {\n throw new Error(`Cannot paste: ${EDITABLE_REQUIRED}`);\n }\n\n const content = text ?? (await widget.getClipboard().readTextAsync(null)) ?? \"\";\n\n await wrapEvent(widget, () => {\n insertEditableText(widget, content, \"pasting\");\n });\n};\n\nexport { resetClipboard, type, clear, copy, cut, paste, type TypeOptions };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget-accessible-properties.d.ts","sourceRoot":"","sources":["../src/widget-accessible-properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAgBpC,KAAK,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAC9C,KAAK,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"widget-accessible-properties.d.ts","sourceRoot":"","sources":["../src/widget-accessible-properties.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
-
import { isAccessibleNumberMatch, readAccessibleBooleanProperty, readAccessibleFlag, readAccessibleInt, readAccessibleRelation, readAccessibleState,
|
|
2
|
+
import { isAccessibleNumberMatch, readAccessibleBooleanProperty, readAccessibleFlag, readAccessibleInt, readAccessibleNumber, readAccessibleRelation, readAccessibleState, readAccessibleString, } from "./accessible-native.js";
|
|
3
3
|
import { EDITABLE_ROLES, isEditable, readEditableText } from "./editable.js";
|
|
4
4
|
import { isNameFromAuthor, isNameProhibited } from "./role-naming.js";
|
|
5
5
|
import { children, descendants, relationCandidates } from "./traversal.js";
|
|
@@ -27,8 +27,6 @@ const VALUE_PROPERTIES = {
|
|
|
27
27
|
min: Gtk.AccessibleProperty.VALUE_MIN,
|
|
28
28
|
max: Gtk.AccessibleProperty.VALUE_MAX,
|
|
29
29
|
};
|
|
30
|
-
const readAccessibleString = (widget, property) => readNativeString(widget, property);
|
|
31
|
-
const readAccessibleNumber = (widget, property) => readNativeNumber(widget, property);
|
|
32
30
|
const readAccessibleWidgets = (widget, relation) => {
|
|
33
31
|
const targets = readAccessibleRelation(widget, relation, relationCandidates(widget));
|
|
34
32
|
const widgets = targets.filter((target) => target instanceof Gtk.Widget);
|
|
@@ -141,9 +139,7 @@ const getWidgetAccessibleName = (widget) => {
|
|
|
141
139
|
}
|
|
142
140
|
return nameFromContent(widget) ?? callStringGetter(widget, "getTooltipText");
|
|
143
141
|
};
|
|
144
|
-
const getWidgetName = (widget) =>
|
|
145
|
-
return widget.getName();
|
|
146
|
-
};
|
|
142
|
+
const getWidgetName = (widget) => widget.getName();
|
|
147
143
|
const nonEmptyText = (text) => (text === null || text === "" ? null : text);
|
|
148
144
|
const readPlaceholderProperty = (widget) => {
|
|
149
145
|
const value = Reflect.get(widget, "placeholderText");
|
|
@@ -209,7 +205,6 @@ const readBoundedSelection = (widget) => {
|
|
|
209
205
|
return hasSelection ? sliceSelectedText(widget, start, end) : null;
|
|
210
206
|
};
|
|
211
207
|
const getWidgetSelection = (widget) => widget instanceof Gtk.TextView ? readTextViewSelection(widget) : readBoundedSelection(widget);
|
|
212
|
-
const checkedFromActive = (isActive) => (isActive ? "checked" : "unchecked");
|
|
213
208
|
const isRadioToggle = (widget) => widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO;
|
|
214
209
|
const getWidgetCheckedState = (widget) => {
|
|
215
210
|
const tristate = readAccessibleState(widget, Gtk.AccessibleState.CHECKED);
|
|
@@ -217,7 +212,10 @@ const getWidgetCheckedState = (widget) => {
|
|
|
217
212
|
if (state !== undefined) {
|
|
218
213
|
return state;
|
|
219
214
|
}
|
|
220
|
-
|
|
215
|
+
if (!isRadioToggle(widget)) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
return widget.getActive() ? "checked" : "unchecked";
|
|
221
219
|
};
|
|
222
220
|
const isWidgetChecked = (widget) => {
|
|
223
221
|
const state = getWidgetCheckedState(widget);
|
|
@@ -243,36 +241,18 @@ const getWidgetSelectedState = (widget) => {
|
|
|
243
241
|
}
|
|
244
242
|
return null;
|
|
245
243
|
};
|
|
246
|
-
const getWidgetLevel = (widget) =>
|
|
247
|
-
|
|
248
|
-
};
|
|
249
|
-
const getWidgetInvalidState = (widget) => {
|
|
250
|
-
const value = readAccessibleState(widget, Gtk.AccessibleState.INVALID);
|
|
251
|
-
return value ?? null;
|
|
252
|
-
};
|
|
244
|
+
const getWidgetLevel = (widget) => readAccessibleInt(widget, Gtk.AccessibleProperty.LEVEL);
|
|
245
|
+
const getWidgetInvalidState = (widget) => readAccessibleState(widget, Gtk.AccessibleState.INVALID);
|
|
253
246
|
const getWidgetErrorMessage = (widget) => readAccessibleWidgets(widget, Gtk.AccessibleRelation.ERROR_MESSAGE);
|
|
254
|
-
const getWidgetBusyState = (widget) =>
|
|
255
|
-
|
|
256
|
-
};
|
|
257
|
-
const getWidgetDescription = (widget) => {
|
|
258
|
-
return readAccessibleString(widget, Gtk.AccessibleProperty.DESCRIPTION);
|
|
259
|
-
};
|
|
247
|
+
const getWidgetBusyState = (widget) => readAccessibleBoolean(widget, Gtk.AccessibleState.BUSY);
|
|
248
|
+
const getWidgetDescription = (widget) => readAccessibleString(widget, Gtk.AccessibleProperty.DESCRIPTION);
|
|
260
249
|
const getWidgetValueNow = (widget) => readAccessibleNumber(widget, Gtk.AccessibleProperty.VALUE_NOW);
|
|
261
250
|
const getWidgetValueText = (widget) => readAccessibleString(widget, Gtk.AccessibleProperty.VALUE_TEXT);
|
|
262
251
|
const isWidgetValueMatch = (widget, field, expected) => isAccessibleNumberMatch(widget, VALUE_PROPERTIES[field], expected);
|
|
263
|
-
const getWidgetOwnLabel = (widget) =>
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const texts = [];
|
|
268
|
-
for (const target of targets) {
|
|
269
|
-
const text = getWidgetAccessibleName(target);
|
|
270
|
-
if (text) {
|
|
271
|
-
texts.push(text);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
return texts;
|
|
275
|
-
};
|
|
252
|
+
const getWidgetOwnLabel = (widget) => readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);
|
|
253
|
+
const collectAccessibleNames = (targets) => targets
|
|
254
|
+
.map((target) => getWidgetAccessibleName(target))
|
|
255
|
+
.filter((text) => text !== null && text !== "");
|
|
276
256
|
const isSelfLabelling = (widget, targets) => {
|
|
277
257
|
const own = new Set(descendants(widget));
|
|
278
258
|
return targets.every((target) => own.has(target));
|