fix vertical scrolling
This commit is contained in:
parent
843e0220c2
commit
8d093c5538
6 changed files with 47 additions and 19 deletions
|
@ -10,11 +10,12 @@ namespace KitsuneCafe.UI
|
||||||
public class DynamicLayout : ILayout
|
public class DynamicLayout : ILayout
|
||||||
{
|
{
|
||||||
public float DefaultItemSize { get; set; }
|
public float DefaultItemSize { get; set; }
|
||||||
public float GutterSize { get; set; }
|
public float GutterSize { get; set; } = 0;
|
||||||
public FlowDirection Direction { get; set; }
|
public FlowDirection Direction { get; set; } = FlowDirection.Vertical;
|
||||||
public float ContentSize { get; private set; }
|
public int Buffer { get; set; } = 0;
|
||||||
|
public bool Wrap { get; set; } = false;
|
||||||
public int Count { get; set; }
|
public int Count { get; set; }
|
||||||
public int Buffer { get; set; }
|
public float ContentSize { get; private set; }
|
||||||
|
|
||||||
private readonly List<float> positions = new();
|
private readonly List<float> positions = new();
|
||||||
private readonly List<float> sizes = new();
|
private readonly List<float> sizes = new();
|
||||||
|
@ -132,8 +133,10 @@ namespace KitsuneCafe.UI
|
||||||
}
|
}
|
||||||
|
|
||||||
count += halfBuffer;
|
count += halfBuffer;
|
||||||
|
var last = Math.Min(Count, first + count);
|
||||||
|
|
||||||
return new Range(first, Math.Min(Count, first + count));
|
Debug.Log($"{first}:{last}");
|
||||||
|
return new Range(first, last);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,14 +6,14 @@ namespace KitsuneCafe.UI
|
||||||
{
|
{
|
||||||
public class FixedLayout : ILayout
|
public class FixedLayout : ILayout
|
||||||
{
|
{
|
||||||
public FlowDirection Direction { get; set; }
|
public FlowDirection Direction { get; set; } = FlowDirection.Vertical;
|
||||||
public float ContentSize { get; private set; }
|
|
||||||
|
|
||||||
|
|
||||||
public float ItemSize { get; set; }
|
public float ItemSize { get; set; }
|
||||||
public float GutterSize { get; set; }
|
public float GutterSize { get; set; } = 0;
|
||||||
|
public int Buffer { get; set; } = 0;
|
||||||
|
public bool Wrap { get; set; } = false;
|
||||||
|
|
||||||
public int Count { get; set; }
|
public int Count { get; set; }
|
||||||
public int Buffer { get; set; }
|
public float ContentSize { get; private set; }
|
||||||
|
|
||||||
public FixedLayout(FlowDirection direction, float itemSize, float gutterSize)
|
public FixedLayout(FlowDirection direction, float itemSize, float gutterSize)
|
||||||
{
|
{
|
||||||
|
@ -43,10 +43,12 @@ namespace KitsuneCafe.UI
|
||||||
public Range GetVisibleRange(float offset, float containerSize)
|
public Range GetVisibleRange(float offset, float containerSize)
|
||||||
{
|
{
|
||||||
var size = ItemSize + GutterSize;
|
var size = ItemSize + GutterSize;
|
||||||
var first = Mathf.FloorToInt(offset / (ItemSize + GutterSize));
|
var halfBuffer = Mathf.CeilToInt(Buffer / 2);
|
||||||
var count = Mathf.CeilToInt(containerSize / size) + Buffer;
|
var first = Mathf.FloorToInt(offset / (ItemSize + GutterSize)) - halfBuffer;
|
||||||
|
var count = Mathf.CeilToInt(containerSize / size) + halfBuffer;
|
||||||
var last = Math.Min(Count, first + count);
|
var last = Math.Min(Count, first + count);
|
||||||
|
|
||||||
|
Debug.Log($"{first}:{last}");
|
||||||
return new Range(first, last);
|
return new Range(first, last);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEngine.UIElements;
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
namespace KitsuneCafe.UI
|
namespace KitsuneCafe.UI
|
||||||
|
|
|
@ -158,6 +158,29 @@ namespace KitsuneCafe.UI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool wrap = false;
|
||||||
|
|
||||||
|
[UxmlAttribute, CreateProperty]
|
||||||
|
public bool Wrap
|
||||||
|
{
|
||||||
|
get => wrap;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (wrap != value)
|
||||||
|
{
|
||||||
|
wrap = value;
|
||||||
|
if (virtualizationController.Layout is FixedLayout fixedLayout)
|
||||||
|
{
|
||||||
|
fixedLayout.Wrap = wrap;
|
||||||
|
}
|
||||||
|
else if (virtualizationController.Layout is DynamicLayout dynamicLayout)
|
||||||
|
{
|
||||||
|
dynamicLayout.Wrap = wrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
[CreateProperty]
|
[CreateProperty]
|
||||||
public ICollectionDataSource DataSource
|
public ICollectionDataSource DataSource
|
||||||
|
@ -197,6 +220,8 @@ namespace KitsuneCafe.UI
|
||||||
|
|
||||||
private ILayout CreateLayout()
|
private ILayout CreateLayout()
|
||||||
{
|
{
|
||||||
|
UpdateDirection();
|
||||||
|
|
||||||
return isDynamicSize switch
|
return isDynamicSize switch
|
||||||
{
|
{
|
||||||
true => new DynamicLayout(Direction, itemSize) { Buffer = bufferCount, GutterSize = gutter },
|
true => new DynamicLayout(Direction, itemSize) { Buffer = bufferCount, GutterSize = gutter },
|
||||||
|
@ -211,17 +236,15 @@ namespace KitsuneCafe.UI
|
||||||
{
|
{
|
||||||
case FlowDirection.Vertical:
|
case FlowDirection.Vertical:
|
||||||
scrollView.mode = ScrollViewMode.Vertical;
|
scrollView.mode = ScrollViewMode.Vertical;
|
||||||
scrollView.verticalScrollerVisibility = ScrollerVisibility.Auto;
|
|
||||||
scrollView.horizontalScrollerVisibility = ScrollerVisibility.Hidden;
|
|
||||||
scrollView.horizontalScroller.valueChanged -= virtualizationController.OnScrolled;
|
scrollView.horizontalScroller.valueChanged -= virtualizationController.OnScrolled;
|
||||||
scrollView.verticalScroller.valueChanged += virtualizationController.OnScrolled;
|
scrollView.verticalScroller.valueChanged += virtualizationController.OnScrolled;
|
||||||
|
Debug.Log("vertical");
|
||||||
break;
|
break;
|
||||||
case FlowDirection.Horizontal:
|
case FlowDirection.Horizontal:
|
||||||
scrollView.mode = ScrollViewMode.Horizontal;
|
scrollView.mode = ScrollViewMode.Horizontal;
|
||||||
scrollView.verticalScrollerVisibility = ScrollerVisibility.Hidden;
|
|
||||||
scrollView.horizontalScrollerVisibility = ScrollerVisibility.Auto;
|
|
||||||
scrollView.verticalScroller.valueChanged -= virtualizationController.OnScrolled;
|
scrollView.verticalScroller.valueChanged -= virtualizationController.OnScrolled;
|
||||||
scrollView.horizontalScroller.valueChanged += virtualizationController.OnScrolled;
|
scrollView.horizontalScroller.valueChanged += virtualizationController.OnScrolled;
|
||||||
|
Debug.Log("horizontal");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,6 +106,7 @@ namespace KitsuneCafe.UI
|
||||||
|
|
||||||
public void OnScrolled(float scrollOffset)
|
public void OnScrolled(float scrollOffset)
|
||||||
{
|
{
|
||||||
|
Debug.Log("scrolling");
|
||||||
lastKnownScrollOffset = scrollOffset;
|
lastKnownScrollOffset = scrollOffset;
|
||||||
ScheduleUpdate();
|
ScheduleUpdate();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
<ui:UXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" noNamespaceSchemaLocation="../../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
|
<ui:UXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" noNamespaceSchemaLocation="../../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
|
||||||
<KitsuneCafe.UI.RecycleView name="recycle-view" direction="Horizontal" a="Stupid" is-dynamic-size="true" default-item-size="50" fixed-item-size="22" gutter="0" style="flex-grow: 1; flex-direction: row;" />
|
<KitsuneCafe.UI.RecycleView name="recycle-view" a="Stupid" is-dynamic-size="true" default-item-size="50" fixed-item-size="22" gutter="0" direction="Horizontal" style="flex-grow: 1; flex-direction: row;" />
|
||||||
</ui:UXML>
|
</ui:UXML>
|
||||||
|
|
Loading…
Add table
Reference in a new issue