mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-05 10:46:33 +02:00
[Run] Highlight search text (#11635)
* Add bolded type * Inline get set * Fix * Update expect.txt IMulti Co-authored-by: Niels Laute <niels9001@hotmail.com> Co-authored-by: Clint Rutkas <clint@rutkas.com>
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
// Copyright (c) Microsoft Corporation
|
||||
// The Microsoft Corporation licenses this file to you under the MIT license.
|
||||
// See the LICENSE file in the project root for more information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace PowerLauncher.Converters
|
||||
{
|
||||
public class HighlightTextConverter : IMultiValueConverter
|
||||
{
|
||||
public object Convert(object[] value, Type targetType, object parameter, CultureInfo cultureInfo)
|
||||
{
|
||||
#pragma warning disable CA1062 // Validate arguments of public methods
|
||||
var text = value[0] as string;
|
||||
#pragma warning restore CA1062 // Validate arguments of public methods
|
||||
var highlightData = value[1] as List<int>;
|
||||
var selected = value[2] as bool? == true;
|
||||
|
||||
if (highlightData == null || !highlightData.Any())
|
||||
{
|
||||
// No highlight data, just return the text
|
||||
return new Run(text);
|
||||
}
|
||||
|
||||
var textBlock = new Span();
|
||||
for (var i = 0; i < text.Length; i++)
|
||||
{
|
||||
var currentCharacter = text.Substring(i, 1);
|
||||
if (ShouldHighlight(highlightData, i))
|
||||
{
|
||||
textBlock.Inlines.Add(new Run(currentCharacter)
|
||||
{
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
textBlock.Inlines.Add(new Run(currentCharacter));
|
||||
}
|
||||
}
|
||||
|
||||
return textBlock;
|
||||
}
|
||||
|
||||
public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return new[] { DependencyProperty.UnsetValue, DependencyProperty.UnsetValue };
|
||||
}
|
||||
|
||||
private static bool ShouldHighlight(List<int> highlightData, int index)
|
||||
{
|
||||
return highlightData.Contains(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,13 +6,18 @@
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:Behaviors="http://schemas.microsoft.com/xaml/behaviors"
|
||||
xmlns:p="clr-namespace:PowerLauncher.Properties"
|
||||
mc:Ignorable="d"
|
||||
xmlns:helper="clr-namespace:PowerLauncher.Helper"
|
||||
xmlns:converters="clr-namespace:PowerLauncher.Converters"
|
||||
xmlns:viewmodel="clr-namespace:PowerLauncher.ViewModel"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="300"
|
||||
d:DesignWidth="720">
|
||||
|
||||
<UserControl.Resources>
|
||||
<ResourceDictionary>
|
||||
|
||||
<ResourceDictionary>
|
||||
<converters:HighlightTextConverter x:Key="highlightTextConverter" />
|
||||
|
||||
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
|
||||
<Style x:Key="FocusVisual">
|
||||
<Setter Property="Control.Template">
|
||||
@@ -226,14 +231,21 @@
|
||||
Margin="-6,-2,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Source="{Binding Image}" />
|
||||
<TextBlock
|
||||
AutomationProperties.Name="{x:Static p:Resources.Title}"
|
||||
x:Name="Title" Grid.Column="1"
|
||||
Text="{Binding Result.Title}"
|
||||
FontWeight="SemiBold"
|
||||
FontSize="20"
|
||||
Margin="0,0,0,-2"
|
||||
VerticalAlignment="Bottom"/>
|
||||
<TextBlock AutomationProperties.Name="{x:Static p:Resources.Title}"
|
||||
x:Name="Title"
|
||||
Grid.Column="1"
|
||||
FontSize="20"
|
||||
Margin="0,0,0,-2"
|
||||
VerticalAlignment="Bottom">
|
||||
<viewmodel:ResultsViewModel.FormattedText>
|
||||
<MultiBinding Converter="{StaticResource highlightTextConverter}">
|
||||
<Binding Path="Result.Title" />
|
||||
<Binding Path="Result.TitleHighlightData" />
|
||||
<Binding RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type ListViewItem}}"
|
||||
Path="IsSelected" />
|
||||
</MultiBinding>
|
||||
</viewmodel:ResultsViewModel.FormattedText>
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
AutomationProperties.Name="{x:Static p:Resources.Subtitle}"
|
||||
x:Name="Path"
|
||||
|
||||
Reference in New Issue
Block a user