UTKProperyItem 수정 중
This commit is contained in:
@@ -166,10 +166,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -255,6 +265,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -120,10 +120,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -167,6 +177,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<bool>>(OnRadioValueChanged);
|
||||
}
|
||||
|
||||
@@ -143,10 +143,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -219,6 +229,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<bool>>(OnToggleValueChanged);
|
||||
UnregisterCallback<MouseDownEvent>(OnMouseDown, TrickleDown.TrickleDown);
|
||||
|
||||
@@ -104,10 +104,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -156,6 +166,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnSelectionChanged = null;
|
||||
UnregisterCallback<ChangeEvent<ToggleButtonGroupState>>(OnValueChanged);
|
||||
}
|
||||
|
||||
@@ -277,10 +277,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -412,6 +422,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnClicked = null;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -132,10 +132,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -158,6 +168,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<bool>>(OnFoldoutValueChanged);
|
||||
}
|
||||
|
||||
@@ -226,10 +226,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -245,6 +255,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -230,10 +230,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -484,6 +494,8 @@ namespace UVC.UIToolkit
|
||||
CleanupExternalTexture();
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnImageLoaded = null;
|
||||
OnImageFailed = null;
|
||||
}
|
||||
|
||||
@@ -112,10 +112,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -131,6 +141,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -293,10 +293,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -568,6 +578,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnSelectionChanged = null;
|
||||
|
||||
_inputContainer?.UnregisterCallback<ClickEvent>(OnInputClicked);
|
||||
|
||||
@@ -273,10 +273,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -527,6 +537,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
|
||||
_inputContainer?.UnregisterCallback<ClickEvent>(OnInputClicked);
|
||||
|
||||
@@ -287,10 +287,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -596,6 +606,8 @@ namespace UVC.UIToolkit
|
||||
ClearCheckBoxes();
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnSelectionChanged = null;
|
||||
|
||||
_inputContainer?.UnregisterCallback<ClickEvent>(OnInputClicked);
|
||||
|
||||
@@ -243,10 +243,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -302,6 +312,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<Bounds>>(OnFieldValueChanged);
|
||||
}
|
||||
|
||||
@@ -138,10 +138,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -164,6 +174,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<double>>(OnFieldValueChanged);
|
||||
}
|
||||
|
||||
@@ -137,10 +137,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -163,6 +173,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<float>>(OnFieldValueChanged);
|
||||
}
|
||||
|
||||
@@ -208,12 +208,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
// 패널에서 분리될 때 이벤트 구독 해제
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -454,6 +462,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
// 이벤트 콜백 해제
|
||||
_upButton?.UnregisterCallback<ClickEvent>(OnUpButtonClick);
|
||||
|
||||
@@ -224,10 +224,21 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
// 패널에 다시 붙을 때 현재 테마 재적용
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -304,6 +315,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
UnregisterCallback<ChangeEvent<string>>(OnTextValueChanged);
|
||||
OnValueChanged = null;
|
||||
OnFocused = null;
|
||||
|
||||
@@ -209,12 +209,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
// 패널에서 분리될 때 이벤트 구독 해제
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -455,6 +463,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
// 이벤트 콜백 해제
|
||||
_upButton?.UnregisterCallback<ClickEvent>(OnUpButtonClick);
|
||||
|
||||
@@ -136,10 +136,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -162,6 +172,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<int>>(OnFieldValueChanged);
|
||||
}
|
||||
|
||||
@@ -130,10 +130,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -156,6 +166,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<long>>(OnFieldValueChanged);
|
||||
}
|
||||
|
||||
@@ -226,10 +226,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -275,6 +285,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<Rect>>(OnFieldValueChanged);
|
||||
}
|
||||
|
||||
@@ -203,10 +203,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -250,6 +260,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<Vector2>>(OnFieldValueChanged);
|
||||
}
|
||||
|
||||
@@ -222,10 +222,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -270,6 +280,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<Vector3>>(OnFieldValueChanged);
|
||||
}
|
||||
|
||||
@@ -232,10 +232,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -281,6 +291,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<Vector4>>(OnFieldValueChanged);
|
||||
}
|
||||
|
||||
@@ -1666,10 +1666,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -1688,6 +1698,8 @@ namespace UVC.UIToolkit
|
||||
|
||||
// 테마 변경 이벤트 해제
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
// 이미지 로딩 취소
|
||||
CancelImageLoading();
|
||||
|
||||
@@ -1675,10 +1675,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -1699,6 +1709,8 @@ namespace UVC.UIToolkit
|
||||
|
||||
// 테마 변경 이벤트 해제
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
// 검색 필드 이벤트 해제
|
||||
if (_searchField != null)
|
||||
|
||||
@@ -1243,10 +1243,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -1268,6 +1278,8 @@ namespace UVC.UIToolkit
|
||||
|
||||
// 테마 변경 이벤트 해제
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
// 이미지 로딩 취소
|
||||
CancelImageLoading();
|
||||
|
||||
@@ -164,10 +164,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -197,6 +207,8 @@ namespace UVC.UIToolkit
|
||||
selectionChanged -= OnSelectionChanged;
|
||||
itemsChosen -= OnItemsChosen;
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnItemSelected = null;
|
||||
OnItemDoubleClicked = null;
|
||||
}
|
||||
|
||||
@@ -60,10 +60,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -93,6 +103,8 @@ namespace UVC.UIToolkit
|
||||
selectionChanged -= OnSelectionChanged;
|
||||
itemsChosen -= OnItemsChosen;
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnItemSelected = null;
|
||||
OnItemDoubleClicked = null;
|
||||
}
|
||||
|
||||
@@ -60,10 +60,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -93,6 +103,8 @@ namespace UVC.UIToolkit
|
||||
selectionChanged -= OnSelectionChanged;
|
||||
itemsChosen -= OnItemsChosen;
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnItemSelected = null;
|
||||
OnItemDoubleClicked = null;
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ namespace UVC.UIToolkit
|
||||
#region Constants
|
||||
private const string UXML_PATH = "UIToolkit/List/UTKPropertyList";
|
||||
private const string USS_PATH = "UIToolkit/List/UTKPropertyListUss";
|
||||
private const string GROUP_HEADER_UXML_PATH = "UIToolkit/List/UTKPropertyGroupHeader";
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
@@ -53,6 +54,8 @@ namespace UVC.UIToolkit
|
||||
|
||||
private int _nextTreeViewId = 1;
|
||||
private string _searchText = string.Empty;
|
||||
|
||||
private static VisualTreeAsset? _groupHeaderUxmlCache;
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
@@ -172,10 +175,19 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanel);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
|
||||
}
|
||||
|
||||
private void OnAttachToPanel(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnDetachFromPanel(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -234,12 +246,20 @@ namespace UVC.UIToolkit
|
||||
#endregion
|
||||
|
||||
#region Public Methods - Group Management
|
||||
/// <summary>
|
||||
/// 그룹을 추가하고 TreeView를 갱신합니다.
|
||||
/// </summary>
|
||||
/// <param name="group">추가할 속성 그룹.</param>
|
||||
public void AddGroup(IUTKPropertyGroup group)
|
||||
{
|
||||
AddGroupInternal(group);
|
||||
RefreshTreeView();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 지정한 ID의 그룹과 그룹 내 모든 아이템을 제거합니다.
|
||||
/// </summary>
|
||||
/// <param name="groupId">제거할 그룹 ID.</param>
|
||||
public void RemoveGroup(string groupId)
|
||||
{
|
||||
if (_groupIndex.TryGetValue(groupId, out var group))
|
||||
@@ -259,11 +279,21 @@ namespace UVC.UIToolkit
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 지정한 ID의 그룹을 반환합니다.
|
||||
/// </summary>
|
||||
/// <param name="groupId">조회할 그룹 ID.</param>
|
||||
/// <returns>그룹 인스턴스 또는 null.</returns>
|
||||
public IUTKPropertyGroup? GetGroup(string groupId)
|
||||
{
|
||||
return _groupIndex.TryGetValue(groupId, out var group) ? group : null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 그룹의 펼침/접힘 상태를 설정합니다.
|
||||
/// </summary>
|
||||
/// <param name="groupId">대상 그룹 ID.</param>
|
||||
/// <param name="expanded">true면 펼침, false면 접힘.</param>
|
||||
public void SetGroupExpanded(string groupId, bool expanded)
|
||||
{
|
||||
if (_groupIndex.TryGetValue(groupId, out var group))
|
||||
@@ -280,6 +310,10 @@ namespace UVC.UIToolkit
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 그룹의 펼침/접힘 상태를 토글합니다.
|
||||
/// </summary>
|
||||
/// <param name="groupId">대상 그룹 ID.</param>
|
||||
public void ToggleGroupExpanded(string groupId)
|
||||
{
|
||||
if (_groupIndex.TryGetValue(groupId, out var group))
|
||||
@@ -290,12 +324,21 @@ namespace UVC.UIToolkit
|
||||
#endregion
|
||||
|
||||
#region Public Methods - Property Management
|
||||
/// <summary>
|
||||
/// 최상위 속성 아이템을 추가하고 TreeView를 갱신합니다.
|
||||
/// </summary>
|
||||
/// <param name="item">추가할 속성 아이템.</param>
|
||||
public void AddProperty(IUTKPropertyItem item)
|
||||
{
|
||||
AddPropertyInternal(item);
|
||||
RefreshTreeView();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 지정한 그룹에 속성 아이템을 추가하고 TreeView를 갱신합니다.
|
||||
/// </summary>
|
||||
/// <param name="groupId">대상 그룹 ID.</param>
|
||||
/// <param name="item">추가할 속성 아이템.</param>
|
||||
public void AddPropertyToGroup(string groupId, IUTKPropertyItem item)
|
||||
{
|
||||
if (_groupIndex.TryGetValue(groupId, out var group))
|
||||
@@ -307,6 +350,11 @@ namespace UVC.UIToolkit
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 지정한 ID의 속성 아이템을 제거하고 TreeView를 갱신합니다.
|
||||
/// 그룹에 속한 아이템이면 그룹에서도 제거됩니다.
|
||||
/// </summary>
|
||||
/// <param name="itemId">제거할 아이템 ID.</param>
|
||||
public void RemoveProperty(string itemId)
|
||||
{
|
||||
if (_itemIndex.TryGetValue(itemId, out var item))
|
||||
@@ -328,6 +376,11 @@ namespace UVC.UIToolkit
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 지정한 ID의 속성 아이템을 반환합니다.
|
||||
/// </summary>
|
||||
/// <param name="itemId">조회할 아이템 ID.</param>
|
||||
/// <returns>아이템 인스턴스 또는 null.</returns>
|
||||
public IUTKPropertyItem? GetProperty(string itemId)
|
||||
{
|
||||
return _itemIndex.TryGetValue(itemId, out var item) ? item : null;
|
||||
@@ -335,37 +388,85 @@ namespace UVC.UIToolkit
|
||||
#endregion
|
||||
|
||||
#region Public Methods - Value Management
|
||||
public void UpdatePropertyValue(string propertyId, object newValue)
|
||||
/// <summary>
|
||||
/// 속성 값을 변경합니다. 바인딩된 View에 OnTypedValueChanged 이벤트로 자동 반영됩니다.
|
||||
/// </summary>
|
||||
/// <param name="propertyId">대상 속성 ID.</param>
|
||||
/// <param name="newValue">새 값 (타입 변환 자동 시도).</param>
|
||||
/// <param name="notify">true면 값 변경 알림 이벤트 발생.</param>
|
||||
public void UpdatePropertyValue(string propertyId, object newValue, bool notify = false)
|
||||
{
|
||||
if (_itemIndex.TryGetValue(propertyId, out var item))
|
||||
{
|
||||
item.SetValue(newValue);
|
||||
item.SetValue(newValue, notify);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetPropertyValue(string propertyId, object value)
|
||||
/// <summary>
|
||||
/// 속성 값을 변경합니다. <see cref="UpdatePropertyValue"/>의 별칭입니다.
|
||||
/// </summary>
|
||||
/// <param name="propertyId">대상 속성 ID.</param>
|
||||
/// <param name="value">새 값.</param>
|
||||
/// <param name="notify">true면 값 변경 알림 이벤트 발생.</param>
|
||||
public void SetPropertyValue(string propertyId, object value, bool notify = false)
|
||||
{
|
||||
UpdatePropertyValue(propertyId, value);
|
||||
UpdatePropertyValue(propertyId, value, notify);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Public Methods - Visibility & ReadOnly
|
||||
/// <summary>
|
||||
/// 속성 아이템의 가시성을 변경합니다. TreeView 항목이 추가/제거되므로 Rebuild가 발생합니다.
|
||||
/// </summary>
|
||||
/// <param name="propertyId">대상 속성 ID.</param>
|
||||
/// <param name="visible">true면 표시, false면 숨김.</param>
|
||||
public void SetPropertyVisibility(string propertyId, bool visible)
|
||||
{
|
||||
if (_itemIndex.TryGetValue(propertyId, out var item))
|
||||
{
|
||||
if (item.IsVisible == visible) return;
|
||||
item.IsVisible = visible;
|
||||
RefreshTreeViewLight();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>여러 속성의 가시성을 일괄 변경합니다. TreeView는 마지막에 한 번만 갱신됩니다.</summary>
|
||||
public void SetPropertyVisibilityBatch(IEnumerable<(string propertyId, bool visible)> changes)
|
||||
{
|
||||
bool changed = false;
|
||||
foreach (var (propertyId, visible) in changes)
|
||||
{
|
||||
if (_itemIndex.TryGetValue(propertyId, out var item) && item.IsVisible != visible)
|
||||
{
|
||||
item.IsVisible = visible;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (changed) RefreshTreeViewLight();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 그룹의 가시성을 변경합니다. TreeView 항목이 추가/제거되므로 Rebuild가 발생합니다.
|
||||
/// </summary>
|
||||
/// <param name="groupId">대상 그룹 ID.</param>
|
||||
/// <param name="visible">true면 표시, false면 숨김.</param>
|
||||
public void SetGroupVisibility(string groupId, bool visible)
|
||||
{
|
||||
if (_groupIndex.TryGetValue(groupId, out var group))
|
||||
{
|
||||
if (group.IsVisible == visible) return;
|
||||
group.IsVisible = visible;
|
||||
RefreshTreeViewLight();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 속성 아이템의 읽기 전용 상태를 변경합니다.
|
||||
/// OnStateChanged 이벤트를 통해 바인딩된 View에 자동 반영됩니다.
|
||||
/// </summary>
|
||||
/// <param name="propertyId">대상 속성 ID.</param>
|
||||
/// <param name="isReadOnly">true면 읽기 전용.</param>
|
||||
public void SetPropertyReadOnly(string propertyId, bool isReadOnly)
|
||||
{
|
||||
if (_itemIndex.TryGetValue(propertyId, out var item))
|
||||
@@ -374,6 +475,12 @@ namespace UVC.UIToolkit
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 그룹 내 모든 아이템의 읽기 전용 상태를 일괄 변경합니다.
|
||||
/// OnStateChanged 이벤트를 통해 바인딩된 View에 자동 반영됩니다.
|
||||
/// </summary>
|
||||
/// <param name="groupId">대상 그룹 ID.</param>
|
||||
/// <param name="isReadOnly">true면 읽기 전용.</param>
|
||||
public void SetGroupReadOnly(string groupId, bool isReadOnly)
|
||||
{
|
||||
if (_groupIndex.TryGetValue(groupId, out var group))
|
||||
@@ -381,25 +488,48 @@ namespace UVC.UIToolkit
|
||||
group.SetAllItemsReadOnly(isReadOnly);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 속성 아이템의 라벨 표시 여부를 변경합니다.
|
||||
/// OnStateChanged 이벤트를 통해 바인딩된 View에 자동 반영됩니다.
|
||||
/// </summary>
|
||||
/// <param name="propertyId">대상 속성 ID.</param>
|
||||
/// <param name="showLabel">true면 라벨 표시, false면 값이 전체 너비 사용.</param>
|
||||
public void SetPropertyShowLabel(string propertyId, bool showLabel)
|
||||
{
|
||||
if (_itemIndex.TryGetValue(propertyId, out var item))
|
||||
{
|
||||
item.ShowLabel = showLabel;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Public Methods - Utilities
|
||||
public void Clear()
|
||||
/// <summary>
|
||||
/// 모든 엔트리(그룹 + 아이템)를 제거하고 TreeView를 초기화합니다.
|
||||
/// VisualElement.Clear()를 숨깁니다(new).
|
||||
/// </summary>
|
||||
public new void Clear()
|
||||
{
|
||||
ClearInternal();
|
||||
RefreshTreeView();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 현재 데이터를 기반으로 TreeView를 다시 빌드합니다.
|
||||
/// </summary>
|
||||
public void Refresh()
|
||||
{
|
||||
RefreshTreeView();
|
||||
}
|
||||
|
||||
/// <summary>리스트를 표시합니다.</summary>
|
||||
public void Show()
|
||||
{
|
||||
style.display = DisplayStyle.Flex;
|
||||
}
|
||||
|
||||
/// <summary>리스트를 숨깁니다.</summary>
|
||||
public void Hide()
|
||||
{
|
||||
style.display = DisplayStyle.None;
|
||||
@@ -448,7 +578,10 @@ namespace UVC.UIToolkit
|
||||
|
||||
private void ClearInternal()
|
||||
{
|
||||
// 이벤트 구독 해제
|
||||
// TreeView 내 바인딩된 View의 이벤트 콜백 정리 및 Dispose
|
||||
CleanupAllTreeViewContainers();
|
||||
|
||||
// 데이터 이벤트 구독 해제
|
||||
foreach (var group in _groupIndex.Values)
|
||||
{
|
||||
UnsubscribeGroup(group);
|
||||
@@ -466,6 +599,19 @@ namespace UVC.UIToolkit
|
||||
_nextTreeViewId = 1;
|
||||
}
|
||||
|
||||
/// <summary>TreeView 내 모든 컨테이너의 콜백과 View를 정리합니다.</summary>
|
||||
private void CleanupAllTreeViewContainers()
|
||||
{
|
||||
if (_treeView == null) return;
|
||||
|
||||
_treeView.Query<VisualElement>(className: "utk-property-item-container")
|
||||
.ForEach(container =>
|
||||
{
|
||||
CleanupContainerCallbacks(container);
|
||||
DisposeChildren(container);
|
||||
});
|
||||
}
|
||||
|
||||
private void RefreshTreeView()
|
||||
{
|
||||
if (_treeView == null) return;
|
||||
@@ -474,7 +620,29 @@ namespace UVC.UIToolkit
|
||||
_treeView.SetRootItems(treeItems);
|
||||
_treeView.Rebuild();
|
||||
|
||||
// 펼침 상태 복원
|
||||
RestoreExpandedStates();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 경량 TreeView 갱신. 아이템 구조(Visibility 변경 등)만 바뀔 때 사용합니다.
|
||||
/// Rebuild() 대신 RefreshItems()를 사용하여 기존 컨테이너를 재활용합니다.
|
||||
/// </summary>
|
||||
private void RefreshTreeViewLight()
|
||||
{
|
||||
if (_treeView == null) return;
|
||||
|
||||
var treeItems = BuildTreeItems();
|
||||
_treeView.SetRootItems(treeItems);
|
||||
_treeView.RefreshItems();
|
||||
|
||||
RestoreExpandedStates();
|
||||
}
|
||||
|
||||
/// <summary>그룹 펼침 상태를 복원합니다.</summary>
|
||||
private void RestoreExpandedStates()
|
||||
{
|
||||
if (_treeView == null) return;
|
||||
|
||||
foreach (var group in _groupIndex.Values)
|
||||
{
|
||||
if (group.IsExpanded)
|
||||
@@ -545,6 +713,19 @@ namespace UVC.UIToolkit
|
||||
#endregion
|
||||
|
||||
#region TreeView Callbacks
|
||||
|
||||
/// <summary>
|
||||
/// 컨테이너에 등록된 이벤트 콜백 정보를 보관합니다.
|
||||
/// View 재사용 시 이전 이벤트를 정리하기 위해 사용합니다.
|
||||
/// </summary>
|
||||
private sealed class ContainerCallbackInfo
|
||||
{
|
||||
public VisualElement? ItemView;
|
||||
public EventCallback<ClickEvent>? ClickCallback;
|
||||
public Action<string>? ButtonClickHandler;
|
||||
public Action<string>? ActionButtonClickHandler;
|
||||
}
|
||||
|
||||
private VisualElement MakeItem()
|
||||
{
|
||||
var container = new VisualElement();
|
||||
@@ -557,6 +738,15 @@ namespace UVC.UIToolkit
|
||||
var itemData = _treeView?.GetItemDataForIndex<IUTKPropertyEntry>(index);
|
||||
if (itemData == null) return;
|
||||
|
||||
// 기존 자식 View 재사용 시도
|
||||
if (itemData is IUTKPropertyItem item && TryRebindExistingView(element, item))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// 재사용 불가 시 기존 View 정리 후 새로 생성
|
||||
CleanupContainerCallbacks(element);
|
||||
DisposeChildren(element);
|
||||
element.Clear();
|
||||
|
||||
switch (itemData)
|
||||
@@ -564,55 +754,146 @@ namespace UVC.UIToolkit
|
||||
case IUTKPropertyGroup group:
|
||||
BindGroupItem(element, group);
|
||||
break;
|
||||
case IUTKPropertyItem item:
|
||||
BindPropertyItem(element, item);
|
||||
case IUTKPropertyItem newItem:
|
||||
BindPropertyItem(element, newItem);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void UnbindItem(VisualElement element, int index)
|
||||
{
|
||||
// View에서 직접 Unbind 처리 (IUTKPropertyItemView 구현체인 경우)
|
||||
// Unbind만 수행 (View 인스턴스는 유지하여 재사용 가능)
|
||||
foreach (var child in element.Children())
|
||||
{
|
||||
if (child is IUTKPropertyItemView view)
|
||||
{
|
||||
view.Unbind();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// IDisposable 구현체인 경우 Dispose 호출
|
||||
/// <summary>
|
||||
/// 기존 자식 View가 동일 PropertyType이면 Unbind → Bind로 재사용합니다.
|
||||
/// 이전 이벤트 콜백을 정리하고 새 item으로 재등록합니다.
|
||||
/// </summary>
|
||||
/// <returns>재사용 성공 시 true</returns>
|
||||
private bool TryRebindExistingView(VisualElement container, IUTKPropertyItem item)
|
||||
{
|
||||
if (container.childCount != 1) return false;
|
||||
|
||||
var existingChild = container[0];
|
||||
if (existingChild is not IUTKPropertyItemView existingView) return false;
|
||||
|
||||
// 같은 PropertyType인지 확인
|
||||
var expectedViewType = UTKPropertyItemViewFactory.GetViewType(item);
|
||||
if (existingChild.GetType() != expectedViewType) return false;
|
||||
|
||||
// 이전 이벤트 콜백 정리
|
||||
CleanupContainerCallbacks(container);
|
||||
|
||||
// Unbind → Bind (View 인스턴스 재사용)
|
||||
existingView.Unbind();
|
||||
existingView.Bind(item);
|
||||
|
||||
// 새 item에 대한 이벤트 콜백 재등록
|
||||
RegisterPropertyCallbacks(container, existingChild, item);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 컨테이너에 저장된 이벤트 콜백을 해제합니다.
|
||||
/// </summary>
|
||||
private static void CleanupContainerCallbacks(VisualElement container)
|
||||
{
|
||||
if (container.userData is not ContainerCallbackInfo info) return;
|
||||
|
||||
if (info.ItemView != null && info.ClickCallback != null)
|
||||
{
|
||||
info.ItemView.UnregisterCallback(info.ClickCallback);
|
||||
}
|
||||
|
||||
if (info.ButtonClickHandler != null && info.ItemView is UTKButtonItemView btnView)
|
||||
{
|
||||
btnView.OnButtonClicked -= info.ButtonClickHandler;
|
||||
}
|
||||
|
||||
if (info.ActionButtonClickHandler != null && info.ItemView is UTKStringPropertyItemView strView)
|
||||
{
|
||||
strView.OnActionButtonClicked -= info.ActionButtonClickHandler;
|
||||
}
|
||||
|
||||
container.userData = null;
|
||||
}
|
||||
|
||||
/// <summary>자식 View를 Dispose합니다.</summary>
|
||||
private static void DisposeChildren(VisualElement element)
|
||||
{
|
||||
foreach (var child in element.Children())
|
||||
{
|
||||
if (child is IUTKPropertyItemView view)
|
||||
{
|
||||
view.Unbind();
|
||||
}
|
||||
if (child is IDisposable disposable)
|
||||
{
|
||||
disposable.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
element.Clear();
|
||||
}
|
||||
|
||||
private void BindGroupItem(VisualElement container, IUTKPropertyGroup group)
|
||||
{
|
||||
var groupElement = new VisualElement();
|
||||
groupElement.AddToClassList("utk-property-group__header");
|
||||
// UXML 로드 (캐시)
|
||||
if (_groupHeaderUxmlCache == null)
|
||||
{
|
||||
_groupHeaderUxmlCache = Resources.Load<VisualTreeAsset>(GROUP_HEADER_UXML_PATH);
|
||||
}
|
||||
|
||||
var expandIcon = new UTKLabel(group.IsExpanded ? UTKMaterialIcons.ExpandMore : UTKMaterialIcons.ChevronRight, 16);
|
||||
expandIcon.AddToClassList("utk-property-group__expand-icon");
|
||||
VisualElement groupElement;
|
||||
UTKLabel expandIcon;
|
||||
UTKLabel title;
|
||||
// UTKLabel count;
|
||||
|
||||
var title = new UTKLabel(group.GroupName, UTKLabel.LabelSize.Label1);
|
||||
if (_groupHeaderUxmlCache != null)
|
||||
{
|
||||
var root = _groupHeaderUxmlCache.Instantiate();
|
||||
groupElement = root.Q<VisualElement>("group-header");
|
||||
expandIcon = root.Q<UTKLabel>("expand-icon");
|
||||
title = root.Q<UTKLabel>("group-title");
|
||||
// count = root.Q<UTKLabel>("group-count");
|
||||
container.Add(root);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Fallback: UXML 로드 실패 시 코드로 생성
|
||||
groupElement = new VisualElement();
|
||||
groupElement.AddToClassList("utk-property-group__header");
|
||||
|
||||
expandIcon = new UTKLabel();
|
||||
expandIcon.AddToClassList("utk-property-group__expand-icon");
|
||||
|
||||
title = new UTKLabel();
|
||||
title.AddToClassList("utk-property-group__title");
|
||||
|
||||
// count = new UTKLabel();
|
||||
// count.AddToClassList("utk-property-group__count");
|
||||
|
||||
groupElement.Add(expandIcon);
|
||||
groupElement.Add(title);
|
||||
// groupElement.Add(count);
|
||||
container.Add(groupElement);
|
||||
}
|
||||
|
||||
// 데이터 바인딩
|
||||
expandIcon.SetMaterialIcon(group.IsExpanded ? UTKMaterialIcons.ExpandMore : UTKMaterialIcons.ChevronRight, 16);
|
||||
title.Text = group.GroupName;
|
||||
title.Size = UTKLabel.LabelSize.Label1;
|
||||
title.IsBold = true;
|
||||
title.AddToClassList("utk-property-group__title");
|
||||
// count.Text = $"({group.ItemCount})";
|
||||
// count.Variant = UTKLabel.LabelVariant.Secondary;
|
||||
|
||||
var count = new UTKLabel($"({group.ItemCount})", UTKLabel.LabelSize.Caption);
|
||||
count.Variant = UTKLabel.LabelVariant.Secondary;
|
||||
count.AddToClassList("utk-property-group__count");
|
||||
|
||||
groupElement.Add(expandIcon);
|
||||
groupElement.Add(title);
|
||||
groupElement.Add(count);
|
||||
|
||||
// 그룹 클릭 이벤트 - DetachFromPanelEvent에서 자동 정리됨
|
||||
EventCallback<ClickEvent> clickCallback = null!;
|
||||
clickCallback = _ =>
|
||||
// 그룹 클릭 이벤트 - ContainerCallbackInfo로 관리
|
||||
EventCallback<ClickEvent> clickCallback = _ =>
|
||||
{
|
||||
ToggleGroupExpanded(group.GroupId);
|
||||
expandIcon.SetMaterialIcon(group.IsExpanded ? UTKMaterialIcons.ExpandMore : UTKMaterialIcons.ChevronRight, 16);
|
||||
@@ -621,63 +902,51 @@ namespace UVC.UIToolkit
|
||||
|
||||
groupElement.RegisterCallback(clickCallback);
|
||||
|
||||
// DetachFromPanelEvent에서 이벤트 해제
|
||||
groupElement.RegisterCallback<DetachFromPanelEvent>(evt =>
|
||||
// 컨테이너에 콜백 정보 저장 (CleanupContainerCallbacks에서 정리)
|
||||
container.userData = new ContainerCallbackInfo
|
||||
{
|
||||
groupElement.UnregisterCallback(clickCallback);
|
||||
});
|
||||
|
||||
container.Add(groupElement);
|
||||
ItemView = groupElement,
|
||||
ClickCallback = clickCallback
|
||||
};
|
||||
}
|
||||
|
||||
private void BindPropertyItem(VisualElement container, IUTKPropertyItem item)
|
||||
{
|
||||
// View Factory를 사용하여 View 생성 및 바인딩
|
||||
var itemView = UTKPropertyItemViewFactory.CreateView(item);
|
||||
container.Add(itemView);
|
||||
|
||||
// 클릭 이벤트 등록 - DetachFromPanelEvent에서 자동 정리됨
|
||||
EventCallback<ClickEvent> clickCallback = _ => OnPropertyClicked?.Invoke(item);
|
||||
itemView.RegisterCallback(clickCallback);
|
||||
// 이벤트 콜백 등록 및 컨테이너에 저장
|
||||
RegisterPropertyCallbacks(container, itemView, item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// PropertyItem View에 이벤트 콜백을 등록하고 컨테이너에 정보를 저장합니다.
|
||||
/// </summary>
|
||||
private void RegisterPropertyCallbacks(VisualElement container, VisualElement itemView, IUTKPropertyItem item)
|
||||
{
|
||||
var info = new ContainerCallbackInfo { ItemView = itemView };
|
||||
|
||||
// 클릭 이벤트 등록
|
||||
info.ClickCallback = _ => OnPropertyClicked?.Invoke(item);
|
||||
itemView.RegisterCallback(info.ClickCallback);
|
||||
|
||||
// 버튼 아이템인 경우 버튼 클릭 이벤트 구독
|
||||
Action<string>? buttonClickHandler = null;
|
||||
if (itemView is UTKButtonItemView buttonView)
|
||||
{
|
||||
buttonClickHandler = (actionName) =>
|
||||
{
|
||||
OnPropertyButtonClicked?.Invoke(item.Id, actionName);
|
||||
};
|
||||
buttonView.OnButtonClicked += buttonClickHandler;
|
||||
info.ButtonClickHandler = actionName => OnPropertyButtonClicked?.Invoke(item.Id, actionName);
|
||||
buttonView.OnButtonClicked += info.ButtonClickHandler;
|
||||
}
|
||||
|
||||
// String 아이템에 ActionButton이 있는 경우 이벤트 구독
|
||||
Action<string>? actionButtonClickHandler = null;
|
||||
if (itemView is UTKStringPropertyItemView stringView)
|
||||
{
|
||||
actionButtonClickHandler = (actionName) =>
|
||||
{
|
||||
OnPropertyButtonClicked?.Invoke(item.Id, actionName);
|
||||
};
|
||||
stringView.OnActionButtonClicked += actionButtonClickHandler;
|
||||
info.ActionButtonClickHandler = actionName => OnPropertyButtonClicked?.Invoke(item.Id, actionName);
|
||||
stringView.OnActionButtonClicked += info.ActionButtonClickHandler;
|
||||
}
|
||||
|
||||
// DetachFromPanelEvent에서 이벤트 해제
|
||||
itemView.RegisterCallback<DetachFromPanelEvent>(evt =>
|
||||
{
|
||||
itemView.UnregisterCallback(clickCallback);
|
||||
|
||||
if (itemView is UTKButtonItemView btnView && buttonClickHandler != null)
|
||||
{
|
||||
btnView.OnButtonClicked -= buttonClickHandler;
|
||||
}
|
||||
|
||||
if (itemView is UTKStringPropertyItemView strView && actionButtonClickHandler != null)
|
||||
{
|
||||
strView.OnActionButtonClicked -= actionButtonClickHandler;
|
||||
}
|
||||
});
|
||||
|
||||
container.Add(itemView);
|
||||
// 컨테이너에 콜백 정보 저장 (재사용/정리 시 참조)
|
||||
container.userData = info;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -751,8 +1020,13 @@ namespace UVC.UIToolkit
|
||||
|
||||
// 테마 변경 이벤트 해제
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanel);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
|
||||
|
||||
// TreeView 콜백 정리
|
||||
// 데이터 이벤트 해제 + TreeView View 콜백/Dispose 정리
|
||||
ClearInternal();
|
||||
|
||||
// TreeView 콜백 해제
|
||||
if (_treeView != null)
|
||||
{
|
||||
_treeView.makeItem = null;
|
||||
@@ -772,9 +1046,6 @@ namespace UVC.UIToolkit
|
||||
_clearButton.Dispose();
|
||||
}
|
||||
|
||||
// 이벤트 정리
|
||||
ClearInternal();
|
||||
|
||||
// 이벤트 핸들러 정리
|
||||
OnPropertyValueChanged = null;
|
||||
OnGroupExpandedChanged = null;
|
||||
|
||||
@@ -170,10 +170,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -203,6 +213,8 @@ namespace UVC.UIToolkit
|
||||
selectionChanged -= OnSelectionChanged;
|
||||
itemsChosen -= OnItemsChosen;
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnItemSelected = null;
|
||||
OnItemDoubleClicked = null;
|
||||
}
|
||||
|
||||
@@ -503,10 +503,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -641,6 +651,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnClosed = null;
|
||||
OnConfirm = null;
|
||||
OnCancel = null;
|
||||
|
||||
@@ -222,12 +222,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
// 패널에서 분리될 때 이벤트 구독 해제
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -1190,6 +1198,10 @@ namespace UVC.UIToolkit
|
||||
|
||||
_hexField?.UnregisterCallback<ChangeEvent<string>>(OnHexFieldChanged);
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
OnColorChanged = null;
|
||||
OnColorSelected = null;
|
||||
OnClosed = null;
|
||||
|
||||
@@ -245,12 +245,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
// 패널에서 분리될 때 이벤트 구독 해제
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -1112,6 +1120,11 @@ namespace UVC.UIToolkit
|
||||
if (_disposed) return;
|
||||
_disposed = true;
|
||||
|
||||
// 테마 변경 이벤트 구독 해제
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
// 언어 변경 이벤트 구독 해제
|
||||
LocalizationManager.Instance.OnLanguageChanged -= OnLanguageChanged;
|
||||
|
||||
|
||||
@@ -226,10 +226,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -305,6 +315,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnClosed = null;
|
||||
_blocker = null;
|
||||
}
|
||||
|
||||
@@ -275,10 +275,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -389,6 +399,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnClosed = null;
|
||||
OnActionClicked = null;
|
||||
}
|
||||
|
||||
@@ -305,10 +305,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -436,6 +446,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnCollapsedChanged = null;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -340,10 +340,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -396,6 +406,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnClosed = null;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -40,11 +40,14 @@ namespace UVC.UIToolkit
|
||||
/// <summary>값 변경 이벤트</summary>
|
||||
event Action<IUTKPropertyItem, object?, object?>? OnValueChanged;
|
||||
|
||||
/// <summary>상태(ReadOnly 등) 변경 이벤트. View가 구독하여 UI를 갱신합니다.</summary>
|
||||
event Action<IUTKPropertyItem>? OnStateChanged;
|
||||
|
||||
/// <summary>현재 값을 object로 반환</summary>
|
||||
object? GetValue();
|
||||
|
||||
/// <summary>값을 설정 (타입 변환 포함)</summary>
|
||||
void SetValue(object? value);
|
||||
void SetValue(object? value, bool notifyChangeEvent = false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -62,6 +62,9 @@ namespace UVC.UIToolkit
|
||||
/// <summary>상태 + 색상 복합 타입</summary>
|
||||
ColorState,
|
||||
|
||||
/// <summary>실수 + 드롭다운 복합 타입</summary>
|
||||
FloatDropdown,
|
||||
|
||||
/// <summary>버튼 (액션 트리거)</summary>
|
||||
Button
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace UVC.UIToolkit
|
||||
{
|
||||
/// <summary>
|
||||
/// Float 값과 Dropdown 선택 문자열을 함께 저장하는 구조체입니다.
|
||||
/// UTKFloatDropdownPropertyItem의 값 타입으로 사용됩니다.
|
||||
/// </summary>
|
||||
public struct UTKFloatDropdownValue : IEquatable<UTKFloatDropdownValue>
|
||||
{
|
||||
/// <summary>Float 값</summary>
|
||||
public float FloatValue { get; set; }
|
||||
|
||||
/// <summary>Dropdown 선택 값</summary>
|
||||
public string DropdownValue { get; set; }
|
||||
|
||||
public UTKFloatDropdownValue(float floatValue, string dropdownValue)
|
||||
{
|
||||
FloatValue = floatValue;
|
||||
DropdownValue = dropdownValue ?? "";
|
||||
}
|
||||
|
||||
public bool Equals(UTKFloatDropdownValue other) =>
|
||||
Mathf.Approximately(FloatValue, other.FloatValue) &&
|
||||
string.Equals(DropdownValue, other.DropdownValue, StringComparison.Ordinal);
|
||||
|
||||
public override bool Equals(object? obj) => obj is UTKFloatDropdownValue other && Equals(other);
|
||||
public override int GetHashCode() => HashCode.Combine(FloatValue, DropdownValue);
|
||||
public override string ToString() => $"{FloatValue}{DropdownValue}";//$"{FloatValue:F2}{DropdownValue}";
|
||||
|
||||
public static bool operator ==(UTKFloatDropdownValue left, UTKFloatDropdownValue right) => left.Equals(right);
|
||||
public static bool operator !=(UTKFloatDropdownValue left, UTKFloatDropdownValue right) => !left.Equals(right);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2d41cfdd32cd0484898138be24db75cb
|
||||
@@ -26,12 +26,12 @@ namespace UVC.UIToolkit
|
||||
public abstract class UTKPropertyItemBase<T> : IUTKPropertyItem<T>, IDisposable
|
||||
{
|
||||
#region Fields
|
||||
private T _value;
|
||||
private bool _isReadOnly;
|
||||
private bool _isVisible = true;
|
||||
private bool _showLabel = true;
|
||||
protected T _value;
|
||||
protected bool _isReadOnly;
|
||||
protected bool _isVisible = true;
|
||||
protected bool _showLabel = true;
|
||||
private string? _description;
|
||||
private string? _tooltip;
|
||||
protected string? _tooltip;
|
||||
private string? _groupId;
|
||||
private bool _disposed;
|
||||
#endregion
|
||||
@@ -88,7 +88,12 @@ namespace UVC.UIToolkit
|
||||
public bool IsReadOnly
|
||||
{
|
||||
get => _isReadOnly;
|
||||
set => _isReadOnly = value;
|
||||
set
|
||||
{
|
||||
if (_isReadOnly == value) return;
|
||||
_isReadOnly = value;
|
||||
OnStateChanged?.Invoke(this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>표시 여부</summary>
|
||||
@@ -109,7 +114,11 @@ namespace UVC.UIToolkit
|
||||
public bool ShowLabel
|
||||
{
|
||||
get => _showLabel;
|
||||
set => _showLabel = value;
|
||||
set{
|
||||
if (_showLabel == value) return;
|
||||
_showLabel = value;
|
||||
OnStateChanged?.Invoke(this);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -119,6 +128,9 @@ namespace UVC.UIToolkit
|
||||
|
||||
/// <summary>값 변경 이벤트 (제네릭 타입)</summary>
|
||||
public event Action<IUTKPropertyItem<T>, T, T>? OnTypedValueChanged;
|
||||
|
||||
/// <summary>상태(ReadOnly 등) 변경 이벤트</summary>
|
||||
public event Action<IUTKPropertyItem>? OnStateChanged;
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
@@ -141,24 +153,41 @@ namespace UVC.UIToolkit
|
||||
public object? GetValue() => _value;
|
||||
|
||||
/// <summary>값을 설정합니다 (타입 변환 포함).</summary>
|
||||
public void SetValue(object? value)
|
||||
public void SetValue(object? value, bool notifyChangeEvent = false)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
if (default(T) == null)
|
||||
{
|
||||
Value = default!;
|
||||
if (notifyChangeEvent)
|
||||
{
|
||||
Value = default!;
|
||||
}
|
||||
else
|
||||
{
|
||||
_value = default!;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (value is T typedValue)
|
||||
{
|
||||
Value = typedValue;
|
||||
if (notifyChangeEvent)
|
||||
{
|
||||
Value = typedValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
_value = typedValue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
Value = (T)Convert.ChangeType(value, typeof(T));
|
||||
if (notifyChangeEvent)
|
||||
Value = (T)Convert.ChangeType(value, typeof(T));
|
||||
else
|
||||
_value = (T)Convert.ChangeType(value, typeof(T));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -195,6 +224,7 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
OnValueChanged = null;
|
||||
OnTypedValueChanged = null;
|
||||
OnStateChanged = null;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -21,10 +21,11 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 값</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKBoolPropertyItem(string id, string name, bool initialValue = false, bool isReadOnly = false)
|
||||
public UTKBoolPropertyItem(string id, string name, bool initialValue = false, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -37,9 +37,6 @@ namespace UVC.UIToolkit
|
||||
/// <summary>아이콘만 표시 모드</summary>
|
||||
public bool IconOnly { get; set; }
|
||||
|
||||
/// <summary>라벨 표시 여부 (false면 버튼이 전체 너비 사용)</summary>
|
||||
public bool ShowLabel { get; set; }
|
||||
|
||||
/// <summary>액션 이름 (버튼 클릭 시 전달되는 고유 이름)</summary>
|
||||
public string ActionName { get; }
|
||||
#endregion
|
||||
@@ -72,7 +69,7 @@ namespace UVC.UIToolkit
|
||||
BackgroundColor = null;
|
||||
BorderWidth = -1;
|
||||
IconOnly = false;
|
||||
ShowLabel = true; // 기본적으로 라벨 표시
|
||||
_showLabel = true; // 기본적으로 라벨 표시
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -112,7 +109,7 @@ namespace UVC.UIToolkit
|
||||
BackgroundColor = backgroundColor;
|
||||
BorderWidth = borderWidth;
|
||||
IconOnly = iconOnly;
|
||||
ShowLabel = showLabel;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -34,11 +34,13 @@ namespace UVC.UIToolkit
|
||||
/// <param name="initialValue">초기 값</param>
|
||||
/// <param name="useAlpha">알파 채널 사용 여부</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKColorPropertyItem(string id, string name, Color initialValue = default, bool useAlpha = false, bool isReadOnly = false)
|
||||
/// <param name="showLabel">레이블 표시 여부</param>
|
||||
public UTKColorPropertyItem(string id, string name, Color initialValue = default, bool useAlpha = false, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
_useAlpha = useAlpha;
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -22,10 +22,12 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 값</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKColorStatePropertyItem(string id, string name, UTKColorState initialValue = default, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKColorStatePropertyItem(string id, string name, UTKColorState initialValue = default, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -36,10 +38,12 @@ namespace UVC.UIToolkit
|
||||
/// <param name="state">상태 텍스트</param>
|
||||
/// <param name="color">색상</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKColorStatePropertyItem(string id, string name, string state, Color color, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKColorStatePropertyItem(string id, string name, string state, Color color, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, new UTKColorState(state, color))
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -49,12 +49,14 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 값 (default이면 오늘 날짜)</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKDatePropertyItem(string id, string name, DateTime initialValue = default, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKDatePropertyItem(string id, string name, DateTime initialValue = default, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue == default ? DateTime.Today : initialValue)
|
||||
{
|
||||
_minDay = DateTime.MinValue;
|
||||
_maxDay = DateTime.MaxValue;
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -66,12 +68,14 @@ namespace UVC.UIToolkit
|
||||
/// <param name="minDay">최소 날짜 (null이면 제한 없음)</param>
|
||||
/// <param name="maxDay">최대 날짜 (null이면 제한 없음)</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKDatePropertyItem(string id, string name, DateTime initialValue, DateTime? minDay, DateTime? maxDay, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKDatePropertyItem(string id, string name, DateTime initialValue, DateTime? minDay, DateTime? maxDay, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue == default ? DateTime.Today : initialValue)
|
||||
{
|
||||
_minDay = minDay ?? DateTime.MinValue;
|
||||
_maxDay = maxDay ?? DateTime.MaxValue;
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -33,10 +33,12 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 범위 값</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKDateRangePropertyItem(string id, string name, UTKDateRange initialValue = default, bool isReadOnly = false)
|
||||
/// <param name="showLabel">레이블 표시 여부</param>
|
||||
public UTKDateRangePropertyItem(string id, string name, UTKDateRange initialValue = default, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue.Start == default ? new UTKDateRange(DateTime.Today, DateTime.Today) : initialValue)
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -47,10 +49,11 @@ namespace UVC.UIToolkit
|
||||
/// <param name="start">시작 날짜</param>
|
||||
/// <param name="end">종료 날짜</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKDateRangePropertyItem(string id, string name, DateTime start, DateTime end, bool isReadOnly = false)
|
||||
public UTKDateRangePropertyItem(string id, string name, DateTime start, DateTime end, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, new UTKDateRange(start, end))
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -33,10 +33,12 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 값 (default이면 현재 시간)</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKDateTimePropertyItem(string id, string name, DateTime initialValue = default, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKDateTimePropertyItem(string id, string name, DateTime initialValue = default, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue == default ? DateTime.Now : initialValue)
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -33,10 +33,12 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 범위 값</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKDateTimeRangePropertyItem(string id, string name, UTKDateTimeRange initialValue = default, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKDateTimeRangePropertyItem(string id, string name, UTKDateTimeRange initialValue = default, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue.Start == default ? new UTKDateTimeRange(DateTime.Now, DateTime.Now) : initialValue)
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -47,10 +49,11 @@ namespace UVC.UIToolkit
|
||||
/// <param name="start">시작 날짜시간</param>
|
||||
/// <param name="end">종료 날짜시간</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKDateTimeRangePropertyItem(string id, string name, DateTime start, DateTime end, bool isReadOnly = false)
|
||||
public UTKDateTimeRangePropertyItem(string id, string name, DateTime start, DateTime end, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, new UTKDateTimeRange(start, end))
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -35,7 +35,8 @@ namespace UVC.UIToolkit
|
||||
/// <param name="choices">선택 항목 목록</param>
|
||||
/// <param name="initialValue">초기 선택 값</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKDropdownPropertyItem(string id, string name, List<string> choices, string initialValue = "", bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKDropdownPropertyItem(string id, string name, List<string> choices, string initialValue = "", bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
_choices = choices ?? new List<string>();
|
||||
@@ -43,9 +44,10 @@ namespace UVC.UIToolkit
|
||||
// initialValue가 choices에 없으면 첫 번째 항목 선택
|
||||
if (!string.IsNullOrEmpty(initialValue) && !_choices.Contains(initialValue) && _choices.Count > 0)
|
||||
{
|
||||
Value = _choices[0];
|
||||
_value = _choices[0];
|
||||
}
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -56,20 +58,22 @@ namespace UVC.UIToolkit
|
||||
/// <param name="choices">선택 항목 목록</param>
|
||||
/// <param name="selectedIndex">초기 선택 인덱스</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKDropdownPropertyItem(string id, string name, IEnumerable<string> choices, int selectedIndex = 0, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKDropdownPropertyItem(string id, string name, IEnumerable<string> choices, int selectedIndex = 0, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, string.Empty)
|
||||
{
|
||||
_choices = choices?.ToList() ?? new List<string>();
|
||||
|
||||
if (_choices.Count > 0 && selectedIndex >= 0 && selectedIndex < _choices.Count)
|
||||
{
|
||||
Value = _choices[selectedIndex];
|
||||
_value = _choices[selectedIndex];
|
||||
}
|
||||
else if (_choices.Count > 0)
|
||||
{
|
||||
Value = _choices[0];
|
||||
_value = _choices[0];
|
||||
}
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -29,11 +29,13 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 값 (열거형 타입 추론에 사용)</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKEnumPropertyItem(string id, string name, Enum initialValue, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKEnumPropertyItem(string id, string name, Enum initialValue, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue ?? throw new ArgumentNullException(nameof(initialValue)))
|
||||
{
|
||||
_enumType = initialValue.GetType();
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
#nullable enable
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace UVC.UIToolkit
|
||||
{
|
||||
/// <summary>
|
||||
/// Float + Dropdown 복합 속성 데이터 클래스입니다.
|
||||
/// Float 값(또는 Stepper)과 Dropdown 선택을 하나의 행에 표시합니다.
|
||||
/// UI는 UTKFloatDropdownPropertyItemView에서 담당합니다.
|
||||
/// </summary>
|
||||
public class UTKFloatDropdownPropertyItem : UTKPropertyItemBase<UTKFloatDropdownValue>
|
||||
{
|
||||
#region Fields
|
||||
private List<string> _choices;
|
||||
private bool _useStepper;
|
||||
private float _floatMinValue = float.MinValue;
|
||||
private float _floatMaxValue = float.MaxValue;
|
||||
private float _stepperStep = 1.0f;
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
/// <summary>속성 타입</summary>
|
||||
public override UTKPropertyType PropertyType => UTKPropertyType.FloatDropdown;
|
||||
|
||||
/// <summary>Dropdown 선택 목록</summary>
|
||||
public List<string> Choices => _choices;
|
||||
|
||||
/// <summary>스테퍼(증감 버튼) 사용 여부. false이면 UTKFloatField 사용</summary>
|
||||
public bool UseStepper
|
||||
{
|
||||
get => _useStepper;
|
||||
set => _useStepper = value;
|
||||
}
|
||||
|
||||
/// <summary>Float 최소값</summary>
|
||||
public float FloatMinValue
|
||||
{
|
||||
get => _floatMinValue;
|
||||
set => _floatMinValue = value;
|
||||
}
|
||||
|
||||
/// <summary>Float 최대값</summary>
|
||||
public float FloatMaxValue
|
||||
{
|
||||
get => _floatMaxValue;
|
||||
set => _floatMaxValue = value;
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 증감 단위 (기본값: 1.0)</summary>
|
||||
public float StepperStep
|
||||
{
|
||||
get => _stepperStep;
|
||||
set => _stepperStep = value > 0 ? value : 1.0f;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
/// <summary>
|
||||
/// Float + Dropdown 복합 속성을 생성합니다.
|
||||
/// </summary>
|
||||
/// <param name="id">고유 ID</param>
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="floatValue">초기 float 값</param>
|
||||
/// <param name="choices">Dropdown 선택 목록</param>
|
||||
/// <param name="dropdownValue">초기 Dropdown 선택 값</param>
|
||||
/// <param name="useStepper">스테퍼 사용 여부</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
/// <param name="showLabel">레이블 표시 여부</param>
|
||||
public UTKFloatDropdownPropertyItem(
|
||||
string id,
|
||||
string name,
|
||||
float floatValue,
|
||||
List<string> choices,
|
||||
string dropdownValue = "",
|
||||
bool useStepper = false,
|
||||
bool isReadOnly = false,
|
||||
bool showLabel = true)
|
||||
: base(id, name, new UTKFloatDropdownValue(floatValue, ValidateDropdownValue(dropdownValue, choices)))
|
||||
{
|
||||
_choices = new List<string>(choices);
|
||||
_useStepper = useStepper;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Float + Dropdown 복합 속성을 생성합니다
|
||||
/// (최소/최대 float 값 및 스테퍼 단위 포함)
|
||||
/// </summary>
|
||||
/// <param name="id">고유 ID</param>
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="floatValue">초기 float 값</param>
|
||||
/// <param name="choices">Dropdown 선택 목록</param>
|
||||
/// <param name="dropdownValue">초기 Dropdown 선택 값</param>
|
||||
/// <param name="floatMinValue">Float 최소값</param>
|
||||
/// <param name="floatMaxValue">Float 최대값</param>
|
||||
/// <param name="stepperStep">스테퍼 증감 단위</param
|
||||
/// <param name="useStepper">스테퍼 사용 여부</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
/// <param name="showLabel">레이블 표시 여부</param>
|
||||
public UTKFloatDropdownPropertyItem(
|
||||
string id,
|
||||
string name,
|
||||
float floatValue,
|
||||
List<string> choices,
|
||||
string dropdownValue,
|
||||
float floatMinValue,
|
||||
float floatMaxValue,
|
||||
float stepperStep = 1.0f,
|
||||
bool useStepper = false,
|
||||
bool isReadOnly = false,
|
||||
bool showLabel = true)
|
||||
: base(id, name, new UTKFloatDropdownValue(floatValue, ValidateDropdownValue(dropdownValue, choices)))
|
||||
{
|
||||
_choices = new List<string>(choices);
|
||||
_floatMinValue = floatMinValue;
|
||||
_floatMaxValue = floatMaxValue;
|
||||
_stepperStep = stepperStep;
|
||||
_useStepper = useStepper;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
/// <summary>Dropdown 선택 값 검증 (목록에 없으면 첫 번째 값 반환)</summary>
|
||||
private static string ValidateDropdownValue(string value, List<string> choices)
|
||||
{
|
||||
if (choices.Count == 0) return value;
|
||||
if (string.IsNullOrEmpty(value) || !choices.Contains(value))
|
||||
{
|
||||
return choices[0];
|
||||
}
|
||||
return value;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 86800100e89e3d34fa8b8afa7f290064
|
||||
@@ -64,10 +64,12 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 값</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKFloatPropertyItem(string id, string name, float initialValue = 0f, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKFloatPropertyItem(string id, string name, float initialValue = 0f, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -81,14 +83,16 @@ namespace UVC.UIToolkit
|
||||
/// <param name="useSlider">슬라이더 사용 여부</param>
|
||||
/// <param name="useStepper">스테퍼 사용 여부</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKFloatPropertyItem(string id, string name, float initialValue, float minValue = float.MinValue, float maxValue = float.MaxValue, bool useSlider = true, bool useStepper = false, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKFloatPropertyItem(string id, string name, float initialValue, float minValue = float.MinValue, float maxValue = float.MaxValue, bool useSlider = true, bool useStepper = false, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
_minValue = minValue;
|
||||
_maxValue = maxValue;
|
||||
_useSlider = useSlider;
|
||||
_useStepper = useStepper;
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -8,23 +8,63 @@ namespace UVC.UIToolkit
|
||||
/// </summary>
|
||||
public class UTKFloatRangePropertyItem : UTKPropertyItemBase<UTKFloatRange>
|
||||
{
|
||||
#region Fields
|
||||
private bool _useStepper;
|
||||
private float _stepperMinValue = float.MinValue;
|
||||
private float _stepperMaxValue = float.MaxValue;
|
||||
private float _stepperStep = 1.0f;
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
/// <summary>속성 타입</summary>
|
||||
public override UTKPropertyType PropertyType => UTKPropertyType.FloatRange;
|
||||
|
||||
/// <summary>스테퍼(증감 버튼) 사용 여부</summary>
|
||||
public bool UseStepper
|
||||
{
|
||||
get => _useStepper;
|
||||
set
|
||||
{
|
||||
_useStepper = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 증감 단위 (기본값: 1.0)</summary>
|
||||
public float StepperStep
|
||||
{
|
||||
get => _stepperStep;
|
||||
set => _stepperStep = value > 0 ? value : 1.0f;
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 최소값</summary>
|
||||
public float StepperMinValue
|
||||
{
|
||||
get => _stepperMinValue;
|
||||
set => _stepperMinValue = value;
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 최대값</summary>
|
||||
public float StepperMaxValue
|
||||
{
|
||||
get => _stepperMaxValue;
|
||||
set => _stepperMaxValue = value;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
/// <summary>
|
||||
/// 실수 범위 속성을 생성합니다.
|
||||
/// 실수 범위 속성을 생성합니다 (필드 모드).
|
||||
/// </summary>
|
||||
/// <param name="id">고유 ID</param>
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 범위 값</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKFloatRangePropertyItem(string id, string name, UTKFloatRange initialValue = default, bool isReadOnly = false)
|
||||
/// <param name="showLabel">레이블 표시 여부</param>
|
||||
public UTKFloatRangePropertyItem(string id, string name, UTKFloatRange initialValue = default, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -34,11 +74,44 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="min">최소값</param>
|
||||
/// <param name="max">최대값</param>
|
||||
/// <param name="stepperStep">스테퍼 증감 단위</param>
|
||||
/// <param name="stepperMinValue">스테퍼 최소값</param>
|
||||
/// <param name="stepperMaxValue">스테퍼 최대값</param>
|
||||
/// <param name="useStepper">스테퍼 사용 여부</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKFloatRangePropertyItem(string id, string name, float min, float max, bool isReadOnly = false)
|
||||
/// <param name="showLabel">레이블 표시 여부</param>
|
||||
public UTKFloatRangePropertyItem(string id, string name, float min, float max, float stepperStep = 1.0f, float stepperMinValue = float.MinValue, float stepperMaxValue = float.MaxValue, bool useStepper = false, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, new UTKFloatRange(min, max))
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_stepperMinValue = stepperMinValue;
|
||||
_stepperMaxValue = stepperMaxValue;
|
||||
_useStepper = useStepper;
|
||||
_stepperStep = stepperStep;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 실수 범위 속성을 생성합니다 (스테퍼 모드).
|
||||
/// </summary>
|
||||
/// <param name="id">고유 ID</param>
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 범위 값</param>
|
||||
/// <param name="stepperStep">스테퍼 증감 단위</param>
|
||||
/// <param name="stepperMinValue">스테퍼 최소값</param>
|
||||
/// <param name="stepperMaxValue">스테퍼 최대값</param>
|
||||
/// <param name="useStepper">스테퍼 사용 여부</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
/// <param name="showLabel">레이블 표시 여부</param>
|
||||
public UTKFloatRangePropertyItem(string id, string name, UTKFloatRange initialValue, float stepperStep = 1.0f, float stepperMinValue = float.MinValue, float stepperMaxValue = float.MaxValue, bool useStepper = false, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
_stepperMinValue = stepperMinValue;
|
||||
_stepperMaxValue = stepperMaxValue;
|
||||
_useStepper = useStepper;
|
||||
_stepperStep = stepperStep;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -85,14 +85,16 @@ namespace UVC.UIToolkit
|
||||
/// <param name="maxValue">최대값</param>
|
||||
/// <param name="useSlider">슬라이더 사용 여부</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKIntPropertyItem(string id, string name, int initialValue, int minValue, int maxValue, bool useSlider = false, bool useStepper = false, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKIntPropertyItem(string id, string name, int initialValue, int minValue, int maxValue, bool useSlider = false, bool useStepper = false, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
_minValue = minValue;
|
||||
_maxValue = maxValue;
|
||||
_useSlider = useSlider;
|
||||
_useStepper = useStepper;
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -60,10 +60,12 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 범위 값</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKIntRangePropertyItem(string id, string name, UTKIntRange initialValue = default, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKIntRangePropertyItem(string id, string name, UTKIntRange initialValue = default, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -78,14 +80,16 @@ namespace UVC.UIToolkit
|
||||
/// <param name="stepperMaxValue">스테퍼 최대값</param>
|
||||
/// <param name="useStepper">스테퍼 사용 여부</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKIntRangePropertyItem(string id, string name, int min, int max, int stepperStep = 1, int stepperMinValue = int.MinValue, int stepperMaxValue = int.MaxValue, bool useStepper = false, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKIntRangePropertyItem(string id, string name, int min, int max, int stepperStep = 1, int stepperMinValue = int.MinValue, int stepperMaxValue = int.MaxValue, bool useStepper = false, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, new UTKIntRange(min, max))
|
||||
{
|
||||
_stepperMinValue = stepperMinValue;
|
||||
_stepperMaxValue = stepperMaxValue;
|
||||
_useStepper = useStepper;
|
||||
_stepperStep = stepperStep;
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -99,14 +103,16 @@ namespace UVC.UIToolkit
|
||||
/// <param name="stepperMaxValue">스테퍼 최대값</param>
|
||||
/// <param name="useStepper">스테퍼 사용 여부</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKIntRangePropertyItem(string id, string name, UTKIntRange initialValue, int stepperStep = 1, int stepperMinValue = int.MinValue, int stepperMaxValue = int.MaxValue, bool useStepper = false, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKIntRangePropertyItem(string id, string name, UTKIntRange initialValue, int stepperStep = 1, int stepperMinValue = int.MinValue, int stepperMaxValue = int.MaxValue, bool useStepper = false, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
_stepperMinValue = stepperMinValue;
|
||||
_stepperMaxValue = stepperMaxValue;
|
||||
_useStepper = useStepper;
|
||||
_stepperStep = stepperStep;
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -51,12 +51,14 @@ namespace UVC.UIToolkit
|
||||
/// <param name="choices">선택 항목 목록</param>
|
||||
/// <param name="initialValues">초기 선택 값 목록</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKMultiSelectDropdownPropertyItem(
|
||||
string id,
|
||||
string name,
|
||||
List<string> choices,
|
||||
List<string>? initialValues = null,
|
||||
bool isReadOnly = false)
|
||||
bool isReadOnly = false,
|
||||
bool showLabel = true)
|
||||
: base(id, name, initialValues ?? new List<string>())
|
||||
{
|
||||
_choices = choices ?? new List<string>();
|
||||
@@ -65,10 +67,11 @@ namespace UVC.UIToolkit
|
||||
if (initialValues != null && initialValues.Count > 0)
|
||||
{
|
||||
var validValues = initialValues.Where(v => _choices.Contains(v)).ToList();
|
||||
Value = validValues;
|
||||
_value = validValues;
|
||||
}
|
||||
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -79,12 +82,14 @@ namespace UVC.UIToolkit
|
||||
/// <param name="choices">선택 항목 목록</param>
|
||||
/// <param name="selectedIndices">초기 선택 인덱스 목록</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKMultiSelectDropdownPropertyItem(
|
||||
string id,
|
||||
string name,
|
||||
IEnumerable<string> choices,
|
||||
IEnumerable<int>? selectedIndices = null,
|
||||
bool isReadOnly = false)
|
||||
bool isReadOnly = false,
|
||||
bool showLabel = true)
|
||||
: base(id, name, new List<string>())
|
||||
{
|
||||
_choices = choices?.ToList() ?? new List<string>();
|
||||
@@ -95,10 +100,11 @@ namespace UVC.UIToolkit
|
||||
.Where(i => i >= 0 && i < _choices.Count)
|
||||
.Select(i => _choices[i])
|
||||
.ToList();
|
||||
Value = validValues;
|
||||
_value = validValues;
|
||||
}
|
||||
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -49,11 +49,13 @@ namespace UVC.UIToolkit
|
||||
/// <param name="choices">선택 항목 목록</param>
|
||||
/// <param name="selectedIndex">초기 선택 인덱스</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKRadioPropertyItem(string id, string name, List<string> choices, int selectedIndex = 0, bool isReadOnly = false)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKRadioPropertyItem(string id, string name, List<string> choices, int selectedIndex = 0, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, Math.Max(0, Math.Min(selectedIndex, (choices?.Count ?? 1) - 1)))
|
||||
{
|
||||
_choices = choices ?? new List<string>();
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -64,8 +66,9 @@ namespace UVC.UIToolkit
|
||||
/// <param name="choices">선택 항목 목록</param>
|
||||
/// <param name="selectedIndex">초기 선택 인덱스</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKRadioPropertyItem(string id, string name, IEnumerable<string> choices, int selectedIndex = 0, bool isReadOnly = false)
|
||||
: this(id, name, choices?.ToList() ?? new List<string>(), selectedIndex, isReadOnly)
|
||||
/// <param name="showLabel">라벨 표시 여부</param>
|
||||
public UTKRadioPropertyItem(string id, string name, IEnumerable<string> choices, int selectedIndex = 0, bool isReadOnly = false, bool showLabel = true)
|
||||
: this(id, name, choices?.ToList() ?? new List<string>(), selectedIndex, isReadOnly, showLabel)
|
||||
{
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -45,13 +45,15 @@ namespace UVC.UIToolkit
|
||||
/// <param name="isMultiline">멀티라인 모드</param>
|
||||
/// <param name="maxLength">최대 문자 길이</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
/// <param name="showLabel">레이블 표시 여부</param>
|
||||
/// <param name="actionButton">액션 버튼</param>
|
||||
public UTKStringPropertyItem(string id, string name, string initialValue = "", bool isMultiline = false, int maxLength = -1, bool isReadOnly = false, UTKButtonItem? actionButton = null)
|
||||
public UTKStringPropertyItem(string id, string name, string initialValue = "", bool isMultiline = false, int maxLength = -1, bool isReadOnly = false, bool showLabel = true, UTKButtonItem? actionButton = null)
|
||||
: base(id, name, initialValue ?? string.Empty)
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isMultiline = isMultiline;
|
||||
_maxLength = maxLength;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
ActionButton = actionButton;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -22,10 +22,12 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 값</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKVector2PropertyItem(string id, string name, Vector2 initialValue = default, bool isReadOnly = false)
|
||||
/// <param name="showLabel">레이블 표시 여부</param>
|
||||
public UTKVector2PropertyItem(string id, string name, Vector2 initialValue = default, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -22,10 +22,12 @@ namespace UVC.UIToolkit
|
||||
/// <param name="name">표시 이름</param>
|
||||
/// <param name="initialValue">초기 값</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKVector3PropertyItem(string id, string name, Vector3 initialValue = default, bool isReadOnly = false)
|
||||
/// <param name="showLabel">레이블 표시 여부</param>
|
||||
public UTKVector3PropertyItem(string id, string name, Vector3 initialValue = default, bool isReadOnly = false, bool showLabel = true)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
IsReadOnly = isReadOnly;
|
||||
_isReadOnly = isReadOnly;
|
||||
_showLabel = showLabel;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -217,17 +217,18 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -235,6 +236,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,6 +137,7 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
// 라벨 텍스트 설정
|
||||
if (_labelElement != null)
|
||||
@@ -191,6 +192,7 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
if (_boundData != null)
|
||||
{
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -349,12 +349,13 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
if (data is UTKColorPropertyItem colorItem)
|
||||
{
|
||||
@@ -364,7 +365,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -372,6 +373,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -283,17 +283,18 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -301,6 +302,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -273,12 +273,13 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
if (data is UTKDatePropertyItem dateItem)
|
||||
{
|
||||
@@ -288,7 +289,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -296,6 +297,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -376,12 +376,13 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
if (data is UTKDateRangePropertyItem dateRangeItem)
|
||||
{
|
||||
@@ -391,7 +392,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -399,6 +400,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -273,12 +273,13 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
if (data is UTKDateTimePropertyItem dateTimeItem)
|
||||
{
|
||||
@@ -288,7 +289,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -296,6 +297,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -376,12 +376,13 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
if (data is UTKDateTimeRangePropertyItem dateTimeRangeItem)
|
||||
{
|
||||
@@ -391,7 +392,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -399,6 +400,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -325,12 +325,13 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value ?? string.Empty;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
if (data is UTKDropdownPropertyItem dropdownItem)
|
||||
{
|
||||
@@ -344,7 +345,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -352,6 +353,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -277,13 +277,14 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
_enumType = data.Value?.GetType();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
if (_enumDropdown != null && _value != null)
|
||||
{
|
||||
@@ -293,7 +294,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -301,6 +302,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,505 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
namespace UVC.UIToolkit
|
||||
{
|
||||
/// <summary>
|
||||
/// Float + Dropdown 복합 속성 View 클래스입니다.
|
||||
/// UTKFloatField(또는 UTKFloatStepper)와 UTKDropdown을 사용하여
|
||||
/// float 값과 문자열 선택을 하나의 행에 표시/편집합니다.
|
||||
///
|
||||
/// <para><b>사용법 (Data 바인딩):</b></para>
|
||||
/// <code>
|
||||
/// var data = new UTKFloatDropdownPropertyItem("id", "Label", 1.5f,
|
||||
/// new List<string> { "A", "B", "C" }, "A");
|
||||
/// var view = new UTKFloatDropdownPropertyItemView();
|
||||
/// view.Bind(data);
|
||||
/// </code>
|
||||
/// </summary>
|
||||
[UxmlElement]
|
||||
public partial class UTKFloatDropdownPropertyItemView : UTKPropertyItemViewBase, IUTKPropertyItemView<UTKFloatDropdownValue>
|
||||
{
|
||||
#region Fields
|
||||
private UTKFloatField? _floatField;
|
||||
private UTKFloatStepper? _stepper;
|
||||
private UTKDropdown? _dropdown;
|
||||
private UTKInputField? _readOnlyField;
|
||||
|
||||
private UTKFloatDropdownValue _value;
|
||||
private List<string> _choices = new();
|
||||
private bool _useStepper;
|
||||
private float _floatMinValue = float.MinValue;
|
||||
private float _floatMaxValue = float.MaxValue;
|
||||
private float _stepperStep = 1.0f;
|
||||
|
||||
private IUTKPropertyItem<UTKFloatDropdownValue>? _boundData;
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
protected override string ViewTypeName => "UTKFloatDropdownPropertyItemView";
|
||||
|
||||
/// <summary>현재 값</summary>
|
||||
public UTKFloatDropdownValue Value
|
||||
{
|
||||
get => _value;
|
||||
set
|
||||
{
|
||||
if (!_value.Equals(value))
|
||||
{
|
||||
_value = value;
|
||||
UpdateValueUI();
|
||||
OnValueChanged?.Invoke(value);
|
||||
|
||||
if (_boundData != null && !_boundData.Value.Equals(value))
|
||||
{
|
||||
_boundData.Value = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Dropdown 선택 목록</summary>
|
||||
public List<string> Choices
|
||||
{
|
||||
get => _choices;
|
||||
set
|
||||
{
|
||||
_choices = value ?? new List<string>();
|
||||
_dropdown?.SetOptions(_choices);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼(증감 버튼) 사용 여부</summary>
|
||||
public bool UseStepper
|
||||
{
|
||||
get => _useStepper;
|
||||
set
|
||||
{
|
||||
if (_useStepper != value)
|
||||
{
|
||||
_useStepper = value;
|
||||
UpdateControlVisibility();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
public event Action<UTKFloatDropdownValue>? OnValueChanged;
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
public UTKFloatDropdownPropertyItemView() : base()
|
||||
{
|
||||
InitializeUI();
|
||||
}
|
||||
|
||||
public UTKFloatDropdownPropertyItemView(string label, List<string> choices) : base()
|
||||
{
|
||||
_choices = new List<string>(choices);
|
||||
Label = label;
|
||||
InitializeUI();
|
||||
}
|
||||
|
||||
public UTKFloatDropdownPropertyItemView(UTKFloatDropdownPropertyItem data) : base()
|
||||
{
|
||||
_value = data.Value;
|
||||
_choices = new List<string>(data.Choices);
|
||||
_useStepper = data.UseStepper;
|
||||
_floatMinValue = data.FloatMinValue;
|
||||
_floatMaxValue = data.FloatMaxValue;
|
||||
_stepperStep = data.StepperStep;
|
||||
Label = data.Name;
|
||||
_isReadOnly = data.IsReadOnly;
|
||||
InitializeUI();
|
||||
Bind(data);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Initialization
|
||||
private void InitializeUI()
|
||||
{
|
||||
AddToClassList("utk-property-item-view");
|
||||
AddToClassList("utk-property-item-view--float-dropdown");
|
||||
|
||||
if (!CreateUIFromUxml())
|
||||
{
|
||||
CreateUIFallback();
|
||||
}
|
||||
|
||||
QueryUIElements();
|
||||
RegisterEvents();
|
||||
UpdateControlVisibility();
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
}
|
||||
|
||||
private void QueryUIElements()
|
||||
{
|
||||
_floatField = this.Q<UTKFloatField>("float-field");
|
||||
_dropdown = this.Q<UTKDropdown>("dropdown-field");
|
||||
_stepper = this.Q<UTKFloatStepper>("stepper-field");
|
||||
|
||||
if (_valueContainer != null)
|
||||
{
|
||||
_valueContainer.style.flexDirection = FlexDirection.Row;
|
||||
|
||||
// FloatField 생성
|
||||
if (_floatField == null)
|
||||
{
|
||||
_floatField = new UTKFloatField { name = "float-field" };
|
||||
_floatField.AddToClassList("utk-float-dropdown-view__float-field");
|
||||
_valueContainer.Add(_floatField);
|
||||
}
|
||||
|
||||
// FloatStepper 생성
|
||||
if (_stepper == null)
|
||||
{
|
||||
_stepper = new UTKFloatStepper(_floatMinValue, _floatMaxValue, _value.FloatValue, _stepperStep, IsReadOnly)
|
||||
{
|
||||
name = "stepper-field"
|
||||
};
|
||||
_stepper.AddToClassList("utk-float-dropdown-view__stepper");
|
||||
_valueContainer.Add(_stepper);
|
||||
}
|
||||
|
||||
// Dropdown 생성
|
||||
if (_dropdown == null)
|
||||
{
|
||||
_dropdown = new UTKDropdown { name = "dropdown-field" };
|
||||
_dropdown.AddToClassList("utk-float-dropdown-view__dropdown");
|
||||
_valueContainer.Add(_dropdown);
|
||||
}
|
||||
}
|
||||
|
||||
// 초기 값 설정
|
||||
if (_floatField != null)
|
||||
{
|
||||
_floatField.SetValueWithoutNotify(_value.FloatValue);
|
||||
_floatField.isReadOnly = IsReadOnly;
|
||||
}
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.MinValue = _floatMinValue;
|
||||
_stepper.MaxValue = _floatMaxValue;
|
||||
_stepper.Step = _stepperStep;
|
||||
_stepper.SetValue(_value.FloatValue, false);
|
||||
_stepper.IsReadOnly = IsReadOnly;
|
||||
}
|
||||
if (_dropdown != null)
|
||||
{
|
||||
_dropdown.SetOptions(_choices);
|
||||
_dropdown.SetSelectedValue(_value.DropdownValue, notify: false);
|
||||
_dropdown.IsEnabled = !IsReadOnly;
|
||||
}
|
||||
}
|
||||
|
||||
private void RegisterEvents()
|
||||
{
|
||||
if (_floatField != null)
|
||||
{
|
||||
_floatField.OnValueChanged += OnFloatFieldChanged;
|
||||
}
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.OnValueChanged += OnStepperChanged;
|
||||
}
|
||||
if (_dropdown != null)
|
||||
{
|
||||
_dropdown.OnSelectionChanged += OnDropdownChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void UnregisterEvents()
|
||||
{
|
||||
if (_floatField != null)
|
||||
{
|
||||
_floatField.OnValueChanged -= OnFloatFieldChanged;
|
||||
}
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.OnValueChanged -= OnStepperChanged;
|
||||
}
|
||||
if (_dropdown != null)
|
||||
{
|
||||
_dropdown.OnSelectionChanged -= OnDropdownChanged;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>컨트롤 가시성을 업데이트합니다.</summary>
|
||||
private void UpdateControlVisibility()
|
||||
{
|
||||
bool isReadOnlyMode = IsReadOnly;
|
||||
bool showStepper = !isReadOnlyMode && _useStepper;
|
||||
bool showFloatField = !isReadOnlyMode && !_useStepper;
|
||||
bool showDropdown = !isReadOnlyMode;
|
||||
|
||||
if (_floatField != null)
|
||||
{
|
||||
_floatField.style.display = showFloatField ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.style.display = showStepper ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
|
||||
if (_dropdown != null)
|
||||
{
|
||||
_dropdown.style.display = showDropdown ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
|
||||
// ReadOnly 모드: 단일 텍스트 필드로 표시
|
||||
if (isReadOnlyMode)
|
||||
{
|
||||
EnsureReadOnlyField();
|
||||
if (_readOnlyField != null)
|
||||
{
|
||||
_readOnlyField.style.display = DisplayStyle.Flex;
|
||||
_readOnlyField.Value = _value.ToString();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_readOnlyField != null)
|
||||
{
|
||||
_readOnlyField.style.display = DisplayStyle.None;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>ReadOnly 전용 필드를 필요 시 생성합니다.</summary>
|
||||
private void EnsureReadOnlyField()
|
||||
{
|
||||
if (_readOnlyField != null || _valueContainer == null) return;
|
||||
|
||||
_readOnlyField = new UTKInputField { name = "readonly-field" };
|
||||
_readOnlyField.AddToClassList("utk-float-dropdown-view__readonly-field");
|
||||
_readOnlyField.isReadOnly = true;
|
||||
_readOnlyField.Value = _value.ToString();
|
||||
_valueContainer.Add(_readOnlyField);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Override Methods
|
||||
protected override void CreateValueUI(VisualElement container)
|
||||
{
|
||||
// UXML/QueryUIElements 기반으로 생성하므로 여기서는 생성하지 않음
|
||||
}
|
||||
|
||||
public override void RefreshUI()
|
||||
{
|
||||
UpdateValueUI();
|
||||
}
|
||||
|
||||
protected override void OnReadOnlyStateChanged(bool isReadOnly)
|
||||
{
|
||||
if (_floatField != null)
|
||||
{
|
||||
_floatField.isReadOnly = isReadOnly;
|
||||
}
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.IsReadOnly = isReadOnly;
|
||||
}
|
||||
if (_dropdown != null)
|
||||
{
|
||||
_dropdown.IsEnabled = !isReadOnly;
|
||||
}
|
||||
|
||||
UpdateControlVisibility();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Event Handling
|
||||
private void OnFloatFieldChanged(float newFloat)
|
||||
{
|
||||
var newValue = new UTKFloatDropdownValue(newFloat, _value.DropdownValue);
|
||||
if (!_value.Equals(newValue))
|
||||
{
|
||||
_value = newValue;
|
||||
|
||||
// 스테퍼가 있으면 동기화
|
||||
if (_stepper != null && !Mathf.Approximately(_stepper.Value, newFloat))
|
||||
{
|
||||
_stepper.SetValue(newFloat, false);
|
||||
}
|
||||
|
||||
OnValueChanged?.Invoke(newValue);
|
||||
|
||||
if (_boundData != null && !_boundData.Value.Equals(newValue))
|
||||
{
|
||||
_boundData.Value = newValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnStepperChanged(float newFloat)
|
||||
{
|
||||
var newValue = new UTKFloatDropdownValue(newFloat, _value.DropdownValue);
|
||||
if (!_value.Equals(newValue))
|
||||
{
|
||||
_value = newValue;
|
||||
|
||||
// FloatField가 있으면 동기화
|
||||
if (_floatField != null && !Mathf.Approximately(_floatField.Value, newFloat))
|
||||
{
|
||||
_floatField.SetValueWithoutNotify(newFloat);
|
||||
}
|
||||
|
||||
OnValueChanged?.Invoke(newValue);
|
||||
|
||||
if (_boundData != null && !_boundData.Value.Equals(newValue))
|
||||
{
|
||||
_boundData.Value = newValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnDropdownChanged(int index, string newDropdownValue)
|
||||
{
|
||||
var newValue = new UTKFloatDropdownValue(_value.FloatValue, newDropdownValue);
|
||||
if (!_value.Equals(newValue))
|
||||
{
|
||||
_value = newValue;
|
||||
OnValueChanged?.Invoke(newValue);
|
||||
|
||||
if (_boundData != null && !_boundData.Value.Equals(newValue))
|
||||
{
|
||||
_boundData.Value = newValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Value Update
|
||||
private void UpdateValueUI()
|
||||
{
|
||||
if (_floatField != null && !Mathf.Approximately(_floatField.Value, _value.FloatValue))
|
||||
{
|
||||
_floatField.SetValueWithoutNotify(_value.FloatValue);
|
||||
}
|
||||
|
||||
if (_stepper != null && !Mathf.Approximately(_stepper.Value, _value.FloatValue))
|
||||
{
|
||||
_stepper.SetValue(_value.FloatValue, false);
|
||||
}
|
||||
|
||||
if (_dropdown != null)
|
||||
{
|
||||
string? selectedValue = _dropdown.SelectedValue;
|
||||
if (selectedValue != _value.DropdownValue)
|
||||
{
|
||||
_dropdown.SetSelectedValue(_value.DropdownValue, notify: false);
|
||||
}
|
||||
}
|
||||
|
||||
if (_readOnlyField != null && IsReadOnly)
|
||||
{
|
||||
_readOnlyField.Value = _value.ToString();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Data Binding
|
||||
public void Bind(IUTKPropertyItem data)
|
||||
{
|
||||
if (data is IUTKPropertyItem<UTKFloatDropdownValue> typedData)
|
||||
{
|
||||
Bind(typedData);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"[UTKFloatDropdownPropertyItemView] Cannot bind to non-FloatDropdown data: {data.GetType().Name}");
|
||||
}
|
||||
}
|
||||
|
||||
public void Bind(IUTKPropertyItem<UTKFloatDropdownValue> data)
|
||||
{
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
// UTKFloatDropdownPropertyItem의 설정 적용
|
||||
if (data is UTKFloatDropdownPropertyItem floatDropdownItem)
|
||||
{
|
||||
_choices = new List<string>(floatDropdownItem.Choices);
|
||||
_useStepper = floatDropdownItem.UseStepper;
|
||||
_floatMinValue = floatDropdownItem.FloatMinValue;
|
||||
_floatMaxValue = floatDropdownItem.FloatMaxValue;
|
||||
_stepperStep = floatDropdownItem.StepperStep;
|
||||
|
||||
// Dropdown 옵션 업데이트
|
||||
_dropdown?.SetOptions(_choices);
|
||||
|
||||
// 스테퍼 설정 업데이트
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.MinValue = _floatMinValue;
|
||||
_stepper.MaxValue = _floatMaxValue;
|
||||
_stepper.Step = _stepperStep;
|
||||
}
|
||||
|
||||
UpdateControlVisibility();
|
||||
}
|
||||
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
{
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnDataValueChanged(IUTKPropertyItem<UTKFloatDropdownValue> item, UTKFloatDropdownValue oldValue, UTKFloatDropdownValue newValue)
|
||||
{
|
||||
if (!_value.Equals(newValue))
|
||||
{
|
||||
_value = newValue;
|
||||
UpdateValueUI();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Dispose
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (_disposed) return;
|
||||
|
||||
if (disposing)
|
||||
{
|
||||
UnregisterEvents();
|
||||
Unbind();
|
||||
|
||||
OnValueChanged = null;
|
||||
_floatField = null;
|
||||
_stepper?.Dispose();
|
||||
_stepper = null;
|
||||
_dropdown?.Dispose();
|
||||
_dropdown = null;
|
||||
_readOnlyField = null;
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6d14075483e28504aa714b26c491a24e
|
||||
@@ -517,13 +517,14 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
// 데이터에서 속성 동기화
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
// 슬라이더 및 스테퍼 관련 속성 동기화
|
||||
if (data is UTKFloatPropertyItem floatItem)
|
||||
@@ -570,7 +571,7 @@ namespace UVC.UIToolkit
|
||||
|
||||
// UI 갱신
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -578,6 +579,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
/// <summary>
|
||||
/// FloatRange 속성 View 클래스입니다.
|
||||
/// Min, Max 두 개의 UTKFloatField를 사용하여 실수 범위를 표시/편집합니다.
|
||||
/// Min, Max 두 개의 UTKFloatField 또는 UTKFloatStepper를 사용하여 실수 범위를 표시/편집합니다.
|
||||
/// </summary>
|
||||
[UxmlElement]
|
||||
public partial class UTKFloatRangePropertyItemView : UTKPropertyItemViewBase, IUTKPropertyItemView<UTKFloatRange>
|
||||
@@ -15,14 +15,70 @@ namespace UVC.UIToolkit
|
||||
#region Fields
|
||||
private UTKFloatField? _minField;
|
||||
private UTKFloatField? _maxField;
|
||||
private UTKFloatStepper? _minStepper;
|
||||
private UTKFloatStepper? _maxStepper;
|
||||
|
||||
private UTKFloatRange _value;
|
||||
private bool _useStepper;
|
||||
private float _stepperMinValue = float.MinValue;
|
||||
private float _stepperMaxValue = float.MaxValue;
|
||||
private float _stepperStep = 1.0f;
|
||||
private IUTKPropertyItem<UTKFloatRange>? _boundData;
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
protected override string ViewTypeName => "UTKFloatRangePropertyItemView";
|
||||
|
||||
/// <summary>스테퍼(증감 버튼) 사용 여부</summary>
|
||||
public bool UseStepper
|
||||
{
|
||||
get => _useStepper;
|
||||
set
|
||||
{
|
||||
if (_useStepper != value)
|
||||
{
|
||||
_useStepper = value;
|
||||
UpdateModeClass();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 최소값</summary>
|
||||
public float StepperMinValue
|
||||
{
|
||||
get => _stepperMinValue;
|
||||
set
|
||||
{
|
||||
_stepperMinValue = value;
|
||||
if (_minStepper != null) _minStepper.MinValue = value;
|
||||
if (_maxStepper != null) _maxStepper.MinValue = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 최대값</summary>
|
||||
public float StepperMaxValue
|
||||
{
|
||||
get => _stepperMaxValue;
|
||||
set
|
||||
{
|
||||
_stepperMaxValue = value;
|
||||
if (_minStepper != null) _minStepper.MaxValue = value;
|
||||
if (_maxStepper != null) _maxStepper.MaxValue = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 증감 단위</summary>
|
||||
public float StepperStep
|
||||
{
|
||||
get => _stepperStep;
|
||||
set
|
||||
{
|
||||
_stepperStep = value > 0 ? value : 1.0f;
|
||||
if (_minStepper != null) _minStepper.Step = _stepperStep;
|
||||
if (_maxStepper != null) _maxStepper.Step = _stepperStep;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>현재 값</summary>
|
||||
public UTKFloatRange Value
|
||||
{
|
||||
@@ -94,31 +150,53 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_minField = this.Q<UTKFloatField>("min-field");
|
||||
_maxField = this.Q<UTKFloatField>("max-field");
|
||||
_minStepper = this.Q<UTKFloatStepper>("min-stepper");
|
||||
_maxStepper = this.Q<UTKFloatStepper>("max-stepper");
|
||||
|
||||
// Fallback: UXML에서 못 찾으면 생성
|
||||
if (_valueContainer != null)
|
||||
{
|
||||
_valueContainer.style.flexDirection = FlexDirection.Row;
|
||||
|
||||
// FloatField 생성
|
||||
if (_minField == null)
|
||||
{
|
||||
_minField = new UTKFloatField { name = "min-field" };
|
||||
_minField.style.flexGrow = 1;
|
||||
_minField.AddToClassList("utk-property-item-view__field");
|
||||
_valueContainer.Add(_minField);
|
||||
|
||||
var separator = new UTKLabel("~", UTKLabel.LabelSize.Body2);
|
||||
separator.AddToClassList("utk-property-item-view__range-separator");
|
||||
_valueContainer.Add(separator);
|
||||
}
|
||||
|
||||
if (_maxField == null)
|
||||
{
|
||||
var separator = new UTKLabel("~", UTKLabel.LabelSize.Body2);
|
||||
separator.AddToClassList("utk-property-item-view__range-separator");
|
||||
_valueContainer.Add(separator);
|
||||
|
||||
_maxField = new UTKFloatField { name = "max-field" };
|
||||
_maxField.style.flexGrow = 1;
|
||||
_maxField.AddToClassList("utk-property-item-view__field");
|
||||
_valueContainer.Add(_maxField);
|
||||
}
|
||||
|
||||
// FloatStepper 생성
|
||||
if (_minStepper == null)
|
||||
{
|
||||
_minStepper = new UTKFloatStepper(_stepperMinValue, _stepperMaxValue, _value.Min, _stepperStep, IsReadOnly)
|
||||
{
|
||||
name = "min-stepper"
|
||||
};
|
||||
_minStepper.AddToClassList("utk-property-item-view__stepper");
|
||||
_valueContainer.Add(_minStepper);
|
||||
}
|
||||
|
||||
if (_maxStepper == null)
|
||||
{
|
||||
_maxStepper = new UTKFloatStepper(_stepperMinValue, _stepperMaxValue, _value.Max, _stepperStep, IsReadOnly)
|
||||
{
|
||||
name = "max-stepper"
|
||||
};
|
||||
_maxStepper.AddToClassList("utk-property-item-view__stepper");
|
||||
_valueContainer.Add(_maxStepper);
|
||||
}
|
||||
}
|
||||
|
||||
// 초기 값 설정
|
||||
@@ -132,6 +210,25 @@ namespace UVC.UIToolkit
|
||||
_maxField.SetValueWithoutNotify(_value.Max);
|
||||
_maxField.isReadOnly = IsReadOnly;
|
||||
}
|
||||
if (_minStepper != null)
|
||||
{
|
||||
_minStepper.MinValue = _stepperMinValue;
|
||||
_minStepper.MaxValue = _stepperMaxValue;
|
||||
_minStepper.Step = _stepperStep;
|
||||
_minStepper.SetValue(_value.Min, false);
|
||||
_minStepper.IsReadOnly = IsReadOnly;
|
||||
}
|
||||
if (_maxStepper != null)
|
||||
{
|
||||
_maxStepper.MinValue = _stepperMinValue;
|
||||
_maxStepper.MaxValue = _stepperMaxValue;
|
||||
_maxStepper.Step = _stepperStep;
|
||||
_maxStepper.SetValue(_value.Max, false);
|
||||
_maxStepper.IsReadOnly = IsReadOnly;
|
||||
}
|
||||
|
||||
// 컨트롤 가시성 업데이트
|
||||
UpdateControlVisibility();
|
||||
}
|
||||
|
||||
private void RegisterEvents()
|
||||
@@ -144,6 +241,14 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_maxField.OnValueChanged += OnMaxChanged;
|
||||
}
|
||||
if (_minStepper != null)
|
||||
{
|
||||
_minStepper.OnValueChanged += OnMinStepperChanged;
|
||||
}
|
||||
if (_maxStepper != null)
|
||||
{
|
||||
_maxStepper.OnValueChanged += OnMaxStepperChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void UnregisterEvents()
|
||||
@@ -156,6 +261,65 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_maxField.OnValueChanged -= OnMaxChanged;
|
||||
}
|
||||
if (_minStepper != null)
|
||||
{
|
||||
_minStepper.OnValueChanged -= OnMinStepperChanged;
|
||||
}
|
||||
if (_maxStepper != null)
|
||||
{
|
||||
_maxStepper.OnValueChanged -= OnMaxStepperChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateModeClass()
|
||||
{
|
||||
// ReadOnly 상태에서는 무조건 FloatField만 표시
|
||||
if (IsReadOnly)
|
||||
{
|
||||
RemoveFromClassList("utk-property-item-view--stepper");
|
||||
UpdateControlVisibility();
|
||||
return;
|
||||
}
|
||||
|
||||
// 스테퍼 클래스
|
||||
if (_useStepper)
|
||||
{
|
||||
AddToClassList("utk-property-item-view--stepper");
|
||||
}
|
||||
else
|
||||
{
|
||||
RemoveFromClassList("utk-property-item-view--stepper");
|
||||
}
|
||||
|
||||
UpdateControlVisibility();
|
||||
}
|
||||
|
||||
/// <summary>컨트롤 가시성을 업데이트합니다.</summary>
|
||||
private void UpdateControlVisibility()
|
||||
{
|
||||
bool isReadOnlyMode = IsReadOnly;
|
||||
bool showStepper = !isReadOnlyMode && _useStepper;
|
||||
bool showFloatField = isReadOnlyMode || !_useStepper;
|
||||
|
||||
if (_minField != null)
|
||||
{
|
||||
_minField.style.display = showFloatField ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
|
||||
if (_maxField != null)
|
||||
{
|
||||
_maxField.style.display = showFloatField ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
|
||||
if (_minStepper != null)
|
||||
{
|
||||
_minStepper.style.display = showStepper ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
|
||||
if (_maxStepper != null)
|
||||
{
|
||||
_maxStepper.style.display = showStepper ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -174,6 +338,11 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
if (_minField != null) _minField.isReadOnly = isReadOnly;
|
||||
if (_maxField != null) _maxField.isReadOnly = isReadOnly;
|
||||
if (_minStepper != null) _minStepper.IsReadOnly = isReadOnly;
|
||||
if (_maxStepper != null) _maxStepper.IsReadOnly = isReadOnly;
|
||||
|
||||
// ReadOnly 상태 변경 시 모드 클래스 업데이트
|
||||
UpdateModeClass();
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -207,6 +376,36 @@ namespace UVC.UIToolkit
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnMinStepperChanged(float newMin)
|
||||
{
|
||||
var newValue = new UTKFloatRange(newMin, _value.Max);
|
||||
if (!_value.Equals(newValue))
|
||||
{
|
||||
_value = newValue;
|
||||
OnValueChanged?.Invoke(newValue);
|
||||
|
||||
if (_boundData != null && !_boundData.Value.Equals(newValue))
|
||||
{
|
||||
_boundData.Value = newValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnMaxStepperChanged(float newMax)
|
||||
{
|
||||
var newValue = new UTKFloatRange(_value.Min, newMax);
|
||||
if (!_value.Equals(newValue))
|
||||
{
|
||||
_value = newValue;
|
||||
OnValueChanged?.Invoke(newValue);
|
||||
|
||||
if (_boundData != null && !_boundData.Value.Equals(newValue))
|
||||
{
|
||||
_boundData.Value = newValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Value Update
|
||||
@@ -221,6 +420,16 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_maxField.SetValueWithoutNotify(_value.Max);
|
||||
}
|
||||
|
||||
if (_minStepper != null && !Mathf.Approximately(_minStepper.Value, _value.Min))
|
||||
{
|
||||
_minStepper.SetValue(_value.Min, false);
|
||||
}
|
||||
|
||||
if (_maxStepper != null && !Mathf.Approximately(_maxStepper.Value, _value.Max))
|
||||
{
|
||||
_maxStepper.SetValue(_value.Max, false);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -242,17 +451,43 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
// UTKFloatRangePropertyItem의 스테퍼 설정 적용
|
||||
if (data is UTKFloatRangePropertyItem rangeItem)
|
||||
{
|
||||
_useStepper = rangeItem.UseStepper;
|
||||
_stepperMinValue = rangeItem.StepperMinValue;
|
||||
_stepperMaxValue = rangeItem.StepperMaxValue;
|
||||
_stepperStep = rangeItem.StepperStep;
|
||||
|
||||
// 스테퍼에 값 적용
|
||||
if (_minStepper != null)
|
||||
{
|
||||
_minStepper.MinValue = _stepperMinValue;
|
||||
_minStepper.MaxValue = _stepperMaxValue;
|
||||
_minStepper.Step = _stepperStep;
|
||||
}
|
||||
if (_maxStepper != null)
|
||||
{
|
||||
_maxStepper.MinValue = _stepperMinValue;
|
||||
_maxStepper.MaxValue = _stepperMaxValue;
|
||||
_maxStepper.Step = _stepperStep;
|
||||
}
|
||||
|
||||
UpdateModeClass();
|
||||
}
|
||||
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -260,6 +495,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
@@ -287,6 +523,10 @@ namespace UVC.UIToolkit
|
||||
OnValueChanged = null;
|
||||
_minField = null;
|
||||
_maxField = null;
|
||||
_minStepper?.Dispose();
|
||||
_minStepper = null;
|
||||
_maxStepper?.Dispose();
|
||||
_maxStepper = null;
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
|
||||
@@ -516,12 +516,13 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
if (data is UTKIntPropertyItem intItem)
|
||||
{
|
||||
@@ -565,7 +566,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -573,6 +574,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,7 +162,6 @@ namespace UVC.UIToolkit
|
||||
if (_minField == null)
|
||||
{
|
||||
_minField = new UTKIntegerField { name = "min-field" };
|
||||
_minField.style.flexGrow = 1;
|
||||
_minField.AddToClassList("utk-property-item-view__field");
|
||||
_valueContainer.Add(_minField);
|
||||
}
|
||||
@@ -174,7 +173,6 @@ namespace UVC.UIToolkit
|
||||
_valueContainer.Add(separator);
|
||||
|
||||
_maxField = new UTKIntegerField { name = "max-field" };
|
||||
_maxField.style.flexGrow = 1;
|
||||
_maxField.AddToClassList("utk-property-item-view__field");
|
||||
_valueContainer.Add(_maxField);
|
||||
}
|
||||
@@ -186,7 +184,6 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
name = "min-stepper"
|
||||
};
|
||||
_minStepper.style.flexGrow = 1;
|
||||
_minStepper.AddToClassList("utk-property-item-view__stepper");
|
||||
_valueContainer.Add(_minStepper);
|
||||
}
|
||||
@@ -197,7 +194,6 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
name = "max-stepper"
|
||||
};
|
||||
_maxStepper.style.flexGrow = 1;
|
||||
_maxStepper.AddToClassList("utk-property-item-view__stepper");
|
||||
_valueContainer.Add(_maxStepper);
|
||||
}
|
||||
@@ -455,12 +451,13 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
// UTKIntRangePropertyItem의 스테퍼 설정 적용
|
||||
if (data is UTKIntRangePropertyItem rangeItem)
|
||||
@@ -490,7 +487,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -498,6 +495,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -385,12 +385,13 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value != null ? new List<string>(data.Value) : new List<string>();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
if (data is UTKMultiSelectDropdownPropertyItem multiSelectItem)
|
||||
{
|
||||
@@ -404,7 +405,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -412,6 +413,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +54,8 @@ namespace UVC.UIToolkit
|
||||
protected bool _isVisible = true;
|
||||
protected bool _showLabel = true;
|
||||
protected string? _tooltipText;
|
||||
|
||||
private IUTKPropertyItem? _boundItemBase;
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
@@ -285,10 +287,19 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanel);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
|
||||
}
|
||||
|
||||
private void OnAttachToPanel(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnDetachFromPanel(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -390,6 +401,34 @@ namespace UVC.UIToolkit
|
||||
TooltipText = item.Tooltip;
|
||||
ShowLabel = item.ShowLabel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 상태 변경 이벤트를 구독합니다. 하위 View의 Bind에서 호출하세요.
|
||||
/// </summary>
|
||||
protected void BindBase(IUTKPropertyItem item)
|
||||
{
|
||||
UnbindBase();
|
||||
_boundItemBase = item;
|
||||
_boundItemBase.OnStateChanged += OnItemStateChanged;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 상태 변경 이벤트 구독을 해제합니다. 하위 View의 Unbind에서 호출하세요.
|
||||
/// </summary>
|
||||
protected void UnbindBase()
|
||||
{
|
||||
if (_boundItemBase != null)
|
||||
{
|
||||
_boundItemBase.OnStateChanged -= OnItemStateChanged;
|
||||
_boundItemBase = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnItemStateChanged(IUTKPropertyItem item)
|
||||
{
|
||||
IsReadOnly = item.IsReadOnly;
|
||||
ShowLabel = item.ShowLabel;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region IDisposable
|
||||
@@ -406,7 +445,10 @@ namespace UVC.UIToolkit
|
||||
|
||||
if (disposing)
|
||||
{
|
||||
UnbindBase();
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanel);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
|
||||
this.ClearTooltip();
|
||||
|
||||
_labelElement = null;
|
||||
|
||||
@@ -83,6 +83,7 @@ namespace UVC.UIToolkit
|
||||
UTKPropertyType.DateRange => new UTKDateRangePropertyItemView(),
|
||||
UTKPropertyType.DateTimeRange => new UTKDateTimeRangePropertyItemView(),
|
||||
UTKPropertyType.ColorState => new UTKColorStatePropertyItemView(),
|
||||
UTKPropertyType.FloatDropdown => CreateFloatDropdownView(data),
|
||||
UTKPropertyType.Button => CreateButtonView(data),
|
||||
_ => throw new ArgumentException($"Unknown property type: {data.PropertyType}")
|
||||
};
|
||||
@@ -121,11 +122,46 @@ namespace UVC.UIToolkit
|
||||
UTKPropertyType.DateRange => new UTKDateRangePropertyItemView(),
|
||||
UTKPropertyType.DateTimeRange => new UTKDateTimeRangePropertyItemView(),
|
||||
UTKPropertyType.ColorState => new UTKColorStatePropertyItemView(),
|
||||
UTKPropertyType.FloatDropdown => new UTKFloatDropdownPropertyItemView(),
|
||||
UTKPropertyType.Button => new UTKButtonItemView(),
|
||||
_ => throw new ArgumentException($"Unknown property type: {propertyType}")
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// PropertyItem 데이터에 해당하는 View의 Type을 반환합니다.
|
||||
/// View 재사용 시 기존 View와 타입 호환 여부 확인에 사용합니다.
|
||||
/// </summary>
|
||||
/// <param name="data">PropertyItem 데이터</param>
|
||||
/// <returns>View Type</returns>
|
||||
public static Type GetViewType(IUTKPropertyItem data)
|
||||
{
|
||||
return data.PropertyType switch
|
||||
{
|
||||
UTKPropertyType.String => typeof(UTKStringPropertyItemView),
|
||||
UTKPropertyType.Int => typeof(UTKIntPropertyItemView),
|
||||
UTKPropertyType.Float => typeof(UTKFloatPropertyItemView),
|
||||
UTKPropertyType.Bool => typeof(UTKBoolPropertyItemView),
|
||||
UTKPropertyType.Vector2 => typeof(UTKVector2PropertyItemView),
|
||||
UTKPropertyType.Vector3 => typeof(UTKVector3PropertyItemView),
|
||||
UTKPropertyType.Color => typeof(UTKColorPropertyItemView),
|
||||
UTKPropertyType.Date => typeof(UTKDatePropertyItemView),
|
||||
UTKPropertyType.DateTime => typeof(UTKDateTimePropertyItemView),
|
||||
UTKPropertyType.Enum => typeof(UTKEnumPropertyItemView),
|
||||
UTKPropertyType.DropdownList => typeof(UTKDropdownPropertyItemView),
|
||||
UTKPropertyType.MultiSelectDropdownList => typeof(UTKMultiSelectDropdownPropertyItemView),
|
||||
UTKPropertyType.RadioGroup => typeof(UTKRadioPropertyItemView),
|
||||
UTKPropertyType.IntRange => typeof(UTKIntRangePropertyItemView),
|
||||
UTKPropertyType.FloatRange => typeof(UTKFloatRangePropertyItemView),
|
||||
UTKPropertyType.DateRange => typeof(UTKDateRangePropertyItemView),
|
||||
UTKPropertyType.DateTimeRange => typeof(UTKDateTimeRangePropertyItemView),
|
||||
UTKPropertyType.ColorState => typeof(UTKColorStatePropertyItemView),
|
||||
UTKPropertyType.FloatDropdown => typeof(UTKFloatDropdownPropertyItemView),
|
||||
UTKPropertyType.Button => typeof(UTKButtonItemView),
|
||||
_ => typeof(VisualElement)
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 커스텀 View 팩토리를 등록합니다.
|
||||
/// </summary>
|
||||
@@ -225,6 +261,16 @@ namespace UVC.UIToolkit
|
||||
return new UTKMultiSelectDropdownPropertyItemView();
|
||||
}
|
||||
|
||||
private static IUTKPropertyItemView CreateFloatDropdownView(IUTKPropertyItem data)
|
||||
{
|
||||
// UTKFloatDropdownPropertyItem의 Choices로 View 초기화
|
||||
if (data is UTKFloatDropdownPropertyItem floatDropdownItem)
|
||||
{
|
||||
return new UTKFloatDropdownPropertyItemView(floatDropdownItem);
|
||||
}
|
||||
return new UTKFloatDropdownPropertyItemView();
|
||||
}
|
||||
|
||||
private static IUTKPropertyItemView CreateButtonView(IUTKPropertyItem data)
|
||||
{
|
||||
// UTKButtonItem으로 ButtonView 초기화
|
||||
|
||||
@@ -339,12 +339,13 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
if (data is UTKRadioPropertyItem radioItem)
|
||||
{
|
||||
@@ -355,7 +356,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateSelection();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -363,6 +364,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -316,12 +316,13 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value ?? string.Empty;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
if (data is UTKStringPropertyItem stringItem)
|
||||
{
|
||||
@@ -347,7 +348,7 @@ namespace UVC.UIToolkit
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -355,6 +356,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
|
||||
|
||||
@@ -188,17 +188,18 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -206,6 +207,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,17 +188,18 @@ namespace UVC.UIToolkit
|
||||
Unbind();
|
||||
|
||||
_boundData = data;
|
||||
BindBase(data);
|
||||
|
||||
Label = data.Name;
|
||||
_value = data.Value;
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
ShowLabel = data.ShowLabel;
|
||||
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
IsReadOnly = data.IsReadOnly;
|
||||
}
|
||||
|
||||
public void Unbind()
|
||||
@@ -206,6 +207,7 @@ namespace UVC.UIToolkit
|
||||
if (_boundData != null)
|
||||
{
|
||||
_boundData.OnTypedValueChanged -= OnDataValueChanged;
|
||||
UnbindBase();
|
||||
_boundData = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,10 +168,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -194,6 +204,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<Vector2>>(OnSliderValueChanged);
|
||||
}
|
||||
|
||||
@@ -252,10 +252,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -319,6 +329,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -150,10 +150,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -176,6 +186,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<float>>(OnSliderValueChanged);
|
||||
}
|
||||
|
||||
@@ -151,10 +151,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -185,6 +195,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
OnValueChanged = null;
|
||||
UnregisterCallback<ChangeEvent<int>>(OnSliderValueChanged);
|
||||
}
|
||||
|
||||
@@ -99,10 +99,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -118,6 +128,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -190,10 +190,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -310,6 +320,8 @@ namespace UVC.UIToolkit
|
||||
_disposed = true;
|
||||
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
foreach (var tab in _utkTabs)
|
||||
{
|
||||
|
||||
@@ -112,27 +112,51 @@ namespace UVC.UIToolkit
|
||||
/// <para><b>UTK 컴포넌트에서 사용 (내부 구현):</b></para>
|
||||
/// <code>
|
||||
/// [UxmlElement]
|
||||
/// public partial class MyCustomComponent : VisualElement
|
||||
/// public partial class MyCustomComponent : VisualElement, IDisposable
|
||||
/// {
|
||||
/// private bool _disposed;
|
||||
///
|
||||
/// public MyCustomComponent()
|
||||
/// {
|
||||
/// // 컴포넌트에 테마 스타일 적용
|
||||
/// UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
///
|
||||
/// // 테마 변경 구독
|
||||
/// UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
/// // 테마 변경 구독 (Attach/Detach 쌍으로 관리)
|
||||
/// SubscribeToThemeChanges();
|
||||
/// }
|
||||
///
|
||||
/// // 패널에서 분리될 때 구독 해제
|
||||
/// RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
/// {
|
||||
/// UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
/// });
|
||||
/// private void SubscribeToThemeChanges()
|
||||
/// {
|
||||
/// UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
/// RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
/// RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
/// }
|
||||
///
|
||||
/// private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
/// {
|
||||
/// UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
/// UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
/// UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
/// }
|
||||
///
|
||||
/// private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
/// {
|
||||
/// UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
/// }
|
||||
///
|
||||
/// private void OnThemeChanged(UTKTheme theme)
|
||||
/// {
|
||||
/// UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
/// }
|
||||
///
|
||||
/// public void Dispose()
|
||||
/// {
|
||||
/// if (_disposed) return;
|
||||
/// _disposed = true;
|
||||
/// UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
/// UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
/// UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
/// }
|
||||
/// }
|
||||
/// </code>
|
||||
///
|
||||
|
||||
@@ -451,10 +451,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -473,6 +483,8 @@ namespace UVC.UIToolkit
|
||||
|
||||
// 테마 변경 이벤트 해제
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
// 내부 UTKAccordionList 정리
|
||||
_accordionList?.Dispose();
|
||||
|
||||
@@ -408,10 +408,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -432,6 +442,8 @@ namespace UVC.UIToolkit
|
||||
|
||||
// 테마 변경 이벤트 해제
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
// 내부 UTKComponentList 정리
|
||||
_componentList?.Dispose();
|
||||
|
||||
@@ -664,10 +664,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -688,6 +698,8 @@ namespace UVC.UIToolkit
|
||||
|
||||
// 테마 변경 이벤트 해제
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
// 내부 UTKComponentList 정리
|
||||
_componentList?.Dispose();
|
||||
|
||||
@@ -439,10 +439,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -464,6 +474,8 @@ namespace UVC.UIToolkit
|
||||
|
||||
// 테마 변경 이벤트 해제
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
// 내부 UTKImageList 정리
|
||||
_imageList?.Dispose();
|
||||
|
||||
@@ -8,8 +8,65 @@ using UnityEngine.UIElements;
|
||||
namespace UVC.UIToolkit
|
||||
{
|
||||
/// <summary>
|
||||
/// UTKPropertyList를 감싸는 윈도우 래퍼
|
||||
/// 헤더, 타이틀, 닫기 버튼 등 윈도우 프레임 제공
|
||||
/// UTKPropertyList를 감싸는 윈도우 래퍼입니다.
|
||||
/// 헤더(타이틀 + 닫기 버튼), 드래그 이동, 그리고 내부 UTKPropertyList를 통한
|
||||
/// 속성 목록 관리 기능을 제공합니다.
|
||||
///
|
||||
/// <para><b>주요 기능:</b></para>
|
||||
/// <list type="bullet">
|
||||
/// <item>윈도우 프레임 (헤더, 타이틀, 닫기 버튼)</item>
|
||||
/// <item>헤더 드래그로 위치 이동</item>
|
||||
/// <item>UTKPropertyList 위임 메서드 (데이터 로드, 속성 관리, 값 변경 등)</item>
|
||||
/// <item>속성 값 변경 / 클릭 / 버튼 클릭 이벤트</item>
|
||||
/// </list>
|
||||
///
|
||||
/// <para><b>관련 리소스:</b></para>
|
||||
/// <list type="bullet">
|
||||
/// <item>Resources/UIToolkit/Window/UTKPropertyListWindow.uxml</item>
|
||||
/// <item>Resources/UIToolkit/Window/UTKPropertyListWindowUss.uss</item>
|
||||
/// </list>
|
||||
///
|
||||
/// <para><b>사용 예:</b></para>
|
||||
/// <code>
|
||||
/// // 1. 윈도우 생성 및 설정
|
||||
/// var window = new UTKPropertyListWindow("속성 편집기");
|
||||
/// window.ShowCloseButton = true;
|
||||
/// window.SetSize(300, 600);
|
||||
///
|
||||
/// // 2. 이벤트 구독
|
||||
/// window.OnCloseClicked += () => window.Hide();
|
||||
/// window.OnPropertyValueChanged += args =>
|
||||
/// {
|
||||
/// Debug.Log($"{args.PropertyId} = {args.NewValue}");
|
||||
///
|
||||
/// // 조건부 가시성 제어 예시
|
||||
/// if (args.PropertyId == "type" && args.NewValue is string type)
|
||||
/// {
|
||||
/// window.SetPropertyVisibilityBatch(new (string, bool)[]
|
||||
/// {
|
||||
/// ("option_a", type == "A"),
|
||||
/// ("option_b", type == "B"),
|
||||
/// });
|
||||
/// }
|
||||
/// };
|
||||
///
|
||||
/// // 3. 데이터 로드 (그룹 + 개별 아이템 혼합)
|
||||
/// var entries = new List<IUTKPropertyEntry>();
|
||||
/// entries.Add(new UTKStringPropertyItem("name", "이름", "기본값"));
|
||||
///
|
||||
/// var group = new UTKPropertyGroup("transform", "Transform");
|
||||
/// group.AddItem(new UTKVector3PropertyItem("pos", "Position", Vector3.zero));
|
||||
/// entries.Add(group);
|
||||
///
|
||||
/// window.LoadMixedProperties(entries);
|
||||
///
|
||||
/// // 4. 런타임 속성 제어
|
||||
/// window.SetPropertyReadOnly("name", true); // 읽기 전용 전환
|
||||
/// window.SetPropertyVisibility("pos", false); // 숨김
|
||||
/// window.UpdatePropertyValue("name", "새 이름"); // 값 변경
|
||||
///
|
||||
/// root.Add(window);
|
||||
/// </code>
|
||||
/// </summary>
|
||||
[UxmlElement]
|
||||
public partial class UTKPropertyListWindow : VisualElement, IDisposable
|
||||
@@ -222,57 +279,151 @@ namespace UVC.UIToolkit
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Public Methods - PropertyList 위임
|
||||
#region Public Methods - Data Loading (PropertyList 위임)
|
||||
/// <summary>평면 속성 목록을 로드합니다 (그룹 없이).</summary>
|
||||
/// <param name="items">로드할 속성 아이템 목록.</param>
|
||||
public void LoadProperties(List<IUTKPropertyItem> items) => PropertyList.LoadProperties(items);
|
||||
|
||||
/// <summary>그룹화된 속성 목록을 로드합니다.</summary>
|
||||
/// <param name="groups">로드할 속성 그룹 목록.</param>
|
||||
public void LoadGroupedProperties(List<IUTKPropertyGroup> groups) => PropertyList.LoadGroupedProperties(groups);
|
||||
|
||||
/// <summary>그룹과 개별 아이템이 혼합된 엔트리 목록을 로드합니다.</summary>
|
||||
/// <param name="entries">로드할 엔트리 목록 (IUTKPropertyGroup 또는 IUTKPropertyItem).</param>
|
||||
public void LoadMixedProperties(List<IUTKPropertyEntry> entries) => PropertyList.LoadMixedProperties(entries);
|
||||
#endregion
|
||||
|
||||
#region Public Methods - Group Management (PropertyList 위임)
|
||||
/// <summary>그룹을 추가합니다.</summary>
|
||||
/// <param name="group">추가할 속성 그룹.</param>
|
||||
public void AddGroup(IUTKPropertyGroup group) => PropertyList.AddGroup(group);
|
||||
|
||||
/// <summary>지정한 ID의 그룹과 내부 아이템을 모두 제거합니다.</summary>
|
||||
/// <param name="groupId">제거할 그룹 ID.</param>
|
||||
public void RemoveGroup(string groupId) => PropertyList.RemoveGroup(groupId);
|
||||
|
||||
/// <summary>지정한 ID의 그룹을 반환합니다.</summary>
|
||||
/// <param name="groupId">조회할 그룹 ID.</param>
|
||||
/// <returns>그룹 인스턴스 또는 null.</returns>
|
||||
public IUTKPropertyGroup? GetGroup(string groupId) => PropertyList.GetGroup(groupId);
|
||||
|
||||
/// <summary>그룹의 펼침/접힘 상태를 설정합니다.</summary>
|
||||
/// <param name="groupId">대상 그룹 ID.</param>
|
||||
/// <param name="expanded">true면 펼침, false면 접힘.</param>
|
||||
public void SetGroupExpanded(string groupId, bool expanded) => PropertyList.SetGroupExpanded(groupId, expanded);
|
||||
|
||||
/// <summary>그룹의 펼침/접힘 상태를 토글합니다.</summary>
|
||||
/// <param name="groupId">대상 그룹 ID.</param>
|
||||
public void ToggleGroupExpanded(string groupId) => PropertyList.ToggleGroupExpanded(groupId);
|
||||
#endregion
|
||||
|
||||
#region Public Methods - Property Management (PropertyList 위임)
|
||||
/// <summary>최상위 속성 아이템을 추가합니다.</summary>
|
||||
/// <param name="item">추가할 속성 아이템.</param>
|
||||
public void AddProperty(IUTKPropertyItem item) => PropertyList.AddProperty(item);
|
||||
|
||||
/// <summary>지정한 그룹에 속성 아이템을 추가합니다.</summary>
|
||||
/// <param name="groupId">대상 그룹 ID.</param>
|
||||
/// <param name="item">추가할 속성 아이템.</param>
|
||||
public void AddPropertyToGroup(string groupId, IUTKPropertyItem item) => PropertyList.AddPropertyToGroup(groupId, item);
|
||||
|
||||
/// <summary>지정한 ID의 속성 아이템을 제거합니다.</summary>
|
||||
/// <param name="itemId">제거할 아이템 ID.</param>
|
||||
public void RemoveProperty(string itemId) => PropertyList.RemoveProperty(itemId);
|
||||
|
||||
/// <summary>지정한 ID의 속성 아이템을 반환합니다.</summary>
|
||||
/// <param name="itemId">조회할 아이템 ID.</param>
|
||||
/// <returns>아이템 인스턴스 또는 null.</returns>
|
||||
public IUTKPropertyItem? GetProperty(string itemId) => PropertyList.GetProperty(itemId);
|
||||
#endregion
|
||||
|
||||
public void UpdatePropertyValue(string propertyId, object newValue) => PropertyList.UpdatePropertyValue(propertyId, newValue);
|
||||
public void SetPropertyValue(string propertyId, object value) => PropertyList.SetPropertyValue(propertyId, value);
|
||||
#region Public Methods - Value Management (PropertyList 위임)
|
||||
/// <summary>속성 값을 변경합니다. 바인딩된 View에 자동 반영됩니다.</summary>
|
||||
/// <param name="propertyId">대상 속성 ID.</param>
|
||||
/// <param name="newValue">새 값 (타입 변환 자동 시도).</param>
|
||||
/// <param name="notify">true면 값 변경 알림 이벤트 발생.</param>
|
||||
public void UpdatePropertyValue(string propertyId, object newValue, bool notify = false) => PropertyList.UpdatePropertyValue(propertyId, newValue, notify);
|
||||
|
||||
/// <summary>속성 값을 변경합니다. <see cref="UpdatePropertyValue"/>의 별칭입니다.</summary>
|
||||
/// <param name="propertyId">대상 속성 ID.</param>
|
||||
/// <param name="value">새 값.</param>
|
||||
/// <param name="notify">true면 값 변경 알림 이벤트 발생.</param>
|
||||
public void SetPropertyValue(string propertyId, object value, bool notify = false) => PropertyList.SetPropertyValue(propertyId, value, notify);
|
||||
#endregion
|
||||
|
||||
#region Public Methods - Visibility & ReadOnly (PropertyList 위임)
|
||||
/// <summary>속성 아이템의 가시성을 변경합니다. TreeView Rebuild가 발생합니다.</summary>
|
||||
/// <param name="propertyId">대상 속성 ID.</param>
|
||||
/// <param name="visible">true면 표시, false면 숨김.</param>
|
||||
public void SetPropertyVisibility(string propertyId, bool visible) => PropertyList.SetPropertyVisibility(propertyId, visible);
|
||||
public void SetGroupVisibility(string groupId, bool visible) => PropertyList.SetGroupVisibility(groupId, visible);
|
||||
public void SetPropertyReadOnly(string propertyId, bool isReadOnly) => PropertyList.SetPropertyReadOnly(propertyId, isReadOnly);
|
||||
public void SetGroupReadOnly(string groupId, bool isReadOnly) => PropertyList.SetGroupReadOnly(groupId, isReadOnly);
|
||||
|
||||
/// <summary>여러 속성의 가시성을 일괄 변경합니다. TreeView는 마지막에 한 번만 갱신됩니다.</summary>
|
||||
/// <param name="changes">변경할 (속성 ID, 가시성) 튜플 목록.</param>
|
||||
public void SetPropertyVisibilityBatch(IEnumerable<(string propertyId, bool visible)> changes) => PropertyList.SetPropertyVisibilityBatch(changes);
|
||||
|
||||
/// <summary>그룹의 가시성을 변경합니다. TreeView Rebuild가 발생합니다.</summary>
|
||||
/// <param name="groupId">대상 그룹 ID.</param>
|
||||
/// <param name="visible">true면 표시, false면 숨김.</param>
|
||||
public void SetGroupVisibility(string groupId, bool visible) => PropertyList.SetGroupVisibility(groupId, visible);
|
||||
|
||||
/// <summary>속성 아이템의 읽기 전용 상태를 변경합니다. OnStateChanged로 View에 자동 반영됩니다.</summary>
|
||||
/// <param name="propertyId">대상 속성 ID.</param>
|
||||
/// <param name="isReadOnly">true면 읽기 전용.</param>
|
||||
public void SetPropertyReadOnly(string propertyId, bool isReadOnly) => PropertyList.SetPropertyReadOnly(propertyId, isReadOnly);
|
||||
|
||||
/// <summary>그룹 내 모든 아이템의 읽기 전용 상태를 일괄 변경합니다.</summary>
|
||||
/// <param name="groupId">대상 그룹 ID.</param>
|
||||
/// <param name="isReadOnly">true면 읽기 전용.</param>
|
||||
public void SetGroupReadOnly(string groupId, bool isReadOnly) => PropertyList.SetGroupReadOnly(groupId, isReadOnly);
|
||||
#endregion
|
||||
|
||||
#region Public Methods - Utilities (PropertyList 위임)
|
||||
/// <summary>모든 엔트리(그룹 + 아이템)를 제거하고 초기화합니다.</summary>
|
||||
public void Clear() => PropertyList.Clear();
|
||||
|
||||
/// <summary>현재 데이터를 기반으로 TreeView를 다시 빌드합니다.</summary>
|
||||
public void Refresh() => PropertyList.Refresh();
|
||||
#endregion
|
||||
|
||||
#region Public Methods - Window
|
||||
/// <summary>윈도우를 표시합니다.</summary>
|
||||
public void Show()
|
||||
{
|
||||
style.display = DisplayStyle.Flex;
|
||||
}
|
||||
|
||||
/// <summary>윈도우를 숨깁니다.</summary>
|
||||
public void Hide()
|
||||
{
|
||||
style.display = DisplayStyle.None;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 윈도우의 위치를 설정합니다 (absolute 포지셔닝).
|
||||
/// </summary>
|
||||
/// <param name="x">왼쪽 오프셋 (px).</param>
|
||||
/// <param name="y">상단 오프셋 (px).</param>
|
||||
public void SetPosition(float x, float y)
|
||||
{
|
||||
style.left = x;
|
||||
style.top = y;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 윈도우의 크기를 설정합니다.
|
||||
/// </summary>
|
||||
/// <param name="width">너비 (px).</param>
|
||||
/// <param name="height">높이 (px).</param>
|
||||
public void SetSize(float width, float height)
|
||||
{
|
||||
style.width = width;
|
||||
style.height = height;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 부모 요소 기준으로 윈도우를 중앙에 배치합니다.
|
||||
/// schedule.Execute로 다음 프레임에 실행됩니다.
|
||||
/// </summary>
|
||||
public void CenterOnScreen()
|
||||
{
|
||||
schedule.Execute(() =>
|
||||
@@ -325,10 +476,20 @@ namespace UVC.UIToolkit
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
RegisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
}
|
||||
|
||||
private void OnAttachToPanelForTheme(AttachToPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt)
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
@@ -346,6 +507,8 @@ namespace UVC.UIToolkit
|
||||
|
||||
// 테마 변경 이벤트 해제
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
UnregisterCallback<AttachToPanelEvent>(OnAttachToPanelForTheme);
|
||||
UnregisterCallback<DetachFromPanelEvent>(OnDetachFromPanelForTheme);
|
||||
|
||||
// 드래그 이벤트 해제
|
||||
if (_header != null)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user