[Opt] 统一ScrollBar显示

This commit is contained in:
陈思海 2026-04-29 19:03:59 +08:00
parent 0482f505a6
commit 255892dd5f
3 changed files with 41 additions and 31 deletions

View File

@ -56,8 +56,7 @@ namespace AlicizaX.UI.Editor
#region Serialized Properties - Templates & Scrollbar #region Serialized Properties - Templates & Scrollbar
private SerializedProperty _templates; private SerializedProperty _templates;
private SerializedProperty _showScrollBar; private SerializedProperty _scrollbarVisibility;
private SerializedProperty _showScrollBarOnlyWhenScrollable;
private SerializedProperty _scrollbar; private SerializedProperty _scrollbar;
#endregion #endregion
@ -110,8 +109,7 @@ namespace AlicizaX.UI.Editor
private void InitializeTemplateProperties() private void InitializeTemplateProperties()
{ {
_templates = serializedObject.FindProperty("templates"); _templates = serializedObject.FindProperty("templates");
_showScrollBar = serializedObject.FindProperty("showScrollBar"); _scrollbarVisibility = serializedObject.FindProperty("scrollbarVisibility");
_showScrollBarOnlyWhenScrollable = serializedObject.FindProperty("showScrollBarOnlyWhenScrollable");
_scrollbar = serializedObject.FindProperty("scrollbar"); _scrollbar = serializedObject.FindProperty("scrollbar");
} }
@ -354,19 +352,13 @@ namespace AlicizaX.UI.Editor
{ {
using (new EditorGUI.DisabledScope(isPlaying)) using (new EditorGUI.DisabledScope(isPlaying))
{ {
bool previousShowScrollBarValue = _showScrollBar.boolValue; ScrollbarVisibility previousVisibility = (ScrollbarVisibility)_scrollbarVisibility.enumValueIndex;
EditorGUILayout.PropertyField(_showScrollBar); EditorGUILayout.PropertyField(_scrollbarVisibility, new GUIContent("Scrollbar Visibility"));
ScrollbarVisibility currentVisibility = (ScrollbarVisibility)_scrollbarVisibility.enumValueIndex;
if (_showScrollBar.boolValue != previousShowScrollBarValue) if (currentVisibility != previousVisibility)
{ {
HandleScrollBarToggle(); HandleScrollBarVisibilityChange(previousVisibility, currentVisibility);
}
if (_showScrollBar.boolValue)
{
EditorGUILayout.PropertyField(
_showScrollBarOnlyWhenScrollable,
new GUIContent("Only When Scrollable", "Hide the scrollbar and disable list scrolling when content does not overflow the viewport."));
} }
} }
} }
@ -535,22 +527,24 @@ namespace AlicizaX.UI.Editor
#region Scrollbar Handling #region Scrollbar Handling
private void HandleScrollBarToggle() private void HandleScrollBarVisibilityChange(ScrollbarVisibility previousVisibility, ScrollbarVisibility currentVisibility)
{ {
if (_showScrollBar.boolValue) if (currentVisibility == ScrollbarVisibility.AlwaysHide)
{
CreateScrollBar();
}
else
{ {
ClearScrollBar(); ClearScrollBar();
} }
if (previousVisibility == ScrollbarVisibility.AlwaysHide)
{
CreateScrollBar();
}
} }
private void CreateScrollBar() private void CreateScrollBar()
{ {
var recyclerView = target as RecyclerView; var recyclerView = target as RecyclerView;
if (recyclerView == null) return; if (recyclerView == null) return;
if (_scrollbar.objectReferenceValue != null) return;
Direction direction = (Direction)_direction.enumValueIndex; Direction direction = (Direction)_direction.enumValueIndex;
string prefabPath = GetScrollbarPrefabPath(direction); string prefabPath = GetScrollbarPrefabPath(direction);
@ -589,7 +583,7 @@ namespace AlicizaX.UI.Editor
private void ClearScrollBar() private void ClearScrollBar()
{ {
_showScrollBar.boolValue = false; _scrollbarVisibility.enumValueIndex = (int)ScrollbarVisibility.AlwaysHide;
if (_scrollbar.objectReferenceValue != null) if (_scrollbar.objectReferenceValue != null)
{ {

View File

@ -229,4 +229,11 @@ namespace AlicizaX.UI
Center, Center,
Top Top
} }
public enum ScrollbarVisibility
{
AlwaysHide = 0,
AlwaysShow = 1,
WhenScrollable = 2
}
} }

View File

@ -87,12 +87,11 @@ namespace AlicizaX.UI
/// <summary> /// <summary>
/// 是否显示滚动条<E58AA8>? /// 是否显示滚动条<E58AA8>?
/// </summary> /// </summary>
[HideInInspector] [SerializeField] private bool showScrollBar; [HideInInspector] [SerializeField] private ScrollbarVisibility scrollbarVisibility;
/// <summary> /// <summary>
/// 是否仅在内容可滚动时显示滚动条<E58AA8>? /// 是否仅在内容可滚动时显示滚动条<E58AA8>?
/// </summary> /// </summary>
[HideInInspector] [SerializeField] private bool showScrollBarOnlyWhenScrollable;
/// <summary> /// <summary>
/// 与当前列表关联的滚动条组件<E7BB84>? /// 与当前列表关联的滚动条组件<E7BB84>?
@ -302,13 +301,13 @@ namespace AlicizaX.UI
/// <summary> /// <summary>
/// 获取或设置是否仅在内容可滚动时显示滚动条<E58AA8>? /// 获取或设置是否仅在内容可滚动时显示滚动条<E58AA8>?
/// </summary> /// </summary>
public bool ShowScrollBarOnlyWhenScrollable public ScrollbarVisibility ScrollbarVisibility
{ {
get => showScrollBarOnlyWhenScrollable; get => scrollbarVisibility;
set set
{ {
if (showScrollBarOnlyWhenScrollable == value) return; if (scrollbarVisibility == value) return;
showScrollBarOnlyWhenScrollable = value; scrollbarVisibility = value;
RequestLayout(); RequestLayout();
} }
} }
@ -688,7 +687,7 @@ namespace AlicizaX.UI
/// </summary> /// </summary>
private void ConfigureScrollbar() private void ConfigureScrollbar()
{ {
if (!showScrollBar || scrollbar == null) return; if (scrollbarVisibility == ScrollbarVisibility.AlwaysHide || scrollbar == null) return;
scrollbar.onValueChanged.AddListener(OnScrollbarChanged); scrollbar.onValueChanged.AddListener(OnScrollbarChanged);
@ -1428,7 +1427,17 @@ namespace AlicizaX.UI
/// <returns>应显示滚动条时返<E697B6>?<see langword="true"/>否则返<E58899>?<see langword="false"/><3E>?/returns> /// <returns>应显示滚动条时返<E697B6>?<see langword="true"/>否则返<E58899>?<see langword="false"/><3E>?/returns>
private bool ShouldShowScrollbar() private bool ShouldShowScrollbar()
{ {
if (!showScrollBar || !scroll || scrollbar == null || scroller == null || layoutManager == null || !SupportsOverflowCheck()) if (scrollbarVisibility == ScrollbarVisibility.AlwaysHide || !scroll || scrollbar == null || scroller == null || layoutManager == null)
{
return false;
}
if (scrollbarVisibility == ScrollbarVisibility.AlwaysShow)
{
return true;
}
if (!SupportsOverflowCheck())
{ {
return false; return false;
} }
@ -1533,7 +1542,7 @@ namespace AlicizaX.UI
/// <returns>需要仅在内容溢出时启用滚动返回 <see langword="true"/>否则返<E58899>?<see langword="false"/><3E>?/returns> /// <returns>需要仅在内容溢出时启用滚动返回 <see langword="true"/>否则返<E58899>?<see langword="false"/><3E>?/returns>
private bool ShouldLimitScrollToOverflow() private bool ShouldLimitScrollToOverflow()
{ {
return showScrollBar && showScrollBarOnlyWhenScrollable && SupportsOverflowCheck(); return scrollbarVisibility == ScrollbarVisibility.WhenScrollable && SupportsOverflowCheck();
} }
/// <summary> /// <summary>