Skip to content

Commit

Permalink
[Run] Highlight search text (#11635)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
3 people committed Jun 8, 2021
1 parent 55b6fb8 commit 884a313
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 33 deletions.
1 change: 1 addition & 0 deletions .github/actions/spell-check/expect.txt
Original file line number Diff line number Diff line change
Expand Up @@ -845,6 +845,7 @@ IMoniker
IMonitor
IMouse
impl
IMulti
INDEXTOSTATEIMAGEMASK
indierawk
Infobar
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ public Result Result(string query, string queryArguments, IPublicAPI api)

// To set the title to always be the displayname of the packaged application
result.Title = DisplayName;
result.SetTitleHighlightData(StringMatcher.FuzzySearch(query, Name).MatchData);
result.TitleHighlightData = StringMatcher.FuzzySearch(query, Name).MatchData;

// Using CurrentCulture since this is user facing
var toolTipTitle = string.Format(CultureInfo.CurrentCulture, "{0}: {1}", Properties.Resources.powertoys_run_plugin_program_file_name, result.Title);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ public Result Result(string query, string queryArguments, IPublicAPI api)
},
};

result.SetTitleHighlightData(StringMatcher.FuzzySearch(query, Name).MatchData);
result.TitleHighlightData = StringMatcher.FuzzySearch(query, Name).MatchData;

// Using CurrentCulture since this is user facing
var toolTipTitle = string.Format(CultureInfo.CurrentCulture, "{0}: {1}", Properties.Resources.powertoys_run_plugin_program_file_name, result.Title);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public List<Result> Query(Query query)
if (titleMatch.Score > 0)
{
c.Score = titleMatch.Score;
c.SetTitleHighlightData(titleMatch.MatchData);
c.TitleHighlightData = titleMatch.MatchData;
results.Add(c);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
32 changes: 22 additions & 10 deletions src/modules/launcher/PowerLauncher/ResultList.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -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">
Expand Down Expand Up @@ -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"
Expand Down
29 changes: 9 additions & 20 deletions src/modules/launcher/Wox.Plugin/Result.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ public class Result
private ToolTipData _toolTipData;
private string _pluginDirectory;
private string _icoPath;
private IList<int> _titleHighlightData;

public string Title
{
Expand Down Expand Up @@ -103,30 +102,20 @@ public string IcoPath

public Result(IList<int> titleHighlightData = null, IList<int> subTitleHighlightData = null)
{
_titleHighlightData = titleHighlightData;
TitleHighlightData = titleHighlightData;
SubTitleHighlightData = subTitleHighlightData;
}

/// <summary>
/// Gets a list of indexes for the characters to be highlighted in Title
/// </summary>
public IList<int> GetTitleHighlightData()
{
return _titleHighlightData;
}

/// <summary>
/// Sets a list of indexes for the characters to be highlighted in Title
/// </summary>
public void SetTitleHighlightData(IList<int> value)
{
_titleHighlightData = value;
}
#pragma warning disable CA2227 // Collection properties should be read only
public IList<int> TitleHighlightData { get; set; }
#pragma warning restore CA2227 // Collection properties should be read only

/// <summary>
/// Gets a list of indexes for the characters to be highlighted in SubTitle
/// Gets or sets a list of indexes for the characters to be highlighted in SubTitle
/// </summary>
public IList<int> SubTitleHighlightData { get; private set; }
#pragma warning disable CA2227 // Collection properties should be read only
public IList<int> SubTitleHighlightData { get; set; }
#pragma warning restore CA2227 // Collection properties should be read only

/// <summary>
/// Gets or sets only results that originQuery match with current query will be displayed in the panel
Expand Down Expand Up @@ -161,7 +150,7 @@ public override bool Equals(object obj)
var equality = string.Equals(r?.Title, Title, StringComparison.Ordinal) &&
string.Equals(r?.SubTitle, SubTitle, StringComparison.Ordinal) &&
string.Equals(r?.IcoPath, IcoPath, StringComparison.Ordinal) &&
GetTitleHighlightData() == r.GetTitleHighlightData() &&
TitleHighlightData == r.TitleHighlightData &&
SubTitleHighlightData == r.SubTitleHighlightData;

return equality;
Expand Down

0 comments on commit 884a313

Please sign in to comment.