Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 78 additions & 8 deletions CollapseLauncher/Classes/Extension/UIElementExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -762,32 +762,48 @@ internal static void SetPadding<TElement>(this TElement element, Thickness thick
}
}

internal static void SetBackground<TElement>(this TElement element, Brush brush)
#nullable enable
internal static Brush? GetBackground<TElement>(this TElement? element)
where TElement : FrameworkElement
{
if (element == null) return;
return element switch
{
Control control => control.Background,
Border border => border.Background,
Panel stackPanel => stackPanel.Background,
_ => null
};
}

internal static bool SetBackground<TElement>(this TElement? element, Brush? brush)
where TElement : FrameworkElement
{
if (element is null)
return false;

switch (element)
{
case Control control:
control.Background = brush;
break;
return true;
case Border border:
border.Background = brush;
break;
return true;
case Grid grid:
grid.Background = brush;
break;
return true;
case StackPanel stackPanel:
stackPanel.Background = brush;
break;
return true;
}

return false;
}

internal static void SetForeground<TElement>(this TElement element, Brush brush)
internal static void SetForeground<TElement>(this TElement? element, Brush? brush)
where TElement : FrameworkElement
{
if (element == null) return;
if (element is null) return;

switch (element)
{
Expand All @@ -799,6 +815,7 @@ internal static void SetForeground<TElement>(this TElement element, Brush brush)
break;
}
}
#nullable restore

internal static void SetOpacity<TElement>(this TElement element, double opacity)
where TElement : FrameworkElement => element.Opacity = opacity;
Expand Down Expand Up @@ -955,5 +972,58 @@ internal static void ApplyDropShadow(this FrameworkElement from, FrameworkElemen
};
Effects.SetShadow(from, shadow);
}

#nullable enable
private static IEnumerable<DependencyObject> VisualTreeHelperGetChildrenEnumerable(FrameworkElement? element)
{
if (element is null)
{
yield break;
}

int childCount = VisualTreeHelper.GetChildrenCount(element);
for (int index = 0; index < childCount; index++)
{
if (VisualTreeHelper.GetChild(element, index) is { } asReturn)
{
yield return asReturn;
}
}
}

internal static IEnumerable<DependencyObject> EnumerateElementChildren(this FrameworkElement? element)
{
if (element is Panel asPanel)
{
return asPanel.Children;
}

return VisualTreeHelperGetChildrenEnumerable(element);
}

internal static T? FindFirstDescendantByType<T>(this FrameworkElement element)
where T : UIElement
{
foreach (DependencyObject child in element.EnumerateElementChildren())
{
if (child is T asReturn)
{
return asReturn;
}
}

return null;
}

internal static IEnumerable<object> EnumerateSelectableElementChildren(this FrameworkElement? element)
{
StackPanel? stackPanel = element?.FindFirstDescendantByType<StackPanel>();
ItemsRepeater? itemsRepeater = stackPanel?.Children.OfType<ItemsRepeater>().FirstOrDefault();

foreach (var item in itemsRepeater.EnumerateElementChildren())
{
yield return item;
}
}
}
}
101 changes: 101 additions & 0 deletions CollapseLauncher/Classes/Helper/HighlightableControlProperty.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
using CollapseLauncher.Extension;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Documents;
using Microsoft.UI.Xaml.Media;
using System.Collections.Generic;
// ReSharper disable IdentifierTypo

#nullable enable
namespace CollapseLauncher.Helper
{
internal static class HighlightableControlPropertyExtension
{
internal static HighlightableControlProperty CreateHighlight(this FrameworkElement element, Brush? highlightBrush, Brush? highlightSelectedBrush)
=> HighlightableControlProperty.Create(element, highlightBrush, highlightSelectedBrush);
}

internal class HighlightableControlProperty
{
internal FrameworkElement? Element { get; }
private Brush? BackgroundHighlightBrush { get; }
private Brush? BackgroundHighlightSelectedBrush { get; }
private Brush? BackgroundOriginalBrush { get; }

internal IList<TextHighlighter>? ElementTextHighlighter { get; }
private Brush? TextHighlighterBackgroundHighlightBrush { get; }
private Brush? TextHighlighterBackgroundHighlightSelectedBrush { get; }

private HighlightableControlProperty(FrameworkElement element, Brush? highlightBrush, Brush? highlightSelectedBrush)
{
Element = element;

if (element is TextBlock textBlock)
{
ElementTextHighlighter = textBlock.TextHighlighters;
TextHighlighterBackgroundHighlightBrush = highlightBrush;
TextHighlighterBackgroundHighlightSelectedBrush = highlightSelectedBrush;
}
else
{
BackgroundHighlightBrush = highlightBrush;
BackgroundHighlightSelectedBrush = highlightSelectedBrush;
BackgroundOriginalBrush = element.GetBackground();
}
}

internal static HighlightableControlProperty Create(FrameworkElement element, Brush? highlightBrush, Brush? highlightSelectedBrush)
=> new(element, highlightBrush, highlightSelectedBrush);

internal void SetBrushHighlightElement()
{
SetBackground(Element is TextBlock ? TextHighlighterBackgroundHighlightBrush : BackgroundHighlightBrush);

if (Element is ComboBoxItem { Parent: ComboBox asComboBox })
{
asComboBox.IsDropDownOpen = false;
}
}

internal void SetBrushHighlightSelectElement()
{
SetBackground(Element is TextBlock ? TextHighlighterBackgroundHighlightSelectedBrush : BackgroundHighlightSelectedBrush);

if (Element is ComboBoxItem { Parent: ComboBox asComboBox })
{
asComboBox.IsDropDownOpen = true;
}
}

internal void ClearHighlight()
{
if (Element is TextBlock textBlock && textBlock.TextHighlighters.Count != 0)
{
textBlock.TextHighlighters.Clear();
return;
}

SetBackground(BackgroundOriginalBrush);
}

private void SetBackground(Brush? brush)
{
if (Element is TextBlock textBlock && textBlock.TextHighlighters.Count != 0)
{
foreach (TextHighlighter highlighter in textBlock.TextHighlighters)
{
highlighter.Background = brush;
}
List<TextHighlighter> reAddList = [.. textBlock.TextHighlighters];
textBlock.TextHighlighters.Clear();
foreach (TextHighlighter readdHighlighter in reAddList)
{
textBlock.TextHighlighters.Add(readdHighlighter);
}
return;
}

_ = Element?.SetBackground(brush);
}
}
}
Loading