Welcome to mirror list, hosted at ThFree Co, Russian Federation.

ButtonWithIcon.cs « Controls « UVtools.WPF - github.com/sn4k3/UVtools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 576df3ae4fee54f841a347cc4950a43a1d12331e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
 *                     GNU AFFERO GENERAL PUBLIC LICENSE
 *                       Version 3, 19 November 2007
 *  Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 *  Everyone is permitted to copy and distribute verbatim copies
 *  of this license document, but changing it is not allowed.
 */
using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Layout;
using Avalonia.Styling;
using Avalonia.Threading;
using JetBrains.Annotations;

namespace UVtools.WPF.Controls;

public class ButtonWithIcon : Button, IStyleable
{
    public enum IconPlacementType : byte
    {
        Left,
        Right,
        Top,
        Bottom
    }

    Type IStyleable.StyleKey => typeof(Button);

    public static readonly StyledProperty<string> TextProperty =
        AvaloniaProperty.Register<ButtonWithIcon, string>(nameof(Text));

    public string Text
    {
        get => GetValue(TextProperty);
        set => SetValue(TextProperty, value);
    }

    public static readonly StyledProperty<IconPlacementType> IconPlacementProperty =
        AvaloniaProperty.Register<ButtonWithIcon, IconPlacementType>(nameof(IconPlacement));

    public IconPlacementType IconPlacement
    {
        get => GetValue(IconPlacementProperty);
        set => SetValue(IconPlacementProperty, value);
    }

    public static readonly StyledProperty<string?> IconProperty =
        AvaloniaProperty.Register<ButtonWithIcon, string?>(nameof(Icon));

    [CanBeNull]
    public string Icon
    {
        get => GetValue(IconProperty);
        set => SetValue(IconProperty, value);
    }

    public static readonly StyledProperty<double> SpacingProperty =
        AvaloniaProperty.Register<ButtonWithIcon, double>(nameof(Spacing), 10);

    public double Spacing
    {
        get => GetValue(SpacingProperty);
        set => SetValue(SpacingProperty, value);
    }

    public ButtonWithIcon()
    {
    }

    protected override void OnInitialized()
    {
        base.OnInitialized();

        Dispatcher.UIThread.Post(() =>
        {
            TextProperty.Changed.Subscribe(_ => RebuildContent());
            IconProperty.Changed.Subscribe(_ => RebuildContent());
            IconPlacementProperty.Changed.Subscribe(_ => RebuildContent());
            RebuildContent();
        }, DispatcherPriority.Loaded);
    }

    public IControl MakeIcon()
    {
        return new Projektanker.Icons.Avalonia.Icon { Value = Icon };
    }

    private void RebuildContent()
    {
        if (string.IsNullOrWhiteSpace(Icon))
        {
            if (!string.IsNullOrWhiteSpace(Text))
            {
                Content = Text;
            }
            return;
        }

        if (string.IsNullOrWhiteSpace(Text))
        {
            if (!string.IsNullOrWhiteSpace(Icon))
            {
                Content = MakeIcon();
            }

            return;
        }

        var panel = new StackPanel
        {
            Spacing = Spacing,
            VerticalAlignment = VerticalAlignment.Stretch,
            Orientation = IconPlacement is IconPlacementType.Left or IconPlacementType.Right 
                ? Orientation.Horizontal
                : Orientation.Vertical
        };

        if(IconPlacement is IconPlacementType.Left or IconPlacementType.Top) panel.Children.Add(MakeIcon());
        panel.Children.Add(new TextBlock{ VerticalAlignment = VerticalAlignment.Center, Text = Text});
        if (IconPlacement is IconPlacementType.Right or IconPlacementType.Bottom) panel.Children.Add(MakeIcon());

        Content = panel;
    }
}