@gtkx/components 1.0.0-rc.1 → 1.0.0-rc.2
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/dist/adw/index.d.ts +3 -0
- package/dist/adw/index.d.ts.map +1 -0
- package/dist/adw/index.js +2 -0
- package/dist/adw/index.js.map +1 -0
- package/dist/adw/toast.d.ts +10 -0
- package/dist/adw/toast.d.ts.map +1 -0
- package/dist/adw/toast.js +51 -0
- package/dist/adw/toast.js.map +1 -0
- package/dist/adw/types.d.ts +28 -0
- package/dist/adw/types.d.ts.map +1 -0
- package/dist/adw/types.js +2 -0
- package/dist/adw/types.js.map +1 -0
- package/dist/column-view.d.ts +7 -29
- package/dist/column-view.d.ts.map +1 -1
- package/dist/column-view.js +98 -70
- package/dist/column-view.js.map +1 -1
- package/dist/drop-down.d.ts +8 -27
- package/dist/drop-down.d.ts.map +1 -1
- package/dist/drop-down.js +112 -81
- package/dist/drop-down.js.map +1 -1
- package/dist/grid-view.d.ts +6 -16
- package/dist/grid-view.d.ts.map +1 -1
- package/dist/grid-view.js +25 -33
- package/dist/grid-view.js.map +1 -1
- package/dist/index.d.ts +6 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -6
- package/dist/index.js.map +1 -1
- package/dist/internal/cells.d.ts +50 -0
- package/dist/internal/cells.d.ts.map +1 -0
- package/dist/internal/cells.js +185 -0
- package/dist/internal/cells.js.map +1 -0
- package/dist/internal/collection-index.d.ts +21 -0
- package/dist/internal/collection-index.d.ts.map +1 -0
- package/dist/internal/collection-index.js +106 -0
- package/dist/internal/collection-index.js.map +1 -0
- package/dist/internal/collection-model.d.ts +12 -0
- package/dist/internal/collection-model.d.ts.map +1 -0
- package/dist/internal/collection-model.js +164 -0
- package/dist/internal/collection-model.js.map +1 -0
- package/dist/internal/collection.d.ts +18 -0
- package/dist/internal/collection.d.ts.map +1 -0
- package/dist/internal/collection.js +64 -0
- package/dist/internal/collection.js.map +1 -0
- package/dist/internal/expansion.d.ts +9 -0
- package/dist/internal/expansion.d.ts.map +1 -0
- package/dist/internal/expansion.js +75 -0
- package/dist/internal/expansion.js.map +1 -0
- package/dist/internal/selection.d.ts +12 -0
- package/dist/internal/selection.d.ts.map +1 -0
- package/dist/internal/selection.js +99 -0
- package/dist/internal/selection.js.map +1 -0
- package/dist/internal/use-collection.d.ts +18 -0
- package/dist/internal/use-collection.d.ts.map +1 -0
- package/dist/internal/use-collection.js +42 -0
- package/dist/internal/use-collection.js.map +1 -0
- package/dist/internal/use-widget-ref.d.ts +4 -0
- package/dist/internal/use-widget-ref.d.ts.map +1 -0
- package/dist/internal/use-widget-ref.js +8 -0
- package/dist/internal/use-widget-ref.js.map +1 -0
- package/dist/list-view.d.ts +5 -20
- package/dist/list-view.d.ts.map +1 -1
- package/dist/list-view.js +32 -53
- package/dist/list-view.js.map +1 -1
- package/dist/size-group.d.ts +8 -16
- package/dist/size-group.d.ts.map +1 -1
- package/dist/size-group.js +35 -51
- package/dist/size-group.js.map +1 -1
- package/dist/types.d.ts +97 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +17 -6
- package/src/adw/index.ts +2 -0
- package/src/adw/toast.tsx +74 -0
- package/src/adw/types.ts +32 -0
- package/src/column-view.tsx +176 -160
- package/src/drop-down.tsx +180 -167
- package/src/grid-view.tsx +29 -73
- package/src/index.ts +18 -25
- package/src/internal/cells.tsx +345 -0
- package/src/internal/collection-index.ts +168 -0
- package/src/internal/collection-model.ts +246 -0
- package/src/internal/collection.ts +104 -0
- package/src/internal/expansion.ts +123 -0
- package/src/internal/selection.tsx +159 -0
- package/src/internal/use-collection.tsx +70 -0
- package/src/internal/use-widget-ref.ts +11 -0
- package/src/list-view.tsx +43 -139
- package/src/size-group.tsx +63 -82
- package/src/types.ts +155 -24
- package/dist/cell.d.ts +0 -30
- package/dist/cell.d.ts.map +0 -1
- package/dist/cell.js +0 -45
- package/dist/cell.js.map +0 -1
- package/dist/column-view-column.d.ts +0 -27
- package/dist/column-view-column.d.ts.map +0 -1
- package/dist/column-view-column.js +0 -30
- package/dist/column-view-column.js.map +0 -1
- package/dist/constraint-layout-apply.d.ts +0 -55
- package/dist/constraint-layout-apply.d.ts.map +0 -1
- package/dist/constraint-layout-apply.js +0 -107
- package/dist/constraint-layout-apply.js.map +0 -1
- package/dist/constraint-layout.d.ts +0 -20
- package/dist/constraint-layout.d.ts.map +0 -1
- package/dist/constraint-layout.js +0 -88
- package/dist/constraint-layout.js.map +0 -1
- package/dist/fixed.d.ts +0 -26
- package/dist/fixed.d.ts.map +0 -1
- package/dist/fixed.js +0 -40
- package/dist/fixed.js.map +0 -1
- package/dist/grid.d.ts +0 -27
- package/dist/grid.d.ts.map +0 -1
- package/dist/grid.js +0 -48
- package/dist/grid.js.map +0 -1
- package/dist/hooks/use-cell-containers.d.ts +0 -18
- package/dist/hooks/use-cell-containers.d.ts.map +0 -1
- package/dist/hooks/use-cell-containers.js +0 -67
- package/dist/hooks/use-cell-containers.js.map +0 -1
- package/dist/hooks/use-collection-model.d.ts +0 -26
- package/dist/hooks/use-collection-model.d.ts.map +0 -1
- package/dist/hooks/use-collection-model.js +0 -35
- package/dist/hooks/use-collection-model.js.map +0 -1
- package/dist/hooks/use-collection-widget.d.ts +0 -28
- package/dist/hooks/use-collection-widget.d.ts.map +0 -1
- package/dist/hooks/use-collection-widget.js +0 -21
- package/dist/hooks/use-collection-widget.js.map +0 -1
- package/dist/hooks/use-drop-down-selection.d.ts +0 -16
- package/dist/hooks/use-drop-down-selection.d.ts.map +0 -1
- package/dist/hooks/use-drop-down-selection.js +0 -35
- package/dist/hooks/use-drop-down-selection.js.map +0 -1
- package/dist/hooks/use-expansion-model.d.ts +0 -12
- package/dist/hooks/use-expansion-model.d.ts.map +0 -1
- package/dist/hooks/use-expansion-model.js +0 -71
- package/dist/hooks/use-expansion-model.js.map +0 -1
- package/dist/hooks/use-header-menu.d.ts +0 -4
- package/dist/hooks/use-header-menu.d.ts.map +0 -1
- package/dist/hooks/use-header-menu.js +0 -20
- package/dist/hooks/use-header-menu.js.map +0 -1
- package/dist/hooks/use-installed-model.d.ts +0 -4
- package/dist/hooks/use-installed-model.d.ts.map +0 -1
- package/dist/hooks/use-installed-model.js +0 -15
- package/dist/hooks/use-installed-model.js.map +0 -1
- package/dist/hooks/use-list-model.d.ts +0 -19
- package/dist/hooks/use-list-model.d.ts.map +0 -1
- package/dist/hooks/use-list-model.js +0 -97
- package/dist/hooks/use-list-model.js.map +0 -1
- package/dist/hooks/use-placed-child.d.ts +0 -18
- package/dist/hooks/use-placed-child.d.ts.map +0 -1
- package/dist/hooks/use-placed-child.js +0 -47
- package/dist/hooks/use-placed-child.js.map +0 -1
- package/dist/hooks/use-selection-model.d.ts +0 -13
- package/dist/hooks/use-selection-model.d.ts.map +0 -1
- package/dist/hooks/use-selection-model.js +0 -103
- package/dist/hooks/use-selection-model.js.map +0 -1
- package/dist/hooks/use-sort-handler.d.ts +0 -17
- package/dist/hooks/use-sort-handler.d.ts.map +0 -1
- package/dist/hooks/use-sort-handler.js +0 -87
- package/dist/hooks/use-sort-handler.js.map +0 -1
- package/dist/menu-items.d.ts +0 -5
- package/dist/menu-items.d.ts.map +0 -1
- package/dist/menu-items.js +0 -48
- package/dist/menu-items.js.map +0 -1
- package/dist/menu.d.ts +0 -14
- package/dist/menu.d.ts.map +0 -1
- package/dist/menu.js +0 -24
- package/dist/menu.js.map +0 -1
- package/dist/overlay.d.ts +0 -24
- package/dist/overlay.d.ts.map +0 -1
- package/dist/overlay.js +0 -49
- package/dist/overlay.js.map +0 -1
- package/dist/utils/cell-container-store.d.ts +0 -28
- package/dist/utils/cell-container-store.d.ts.map +0 -1
- package/dist/utils/cell-container-store.js +0 -98
- package/dist/utils/cell-container-store.js.map +0 -1
- package/dist/utils/item-models.d.ts +0 -10
- package/dist/utils/item-models.d.ts.map +0 -1
- package/dist/utils/item-models.js +0 -82
- package/dist/utils/item-models.js.map +0 -1
- package/dist/utils/item-resolver.d.ts +0 -25
- package/dist/utils/item-resolver.d.ts.map +0 -1
- package/dist/utils/item-resolver.js +0 -102
- package/dist/utils/item-resolver.js.map +0 -1
- package/dist/utils/list-item-flatten.d.ts +0 -24
- package/dist/utils/list-item-flatten.d.ts.map +0 -1
- package/dist/utils/list-item-flatten.js +0 -68
- package/dist/utils/list-item-flatten.js.map +0 -1
- package/src/cell.tsx +0 -144
- package/src/column-view-column.tsx +0 -82
- package/src/constraint-layout-apply.ts +0 -173
- package/src/constraint-layout.tsx +0 -135
- package/src/fixed.tsx +0 -86
- package/src/grid.tsx +0 -88
- package/src/hooks/use-cell-containers.ts +0 -93
- package/src/hooks/use-collection-model.ts +0 -60
- package/src/hooks/use-collection-widget.ts +0 -47
- package/src/hooks/use-drop-down-selection.ts +0 -52
- package/src/hooks/use-expansion-model.ts +0 -82
- package/src/hooks/use-header-menu.ts +0 -34
- package/src/hooks/use-installed-model.ts +0 -20
- package/src/hooks/use-list-model.ts +0 -161
- package/src/hooks/use-placed-child.ts +0 -79
- package/src/hooks/use-selection-model.ts +0 -114
- package/src/hooks/use-sort-handler.ts +0 -107
- package/src/menu-items.ts +0 -48
- package/src/menu.tsx +0 -32
- package/src/overlay.tsx +0 -88
- package/src/utils/cell-container-store.ts +0 -114
- package/src/utils/item-models.ts +0 -113
- package/src/utils/item-resolver.ts +0 -138
- package/src/utils/list-item-flatten.ts +0 -90
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-list-model.js","sourceRoot":"","sources":["../../src/hooks/use-list-model.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gio from \"@gtkx/gi/gio\";\nimport type * as GObject from \"@gtkx/gi/gobject\";\nimport type * as Gtk from \"@gtkx/gi/gtk\";\nimport { useLayoutEffect, useMemo, useRef } from \"react\";\nimport type { ItemNode, SectionNode } from \"../types.js\";\nimport {\n createFlatModel,\n createSectionModel,\n createTreeModel,\n resizeFlatModel,\n retagRows,\n} from \"../utils/item-models.js\";\nimport {\n createItemResolver,\n createSectionHeaderResolver,\n createTreeResolver,\n type ItemResolver,\n type RowValue,\n} from \"../utils/item-resolver.js\";\nimport { detectStructure, type ListStructure, structuralSignature } from \"../utils/list-item-flatten.js\";\n\ntype ListModelInput<T, S> = {\n items: ItemNode<T>[] | undefined;\n sections?: SectionNode<S, T>[] | undefined;\n};\n\ntype ListModelResult<T, S> = {\n model: Gio.ListModel;\n treeModel: Gtk.TreeListModel | null;\n resolver: ItemResolver<T, S>;\n headerResolver: ItemResolver<T, S>;\n rowValues: WeakMap<GObject.Object, RowValue<T>>;\n};\n\ntype ListModelStructure = \"sections\" | ListStructure;\n\ntype ListModelState<T, S> = {\n model: Gio.ListModel;\n treeModel: Gtk.TreeListModel | null;\n flatModel: Gtk.StringList | undefined;\n items: ItemNode<T>[] | undefined;\n sections: SectionNode<S, T>[] | undefined;\n structure: ListModelStructure;\n signature: string;\n rowValues: WeakMap<GObject.Object, RowValue<T>>;\n placeholdersById: Map<string, GObject.Object>;\n};\n\nconst sectionRows = <T, S>(sections: SectionNode<S, T>[] | undefined): ItemNode<T>[] => {\n if (sections === undefined) return [];\n const rows: ItemNode<T>[] = [];\n for (const section of sections) rows.push(...section.data);\n return rows;\n};\n\nconst sectionSignature = <T, S>(sections: SectionNode<S, T>[] | undefined): string => {\n if (sections === undefined) return \"\";\n const parts: string[] = [];\n for (const section of sections) {\n parts.push(`${section.id}{${structuralSignature(section.data)}}`);\n }\n return parts.join(\",\");\n};\n\nconst signatureOf = <T, S>(\n structure: ListModelStructure,\n items: ItemNode<T>[] | undefined,\n sections: SectionNode<S, T>[] | undefined,\n): string => {\n if (structure === \"sections\") return `sections|${sectionSignature(sections)}`;\n return structure === \"flat\" ? \"\" : `${structure}|${structuralSignature(items)}`;\n};\n\ntype ListModelInternalInput<T, S> = {\n items: ItemNode<T>[] | undefined;\n sections: SectionNode<S, T>[] | undefined;\n structure: ListModelStructure;\n signature: string;\n};\n\nconst buildState = <T, S>(input: ListModelInternalInput<T, S>): ListModelState<T, S> => {\n const { items, sections, structure, signature } = input;\n const rowValues = new WeakMap<GObject.Object, RowValue<T>>();\n const placeholdersById = new Map<string, GObject.Object>();\n let model: Gio.ListModel;\n let treeModel: Gtk.TreeListModel | null = null;\n let flatModel: Gtk.StringList | undefined;\n if (structure === \"sections\") {\n model = createSectionModel(sections ?? []);\n } else if (structure === \"tree\") {\n treeModel = createTreeModel(items ?? [], rowValues, placeholdersById);\n model = treeModel;\n } else {\n flatModel = createFlatModel(items?.length ?? 0);\n model = flatModel;\n }\n return { model, treeModel, flatModel, items, sections, structure, signature, rowValues, placeholdersById };\n};\n\nconst resolveState = <T, S>(\n prev: ListModelState<T, S> | null,\n items: ItemNode<T>[] | undefined,\n sections: SectionNode<S, T>[] | undefined,\n): ListModelState<T, S> => {\n if (prev !== null && prev.items === items && prev.sections === sections) {\n return prev;\n }\n const structure: ListModelStructure = sections !== undefined ? \"sections\" : detectStructure(items);\n const signature = signatureOf(structure, items, sections);\n const input: ListModelInternalInput<T, S> = { items, sections, structure, signature };\n if (prev === null || prev.structure !== structure) {\n return buildState(input);\n }\n if (structure !== \"flat\" && prev.signature !== signature) {\n return buildState(input);\n }\n if (structure === \"tree\") {\n retagRows(items ?? [], prev.rowValues, prev.placeholdersById);\n }\n prev.items = items;\n prev.sections = sections;\n prev.signature = signature;\n return prev;\n};\n\nexport const useListModel = <T, S>(input: ListModelInput<T, S>): ListModelResult<T, S> => {\n const { items, sections } = input;\n const stateRef = useRef<ListModelState<T, S> | null>(null);\n const state = resolveState(stateRef.current, items, sections);\n stateRef.current = state;\n const { structure, flatModel } = state;\n\n useLayoutEffect(() => {\n if (flatModel !== undefined) {\n resizeFlatModel(flatModel, items?.length ?? 0);\n }\n }, [flatModel, items]);\n\n const resolver = useMemo(() => {\n if (structure === \"sections\") {\n return createItemResolver<T, S>(sectionRows(sections), true, state.rowValues);\n }\n if (structure === \"tree\" && state.treeModel !== null) {\n return createTreeResolver<T, S>(items, state.rowValues, state.treeModel);\n }\n return createItemResolver<T, S>(items, false, state.rowValues);\n }, [items, sections, structure, state.rowValues, state.treeModel]);\n\n const headerResolver = useMemo(\n () => createSectionHeaderResolver<T, S>(structure === \"sections\" ? sections : undefined),\n [sections, structure],\n );\n\n return {\n model: state.model,\n treeModel: state.treeModel,\n resolver,\n headerResolver,\n rowValues: state.rowValues,\n };\n};\n"]}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type * as GObject from "@gtkx/gi/gobject";
|
|
2
|
-
import { type Context, type ReactNode, type Ref, type RefCallback, type RefObject } from "react";
|
|
3
|
-
export type ParentContext<T> = {
|
|
4
|
-
Context: Context<RefObject<T | null> | null>;
|
|
5
|
-
useParentRef: () => RefObject<T | null>;
|
|
6
|
-
};
|
|
7
|
-
export declare const createParentContext: <T>(orphanMessage: string) => ParentContext<T>;
|
|
8
|
-
export type PlacedChildRender<T> = (ref: RefCallback<T>) => ReactNode;
|
|
9
|
-
export type PlacedChildOptions<T extends GObject.Object, P> = {
|
|
10
|
-
render: PlacedChildRender<T>;
|
|
11
|
-
ref?: Ref<T | null> | undefined;
|
|
12
|
-
placement: P;
|
|
13
|
-
samePlacement: (a: P, b: P) => boolean;
|
|
14
|
-
place: (object: T, placement: P, previous: P | undefined) => void;
|
|
15
|
-
release: (object: T) => void;
|
|
16
|
-
};
|
|
17
|
-
export declare const usePlacedChild: <T extends GObject.Object, P>(options: PlacedChildOptions<T, P>) => ReactNode;
|
|
18
|
-
//# sourceMappingURL=use-placed-child.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-placed-child.d.ts","sourceRoot":"","sources":["../../src/hooks/use-placed-child.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EACH,KAAK,OAAO,EAEZ,KAAK,SAAS,EACd,KAAK,GAAG,EACR,KAAK,WAAW,EAChB,KAAK,SAAS,EAKjB,MAAM,OAAO,CAAC;AAEf,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAC3B,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7C,YAAY,EAAE,MAAM,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CAC3C,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,CAAC,iBAAiB,MAAM,KAAG,aAAa,CAAC,CAAC,CAU7E,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;AAEtE,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI;IAC1D,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC;IACb,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;IACvC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC;IAClE,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,SAkC/F,CAAC"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { createPortal, rootElement } from "@gtkx/react";
|
|
2
|
-
import { useMergeRefs } from "@gtkx/react/internal";
|
|
3
|
-
import { createContext, useCallback, useContext, useLayoutEffect, useRef, } from "react";
|
|
4
|
-
export const createParentContext = (orphanMessage) => {
|
|
5
|
-
const context = createContext(null);
|
|
6
|
-
return {
|
|
7
|
-
Context: context,
|
|
8
|
-
useParentRef: () => {
|
|
9
|
-
const ref = useContext(context);
|
|
10
|
-
if (!ref)
|
|
11
|
-
throw new Error(orphanMessage);
|
|
12
|
-
return ref;
|
|
13
|
-
},
|
|
14
|
-
};
|
|
15
|
-
};
|
|
16
|
-
export const usePlacedChild = (options) => {
|
|
17
|
-
const { render, ref, placement, samePlacement, place, release } = options;
|
|
18
|
-
const objectRef = useRef(null);
|
|
19
|
-
const appliedRef = useRef(null);
|
|
20
|
-
const captureObject = useCallback((object) => {
|
|
21
|
-
objectRef.current = object;
|
|
22
|
-
}, []);
|
|
23
|
-
const setObjectRef = useMergeRefs(ref, captureObject);
|
|
24
|
-
useLayoutEffect(() => {
|
|
25
|
-
const object = objectRef.current;
|
|
26
|
-
const applied = appliedRef.current;
|
|
27
|
-
if (applied !== null && applied.object !== object) {
|
|
28
|
-
release(applied.object);
|
|
29
|
-
appliedRef.current = null;
|
|
30
|
-
}
|
|
31
|
-
if (object === null)
|
|
32
|
-
return;
|
|
33
|
-
const current = appliedRef.current;
|
|
34
|
-
if (current === null || !samePlacement(current.placement, placement)) {
|
|
35
|
-
place(object, placement, current?.placement);
|
|
36
|
-
appliedRef.current = { object, placement };
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
useLayoutEffect(() => () => {
|
|
40
|
-
const applied = appliedRef.current;
|
|
41
|
-
if (applied !== null)
|
|
42
|
-
release(applied.object);
|
|
43
|
-
appliedRef.current = null;
|
|
44
|
-
}, []);
|
|
45
|
-
return createPortal(render(setObjectRef), rootElement);
|
|
46
|
-
};
|
|
47
|
-
//# sourceMappingURL=use-placed-child.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-placed-child.js","sourceRoot":"","sources":["../../src/hooks/use-placed-child.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAEH,aAAa,EAKb,WAAW,EACX,UAAU,EACV,eAAe,EACf,MAAM,GACT,MAAM,OAAO,CAAC;AAOf,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAI,aAAqB,EAAoB,EAAE;IAC9E,MAAM,OAAO,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAC;IAChE,OAAO;QACH,OAAO,EAAE,OAAO;QAChB,YAAY,EAAE,GAAwB,EAAE;YACpC,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;YACzC,OAAO,GAAG,CAAC;QACf,CAAC;KACJ,CAAC;AACN,CAAC,CAAC;AAaF,MAAM,CAAC,MAAM,cAAc,GAAG,CAA8B,OAAiC,EAAa,EAAE;IACxG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC1E,MAAM,SAAS,GAAG,MAAM,CAAW,IAAI,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAqC,IAAI,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,WAAW,CAAiB,CAAC,MAAM,EAAE,EAAE;QACzD,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,YAAY,GAAG,YAAY,CAAI,GAAG,EAAE,aAAa,CAAC,CAAC;IAEzD,eAAe,CAAC,GAAG,EAAE;QACjB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;QACjC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAChD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACxB,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO;QAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;YACnE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAC7C,UAAU,CAAC,OAAO,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC/C,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,eAAe,CACX,GAAG,EAAE,CAAC,GAAG,EAAE;QACP,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;IAC9B,CAAC,EACD,EAAE,CACL,CAAC;IAEF,OAAO,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,CAAC;AAC3D,CAAC,CAAC","sourcesContent":["import type * as GObject from \"@gtkx/gi/gobject\";\nimport { createPortal, rootElement } from \"@gtkx/react\";\nimport { useMergeRefs } from \"@gtkx/react/internal\";\nimport {\n type Context,\n createContext,\n type ReactNode,\n type Ref,\n type RefCallback,\n type RefObject,\n useCallback,\n useContext,\n useLayoutEffect,\n useRef,\n} from \"react\";\n\nexport type ParentContext<T> = {\n Context: Context<RefObject<T | null> | null>;\n useParentRef: () => RefObject<T | null>;\n};\n\nexport const createParentContext = <T>(orphanMessage: string): ParentContext<T> => {\n const context = createContext<RefObject<T | null> | null>(null);\n return {\n Context: context,\n useParentRef: (): RefObject<T | null> => {\n const ref = useContext(context);\n if (!ref) throw new Error(orphanMessage);\n return ref;\n },\n };\n};\n\nexport type PlacedChildRender<T> = (ref: RefCallback<T>) => ReactNode;\n\nexport type PlacedChildOptions<T extends GObject.Object, P> = {\n render: PlacedChildRender<T>;\n ref?: Ref<T | null> | undefined;\n placement: P;\n samePlacement: (a: P, b: P) => boolean;\n place: (object: T, placement: P, previous: P | undefined) => void;\n release: (object: T) => void;\n};\n\nexport const usePlacedChild = <T extends GObject.Object, P>(options: PlacedChildOptions<T, P>): ReactNode => {\n const { render, ref, placement, samePlacement, place, release } = options;\n const objectRef = useRef<T | null>(null);\n const appliedRef = useRef<{ object: T; placement: P } | null>(null);\n const captureObject = useCallback<RefCallback<T>>((object) => {\n objectRef.current = object;\n }, []);\n const setObjectRef = useMergeRefs<T>(ref, captureObject);\n\n useLayoutEffect(() => {\n const object = objectRef.current;\n const applied = appliedRef.current;\n if (applied !== null && applied.object !== object) {\n release(applied.object);\n appliedRef.current = null;\n }\n if (object === null) return;\n const current = appliedRef.current;\n if (current === null || !samePlacement(current.placement, placement)) {\n place(object, placement, current?.placement);\n appliedRef.current = { object, placement };\n }\n });\n\n useLayoutEffect(\n () => () => {\n const applied = appliedRef.current;\n if (applied !== null) release(applied.object);\n appliedRef.current = null;\n },\n [],\n );\n\n return createPortal(render(setObjectRef), rootElement);\n};\n"]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type * as Gio from "@gtkx/gi/gio";
|
|
2
|
-
import * as Gtk from "@gtkx/gi/gtk";
|
|
3
|
-
import type { ItemResolver } from "../utils/item-resolver.js";
|
|
4
|
-
type SelectionModelOptions<T, S> = {
|
|
5
|
-
base: Gio.ListModel;
|
|
6
|
-
selectionMode: Gtk.SelectionMode | null | undefined;
|
|
7
|
-
selectedIds: string[] | null | undefined;
|
|
8
|
-
onSelectionChanged: ((ids: string[]) => void) | null | undefined;
|
|
9
|
-
resolver: ItemResolver<T, S>;
|
|
10
|
-
};
|
|
11
|
-
export declare const useSelectionModel: <T, S>(options: SelectionModelOptions<T, S>) => Gtk.SelectionModel;
|
|
12
|
-
export {};
|
|
13
|
-
//# sourceMappingURL=use-selection-model.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-selection-model.d.ts","sourceRoot":"","sources":["../../src/hooks/use-selection-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAIpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,KAAK,qBAAqB,CAAC,CAAC,EAAE,CAAC,IAAI;IAC/B,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC;IACpB,aAAa,EAAE,GAAG,CAAC,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IACpD,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,kBAAkB,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACjE,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAChC,CAAC;AA8DF,eAAO,MAAM,iBAAiB,GAAI,CAAC,EAAE,CAAC,WAAW,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,GAAG,CAAC,cAsClF,CAAC"}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
-
import { useSignal } from "@gtkx/react";
|
|
3
|
-
import { isSameArray } from "@gtkx/utils";
|
|
4
|
-
import { useLayoutEffect, useRef } from "react";
|
|
5
|
-
const createSelectionModel = (mode, base) => {
|
|
6
|
-
if (mode === Gtk.SelectionMode.MULTIPLE)
|
|
7
|
-
return Gtk.MultiSelection.new(base);
|
|
8
|
-
if (mode === Gtk.SelectionMode.NONE)
|
|
9
|
-
return Gtk.NoSelection.new(base);
|
|
10
|
-
return new Gtk.SingleSelection({ model: base, autoselect: false, canUnselect: true });
|
|
11
|
-
};
|
|
12
|
-
const bitsetOf = (positions) => {
|
|
13
|
-
const bitset = Gtk.Bitset.newEmpty();
|
|
14
|
-
for (const position of positions) {
|
|
15
|
-
if (position >= 0)
|
|
16
|
-
bitset.add(position);
|
|
17
|
-
}
|
|
18
|
-
return bitset;
|
|
19
|
-
};
|
|
20
|
-
const applySelectedPositions = (model, positions) => {
|
|
21
|
-
if (model instanceof Gtk.MultiSelection) {
|
|
22
|
-
if (positions.length === 0) {
|
|
23
|
-
const current = model.getSelection();
|
|
24
|
-
if (!current.isEmpty())
|
|
25
|
-
model.unselectAll();
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const requested = bitsetOf(positions);
|
|
29
|
-
const changed = model.getSelection().copy();
|
|
30
|
-
changed.difference(requested);
|
|
31
|
-
if (changed.isEmpty())
|
|
32
|
-
return;
|
|
33
|
-
model.setSelection(requested, changed);
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
if (positions.length === 0) {
|
|
37
|
-
model.unselectAll();
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
const first = positions[0];
|
|
41
|
-
if (first !== undefined && first >= 0)
|
|
42
|
-
model.selectItem(first, true);
|
|
43
|
-
};
|
|
44
|
-
const readSelectedIds = (model, resolver) => {
|
|
45
|
-
const selection = model.getSelection();
|
|
46
|
-
const ids = [];
|
|
47
|
-
const count = Number(selection.getSize());
|
|
48
|
-
for (let index = 0; index < count; index++) {
|
|
49
|
-
const position = selection.getNth(index);
|
|
50
|
-
const id = resolver.idOf(position);
|
|
51
|
-
if (id !== undefined)
|
|
52
|
-
ids.push(id);
|
|
53
|
-
}
|
|
54
|
-
return ids;
|
|
55
|
-
};
|
|
56
|
-
const idsToPositions = (ids, resolver) => {
|
|
57
|
-
if (ids === undefined || ids === null)
|
|
58
|
-
return [];
|
|
59
|
-
const positions = [];
|
|
60
|
-
for (const id of ids) {
|
|
61
|
-
const position = resolver.positionOfId(id);
|
|
62
|
-
if (position >= 0)
|
|
63
|
-
positions.push(position);
|
|
64
|
-
}
|
|
65
|
-
return positions;
|
|
66
|
-
};
|
|
67
|
-
export const useSelectionModel = (options) => {
|
|
68
|
-
const { base, selectionMode, selectedIds, onSelectionChanged, resolver } = options;
|
|
69
|
-
const mode = selectionMode ?? Gtk.SelectionMode.SINGLE;
|
|
70
|
-
const modelRef = useRef(null);
|
|
71
|
-
const modeRef = useRef(null);
|
|
72
|
-
if (modelRef.current === null || modeRef.current !== mode) {
|
|
73
|
-
modelRef.current = createSelectionModel(mode, base);
|
|
74
|
-
modeRef.current = mode;
|
|
75
|
-
}
|
|
76
|
-
const model = modelRef.current;
|
|
77
|
-
const onChangedRef = useRef(onSelectionChanged);
|
|
78
|
-
onChangedRef.current = onSelectionChanged;
|
|
79
|
-
const resolverRef = useRef(resolver);
|
|
80
|
-
resolverRef.current = resolver;
|
|
81
|
-
const lastReportedRef = useRef(null);
|
|
82
|
-
const report = () => {
|
|
83
|
-
const callback = onChangedRef.current;
|
|
84
|
-
if (!callback)
|
|
85
|
-
return;
|
|
86
|
-
const ids = readSelectedIds(model, resolverRef.current);
|
|
87
|
-
if (lastReportedRef.current !== null && isSameArray(lastReportedRef.current, ids))
|
|
88
|
-
return;
|
|
89
|
-
lastReportedRef.current = ids;
|
|
90
|
-
callback(ids);
|
|
91
|
-
};
|
|
92
|
-
useSignal(model, "selection-changed", report);
|
|
93
|
-
useLayoutEffect(() => {
|
|
94
|
-
if (model.getModel() !== base)
|
|
95
|
-
model.setModel(base);
|
|
96
|
-
if (selectedIds !== undefined && selectedIds !== null) {
|
|
97
|
-
applySelectedPositions(model, idsToPositions(selectedIds, resolver));
|
|
98
|
-
}
|
|
99
|
-
report();
|
|
100
|
-
}, [model, base, selectedIds, resolver]);
|
|
101
|
-
return model;
|
|
102
|
-
};
|
|
103
|
-
//# sourceMappingURL=use-selection-model.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-selection-model.js","sourceRoot":"","sources":["../../src/hooks/use-selection-model.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gio from \"@gtkx/gi/gio\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { useSignal } from \"@gtkx/react\";\nimport { isSameArray } from \"@gtkx/utils\";\nimport { useLayoutEffect, useRef } from \"react\";\nimport type { ItemResolver } from \"../utils/item-resolver.js\";\n\ntype SelectionModelOptions<T, S> = {\n base: Gio.ListModel;\n selectionMode: Gtk.SelectionMode | null | undefined;\n selectedIds: string[] | null | undefined;\n onSelectionChanged: ((ids: string[]) => void) | null | undefined;\n resolver: ItemResolver<T, S>;\n};\n\ntype WrappingSelectionModel = (Gtk.SingleSelection | Gtk.MultiSelection | Gtk.NoSelection) & Gtk.SelectionModel;\n\nconst createSelectionModel = (mode: Gtk.SelectionMode, base: Gio.ListModel): WrappingSelectionModel => {\n if (mode === Gtk.SelectionMode.MULTIPLE) return Gtk.MultiSelection.new(base);\n if (mode === Gtk.SelectionMode.NONE) return Gtk.NoSelection.new(base);\n return new Gtk.SingleSelection({ model: base, autoselect: false, canUnselect: true });\n};\n\nconst bitsetOf = (positions: number[]): Gtk.Bitset => {\n const bitset = Gtk.Bitset.newEmpty();\n for (const position of positions) {\n if (position >= 0) bitset.add(position);\n }\n return bitset;\n};\n\nconst applySelectedPositions = (model: Gtk.SelectionModel, positions: number[]): void => {\n if (model instanceof Gtk.MultiSelection) {\n if (positions.length === 0) {\n const current = model.getSelection();\n if (!current.isEmpty()) model.unselectAll();\n return;\n }\n const requested = bitsetOf(positions);\n const changed = model.getSelection().copy();\n changed.difference(requested);\n if (changed.isEmpty()) return;\n model.setSelection(requested, changed);\n return;\n }\n if (positions.length === 0) {\n model.unselectAll();\n return;\n }\n const first = positions[0];\n if (first !== undefined && first >= 0) model.selectItem(first, true);\n};\n\nconst readSelectedIds = <T, S>(model: Gtk.SelectionModel, resolver: ItemResolver<T, S>): string[] => {\n const selection = model.getSelection();\n const ids: string[] = [];\n const count = Number(selection.getSize());\n for (let index = 0; index < count; index++) {\n const position = selection.getNth(index);\n const id = resolver.idOf(position);\n if (id !== undefined) ids.push(id);\n }\n return ids;\n};\n\nconst idsToPositions = <T, S>(ids: string[] | null | undefined, resolver: ItemResolver<T, S>): number[] => {\n if (ids === undefined || ids === null) return [];\n const positions: number[] = [];\n for (const id of ids) {\n const position = resolver.positionOfId(id);\n if (position >= 0) positions.push(position);\n }\n return positions;\n};\n\nexport const useSelectionModel = <T, S>(options: SelectionModelOptions<T, S>): Gtk.SelectionModel => {\n const { base, selectionMode, selectedIds, onSelectionChanged, resolver } = options;\n const mode = selectionMode ?? Gtk.SelectionMode.SINGLE;\n\n const modelRef = useRef<WrappingSelectionModel | null>(null);\n const modeRef = useRef<Gtk.SelectionMode | null>(null);\n if (modelRef.current === null || modeRef.current !== mode) {\n modelRef.current = createSelectionModel(mode, base);\n modeRef.current = mode;\n }\n const model = modelRef.current;\n\n const onChangedRef = useRef(onSelectionChanged);\n onChangedRef.current = onSelectionChanged;\n const resolverRef = useRef(resolver);\n resolverRef.current = resolver;\n const lastReportedRef = useRef<string[] | null>(null);\n\n const report = (): void => {\n const callback = onChangedRef.current;\n if (!callback) return;\n const ids = readSelectedIds(model, resolverRef.current);\n if (lastReportedRef.current !== null && isSameArray(lastReportedRef.current, ids)) return;\n lastReportedRef.current = ids;\n callback(ids);\n };\n\n useSignal(model, \"selection-changed\", report);\n\n useLayoutEffect(() => {\n if (model.getModel() !== base) model.setModel(base);\n if (selectedIds !== undefined && selectedIds !== null) {\n applySelectedPositions(model, idsToPositions(selectedIds, resolver));\n }\n report();\n }, [model, base, selectedIds, resolver]);\n\n return model;\n};\n"]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
-
import { type ObjectProp } from "@gtkx/react/internal";
|
|
3
|
-
export type ColumnRegistration = {
|
|
4
|
-
id: string;
|
|
5
|
-
column: Gtk.ColumnViewColumn;
|
|
6
|
-
sortable: boolean;
|
|
7
|
-
};
|
|
8
|
-
type SortHandlerOptions = {
|
|
9
|
-
columnView: ObjectProp<Gtk.ColumnView>;
|
|
10
|
-
sortColumn: string | null | undefined;
|
|
11
|
-
sortOrder: Gtk.SortType | null | undefined;
|
|
12
|
-
onSortChanged: ((column: string | null, order: Gtk.SortType) => void) | null | undefined;
|
|
13
|
-
columns: ColumnRegistration[];
|
|
14
|
-
};
|
|
15
|
-
export declare const useSortHandler: (options: SortHandlerOptions) => void;
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=use-sort-handler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-sort-handler.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sort-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AAG1E,MAAM,MAAM,kBAAkB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,GAAG,CAAC,gBAAgB,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACtB,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,SAAS,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACzF,OAAO,EAAE,kBAAkB,EAAE,CAAC;CACjC,CAAC;AAkDF,eAAO,MAAM,cAAc,YAAa,kBAAkB,KAAG,IAwC5D,CAAC"}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
-
import { resolveObjectProp } from "@gtkx/react/internal";
|
|
3
|
-
import { useLayoutEffect, useRef } from "react";
|
|
4
|
-
const neutralSorter = () => Gtk.CustomSorter.new(() => 0);
|
|
5
|
-
const ensureColumnSorters = (columns, activeId) => {
|
|
6
|
-
for (const registration of columns) {
|
|
7
|
-
const wantsSorter = registration.sortable || registration.id === activeId;
|
|
8
|
-
const hasSorter = registration.column.getSorter() !== null;
|
|
9
|
-
if (wantsSorter && !hasSorter) {
|
|
10
|
-
registration.column.setSorter(neutralSorter());
|
|
11
|
-
}
|
|
12
|
-
else if (!wantsSorter && hasSorter) {
|
|
13
|
-
registration.column.setSorter(null);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
const columnForId = (columns, id) => {
|
|
18
|
-
if (id === null)
|
|
19
|
-
return null;
|
|
20
|
-
for (const registration of columns) {
|
|
21
|
-
if (registration.id === id)
|
|
22
|
-
return registration.column;
|
|
23
|
-
}
|
|
24
|
-
return null;
|
|
25
|
-
};
|
|
26
|
-
const idForColumn = (columns, column) => {
|
|
27
|
-
if (column === null)
|
|
28
|
-
return null;
|
|
29
|
-
for (const registration of columns) {
|
|
30
|
-
if (registration.column === column)
|
|
31
|
-
return registration.id;
|
|
32
|
-
}
|
|
33
|
-
return column.getId();
|
|
34
|
-
};
|
|
35
|
-
const primarySort = (sorter) => sorter instanceof Gtk.ColumnViewSorter
|
|
36
|
-
? { column: sorter.getPrimarySortColumn(), order: sorter.getPrimarySortOrder() }
|
|
37
|
-
: { column: null, order: Gtk.SortType.ASCENDING };
|
|
38
|
-
const disconnectSorter = (subscription) => {
|
|
39
|
-
if (subscription.sorter !== null && subscription.handler !== null) {
|
|
40
|
-
subscription.sorter.off("changed", subscription.handler);
|
|
41
|
-
}
|
|
42
|
-
subscription.sorter = null;
|
|
43
|
-
subscription.handler = null;
|
|
44
|
-
};
|
|
45
|
-
export const useSortHandler = (options) => {
|
|
46
|
-
const { columnView, sortColumn, sortOrder, onSortChanged, columns } = options;
|
|
47
|
-
const activeId = sortColumn ?? null;
|
|
48
|
-
const order = sortOrder ?? Gtk.SortType.ASCENDING;
|
|
49
|
-
const onChangedRef = useRef(onSortChanged);
|
|
50
|
-
onChangedRef.current = onSortChanged;
|
|
51
|
-
const columnsRef = useRef(columns);
|
|
52
|
-
columnsRef.current = columns;
|
|
53
|
-
const suppressRef = useRef(false);
|
|
54
|
-
const subscriptionRef = useRef({ sorter: null, handler: null });
|
|
55
|
-
const resubscribe = (sorter) => {
|
|
56
|
-
const subscription = subscriptionRef.current;
|
|
57
|
-
if (sorter === subscription.sorter)
|
|
58
|
-
return;
|
|
59
|
-
disconnectSorter(subscription);
|
|
60
|
-
if (sorter === null)
|
|
61
|
-
return;
|
|
62
|
-
const handler = () => {
|
|
63
|
-
if (suppressRef.current)
|
|
64
|
-
return;
|
|
65
|
-
const callback = onChangedRef.current;
|
|
66
|
-
if (!callback)
|
|
67
|
-
return;
|
|
68
|
-
const { column, order: primaryOrder } = primarySort(sorter);
|
|
69
|
-
callback(idForColumn(columnsRef.current, column), primaryOrder);
|
|
70
|
-
};
|
|
71
|
-
subscription.sorter = sorter;
|
|
72
|
-
subscription.handler = handler;
|
|
73
|
-
sorter.on("changed", handler);
|
|
74
|
-
};
|
|
75
|
-
useLayoutEffect(() => {
|
|
76
|
-
const view = resolveObjectProp(columnView);
|
|
77
|
-
if (view === null)
|
|
78
|
-
return;
|
|
79
|
-
ensureColumnSorters(columns, activeId);
|
|
80
|
-
suppressRef.current = true;
|
|
81
|
-
view.sortByColumn(columnForId(columns, activeId), order);
|
|
82
|
-
suppressRef.current = false;
|
|
83
|
-
resubscribe(view.getSorter());
|
|
84
|
-
});
|
|
85
|
-
useLayoutEffect(() => () => disconnectSorter(subscriptionRef.current), []);
|
|
86
|
-
};
|
|
87
|
-
//# sourceMappingURL=use-sort-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-sort-handler.js","sourceRoot":"","sources":["../../src/hooks/use-sort-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { type ObjectProp, resolveObjectProp } from \"@gtkx/react/internal\";\nimport { useLayoutEffect, useRef } from \"react\";\n\nexport type ColumnRegistration = {\n id: string;\n column: Gtk.ColumnViewColumn;\n sortable: boolean;\n};\n\ntype SortHandlerOptions = {\n columnView: ObjectProp<Gtk.ColumnView>;\n sortColumn: string | null | undefined;\n sortOrder: Gtk.SortType | null | undefined;\n onSortChanged: ((column: string | null, order: Gtk.SortType) => void) | null | undefined;\n columns: ColumnRegistration[];\n};\n\nconst neutralSorter = (): Gtk.CustomSorter => Gtk.CustomSorter.new(() => 0);\n\nconst ensureColumnSorters = (columns: ColumnRegistration[], activeId: string | null): void => {\n for (const registration of columns) {\n const wantsSorter = registration.sortable || registration.id === activeId;\n const hasSorter = registration.column.getSorter() !== null;\n if (wantsSorter && !hasSorter) {\n registration.column.setSorter(neutralSorter());\n } else if (!wantsSorter && hasSorter) {\n registration.column.setSorter(null);\n }\n }\n};\n\nconst columnForId = (columns: ColumnRegistration[], id: string | null): Gtk.ColumnViewColumn | null => {\n if (id === null) return null;\n for (const registration of columns) {\n if (registration.id === id) return registration.column;\n }\n return null;\n};\n\nconst idForColumn = (columns: ColumnRegistration[], column: Gtk.ColumnViewColumn | null): string | null => {\n if (column === null) return null;\n for (const registration of columns) {\n if (registration.column === column) return registration.id;\n }\n return column.getId();\n};\n\nconst primarySort = (sorter: Gtk.Sorter): { column: Gtk.ColumnViewColumn | null; order: Gtk.SortType } =>\n sorter instanceof Gtk.ColumnViewSorter\n ? { column: sorter.getPrimarySortColumn(), order: sorter.getPrimarySortOrder() }\n : { column: null, order: Gtk.SortType.ASCENDING };\n\ntype SorterSubscription = {\n sorter: Gtk.Sorter | null;\n handler: ((change: Gtk.SorterChange) => void) | null;\n};\n\nconst disconnectSorter = (subscription: SorterSubscription): void => {\n if (subscription.sorter !== null && subscription.handler !== null) {\n subscription.sorter.off(\"changed\", subscription.handler);\n }\n subscription.sorter = null;\n subscription.handler = null;\n};\n\nexport const useSortHandler = (options: SortHandlerOptions): void => {\n const { columnView, sortColumn, sortOrder, onSortChanged, columns } = options;\n const activeId = sortColumn ?? null;\n const order = sortOrder ?? Gtk.SortType.ASCENDING;\n\n const onChangedRef = useRef(onSortChanged);\n onChangedRef.current = onSortChanged;\n const columnsRef = useRef(columns);\n columnsRef.current = columns;\n const suppressRef = useRef(false);\n const subscriptionRef = useRef<SorterSubscription>({ sorter: null, handler: null });\n\n const resubscribe = (sorter: Gtk.Sorter | null): void => {\n const subscription = subscriptionRef.current;\n if (sorter === subscription.sorter) return;\n disconnectSorter(subscription);\n if (sorter === null) return;\n const handler = (): void => {\n if (suppressRef.current) return;\n const callback = onChangedRef.current;\n if (!callback) return;\n const { column, order: primaryOrder } = primarySort(sorter);\n callback(idForColumn(columnsRef.current, column), primaryOrder);\n };\n subscription.sorter = sorter;\n subscription.handler = handler;\n sorter.on(\"changed\", handler);\n };\n\n useLayoutEffect(() => {\n const view = resolveObjectProp(columnView);\n if (view === null) return;\n ensureColumnSorters(columns, activeId);\n suppressRef.current = true;\n view.sortByColumn(columnForId(columns, activeId), order);\n suppressRef.current = false;\n resubscribe(view.getSorter());\n });\n\n useLayoutEffect(() => () => disconnectSorter(subscriptionRef.current), []);\n};\n"]}
|
package/dist/menu-items.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import * as Gio from "@gtkx/gi/gio";
|
|
2
|
-
import type { MenuEntry } from "./types.js";
|
|
3
|
-
export declare const applyMenuItems: (menu: Gio.Menu, entries: MenuEntry[] | null) => void;
|
|
4
|
-
export declare const menuItemsEqual: (a: MenuEntry[] | null, b: MenuEntry[] | null) => boolean;
|
|
5
|
-
//# sourceMappingURL=menu-items.d.ts.map
|
package/dist/menu-items.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"menu-items.d.ts","sourceRoot":"","sources":["../src/menu-items.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAyB5C,eAAO,MAAM,cAAc,SAAU,GAAG,CAAC,IAAI,WAAW,SAAS,EAAE,GAAG,IAAI,KAAG,IAG5E,CAAC;AAcF,eAAO,MAAM,cAAc,MAAO,SAAS,EAAE,GAAG,IAAI,KAAK,SAAS,EAAE,GAAG,IAAI,KAAG,OAI7E,CAAC"}
|
package/dist/menu-items.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import * as Gio from "@gtkx/gi/gio";
|
|
2
|
-
const buildMenuModel = (entries) => {
|
|
3
|
-
const menu = new Gio.Menu();
|
|
4
|
-
appendEntries(menu, entries);
|
|
5
|
-
return menu;
|
|
6
|
-
};
|
|
7
|
-
const appendEntries = (menu, entries) => {
|
|
8
|
-
for (const entry of entries) {
|
|
9
|
-
if (entry.section !== undefined) {
|
|
10
|
-
menu.appendSection(entry.label ?? null, buildMenuModel(entry.section));
|
|
11
|
-
continue;
|
|
12
|
-
}
|
|
13
|
-
if (entry.submenu !== undefined) {
|
|
14
|
-
menu.appendSubmenu(entry.label ?? null, buildMenuModel(entry.submenu));
|
|
15
|
-
continue;
|
|
16
|
-
}
|
|
17
|
-
const item = new Gio.MenuItem();
|
|
18
|
-
if (entry.label !== undefined)
|
|
19
|
-
item.setLabel(entry.label);
|
|
20
|
-
if (entry.action !== undefined)
|
|
21
|
-
item.setDetailedAction(entry.action);
|
|
22
|
-
menu.appendItem(item);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
export const applyMenuItems = (menu, entries) => {
|
|
26
|
-
menu.removeAll();
|
|
27
|
-
if (entries)
|
|
28
|
-
appendEntries(menu, entries);
|
|
29
|
-
};
|
|
30
|
-
const entryEqual = (a, b) => a.label === b.label &&
|
|
31
|
-
a.action === b.action &&
|
|
32
|
-
entryListEqual(a.submenu, b.submenu) &&
|
|
33
|
-
entryListEqual(a.section, b.section);
|
|
34
|
-
const entryListEqual = (a, b) => {
|
|
35
|
-
if (a === b)
|
|
36
|
-
return true;
|
|
37
|
-
if (a === undefined || b === undefined)
|
|
38
|
-
return false;
|
|
39
|
-
return a.length === b.length && a.every((entry, index) => entryEqual(entry, b[index]));
|
|
40
|
-
};
|
|
41
|
-
export const menuItemsEqual = (a, b) => {
|
|
42
|
-
if (a === b)
|
|
43
|
-
return true;
|
|
44
|
-
if (a === null || b === null)
|
|
45
|
-
return false;
|
|
46
|
-
return entryListEqual(a, b);
|
|
47
|
-
};
|
|
48
|
-
//# sourceMappingURL=menu-items.js.map
|
package/dist/menu-items.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"menu-items.js","sourceRoot":"","sources":["../src/menu-items.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAGpC,MAAM,cAAc,GAAG,CAAC,OAAoB,EAAY,EAAE;IACtD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5B,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAc,EAAE,OAAoB,EAAQ,EAAE;IACjE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACvE,SAAS;QACb,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACvE,SAAS;QACb,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAc,EAAE,OAA2B,EAAQ,EAAE;IAChF,IAAI,CAAC,SAAS,EAAE,CAAC;IACjB,IAAI,OAAO;QAAE,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,CAAY,EAAE,CAAY,EAAW,EAAE,CACvD,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;IACnB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;IACrB,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;IACpC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAEzC,MAAM,cAAc,GAAG,CAAC,CAA0B,EAAE,CAA0B,EAAW,EAAE;IACvF,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAc,CAAC,CAAC,CAAC;AACxG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAqB,EAAE,CAAqB,EAAW,EAAE;IACpF,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChC,CAAC,CAAC","sourcesContent":["import * as Gio from \"@gtkx/gi/gio\";\nimport type { MenuEntry } from \"./types.js\";\n\nconst buildMenuModel = (entries: MenuEntry[]): Gio.Menu => {\n const menu = new Gio.Menu();\n appendEntries(menu, entries);\n return menu;\n};\n\nconst appendEntries = (menu: Gio.Menu, entries: MenuEntry[]): void => {\n for (const entry of entries) {\n if (entry.section !== undefined) {\n menu.appendSection(entry.label ?? null, buildMenuModel(entry.section));\n continue;\n }\n if (entry.submenu !== undefined) {\n menu.appendSubmenu(entry.label ?? null, buildMenuModel(entry.submenu));\n continue;\n }\n const item = new Gio.MenuItem();\n if (entry.label !== undefined) item.setLabel(entry.label);\n if (entry.action !== undefined) item.setDetailedAction(entry.action);\n menu.appendItem(item);\n }\n};\n\nexport const applyMenuItems = (menu: Gio.Menu, entries: MenuEntry[] | null): void => {\n menu.removeAll();\n if (entries) appendEntries(menu, entries);\n};\n\nconst entryEqual = (a: MenuEntry, b: MenuEntry): boolean =>\n a.label === b.label &&\n a.action === b.action &&\n entryListEqual(a.submenu, b.submenu) &&\n entryListEqual(a.section, b.section);\n\nconst entryListEqual = (a: MenuEntry[] | undefined, b: MenuEntry[] | undefined): boolean => {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n return a.length === b.length && a.every((entry, index) => entryEqual(entry, b[index] as MenuEntry));\n};\n\nexport const menuItemsEqual = (a: MenuEntry[] | null, b: MenuEntry[] | null): boolean => {\n if (a === b) return true;\n if (a === null || b === null) return false;\n return entryListEqual(a, b);\n};\n"]}
|
package/dist/menu.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type * as Gio from "@gtkx/gi/gio";
|
|
2
|
-
import { type GMenuProps } from "@gtkx/jsx/gio";
|
|
3
|
-
import { type ReactNode, type Ref } from "react";
|
|
4
|
-
import type { MenuEntry } from "./types.js";
|
|
5
|
-
export type MenuItemsProps = {
|
|
6
|
-
items?: MenuEntry[] | null | undefined;
|
|
7
|
-
};
|
|
8
|
-
/** Props for {@link Menu}, combining Gio.Menu props with a declarative items array. */
|
|
9
|
-
export type MenuProps = Omit<GMenuProps, keyof MenuItemsProps> & MenuItemsProps & {
|
|
10
|
-
ref?: Ref<Gio.Menu | null>;
|
|
11
|
-
};
|
|
12
|
-
/** Builds a Gio.Menu model from a declarative array of {@link MenuEntry} items. */
|
|
13
|
-
export declare const Menu: (props: MenuProps) => ReactNode;
|
|
14
|
-
//# sourceMappingURL=menu.d.ts.map
|
package/dist/menu.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../src/menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAA2B,MAAM,OAAO,CAAC;AAE1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,MAAM,cAAc,GAAG;IACzB,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1C,CAAC;AAEF,uFAAuF;AACvF,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,cAAc,CAAC,GAAG,cAAc,GAAG;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;CAAE,CAAC;AAEjH,mFAAmF;AACnF,eAAO,MAAM,IAAI,UAAW,SAAS,KAAG,SAgBvC,CAAC"}
|
package/dist/menu.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { GMenu } from "@gtkx/jsx/gio";
|
|
3
|
-
import { useMergeRefs } from "@gtkx/react/internal";
|
|
4
|
-
import { useLayoutEffect, useRef } from "react";
|
|
5
|
-
import { applyMenuItems, menuItemsEqual } from "./menu-items.js";
|
|
6
|
-
/** Builds a Gio.Menu model from a declarative array of {@link MenuEntry} items. */
|
|
7
|
-
export const Menu = (props) => {
|
|
8
|
-
const { items, ref, ...rest } = props;
|
|
9
|
-
const menuRef = useRef(null);
|
|
10
|
-
const mergedRef = useMergeRefs(ref, menuRef);
|
|
11
|
-
const appliedRef = useRef(null);
|
|
12
|
-
useLayoutEffect(() => {
|
|
13
|
-
const menu = menuRef.current;
|
|
14
|
-
if (!menu)
|
|
15
|
-
return;
|
|
16
|
-
const entries = items ?? null;
|
|
17
|
-
if (menuItemsEqual(appliedRef.current, entries))
|
|
18
|
-
return;
|
|
19
|
-
appliedRef.current = entries;
|
|
20
|
-
applyMenuItems(menu, entries);
|
|
21
|
-
});
|
|
22
|
-
return _jsx(GMenu, { ...rest, ref: mergedRef });
|
|
23
|
-
};
|
|
24
|
-
//# sourceMappingURL=menu.js.map
|
package/dist/menu.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAmB,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAA4B,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAUjE,mFAAmF;AACnF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAgB,EAAa,EAAE;IAChD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAEpD,eAAe,CAAC,GAAG,EAAE;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC;QAC9B,IAAI,cAAc,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;YAAE,OAAO;QACxD,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,OAAO,KAAC,KAAK,OAAK,IAAI,EAAE,GAAG,EAAE,SAAS,GAAI,CAAC;AAC/C,CAAC,CAAC","sourcesContent":["import type * as Gio from \"@gtkx/gi/gio\";\nimport { GMenu, type GMenuProps } from \"@gtkx/jsx/gio\";\nimport { useMergeRefs } from \"@gtkx/react/internal\";\nimport { type ReactNode, type Ref, useLayoutEffect, useRef } from \"react\";\nimport { applyMenuItems, menuItemsEqual } from \"./menu-items.js\";\nimport type { MenuEntry } from \"./types.js\";\n\nexport type MenuItemsProps = {\n items?: MenuEntry[] | null | undefined;\n};\n\n/** Props for {@link Menu}, combining Gio.Menu props with a declarative items array. */\nexport type MenuProps = Omit<GMenuProps, keyof MenuItemsProps> & MenuItemsProps & { ref?: Ref<Gio.Menu | null> };\n\n/** Builds a Gio.Menu model from a declarative array of {@link MenuEntry} items. */\nexport const Menu = (props: MenuProps): ReactNode => {\n const { items, ref, ...rest } = props;\n const menuRef = useRef<Gio.Menu | null>(null);\n const mergedRef = useMergeRefs(ref, menuRef);\n const appliedRef = useRef<MenuEntry[] | null>(null);\n\n useLayoutEffect(() => {\n const menu = menuRef.current;\n if (!menu) return;\n const entries = items ?? null;\n if (menuItemsEqual(appliedRef.current, entries)) return;\n appliedRef.current = entries;\n applyMenuItems(menu, entries);\n });\n\n return <GMenu {...rest} ref={mergedRef} />;\n};\n"]}
|
package/dist/overlay.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
-
import { type GtkOverlayProps } from "@gtkx/jsx/gtk";
|
|
3
|
-
import { type ElementType, type ReactNode, type Ref } from "react";
|
|
4
|
-
import type { ChildProps } from "./types.js";
|
|
5
|
-
/** Props for {@link Overlay}. */
|
|
6
|
-
export type OverlayProps = GtkOverlayProps & {
|
|
7
|
-
ref?: Ref<Gtk.Overlay | null>;
|
|
8
|
-
};
|
|
9
|
-
export type OverlayPlacementProps = {
|
|
10
|
-
/** Whether this overlay contributes to the Overlay's measured size. */
|
|
11
|
-
measure?: boolean | null | undefined;
|
|
12
|
-
/** Whether the overlay is clipped to the main child's allocation. */
|
|
13
|
-
clipOverlay?: boolean | null | undefined;
|
|
14
|
-
};
|
|
15
|
-
/** Adds a single widget as an overlay on top of an {@link Overlay}'s main child. */
|
|
16
|
-
export type OverlayChildProps<C extends ElementType> = ChildProps<C, OverlayPlacementProps>;
|
|
17
|
-
/**
|
|
18
|
-
* Renders a Gtk.Overlay: a main child with one or more widgets stacked on top,
|
|
19
|
-
* declared via {@link Overlay.Child}. Non-Child children form the main content.
|
|
20
|
-
*/
|
|
21
|
-
export declare const Overlay: ((props: OverlayProps) => ReactNode) & {
|
|
22
|
-
Child: <C extends ElementType>(props: OverlayChildProps<C>) => ReactNode;
|
|
23
|
-
};
|
|
24
|
-
//# sourceMappingURL=overlay.d.ts.map
|
package/dist/overlay.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAY,KAAK,WAAW,EAAkB,KAAK,SAAS,EAAE,KAAK,GAAG,EAAU,MAAM,OAAO,CAAC;AAErG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,iCAAiC;AACjC,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;CAAE,CAAC;AAE/E,MAAM,MAAM,qBAAqB,GAAG;IAChC,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;CAC5C,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,IAAI,UAAU,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;AA0C5F;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,SAAS,CAAC,GAAG;IACzD,KAAK,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;CAkB5E,CAAC"}
|
package/dist/overlay.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { GtkOverlay } from "@gtkx/jsx/gtk";
|
|
3
|
-
import { useMergeRefs } from "@gtkx/react/internal";
|
|
4
|
-
import { Children, isValidElement, useRef } from "react";
|
|
5
|
-
import { createParentContext, usePlacedChild } from "./hooks/use-placed-child.js";
|
|
6
|
-
const { Context: OverlayContext, useParentRef: useOverlayRef } = createParentContext("<Overlay.Child> must be a child of <Overlay>");
|
|
7
|
-
const placementOf = (props) => ({
|
|
8
|
-
measure: props.measure ?? false,
|
|
9
|
-
clipOverlay: props.clipOverlay ?? false,
|
|
10
|
-
});
|
|
11
|
-
const samePlacement = (a, b) => a.measure === b.measure && a.clipOverlay === b.clipOverlay;
|
|
12
|
-
const OverlayChild = ({ component, measure, clipOverlay, ref, ...rest }) => {
|
|
13
|
-
const overlayRef = useOverlayRef();
|
|
14
|
-
const Component = component;
|
|
15
|
-
return usePlacedChild({
|
|
16
|
-
render: (placeRef) => _jsx(Component, { ...rest, ref: placeRef }),
|
|
17
|
-
ref,
|
|
18
|
-
placement: placementOf({ measure, clipOverlay }),
|
|
19
|
-
samePlacement,
|
|
20
|
-
place: (widget, placement) => {
|
|
21
|
-
const overlay = overlayRef.current;
|
|
22
|
-
if (!overlay)
|
|
23
|
-
return;
|
|
24
|
-
if (widget.getParent() !== overlay)
|
|
25
|
-
overlay.addOverlay(widget);
|
|
26
|
-
overlay.setMeasureOverlay(widget, placement.measure);
|
|
27
|
-
overlay.setClipOverlay(widget, placement.clipOverlay);
|
|
28
|
-
},
|
|
29
|
-
release: (widget) => {
|
|
30
|
-
const overlay = overlayRef.current;
|
|
31
|
-
if (overlay && widget.getParent() === overlay)
|
|
32
|
-
overlay.removeOverlay(widget);
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
};
|
|
36
|
-
const isOverlayChild = (node) => isValidElement(node) && node.type === OverlayChild;
|
|
37
|
-
/**
|
|
38
|
-
* Renders a Gtk.Overlay: a main child with one or more widgets stacked on top,
|
|
39
|
-
* declared via {@link Overlay.Child}. Non-Child children form the main content.
|
|
40
|
-
*/
|
|
41
|
-
export const Overlay = Object.assign(({ children, ref, ...rest }) => {
|
|
42
|
-
const overlayRef = useRef(null);
|
|
43
|
-
const mergedRef = useMergeRefs(ref, overlayRef);
|
|
44
|
-
const items = Children.toArray(children);
|
|
45
|
-
const overlays = items.filter(isOverlayChild);
|
|
46
|
-
const base = items.filter((node) => !isOverlayChild(node));
|
|
47
|
-
return (_jsxs(_Fragment, { children: [_jsx(GtkOverlay, { ...rest, ref: mergedRef, children: base }), _jsx(OverlayContext.Provider, { value: overlayRef, children: overlays })] }));
|
|
48
|
-
}, { Child: OverlayChild });
|
|
49
|
-
//# sourceMappingURL=overlay.js.map
|
package/dist/overlay.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../src/overlay.tsx"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport { GtkOverlay, type GtkOverlayProps } from \"@gtkx/jsx/gtk\";\nimport { useMergeRefs } from \"@gtkx/react/internal\";\nimport { Children, type ElementType, isValidElement, type ReactNode, type Ref, useRef } from \"react\";\nimport { createParentContext, usePlacedChild } from \"./hooks/use-placed-child.js\";\nimport type { ChildProps } from \"./types.js\";\n\nconst { Context: OverlayContext, useParentRef: useOverlayRef } = createParentContext<Gtk.Overlay>(\n \"<Overlay.Child> must be a child of <Overlay>\",\n);\n\n/** Props for {@link Overlay}. */\nexport type OverlayProps = GtkOverlayProps & { ref?: Ref<Gtk.Overlay | null> };\n\nexport type OverlayPlacementProps = {\n /** Whether this overlay contributes to the Overlay's measured size. */\n measure?: boolean | null | undefined;\n /** Whether the overlay is clipped to the main child's allocation. */\n clipOverlay?: boolean | null | undefined;\n};\n\n/** Adds a single widget as an overlay on top of an {@link Overlay}'s main child. */\nexport type OverlayChildProps<C extends ElementType> = ChildProps<C, OverlayPlacementProps>;\n\ntype OverlayPlacement = { measure: boolean; clipOverlay: boolean };\n\nconst placementOf = (props: OverlayPlacementProps): OverlayPlacement => ({\n measure: props.measure ?? false,\n clipOverlay: props.clipOverlay ?? false,\n});\n\nconst samePlacement = (a: OverlayPlacement, b: OverlayPlacement): boolean =>\n a.measure === b.measure && a.clipOverlay === b.clipOverlay;\n\nconst OverlayChild = <C extends ElementType>({\n component,\n measure,\n clipOverlay,\n ref,\n ...rest\n}: OverlayChildProps<C>): ReactNode => {\n const overlayRef = useOverlayRef();\n const Component: ElementType = component;\n return usePlacedChild<Gtk.Widget, OverlayPlacement>({\n render: (placeRef) => <Component {...rest} ref={placeRef} />,\n ref,\n placement: placementOf({ measure, clipOverlay }),\n samePlacement,\n place: (widget, placement) => {\n const overlay = overlayRef.current;\n if (!overlay) return;\n if (widget.getParent() !== overlay) overlay.addOverlay(widget);\n overlay.setMeasureOverlay(widget, placement.measure);\n overlay.setClipOverlay(widget, placement.clipOverlay);\n },\n release: (widget) => {\n const overlay = overlayRef.current;\n if (overlay && widget.getParent() === overlay) overlay.removeOverlay(widget);\n },\n });\n};\n\nconst isOverlayChild = (node: ReactNode): boolean => isValidElement(node) && node.type === OverlayChild;\n\n/**\n * Renders a Gtk.Overlay: a main child with one or more widgets stacked on top,\n * declared via {@link Overlay.Child}. Non-Child children form the main content.\n */\nexport const Overlay: ((props: OverlayProps) => ReactNode) & {\n Child: <C extends ElementType>(props: OverlayChildProps<C>) => ReactNode;\n} = Object.assign(\n ({ children, ref, ...rest }: OverlayProps): ReactNode => {\n const overlayRef = useRef<Gtk.Overlay | null>(null);\n const mergedRef = useMergeRefs<Gtk.Overlay>(ref, overlayRef);\n const items = Children.toArray(children);\n const overlays = items.filter(isOverlayChild);\n const base = items.filter((node) => !isOverlayChild(node));\n return (\n <>\n <GtkOverlay {...rest} ref={mergedRef}>\n {base}\n </GtkOverlay>\n <OverlayContext.Provider value={overlayRef}>{overlays}</OverlayContext.Provider>\n </>\n );\n },\n { Child: OverlayChild },\n);\n"]}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type * as GObject from "@gtkx/gi/gobject";
|
|
2
|
-
import type * as Gtk from "@gtkx/gi/gtk";
|
|
3
|
-
export type CellEntry = {
|
|
4
|
-
position: number;
|
|
5
|
-
treeRow: Gtk.TreeListRow | null;
|
|
6
|
-
};
|
|
7
|
-
export declare class CellContainerStore {
|
|
8
|
-
private entries;
|
|
9
|
-
private published;
|
|
10
|
-
private setListeners;
|
|
11
|
-
private positionListeners;
|
|
12
|
-
private positionFlushers;
|
|
13
|
-
private keys;
|
|
14
|
-
private snapshot;
|
|
15
|
-
subscribeSet: (onChange: () => void) => (() => void);
|
|
16
|
-
getContainersSnapshot: () => GObject.Object[];
|
|
17
|
-
subscribePosition: (container: GObject.Object, onChange: () => void) => (() => void);
|
|
18
|
-
getPosition: (container: GObject.Object) => CellEntry;
|
|
19
|
-
keyFor: (container: GObject.Object) => string;
|
|
20
|
-
addContainer: (container: GObject.Object) => void;
|
|
21
|
-
bind: (container: GObject.Object, position: number, treeRow: Gtk.TreeListRow | null) => void;
|
|
22
|
-
unbind: (container: GObject.Object) => void;
|
|
23
|
-
removeContainer: (container: GObject.Object) => void;
|
|
24
|
-
private flushSet;
|
|
25
|
-
private notifySet;
|
|
26
|
-
private notifyPosition;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=cell-container-store.d.ts.map
|