GitHub
4 年前
当前提交
11e45c2d
共有 71 个文件被更改,包括 5363 次插入 和 1875 次删除
-
42Samples/UIWidgetsSamples_2019_4/Assets/UIWidgetsExample.cs
-
10com.unity.uiwidgets/Runtime/animation/animation.cs
-
61com.unity.uiwidgets/Runtime/animation/animation_controller.cs
-
466com.unity.uiwidgets/Runtime/animation/curves.cs
-
171com.unity.uiwidgets/Runtime/animation/listener_helpers.mixin.gen.cs
-
44com.unity.uiwidgets/Runtime/animation/listener_helpers.mixin.njk
-
14com.unity.uiwidgets/Runtime/animation/tween.cs
-
2com.unity.uiwidgets/Runtime/animation/tween_sequence.cs
-
2com.unity.uiwidgets/Runtime/cupertino/dialog.cs
-
3com.unity.uiwidgets/Runtime/engine2/UIWidgetsPanel.cs
-
30com.unity.uiwidgets/Runtime/foundation/diagnostics.cs
-
392com.unity.uiwidgets/Runtime/gestures/converter.cs
-
75com.unity.uiwidgets/Runtime/gestures/events.cs
-
94com.unity.uiwidgets/Runtime/gestures/multitap.cs
-
14com.unity.uiwidgets/Runtime/gestures/pointer_router.cs
-
8com.unity.uiwidgets/Runtime/gestures/pointer_signal_resolver.cs
-
4com.unity.uiwidgets/Runtime/gestures/recognizer.cs
-
32com.unity.uiwidgets/Runtime/gestures/scale.cs
-
3com.unity.uiwidgets/Runtime/gestures/tap.cs
-
2com.unity.uiwidgets/Runtime/painting/text_painter.cs
-
10com.unity.uiwidgets/Runtime/rendering/box.mixin.gen.cs
-
8com.unity.uiwidgets/Runtime/rendering/box.mixin.njk
-
1com.unity.uiwidgets/Runtime/rendering/editable.cs
-
90com.unity.uiwidgets/Runtime/rendering/object.mixin.gen.cs
-
185com.unity.uiwidgets/Runtime/rendering/object.mixin.njk
-
31com.unity.uiwidgets/Runtime/rendering/proxy_box.cs
-
29com.unity.uiwidgets/Runtime/rendering/proxy_box.mixin.njk
-
12com.unity.uiwidgets/Runtime/rendering/proxy_sliver.cs
-
66com.unity.uiwidgets/Runtime/rendering/sliver.cs
-
29com.unity.uiwidgets/Runtime/rendering/stack.cs
-
7com.unity.uiwidgets/Runtime/services/asset_bundle.cs
-
2com.unity.uiwidgets/Runtime/services/binding.cs
-
986com.unity.uiwidgets/Runtime/services/keyboard_key.cs
-
12com.unity.uiwidgets/Runtime/widgets/basic.cs
-
2com.unity.uiwidgets/Runtime/widgets/disposable_build_context.cs
-
2com.unity.uiwidgets/Runtime/widgets/editable_text.cs
-
655com.unity.uiwidgets/Runtime/widgets/fade_in_image.cs
-
642com.unity.uiwidgets/Runtime/widgets/focus_manager.cs
-
472com.unity.uiwidgets/Runtime/widgets/focus_traversal.cs
-
332com.unity.uiwidgets/Runtime/widgets/image.cs
-
101com.unity.uiwidgets/Runtime/widgets/implicit_animations.cs
-
4com.unity.uiwidgets/Runtime/widgets/orientation_builder.cs
-
2com.unity.uiwidgets/Runtime/widgets/page_view.cs
-
6com.unity.uiwidgets/Runtime/widgets/scroll_notification.mixin.njk
-
6com.unity.uiwidgets/Runtime/widgets/selectable_text.cs
-
13com.unity.uiwidgets/Runtime/widgets/transitions.cs
-
92com.unity.uiwidgets/Runtime/services/text_editing.cs
-
28com.unity.uiwidgets/Runtime/services/text_formatter.cs
-
324com.unity.uiwidgets/Runtime/services/text_input.cs
-
73Samples/UIWidgetsSamples_2019_4/Assets/CountDemo.cs
-
11Samples/UIWidgetsSamples_2019_4/Assets/CountDemo.cs.meta
-
537Samples/UIWidgetsSamples_2019_4/Assets/CountDemo.unity
-
7Samples/UIWidgetsSamples_2019_4/Assets/CountDemo.unity.meta
-
117com.unity.uiwidgets/Runtime/rendering/RenderAnimatedOpacityMixin.mixin.gen.cs
-
98com.unity.uiwidgets/Runtime/rendering/RenderAnimatedOpacityMixin.mixin.njk
-
72com.unity.uiwidgets/Runtime/widgets/DiagnosticableTree.mixin.gen.cs
-
66com.unity.uiwidgets/Runtime/widgets/DiagnosticableTree.mixin.njk
-
313com.unity.uiwidgets/Runtime/widgets/DirectionalFocusTraversalPolicy.mixin.gen.cs
-
310com.unity.uiwidgets/Runtime/widgets/DirectionalFocusTraversalPolicy.mixin.njk
-
8com.unity.uiwidgets/Runtime/material.meta
-
8com.unity.uiwidgets/Runtime/ui33.meta
-
0/com.unity.uiwidgets/Runtime/services/text_editing.cs
-
0/com.unity.uiwidgets/Runtime/services/clipboard.cs
-
0/com.unity.uiwidgets/Runtime/services/system_chrome.cs
-
0/com.unity.uiwidgets/Runtime/services/keyboard.cs
-
0/com.unity.uiwidgets/Runtime/services/raw_keyboard.cs
-
0/com.unity.uiwidgets/Runtime/services/text_formatter.cs
-
0/com.unity.uiwidgets/Runtime/services/platform_channel.cs
-
0/com.unity.uiwidgets/Runtime/services/system_channels.cs
-
0/com.unity.uiwidgets/Runtime/services/text_input.cs
986
com.unity.uiwidgets/Runtime/services/keyboard_key.cs
文件差异内容过多而无法显示
查看文件
文件差异内容过多而无法显示
查看文件
|
|||
using System.Collections.Generic; |
|||
using Unity.UIWidgets.cupertino; |
|||
using Unity.UIWidgets.engine2; |
|||
using Unity.UIWidgets.ui; |
|||
using Unity.UIWidgets.widgets; |
|||
using UnityEngine.UI; |
|||
using Text = Unity.UIWidgets.widgets.Text; |
|||
using ui_ = Unity.UIWidgets.widgets.ui_; |
|||
|
|||
namespace UIWidgetsSample |
|||
{ |
|||
public class CountDemo : UIWidgetsPanel |
|||
{ |
|||
protected void OnEnable() |
|||
{ |
|||
base.OnEnable(); |
|||
} |
|||
|
|||
protected override void main() |
|||
{ |
|||
ui_.runApp(new MyApp()); |
|||
} |
|||
|
|||
class MyApp : StatelessWidget |
|||
{ |
|||
public override Widget build(BuildContext context) |
|||
{ |
|||
return new CupertinoApp( |
|||
home: new CounterApp() |
|||
); |
|||
} |
|||
} |
|||
} |
|||
|
|||
internal class CounterApp : StatefulWidget |
|||
{ |
|||
public override State createState() |
|||
{ |
|||
return new CountDemoState(); |
|||
} |
|||
} |
|||
|
|||
internal class CountDemoState : State<CounterApp> |
|||
{ |
|||
private int count = 0; |
|||
|
|||
public override Widget build(BuildContext context) |
|||
{ |
|||
return new Container( |
|||
color: Color.white, |
|||
child: new Column(children: new List<Widget>() |
|||
{ |
|||
new Text($"count: {count}"), |
|||
new CupertinoButton( |
|||
onPressed: () => |
|||
{ |
|||
setState(() => |
|||
{ |
|||
count++; |
|||
}); |
|||
}, |
|||
child: new Container( |
|||
color: Color.black, |
|||
width: 100, |
|||
height: 40 |
|||
) |
|||
), |
|||
} |
|||
) |
|||
); |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 0817e3443c80cb943a03dcf7b120bd2e |
|||
MonoImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
%YAML 1.1 |
|||
%TAG !u! tag:unity3d.com,2011: |
|||
--- !u!29 &1 |
|||
OcclusionCullingSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 2 |
|||
m_OcclusionBakeSettings: |
|||
smallestOccluder: 5 |
|||
smallestHole: 0.25 |
|||
backfaceThreshold: 100 |
|||
m_SceneGUID: 00000000000000000000000000000000 |
|||
m_OcclusionCullingData: {fileID: 0} |
|||
--- !u!104 &2 |
|||
RenderSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 9 |
|||
m_Fog: 0 |
|||
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} |
|||
m_FogMode: 3 |
|||
m_FogDensity: 0.01 |
|||
m_LinearFogStart: 0 |
|||
m_LinearFogEnd: 300 |
|||
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} |
|||
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} |
|||
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} |
|||
m_AmbientIntensity: 1 |
|||
m_AmbientMode: 0 |
|||
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} |
|||
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} |
|||
m_HaloStrength: 0.5 |
|||
m_FlareStrength: 1 |
|||
m_FlareFadeSpeed: 3 |
|||
m_HaloTexture: {fileID: 0} |
|||
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} |
|||
m_DefaultReflectionMode: 0 |
|||
m_DefaultReflectionResolution: 128 |
|||
m_ReflectionBounces: 1 |
|||
m_ReflectionIntensity: 1 |
|||
m_CustomReflection: {fileID: 0} |
|||
m_Sun: {fileID: 0} |
|||
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} |
|||
m_UseRadianceAmbientProbe: 0 |
|||
--- !u!157 &3 |
|||
LightmapSettings: |
|||
m_ObjectHideFlags: 0 |
|||
serializedVersion: 11 |
|||
m_GIWorkflowMode: 1 |
|||
m_GISettings: |
|||
serializedVersion: 2 |
|||
m_BounceScale: 1 |
|||
m_IndirectOutputScale: 1 |
|||
m_AlbedoBoost: 1 |
|||
m_EnvironmentLightingMode: 0 |
|||
m_EnableBakedLightmaps: 1 |
|||
m_EnableRealtimeLightmaps: 0 |
|||
m_LightmapEditorSettings: |
|||
serializedVersion: 12 |
|||
m_Resolution: 2 |
|||
m_BakeResolution: 40 |
|||
m_AtlasSize: 1024 |
|||
m_AO: 0 |
|||
m_AOMaxDistance: 1 |
|||
m_CompAOExponent: 1 |
|||
m_CompAOExponentDirect: 0 |
|||
m_ExtractAmbientOcclusion: 0 |
|||
m_Padding: 2 |
|||
m_LightmapParameters: {fileID: 0} |
|||
m_LightmapsBakeMode: 1 |
|||
m_TextureCompression: 1 |
|||
m_FinalGather: 0 |
|||
m_FinalGatherFiltering: 1 |
|||
m_FinalGatherRayCount: 256 |
|||
m_ReflectionCompression: 2 |
|||
m_MixedBakeMode: 2 |
|||
m_BakeBackend: 1 |
|||
m_PVRSampling: 1 |
|||
m_PVRDirectSampleCount: 32 |
|||
m_PVRSampleCount: 512 |
|||
m_PVRBounces: 2 |
|||
m_PVREnvironmentSampleCount: 256 |
|||
m_PVREnvironmentReferencePointCount: 2048 |
|||
m_PVRFilteringMode: 1 |
|||
m_PVRDenoiserTypeDirect: 1 |
|||
m_PVRDenoiserTypeIndirect: 1 |
|||
m_PVRDenoiserTypeAO: 1 |
|||
m_PVRFilterTypeDirect: 0 |
|||
m_PVRFilterTypeIndirect: 0 |
|||
m_PVRFilterTypeAO: 0 |
|||
m_PVREnvironmentMIS: 1 |
|||
m_PVRCulling: 1 |
|||
m_PVRFilteringGaussRadiusDirect: 1 |
|||
m_PVRFilteringGaussRadiusIndirect: 5 |
|||
m_PVRFilteringGaussRadiusAO: 2 |
|||
m_PVRFilteringAtrousPositionSigmaDirect: 0.5 |
|||
m_PVRFilteringAtrousPositionSigmaIndirect: 2 |
|||
m_PVRFilteringAtrousPositionSigmaAO: 1 |
|||
m_ExportTrainingData: 0 |
|||
m_TrainingDataDestination: TrainingData |
|||
m_LightProbeSampleCountMultiplier: 4 |
|||
m_LightingDataAsset: {fileID: 0} |
|||
m_UseShadowmask: 1 |
|||
--- !u!196 &4 |
|||
NavMeshSettings: |
|||
serializedVersion: 2 |
|||
m_ObjectHideFlags: 0 |
|||
m_BuildSettings: |
|||
serializedVersion: 2 |
|||
agentTypeID: 0 |
|||
agentRadius: 0.5 |
|||
agentHeight: 2 |
|||
agentSlope: 45 |
|||
agentClimb: 0.4 |
|||
ledgeDropHeight: 0 |
|||
maxJumpAcrossDistance: 0 |
|||
minRegionArea: 2 |
|||
manualCellSize: 0 |
|||
cellSize: 0.16666667 |
|||
manualTileSize: 0 |
|||
tileSize: 256 |
|||
accuratePlacement: 0 |
|||
debug: |
|||
m_Flags: 0 |
|||
m_NavMeshData: {fileID: 0} |
|||
--- !u!1 &314921619 |
|||
GameObject: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
serializedVersion: 6 |
|||
m_Component: |
|||
- component: {fileID: 314921623} |
|||
- component: {fileID: 314921622} |
|||
- component: {fileID: 314921621} |
|||
- component: {fileID: 314921620} |
|||
m_Layer: 5 |
|||
m_Name: Canvas |
|||
m_TagString: Untagged |
|||
m_Icon: {fileID: 0} |
|||
m_NavMeshLayer: 0 |
|||
m_StaticEditorFlags: 0 |
|||
m_IsActive: 1 |
|||
--- !u!114 &314921620 |
|||
MonoBehaviour: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 314921619} |
|||
m_Enabled: 1 |
|||
m_EditorHideFlags: 0 |
|||
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} |
|||
m_Name: |
|||
m_EditorClassIdentifier: |
|||
m_IgnoreReversedGraphics: 1 |
|||
m_BlockingObjects: 0 |
|||
m_BlockingMask: |
|||
serializedVersion: 2 |
|||
m_Bits: 4294967295 |
|||
--- !u!114 &314921621 |
|||
MonoBehaviour: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 314921619} |
|||
m_Enabled: 1 |
|||
m_EditorHideFlags: 0 |
|||
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} |
|||
m_Name: |
|||
m_EditorClassIdentifier: |
|||
m_UiScaleMode: 0 |
|||
m_ReferencePixelsPerUnit: 100 |
|||
m_ScaleFactor: 1 |
|||
m_ReferenceResolution: {x: 800, y: 600} |
|||
m_ScreenMatchMode: 0 |
|||
m_MatchWidthOrHeight: 0 |
|||
m_PhysicalUnit: 3 |
|||
m_FallbackScreenDPI: 96 |
|||
m_DefaultSpriteDPI: 96 |
|||
m_DynamicPixelsPerUnit: 1 |
|||
--- !u!223 &314921622 |
|||
Canvas: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 314921619} |
|||
m_Enabled: 1 |
|||
serializedVersion: 3 |
|||
m_RenderMode: 0 |
|||
m_Camera: {fileID: 0} |
|||
m_PlaneDistance: 100 |
|||
m_PixelPerfect: 0 |
|||
m_ReceivesEvents: 1 |
|||
m_OverrideSorting: 0 |
|||
m_OverridePixelPerfect: 0 |
|||
m_SortingBucketNormalizedSize: 0 |
|||
m_AdditionalShaderChannelsFlag: 0 |
|||
m_SortingLayerID: 0 |
|||
m_SortingOrder: 0 |
|||
m_TargetDisplay: 0 |
|||
--- !u!224 &314921623 |
|||
RectTransform: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 314921619} |
|||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} |
|||
m_LocalPosition: {x: 0, y: 0, z: 0} |
|||
m_LocalScale: {x: 0, y: 0, z: 0} |
|||
m_Children: |
|||
- {fileID: 1777874941} |
|||
m_Father: {fileID: 0} |
|||
m_RootOrder: 2 |
|||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} |
|||
m_AnchorMin: {x: 0, y: 0} |
|||
m_AnchorMax: {x: 0, y: 0} |
|||
m_AnchoredPosition: {x: 0, y: 0} |
|||
m_SizeDelta: {x: 0, y: 0} |
|||
m_Pivot: {x: 0, y: 0} |
|||
--- !u!1 &624009034 |
|||
GameObject: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
serializedVersion: 6 |
|||
m_Component: |
|||
- component: {fileID: 624009037} |
|||
- component: {fileID: 624009036} |
|||
- component: {fileID: 624009035} |
|||
m_Layer: 0 |
|||
m_Name: EventSystem |
|||
m_TagString: Untagged |
|||
m_Icon: {fileID: 0} |
|||
m_NavMeshLayer: 0 |
|||
m_StaticEditorFlags: 0 |
|||
m_IsActive: 1 |
|||
--- !u!114 &624009035 |
|||
MonoBehaviour: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 624009034} |
|||
m_Enabled: 1 |
|||
m_EditorHideFlags: 0 |
|||
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} |
|||
m_Name: |
|||
m_EditorClassIdentifier: |
|||
m_HorizontalAxis: Horizontal |
|||
m_VerticalAxis: Vertical |
|||
m_SubmitButton: Submit |
|||
m_CancelButton: Cancel |
|||
m_InputActionsPerSecond: 10 |
|||
m_RepeatDelay: 0.5 |
|||
m_ForceModuleActive: 0 |
|||
--- !u!114 &624009036 |
|||
MonoBehaviour: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 624009034} |
|||
m_Enabled: 1 |
|||
m_EditorHideFlags: 0 |
|||
m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} |
|||
m_Name: |
|||
m_EditorClassIdentifier: |
|||
m_FirstSelected: {fileID: 0} |
|||
m_sendNavigationEvents: 1 |
|||
m_DragThreshold: 10 |
|||
--- !u!4 &624009037 |
|||
Transform: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 624009034} |
|||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} |
|||
m_LocalPosition: {x: 0, y: 0, z: 0} |
|||
m_LocalScale: {x: 1, y: 1, z: 1} |
|||
m_Children: [] |
|||
m_Father: {fileID: 0} |
|||
m_RootOrder: 3 |
|||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} |
|||
--- !u!1 &1344837310 |
|||
GameObject: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
serializedVersion: 6 |
|||
m_Component: |
|||
- component: {fileID: 1344837313} |
|||
- component: {fileID: 1344837312} |
|||
- component: {fileID: 1344837311} |
|||
m_Layer: 0 |
|||
m_Name: Main Camera |
|||
m_TagString: MainCamera |
|||
m_Icon: {fileID: 0} |
|||
m_NavMeshLayer: 0 |
|||
m_StaticEditorFlags: 0 |
|||
m_IsActive: 1 |
|||
--- !u!81 &1344837311 |
|||
AudioListener: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 1344837310} |
|||
m_Enabled: 1 |
|||
--- !u!20 &1344837312 |
|||
Camera: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 1344837310} |
|||
m_Enabled: 1 |
|||
serializedVersion: 2 |
|||
m_ClearFlags: 1 |
|||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} |
|||
m_projectionMatrixMode: 1 |
|||
m_GateFitMode: 2 |
|||
m_FOVAxisMode: 0 |
|||
m_SensorSize: {x: 36, y: 24} |
|||
m_LensShift: {x: 0, y: 0} |
|||
m_FocalLength: 50 |
|||
m_NormalizedViewPortRect: |
|||
serializedVersion: 2 |
|||
x: 0 |
|||
y: 0 |
|||
width: 1 |
|||
height: 1 |
|||
near clip plane: 0.3 |
|||
far clip plane: 1000 |
|||
field of view: 60 |
|||
orthographic: 0 |
|||
orthographic size: 5 |
|||
m_Depth: -1 |
|||
m_CullingMask: |
|||
serializedVersion: 2 |
|||
m_Bits: 4294967295 |
|||
m_RenderingPath: -1 |
|||
m_TargetTexture: {fileID: 0} |
|||
m_TargetDisplay: 0 |
|||
m_TargetEye: 3 |
|||
m_HDR: 1 |
|||
m_AllowMSAA: 1 |
|||
m_AllowDynamicResolution: 0 |
|||
m_ForceIntoRT: 0 |
|||
m_OcclusionCulling: 1 |
|||
m_StereoConvergence: 10 |
|||
m_StereoSeparation: 0.022 |
|||
--- !u!4 &1344837313 |
|||
Transform: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 1344837310} |
|||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} |
|||
m_LocalPosition: {x: 0, y: 1, z: -10} |
|||
m_LocalScale: {x: 1, y: 1, z: 1} |
|||
m_Children: [] |
|||
m_Father: {fileID: 0} |
|||
m_RootOrder: 0 |
|||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} |
|||
--- !u!1 &1763163838 |
|||
GameObject: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
serializedVersion: 6 |
|||
m_Component: |
|||
- component: {fileID: 1763163840} |
|||
- component: {fileID: 1763163839} |
|||
m_Layer: 0 |
|||
m_Name: Directional Light |
|||
m_TagString: Untagged |
|||
m_Icon: {fileID: 0} |
|||
m_NavMeshLayer: 0 |
|||
m_StaticEditorFlags: 0 |
|||
m_IsActive: 1 |
|||
--- !u!108 &1763163839 |
|||
Light: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 1763163838} |
|||
m_Enabled: 1 |
|||
serializedVersion: 10 |
|||
m_Type: 1 |
|||
m_Shape: 0 |
|||
m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} |
|||
m_Intensity: 1 |
|||
m_Range: 10 |
|||
m_SpotAngle: 30 |
|||
m_InnerSpotAngle: 21.80208 |
|||
m_CookieSize: 10 |
|||
m_Shadows: |
|||
m_Type: 2 |
|||
m_Resolution: -1 |
|||
m_CustomResolution: -1 |
|||
m_Strength: 1 |
|||
m_Bias: 0.05 |
|||
m_NormalBias: 0.4 |
|||
m_NearPlane: 0.2 |
|||
m_CullingMatrixOverride: |
|||
e00: 1 |
|||
e01: 0 |
|||
e02: 0 |
|||
e03: 0 |
|||
e10: 0 |
|||
e11: 1 |
|||
e12: 0 |
|||
e13: 0 |
|||
e20: 0 |
|||
e21: 0 |
|||
e22: 1 |
|||
e23: 0 |
|||
e30: 0 |
|||
e31: 0 |
|||
e32: 0 |
|||
e33: 1 |
|||
m_UseCullingMatrixOverride: 0 |
|||
m_Cookie: {fileID: 0} |
|||
m_DrawHalo: 0 |
|||
m_Flare: {fileID: 0} |
|||
m_RenderMode: 0 |
|||
m_CullingMask: |
|||
serializedVersion: 2 |
|||
m_Bits: 4294967295 |
|||
m_RenderingLayerMask: 1 |
|||
m_Lightmapping: 4 |
|||
m_LightShadowCasterMode: 0 |
|||
m_AreaSize: {x: 1, y: 1} |
|||
m_BounceIntensity: 1 |
|||
m_ColorTemperature: 6570 |
|||
m_UseColorTemperature: 0 |
|||
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} |
|||
m_UseBoundingSphereOverride: 0 |
|||
m_ShadowRadius: 0 |
|||
m_ShadowAngle: 0 |
|||
--- !u!4 &1763163840 |
|||
Transform: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 1763163838} |
|||
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} |
|||
m_LocalPosition: {x: 0, y: 3, z: 0} |
|||
m_LocalScale: {x: 1, y: 1, z: 1} |
|||
m_Children: [] |
|||
m_Father: {fileID: 0} |
|||
m_RootOrder: 1 |
|||
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} |
|||
--- !u!1 &1777874940 |
|||
GameObject: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
serializedVersion: 6 |
|||
m_Component: |
|||
- component: {fileID: 1777874941} |
|||
- component: {fileID: 1777874942} |
|||
- component: {fileID: 1777874943} |
|||
m_Layer: 5 |
|||
m_Name: RawImage |
|||
m_TagString: Untagged |
|||
m_Icon: {fileID: 0} |
|||
m_NavMeshLayer: 0 |
|||
m_StaticEditorFlags: 0 |
|||
m_IsActive: 1 |
|||
--- !u!224 &1777874941 |
|||
RectTransform: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 1777874940} |
|||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} |
|||
m_LocalPosition: {x: 0, y: 0, z: 0} |
|||
m_LocalScale: {x: 1, y: 1, z: 1} |
|||
m_Children: [] |
|||
m_Father: {fileID: 314921623} |
|||
m_RootOrder: 0 |
|||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} |
|||
m_AnchorMin: {x: 0.5, y: 0.5} |
|||
m_AnchorMax: {x: 0.5, y: 0.5} |
|||
m_AnchoredPosition: {x: 0, y: 0} |
|||
m_SizeDelta: {x: 100, y: 100} |
|||
m_Pivot: {x: 0.5, y: 0.5} |
|||
--- !u!222 &1777874942 |
|||
CanvasRenderer: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 1777874940} |
|||
m_CullTransparentMesh: 0 |
|||
--- !u!114 &1777874943 |
|||
MonoBehaviour: |
|||
m_ObjectHideFlags: 0 |
|||
m_CorrespondingSourceObject: {fileID: 0} |
|||
m_PrefabInstance: {fileID: 0} |
|||
m_PrefabAsset: {fileID: 0} |
|||
m_GameObject: {fileID: 1777874940} |
|||
m_Enabled: 1 |
|||
m_EditorHideFlags: 0 |
|||
m_Script: {fileID: 11500000, guid: bb0c6b34bc87472499dccfb52a9bcbde, type: 3} |
|||
m_Name: |
|||
m_EditorClassIdentifier: |
|||
m_Material: {fileID: 0} |
|||
m_Color: {r: 1, g: 1, b: 1, a: 1} |
|||
m_RaycastTarget: 1 |
|||
m_Maskable: 1 |
|||
m_OnCullStateChanged: |
|||
m_PersistentCalls: |
|||
m_Calls: [] |
|||
m_Texture: {fileID: 0} |
|||
m_UVRect: |
|||
serializedVersion: 2 |
|||
x: 0 |
|||
y: 0 |
|||
width: 1 |
|||
height: 1 |
|||
fonts: [] |
|||
devicePixelRatioOverride: 0 |
|||
hardwareAntiAliasing: 0 |
|
|||
fileFormatVersion: 2 |
|||
guid: c157694a3a510e34aaf716cf9438dea5 |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using Unity.UIWidgets.animation; |
|||
using Unity.UIWidgets.foundation; |
|||
using Unity.UIWidgets.gestures; |
|||
using Unity.UIWidgets.painting; |
|||
using Unity.UIWidgets.ui; |
|||
namespace Unity.UIWidgets.rendering { |
|||
|
|||
public abstract class RenderAnimatedOpacityMixinRenderSliver<ChildType> : RenderProxySliver, RenderAnimatedOpacityMixin<ChildType> where ChildType : RenderObject { |
|||
|
|||
|
|||
public int _alpha { get; set; } |
|||
|
|||
public new bool alwaysNeedsCompositing { |
|||
get { return child != null && _currentlyNeedsCompositing;} |
|||
} |
|||
|
|||
public bool _currentlyNeedsCompositing { get; set; } |
|||
|
|||
|
|||
|
|||
public Animation<float> opacity { |
|||
get { return _opacity; } |
|||
set { |
|||
D.assert(value != null); |
|||
if (_opacity == value) |
|||
return; |
|||
if (attached && _opacity != null) |
|||
_opacity.removeListener(_updateOpacity); |
|||
_opacity = value; |
|||
if (attached) |
|||
_opacity.addListener(_updateOpacity); |
|||
_updateOpacity(); |
|||
} |
|||
} |
|||
|
|||
public Animation<float> _opacity { get; set; } |
|||
public bool alwaysIncludeSemantics { |
|||
get { return _alwaysIncludeSemantics; } |
|||
set { |
|||
if (value == _alwaysIncludeSemantics) |
|||
return; |
|||
_alwaysIncludeSemantics = value; |
|||
//markNeedsSemanticsUpdate();
|
|||
|
|||
} |
|||
} |
|||
|
|||
public bool _alwaysIncludeSemantics { get; set; } |
|||
|
|||
public override void attach(object owner) { |
|||
owner = (PipelineOwner) owner; |
|||
base.attach(owner); |
|||
_opacity.addListener(_updateOpacity); |
|||
_updateOpacity(); |
|||
} |
|||
|
|||
public void attach(PipelineOwner owner) { |
|||
base.attach(owner); |
|||
_opacity.addListener(_updateOpacity); |
|||
_updateOpacity(); |
|||
} |
|||
|
|||
public override void detach() { |
|||
_opacity.removeListener(_updateOpacity); |
|||
base.detach(); |
|||
} |
|||
public void _updateOpacity() { |
|||
int oldAlpha = _alpha; |
|||
_alpha = ui.Color.getAlphaFromOpacity((float)_opacity.value); |
|||
if (oldAlpha != _alpha) { |
|||
bool didNeedCompositing = _currentlyNeedsCompositing; |
|||
_currentlyNeedsCompositing = _alpha > 0 && _alpha < 255; |
|||
if (child != null && didNeedCompositing != _currentlyNeedsCompositing) |
|||
markNeedsCompositingBitsUpdate(); |
|||
markNeedsPaint(); |
|||
//if (oldAlpha == 0 || _alpha == 0)
|
|||
// markNeedsSemanticsUpdate();
|
|||
} |
|||
} |
|||
public override void paint(PaintingContext context, Offset offset) { |
|||
if (child != null) { |
|||
if (_alpha == 0) { |
|||
layer = null; |
|||
return; |
|||
} |
|||
if (_alpha == 255) { |
|||
layer = null; |
|||
context.paintChild(child, offset); |
|||
return; |
|||
} |
|||
D.assert(needsCompositing); |
|||
layer = context.pushOpacity(offset, _alpha, base.paint, oldLayer: layer as OpacityLayer); |
|||
} |
|||
} |
|||
|
|||
|
|||
public void visitChildrenForSemantics(RenderObjectVisitor visitor) { |
|||
if (child != null && (_alpha != 0 || alwaysIncludeSemantics)) |
|||
visitor(child); |
|||
} |
|||
|
|||
public override void debugFillProperties(DiagnosticPropertiesBuilder properties) { |
|||
base.debugFillProperties(properties); |
|||
properties.add(new DiagnosticsProperty<Animation<float>>("opacity", opacity)); |
|||
properties.add(new FlagProperty("alwaysIncludeSemantics", value: alwaysIncludeSemantics, ifTrue: "alwaysIncludeSemantics")); |
|||
} |
|||
|
|||
|
|||
public ChildType child { get; set; } |
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
|
|
|||
namespace Unity.UIWidgets.rendering { |
|||
{% macro RenderAnimatedOpacityMixin(with) %} |
|||
public abstract class RenderAnimatedOpacityMixin{{with}}<ChildType> : {{with}}, RenderAnimatedOpacityMixin<ChildType> where ChildType : RenderSliver { |
|||
|
|||
|
|||
public int _alpha { get; set;} |
|||
public new bool alwaysNeedsCompositing { |
|||
get { child != null && _currentlyNeedsCompositing;} |
|||
} |
|||
public bool _currentlyNeedsCompositing { get;set; } |
|||
|
|||
public Animation<float> opacity { |
|||
get { return _opacity; } |
|||
set { |
|||
D.assert(value != null); |
|||
if (_opacity == value) |
|||
return; |
|||
if (attached && _opacity != null) |
|||
_opacity.removeListener(_updateOpacity); |
|||
_opacity = value; |
|||
if (attached) |
|||
_opacity.addListener(_updateOpacity); |
|||
_updateOpacity(); |
|||
} |
|||
} |
|||
public Animation<float> _opacity { get; set; } |
|||
|
|||
|
|||
public bool alwaysIncludeSemantics { |
|||
get { return _alwaysIncludeSemantics; } |
|||
set { |
|||
if (value == _alwaysIncludeSemantics) |
|||
return; |
|||
_alwaysIncludeSemantics = value; |
|||
//markNeedsSemanticsUpdate(); |
|||
|
|||
} |
|||
} |
|||
public bool _alwaysIncludeSemantics { get; set; } |
|||
|
|||
public override void attach(PipelineOwner owner) { |
|||
base.attach(owner); |
|||
_opacity.addListener(_updateOpacity); |
|||
_updateOpacity(); |
|||
} |
|||
public override void detach() { |
|||
_opacity.removeListener(_updateOpacity); |
|||
base.detach(); |
|||
} |
|||
public void _updateOpacity() { |
|||
int oldAlpha = _alpha; |
|||
_alpha = ui.Color.getAlphaFromOpacity((float)_opacity.value); |
|||
if (oldAlpha != _alpha) { |
|||
bool didNeedCompositing = _currentlyNeedsCompositing; |
|||
_currentlyNeedsCompositing = _alpha > 0 && _alpha < 255; |
|||
if (child != null && didNeedCompositing != _currentlyNeedsCompositing) |
|||
markNeedsCompositingBitsUpdate(); |
|||
markNeedsPaint(); |
|||
//if (oldAlpha == 0 || _alpha == 0) |
|||
// markNeedsSemanticsUpdate(); |
|||
|
|||
} |
|||
} |
|||
public override void paint(PaintingContext context, Offset offset) { |
|||
if (child != null) { |
|||
if (_alpha == 0) { |
|||
layer = null; |
|||
return; |
|||
} |
|||
if (_alpha == 255) { |
|||
layer = null; |
|||
context.paintChild(child, offset); |
|||
return; |
|||
} |
|||
D.assert(needsCompositing); |
|||
layer = context.pushOpacity(offset, _alpha, base.paint, oldLayer: layer as OpacityLayer); |
|||
} |
|||
} |
|||
|
|||
public void visitChildrenForSemantics(RenderObjectVisitor visitor) { |
|||
if (child != null && (_alpha != 0 || alwaysIncludeSemantics)) |
|||
visitor(child); |
|||
} |
|||
|
|||
public override void debugFillProperties(DiagnosticPropertiesBuilder properties) { |
|||
base.debugFillProperties(properties); |
|||
properties.add(new DiagnosticsProperty<Animation<float>>("opacity", opacity)); |
|||
properties.add(new FlagProperty("alwaysIncludeSemantics", value: alwaysIncludeSemantics, ifTrue: "alwaysIncludeSemantics")); |
|||
} |
|||
|
|||
} |
|||
{% endmacro %} |
|||
|
|||
{{ RenderAnimatedOpacityMixin('RenderSliver') }} |
|||
|
|||
} |
|||
|
|||
|
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using Unity.UIWidgets.ui; |
|||
using UnityEngine; |
|||
namespace Unity.UIWidgets.foundation { |
|||
public class DiagnosticableTreeMixinChangeNotifier : ChangeNotifier, DiagnosticableTreeMixin { |
|||
protected DiagnosticableTreeMixinChangeNotifier() { |
|||
} |
|||
public virtual string toString( DiagnosticLevel minLevel = DiagnosticLevel.info ) { |
|||
return toDiagnosticsNode(style: DiagnosticsTreeStyle.singleLine).toString(minLevel: minLevel); |
|||
} |
|||
|
|||
public virtual string toStringShallow( |
|||
string joiner = ", ", |
|||
DiagnosticLevel minLevel = DiagnosticLevel.debug |
|||
) { |
|||
if (foundation_.kReleaseMode) { |
|||
return toString(); |
|||
} |
|||
string shallowString = ""; |
|||
D.assert(() => { |
|||
var result = new StringBuilder(); |
|||
result.Append(toString()); |
|||
result.Append(joiner); |
|||
DiagnosticPropertiesBuilder builder = new DiagnosticPropertiesBuilder(); |
|||
debugFillProperties(builder); |
|||
result.Append(string.Join(joiner, |
|||
builder.properties.Where(n => !n.isFiltered(minLevel)).Select(n => n.ToString()).ToArray()) |
|||
); |
|||
shallowString = result.ToString(); |
|||
return true; |
|||
}); |
|||
return shallowString; |
|||
} |
|||
|
|||
public virtual string toStringDeep( |
|||
string prefixLineOne = "", |
|||
string prefixOtherLines = null, |
|||
DiagnosticLevel minLevel = DiagnosticLevel.debug |
|||
) { |
|||
return toDiagnosticsNode().toStringDeep(prefixLineOne: prefixLineOne, prefixOtherLines: prefixOtherLines, minLevel: minLevel); |
|||
} |
|||
|
|||
public virtual string toStringShort() { |
|||
return foundation_.describeIdentity(this); |
|||
} |
|||
|
|||
public virtual DiagnosticsNode toDiagnosticsNode( |
|||
string name = null, |
|||
DiagnosticsTreeStyle style = DiagnosticsTreeStyle.sparse) { |
|||
return new DiagnosticableTreeNode( |
|||
name: name, |
|||
value: this, |
|||
style: style |
|||
); |
|||
} |
|||
|
|||
public virtual List<DiagnosticsNode> debugDescribeChildren() |
|||
{ |
|||
return new List<DiagnosticsNode>(); |
|||
} |
|||
|
|||
public virtual void debugFillProperties(DiagnosticPropertiesBuilder properties) { } |
|||
|
|||
|
|||
|
|||
} |
|||
|
|||
} |
|||
|
|
|||
namespace Unity.UIWidgets.foundation { |
|||
{% macro DiagnosticableTreeMixin(with) %} |
|||
{% set className = 'DiagnosticableTreeMixin' + with %} |
|||
public class {{className}} : {{with}}, DiagnosticableTreeMixin { |
|||
protected {{className}}() { |
|||
} |
|||
public virtual string toString( DiagnosticLevel minLevel = DiagnosticLevel.info ) { |
|||
return toDiagnosticsNode(style: DiagnosticsTreeStyle.singleLine).toString(minLevel: minLevel); |
|||
} |
|||
|
|||
public virtual string toStringShallow( |
|||
string joiner = ", ", |
|||
DiagnosticLevel minLevel = DiagnosticLevel.debug |
|||
) { |
|||
if (foundation_.kReleaseMode) { |
|||
return toString(); |
|||
} |
|||
string shallowString = ""; |
|||
D.assert(() => { |
|||
var result = new StringBuilder(); |
|||
result.Append(toString()); |
|||
result.Append(joiner); |
|||
DiagnosticPropertiesBuilder builder = new DiagnosticPropertiesBuilder(); |
|||
debugFillProperties(builder); |
|||
result.Append(string.Join(joiner, |
|||
builder.properties.Where(n => !n.isFiltered(minLevel)).Select(n => n.ToString()).ToArray()) |
|||
); |
|||
shallowString = result.ToString(); |
|||
return true; |
|||
}); |
|||
return shallowString; |
|||
} |
|||
|
|||
public virtual string toStringDeep( |
|||
string prefixLineOne = "", |
|||
string prefixOtherLines = null, |
|||
DiagnosticLevel minLevel = DiagnosticLevel.debug |
|||
) { |
|||
return toDiagnosticsNode().toStringDeep(prefixLineOne: prefixLineOne, prefixOtherLines: prefixOtherLines, minLevel: minLevel); |
|||
} |
|||
|
|||
public virtual string toStringShort() { |
|||
return foundation_.describeIdentity(this); |
|||
} |
|||
|
|||
public virtual DiagnosticsNode toDiagnosticsNode( |
|||
string name = null, |
|||
DiagnosticsTreeStyle style = DiagnosticsTreeStyle.sparse) { |
|||
return new DiagnosticableTreeNode( |
|||
name: name, |
|||
value: this, |
|||
style: style |
|||
); |
|||
} |
|||
|
|||
public virtual List<DiagnosticsNode> debugDescribeChildren() |
|||
{ |
|||
return new List<DiagnosticsNode>(); |
|||
} |
|||
|
|||
public virtual void debugFillProperties(DiagnosticPropertiesBuilder properties) { } |
|||
} |
|||
{% endmacro %} |
|||
{{ DiagnosticableTreeMixin('ChangeNotifier') }} |
|||
} |
|||
|
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using Unity.UIWidgets.foundation; |
|||
using Unity.UIWidgets.ui; |
|||
using Unity.UIWidgets.widgets; |
|||
namespace Unity.UIWidgets.widgets { |
|||
public class DirectionalFocusTraversalPolicyMixinFocusTraversalPolicy : FocusTraversalPolicy, DirectionalFocusTraversalPolicyMixin { |
|||
protected DirectionalFocusTraversalPolicyMixinFocusTraversalPolicy() { |
|||
} |
|||
|
|||
public readonly Dictionary<FocusScopeNode, _DirectionalPolicyData> _policyData = new Dictionary<FocusScopeNode, _DirectionalPolicyData>(); |
|||
public override void invalidateScopeData(FocusScopeNode node) { |
|||
base.invalidateScopeData(node); |
|||
_policyData.Remove(node); |
|||
} |
|||
public override void changedScope(FocusNode node = null, FocusScopeNode oldScope = null) { |
|||
base.changedScope(node: node, oldScope: oldScope); |
|||
if (oldScope != null) { |
|||
var delEntries = _policyData[oldScope]?.history?.Where((_DirectionalPolicyDataEntry entry)=> { |
|||
return entry.node == node; |
|||
}); |
|||
foreach (var delEntry in delEntries) { |
|||
_policyData[oldScope]?.history?.Remove(delEntry); |
|||
} |
|||
} |
|||
} |
|||
public override FocusNode findFirstFocusInDirection(FocusNode currentNode, TraversalDirection direction) { |
|||
D.assert(direction != null); |
|||
D.assert(currentNode != null); |
|||
switch (direction) { |
|||
case TraversalDirection.up: |
|||
return _sortAndFindInitial(currentNode, vertical: true, first: false); |
|||
case TraversalDirection.down: |
|||
return _sortAndFindInitial(currentNode, vertical: true, first: true); |
|||
case TraversalDirection.left: |
|||
return _sortAndFindInitial(currentNode, vertical: false, first: false); |
|||
case TraversalDirection.right: |
|||
return _sortAndFindInitial(currentNode, vertical: false, first: true); |
|||
} |
|||
return null; |
|||
} |
|||
public FocusNode _sortAndFindInitial(FocusNode currentNode, bool vertical = false, bool first = false) { |
|||
IEnumerable<FocusNode> nodes = currentNode.nearestScope.traversalDescendants; |
|||
List<FocusNode> sorted = nodes.ToList(); |
|||
FocusTravesalUtils.mergeSort<FocusNode>(sorted, compare: (FocusNode a, FocusNode b)=> { |
|||
if (vertical) { |
|||
if (first) { |
|||
return a.rect.top.CompareTo(b.rect.top); |
|||
} else { |
|||
return b.rect.bottom.CompareTo(a.rect.bottom); |
|||
} |
|||
} else { |
|||
if (first) { |
|||
return a.rect.left.CompareTo(b.rect.left); |
|||
} else { |
|||
return b.rect.right.CompareTo(a.rect.right); |
|||
} |
|||
} |
|||
}); |
|||
if (sorted.isNotEmpty()) { |
|||
return sorted.First(); |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public IEnumerable<FocusNode> _sortAndFilterHorizontally( |
|||
TraversalDirection direction, |
|||
Rect target, |
|||
FocusNode nearestScope) |
|||
{ |
|||
D.assert(direction == TraversalDirection.left || direction == TraversalDirection.right); |
|||
IEnumerable<FocusNode> nodes = nearestScope.traversalDescendants; |
|||
D.assert(!nodes.Contains(nearestScope)); |
|||
List<FocusNode> sorted = nodes.ToList(); |
|||
FocusTravesalUtils.mergeSort<FocusNode>(sorted, compare: (FocusNode a, FocusNode b) => a.rect.center.dx.CompareTo(b.rect.center.dx)); |
|||
IEnumerable<FocusNode> result = new List<FocusNode>(); |
|||
switch (direction) { |
|||
case TraversalDirection.left: |
|||
result = sorted.Where((FocusNode node) => node.rect != target && node.rect.center.dx <= target.left); |
|||
break; |
|||
case TraversalDirection.right: |
|||
result = sorted.Where((FocusNode node) => node.rect != target && node.rect.center.dx >= target.right); |
|||
break; |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.down: |
|||
break; |
|||
} |
|||
return result; |
|||
} |
|||
public IEnumerable<FocusNode> _sortAndFilterVertically( |
|||
TraversalDirection direction, |
|||
Rect target, |
|||
IEnumerable<FocusNode> nodes) |
|||
{ |
|||
List<FocusNode> sorted = nodes.ToList(); |
|||
FocusTravesalUtils.mergeSort<FocusNode>(sorted, compare: (FocusNode a, FocusNode b) => a.rect.center.dy.CompareTo(b.rect.center.dy)); |
|||
switch (direction) { |
|||
case TraversalDirection.up: |
|||
return sorted.Where((FocusNode node) => node.rect != target && node.rect.center.dy <= target.top); |
|||
case TraversalDirection.down: |
|||
return sorted.Where((FocusNode node) => node.rect != target && node.rect.center.dy >= target.bottom); |
|||
case TraversalDirection.left: |
|||
case TraversalDirection.right: |
|||
break; |
|||
} |
|||
D.assert(direction == TraversalDirection.up || direction == TraversalDirection.down); |
|||
return null; |
|||
} |
|||
public bool _popPolicyDataIfNeeded(TraversalDirection direction, FocusScopeNode nearestScope, FocusNode focusedChild) { |
|||
_DirectionalPolicyData policyData = _policyData[nearestScope]; |
|||
if (policyData != null && policyData.history.isNotEmpty() && policyData.history.First().direction != direction) { |
|||
if (policyData.history.Last().node.parent == null) { |
|||
invalidateScopeData(nearestScope); |
|||
return false; |
|||
|
|||
} |
|||
bool popOrInvalidate(TraversalDirection direction) { |
|||
FocusNode lastNode = policyData.history.removeLast().node; |
|||
if (Scrollable.of(lastNode.context) != Scrollable.of(FocusManagerUtils.primaryFocus.context)) { |
|||
invalidateScopeData(nearestScope); |
|||
return false; |
|||
} |
|||
ScrollPositionAlignmentPolicy alignmentPolicy = ScrollPositionAlignmentPolicy.explicitPolicy; |
|||
switch (direction) { |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.left: |
|||
alignmentPolicy = ScrollPositionAlignmentPolicy.keepVisibleAtStart; |
|||
break; |
|||
case TraversalDirection.right: |
|||
case TraversalDirection.down: |
|||
alignmentPolicy = ScrollPositionAlignmentPolicy.keepVisibleAtEnd; |
|||
break; |
|||
} |
|||
FocusTravesalUtils._focusAndEnsureVisible( |
|||
lastNode, |
|||
alignmentPolicy: alignmentPolicy |
|||
); |
|||
return true; |
|||
} |
|||
switch (direction) { |
|||
case TraversalDirection.down: |
|||
case TraversalDirection.up: |
|||
switch (policyData.history.First().direction) { |
|||
case TraversalDirection.left: |
|||
case TraversalDirection.right: |
|||
invalidateScopeData(nearestScope); |
|||
break; |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.down: |
|||
if (popOrInvalidate(direction)) { |
|||
return true; |
|||
} |
|||
break; |
|||
} |
|||
break; |
|||
case TraversalDirection.left: |
|||
case TraversalDirection.right: |
|||
switch (policyData.history.First().direction) { |
|||
case TraversalDirection.left: |
|||
case TraversalDirection.right: |
|||
if (popOrInvalidate(direction)) { |
|||
return true; |
|||
} |
|||
break; |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.down: |
|||
invalidateScopeData(nearestScope); |
|||
break; |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
if (policyData != null && policyData.history.isEmpty()) { |
|||
invalidateScopeData(nearestScope); |
|||
} |
|||
return false; |
|||
|
|||
} |
|||
public void _pushPolicyData(TraversalDirection direction, FocusScopeNode nearestScope, FocusNode focusedChild) { |
|||
_DirectionalPolicyData policyData = _policyData[nearestScope]; |
|||
if (policyData != null && !(policyData is _DirectionalPolicyData)) { |
|||
return; |
|||
} |
|||
_DirectionalPolicyDataEntry newEntry = new _DirectionalPolicyDataEntry(node: focusedChild, direction: direction); |
|||
if (policyData != null) { |
|||
policyData.history.Add(newEntry); |
|||
} else { |
|||
_policyData[nearestScope] = new _DirectionalPolicyData(history: new List<_DirectionalPolicyDataEntry>(){newEntry}); |
|||
} |
|||
} |
|||
public override bool inDirection(FocusNode currentNode, TraversalDirection direction) { |
|||
FocusScopeNode nearestScope = currentNode.nearestScope; |
|||
FocusNode focusedChild = nearestScope.focusedChild; |
|||
if (focusedChild == null) { |
|||
FocusNode firstFocus = findFirstFocusInDirection(currentNode, direction) ?? currentNode; |
|||
switch (direction) { |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.left: |
|||
FocusTravesalUtils._focusAndEnsureVisible( |
|||
firstFocus, |
|||
alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtStart |
|||
); |
|||
break; |
|||
case TraversalDirection.right: |
|||
case TraversalDirection.down: |
|||
FocusTravesalUtils._focusAndEnsureVisible( |
|||
firstFocus, |
|||
alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd |
|||
); |
|||
break; |
|||
} |
|||
return true; |
|||
} |
|||
if (_popPolicyDataIfNeeded(direction, nearestScope, focusedChild)) { |
|||
return true; |
|||
} |
|||
FocusNode found = null; |
|||
ScrollableState focusedScrollable = Scrollable.of(focusedChild.context); |
|||
switch (direction) { |
|||
case TraversalDirection.down: |
|||
case TraversalDirection.up: |
|||
IEnumerable<FocusNode> eligibleNodes = _sortAndFilterVertically( |
|||
direction, |
|||
focusedChild.rect, |
|||
nearestScope.traversalDescendants |
|||
); |
|||
if (focusedScrollable != null && !focusedScrollable.position.atEdge()) { |
|||
IEnumerable<FocusNode> filteredEligibleNodes = eligibleNodes.Where((FocusNode node) => Scrollable.of(node.context) == focusedScrollable); |
|||
if (filteredEligibleNodes.Count() !=0) { |
|||
eligibleNodes = filteredEligibleNodes; |
|||
} |
|||
} |
|||
if (eligibleNodes.Count() == 0) { |
|||
break; |
|||
} |
|||
List<FocusNode> sorted = eligibleNodes.ToList(); |
|||
if (direction == TraversalDirection.up) { |
|||
//sorted = sorted.reversed.toList();
|
|||
sorted.Reverse(); |
|||
sorted = sorted.ToList(); |
|||
} |
|||
Rect band = Rect.fromLTRB(focusedChild.rect.left, float.NegativeInfinity, focusedChild.rect.right, float.PositiveInfinity); |
|||
IEnumerable<FocusNode> inBand = sorted.Where((FocusNode node) => !node.rect.intersect(band).isEmpty); |
|||
if (inBand.Count() !=0) { |
|||
found = inBand.First(); |
|||
break; |
|||
} |
|||
FocusTravesalUtils.mergeSort<FocusNode>(sorted, compare: (FocusNode a, FocusNode b)=> { |
|||
return (a.rect.center.dx - focusedChild.rect.center.dx).abs().CompareTo((b.rect.center.dx - focusedChild.rect.center.dx).abs()); |
|||
}); |
|||
found = sorted.First(); |
|||
break; |
|||
case TraversalDirection.right: |
|||
case TraversalDirection.left: |
|||
eligibleNodes = _sortAndFilterHorizontally(direction, focusedChild.rect, nearestScope); |
|||
if (focusedScrollable != null && !focusedScrollable.position.atEdge()) { |
|||
IEnumerable<FocusNode> filteredEligibleNodes = eligibleNodes.Where((FocusNode node) => Scrollable.of(node.context) == focusedScrollable); |
|||
if (filteredEligibleNodes.Count()!=0) { |
|||
eligibleNodes = filteredEligibleNodes; |
|||
} |
|||
} |
|||
if (eligibleNodes.Count() == 0) { |
|||
break; |
|||
} |
|||
sorted = eligibleNodes.ToList(); |
|||
if (direction == TraversalDirection.left) { |
|||
sorted.Reverse(); |
|||
sorted = sorted.ToList(); |
|||
//sorted = sorted.reversed.toList();
|
|||
} |
|||
band = Rect.fromLTRB(float.NegativeInfinity, focusedChild.rect.top, float.PositiveInfinity, focusedChild.rect.bottom); |
|||
inBand = sorted.Where((FocusNode node) => !node.rect.intersect(band).isEmpty); |
|||
if (inBand.Count()!=0) { |
|||
found = inBand.First(); |
|||
break; |
|||
} |
|||
FocusTravesalUtils.mergeSort<FocusNode>(sorted, compare: (FocusNode a, FocusNode b) =>{ |
|||
return (a.rect.center.dy - focusedChild.rect.center.dy).abs().CompareTo((b.rect.center.dy - focusedChild.rect.center.dy).abs()); |
|||
}); |
|||
found = sorted.First(); |
|||
break; |
|||
} |
|||
if (found != null) { |
|||
_pushPolicyData(direction, nearestScope, focusedChild); |
|||
switch (direction) { |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.left: |
|||
FocusTravesalUtils._focusAndEnsureVisible( |
|||
found, |
|||
alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtStart |
|||
); |
|||
break; |
|||
case TraversalDirection.down: |
|||
case TraversalDirection.right: |
|||
FocusTravesalUtils._focusAndEnsureVisible( |
|||
found, |
|||
alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd |
|||
); |
|||
break; |
|||
} |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
public override IEnumerable<FocusNode> sortDescendants(IEnumerable<FocusNode> descendants) { |
|||
return null; |
|||
} |
|||
|
|||
} |
|||
|
|||
} |
|||
|
|
|||
namespace Unity.UIWidgets.widgets { |
|||
{% macro DirectionalFocusTraversalPolicyMixin(with) %} |
|||
{% set className = 'DirectionalFocusTraversalPolicyMixin' + with %} |
|||
public class {{className}} : {{with}}, DirectionalFocusTraversalPolicyMixin { |
|||
protected {{className}}() { |
|||
} |
|||
|
|||
public readonly Dictionary<FocusScopeNode, _DirectionalPolicyData> _policyData = new Dictionary<FocusScopeNode, _DirectionalPolicyData>(); |
|||
public override void invalidateScopeData(FocusScopeNode node) { |
|||
base.invalidateScopeData(node); |
|||
_policyData.Remove(node); |
|||
} |
|||
public override void changedScope(FocusNode node = null, FocusScopeNode oldScope = null) { |
|||
base.changedScope(node: node, oldScope: oldScope); |
|||
if (oldScope != null) { |
|||
var delEntries = _policyData[oldScope]?.history?.Where((_DirectionalPolicyDataEntry entry)=> { |
|||
return entry.node == node; |
|||
}); |
|||
foreach (var delEntry in delEntries) { |
|||
_policyData[oldScope]?.history?.Remove(delEntry); |
|||
} |
|||
} |
|||
} |
|||
public override FocusNode findFirstFocusInDirection(FocusNode currentNode, TraversalDirection direction) { |
|||
D.assert(direction != null); |
|||
D.assert(currentNode != null); |
|||
switch (direction) { |
|||
case TraversalDirection.up: |
|||
return _sortAndFindInitial(currentNode, vertical: true, first: false); |
|||
case TraversalDirection.down: |
|||
return _sortAndFindInitial(currentNode, vertical: true, first: true); |
|||
case TraversalDirection.left: |
|||
return _sortAndFindInitial(currentNode, vertical: false, first: false); |
|||
case TraversalDirection.right: |
|||
return _sortAndFindInitial(currentNode, vertical: false, first: true); |
|||
} |
|||
return null; |
|||
} |
|||
public FocusNode _sortAndFindInitial(FocusNode currentNode, bool vertical = false, bool first = false) { |
|||
IEnumerable<FocusNode> nodes = currentNode.nearestScope.traversalDescendants; |
|||
List<FocusNode> sorted = nodes.ToList(); |
|||
FocusTravesalUtils.mergeSort<FocusNode>(sorted, compare: (FocusNode a, FocusNode b)=> { |
|||
if (vertical) { |
|||
if (first) { |
|||
return a.rect.top.CompareTo(b.rect.top); |
|||
} else { |
|||
return b.rect.bottom.CompareTo(a.rect.bottom); |
|||
} |
|||
} else { |
|||
if (first) { |
|||
return a.rect.left.CompareTo(b.rect.left); |
|||
} else { |
|||
return b.rect.right.CompareTo(a.rect.right); |
|||
} |
|||
} |
|||
}); |
|||
if (sorted.isNotEmpty()) { |
|||
return sorted.First(); |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public IEnumerable<FocusNode> _sortAndFilterHorizontally( |
|||
TraversalDirection direction, |
|||
Rect target, |
|||
FocusNode nearestScope) |
|||
{ |
|||
D.assert(direction == TraversalDirection.left || direction == TraversalDirection.right); |
|||
IEnumerable<FocusNode> nodes = nearestScope.traversalDescendants; |
|||
D.assert(!nodes.Contains(nearestScope)); |
|||
List<FocusNode> sorted = nodes.ToList(); |
|||
FocusTravesalUtils.mergeSort<FocusNode>(sorted, compare: (FocusNode a, FocusNode b) => a.rect.center.dx.CompareTo(b.rect.center.dx)); |
|||
IEnumerable<FocusNode> result = new List<FocusNode>(); |
|||
switch (direction) { |
|||
case TraversalDirection.left: |
|||
result = sorted.Where((FocusNode node) => node.rect != target && node.rect.center.dx <= target.left); |
|||
break; |
|||
case TraversalDirection.right: |
|||
result = sorted.Where((FocusNode node) => node.rect != target && node.rect.center.dx >= target.right); |
|||
break; |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.down: |
|||
break; |
|||
} |
|||
return result; |
|||
} |
|||
public IEnumerable<FocusNode> _sortAndFilterVertically( |
|||
TraversalDirection direction, |
|||
Rect target, |
|||
IEnumerable<FocusNode> nodes) |
|||
{ |
|||
List<FocusNode> sorted = nodes.ToList(); |
|||
FocusTravesalUtils.mergeSort<FocusNode>(sorted, compare: (FocusNode a, FocusNode b) => a.rect.center.dy.CompareTo(b.rect.center.dy)); |
|||
switch (direction) { |
|||
case TraversalDirection.up: |
|||
return sorted.Where((FocusNode node) => node.rect != target && node.rect.center.dy <= target.top); |
|||
case TraversalDirection.down: |
|||
return sorted.Where((FocusNode node) => node.rect != target && node.rect.center.dy >= target.bottom); |
|||
case TraversalDirection.left: |
|||
case TraversalDirection.right: |
|||
break; |
|||
} |
|||
D.assert(direction == TraversalDirection.up || direction == TraversalDirection.down); |
|||
return null; |
|||
} |
|||
public bool _popPolicyDataIfNeeded(TraversalDirection direction, FocusScopeNode nearestScope, FocusNode focusedChild) { |
|||
_DirectionalPolicyData policyData = _policyData[nearestScope]; |
|||
if (policyData != null && policyData.history.isNotEmpty() && policyData.history.First().direction != direction) { |
|||
if (policyData.history.Last().node.parent == null) { |
|||
invalidateScopeData(nearestScope); |
|||
return false; |
|||
|
|||
} |
|||
bool popOrInvalidate(TraversalDirection direction) { |
|||
FocusNode lastNode = policyData.history.removeLast().node; |
|||
if (Scrollable.of(lastNode.context) != Scrollable.of(FocusManagerUtils.primaryFocus.context)) { |
|||
invalidateScopeData(nearestScope); |
|||
return false; |
|||
} |
|||
ScrollPositionAlignmentPolicy alignmentPolicy = ScrollPositionAlignmentPolicy.explicitPolicy; |
|||
switch (direction) { |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.left: |
|||
alignmentPolicy = ScrollPositionAlignmentPolicy.keepVisibleAtStart; |
|||
break; |
|||
case TraversalDirection.right: |
|||
case TraversalDirection.down: |
|||
alignmentPolicy = ScrollPositionAlignmentPolicy.keepVisibleAtEnd; |
|||
break; |
|||
} |
|||
FocusTravesalUtils._focusAndEnsureVisible( |
|||
lastNode, |
|||
alignmentPolicy: alignmentPolicy |
|||
); |
|||
return true; |
|||
} |
|||
switch (direction) { |
|||
case TraversalDirection.down: |
|||
case TraversalDirection.up: |
|||
switch (policyData.history.First().direction) { |
|||
case TraversalDirection.left: |
|||
case TraversalDirection.right: |
|||
invalidateScopeData(nearestScope); |
|||
break; |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.down: |
|||
if (popOrInvalidate(direction)) { |
|||
return true; |
|||
} |
|||
break; |
|||
} |
|||
break; |
|||
case TraversalDirection.left: |
|||
case TraversalDirection.right: |
|||
switch (policyData.history.First().direction) { |
|||
case TraversalDirection.left: |
|||
case TraversalDirection.right: |
|||
if (popOrInvalidate(direction)) { |
|||
return true; |
|||
} |
|||
break; |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.down: |
|||
invalidateScopeData(nearestScope); |
|||
break; |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
if (policyData != null && policyData.history.isEmpty()) { |
|||
invalidateScopeData(nearestScope); |
|||
} |
|||
return false; |
|||
|
|||
} |
|||
public void _pushPolicyData(TraversalDirection direction, FocusScopeNode nearestScope, FocusNode focusedChild) { |
|||
_DirectionalPolicyData policyData = _policyData[nearestScope]; |
|||
if (policyData != null && !(policyData is _DirectionalPolicyData)) { |
|||
return; |
|||
} |
|||
_DirectionalPolicyDataEntry newEntry = new _DirectionalPolicyDataEntry(node: focusedChild, direction: direction); |
|||
if (policyData != null) { |
|||
policyData.history.Add(newEntry); |
|||
} else { |
|||
_policyData[nearestScope] = new _DirectionalPolicyData(history: new List<_DirectionalPolicyDataEntry>(){newEntry}); |
|||
} |
|||
} |
|||
public override bool inDirection(FocusNode currentNode, TraversalDirection direction) { |
|||
FocusScopeNode nearestScope = currentNode.nearestScope; |
|||
FocusNode focusedChild = nearestScope.focusedChild; |
|||
if (focusedChild == null) { |
|||
FocusNode firstFocus = findFirstFocusInDirection(currentNode, direction) ?? currentNode; |
|||
switch (direction) { |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.left: |
|||
FocusTravesalUtils._focusAndEnsureVisible( |
|||
firstFocus, |
|||
alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtStart |
|||
); |
|||
break; |
|||
case TraversalDirection.right: |
|||
case TraversalDirection.down: |
|||
FocusTravesalUtils._focusAndEnsureVisible( |
|||
firstFocus, |
|||
alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd |
|||
); |
|||
break; |
|||
} |
|||
return true; |
|||
} |
|||
if (_popPolicyDataIfNeeded(direction, nearestScope, focusedChild)) { |
|||
return true; |
|||
} |
|||
FocusNode found = null; |
|||
ScrollableState focusedScrollable = Scrollable.of(focusedChild.context); |
|||
switch (direction) { |
|||
case TraversalDirection.down: |
|||
case TraversalDirection.up: |
|||
IEnumerable<FocusNode> eligibleNodes = _sortAndFilterVertically( |
|||
direction, |
|||
focusedChild.rect, |
|||
nearestScope.traversalDescendants |
|||
); |
|||
if (focusedScrollable != null && !focusedScrollable.position.atEdge()) { |
|||
IEnumerable<FocusNode> filteredEligibleNodes = eligibleNodes.Where((FocusNode node) => Scrollable.of(node.context) == focusedScrollable); |
|||
if (filteredEligibleNodes.Count() !=0) { |
|||
eligibleNodes = filteredEligibleNodes; |
|||
} |
|||
} |
|||
if (eligibleNodes.Count() == 0) { |
|||
break; |
|||
} |
|||
List<FocusNode> sorted = eligibleNodes.ToList(); |
|||
if (direction == TraversalDirection.up) { |
|||
//sorted = sorted.reversed.toList(); |
|||
sorted.Reverse(); |
|||
sorted = sorted.ToList(); |
|||
} |
|||
Rect band = Rect.fromLTRB(focusedChild.rect.left, float.NegativeInfinity, focusedChild.rect.right, float.PositiveInfinity); |
|||
IEnumerable<FocusNode> inBand = sorted.Where((FocusNode node) => !node.rect.intersect(band).isEmpty); |
|||
if (inBand.Count() !=0) { |
|||
found = inBand.First(); |
|||
break; |
|||
} |
|||
FocusTravesalUtils.mergeSort<FocusNode>(sorted, compare: (FocusNode a, FocusNode b)=> { |
|||
return (a.rect.center.dx - focusedChild.rect.center.dx).abs().CompareTo((b.rect.center.dx - focusedChild.rect.center.dx).abs()); |
|||
}); |
|||
found = sorted.First(); |
|||
break; |
|||
case TraversalDirection.right: |
|||
case TraversalDirection.left: |
|||
eligibleNodes = _sortAndFilterHorizontally(direction, focusedChild.rect, nearestScope); |
|||
if (focusedScrollable != null && !focusedScrollable.position.atEdge()) { |
|||
IEnumerable<FocusNode> filteredEligibleNodes = eligibleNodes.Where((FocusNode node) => Scrollable.of(node.context) == focusedScrollable); |
|||
if (filteredEligibleNodes.Count()!=0) { |
|||
eligibleNodes = filteredEligibleNodes; |
|||
} |
|||
} |
|||
if (eligibleNodes.Count() == 0) { |
|||
break; |
|||
} |
|||
sorted = eligibleNodes.ToList(); |
|||
if (direction == TraversalDirection.left) { |
|||
sorted.Reverse(); |
|||
sorted = sorted.ToList(); |
|||
//sorted = sorted.reversed.toList(); |
|||
} |
|||
band = Rect.fromLTRB(float.NegativeInfinity, focusedChild.rect.top, float.PositiveInfinity, focusedChild.rect.bottom); |
|||
inBand = sorted.Where((FocusNode node) => !node.rect.intersect(band).isEmpty); |
|||
if (inBand.Count()!=0) { |
|||
found = inBand.First(); |
|||
break; |
|||
} |
|||
FocusTravesalUtils.mergeSort<FocusNode>(sorted, compare: (FocusNode a, FocusNode b) =>{ |
|||
return (a.rect.center.dy - focusedChild.rect.center.dy).abs().CompareTo((b.rect.center.dy - focusedChild.rect.center.dy).abs()); |
|||
}); |
|||
found = sorted.First(); |
|||
break; |
|||
} |
|||
if (found != null) { |
|||
_pushPolicyData(direction, nearestScope, focusedChild); |
|||
switch (direction) { |
|||
case TraversalDirection.up: |
|||
case TraversalDirection.left: |
|||
FocusTravesalUtils._focusAndEnsureVisible( |
|||
found, |
|||
alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtStart |
|||
); |
|||
break; |
|||
case TraversalDirection.down: |
|||
case TraversalDirection.right: |
|||
FocusTravesalUtils._focusAndEnsureVisible( |
|||
found, |
|||
alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd |
|||
); |
|||
break; |
|||
} |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
public override IEnumerable<FocusNode> sortDescendants(IEnumerable<FocusNode> descendants) { |
|||
return null; |
|||
} |
|||
|
|||
} |
|||
{% endmacro %} |
|||
{{ DirectionalFocusTraversalPolicyMixin('FocusTraversalPolicy') }} |
|||
} |
|||
|
|
|||
fileFormatVersion: 2 |
|||
guid: ba4b5dab38db54970bf74725b5642400 |
|||
folderAsset: yes |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
fileFormatVersion: 2 |
|||
guid: 628dbae83defc65479f1ad3d8c9acbfb |
|||
folderAsset: yes |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
撰写
预览
正在加载...
取消
保存
Reference in new issue