onejs-react 0.1.4 → 0.1.5
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/package.json +1 -1
- package/src/host-config.ts +42 -5
- package/src/types.ts +8 -0
package/package.json
CHANGED
package/src/host-config.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type {BaseProps, ViewStyle, VisualElement, GenerateVisualContentCallback}
|
|
|
3
3
|
import {parseStyleValue, parseColor} from './style-parser';
|
|
4
4
|
|
|
5
5
|
// CSObject is an alias for VisualElement - they represent the same C# objects
|
|
6
|
-
type CSObject = VisualElement;
|
|
6
|
+
type CSObject = VisualElement & { pickingMode?: number };
|
|
7
7
|
|
|
8
8
|
// Global declarations for QuickJS environment
|
|
9
9
|
declare function setTimeout(callback: () => void, ms?: number): number;
|
|
@@ -54,6 +54,7 @@ declare const CS: {
|
|
|
54
54
|
AlternatingRowBackground: CSEnum;
|
|
55
55
|
CollectionVirtualizationMethod: CSEnum;
|
|
56
56
|
DisplayStyle: CSEnum;
|
|
57
|
+
PickingMode: CSEnum;
|
|
57
58
|
};
|
|
58
59
|
};
|
|
59
60
|
OneJS: {
|
|
@@ -70,6 +71,8 @@ declare const __eventAPI: {
|
|
|
70
71
|
addEventListener: (element: CSObject, eventType: string, callback: Function) => void;
|
|
71
72
|
removeEventListener: (element: CSObject, eventType: string, callback: Function) => void;
|
|
72
73
|
removeAllEventListeners: (element: CSObject) => void;
|
|
74
|
+
setParent: (childHandle: number, parentHandle: number) => void;
|
|
75
|
+
removeParent: (childHandle: number) => void;
|
|
73
76
|
};
|
|
74
77
|
|
|
75
78
|
interface CSStyle {
|
|
@@ -416,6 +419,22 @@ function updateClassNames(element: CSObject, oldClassName: string | undefined, n
|
|
|
416
419
|
}
|
|
417
420
|
}
|
|
418
421
|
|
|
422
|
+
// Track parent-child relationships for event bubbling
|
|
423
|
+
function trackParent(child: CSObject, parent: CSObject) {
|
|
424
|
+
const childHandle = (child as unknown as { __csHandle: number }).__csHandle;
|
|
425
|
+
const parentHandle = (parent as unknown as { __csHandle: number }).__csHandle;
|
|
426
|
+
if (childHandle > 0 && parentHandle > 0) {
|
|
427
|
+
__eventAPI.setParent(childHandle, parentHandle);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
function untrackParent(child: CSObject) {
|
|
432
|
+
const childHandle = (child as unknown as { __csHandle: number }).__csHandle;
|
|
433
|
+
if (childHandle > 0) {
|
|
434
|
+
__eventAPI.removeParent(childHandle);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
419
438
|
// Apply event handlers
|
|
420
439
|
function applyEvents(instance: Instance, props: BaseProps) {
|
|
421
440
|
for (const [propName, eventType] of Object.entries(EVENT_PROPS)) {
|
|
@@ -778,6 +797,11 @@ function createInstance(type: string, props: BaseProps): Instance {
|
|
|
778
797
|
applyVisualContentCallback(instance, props);
|
|
779
798
|
applyComponentProps(element, type, props as Record<string, unknown>);
|
|
780
799
|
|
|
800
|
+
// Apply pickingMode
|
|
801
|
+
if (props.pickingMode !== undefined) {
|
|
802
|
+
element.pickingMode = CS.UnityEngine.UIElements.PickingMode[props.pickingMode];
|
|
803
|
+
}
|
|
804
|
+
|
|
781
805
|
return instance;
|
|
782
806
|
}
|
|
783
807
|
|
|
@@ -806,6 +830,16 @@ function updateInstance(instance: Instance, oldProps: BaseProps, newProps: BaseP
|
|
|
806
830
|
// Update component-specific props
|
|
807
831
|
applyComponentProps(element, instance.type, newProps as Record<string, unknown>);
|
|
808
832
|
|
|
833
|
+
// Update pickingMode
|
|
834
|
+
if (oldProps.pickingMode !== newProps.pickingMode) {
|
|
835
|
+
if (newProps.pickingMode !== undefined) {
|
|
836
|
+
element.pickingMode = CS.UnityEngine.UIElements.PickingMode[newProps.pickingMode];
|
|
837
|
+
} else {
|
|
838
|
+
// Reset to default (Position)
|
|
839
|
+
element.pickingMode = CS.UnityEngine.UIElements.PickingMode.Position;
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
|
|
809
843
|
instance.props = newProps;
|
|
810
844
|
}
|
|
811
845
|
|
|
@@ -862,31 +896,31 @@ export const hostConfig = {
|
|
|
862
896
|
if (shouldMergeText(parentInstance, child)) {
|
|
863
897
|
appendMergedTextChild(parentInstance, child);
|
|
864
898
|
} else {
|
|
865
|
-
// Non-text child - unmerge any previously merged text first
|
|
866
899
|
handleNonTextChild(parentInstance);
|
|
867
900
|
parentInstance.element.Add(child.element);
|
|
868
901
|
}
|
|
902
|
+
trackParent(child.element, parentInstance.element);
|
|
869
903
|
},
|
|
870
904
|
|
|
871
905
|
appendChild(parentInstance: Instance, child: Instance) {
|
|
872
906
|
if (shouldMergeText(parentInstance, child)) {
|
|
873
907
|
appendMergedTextChild(parentInstance, child);
|
|
874
908
|
} else {
|
|
875
|
-
// Non-text child - unmerge any previously merged text first
|
|
876
909
|
handleNonTextChild(parentInstance);
|
|
877
910
|
parentInstance.element.Add(child.element);
|
|
878
911
|
}
|
|
912
|
+
trackParent(child.element, parentInstance.element);
|
|
879
913
|
},
|
|
880
914
|
|
|
881
915
|
appendChildToContainer(container: Container, child: Instance) {
|
|
882
916
|
container.Add(child.element);
|
|
917
|
+
// Container is the root - no parent to track
|
|
883
918
|
},
|
|
884
919
|
|
|
885
920
|
insertBefore(parentInstance: Instance, child: Instance, beforeChild: Instance) {
|
|
886
921
|
if (shouldMergeText(parentInstance, child)) {
|
|
887
922
|
insertMergedTextChild(parentInstance, child, beforeChild);
|
|
888
923
|
} else {
|
|
889
|
-
// Non-text child - unmerge any previously merged text first
|
|
890
924
|
handleNonTextChild(parentInstance);
|
|
891
925
|
const index = parentInstance.element.IndexOf(beforeChild.element);
|
|
892
926
|
if (index >= 0) {
|
|
@@ -895,6 +929,7 @@ export const hostConfig = {
|
|
|
895
929
|
parentInstance.element.Add(child.element);
|
|
896
930
|
}
|
|
897
931
|
}
|
|
932
|
+
trackParent(child.element, parentInstance.element);
|
|
898
933
|
},
|
|
899
934
|
|
|
900
935
|
insertInContainerBefore(container: Container, child: Instance, beforeChild: Instance) {
|
|
@@ -904,21 +939,23 @@ export const hostConfig = {
|
|
|
904
939
|
} else {
|
|
905
940
|
container.Add(child.element);
|
|
906
941
|
}
|
|
942
|
+
// Container is the root - no parent to track
|
|
907
943
|
},
|
|
908
944
|
|
|
909
945
|
removeChild(parentInstance: Instance, child: Instance) {
|
|
910
946
|
if (child.mergedInto === parentInstance) {
|
|
911
|
-
// Child was merged into parent's text - remove from merged children
|
|
912
947
|
removeMergedTextChild(parentInstance, child);
|
|
913
948
|
} else {
|
|
914
949
|
__eventAPI.removeAllEventListeners(child.element);
|
|
915
950
|
parentInstance.element.Remove(child.element);
|
|
916
951
|
}
|
|
952
|
+
untrackParent(child.element);
|
|
917
953
|
},
|
|
918
954
|
|
|
919
955
|
removeChildFromContainer(container: Container, child: Instance) {
|
|
920
956
|
__eventAPI.removeAllEventListeners(child.element);
|
|
921
957
|
container.Remove(child.element);
|
|
958
|
+
untrackParent(child.element);
|
|
922
959
|
},
|
|
923
960
|
|
|
924
961
|
prepareUpdate(_instance: Instance, _type: string, oldProps: BaseProps, newProps: BaseProps) {
|
package/src/types.ts
CHANGED
|
@@ -331,6 +331,14 @@ export interface BaseProps {
|
|
|
331
331
|
onTransitionEnd?: TransitionEventHandler;
|
|
332
332
|
onTransitionCancel?: TransitionEventHandler;
|
|
333
333
|
|
|
334
|
+
// Picking mode - controls whether the element receives pointer events
|
|
335
|
+
/**
|
|
336
|
+
* Controls whether this element is pickable by pointer events.
|
|
337
|
+
* - "Position" (default): Element receives pointer events based on its rectangle
|
|
338
|
+
* - "Ignore": Element is transparent to pointer events (clicks pass through)
|
|
339
|
+
*/
|
|
340
|
+
pickingMode?: 'Position' | 'Ignore';
|
|
341
|
+
|
|
334
342
|
// Vector drawing
|
|
335
343
|
/**
|
|
336
344
|
* Callback for custom vector drawing via Unity's generateVisualContent.
|