Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
d2f8663
feat(search): add unicode character removal for fuzzy matching
4yinn Mar 15, 2026
03164fb
Fix typos
Jack251970 Mar 15, 2026
f905530
Check query nullability
Jack251970 Mar 15, 2026
17b2970
feat: add accent normalization with optimized memory usage and toggle…
4yinn Mar 27, 2026
0588fa6
Merge branch 'feature/4149-diacritics-insensitive-search' of https://…
4yinn Mar 27, 2026
c270c9d
feat: add restart button when toggling Sensitive Accents
4yinn Mar 28, 2026
6dfb208
feat: add translations for more languages
4yinn Mar 28, 2026
0059f3e
remove empty space
4yinn Mar 28, 2026
352fdc7
Revert "feat: add translations for more languages"
4yinn Mar 28, 2026
bb10b1f
refactor: remove translations
4yinn Mar 28, 2026
99e7810
refactor: rename to IgnoreAccents for better clarity
4yinn Mar 28, 2026
56973ed
fix: update tests
4yinn Mar 28, 2026
b6028dc
fix: remove emptyspace
4yinn Mar 28, 2026
a52a6af
feat: optimize and stabilize string normalization in StringMatcher
4yinn Mar 28, 2026
839b978
Revert "feat: optimize and stabilize string normalization in StringMa…
4yinn Mar 28, 2026
c2df52e
feat: optimize and stabilize string normalization in StringMatcher
4yinn Mar 28, 2026
99f2b3b
Merge branch 'dev' into feature/4149-diacritics-insensitive-search
4yinn Mar 28, 2026
54a458d
test: provide Settings via constructor for StringMatcher in tests
4yinn Mar 28, 2026
2c53648
refactor: adjust IgnoreAccents handling logic in StringMatcher
4yinn Mar 30, 2026
52bb34f
feat: translate text to English
4yinn Mar 30, 2026
0559145
refactor: replace IPublicApi instance calls with App.API
4yinn Mar 30, 2026
7732442
Refactor: Improved code readability and clarity
4yinn Mar 31, 2026
b7bd1cc
Improve code quality
Jack251970 Mar 31, 2026
2228633
Reorder "Ignore Accents" settings card and InfoBar
Jack251970 Mar 31, 2026
4cbe223
Update ignoreAccents text to refer to all results
Jack251970 Mar 31, 2026
c945d08
Update StringMatcher to react to QuerySearchPrecision changes
Jack251970 Apr 3, 2026
e0f7722
Add StringMatcherBehaviorChanged event to Settings
Jack251970 Apr 3, 2026
459a369
feat: remove btn restart
4yinn Apr 3, 2026
0228f7a
Update ignoreAccents tooltip and add UpdateApp method
Jack251970 Apr 3, 2026
7607844
Add icon to "Ignore Accents" SettingsCard
Jack251970 Apr 4, 2026
2ab6405
feat: add more characters to support additional languages
4yinn Apr 7, 2026
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
69 changes: 54 additions & 15 deletions Flow.Launcher.Infrastructure/StringMatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@
using Flow.Launcher.Plugin.SharedModels;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using Flow.Launcher.Infrastructure.UserSettings;

namespace Flow.Launcher.Infrastructure
{
public class StringMatcher
{
private readonly MatchOption _defaultMatchOption = new();

private readonly Settings _settings;
public SearchPrecisionScore UserSettingSearchPrecision { get; set; }

private readonly IAlphabet _alphabet;
Expand All @@ -19,6 +21,7 @@
{
_alphabet = alphabet;
UserSettingSearchPrecision = settings.QuerySearchPrecision;
_settings = settings;
}

// This is a workaround to allow unit tests to set the instance
Expand All @@ -41,7 +44,7 @@
/// Current method has two parts, Acronym Match and Fuzzy Search:
///
/// Acronym Match:
/// Charater listed below will be considered as acronym

Check warning on line 47 in Flow.Launcher.Infrastructure/StringMatcher.cs

View workflow job for this annotation

GitHub Actions / Check Spelling

`Charater` is not a recognized word. (unrecognized-spelling)
/// 1. Character on index 0
/// 2. Character appears after a space
/// 3. Character that is UpperCase
Expand Down Expand Up @@ -80,10 +83,16 @@
int acronymsTotalCount = 0;
int acronymsMatched = 0;

var fullStringToCompareAndNormalize = opt.IgnoreCase ? Normalize(stringToCompare) : stringToCompare;
Comment thread
Jack251970 marked this conversation as resolved.
Outdated
var queryWithoutCaseAndNormalize = opt.IgnoreCase ? Normalize(query) : query;

var fullStringToCompareWithoutCase = opt.IgnoreCase ? stringToCompare.ToLower() : stringToCompare;
var queryWithoutCase = opt.IgnoreCase ? query.ToLower() : query;

var querySubstrings = queryWithoutCase.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var fullStringToCompare = _settings.SensitiveAccents ? fullStringToCompareAndNormalize : fullStringToCompareWithoutCase;
var queryToCompare = _settings.SensitiveAccents ? queryWithoutCaseAndNormalize : queryWithoutCase;
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

var querySubstrings = queryToCompare.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
int currentQuerySubstringIndex = 0;
var currentQuerySubstring = querySubstrings[currentQuerySubstringIndex];
var currentQuerySubstringCharacterIndex = 0;
Expand All @@ -98,7 +107,9 @@
var indexList = new List<int>();
List<int> spaceIndices = new List<int>();

for (var compareStringIndex = 0; compareStringIndex < fullStringToCompareWithoutCase.Length; compareStringIndex++)
for (var compareStringIndex = 0;
compareStringIndex < fullStringToCompare.Length;
compareStringIndex++)
{
// If acronyms matching successfully finished, this gets the remaining not matched acronyms for score calculation
if (currentAcronymQueryIndex >= query.Length && acronymsMatched == query.Length)
Expand All @@ -114,14 +125,14 @@

// To maintain a list of indices which correspond to spaces in the string to compare
// To populate the list only for the first query substring
if (fullStringToCompareWithoutCase[compareStringIndex] == ' ' && currentQuerySubstringIndex == 0)
if (fullStringToCompare[compareStringIndex] == ' ' && currentQuerySubstringIndex == 0)
spaceIndices.Add(compareStringIndex);

// Acronym Match
if (IsAcronym(stringToCompare, compareStringIndex))
{
if (fullStringToCompareWithoutCase[compareStringIndex] ==
queryWithoutCase[currentAcronymQueryIndex])
if (fullStringToCompare[compareStringIndex] ==
queryToCompare[currentAcronymQueryIndex])
{
acronymMatchData.Add(compareStringIndex);
acronymsMatched++;
Expand All @@ -133,7 +144,7 @@
if (IsAcronymCount(stringToCompare, compareStringIndex))
acronymsTotalCount++;

if (allQuerySubstringsMatched || fullStringToCompareWithoutCase[compareStringIndex] !=
if (allQuerySubstringsMatched || fullStringToCompare[compareStringIndex] !=
currentQuerySubstring[currentQuerySubstringCharacterIndex])
{
matchFoundInPreviousLoop = false;
Expand All @@ -160,7 +171,7 @@
var startIndexToVerify = compareStringIndex - currentQuerySubstringCharacterIndex;

if (AllPreviousCharsMatched(startIndexToVerify, currentQuerySubstringCharacterIndex,
fullStringToCompareWithoutCase, currentQuerySubstring))
fullStringToCompare, currentQuerySubstring))
{
matchFoundInPreviousLoop = true;

Expand Down Expand Up @@ -205,7 +216,8 @@

if (acronymScore >= (int)UserSettingSearchPrecision)
{
acronymMatchData = acronymMatchData.Select(x => translationMapping?.MapToOriginalIndex(x) ?? x).Distinct().ToList();
acronymMatchData = acronymMatchData.Select(x => translationMapping?.MapToOriginalIndex(x) ?? x)
.Distinct().ToList();
return new MatchResult(true, UserSettingSearchPrecision, acronymMatchData, acronymScore);
}
}
Expand All @@ -218,19 +230,45 @@
// firstMatchIndex - nearestSpaceIndex - 1 is to set the firstIndex as the index of the first matched char
// preceded by a space e.g. 'world' matching 'hello world' firstIndex would be 0 not 6
// giving more weight than 'we or donald' by allowing the distance calculation to treat the starting position at after the space.
var score = CalculateSearchScore(query, stringToCompare, firstMatchIndex - nearestSpaceIndex - 1, spaceIndices,
var score = CalculateSearchScore(query, stringToCompare, firstMatchIndex - nearestSpaceIndex - 1,
spaceIndices,
lastMatchIndex - firstMatchIndex, allSubstringsContainedInCompareString);

var resultList = indexList.Select(x => translationMapping?.MapToOriginalIndex(x) ?? x).Distinct().ToList();
var resultList = indexList.Select(x => translationMapping?.MapToOriginalIndex(x) ?? x).Distinct()
.ToList();
return new MatchResult(true, UserSettingSearchPrecision, resultList, score);
}

return new MatchResult(false, UserSettingSearchPrecision);
}


private static readonly Dictionary<char, char> AccentMap = new()
{
['á'] = 'a', ['à'] = 'a', ['ã'] = 'a', ['â'] = 'a', ['ä'] = 'a', ['å'] = 'a',
['é'] = 'e', ['è'] = 'e', ['ê'] = 'e', ['ë'] = 'e',
['í'] = 'i', ['ì'] = 'i', ['î'] = 'i', ['ï'] = 'i',
['ó'] = 'o', ['ò'] = 'o', ['õ'] = 'o', ['ô'] = 'o', ['ö'] = 'o',
['ú'] = 'u', ['ù'] = 'u', ['û'] = 'u', ['ü'] = 'u',
['ç'] = 'c',
['ñ'] = 'n',
['ý'] = 'y', ['ÿ'] = 'y'
};
public static string Normalize(string value)
{
Span<char> buffer = stackalloc char[value.Length];
for (int i = 0; i < value.Length; i++)
{
var c = char.ToLowerInvariant(value[i]);
buffer[i] = AccentMap.TryGetValue(c, out var mapped) ? mapped : c;
}

return new string(buffer);
}
private static bool IsAcronym(string stringToCompare, int compareStringIndex)
{
if (IsAcronymChar(stringToCompare, compareStringIndex) || IsAcronymNumber(stringToCompare, compareStringIndex))
if (IsAcronymChar(stringToCompare, compareStringIndex) ||
IsAcronymNumber(stringToCompare, compareStringIndex))
return true;

return false;
Expand All @@ -256,7 +294,7 @@
private static bool IsAcronymNumber(string stringToCompare, int compareStringIndex)
=> stringToCompare[compareStringIndex] >= 0 && stringToCompare[compareStringIndex] <= 9;

// To get the index of the closest space which preceeds the first matching index

Check warning on line 297 in Flow.Launcher.Infrastructure/StringMatcher.cs

View workflow job for this annotation

GitHub Actions / Check Spelling

`preceeds` is not a recognized word. (unrecognized-spelling)
private static int CalculateClosestSpaceIndex(List<int> spaceIndices, int firstMatchIndex)
{
var closestSpaceIndex = -1;
Expand All @@ -274,12 +312,12 @@
}

private static bool AllPreviousCharsMatched(int startIndexToVerify, int currentQuerySubstringCharacterIndex,
string fullStringToCompareWithoutCase, string currentQuerySubstring)
string fullStringToCompare, string currentQuerySubstring)
{
var allMatch = true;
for (int indexToCheck = 0; indexToCheck < currentQuerySubstringCharacterIndex; indexToCheck++)
{
if (fullStringToCompareWithoutCase[startIndexToVerify + indexToCheck] !=
if (fullStringToCompare[startIndexToVerify + indexToCheck] !=
currentQuerySubstring[indexToCheck])
{
allMatch = false;
Expand Down Expand Up @@ -312,7 +350,8 @@
return currentQuerySubstringIndex >= querySubstringsLength;
}

private static int CalculateSearchScore(string query, string stringToCompare, int firstIndex, List<int> spaceIndices, int matchLen,
private static int CalculateSearchScore(string query, string stringToCompare, int firstIndex,
List<int> spaceIndices, int matchLen,
bool allSubstringsContainedInCompareString)
{
// A match found near the beginning of a string is scored more than a match found near the end
Expand Down Expand Up @@ -341,7 +380,7 @@
if (allSubstringsContainedInCompareString)
{
int count = query.Count(c => !char.IsWhiteSpace(c));
//10 per char is too much for long query strings, this threshhold is to avoid where long strings will override the other results too much

Check warning on line 383 in Flow.Launcher.Infrastructure/StringMatcher.cs

View workflow job for this annotation

GitHub Actions / Check Spelling

`threshhold` is not a recognized word. (unrecognized-spelling)
int threshold = 4;
if (count <= threshold)
{
Expand Down
14 changes: 14 additions & 0 deletions Flow.Launcher.Infrastructure/UserSettings/Settings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,20 @@ public bool ShouldUsePinyin
}
}

private bool _sensitiveAccents = false;
public bool SensitiveAccents
{
get => _sensitiveAccents;
set
{
if (_sensitiveAccents != value)
{
_sensitiveAccents = value;
OnPropertyChanged();
}
}
}

private bool _useDoublePinyin = false;
public bool UseDoublePinyin
{
Expand Down
5 changes: 5 additions & 0 deletions Flow.Launcher/Languages/en.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<system:String x:Key="restartToDisablePortableMode">Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept</system:String>
<system:String x:Key="restartToEnablePortableMode">Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept</system:String>
<system:String x:Key="moveToDifferentLocation">Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?</system:String>
<system:String x:Key="shortcutsUninstallerCreated">Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created</system:String>

Check warning on line 25 in Flow.Launcher/Languages/en.xaml

View workflow job for this annotation

GitHub Actions / Check Spelling

`uninstaller` is not a recognized word. (unrecognized-spelling)
<system:String x:Key="userDataDuplicated">Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.</system:String>

<!-- Plugin Loader -->
Expand Down Expand Up @@ -81,8 +81,8 @@
<system:String x:Key="useLogonTaskForStartupTooltip">After uninstallation, you need to manually remove this task (Flow.Launcher Startup) via Task Scheduler</system:String>
<system:String x:Key="setAutoStartFailed">Error setting launch on startup</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Hide Flow Launcher when focus is lost</system:String>
<system:String x:Key="showTaskbarWhenOpened">Show taskbar when Flow Launcher is opened</system:String>

Check warning on line 84 in Flow.Launcher/Languages/en.xaml

View workflow job for this annotation

GitHub Actions / Check Spelling

`taskbar` is not a recognized word. (unrecognized-spelling)
<system:String x:Key="showTaskbarWhenOpenedToolTip">Temporarily show the taskbar when Flow Launcher is opened, useful for auto-hidden taskbars.</system:String>

Check warning on line 85 in Flow.Launcher/Languages/en.xaml

View workflow job for this annotation

GitHub Actions / Check Spelling

`taskbars` is not a recognized word. (unrecognized-spelling)

Check warning on line 85 in Flow.Launcher/Languages/en.xaml

View workflow job for this annotation

GitHub Actions / Check Spelling

`taskbar` is not a recognized word. (unrecognized-spelling)
<system:String x:Key="dontPromptUpdateMsg">Do not show new version notifications</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String>
Expand Down Expand Up @@ -123,6 +123,11 @@
<system:String x:Key="select">Select</system:String>
<system:String x:Key="hideOnStartup">Hide Flow Launcher on startup</system:String>
<system:String x:Key="hideOnStartupToolTip">Flow Launcher search window is hidden in the tray after starting up.</system:String>
<system:String x:Key="sensitiveAccent">Enable accent sensitivity when searching for programs.</system:String>
<system:String x:Key="sensitiveAccentToolTip">When this option is changed, a restart is required. When enabled, you will be able to find programs that contain accented characters more easily.</system:String>
<system:String x:Key="sensitiveAccentRestartTitle">Restart Required</system:String>
<system:String x:Key="sensitiveAccentRestartMessage">Changing accent sensitivity requires a restart of Flow Launcher to take effect.</system:String>
<system:String x:Key="sensitiveAccentRestartButton">Restart Now</system:String>
<system:String x:Key="hideNotifyIcon">Hide tray icon</system:String>
<system:String x:Key="hideNotifyIconToolTip">When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.</system:String>
<system:String x:Key="querySearchPrecision">Query Search Precision</system:String>
Expand Down
7 changes: 6 additions & 1 deletion Flow.Launcher/Languages/pt-br.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -114,13 +114,18 @@
<system:String x:Key="nodeFilePath">Caminho do Node.js</system:String>
<system:String x:Key="selectNodeExecutable">Selecione o executável do Node.js</system:String>
<system:String x:Key="selectPythonExecutable">Por favor, selecione pythonw.exe</system:String>
<system:String x:Key="typingStartEn">Sempre Começar Digitando em Modo Inglês</system:String>
<system:String x:Key="typingStartEn">Sempre Começar Digitando em Modo Inglês</system:String>
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
<system:String x:Key="typingStartEnTooltip">Temporariamente altere seu método de entrada para o Modo Inglês ao ativar o Flow.</system:String>
<system:String x:Key="autoUpdates">Atualizar Automaticamente</system:String>
<system:String x:Key="autoUpdatesTooltip">Automatically check and update the app when available</system:String>
<system:String x:Key="select">Selecionar</system:String>
<system:String x:Key="hideOnStartup">Esconder Flow Launcher na inicialização</system:String>
<system:String x:Key="hideOnStartupToolTip">Flow Launcher search window is hidden in the tray after starting up.</system:String>
<system:String x:Key="sensitiveAccent">Ativar a distinção de acentuação na consulta de programas.</system:String>
<system:String x:Key="sensitiveAccentToolTip">Quando esta opção for alterada, será necessária uma reinicialização. Quando ativada, você poderá encontrar programas que contêm caracteres acentuados com mais facilidade.</system:String>
<system:String x:Key="sensitiveAccentRestartTitle">Reinicialização Necessária</system:String>
<system:String x:Key="sensitiveAccentRestartMessage">Alterar a sensibilidade de acentos requer a reinicialização do Flow Launcher para surtir efeito.</system:String>
<system:String x:Key="sensitiveAccentRestartButton">Reiniciar Agora</system:String>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Find language files missing the sensitiveAccent* keys

echo "=== Language files missing sensitiveAccent keys ==="
for file in $(fd -e xaml . Flow.Launcher/Languages/); do
  missing=""
  for key in sensitiveAccent sensitiveAccentToolTip sensitiveAccentRestartTitle sensitiveAccentRestartMessage sensitiveAccentRestartButton; do
    if ! grep -q "x:Key=\"$key\"" "$file"; then
      missing="$missing $key"
    fi
  done
  if [ -n "$missing" ]; then
    echo "$file: missing$missing"
  fi
done

Repository: Flow-Launcher/Flow.Launcher

Length of output: 4324


Add sensitiveAccent keys to 25 other language files to prevent blank UI text.*

The five new keys (sensitiveAccent, sensitiveAccentToolTip, sensitiveAccentRestartTitle, sensitiveAccentRestartMessage, sensitiveAccentRestartButton) are missing from 25 language files. When WPF cannot resolve DynamicResource bindings in SettingsPaneGeneral.xaml, it renders blank text for those UI elements, creating a poor experience for users of those languages.

The missing files are: ar, cs, da, de, es, es-419, fr, he, it, ja, ko, nb, nb-NO, nl, pl, pt-pt, ru, sk, sr, sr-Cyrl-RS, tr, uk-UA, vi, zh-cn, zh-tw.

Add these keys to all language files—at minimum with English fallback text if translations are not yet available.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Flow.Launcher/Languages/pt-br.xaml` around lines 124 - 128, Add the five
missing resource keys (sensitiveAccent, sensitiveAccentToolTip,
sensitiveAccentRestartTitle, sensitiveAccentRestartMessage,
sensitiveAccentRestartButton) into each of the listed language resource XAML
files (the ones currently missing these keys) as system:String x:Key entries; if
you don't have translations yet, populate them with English fallback text
matching the intent in the pt-br example so WPF DynamicResource lookups in
SettingsPaneGeneral.xaml resolve and do not render blank UI; ensure keys are
spelled exactly as shown and placed in the same resource dictionary structure as
other language entries.

<system:String x:Key="hideNotifyIcon">Ocultar ícone da bandeja</system:String>
<system:String x:Key="hideNotifyIconToolTip">Quando o ícone não está na bandeja, o menu de Configurações pode ser aberto ao clicar na janela de busca com o botão direito do mouse.</system:String>
<system:String x:Key="querySearchPrecision">Precisão de Busca da Consulta</system:String>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,16 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
private readonly Updater _updater;
private readonly Portable _portable;
private readonly Internationalization _translater;

public SettingsPaneGeneralViewModel(Settings settings, Updater updater, Portable portable, Internationalization translater)
private readonly IPublicAPI _publicAPIInstance;
Comment thread
Jack251970 marked this conversation as resolved.
Outdated
private readonly bool _initialSensitiveAccents;
public SettingsPaneGeneralViewModel(Settings settings, Updater updater, Portable portable, Internationalization translater, IPublicAPI publicApiInstance)
{
Settings = settings;
_updater = updater;
_portable = portable;
_translater = translater;
_publicAPIInstance = publicApiInstance;
_initialSensitiveAccents = settings.SensitiveAccents;
UpdateEnumDropdownLocalizations();
}

Expand Down Expand Up @@ -173,6 +176,7 @@ public bool EnableDialogJump
public class DialogJumpWindowPositionData : DropdownDataGeneric<DialogJumpWindowPositions> { }
public class DialogJumpResultBehaviourData : DropdownDataGeneric<DialogJumpResultBehaviours> { }
public class DialogJumpFileResultBehaviourData : DropdownDataGeneric<DialogJumpFileResultBehaviours> { }
public bool SensitiveAccentsRestartRequired => Settings.SensitiveAccents != _initialSensitiveAccents;

public List<DialogJumpWindowPositionData> DialogJumpWindowPositions { get; } =
DropdownDataGeneric<DialogJumpWindowPositions>.GetValues<DialogJumpWindowPositionData>("DialogJumpWindowPosition");
Expand All @@ -196,6 +200,21 @@ public int SearchDelayTimeValue
}
}


public bool SensitiveAccents
{
get => Settings.SensitiveAccents;
set
{
if(Settings.SensitiveAccents != value)
{
Settings.SensitiveAccents = value;
OnPropertyChanged();
OnPropertyChanged(nameof(SensitiveAccentsRestartRequired));
}
}
}

public int MaxHistoryResultsToShowValue
{
get => Settings.MaxHistoryResultsToShowForHomePage;
Expand Down Expand Up @@ -349,6 +368,9 @@ private static string GetFileFromDialog(string title, string filter = "")
};
}

[RelayCommand]
private void RestartApp()
=> _publicAPIInstance.RestartApp();
private void UpdateApp()
{
_ = _updater.UpdateAppAsync(false);
Expand Down
21 changes: 20 additions & 1 deletion Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,26 @@
OffContent="{DynamicResource disable}"
OnContent="{DynamicResource enable}" />
</ui:SettingsCard>

<ui:SettingsCard
Description="{DynamicResource sensitiveAccentToolTip}"
Header="{DynamicResource sensitiveAccent}">
<ui:ToggleSwitch
IsOn="{Binding SensitiveAccents}"
OffContent="{DynamicResource disable}"
OnContent="{DynamicResource enable}" />
</ui:SettingsCard>
<ui:InfoBar
Title="{DynamicResource sensitiveAccentRestartTitle}"
Margin="0 4 0 0"
IsClosable="False"
IsOpen="True"
Message="{DynamicResource sensitiveAccentRestartMessage}"
Severity="Warning"
Visibility="{Binding SensitiveAccentsRestartRequired, Converter={StaticResource BoolToVisibilityConverter}}">
<ui:InfoBar.ActionButton>
<Button Command="{Binding RestartAppCommand}" Content="{DynamicResource sensitiveAccentRestartButton}" />
</ui:InfoBar.ActionButton>
</ui:InfoBar>
<ui:SettingsCard
Margin="0 14 0 0"
Description="{DynamicResource showAtTopmostToolTip}"
Expand Down
Loading