feat: WIP.
This commit is contained in:
@@ -19,6 +19,7 @@ public class Rating : TemplatedControl
|
||||
protected const string PC_Selected = ":selected";
|
||||
|
||||
private ItemsControl? _itemsControl;
|
||||
private const double Tolerance = 0.0001;
|
||||
|
||||
public static readonly StyledProperty<double> ValueProperty =
|
||||
AvaloniaProperty.Register<Rating, double>(nameof(Value), defaultBindingMode: BindingMode.TwoWay);
|
||||
@@ -217,7 +218,13 @@ public class Rating : TemplatedControl
|
||||
public void Select(RatingCharacter o)
|
||||
{
|
||||
var index = Items.IndexOf(o);
|
||||
if (AllowClear && index == (int)Value - 1)
|
||||
double newValue = index + 1;
|
||||
if (o.IsHalf)
|
||||
{
|
||||
newValue = index + 0.5;
|
||||
}
|
||||
|
||||
if (AllowClear && Math.Abs(Value - newValue) < Tolerance)
|
||||
{
|
||||
UpdateItems(-1);
|
||||
SetCurrentValue(ValueProperty, 0);
|
||||
@@ -225,7 +232,7 @@ public class Rating : TemplatedControl
|
||||
else
|
||||
{
|
||||
UpdateItems(index);
|
||||
SetCurrentValue(ValueProperty, index + 1);
|
||||
SetCurrentValue(ValueProperty, newValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,12 +6,35 @@ using Avalonia.LogicalTree;
|
||||
|
||||
namespace Ursa.Controls;
|
||||
|
||||
[PseudoClasses(PC_Selected)]
|
||||
[TemplatePart(PART_IconGlyph, typeof(PathIcon))]
|
||||
[PseudoClasses(PC_Selected, PC_Half)]
|
||||
[TemplatePart(PART_IconGlyph, typeof(Control))]
|
||||
public class RatingCharacter : TemplatedControl
|
||||
{
|
||||
public const string PART_IconGlyph = "PART_IconGlyph";
|
||||
protected const string PC_Selected = ":selected";
|
||||
protected const string PC_Half = ":half";
|
||||
|
||||
private Control? _icon;
|
||||
|
||||
private bool _isHalf;
|
||||
|
||||
internal bool IsHalf
|
||||
{
|
||||
get => _isHalf;
|
||||
set
|
||||
{
|
||||
if (_isHalf == value) return;
|
||||
_isHalf = value;
|
||||
if (_icon is null) return;
|
||||
_icon.Width = value ? Bounds.Width / 2 : Bounds.Width;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
|
||||
{
|
||||
base.OnApplyTemplate(e);
|
||||
_icon = e.NameScope.Find<Control>(PART_IconGlyph);
|
||||
}
|
||||
|
||||
protected override void OnPointerEntered(PointerEventArgs e)
|
||||
{
|
||||
@@ -19,6 +42,27 @@ public class RatingCharacter : TemplatedControl
|
||||
parent?.Preview(this);
|
||||
}
|
||||
|
||||
protected override void OnPointerMoved(PointerEventArgs e)
|
||||
{
|
||||
var p = e.GetPosition(this);
|
||||
var flag = p.X < Bounds.Width / 2;
|
||||
PseudoClasses.Set(PC_Half, flag);
|
||||
IsHalf = flag;
|
||||
// if (flag)
|
||||
// {
|
||||
// _icon.Width = Bounds.Width / 2;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// _icon.Width = Bounds.Width;
|
||||
// }
|
||||
}
|
||||
|
||||
// protected override void OnPointerExited(PointerEventArgs e)
|
||||
// {
|
||||
// // _icon.Width = Bounds.Width;
|
||||
// }
|
||||
|
||||
protected override void OnPointerReleased(PointerReleasedEventArgs e)
|
||||
{
|
||||
var parent = this.GetLogicalAncestors().OfType<Rating>().FirstOrDefault();
|
||||
|
||||
Reference in New Issue
Block a user