Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Tabs widget #11

Merged
merged 1 commit into from
Aug 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
183 changes: 183 additions & 0 deletions Resources/UniMob.Tabs.prefab
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &6367032435352693596
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6696520364274900822}
- component: {fileID: 2220833119810404345}
- component: {fileID: 1257148358676158546}
m_Layer: 5
m_Name: Content
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6696520364274900822
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6367032435352693596}
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: 7319685399583282089}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2220833119810404345
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6367032435352693596}
m_CullTransparentMesh: 1
--- !u!114 &1257148358676158546
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6367032435352693596}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &7319685399583282088
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7319685399583282089}
- component: {fileID: 8906665030187236578}
- component: {fileID: 7319685399583282086}
- component: {fileID: 8228260109757239937}
- component: {fileID: 2693781698086315572}
m_Layer: 5
m_Name: UniMob.Tabs
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7319685399583282089
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7319685399583282088}
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:
- {fileID: 6696520364274900822}
m_Father: {fileID: 0}
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: 200, y: 200}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &8906665030187236578
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7319685399583282088}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: bb083892c6a34ab5a3ec4b6de2869eaf, type: 3}
m_Name:
m_EditorClassIdentifier:
content: {fileID: 6696520364274900822}
rectMask: {fileID: 7319685399583282086}
--- !u!114 &7319685399583282086
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7319685399583282088}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding: {x: 0, y: 0, z: 0, w: 0}
m_Softness: {x: 0, y: 0}
--- !u!223 &8228260109757239937
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7319685399583282088}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 2
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!114 &2693781698086315572
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7319685399583282088}
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: 55
7 changes: 7 additions & 0 deletions Resources/UniMob.Tabs.prefab.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

90 changes: 90 additions & 0 deletions Runtime/TabController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
using UnityEngine;

namespace UniMob.UI
{
public class TabController : ILifetimeScope
{
private float _prevValue;
private float _elapsed;

[Atom] public float Value { get; private set; }
[Atom] public int Index { get; private set; }
[Atom] public int PreviousIndex { get; private set; }
[Atom] public bool IndexIsChanging { get; private set; }

public Lifetime Lifetime { get; }

public float Duration { get; }
public int TabCount { get; }

public TabController(Lifetime lifetime, int tabCount, float duration)
{
Lifetime = lifetime;
TabCount = tabCount;
Duration = duration;
}

public void SetValue(float value)
{
RemoveAnimationTicker();

Value = Mathf.Clamp(value, 0, TabCount - 1);
}

public void AnimateTo(int newIndex)
{
using (Atom.NoWatch)
{
_prevValue = Value;
_elapsed = 0f;

PreviousIndex = Index;
Index = newIndex;
IndexIsChanging = true;

if (Mathf.Approximately(Duration, 0f))
{
IndexIsChanging = false;
}
else
{
AddAnimationTicker();
}
}
}

private void AddAnimationTicker()
{
Zone.Current.RemoveTicker(Tick);
Zone.Current.AddTicker(Tick);
}

private void RemoveAnimationTicker()
{
Zone.Current.RemoveTicker(Tick);
}

private void Tick()
{
if (Lifetime.IsDisposed)
{
RemoveAnimationTicker();
return;
}

_elapsed += Time.unscaledDeltaTime;

Value = Mathf.Lerp(_prevValue, Index, _elapsed / Duration);

if (!Mathf.Approximately(Value, Index))
{
return;
}

Value = Index;
IndexIsChanging = false;

RemoveAnimationTicker();
}
}
}
3 changes: 3 additions & 0 deletions Runtime/TabController.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions Runtime/Widgets/Tabs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
namespace UniMob.UI.Widgets
{
public class Tabs : MultiChildLayoutWidget
{
public Tabs(TabController tabController)
{
TabController = tabController;
}

public TabController TabController { get; }

public bool UseMask { get; set; } = true;

public override State CreateState() => new TabsState();
}

public class TabsState : MultiChildLayoutState<Tabs>, ITabsState
{
public override WidgetViewReference View { get; }
= WidgetViewReference.Resource("UniMob.Tabs");

public TabController TabController => Widget.TabController;
public bool UseMask => Widget.UseMask;

public override WidgetSize CalculateSize()
{
return WidgetSize.Stretched;
}
}
}
3 changes: 3 additions & 0 deletions Runtime/Widgets/Tabs.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading