Skip to content

Commit c248683

Browse files
committed
Merge branch 'mdta-ThemedIcon-ToggleFix' of https://github.com/mdtauk/Files into mdta-ThemedIcon-ToggleFix
2 parents 64b612f + 188216f commit c248683

File tree

7 files changed

+677
-105
lines changed

7 files changed

+677
-105
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright (c) 2024 Files Community
2+
// Licensed under the MIT License. See the LICENSE.
3+
4+
namespace Files.App.Controls
5+
{
6+
/// <summary>
7+
/// Defines IconTypes for <see cref="ThemedIcon"/>.
8+
/// </summary>
9+
public enum ToggleBehaviors
10+
{
11+
/// <summary>
12+
/// Toggle Behavior type of <see cref="ThemedIcon"/> is Auto.
13+
/// </summary>
14+
Auto,
15+
16+
/// <summary>
17+
/// Toggle Behavior type of <see cref="ThemedIcon"/> is On.
18+
/// </summary>
19+
On,
20+
21+
/// <summary>
22+
/// Toggle Behavior type of <see cref="ThemedIcon"/> is Off.
23+
/// </summary>
24+
Off,
25+
}
26+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright (c) 2024 Files Community
2+
// Licensed under the MIT License. See the LICENSE.
3+
4+
using Microsoft.UI.Xaml;
5+
using Microsoft.UI.Xaml.Controls;
6+
using CommunityToolkit.WinUI.UI;
7+
using Microsoft.UI.Xaml.Controls.Primitives;
8+
9+
namespace Files.App.Controls
10+
{
11+
public partial class ThemedIcon
12+
{
13+
private bool _isOwnerToggled;
14+
private bool _isOwnerEnabled;
15+
16+
private Control? ownerControl = null;
17+
private ToggleButton? ownerToggleButton = null;
18+
19+
private void FindOwnerControlStates()
20+
{
21+
if (this.FindAscendant<ToggleButton>() is ToggleButton toggleButton)
22+
{
23+
ownerToggleButton = toggleButton;
24+
25+
// IsChecked/IsToggled change aware
26+
ownerToggleButton.Checked += OwnerControl_IsCheckedChanged;
27+
ownerToggleButton.Unchecked += OwnerControl_IsCheckedChanged;
28+
_isOwnerToggled = ownerToggleButton.IsChecked is true;
29+
}
30+
31+
if (this.FindAscendant<Control>() is Control control)
32+
{
33+
ownerControl = control;
34+
35+
// IsEnabled change aware
36+
ownerControl.IsEnabledChanged += OwnerControl_IsEnabledChanged;
37+
_isOwnerEnabled = ownerControl.IsEnabled;
38+
39+
UpdateVisualStates();
40+
}
41+
}
42+
43+
private void OwnerControl_IsCheckedChanged(object sender, RoutedEventArgs e)
44+
{
45+
if (ownerToggleButton is null)
46+
return;
47+
48+
_isOwnerToggled = ownerToggleButton.IsChecked is true;
49+
UpdateVisualStates();
50+
51+
}
52+
53+
private void OwnerControl_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
54+
{
55+
if (ownerControl is null)
56+
return;
57+
58+
_isOwnerEnabled = ownerControl.IsEnabled;
59+
UpdateVisualStates();
60+
}
61+
}
62+
}

src/Files.App.Controls/ThemedIcon/ThemedIcon.cs

Lines changed: 23 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -95,39 +95,14 @@ private void OnLayeredIconChanged()
9595

9696
private void OnIconTypeChanged()
9797
{
98-
// Handles changes to the IconType and setting the correct Visual States.
99-
100-
// If ToggleBehavior is Auto, we check for _ownerToggle
101-
if (ToggleBehavior == ToggleBehaviors.Auto)
98+
if (ToggleBehavior is ToggleBehaviors.Auto or ToggleBehaviors.Off)
10299
{
103-
if (_isOwnerToggled is true || IsFilled is true)
100+
if (ToggleBehavior is ToggleBehaviors.Auto && (_isOwnerToggled is true || IsFilled is true))
104101
{
105102
VisualStateManager.GoToState(this, FilledTypeStateName, true);
106103
return;
107104
}
108-
else if (IsHighContrast is true || _isOwnerEnabled is false || IsEnabled is false)
109-
{
110-
VisualStateManager.GoToState(this, OutlineTypeStateName, true);
111-
VisualStateManager.GoToState(this, DisabledStateName, true);
112-
return;
113-
}
114-
else
115-
{
116-
VisualStateManager.GoToState(
117-
this,
118-
IconType is ThemedIconTypes.Layered ? LayeredTypeStateName : OutlineTypeStateName,
119-
true);
120-
}
121-
}
122-
// If ToggleBehavior is On, we only go to Filled.
123-
else if (ToggleBehavior == ToggleBehaviors.On)
124-
{
125-
VisualStateManager.GoToState(this, FilledTypeStateName, true);
126-
}
127-
// For Off, we don't respond to _ownerToggle at all
128-
else
129-
{
130-
if (IsFilled is true)
105+
if (ToggleBehavior is ToggleBehaviors.Off && IsFilled is true)
131106
{
132107
VisualStateManager.GoToState(this, FilledTypeStateName, true);
133108
return;
@@ -146,49 +121,27 @@ private void OnIconTypeChanged()
146121
true);
147122
}
148123
}
124+
else if (ToggleBehavior is ToggleBehaviors.On)
125+
{
126+
VisualStateManager.GoToState(this, FilledTypeStateName, true);
127+
}
149128

150129
VisualStateManager.GoToState(this, EnabledStateName, true);
151130
}
152131

153132
private void OnIconColorTypeChanged()
154133
{
155-
// Handles changes to the IconColorType and setting the correct Visual States.
156-
157-
// First we check the enabled state
158-
if (_isOwnerEnabled is false || IsEnabled is false)
134+
if (_isOwnerEnabled || IsEnabled)
159135
{
160-
// If ToggleBehavior is Auto and _ownerToggled is true
161-
if (ToggleBehavior == ToggleBehaviors.Auto && _isOwnerToggled is true)
162-
{
163-
VisualStateManager.GoToState(this, DisabledToggleColorStateName, true);
164-
}
165-
// If ToggleBehavior is On
166-
else if (ToggleBehavior == ToggleBehaviors.On)
167-
{
168-
VisualStateManager.GoToState(this, DisabledToggleColorStateName, true);
169-
}
170-
// everything else uses Disabled Color
171-
else
172-
{
173-
VisualStateManager.GoToState(this, DisabledColorStateName, true);
174-
}
175-
}
176-
// Everything else is Enabled
177-
else
178-
{
179-
// If ToggleBehavior is Auto and _ownerToggled is true
180-
if (ToggleBehavior == ToggleBehaviors.Auto && _isOwnerToggled is true)
181-
{
182-
VisualStateManager.GoToState(this, ToggleStateName, true);
183-
}
184-
// If ToggleBehavior is On
185-
else if (ToggleBehavior == ToggleBehaviors.On)
136+
if ((ToggleBehavior is ToggleBehaviors.Auto && _isOwnerToggled) ||
137+
ToggleBehavior is ToggleBehaviors.On)
186138
{
139+
// Toggle
187140
VisualStateManager.GoToState(this, ToggleStateName, true);
188141
}
189-
// everything else uses the appropriate color state
190142
else
191143
{
144+
// Use colorful ones
192145
VisualStateManager.GoToState(
193146
this,
194147
IconColorType switch
@@ -204,11 +157,20 @@ private void OnIconColorTypeChanged()
204157
true);
205158
}
206159

160+
// Update layered icon color
207161
if (GetTemplateChild(LayeredPathCanvas) is Canvas canvas)
208-
{
209162
foreach (var layer in canvas.Children.Cast<ThemedIconLayer>())
210163
layer.IconColorType = IconColorType;
211-
}
164+
}
165+
else
166+
{
167+
// Disable + toggle
168+
if ((ToggleBehavior is ToggleBehaviors.Auto && _isOwnerToggled is true) ||
169+
ToggleBehavior is ToggleBehaviors.On)
170+
VisualStateManager.GoToState(this, DisabledToggleColorStateName, true);
171+
// Disable
172+
else
173+
VisualStateManager.GoToState(this, DisabledColorStateName, true);
212174
}
213175
}
214176

0 commit comments

Comments
 (0)