diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000..454c4e976
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,17 @@
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ - package-ecosystem: "nuget" # See documentation for possible values
+ directory: "/" # Location of package manifests
+ schedule:
+ interval: "weekly"
+ ignore:
+ - dependency-name: "squirrel-windows"
+ reviewers:
+ - "jjw24"
+ - "taooceros"
+ - "JohnTheGr8"
diff --git a/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs b/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs
index f98815c1a..bb1279b2c 100644
--- a/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs
@@ -1,4 +1,6 @@
-namespace Flow.Launcher.Core.ExternalPlugins
+using System;
+
+namespace Flow.Launcher.Core.ExternalPlugins
{
public record UserPlugin
{
@@ -12,5 +14,8 @@
public string UrlDownload { get; set; }
public string UrlSourceCode { get; set; }
public string IcoPath { get; set; }
+ public DateTime LatestReleaseDate { get; set; }
+ public DateTime DateAdded { get; set; }
+
}
}
diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
index 9f9fa8ff5..7d18c467b 100644
--- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj
+++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
@@ -54,7 +54,7 @@
-
+
diff --git a/Flow.Launcher.Core/Updater.cs b/Flow.Launcher.Core/Updater.cs
index 976c4eec1..bad0344eb 100644
--- a/Flow.Launcher.Core/Updater.cs
+++ b/Flow.Launcher.Core/Updater.cs
@@ -141,6 +141,7 @@ namespace Flow.Launcher.Core
{
var translater = InternationalizationManager.Instance;
var tips = string.Format(translater.GetTranslation("newVersionTips"), version);
+
return tips;
}
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 930cf0b91..4a7bc20e3 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -53,7 +53,7 @@
allruntime; build; native; contentfiles; analyzers; buildtransitive
-
+
diff --git a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
index ef034e194..12a688ff3 100644
--- a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
+++ b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
@@ -267,6 +267,7 @@ namespace Flow.Launcher.Infrastructure.Image
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(path);
+ image.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
image.EndInit();
return image;
}
diff --git a/Flow.Launcher.Infrastructure/Logger/Log.cs b/Flow.Launcher.Infrastructure/Logger/Log.cs
index 75f208c9e..b8f1408e7 100644
--- a/Flow.Launcher.Infrastructure/Logger/Log.cs
+++ b/Flow.Launcher.Infrastructure/Logger/Log.cs
@@ -1,4 +1,4 @@
-using System.Diagnostics;
+using System.Diagnostics;
using System.IO;
using System.Runtime.CompilerServices;
using NLog;
diff --git a/Flow.Launcher.Infrastructure/StringMatcher.cs b/Flow.Launcher.Infrastructure/StringMatcher.cs
index 3ffa9f7b1..46165a849 100644
--- a/Flow.Launcher.Infrastructure/StringMatcher.cs
+++ b/Flow.Launcher.Infrastructure/StringMatcher.cs
@@ -202,7 +202,11 @@ namespace Flow.Launcher.Infrastructure
if (allQuerySubstringsMatched)
{
var nearestSpaceIndex = CalculateClosestSpaceIndex(spaceIndices, firstMatchIndex);
- var score = CalculateSearchScore(query, stringToCompare, firstMatchIndex - nearestSpaceIndex - 1,
+
+ // 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,
lastMatchIndex - firstMatchIndex, allSubstringsContainedInCompareString);
var resultList = indexList.Select(x => translationMapping?.MapToOriginalIndex(x) ?? x).Distinct().ToList();
@@ -296,7 +300,7 @@ namespace Flow.Launcher.Infrastructure
return currentQuerySubstringIndex >= querySubstringsLength;
}
- private static int CalculateSearchScore(string query, string stringToCompare, int firstIndex, int matchLen,
+ private static int CalculateSearchScore(string query, string stringToCompare, int firstIndex, List spaceIndices, int matchLen,
bool allSubstringsContainedInCompareString)
{
// A match found near the beginning of a string is scored more than a match found near the end
@@ -304,6 +308,14 @@ namespace Flow.Launcher.Infrastructure
// while the score is lower if they are more spread out
var score = 100 * (query.Length + 1) / ((1 + firstIndex) + (matchLen + 1));
+ // Give more weight to a match that is closer to the start of the string.
+ // if the first matched char is immediately before space and all strings are contained in the compare string e.g. 'world' matching 'hello world'
+ // and 'world hello', because both have 'world' immediately preceded by space, their firstIndex will be 0 when distance is calculated,
+ // to prevent them scoring the same, we adjust the score by deducting the number of spaces it has from the start of the string, so 'world hello'
+ // will score slightly higher than 'hello world' because 'hello world' has one additional space.
+ if (firstIndex == 0 && allSubstringsContainedInCompareString)
+ score -= spaceIndices.Count;
+
// A match with less characters assigning more weights
if (stringToCompare.Length - query.Length < 5)
{
diff --git a/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
new file mode 100644
index 000000000..71020369a
--- /dev/null
+++ b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Text.Json.Serialization;
+
+namespace Flow.Launcher.Infrastructure.UserSettings
+{
+ public abstract class ShortcutBaseModel
+ {
+ public string Key { get; set; }
+
+ [JsonIgnore]
+ public Func Expand { get; set; } = () => { return ""; };
+
+ public override bool Equals(object obj)
+ {
+ return obj is ShortcutBaseModel other &&
+ Key == other.Key;
+ }
+
+ public override int GetHashCode()
+ {
+ return Key.GetHashCode();
+ }
+ }
+
+ public class CustomShortcutModel : ShortcutBaseModel
+ {
+ public string Value { get; set; }
+
+ [JsonConstructorAttribute]
+ public CustomShortcutModel(string key, string value)
+ {
+ Key = key;
+ Value = value;
+ Expand = () => { return Value; };
+ }
+
+ public void Deconstruct(out string key, out string value)
+ {
+ key = Key;
+ value = Value;
+ }
+
+ public static implicit operator (string Key, string Value)(CustomShortcutModel shortcut)
+ {
+ return (shortcut.Key, shortcut.Value);
+ }
+
+ public static implicit operator CustomShortcutModel((string Key, string Value) shortcut)
+ {
+ return new CustomShortcutModel(shortcut.Key, shortcut.Value);
+ }
+ }
+
+ public class BuiltinShortcutModel : ShortcutBaseModel
+ {
+ public string Description { get; set; }
+
+ public BuiltinShortcutModel(string key, string description, Func expand)
+ {
+ Key = key;
+ Description = description;
+ Expand = expand ?? (() => { return ""; });
+ }
+ }
+}
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 1e3c47210..3cdd8048e 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
using System.Text.Json.Serialization;
+using System.Windows;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedModels;
using Flow.Launcher;
@@ -41,8 +42,18 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool UseGlyphIcons { get; set; } = true;
public bool UseAnimation { get; set; } = true;
public bool UseSound { get; set; } = true;
+ public bool UseClock { get; set; } = true;
+ public bool UseDate { get; set; } = false;
+ public string TimeFormat { get; set; } = "hh:mm tt";
+ public string DateFormat { get; set; } = "MM'/'dd ddd";
public bool FirstLaunch { get; set; } = true;
+ public double SettingWindowWidth { get; set; } = 1000;
+ public double SettingWindowHeight { get; set; } = 700;
+ public double SettingWindowTop { get; set; }
+ public double SettingWindowLeft { get; set; }
+ public System.Windows.WindowState SettingWindowState { get; set; } = WindowState.Normal;
+
public int CustomExplorerIndex { get; set; } = 0;
[JsonIgnore]
@@ -120,8 +131,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
PrivateArg = "-private",
EnablePrivate = false,
Editable = false
- }
- ,
+ },
new()
{
Name = "MS Edge",
@@ -178,6 +188,13 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public ObservableCollection CustomPluginHotkeys { get; set; } = new ObservableCollection();
+ public ObservableCollection CustomShortcuts { get; set; } = new ObservableCollection();
+
+ [JsonIgnore]
+ public ObservableCollection BuiltinShortcuts { get; set; } = new ObservableCollection() {
+ new BuiltinShortcutModel("{clipboard}", "shortcut_clipboard_description", Clipboard.GetText)
+ };
+
public bool DontPromptUpdateMsg { get; set; }
public bool EnableUpdateLog { get; set; }
@@ -195,7 +212,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
public bool LeaveCmdOpen { get; set; }
public bool HideWhenDeactive { get; set; } = true;
- public bool RememberLastLaunchLocation { get; set; }
+ public SearchWindowPositions SearchWindowPosition { get; set; } = SearchWindowPositions.MouseScreenCenter;
public bool IgnoreHotkeysOnFullscreen { get; set; }
public HttpProxy Proxy { get; set; } = new HttpProxy();
@@ -221,4 +238,12 @@ namespace Flow.Launcher.Infrastructure.UserSettings
Light,
Dark
}
+ public enum SearchWindowPositions
+ {
+ RememberLastLaunchLocation,
+ MouseScreenCenter,
+ MouseScreenCenterTop,
+ MouseScreenLeftTop,
+ MouseScreenRightTop
+ }
}
diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs
index c4a5a97fc..2dabe80d1 100644
--- a/Flow.Launcher.Plugin/Result.cs
+++ b/Flow.Launcher.Plugin/Result.cs
@@ -38,7 +38,11 @@ namespace Flow.Launcher.Plugin
/// user's clipboard when Ctrl + C is pressed on a result. If the text is a file/directory path
/// flow will copy the actual file/folder instead of just the path text.
///
- public string CopyText { get; set; } = string.Empty;
+ public string CopyText
+ {
+ get => string.IsNullOrEmpty(_copyText) ? SubTitle : _copyText;
+ set => _copyText = value;
+ }
///
/// This holds the text which can be provided by plugin to help Flow autocomplete text
@@ -87,6 +91,7 @@ namespace Flow.Launcher.Plugin
/// Delegate to Get Image Source
///
public IconDelegate Icon;
+ private string _copyText = string.Empty;
///
/// Information for Glyph Icon (Prioritized than IcoPath/Icon if user enable Glyph Icons)
diff --git a/Flow.Launcher.Test/Flow.Launcher.Test.csproj b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
index f429586ce..c4341288f 100644
--- a/Flow.Launcher.Test/Flow.Launcher.Test.csproj
+++ b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
@@ -50,7 +50,7 @@
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Flow.Launcher.Test/FuzzyMatcherTest.cs b/Flow.Launcher.Test/FuzzyMatcherTest.cs
index bbddcbd2a..46c848c7a 100644
--- a/Flow.Launcher.Test/FuzzyMatcherTest.cs
+++ b/Flow.Launcher.Test/FuzzyMatcherTest.cs
@@ -129,14 +129,20 @@ namespace Flow.Launcher.Test
}
}
+
+ ///
+ /// These are standard match scenarios
+ /// The intention of this test is provide a bench mark for how much the score has increased from a change.
+ /// Usually the increase in scoring should not be drastic, increase of less than 10 is acceptable.
+ ///
[TestCase(Chrome, Chrome, 157)]
- [TestCase(Chrome, LastIsChrome, 147)]
+ [TestCase(Chrome, LastIsChrome, 145)]
[TestCase("chro", HelpCureHopeRaiseOnMindEntityChrome, 50)]
[TestCase("chr", HelpCureHopeRaiseOnMindEntityChrome, 30)]
[TestCase(Chrome, UninstallOrChangeProgramsOnYourComputer, 21)]
[TestCase(Chrome, CandyCrushSagaFromKing, 0)]
- [TestCase("sql", MicrosoftSqlServerManagementStudio, 110)]
- [TestCase("sql manag", MicrosoftSqlServerManagementStudio, 121)] //double spacing intended
+ [TestCase("sql", MicrosoftSqlServerManagementStudio, 109)]
+ [TestCase("sql manag", MicrosoftSqlServerManagementStudio, 120)] //double spacing intended
public void WhenGivenQueryString_ThenShouldReturn_TheDesiredScoring(
string queryString, string compareString, int expectedScore)
{
@@ -275,7 +281,40 @@ namespace Flow.Launcher.Test
$"Query: \"{queryString}\"{Environment.NewLine} " +
$"CompareString1: \"{compareString1}\", Score: {compareString1Result.Score}{Environment.NewLine}" +
$"Should be greater than{Environment.NewLine}" +
- $"CompareString2: \"{compareString2}\", Score: {compareString1Result.Score}{Environment.NewLine}");
+ $"CompareString2: \"{compareString2}\", Score: {compareString2Result.Score}{Environment.NewLine}");
+ }
+
+ [TestCase("red", "red colour", "metro red")]
+ [TestCase("red", "this red colour", "this colour red")]
+ [TestCase("red", "this red colour", "this colour is very red")]
+ [TestCase("red", "this red colour", "this colour is surprisingly super awesome red and cool")]
+ [TestCase("red", "this colour is surprisingly super red very and cool", "this colour is surprisingly super very red and cool")]
+ public void WhenGivenTwoStrings_Scoring_ShouldGiveMoreWeightToTheStringCloserToIndexZero(
+ string queryString, string compareString1, string compareString2)
+ {
+ // When
+ var matcher = new StringMatcher { UserSettingSearchPrecision = SearchPrecisionScore.Regular };
+
+ // Given
+ var compareString1Result = matcher.FuzzyMatch(queryString, compareString1);
+ var compareString2Result = matcher.FuzzyMatch(queryString, compareString2);
+
+ Debug.WriteLine("");
+ Debug.WriteLine("###############################################");
+ Debug.WriteLine($"QueryString: \"{queryString}\"{Environment.NewLine}");
+ Debug.WriteLine(
+ $"CompareString1: \"{compareString1}\", Score: {compareString1Result.Score}{Environment.NewLine}");
+ Debug.WriteLine(
+ $"CompareString2: \"{compareString2}\", Score: {compareString2Result.Score}{Environment.NewLine}");
+ Debug.WriteLine("###############################################");
+ Debug.WriteLine("");
+
+ // Should
+ Assert.True(compareString1Result.Score > compareString2Result.Score,
+ $"Query: \"{queryString}\"{Environment.NewLine} " +
+ $"CompareString1: \"{compareString1}\", Score: {compareString1Result.Score}{Environment.NewLine}" +
+ $"Should be greater than{Environment.NewLine}" +
+ $"CompareString2: \"{compareString2}\", Score: {compareString2Result.Score}{Environment.NewLine}");
}
[TestCase("vim", "Vim", "ignoreDescription", "ignore.exe", "Vim Diff", "ignoreDescription", "ignore.exe")]
diff --git a/Flow.Launcher.sln b/Flow.Launcher.sln
index ec4a29ee7..f59d3d26f 100644
--- a/Flow.Launcher.sln
+++ b/Flow.Launcher.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29806.167
+# Visual Studio Version 17
+VisualStudioVersion = 17.3.32901.215
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Test", "Flow.Launcher.Test\Flow.Launcher.Test.csproj", "{FF742965-9A80-41A5-B042-D6C7D3A21708}"
ProjectSection(ProjectDependencies) = postProject
diff --git a/Flow.Launcher/Converters/BoolToVisibilityConverter.cs b/Flow.Launcher/Converters/BoolToVisibilityConverter.cs
new file mode 100644
index 000000000..ad474d693
--- /dev/null
+++ b/Flow.Launcher/Converters/BoolToVisibilityConverter.cs
@@ -0,0 +1,43 @@
+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.Controls;
+using System.Windows.Data;
+
+namespace Flow.Launcher.Converters
+{
+ public class BoolToVisibilityConverter : IValueConverter
+ {
+ public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
+ {
+ if (parameter != null)
+ {
+ if (value is true)
+ {
+ return Visibility.Collapsed;
+ }
+
+ else
+ {
+ return Visibility.Visible;
+ }
+ }
+ else {
+ if (value is true)
+ {
+ return Visibility.Visible;
+ }
+
+ else {
+ return Visibility.Collapsed;
+ }
+ }
+ }
+
+ public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
+ }
+}
diff --git a/Flow.Launcher/Converters/OpenResultHotkeyVisibilityConverter.cs b/Flow.Launcher/Converters/OpenResultHotkeyVisibilityConverter.cs
index e82fa959c..7586d1fcf 100644
--- a/Flow.Launcher/Converters/OpenResultHotkeyVisibilityConverter.cs
+++ b/Flow.Launcher/Converters/OpenResultHotkeyVisibilityConverter.cs
@@ -11,17 +11,17 @@ namespace Flow.Launcher.Converters
[ValueConversion(typeof(bool), typeof(Visibility))]
public class OpenResultHotkeyVisibilityConverter : IValueConverter
{
- private const int MaxVisibleHotkeys = 9;
+ private const int MaxVisibleHotkeys = 10;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
- var hotkeyNumber = int.MaxValue;
+ var number = int.MaxValue;
if (value is ListBoxItem listBoxItem
&& ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
- hotkeyNumber = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
+ number = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
- return hotkeyNumber <= MaxVisibleHotkeys ? Visibility.Visible : Visibility.Collapsed;
+ return number <= MaxVisibleHotkeys ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
diff --git a/Flow.Launcher/Converters/OrdinalConverter.cs b/Flow.Launcher/Converters/OrdinalConverter.cs
index f9fa220e3..0c716ac7e 100644
--- a/Flow.Launcher/Converters/OrdinalConverter.cs
+++ b/Flow.Launcher/Converters/OrdinalConverter.cs
@@ -10,7 +10,10 @@ namespace Flow.Launcher.Converters
{
if (value is ListBoxItem listBoxItem
&& ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
- return listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
+ {
+ var res = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
+ return res == 10 ? 0 : res; // 10th item => HOTKEY+0
+ }
return 0;
}
diff --git a/Flow.Launcher/Converters/TextConverter.cs b/Flow.Launcher/Converters/TextConverter.cs
new file mode 100644
index 000000000..90d445776
--- /dev/null
+++ b/Flow.Launcher/Converters/TextConverter.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Globalization;
+using System.Windows.Data;
+using Flow.Launcher.Core.Resource;
+using Flow.Launcher.ViewModel;
+
+namespace Flow.Launcher.Converters
+{
+ public class TextConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ var ID = value.ToString();
+ switch(ID)
+ {
+ case PluginStoreItemViewModel.NewRelease:
+ return InternationalizationManager.Instance.GetTranslation("pluginStore_NewRelease");
+ case PluginStoreItemViewModel.RecentlyUpdated:
+ return InternationalizationManager.Instance.GetTranslation("pluginStore_RecentlyUpdated");
+ case PluginStoreItemViewModel.None:
+ return InternationalizationManager.Instance.GetTranslation("pluginStore_None");
+ case PluginStoreItemViewModel.Installed:
+ return InternationalizationManager.Instance.GetTranslation("pluginStore_Installed");
+ default:
+ return ID;
+ }
+
+ }
+
+ public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
+ }
+}
diff --git a/Flow.Launcher/Converters/TranslationConverter.cs b/Flow.Launcher/Converters/TranslationConverter.cs
new file mode 100644
index 000000000..e1e8a58e3
--- /dev/null
+++ b/Flow.Launcher/Converters/TranslationConverter.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Globalization;
+using System.Windows.Data;
+using Flow.Launcher.Core.Resource;
+
+namespace Flow.Launcher.Converters
+{
+ public class TranlationConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ var key = value.ToString();
+ if (String.IsNullOrEmpty(key))
+ return key;
+ return InternationalizationManager.Instance.GetTranslation(key);
+ }
+
+ public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
+ }
+}
diff --git a/Flow.Launcher/CustomShortcutSetting.xaml b/Flow.Launcher/CustomShortcutSetting.xaml
new file mode 100644
index 000000000..78b392f3e
--- /dev/null
+++ b/Flow.Launcher/CustomShortcutSetting.xaml
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/CustomShortcutSetting.xaml.cs b/Flow.Launcher/CustomShortcutSetting.xaml.cs
new file mode 100644
index 000000000..097d6a53b
--- /dev/null
+++ b/Flow.Launcher/CustomShortcutSetting.xaml.cs
@@ -0,0 +1,73 @@
+using Flow.Launcher.Core.Resource;
+using Flow.Launcher.ViewModel;
+using System;
+using System.Windows;
+using System.Windows.Input;
+
+namespace Flow.Launcher
+{
+ public partial class CustomShortcutSetting : Window
+ {
+ private SettingWindowViewModel viewModel;
+ public string Key { get; set; } = String.Empty;
+ public string Value { get; set; } = String.Empty;
+ private string originalKey { get; init; } = null;
+ private string originalValue { get; init; } = null;
+ private bool update { get; init; } = false;
+
+ public CustomShortcutSetting(SettingWindowViewModel vm)
+ {
+ viewModel = vm;
+ InitializeComponent();
+ }
+
+ public CustomShortcutSetting(string key, string value, SettingWindowViewModel vm)
+ {
+ viewModel = vm;
+ Key = key;
+ Value = value;
+ originalKey = key;
+ originalValue = value;
+ update = true;
+ InitializeComponent();
+ }
+
+ private void BtnCancel_OnClick(object sender, RoutedEventArgs e)
+ {
+ DialogResult = false;
+ Close();
+ }
+
+ private void BtnAdd_OnClick(object sender, RoutedEventArgs e)
+ {
+ if (String.IsNullOrEmpty(Key) || String.IsNullOrEmpty(Value))
+ {
+ MessageBox.Show(InternationalizationManager.Instance.GetTranslation("emptyShortcut"));
+ return;
+ }
+ // Check if key is modified or adding a new one
+ if (((update && originalKey != Key) || !update)
+ && viewModel.ShortcutExists(Key))
+ {
+ MessageBox.Show(InternationalizationManager.Instance.GetTranslation("duplicateShortcut"));
+ return;
+ }
+ DialogResult = !update || originalKey != Key || originalValue != Value;
+ Close();
+ }
+
+ private void cmdEsc_OnPress(object sender, ExecutedRoutedEventArgs e)
+ {
+ DialogResult = false;
+ Close();
+ }
+
+ private void BtnTestShortcut_OnClick(object sender, RoutedEventArgs e)
+ {
+ App.API.ChangeQuery(tbExpand.Text);
+ Application.Current.MainWindow.Show();
+ Application.Current.MainWindow.Opacity = 1;
+ Application.Current.MainWindow.Focus();
+ }
+ }
+}
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 66cc911ee..1f979cbdf 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -83,6 +83,7 @@
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
@@ -97,6 +98,7 @@
+
@@ -114,4 +116,14 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Helper/HotKeyMapper.cs b/Flow.Launcher/Helper/HotKeyMapper.cs
index a3ad20f77..b9ac6afb3 100644
--- a/Flow.Launcher/Helper/HotKeyMapper.cs
+++ b/Flow.Launcher/Helper/HotKeyMapper.cs
@@ -17,7 +17,7 @@ namespace Flow.Launcher.Helper
internal static void Initialize(MainViewModel mainVM)
{
mainViewModel = mainVM;
- settings = mainViewModel._settings;
+ settings = mainViewModel.Settings;
SetHotkey(settings.Hotkey, OnToggleHotkey);
LoadCustomPluginHotkey();
diff --git a/Flow.Launcher/Images/app_missing_img.png b/Flow.Launcher/Images/app_missing_img.png
index b86c29ac9..27e366bbc 100644
Binary files a/Flow.Launcher/Images/app_missing_img.png and b/Flow.Launcher/Images/app_missing_img.png differ
diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml
index 6bcd3c0f7..25bd195dd 100644
--- a/Flow.Launcher/Languages/da.xaml
+++ b/Flow.Launcher/Languages/da.xaml
@@ -50,6 +50,7 @@
VælgSkjul Flow Launcher ved opstartHide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Query Search PrecisionChanges minimum match score required for results.Should Use Pinyin
@@ -69,18 +70,20 @@
Current PriorityNew PriorityPriority
+ Change Plugin Results PriorityPlugin bibliotekafInitaliseringstid:Søgetid:| VersionWebsite
+ UninstallPlugin StoreRefresh
- Install
+ InstallTema
@@ -155,11 +158,13 @@
Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
- Release Notes:
+ Release NotesUsage TipsDevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml
index cf73baa22..ebd549adf 100644
--- a/Flow.Launcher/Languages/de.xaml
+++ b/Flow.Launcher/Languages/de.xaml
@@ -50,6 +50,7 @@
AuswählenVerstecke Flow Launcher bei SystemstartStatusleistensymbol ausblenden
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Suchgenauigkeit abfragenErforderliche Suchergebnisse.Pinyin aktivieren
@@ -69,18 +70,20 @@
Aktuelle PrioritätNeue PrioritätPriorität
+ Change Plugin Results PriorityPluginordnervonInitialisierungszeit:Abfragezeit:VersionWebseite
+ DeinstallierenErweiterungen ladenAktualisieren
- Installieren
+ InstallierenDesign
@@ -155,11 +158,13 @@
Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
- Versionshinweise:
+ VersionshinweiseUsage TipsDevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index fdb403740..625b0413d 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -23,6 +23,8 @@
TextGame ModeSuspend the use of Hotkeys.
+ Position Reset
+ Reset search window positionFlow Launcher Settings
@@ -33,7 +35,13 @@
Error setting launch on startupHide Flow Launcher when focus is lostDo not show new version notifications
+ Search Window PositionRemember last launch location
+ Remember Last Location
+ Mouse Focused Screen - Center
+ Mouse Focused Screen - Center Top
+ Mouse Focused Screen - Left Top
+ Mouse Focused Screen - Right TopLanguageLast Query StyleShow/Hide previous results when Flow Launcher is reactivated.
@@ -41,6 +49,7 @@
Select last QueryEmpty last QueryMaximum results shown
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.Ignore hotkeys in fullscreen modeDisable Flow Launcher activation when a full screen application is active (Recommended for games).Default File Manager
@@ -62,6 +71,10 @@
Shadow effect is not allowed while current theme has blur effect enabled
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.PluginFind more pluginsOn
@@ -81,13 +94,24 @@
Query time:| VersionWebsite
- UninstallPlugin Store
+ New Release
+ Recently Updated
+ Plugins
+ InstalledRefresh
- Install
+ Install
+ Uninstall
+ Update
+ Plug-in already installed
+ New Version
+ This plug-in has been updated within the last 7 days
+ New Update is Available
+
+
Theme
@@ -110,6 +134,8 @@
Play a small sound when the search window opensAnimationUse Animation in UI
+ Clock
+ DateHotkey
@@ -120,15 +146,22 @@
Show HotkeyShow result selection hotkey with results.Custom Query Hotkey
+ Custom Query ShortcutQuery
+ Shortcut
+ Expanded
+ DescriptionDeleteEditAddPlease select an itemAre you sure you want to delete {0} plugin hotkey?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.Query window shadow effectShadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].Use Segoe Fluent IconsUse Segoe Fluent Icons for query results where supported
@@ -167,6 +200,8 @@
DevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
@@ -214,6 +249,12 @@
Invalid plugin hotkeyUpdate
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
Hotkey Unavailable
diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml
index de7b95c74..a410f4b32 100644
--- a/Flow.Launcher/Languages/es-419.xaml
+++ b/Flow.Launcher/Languages/es-419.xaml
@@ -50,6 +50,7 @@
SeleccionarOcultar Flow Launcher al arrancar el sistemaOcultar icono de la bandeja
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Precisión de la búsquedaCambia la puntuación mínima de similitud requerida para resultados.Debe usar Pinyin
@@ -76,12 +77,13 @@
Tiempo de consulta:| VersiónSitio web
+ UninstallTienda de PluginsRecargar
- Instalar
+ InstalarTema
@@ -161,6 +163,8 @@
Herramientas de desarrolloCarpeta de ConfiguraciónCarpeta de registros
+ Clear Logs
+ Are you sure you want to delete all logs?Asistente
diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml
index 7d473f64c..0950595fa 100644
--- a/Flow.Launcher/Languages/es.xaml
+++ b/Flow.Launcher/Languages/es.xaml
@@ -50,6 +50,7 @@
SeleccionarOcultar Flow Launcher al inicioOcultar icono de la bandeja del sistema
+ Cuando el icono está oculto en la bandeja del sistema, se puede abrir el menú de configuración haciendo clic con el botón derecho en la ventana de búsqueda.Precisión en la búsqueda de consultasCambia la puntuación mínima requerida para la coincidencia de los resultados.Utilizar Pinyin
@@ -57,7 +58,7 @@
El efecto de sombra no está permitido mientras el tema actual tenga el efecto de desenfoque activado
- Complemento
+ ComplementosBuscar más complementosActivadoDesactivado
@@ -69,13 +70,14 @@
Prioridad actualNueva prioridadPrioridad
- Cambiar la prioridad del resultado del complemento
+ Cambiar la prioridad de los resultados del complementoCarpeta de complementosporTiempo de inicio:Tiempo de consulta:| VersiónSitio web
+ Desinstalar
@@ -158,9 +160,11 @@
Notas de la versiónConsejos de uso
- Herramientas de desarrolador
+ Herramientas de desarrolladorCarpeta de configuraciónCarpeta de registros
+ Eliminar registros
+ ¿Está seguro que desea eliminar todos los registros?Asistente
diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml
index cbcd84307..edc5e4f07 100644
--- a/Flow.Launcher/Languages/fr.xaml
+++ b/Flow.Launcher/Languages/fr.xaml
@@ -50,6 +50,7 @@
SélectionnerCacher Flow Launcher au démarrageMasquer icône du plateau
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Query Search PrecisionChanges minimum match score required for results.Devrait utiliser le pinyin
@@ -69,18 +70,20 @@
Current PriorityNew PriorityPriority
+ Change Plugin Results PriorityRépertoirebyChargement :Utilisation :| VersionWebsite
+ DésinstallerPlugin StoreRefresh
- Install
+ InstallThèmes
@@ -154,11 +157,13 @@
Échec du téléchargement de la mise à jour, vérifiez votre connexion et vos paramètres de configuration proxy pour pouvoir acceder à github-cloud.s3.amazonaws.com, ou téléchargez manuelement la mise à jour sur https://github.com/Flow-Launcher/Flow.Launcher/releases.
- Notes de changement :
+ Notes de changementUsage TipsDevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml
index 04655c226..30a401875 100644
--- a/Flow.Launcher/Languages/it.xaml
+++ b/Flow.Launcher/Languages/it.xaml
@@ -10,23 +10,23 @@
Ultima esecuzione: {0}ApriImpostazioni
- About
+ InformazioniEsci
- Close
- Copy
- Cut
- Paste
+ Chiudi
+ Copia
+ Taglia
+ IncollaFile
- Folder
- Text
- Game Mode
- Suspend the use of Hotkeys.
+ Cartella
+ Testo
+ Modalità gioco
+ Sospendere l'uso dei tasti di scelta rapida.Impostaizoni Flow LauncherGenerale
- Portable Mode
- Store all settings and user data in one folder (Useful when used with removable drives or cloud services).
+ Modalità portatile
+ Memorizzare tutte le impostazioni e i dati dell'utente in un'unica cartella (utile se utilizzato con unità rimovibili o servizi cloud).Avvia Wow all'avvio di WindowsError setting launch on startupNascondi Flow Launcher quando perde il focus
@@ -34,80 +34,83 @@
Ricorda l'ultima posizione di avvio del launcherLinguaComportamento ultima ricerca
- Show/Hide previous results when Flow Launcher is reactivated.
+ Mostra/nasconde i risultati precedenti quando Flow Launcher viene riattivato.Conserva ultima ricercaSeleziona ultima ricercaCancella ultima ricercaNumero massimo di risultati mostratiIgnora i tasti di scelta rapida in applicazione a schermo pieno
- Disable Flow Launcher activation when a full screen application is active (Recommended for games).
- Default File Manager
- Select the file manager to use when opening the folder.
- Default Web Browser
- Setting for New Tab, New Window, Private Mode.
+ Disattivare l'attivazione di Flow Launcher quando è attiva un'applicazione a schermo intero (consigliato per i giochi).
+ Gestore File predefinito
+ Selezionare il Gestore file da usare all'apertura della cartella.
+ Browser predefinito
+ Impostazione per Nuova scheda, Nuova finestra, Modalità privata.Cartella PythonAggiornamento automaticoSelezionaNascondi Flow Launcher all'avvio
- Hide tray icon
- Query Search Precision
- Changes minimum match score required for results.
- Should Use Pinyin
- Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese
- Shadow effect is not allowed while current theme has blur effect enabled
+ Nascondi Icona nell'Area di Notifica
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Precisione di ricerca delle query
+ Modifica il punteggio minimo richiesto per i risultati.
+ Dovrebbe usare il Pinyin
+ Consente di utilizzare il Pinyin per la ricerca. Il Pinyin è il sistema standard di ortografia romanizzata per la traduzione del cinese
+ L'effetto ombra non è consentito mentre il tema corrente ha un effetto di sfocatura abilitatoPluginCerca altri plugins
- On
+ AttivoDisabilita
- Action keyword Setting
+ Impostazioni parola chiave AzioneParole chiave
- Current action keyword
- New action keyword
- Change Action Keywords
- Current Priority
- New Priority
- Priority
+ Parola chiave di azione corrente
+ Nuova parola chiave d'azione
+ Cambia Keywords Azione
+ Priorità Attuale
+ Nuova Priorità
+ Priorità
+ Change Plugin Results PriorityCartella Plugin
- by
+ daTempo di avvio:Tempo ricerca:
- | Version
- Website
+ | Versione
+ Sito Web
+ Disinstalla
- Plugin Store
- Refresh
- Install
+ Negozio dei Plugin
+ Aggiorna
+ InstallaTemaSfoglia per altri temi
- How to create a theme
- Hi There
+ Come creare un tema
+ CiaoFont campo di ricercaFont campo risultatiModalità finestraOpacità
- Theme {0} not exists, fallback to default theme
- Fail to load theme {0}, fallback to default theme
- Theme Folder
- Open Theme Folder
- Color Scheme
- System Default
- Light
- Dark
- Sound Effect
- Play a small sound when the search window opens
- Animation
- Use Animation in UI
+ Il tema {0} non esiste, si ritorna al tema predefinito
+ Impossibile caricare il tema {0}, si torna al tema predefinito
+ Cartella temi
+ Apri cartella del tema
+ Schema di colore
+ Sistema predefinito
+ Chiaro
+ Scuro
+ Effetto sonoro
+ Riproduce un piccolo suono all'apertura della finestra di ricerca
+ Animazione
+ Usa l'animazione nell'interfaccia utenteTasti scelta rapidaTasto scelta rapida Flow Launcher
- Enter shortcut to show/hide Flow Launcher.
+ Immettere la scorciatoia per mostrare/nascondere Flow Launcher.Apri modificatori di risultatoSelect a modifier key to open selected result via keyboard.Mostra tasto di scelta rapida
@@ -130,7 +133,7 @@
Abilita Proxy HTTPServer HTTPPorta
- User Name
+ Nome utentePasswordProxy TestSalva
@@ -142,10 +145,10 @@
Connessione Proxy fallita
- About
- Website
+ Informazioni
+ Sito webGithub
- Docs
+ DocumentazioneVersioneHai usato Flow Launcher {0} volteCerca aggiornamenti
@@ -155,11 +158,13 @@
Download degli aggiornamenti fallito, per favore controlla la tua connessione ed eventuali impostazioni proxy per github-cloud.s3.amazonaws.com,
oppure vai su https://github.com/Flow-Launcher/Flow.Launcher/releases per scaricare gli aggiornamenti manualmente.
- Note di rilascio:
+ Note di rilascioUsage TipsDevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
@@ -173,10 +178,10 @@
Arg For File
- Default Web Browser
+ Browser predefinitoThe default setting follows the OS default browser setting. If specified separately, flow uses that browser.Browser
- Browser Name
+ Nome del browserBrowser PathNew WindowNew Tab
@@ -251,37 +256,37 @@
Descrizione aggiornamento
- Skip
+ SaltaWelcome to Flow LauncherHello, this is the first time you are running Flow Launcher!Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
- Search and run all files and applications on your PC
- Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
- Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
- Hotkeys
- Action Keyword and Commands
- Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
- Let's Start Flow Launcher
- Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+ Cerca ed esegue tutti i file e le applicazioni presenti sul PC
+ Cerca tutto da applicazioni, file, segnalibri, YouTube, Twitter e altro ancora. Tutto dalla comodità della tastiera senza mai toccare il mouse.
+ Flow Launcher si avvia con il tasto di scelta rapida qui sotto, provatelo subito. Per cambiarlo, fate clic sull'input e premete il tasto di scelta rapida desiderato sulla tastiera.
+ Scorciatoie
+ Scorciatoie e comandi
+ Cercate sul web, avviate applicazioni o eseguite varie funzioni tramite i plugin di Flow Launcher. Alcune funzioni iniziano con una parola chiave di azione e, se necessario, possono essere utilizzate senza parole chiave di azione. Provate le query seguenti in Flow Launcher.
+ Avviamo Flow Launcher
+ Finito. Goditi Flow Launcher. Non dimenticare il tasto di scelta rapida per iniziare :)
- Back / Context Menu
- Item Navigation
- Open Context Menu
- Open Contaning Folder
- Run as Admin
- Query History
- Back to Result in Context Menu
- Autocomplete
- Open / Run Selected Item
- Open Setting Window
- Reload Plugin Data
+ Indietro / Menu contestuale
+ Navigazione tra le voci
+ Apri il menu di scelta rapida
+ Apri la cartella Contaning
+ Esegui come amministratore
+ Cronologia Query
+ Torna al risultato nel menu contestuale
+ Autocompleta
+ Apri / Esegui Elemento Selezionato
+ Aprire la finestra delle impostazioni
+ Ricarica i dati del plugin
- Weather
- Weather in Google Result
+ Meteo
+ Meteo nel risultato di Google> ping 8.8.8.8
- Shell Command
+ Comando Della shellBluetoothBluetooth in Windows Settingssn
diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml
index e34c615b7..a2dcfb6a0 100644
--- a/Flow.Launcher/Languages/ja.xaml
+++ b/Flow.Launcher/Languages/ja.xaml
@@ -50,6 +50,7 @@
選択起動時にFlow Launcherを隠すトレイアイコンを隠す
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Query Search PrecisionChanges minimum match score required for results.Should Use Pinyin
@@ -69,18 +70,20 @@
Current PriorityNew Priority重要度
+ Change Plugin Results Priorityプラグイン・ディレクトリby初期化時間:クエリ時間:| バージョンウェブサイト
+ アンインストールプラグインストアRefresh
- Install
+ Installテーマ
@@ -155,11 +158,13 @@
更新のダウンロードに失敗しました、github-cloud.s3.amazonaws.com への接続とプロキシ設定を確認するか、
https://github.com/Flow-Launcher/Flow.Launcher/releases から手動でアップデートをダウンロードしてください。
- リリースノート:
+ リリースノートUsage TipsDevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml
index a470da1db..acb68cb4f 100644
--- a/Flow.Launcher/Languages/ko.xaml
+++ b/Flow.Launcher/Languages/ko.xaml
@@ -50,6 +50,7 @@
선택시작 시 Flow Launcher 숨김트레이 아이콘 숨기기
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.쿼리 검색 정밀도검색 결과에 필요한 최소 매치 점수를 변경합니다.항상 Pinyin 사용
@@ -76,18 +77,19 @@
쿼리 시간:| 버전웹사이트
+ 제거플러그인 스토어새로고침
- 설치
+ 설치테마테마 갤러리테마 제작 안내
- 안녕하세요.
+ 안녕하세요!쿼리 상자 글꼴결과 항목 글꼴윈도우 모드
@@ -161,6 +163,8 @@
개발자도구설정 폴더로그 폴더
+ Clear Logs
+ Are you sure you want to delete all logs?마법사
diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml
index 52885ea47..0848e9d64 100644
--- a/Flow.Launcher/Languages/nb.xaml
+++ b/Flow.Launcher/Languages/nb.xaml
@@ -50,6 +50,7 @@
SelectHide Flow Launcher on startupHide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Query Search PrecisionChanges minimum match score required for results.Should Use Pinyin
@@ -69,18 +70,20 @@
Current PriorityNew PriorityPriority
+ Change Plugin Results PriorityPlugin DirectorybyInit time:Query time:| VersionWebsite
+ UninstallPlugin StoreRefresh
- Install
+ InstallTheme
@@ -160,6 +163,8 @@
DevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml
index 1223df76f..e398afa51 100644
--- a/Flow.Launcher/Languages/nl.xaml
+++ b/Flow.Launcher/Languages/nl.xaml
@@ -50,6 +50,7 @@
SelecteerVerberg Flow Launcher als systeem opstartSysteemvakpictogram verbergen
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Zoekopdracht nauwkeurigheidWijzigt de minimale overeenkomst-score die vereist is voor resultaten.Zou Pinyin moeten gebruiken
@@ -69,18 +70,20 @@
Huidige PrioriteitNieuwe PrioriteitPrioriteit
+ Change Plugin Results PriorityPlugin mapdoorInit tijd:Query tijd:| VersieWebsite
+ UninstallPlugin WinkelVernieuwen
- Installeren
+ InstallerenThema
@@ -155,11 +158,13 @@
Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
- Release Notes:
+ Release NotesUsage TipsDevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml
index 901083f07..fc5badd69 100644
--- a/Flow.Launcher/Languages/pl.xaml
+++ b/Flow.Launcher/Languages/pl.xaml
@@ -50,6 +50,7 @@
WybierzUruchamiaj Flow Launcher zminimalizowanyUkryj ikonę zasobnika
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Query Search PrecisionChanges minimum match score required for results.Should Use Pinyin
@@ -69,18 +70,20 @@
Current PriorityNew PriorityPriority
+ Change Plugin Results PriorityFolder wtyczkibyCzas ładowania:Czas zapytania:| VersionWebsite
+ OdinstalowywaniePlugin StoreRefresh
- Install
+ InstallSkórka
@@ -155,11 +158,13 @@
Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
- Zmiany:
+ ZmianyUsage TipsDevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml
index d23c24e7f..f6fc062c6 100644
--- a/Flow.Launcher/Languages/pt-br.xaml
+++ b/Flow.Launcher/Languages/pt-br.xaml
@@ -50,6 +50,7 @@
SelecionarEsconder Flow Launcher na inicializaçãoHide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Query Search PrecisionChanges minimum match score required for results.Should Use Pinyin
@@ -69,18 +70,20 @@
Current PriorityNew PriorityPriority
+ Change Plugin Results PriorityDiretório de PluginsbyTempo de inicialização:Tempo de consulta:| VersionWebsite
+ DesinstalarPlugin StoreRefresh
- Install
+ InstallTema
@@ -160,6 +163,8 @@
DevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml
index c78519966..b19fc9924 100644
--- a/Flow.Launcher/Languages/pt-pt.xaml
+++ b/Flow.Launcher/Languages/pt-pt.xaml
@@ -50,6 +50,7 @@
SelecionarOcultar Flow Launcher ao arrancarOcultar ícone na bandeja
+ Se o ícone da bandeja estiver oculto, pode abrir as Definições com um clique com o botão direito do rato na caixa de pesquisa.Precisão da consultaAltera a precisão mínima necessário para obter resultadosUtilizar Pinyin
@@ -69,18 +70,20 @@
Prioridade atualNova prioridadePrioridade
+ Alterar prioridade dos resultados do pluginDiretório de pluginsdeTempo de arranque:Tempo de consulta:| VersãoSite
+ DesinstalarLoja de pluginsRecarregar
- Instalar
+ InstalarTema
@@ -159,6 +162,8 @@
DevToolsPasta de definiçõesPasta de registos
+ Clear Logs
+ Are you sure you want to delete all logs?Assistente
diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml
index 691d37538..87b3dd4ef 100644
--- a/Flow.Launcher/Languages/ru.xaml
+++ b/Flow.Launcher/Languages/ru.xaml
@@ -50,6 +50,7 @@
SelectHide Flow Launcher on startupHide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Query Search PrecisionChanges minimum match score required for results.Should Use Pinyin
@@ -69,18 +70,20 @@
Current PriorityNew PriorityPriority
+ Change Plugin Results PriorityДиректория плагиновbyИнициализация:Запрос:| VersionWebsite
+ УдалитьPlugin StoreRefresh
- Install
+ InstallТема
@@ -160,6 +163,8 @@
DevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml
index 20b259f9f..ee703bcf8 100644
--- a/Flow.Launcher/Languages/sk.xaml
+++ b/Flow.Launcher/Languages/sk.xaml
@@ -50,6 +50,7 @@
VybraťSchovať Flow Launcher po spusteníSchovať ikonu z oblasti oznámení
+ Keď je ikona skrytá z oblasti oznámení, nastavenia možno otvoriť kliknutím pravým tlačidlom myši na okno vyhľadávania.Presnosť vyhľadávaniaMení minimálne skóre zhody potrebné na zobrazenie výsledkov.Použiť Pinyin
@@ -69,18 +70,20 @@
Aktuálna prioritaNová prioritaPriorita
+ Zmena priority výsledkov pluginuPriečinok s pluginmiodInicializácia:Trvanie dopytu:| VerziaWebstránka
+ OdinštalovaťRepozitár pluginovObnoviť
- Inštalovať
+ InštalovaťMotív
@@ -160,6 +163,8 @@
Nástroje pre vývojárovPriečinok s nastaveniamiPriečinok s logmi
+ Vymazať logy
+ Naozaj chcete odstrániť všetky logy?Sprievodca
diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml
index b15bbc194..e805860dc 100644
--- a/Flow.Launcher/Languages/sr.xaml
+++ b/Flow.Launcher/Languages/sr.xaml
@@ -50,6 +50,7 @@
IzaberiSakrij Flow Launcher pri podizanju sistemaHide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Query Search PrecisionChanges minimum match score required for results.Should Use Pinyin
@@ -69,18 +70,20 @@
Current PriorityNew PriorityPriority
+ Change Plugin Results PriorityPlugin direktorijumbyVreme inicijalizacije:Vreme upita:| VersionWebsite
+ UninstallPlugin StoreRefresh
- Install
+ InstallTema
@@ -155,11 +158,13 @@
Neuspešno preuzimanje ažuriranja, molim Vas proverite vašu vezu i podešavanja za proksi prema github-cloud.s3.amazonaws.com,
ili posetite https://github.com/Flow-Launcher/Flow.Launcher/releases da preuzmete ažuriranja ručno.
- U novoj verziji:
+ U novoj verzijiUsage TipsDevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml
index ec609de37..4a016ced8 100644
--- a/Flow.Launcher/Languages/tr.xaml
+++ b/Flow.Launcher/Languages/tr.xaml
@@ -50,6 +50,7 @@
SeçBaşlangıçta Flow Launcher'u gizleSistem çekmecesi simgesini gizle
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Sorgu Arama HassasiyetiSonuçlar için gereken minimum maç puanını değiştirir.Pinyin kullanılmalı
@@ -69,18 +70,20 @@
Mevcut öncelikYeni ÖncelikÖncelik
+ Change Plugin Results PriorityEklenti KlasörüYapımcı:Açılış Süresi:Sorgu Süresi:Sürümİnternet Sitesi
+ KaldırEklenti MağazasıYenile
- İndir
+ İndirTemalar
@@ -155,11 +158,13 @@
Güncellemenin yüklenmesi başarısız oldu. Lütfen bağlantınız ve vekil sunucu ayarlarınızın github-cloud.s3.amazonaws.com
adresine ulaşabilir olduğunu kontrol edin ya da https://github.com/Flow-Launcher/Flow.Launcher/releases adresinden güncellemeyi elle indirin.
- Sürüm Notları:
+ Sürüm NotlarıUsage TipsDevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml
index c2d5302a6..a34ed4e8b 100644
--- a/Flow.Launcher/Languages/uk-UA.xaml
+++ b/Flow.Launcher/Languages/uk-UA.xaml
@@ -50,6 +50,7 @@
ВибратиСховати Flow Launcher при запуску системиПриховати значок в системному лотку
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Точність пошуку запитівЗмінює мінімальний бал збігів, необхідних для результатів.Використовувати піньїнь
@@ -69,18 +70,20 @@
Поточний пріоритетНовий пріоритетПріоритет
+ Change Plugin Results PriorityДиректорія плагінівзаІніціалізація:Запит:| ВерсіяСайт
+ UninstallМагазин плагінівОновити
- Встановити
+ ВстановитиТема
@@ -160,6 +163,8 @@
DevToolsSetting FolderLog Folder
+ Clear Logs
+ Are you sure you want to delete all logs?Wizard
diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml
index 3c4bdaea2..b62736d16 100644
--- a/Flow.Launcher/Languages/zh-cn.xaml
+++ b/Flow.Launcher/Languages/zh-cn.xaml
@@ -28,7 +28,7 @@
便携模式将所有设置和用户数据存储在一个文件夹中 (可用于可移除驱动器或云服务)。开机自启
- Error setting launch on startup
+ 设置开机自启时出错失去焦点时自动隐藏 Flow Launcher不显示新版本提示记住上次启动位置
@@ -40,7 +40,7 @@
清空上次搜索关键字最大结果显示个数全屏模式下忽略热键
- 当全屏应用程序激活时禁用快捷键(建议游戏时打开)。
+ 当全屏应用程序激活时禁用快捷键 (建议游戏时打开) 。默认文件管理器选择打开文件夹时要使用的文件管理器。默认浏览器
@@ -50,6 +50,7 @@
选择系统启动时不显示主窗口隐藏任务栏图标
+ 任务栏图标被隐藏时,右键点击搜索窗口即可打开设置菜单。查询搜索精度更改匹配成功所需的最低分数。启动拼音搜索
@@ -76,12 +77,13 @@
查询耗时:| 版本官方网站
+ 卸载插件商店刷新
- 安装
+ 安装主题
@@ -109,10 +111,10 @@
热键Flow Launcher 激活热键输入显示/隐藏 Flow Launcher 的快捷键。
- 开放结果修饰符
- 指定修饰符用于打开指定的选项。
+ 打开结果快捷键修饰符
+ 选择一个用以打开搜索结果的按键修饰符。显示热键
- 显示热键用于快速选择选项。
+ 显示用于打开结果的快捷键。自定义查询热键查询删除
@@ -156,11 +158,13 @@
下载更新失败,请检查您与 github-cloud.s3.amazonaws.com 的连接状态或检查代理设置,
或访问 https://github.com/Flow-Launcher/Flow.Launcher/releases 手动下载更新
- 更新说明:
- 使用技巧:
+ 更新说明
+ 使用技巧开发工具设置目录日志目录
+ 清除日志
+ 你确定要删除所有的日志吗?向导
@@ -257,11 +261,11 @@
你好,这是你第一次运行 Flow Launcher!在启动前,这个向导将有助于设置 Flow Launcher。如果您愿意,您可以跳过。请选择一种语言搜索并运行您PC上的文件和应用程序
- 搜索所有应用程序、 文件、 书签、 YouTube、 Twitter等。所有都只需要键盘而不需要触摸鼠标。
+ 搜索所有应用程序、 文件、 书签、 YouTube、 Twitter等。所有都只需要键盘而不需要鼠标。Flow Launcher 默认使用下面的快捷键激活。 要更改它,请点击输入并按键盘上所需的热键。快捷键动作关键词和命令
- 通过 Flow Launcher 插件搜索网站、启动应用程序或运行各种功能。 某些函数起始于一个动作关键词,如有必要,它们可以在没有动作关键词的情况下使用。欢迎尝试一下的查询语句。
+ 通过 Flow Launcher 插件搜索网站、启动应用程序或运行各种功能。某些功能使用一个动作关键词激活,如有必要,它们也可以在没有动作关键词的情况下使用。欢迎尝试以下的查询语句。开始使用 Flow Launcher完成了!享受 Flow Launcher。不要忘记激活快捷键 :)
@@ -269,7 +273,7 @@
返回/上下文菜单选项导航
- 打开菜单目录
+ 打开上下文菜单打开所在目录以管理员身份运行查询历史
@@ -286,6 +290,6 @@
BluetoothWindows 设置中的蓝牙sn
- Sticky Notes
+ 便笺
diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml
index fe769ec5e..69abbe401 100644
--- a/Flow.Launcher/Languages/zh-tw.xaml
+++ b/Flow.Launcher/Languages/zh-tw.xaml
@@ -42,7 +42,7 @@
全螢幕模式下忽略快捷鍵全螢幕模式下停用快捷鍵(推薦用於遊戲時)。預設檔案管理器
- 選擇打開資料夾時要使用的檔案管理器。
+ 選擇開啟資料夾時要使用的檔案管理器。預設瀏覽器設定新增分頁、視窗和無痕模式。Python 路徑
@@ -50,6 +50,7 @@
選擇啟動時不顯示主視窗隱藏任務欄圖標
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.查詢搜索精確度Changes minimum match score required for results.拼音搜索
@@ -76,12 +77,13 @@
查詢耗時:| 版本官方網站
+ 解除安裝外掛商店重新整理
- 安裝
+ 安裝主題
@@ -156,11 +158,13 @@
下載更新失敗,請檢查您對 github-cloud.s3.amazonaws.com 的連線和代理設定,
或是到 https://github.com/Flow-Launcher/Flow.Launcher/releases 手動下載更新。
- 更新說明:
+ 更新說明使用技巧開發工具設定資料夾日誌資料夾
+ Clear Logs
+ Are you sure you want to delete all logs?嚮導
diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml
index fdca79006..1f536974e 100644
--- a/Flow.Launcher/MainWindow.xaml
+++ b/Flow.Launcher/MainWindow.xaml
@@ -1,5 +1,4 @@
-
+
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
+
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
-
+
+
+
-
-
+
-
-
-
-
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index e7a063a67..914c4b48f 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows;
@@ -20,8 +20,13 @@ using Flow.Launcher.Infrastructure;
using System.Windows.Media;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Plugin.SharedCommands;
-using System.Windows.Data;
+using System.Text;
+using DataObject = System.Windows.DataObject;
using System.Diagnostics;
+using Microsoft.AspNetCore.Http;
+using System.IO;
+using System.Windows.Threading;
+using System.Windows.Data;
namespace Flow.Launcher
{
@@ -45,6 +50,7 @@ namespace Flow.Launcher
DataContext = mainVM;
_viewModel = mainVM;
_settings = settings;
+
InitializeComponent();
InitializePosition();
animationSound.Open(new Uri(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav"));
@@ -54,6 +60,7 @@ namespace Flow.Launcher
{
InitializeComponent();
}
+
private void OnCopy(object sender, ExecutedRoutedEventArgs e)
{
if (QueryTextBox.SelectionLength == 0)
@@ -91,6 +98,7 @@ namespace Flow.Launcher
InitializeColorScheme();
WindowsInteropHelper.DisableControlBox(this);
InitProgressbarAnimation();
+ InitializePosition();
// since the default main window visibility is visible
// so we need set focus during startup
QueryTextBox.Focus();
@@ -108,7 +116,6 @@ namespace Flow.Launcher
animationSound.Position = TimeSpan.Zero;
animationSound.Play();
}
-
UpdatePosition();
PreviewReset();
Activate();
@@ -139,22 +146,20 @@ namespace Flow.Launcher
}
case nameof(MainViewModel.ProgressBarVisibility):
{
- Dispatcher.Invoke(async () =>
+ Dispatcher.Invoke(() =>
{
if (_viewModel.ProgressBarVisibility == Visibility.Hidden && !isProgressBarStoryboardPaused)
{
- await Task.Delay(50);
_progressBarStoryboard.Stop(ProgressBar);
isProgressBarStoryboardPaused = true;
}
else if (_viewModel.MainWindowVisibilityStatus &&
- isProgressBarStoryboardPaused)
+ isProgressBarStoryboardPaused)
{
_progressBarStoryboard.Begin(ProgressBar, true);
isProgressBarStoryboardPaused = false;
}
- }, System.Windows.Threading.DispatcherPriority.Render);
-
+ });
break;
}
case nameof(MainViewModel.QueryTextCursorMovedToEnd):
@@ -164,6 +169,7 @@ namespace Flow.Launcher
_viewModel.QueryTextCursorMovedToEnd = false;
}
break;
+
}
};
_settings.PropertyChanged += (o, e) =>
@@ -179,21 +185,40 @@ namespace Flow.Launcher
case nameof(Settings.Hotkey):
UpdateNotifyIconText();
break;
+ case nameof(Settings.WindowLeft):
+ Left = _settings.WindowLeft;
+ break;
+ case nameof(Settings.WindowTop):
+ Top = _settings.WindowTop;
+ break;
}
};
}
private void InitializePosition()
{
- if (_settings.RememberLastLaunchLocation)
+ switch (_settings.SearchWindowPosition)
{
- Top = _settings.WindowTop;
- Left = _settings.WindowLeft;
- }
- else
- {
- Left = WindowLeft();
- Top = WindowTop();
+ case SearchWindowPositions.RememberLastLaunchLocation:
+ Top = _settings.WindowTop;
+ Left = _settings.WindowLeft;
+ break;
+ case SearchWindowPositions.MouseScreenCenter:
+ Left = HorizonCenter();
+ Top = VerticalCenter();
+ break;
+ case SearchWindowPositions.MouseScreenCenterTop:
+ Left = HorizonCenter();
+ Top = 10;
+ break;
+ case SearchWindowPositions.MouseScreenLeftTop:
+ Left = 10;
+ Top = 10;
+ break;
+ case SearchWindowPositions.MouseScreenRightTop:
+ Left = HorizonRight();
+ Top = 10;
+ break;
}
}
@@ -202,8 +227,9 @@ namespace Flow.Launcher
var menu = contextMenu;
((MenuItem)menu.Items[1]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + " (" + _settings.Hotkey + ")";
((MenuItem)menu.Items[2]).Header = InternationalizationManager.Instance.GetTranslation("GameMode");
- ((MenuItem)menu.Items[3]).Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings");
- ((MenuItem)menu.Items[4]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit");
+ ((MenuItem)menu.Items[3]).Header = InternationalizationManager.Instance.GetTranslation("PositionReset");
+ ((MenuItem)menu.Items[4]).Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings");
+ ((MenuItem)menu.Items[5]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit");
}
private void InitializeNotifyIcon()
@@ -229,6 +255,10 @@ namespace Flow.Launcher
{
Header = InternationalizationManager.Instance.GetTranslation("GameMode")
};
+ var positionreset = new MenuItem
+ {
+ Header = InternationalizationManager.Instance.GetTranslation("PositionReset")
+ };
var settings = new MenuItem
{
Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings")
@@ -240,12 +270,15 @@ namespace Flow.Launcher
open.Click += (o, e) => _viewModel.ToggleFlowLauncher();
gamemode.Click += (o, e) => ToggleGameMode();
+ positionreset.Click += (o, e) => PositionReset();
settings.Click += (o, e) => App.API.OpenSettingDialog();
exit.Click += (o, e) => Close();
contextMenu.Items.Add(header);
contextMenu.Items.Add(open);
gamemode.ToolTip = InternationalizationManager.Instance.GetTranslation("GameModeToolTip");
+ positionreset.ToolTip = InternationalizationManager.Instance.GetTranslation("PositionResetToolTip");
contextMenu.Items.Add(gamemode);
+ contextMenu.Items.Add(positionreset);
contextMenu.Items.Add(settings);
contextMenu.Items.Add(exit);
@@ -292,10 +325,17 @@ namespace Flow.Launcher
_viewModel.GameModeStatus = true;
}
}
+ private async void PositionReset()
+ {
+ _viewModel.Show();
+ await Task.Delay(300); // If don't give a time, Positioning will be weird.
+ Left = HorizonCenter();
+ Top = VerticalCenter();
+ }
private void InitProgressbarAnimation()
{
var da = new DoubleAnimation(ProgressBar.X2, ActualWidth + 150,
- new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
+ new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
var da1 = new DoubleAnimation(ProgressBar.X1, ActualWidth + 50, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
Storyboard.SetTargetProperty(da, new PropertyPath("(Line.X2)"));
Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X1)"));
@@ -399,6 +439,8 @@ namespace Flow.Launcher
private async void OnDeactivated(object sender, EventArgs e)
{
+ _settings.WindowLeft = Left;
+ _settings.WindowTop = Top;
//This condition stops extra hide call when animator is on,
// which causes the toggling to occasional hide instead of show.
if (_viewModel.MainWindowVisibilityStatus)
@@ -420,24 +462,14 @@ namespace Flow.Launcher
{
if (_animating)
return;
-
- if (_settings.RememberLastLaunchLocation)
- {
- Left = _settings.WindowLeft;
- Top = _settings.WindowTop;
- }
- else
- {
- Left = WindowLeft();
- Top = WindowTop();
- }
+ InitializePosition();
}
private void OnLocationChanged(object sender, EventArgs e)
{
if (_animating)
return;
- if (_settings.RememberLastLaunchLocation)
+ if (_settings.SearchWindowPosition == SearchWindowPositions.RememberLastLaunchLocation)
{
_settings.WindowLeft = Left;
_settings.WindowTop = Top;
@@ -456,8 +488,8 @@ namespace Flow.Launcher
_viewModel.Show();
}
}
-
- public double WindowLeft()
+
+ public double HorizonCenter()
{
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
@@ -466,7 +498,7 @@ namespace Flow.Launcher
return left;
}
- public double WindowTop()
+ public double VerticalCenter()
{
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
@@ -475,12 +507,22 @@ namespace Flow.Launcher
return top;
}
+ public double HorizonRight()
+ {
+ var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
+ var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
+ var left = (dip2.X - ActualWidth) - 10;
+ return left;
+ }
+
///
/// Register up and down key
/// todo: any way to put this in xaml ?
///
private void OnKeyDown(object sender, KeyEventArgs e)
{
+ var specialKeyState = GlobalHotkey.CheckModifiers();
switch (e.Key)
{
case Key.Down:
@@ -515,8 +557,13 @@ namespace Flow.Launcher
e.Handled = true;
}
break;
+ case Key.F12:
+ if (specialKeyState.CtrlPressed)
+ {
+ ToggleGameMode();
+ }
+ break;
case Key.Back:
- var specialKeyState = GlobalHotkey.CheckModifiers();
if (specialKeyState.CtrlPressed)
{
if (_viewModel.SelectedIsFromQueryResults()
diff --git a/Flow.Launcher/Resources/CustomControlTemplate.xaml b/Flow.Launcher/Resources/CustomControlTemplate.xaml
index 6ab7ab5ad..6e8294031 100644
--- a/Flow.Launcher/Resources/CustomControlTemplate.xaml
+++ b/Flow.Launcher/Resources/CustomControlTemplate.xaml
@@ -2044,31 +2044,43 @@
-
+
-
-
+
+
+
+
+
+
+
@@ -2077,12 +2089,12 @@
-
+
-
+
@@ -2110,7 +2122,7 @@
x:Name="HeaderSite"
MinWidth="0"
MinHeight="0"
- Margin="18,0,0,0"
+ Margin="18,0,18,0"
Padding="{TemplateBinding Padding}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
@@ -2127,19 +2139,62 @@
Foreground="{TemplateBinding Foreground}"
IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
Style="{StaticResource ExpanderDownHeaderStyle}" />
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/Resources/Dark.xaml b/Flow.Launcher/Resources/Dark.xaml
index 445e07c63..674e04deb 100644
--- a/Flow.Launcher/Resources/Dark.xaml
+++ b/Flow.Launcher/Resources/Dark.xaml
@@ -69,6 +69,8 @@
+ #272727
+
#202020#2b2b2b#1d1d1d
diff --git a/Flow.Launcher/Resources/Light.xaml b/Flow.Launcher/Resources/Light.xaml
index cee8b63cd..8b04196dd 100644
--- a/Flow.Launcher/Resources/Light.xaml
+++ b/Flow.Launcher/Resources/Light.xaml
@@ -62,6 +62,8 @@
+ #f6f6f6
+
#f3f3f3#ffffff#e5e5e5
diff --git a/Flow.Launcher/ResultListBox.xaml b/Flow.Launcher/ResultListBox.xaml
index 0da25332c..85d20f587 100644
--- a/Flow.Launcher/ResultListBox.xaml
+++ b/Flow.Launcher/ResultListBox.xaml
@@ -25,12 +25,15 @@
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"
Visibility="{Binding Visbility}"
- mc:Ignorable="d">
+ mc:Ignorable="d"
+ PreviewMouseMove="ResultList_MouseMove"
+ PreviewMouseLeftButtonDown="ResultList_PreviewMouseLeftButtonDown">
-
+
+
+
@@ -1537,7 +1757,9 @@
+ ScrollViewer.CanContentScroll="True"
+ VirtualizingStackPanel.IsVirtualizing="True"
+ VirtualizingStackPanel.ScrollUnit="Pixel">
@@ -1584,8 +1806,11 @@
IsReadOnly="True"
Style="{DynamicResource QueryBoxStyle}"
Text="{DynamicResource hiThere}" />
-
+
+
+
+
@@ -2214,7 +2630,9 @@
+ ScrollViewer.CanContentScroll="True"
+ VirtualizingStackPanel.IsVirtualizing="True"
+ VirtualizingStackPanel.ScrollUnit="Pixel">
@@ -2245,7 +2663,10 @@
VerticalAlignment="Center"
Style="{DynamicResource SettingTitleLabel}"
Text="{DynamicResource enableProxy}" />
-
+
+ ScrollViewer.CanContentScroll="True"
+ VirtualizingStackPanel.IsVirtualizing="True"
+ VirtualizingStackPanel.ScrollUnit="Pixel">
+
diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs
index 069457d01..0100c31d1 100644
--- a/Flow.Launcher/SettingWindow.xaml.cs
+++ b/Flow.Launcher/SettingWindow.xaml.cs
@@ -1,29 +1,29 @@
-using Droplex;
-using Flow.Launcher.Core.ExternalPlugins;
-using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Core.Resource;
using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Hotkey;
-using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
using Flow.Launcher.ViewModel;
-using Microsoft.Win32;
using ModernWpf;
+using ModernWpf.Controls;
using System;
+using System.Drawing.Printing;
using System.IO;
using System.Windows;
-using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Navigation;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;
using Button = System.Windows.Controls.Button;
using Control = System.Windows.Controls.Control;
-using ListViewItem = System.Windows.Controls.ListViewItem;
+using KeyEventArgs = System.Windows.Input.KeyEventArgs;
using MessageBox = System.Windows.MessageBox;
using TextBox = System.Windows.Controls.TextBox;
using ThemeManager = ModernWpf.ThemeManager;
@@ -38,11 +38,12 @@ namespace Flow.Launcher
public SettingWindow(IPublicAPI api, SettingWindowViewModel viewModel)
{
- InitializeComponent();
settings = viewModel.Settings;
DataContext = viewModel;
this.viewModel = viewModel;
API = api;
+ InitializePosition();
+ InitializeComponent();
}
#region General
@@ -55,6 +56,15 @@ namespace Flow.Launcher
HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
HwndTarget hwndTarget = hwndSource.CompositionTarget;
hwndTarget.RenderMode = RenderMode.SoftwareOnly;
+
+ pluginListView = (CollectionView)CollectionViewSource.GetDefaultView(Plugins.ItemsSource);
+ pluginListView.Filter = PluginListFilter;
+
+ pluginStoreView = (CollectionView)CollectionViewSource.GetDefaultView(StoreListBox.ItemsSource);
+ pluginStoreView.Filter = PluginStoreFilter;
+
+ InitializePosition();
+ ClockDisplay();
}
private void OnSelectPythonDirectoryClick(object sender, RoutedEventArgs e)
@@ -145,7 +155,7 @@ namespace Flow.Launcher
}
}
- private void OnnEditCustomHotkeyClick(object sender, RoutedEventArgs e)
+ private void OnEditCustomHotkeyClick(object sender, RoutedEventArgs e)
{
var item = viewModel.SelectedCustomPluginHotkey;
if (item != null)
@@ -160,7 +170,7 @@ namespace Flow.Launcher
}
}
- private void OnAddCustomeHotkeyClick(object sender, RoutedEventArgs e)
+ private void OnAddCustomHotkeyClick(object sender, RoutedEventArgs e)
{
new CustomQueryHotkeySetting(this, settings).ShowDialog();
}
@@ -243,6 +253,9 @@ namespace Flow.Launcher
private void OnClosed(object sender, EventArgs e)
{
+ settings.SettingWindowState = WindowState;
+ settings.SettingWindowTop = Top;
+ settings.SettingWindowLeft = Left;
viewModel.Save();
}
@@ -270,21 +283,84 @@ namespace Flow.Launcher
{
PluginManager.API.OpenDirectory(Path.Combine(DataLocation.DataDirectory(), Constant.Logs, Constant.Version));
}
-
- private void OnPluginStoreRefreshClick(object sender, RoutedEventArgs e)
+ private void ClearLogFolder(object sender, RoutedEventArgs e)
{
- _ = viewModel.RefreshExternalPluginsAsync();
+ var confirmResult = MessageBox.Show(
+ InternationalizationManager.Instance.GetTranslation("clearlogfolderMessage"),
+ InternationalizationManager.Instance.GetTranslation("clearlogfolder"),
+ MessageBoxButton.YesNo);
+
+ if (confirmResult == MessageBoxResult.Yes)
+ {
+ viewModel.ClearLogFolder();
+
+ ClearLogFolderBtn.Content = viewModel.CheckLogFolder;
+ }
}
+ private static T FindParent(DependencyObject child) where T : DependencyObject
+ {
+ //get parent item
+ DependencyObject parentObject = VisualTreeHelper.GetParent(child);
+
+ //we've reached the end of the tree
+ if (parentObject == null) return null;
+
+ //check if the parent matches the type we're looking for
+ T parent = parentObject as T;
+ if (parent != null)
+ return parent;
+ else
+ return FindParent(parentObject);
+ }
+
private void OnExternalPluginInstallClick(object sender, RoutedEventArgs e)
{
- if (sender is Button { DataContext: UserPlugin plugin })
+ if (sender is not Button { DataContext: PluginStoreItemViewModel plugin } button)
{
- var pluginsManagerPlugin = PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7");
- var actionKeyword = pluginsManagerPlugin.Metadata.ActionKeywords.Count == 0 ? "" : pluginsManagerPlugin.Metadata.ActionKeywords[0];
- API.ChangeQuery($"{actionKeyword} install {plugin.Name}");
- API.ShowMainWindow();
+ return;
}
+
+ if (storeClickedButton != null)
+ {
+ FlyoutService.GetFlyout(storeClickedButton).Hide();
+ }
+
+ viewModel.DisplayPluginQuery($"install {plugin.Name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7"));
+ }
+
+ private void OnExternalPluginUninstallClick(object sender, MouseButtonEventArgs e)
+ {
+ if (e.ChangedButton == MouseButton.Left)
+ {
+ var name = viewModel.SelectedPlugin.PluginPair.Metadata.Name;
+ viewModel.DisplayPluginQuery($"uninstall {name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7"));
+ }
+
+
+ }
+
+ private void OnExternalPluginUninstallClick(object sender, RoutedEventArgs e)
+ {
+ if (storeClickedButton != null)
+ {
+ FlyoutService.GetFlyout(storeClickedButton).Hide();
+ }
+
+ if (sender is Button { DataContext: PluginStoreItemViewModel plugin })
+ viewModel.DisplayPluginQuery($"uninstall {plugin.Name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7"));
+
+ }
+
+ private void OnExternalPluginUpdateClick(object sender, RoutedEventArgs e)
+ {
+ if (storeClickedButton != null)
+ {
+ FlyoutService.GetFlyout(storeClickedButton).Hide();
+ }
+ if (sender is Button { DataContext: PluginStoreItemViewModel plugin })
+ viewModel.DisplayPluginQuery($"update {plugin.Name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7"));
+
}
private void window_MouseDown(object sender, MouseButtonEventArgs e) /* for close hotkey popup */
@@ -320,6 +396,7 @@ namespace Flow.Launcher
private void OnCloseButtonClick(object sender, RoutedEventArgs e)
{
+
Close();
}
@@ -336,30 +413,182 @@ namespace Flow.Launcher
restoreButton.Visibility = Visibility.Collapsed;
}
}
+
private void Window_StateChanged(object sender, EventArgs e)
{
RefreshMaximizeRestoreButton();
}
- private void SelectedPluginChanged(object sender, SelectionChangedEventArgs e)
+ #region Shortcut
+
+ private void OnDeleteCustomShortCutClick(object sender, RoutedEventArgs e)
{
- Plugins.ScrollIntoView(Plugins.SelectedItem);
- }
- private void ItemSizeChanged(object sender, SizeChangedEventArgs e)
- {
- Plugins.ScrollIntoView(Plugins.SelectedItem);
+ viewModel.DeleteSelectedCustomShortcut();
}
- private void OnExternalPluginUninstallClick(object sender, MouseButtonEventArgs e)
+ private void OnEditCustomShortCutClick(object sender, RoutedEventArgs e)
{
- if (e.ChangedButton == MouseButton.Left)
+ if (viewModel.EditSelectedCustomShortcut())
{
- var id = viewModel.SelectedPlugin.PluginPair.Metadata.Name;
- var pluginsManagerPlugin = PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7");
- var actionKeyword = pluginsManagerPlugin.Metadata.ActionKeywords.Count == 0 ? "" : pluginsManagerPlugin.Metadata.ActionKeywords[0];
- API.ChangeQuery($"{actionKeyword} uninstall {id}");
- API.ShowMainWindow();
+ customShortcutView.Items.Refresh();
}
}
+
+ private void OnAddCustomShortCutClick(object sender, RoutedEventArgs e)
+ {
+ viewModel.AddCustomShortcut();
+ }
+
+ #endregion
+
+ private CollectionView pluginListView;
+ private CollectionView pluginStoreView;
+
+ private bool PluginListFilter(object item)
+ {
+ if (string.IsNullOrEmpty(pluginFilterTxb.Text))
+ return true;
+ if (item is PluginViewModel model)
+ {
+ return StringMatcher.FuzzySearch(pluginFilterTxb.Text, model.PluginPair.Metadata.Name).IsSearchPrecisionScoreMet();
+ }
+ return false;
+ }
+
+ private bool PluginStoreFilter(object item)
+ {
+ if (string.IsNullOrEmpty(pluginStoreFilterTxb.Text))
+ return true;
+ if (item is PluginStoreItemViewModel model)
+ {
+ return StringMatcher.FuzzySearch(pluginStoreFilterTxb.Text, model.Name).IsSearchPrecisionScoreMet()
+ || StringMatcher.FuzzySearch(pluginStoreFilterTxb.Text, model.Description).IsSearchPrecisionScoreMet();
+ }
+ return false;
+ }
+
+ private string lastPluginListSearch = "";
+ private string lastPluginStoreSearch = "";
+
+ private void RefreshPluginListEventHandler(object sender, RoutedEventArgs e)
+ {
+ if (pluginFilterTxb.Text != lastPluginListSearch)
+ {
+ lastPluginListSearch = pluginFilterTxb.Text;
+ pluginListView.Refresh();
+ }
+ }
+
+ private void RefreshPluginStoreEventHandler(object sender, RoutedEventArgs e)
+ {
+ if (pluginStoreFilterTxb.Text != lastPluginStoreSearch)
+ {
+ lastPluginStoreSearch = pluginStoreFilterTxb.Text;
+ pluginStoreView.Refresh();
+ }
+ }
+
+ private void PluginFilterTxb_OnKeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.Key == Key.Enter)
+ RefreshPluginListEventHandler(sender, e);
+ }
+
+ private void PluginStoreFilterTxb_OnKeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.Key == Key.Enter)
+ RefreshPluginStoreEventHandler(sender, e);
+ }
+
+ private void OnPluginSettingKeydown(object sender, KeyEventArgs e)
+ {
+ if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control && e.Key == Key.F)
+ pluginFilterTxb.Focus();
+ }
+
+ private void PluginStore_OnKeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.Key == Key.F && (Keyboard.Modifiers & ModifierKeys.Control) != 0)
+ {
+ pluginStoreFilterTxb.Focus();
+ }
+ }
+
+ private void PreviewClockAndDate(object sender, RoutedEventArgs e)
+ {
+ ClockDisplay();
+ }
+
+ public void ClockDisplay()
+ {
+ if (settings.UseClock)
+ {
+ ClockBox.Visibility = Visibility.Visible;
+ ClockBox.Text = DateTime.Now.ToString(settings.TimeFormat);
+ }
+ else
+ {
+ ClockBox.Visibility = Visibility.Collapsed;
+ }
+
+ if (settings.UseDate)
+ {
+ DateBox.Visibility = Visibility.Visible;
+ DateBox.Text = DateTime.Now.ToString(settings.DateFormat);
+ }
+ else
+ {
+ DateBox.Visibility = Visibility.Collapsed;
+ }
+ }
+
+ public void InitializePosition()
+ {
+ if (settings.SettingWindowTop >= 0 && settings.SettingWindowLeft >= 0)
+ {
+ Top = settings.SettingWindowTop;
+ Left = settings.SettingWindowLeft;
+ }
+ else
+ {
+ Top = WindowTop();
+ Left = WindowLeft();
+ }
+ WindowState = settings.SettingWindowState;
+ }
+ public double WindowLeft()
+ {
+ var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
+ var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
+ var left = (dip2.X - this.ActualWidth) / 2 + dip1.X;
+ return left;
+ }
+
+ public double WindowTop()
+ {
+ var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
+ var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height);
+ var top = (dip2.Y - this.ActualHeight) / 2 + dip1.Y - 20;
+ return top;
+ }
+
+ private Button storeClickedButton;
+
+ private void StoreListItem_Click(object sender, RoutedEventArgs e)
+ {
+ if (sender is not Button button)
+ return;
+
+ storeClickedButton = button;
+
+ var flyout = FlyoutService.GetFlyout(button);
+ flyout.Closed += (_, _) =>
+ {
+ storeClickedButton = null;
+ };
+
+ }
}
}
diff --git a/Flow.Launcher/Themes/Atom.xaml b/Flow.Launcher/Themes/Atom.xaml
index ed369ee55..c1fcd90d1 100644
--- a/Flow.Launcher/Themes/Atom.xaml
+++ b/Flow.Launcher/Themes/Atom.xaml
@@ -1,64 +1,100 @@
-
+
-
-
-
-
-
-
+
-
-
-
-
-
-
#2c313c
-
-
-
-
-
-
-
+
+
diff --git a/Flow.Launcher/Themes/Base.xaml b/Flow.Launcher/Themes/Base.xaml
index f7669f8d3..92b842c69 100644
--- a/Flow.Launcher/Themes/Base.xaml
+++ b/Flow.Launcher/Themes/Base.xaml
@@ -79,6 +79,84 @@
+
+
+
+
+
+
+
+
+
+
@@ -36,6 +37,7 @@
x:Key="WindowBorderStyle"
BasedOn="{StaticResource BaseWindowBorderStyle}"
TargetType="{x:Type Border}">
+
@@ -140,4 +142,18 @@
+
+
diff --git a/Flow.Launcher/Themes/BlurWhite.xaml b/Flow.Launcher/Themes/BlurWhite.xaml
index 1b939f736..6308f9e47 100644
--- a/Flow.Launcher/Themes/BlurWhite.xaml
+++ b/Flow.Launcher/Themes/BlurWhite.xaml
@@ -50,7 +50,7 @@
TargetType="{x:Type Window}">
-
+
@@ -143,4 +143,18 @@
+
+
diff --git a/Flow.Launcher/Themes/Darker Glass.xaml b/Flow.Launcher/Themes/Darker Glass.xaml
index 71d6f4e48..41f2d16bf 100644
--- a/Flow.Launcher/Themes/Darker Glass.xaml
+++ b/Flow.Launcher/Themes/Darker Glass.xaml
@@ -1,84 +1,131 @@
-
+
-
-
-
-
-
-
+
-
-
-
-
-
#545454
-
-
-
-
-
+
+
diff --git a/Flow.Launcher/Themes/Darker.xaml b/Flow.Launcher/Themes/Darker.xaml
index 675092bf8..b255c4d9e 100644
--- a/Flow.Launcher/Themes/Darker.xaml
+++ b/Flow.Launcher/Themes/Darker.xaml
@@ -1,51 +1,97 @@
-
+
-
-
-
-
+
-
+
-
+
-
-
-
-
-
#4d4d4d
-
-
-
+
+
-
+
diff --git a/Flow.Launcher/Themes/Discord Dark.xaml b/Flow.Launcher/Themes/Discord Dark.xaml
index 2ddb9ae09..b8872385e 100644
--- a/Flow.Launcher/Themes/Discord Dark.xaml
+++ b/Flow.Launcher/Themes/Discord Dark.xaml
@@ -1,64 +1,101 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
#49443c
-
-
-
-
-
-
+
+
diff --git a/Flow.Launcher/Themes/Dracula.xaml b/Flow.Launcher/Themes/Dracula.xaml
index c46dcff16..0dd97b9fe 100644
--- a/Flow.Launcher/Themes/Dracula.xaml
+++ b/Flow.Launcher/Themes/Dracula.xaml
@@ -1,64 +1,100 @@
-
+
-
-
-
-
-
-
+
-
-
-
-
-
-
#44475a
-
-
-
-
-
-
-
+
+
diff --git a/Flow.Launcher/Themes/Gray.xaml b/Flow.Launcher/Themes/Gray.xaml
index c3cec7bd8..1cacc8ec2 100644
--- a/Flow.Launcher/Themes/Gray.xaml
+++ b/Flow.Launcher/Themes/Gray.xaml
@@ -1,61 +1,107 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
#787878
-
-
-
+
+
+
diff --git a/Flow.Launcher/Themes/League.xaml b/Flow.Launcher/Themes/League.xaml
index 4932b71eb..d926f0519 100644
--- a/Flow.Launcher/Themes/League.xaml
+++ b/Flow.Launcher/Themes/League.xaml
@@ -118,6 +118,18 @@
+
+
-
-
-
-
-
-
-
-
-
+
+
#04152E
-
-
-
+
+
+
diff --git a/Flow.Launcher/Themes/Nord Darker.xaml b/Flow.Launcher/Themes/Nord Darker.xaml
index 3c9cc2678..3946b91ff 100644
--- a/Flow.Launcher/Themes/Nord Darker.xaml
+++ b/Flow.Launcher/Themes/Nord Darker.xaml
@@ -1,64 +1,110 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
#4e586b
-
-
-
+
+
diff --git a/Flow.Launcher/Themes/Nord.xaml b/Flow.Launcher/Themes/Nord.xaml
index 4d8ffee39..dafb83c39 100644
--- a/Flow.Launcher/Themes/Nord.xaml
+++ b/Flow.Launcher/Themes/Nord.xaml
@@ -1,63 +1,109 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
#596479
-
-
-
+
+
diff --git a/Flow.Launcher/Themes/Pink.xaml b/Flow.Launcher/Themes/Pink.xaml
index cb5f56a8e..7e1ae911a 100644
--- a/Flow.Launcher/Themes/Pink.xaml
+++ b/Flow.Launcher/Themes/Pink.xaml
@@ -1,63 +1,102 @@
-
+
-
+
-
-
-
-
-
-
-
-
-
-
+
+
#cc1081
-
-
+
F1 M20,20z M0,0z M14.75,1A5.24,5.24,0,0,0,10,4A5.24,5.24,0,0,0,0,6.25C0,11.75 10,19 10,19 10,19 20,11.75 20,6.25A5.25,5.25,0,0,0,14.75,1z
@@ -74,4 +113,16 @@
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/Sublime.xaml b/Flow.Launcher/Themes/Sublime.xaml
index 57648be7a..4cc2248f3 100644
--- a/Flow.Launcher/Themes/Sublime.xaml
+++ b/Flow.Launcher/Themes/Sublime.xaml
@@ -1,64 +1,101 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
#3c454e
-
-
-
-
-
-
+
+
diff --git a/Flow.Launcher/Themes/Win10Light.xaml b/Flow.Launcher/Themes/Win10Light.xaml
index c08df312e..7d3ae2cac 100644
--- a/Flow.Launcher/Themes/Win10Light.xaml
+++ b/Flow.Launcher/Themes/Win10Light.xaml
@@ -1,67 +1,104 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
#ccd0d4
-
-
-
-
-
-
+
+
diff --git a/Flow.Launcher/Themes/Win11Dark.xaml b/Flow.Launcher/Themes/Win11Dark.xaml
index 0f92b5c28..1558bd1f4 100644
--- a/Flow.Launcher/Themes/Win11Dark.xaml
+++ b/Flow.Launcher/Themes/Win11Dark.xaml
@@ -156,6 +156,18 @@
+
+
diff --git a/Flow.Launcher/Themes/Win11Light.xaml b/Flow.Launcher/Themes/Win11Light.xaml
index 715dda2e2..731246565 100644
--- a/Flow.Launcher/Themes/Win11Light.xaml
+++ b/Flow.Launcher/Themes/Win11Light.xaml
@@ -164,6 +164,18 @@
+
+
diff --git a/Flow.Launcher/Themes/Win11System.xaml b/Flow.Launcher/Themes/Win11System.xaml
index b3f425508..d136d24a8 100644
--- a/Flow.Launcher/Themes/Win11System.xaml
+++ b/Flow.Launcher/Themes/Win11System.xaml
@@ -156,6 +156,18 @@
+
+
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index e62899261..73be0bbed 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -17,14 +17,16 @@ using Flow.Launcher.Plugin.SharedCommands;
using Flow.Launcher.Storage;
using Flow.Launcher.Infrastructure.Logger;
using Microsoft.VisualStudio.Threading;
+using System.Text;
using System.Threading.Channels;
using ISavable = Flow.Launcher.Plugin.ISavable;
using System.IO;
using System.Collections.Specialized;
+using CommunityToolkit.Mvvm.Input;
namespace Flow.Launcher.ViewModel
{
- public class MainViewModel : BaseModel, ISavable
+ public partial class MainViewModel : BaseModel, ISavable
{
#region Private Fields
@@ -37,7 +39,6 @@ namespace Flow.Launcher.ViewModel
private readonly FlowLauncherJsonStorage _historyItemsStorage;
private readonly FlowLauncherJsonStorage _userSelectedRecordStorage;
private readonly FlowLauncherJsonStorage _topMostRecordStorage;
- internal readonly Settings _settings;
private readonly History _history;
private readonly UserSelectedRecord _userSelectedRecord;
private readonly TopMostRecord _topMostRecord;
@@ -60,8 +61,8 @@ namespace Flow.Launcher.ViewModel
_queryText = "";
_lastQuery = new Query();
- _settings = settings;
- _settings.PropertyChanged += (_, args) =>
+ Settings = settings;
+ Settings.PropertyChanged += (_, args) =>
{
if (args.PropertyName == nameof(Settings.WindowSize))
{
@@ -76,14 +77,16 @@ namespace Flow.Launcher.ViewModel
_userSelectedRecord = _userSelectedRecordStorage.Load();
_topMostRecord = _topMostRecordStorage.Load();
- ContextMenu = new ResultsViewModel(_settings);
- Results = new ResultsViewModel(_settings);
- History = new ResultsViewModel(_settings);
+ ContextMenu = new ResultsViewModel(Settings);
+ Results = new ResultsViewModel(Settings);
+ History = new ResultsViewModel(Settings);
_selectedResults = Results;
InitializeKeyCommands();
+
RegisterViewUpdate();
RegisterResultsUpdatedEvent();
+ RegisterClockAndDateUpdateAsync();
SetOpenResultModifiers();
}
@@ -154,6 +157,8 @@ namespace Flow.Launcher.ViewModel
}
}
+
+
private void InitializeKeyCommands()
{
EscCommand = new RelayCommand(_ =>
@@ -307,7 +312,7 @@ namespace Flow.Launcher.ViewModel
Notification.Show(
InternationalizationManager.Instance.GetTranslation("success"),
InternationalizationManager.Instance.GetTranslation("completedSuccessfully")
- );
+ );
}), TaskScheduler.Default)
.ConfigureAwait(false);
});
@@ -317,10 +322,26 @@ namespace Flow.Launcher.ViewModel
#region ViewModel Properties
+ public Settings Settings { get; }
+ public object ClockText { get; private set; }
+ public string DateText { get; private set; }
+
+ private async Task RegisterClockAndDateUpdateAsync()
+ {
+ var timer = new PeriodicTimer(TimeSpan.FromSeconds(1));
+ // ReSharper disable once MethodSupportsCancellation
+ while (await timer.WaitForNextTickAsync().ConfigureAwait(false))
+ {
+ if (Settings.UseClock)
+ ClockText = DateTime.Now.ToString(Settings.TimeFormat);
+ if (Settings.UseDate)
+ DateText = DateTime.Now.ToString(Settings.DateFormat);
+ }
+ }
public ResultsViewModel Results { get; private set; }
-
+
public ResultsViewModel ContextMenu { get; private set; }
-
+
public ResultsViewModel History { get; private set; }
public bool GameModeStatus { get; set; }
@@ -336,6 +357,55 @@ namespace Flow.Launcher.ViewModel
}
}
+
+ [RelayCommand]
+ private void IncreaseWidth()
+ {
+ if (MainWindowWidth + 100 > 1920 || Settings.WindowSize == 1920)
+ {
+ Settings.WindowSize = 1920;
+ }
+ else
+ {
+ Settings.WindowSize += 100;
+ Settings.WindowLeft -= 50;
+ }
+ OnPropertyChanged();
+ }
+
+ [RelayCommand]
+ private void DecreaseWidth()
+ {
+ if (MainWindowWidth - 100 < 400 || Settings.WindowSize == 400)
+ {
+ Settings.WindowSize = 400;
+ }
+ else
+ {
+ Settings.WindowLeft += 50;
+ Settings.WindowSize -= 100;
+ }
+ OnPropertyChanged();
+ }
+
+ [RelayCommand]
+ private void IncreaseMaxResult()
+ {
+ if (Settings.MaxResultsToShow == 17)
+ return;
+
+ Settings.MaxResultsToShow += 1;
+ }
+
+ [RelayCommand]
+ private void DecreaseMaxResult()
+ {
+ if (Settings.MaxResultsToShow == 2)
+ return;
+
+ Settings.MaxResultsToShow -= 1;
+ }
+
///
/// we need move cursor to end when we manually changed query
/// but we don't want to move cursor to end when query is updated from TextBox
@@ -411,7 +481,11 @@ namespace Flow.Launcher.ViewModel
public Visibility SearchIconVisibility { get; set; }
- public double MainWindowWidth => _settings.WindowSize;
+ public double MainWindowWidth
+ {
+ get => Settings.WindowSize;
+ set => Settings.WindowSize = value;
+ }
public string PluginIconPath { get; set; } = null;
@@ -548,7 +622,9 @@ namespace Flow.Launcher.ViewModel
{
_updateSource?.Cancel();
- if (string.IsNullOrWhiteSpace(QueryText))
+ var query = ConstructQuery(QueryText, Settings.CustomShortcuts, Settings.BuiltinShortcuts);
+
+ if (query == null) // shortcut expanded
{
Results.Clear();
Results.Visbility = Visibility.Collapsed;
@@ -572,8 +648,7 @@ namespace Flow.Launcher.ViewModel
if (currentCancellationToken.IsCancellationRequested)
return;
-
- var query = QueryBuilder.Build(QueryText, PluginManager.NonGlobalPlugins);
+
// handle the exclusiveness of plugin using action keyword
RemoveOldQueryResults(query);
@@ -592,7 +667,7 @@ namespace Flow.Launcher.ViewModel
PluginIconPath = null;
SearchIconVisibility = Visibility.Visible;
}
-
+
if (query.ActionKeyword == Plugin.Query.GlobalPluginWildcardSign)
{
@@ -663,6 +738,40 @@ namespace Flow.Launcher.ViewModel
}
}
+ private Query ConstructQuery(string queryText, IEnumerable customShortcuts, IEnumerable builtInShortcuts)
+ {
+ if (string.IsNullOrWhiteSpace(queryText))
+ {
+ return null;
+ }
+
+ StringBuilder queryBuilder = new(queryText);
+ StringBuilder queryBuilderTmp = new(queryText);
+
+ foreach (var shortcut in customShortcuts)
+ {
+ if (queryBuilder.Equals(shortcut.Key))
+ {
+ queryBuilder.Replace(shortcut.Key, shortcut.Expand());
+ }
+
+ queryBuilder.Replace('@' + shortcut.Key, shortcut.Expand());
+ }
+
+ foreach (var shortcut in builtInShortcuts)
+ {
+ queryBuilder.Replace(shortcut.Key, shortcut.Expand());
+ queryBuilderTmp.Replace(shortcut.Key, shortcut.Expand());
+ }
+
+ // show expanded builtin shortcuts
+ // use private field to avoid infinite recursion
+ _queryText = queryBuilderTmp.ToString();
+
+ var query = QueryBuilder.Build(queryBuilder.ToString().Trim(), PluginManager.NonGlobalPlugins);
+ return query;
+ }
+
private void RemoveOldQueryResults(Query query)
{
if (_lastQuery?.ActionKeyword != query?.ActionKeyword)
@@ -759,7 +868,7 @@ namespace Flow.Launcher.ViewModel
private void SetOpenResultModifiers()
{
- OpenResultCommandModifiers = _settings.OpenResultModifiers ?? DefaultOpenResultModifiers;
+ OpenResultCommandModifiers = Settings.OpenResultModifiers ?? DefaultOpenResultModifiers;
}
public void ToggleFlowLauncher()
@@ -788,24 +897,24 @@ namespace Flow.Launcher.ViewModel
// Trick for no delay
MainWindowOpacity = 0;
- switch (_settings.LastQueryMode)
+ switch (Settings.LastQueryMode)
{
case LastQueryMode.Empty:
ChangeQueryText(string.Empty);
await Task.Delay(100); //Time for change to opacity
break;
case LastQueryMode.Preserved:
- if (_settings.UseAnimation)
+ if (Settings.UseAnimation)
await Task.Delay(100);
LastQuerySelected = true;
break;
case LastQueryMode.Selected:
- if (_settings.UseAnimation)
+ if (Settings.UseAnimation)
await Task.Delay(100);
LastQuerySelected = false;
break;
default:
- throw new ArgumentException($"wrong LastQueryMode: <{_settings.LastQueryMode}>");
+ throw new ArgumentException($"wrong LastQueryMode: <{Settings.LastQueryMode}>");
}
MainWindowVisibilityStatus = false;
@@ -820,7 +929,7 @@ namespace Flow.Launcher.ViewModel
///
public bool ShouldIgnoreHotkeys()
{
- return _settings.IgnoreHotkeysOnFullscreen && WindowsInteropHelper.IsWindowFullscreen();
+ return Settings.IgnoreHotkeysOnFullscreen && WindowsInteropHelper.IsWindowFullscreen();
}
@@ -893,28 +1002,26 @@ namespace Flow.Launcher.ViewModel
var result = Results.SelectedItem?.Result;
if (result != null)
{
- string copyText = string.IsNullOrEmpty(result.CopyText) ? result.SubTitle : result.CopyText;
+ string copyText = result.CopyText;
var isFile = File.Exists(copyText);
var isFolder = Directory.Exists(copyText);
if (isFile || isFolder)
{
- var paths = new StringCollection();
- paths.Add(copyText);
+ var paths = new StringCollection
+ {
+ copyText
+ };
Clipboard.SetFileDropList(paths);
App.API.ShowMsg(
- App.API.GetTranslation("copy")
- +" "
- + (isFile? App.API.GetTranslation("fileTitle") : App.API.GetTranslation("folderTitle")),
+ $"{App.API.GetTranslation("copy")} {(isFile ? App.API.GetTranslation("fileTitle") : App.API.GetTranslation("folderTitle"))}",
App.API.GetTranslation("completedSuccessfully"));
}
else
{
- Clipboard.SetDataObject(copyText.ToString());
+ Clipboard.SetDataObject(copyText);
App.API.ShowMsg(
- App.API.GetTranslation("copy")
- + " "
- + App.API.GetTranslation("textTitle"),
+ $"{App.API.GetTranslation("copy")} {App.API.GetTranslation("textTitle")}",
App.API.GetTranslation("completedSuccessfully"));
}
}
diff --git a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
new file mode 100644
index 000000000..622e41b1b
--- /dev/null
+++ b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
@@ -0,0 +1,58 @@
+using System;
+using Flow.Launcher.Core.ExternalPlugins;
+using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.ViewModel
+{
+ public class PluginStoreItemViewModel : BaseModel
+ {
+ public PluginStoreItemViewModel(UserPlugin plugin)
+ {
+ _plugin = plugin;
+ }
+
+ private UserPlugin _plugin;
+
+ public string ID => _plugin.ID;
+ public string Name => _plugin.Name;
+ public string Description => _plugin.Description;
+ public string Author => _plugin.Author;
+ public string Version => _plugin.Version;
+ public string Language => _plugin.Language;
+ public string Website => _plugin.Website;
+ public string UrlDownload => _plugin.UrlDownload;
+ public string UrlSourceCode => _plugin.UrlSourceCode;
+ public string IcoPath => _plugin.IcoPath;
+
+ public bool LabelInstalled => PluginManager.GetPluginForId(_plugin.ID) != null;
+ public bool LabelUpdate => LabelInstalled && _plugin.Version != PluginManager.GetPluginForId(_plugin.ID).Metadata.Version;
+
+ internal const string None = "None";
+ internal const string RecentlyUpdated = "RecentlyUpdated";
+ internal const string NewRelease = "NewRelease";
+ internal const string Installed = "Installed";
+
+ public string Category
+ {
+ get
+ {
+ string category = None;
+ if (DateTime.Now - _plugin.LatestReleaseDate < TimeSpan.FromDays(7))
+ {
+ category = RecentlyUpdated;
+ }
+ if (DateTime.Now - _plugin.DateAdded < TimeSpan.FromDays(7))
+ {
+ category = NewRelease;
+ }
+ if (PluginManager.GetPluginForId(_plugin.ID) != null)
+ {
+ category = Installed;
+ }
+
+ return category;
+ }
+ }
+ }
+}
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index 738bd0ec4..2294681b4 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -1,4 +1,4 @@
-using System.Windows;
+using System.Windows;
using System.Windows.Media;
using Flow.Launcher.Plugin;
using Flow.Launcher.Infrastructure.Image;
@@ -30,9 +30,26 @@ namespace Flow.Launcher.ViewModel
get => !PluginPair.Metadata.Disabled;
set => PluginPair.Metadata.Disabled = !value;
}
+ public bool IsExpanded
+ {
+ get => _isExpanded;
+ set
+ {
+ _isExpanded = value;
+ OnPropertyChanged();
+ OnPropertyChanged(nameof(SettingControl));
+ }
+ }
private Control _settingControl;
- public Control SettingControl => _settingControl ??= PluginPair.Plugin is not ISettingProvider settingProvider ? new Control() : settingProvider.CreateSettingPanel();
+ private bool _isExpanded;
+ public Control SettingControl
+ => IsExpanded
+ ? _settingControl
+ ??= PluginPair.Plugin is not ISettingProvider settingProvider
+ ? new Control()
+ : settingProvider.CreateSettingPanel()
+ : null;
public Visibility ActionKeywordsVisibility => PluginPair.Metadata.ActionKeywords.Count == 1 ? Visibility.Visible : Visibility.Collapsed;
public string InitilizaTime => PluginPair.Metadata.InitTime + "ms";
diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs
index 1e2531ec0..3f003045e 100644
--- a/Flow.Launcher/ViewModel/ResultViewModel.cs
+++ b/Flow.Launcher/ViewModel/ResultViewModel.cs
@@ -185,15 +185,17 @@ namespace Flow.Launcher.ViewModel
}
}
+ var loadFullImage = (Path.GetExtension(imagePath) ?? "").Equals(".url", StringComparison.OrdinalIgnoreCase);
+
if (ImageLoader.CacheContainImage(imagePath))
{
// will get here either when icoPath has value\icon delegate is null\when had exception in delegate
- image = ImageLoader.Load(imagePath);
+ image = ImageLoader.Load(imagePath, loadFullImage);
return;
}
// We need to modify the property not field here to trigger the OnPropertyChanged event
- Image = await Task.Run(() => ImageLoader.Load(imagePath)).ConfigureAwait(false);
+ Image = await Task.Run(() => ImageLoader.Load(imagePath, loadFullImage)).ConfigureAwait(false);
}
diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
index 64cb9e36c..fa6520523 100644
--- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
+++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
@@ -19,10 +19,12 @@ using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedModels;
+using System.Collections.ObjectModel;
+using CommunityToolkit.Mvvm.Input;
namespace Flow.Launcher.ViewModel
{
- public class SettingWindowViewModel : BaseModel
+ public partial class SettingWindowViewModel : BaseModel
{
private readonly Updater _updater;
private readonly IPortable _portable;
@@ -41,6 +43,9 @@ namespace Flow.Launcher.ViewModel
case nameof(Settings.ActivateTimes):
OnPropertyChanged(nameof(ActivatedTimes));
break;
+ case nameof(Settings.WindowSize):
+ OnPropertyChanged(nameof(WindowWidthSize));
+ break;
}
};
}
@@ -51,7 +56,7 @@ namespace Flow.Launcher.ViewModel
{
await _updater.UpdateAppAsync(App.API, false);
}
-
+
public bool AutoUpdates
{
get => Settings.AutoUpdates;
@@ -209,11 +214,19 @@ namespace Flow.Launcher.ViewModel
}
}
- public List OpenResultModifiersList => new List { KeyConstant.Alt, KeyConstant.Ctrl, $"{KeyConstant.Ctrl}+{KeyConstant.Alt}" };
+ public List OpenResultModifiersList => new List
+ {
+ KeyConstant.Alt,
+ KeyConstant.Ctrl,
+ $"{KeyConstant.Ctrl}+{KeyConstant.Alt}"
+ };
private Internationalization _translater => InternationalizationManager.Instance;
public List Languages => _translater.LoadAvailableLanguages();
public IEnumerable MaxResultsRange => Enumerable.Range(2, 16);
+ public ObservableCollection CustomShortcuts => Settings.CustomShortcuts;
+ public ObservableCollection BuiltinShortcuts => Settings.BuiltinShortcuts;
+
public string TestProxy()
{
var proxyServer = Settings.Proxy.Server;
@@ -272,20 +285,33 @@ namespace Flow.Launcher.ViewModel
var metadatas = PluginManager.AllPlugins
.OrderBy(x => x.Metadata.Disabled)
.ThenBy(y => y.Metadata.Name)
- .Select(p => new PluginViewModel { PluginPair = p })
+ .Select(p => new PluginViewModel
+ {
+ PluginPair = p
+ })
.ToList();
return metadatas;
}
}
- public IList ExternalPlugins
+ public IList ExternalPlugins
{
get
{
- return PluginsManifest.UserPlugins;
+ return LabelMaker(PluginsManifest.UserPlugins);
}
}
+ private IList LabelMaker(IList list)
+ {
+ return list.Select(p=>new PluginStoreItemViewModel(p))
+ .OrderByDescending(p => p.Category == PluginStoreItemViewModel.NewRelease)
+ .ThenByDescending(p=>p.Category == PluginStoreItemViewModel.RecentlyUpdated)
+ .ThenByDescending(p => p.Category == PluginStoreItemViewModel.None)
+ .ThenByDescending(p => p.Category == PluginStoreItemViewModel.Installed)
+ .ToList();
+ }
+
public Control SettingProvider
{
get
@@ -305,12 +331,22 @@ namespace Flow.Launcher.ViewModel
}
}
- public async Task RefreshExternalPluginsAsync()
+ [RelayCommand]
+ private async Task RefreshExternalPluginsAsync()
{
await PluginsManifest.UpdateManifestAsync();
OnPropertyChanged(nameof(ExternalPlugins));
}
+ internal void DisplayPluginQuery(string queryToDisplay, PluginPair plugin, int actionKeywordPosition = 0)
+ {
+ var actionKeyword = plugin.Metadata.ActionKeywords.Count == 0
+ ? string.Empty
+ : plugin.Metadata.ActionKeywords[actionKeywordPosition];
+
+ App.API.ChangeQuery($"{actionKeyword} {queryToDisplay}");
+ App.API.ShowMainWindow();
+ }
#endregion
@@ -375,13 +411,61 @@ namespace Flow.Launcher.ViewModel
{
var key = $"ColorScheme{e}";
var display = _translater.GetTranslation(key);
- var m = new ColorScheme { Display = display, Value = e, };
+ var m = new ColorScheme
+ {
+ Display = display,
+ Value = e,
+ };
modes.Add(m);
}
return modes;
}
}
+
+
+ public class SearchWindowPosition
+ {
+ public string Display { get; set; }
+ public SearchWindowPositions Value { get; set; }
+ }
+
+ public List SearchWindowPositions
+ {
+ get
+ {
+ List modes = new List();
+ var enums = (SearchWindowPositions[])Enum.GetValues(typeof(SearchWindowPositions));
+ foreach (var e in enums)
+ {
+ var key = $"SearchWindowPosition{e}";
+ var display = _translater.GetTranslation(key);
+ var m = new SearchWindowPosition { Display = display, Value = e, };
+ modes.Add(m);
+ }
+ return modes;
+ }
+ }
+
+ public List TimeFormatList { get; set; } = new List()
+ {
+ "hh:mm",
+ "HH:mm",
+ "tt hh:mm",
+ "hh:mm tt"
+ };
+
+ public List DateFormatList { get; set; } = new List()
+ {
+ "MM'/'dd dddd",
+ "MM'/'dd ddd",
+ "MM'/'dd",
+ "dd'/'MM",
+ "ddd MM'/'dd",
+ "dddd MM'/'dd",
+ "dddd"
+ };
+
public double WindowWidthSize
{
get => Settings.WindowSize;
@@ -406,6 +490,42 @@ namespace Flow.Launcher.ViewModel
set => Settings.UseSound = value;
}
+ public bool UseClock
+ {
+ get => Settings.UseClock;
+ set => Settings.UseClock = value;
+ }
+
+ public bool UseDate
+ {
+ get => Settings.UseDate;
+ set => Settings.UseDate = value;
+ }
+
+ public double SettingWindowWidth
+ {
+ get => Settings.SettingWindowWidth;
+ set => Settings.SettingWindowWidth = value;
+ }
+
+ public double SettingWindowHeight
+ {
+ get => Settings.SettingWindowHeight;
+ set => Settings.SettingWindowHeight = value;
+ }
+
+ public double SettingWindowTop
+ {
+ get => Settings.SettingWindowTop;
+ set => Settings.SettingWindowTop = value;
+ }
+
+ public double SettingWindowLeft
+ {
+ get => Settings.SettingWindowLeft;
+ set => Settings.SettingWindowLeft = value;
+ }
+
public Brush PreviewBackground
{
get
@@ -417,8 +537,13 @@ namespace Flow.Launcher.ViewModel
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = memStream;
+ bitmap.DecodePixelWidth = 800;
+ bitmap.DecodePixelHeight = 600;
bitmap.EndInit();
- var brush = new ImageBrush(bitmap) { Stretch = Stretch.UniformToFill };
+ var brush = new ImageBrush(bitmap)
+ {
+ Stretch = Stretch.UniformToFill
+ };
return brush;
}
else
@@ -446,19 +571,19 @@ namespace Flow.Launcher.ViewModel
{
Title = "WebSearch",
SubTitle = "Search the web with different search engine support",
- IcoPath =Path.Combine(Constant.ProgramDirectory, @"Plugins\Flow.Launcher.Plugin.WebSearch\Images\web_search.png")
+ IcoPath = Path.Combine(Constant.ProgramDirectory, @"Plugins\Flow.Launcher.Plugin.WebSearch\Images\web_search.png")
},
new Result
{
Title = "Program",
SubTitle = "Launch programs as admin or a different user",
- IcoPath =Path.Combine(Constant.ProgramDirectory, @"Plugins\Flow.Launcher.Plugin.Program\Images\program.png")
+ IcoPath = Path.Combine(Constant.ProgramDirectory, @"Plugins\Flow.Launcher.Plugin.Program\Images\program.png")
},
new Result
{
Title = "ProcessKiller",
SubTitle = "Terminate unwanted processes",
- IcoPath =Path.Combine(Constant.ProgramDirectory, @"Plugins\Flow.Launcher.Plugin.ProcessKiller\Images\app.png")
+ IcoPath = Path.Combine(Constant.ProgramDirectory, @"Plugins\Flow.Launcher.Plugin.ProcessKiller\Images\app.png")
}
};
var vm = new ResultsViewModel(Settings);
@@ -472,8 +597,8 @@ namespace Flow.Launcher.ViewModel
get
{
if (Fonts.SystemFontFamilies.Count(o =>
- o.FamilyNames.Values != null &&
- o.FamilyNames.Values.Contains(Settings.QueryBoxFont)) > 0)
+ o.FamilyNames.Values != null &&
+ o.FamilyNames.Values.Contains(Settings.QueryBoxFont)) > 0)
{
var font = new FontFamily(Settings.QueryBoxFont);
return font;
@@ -500,7 +625,7 @@ namespace Flow.Launcher.ViewModel
Settings.QueryBoxFontStyle,
Settings.QueryBoxFontWeight,
Settings.QueryBoxFontStretch
- ));
+ ));
return typeface;
}
set
@@ -517,8 +642,8 @@ namespace Flow.Launcher.ViewModel
get
{
if (Fonts.SystemFontFamilies.Count(o =>
- o.FamilyNames.Values != null &&
- o.FamilyNames.Values.Contains(Settings.ResultFont)) > 0)
+ o.FamilyNames.Values != null &&
+ o.FamilyNames.Values.Contains(Settings.ResultFont)) > 0)
{
var font = new FontFamily(Settings.ResultFont);
return font;
@@ -545,7 +670,7 @@ namespace Flow.Launcher.ViewModel
Settings.ResultFontStyle,
Settings.ResultFontWeight,
Settings.ResultFontStretch
- ));
+ ));
return typeface;
}
set
@@ -567,6 +692,65 @@ namespace Flow.Launcher.ViewModel
#endregion
+ #region shortcut
+
+ public CustomShortcutModel? SelectedCustomShortcut { get; set; }
+
+ public void DeleteSelectedCustomShortcut()
+ {
+ var item = SelectedCustomShortcut;
+ if (item == null)
+ {
+ MessageBox.Show(InternationalizationManager.Instance.GetTranslation("pleaseSelectAnItem"));
+ return;
+ }
+
+ string deleteWarning = string.Format(
+ InternationalizationManager.Instance.GetTranslation("deleteCustomShortcutWarning"),
+ item?.Key, item?.Value);
+ if (MessageBox.Show(deleteWarning, InternationalizationManager.Instance.GetTranslation("delete"),
+ MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ {
+ Settings.CustomShortcuts.Remove(item);
+ }
+ }
+
+ public bool EditSelectedCustomShortcut()
+ {
+ var item = SelectedCustomShortcut;
+ if (item == null)
+ {
+ MessageBox.Show(InternationalizationManager.Instance.GetTranslation("pleaseSelectAnItem"));
+ return false;
+ }
+
+ var shortcutSettingWindow = new CustomShortcutSetting(item.Key, item.Value, this);
+ if (shortcutSettingWindow.ShowDialog() == true)
+ {
+ item.Key = shortcutSettingWindow.Key;
+ item.Value = shortcutSettingWindow.Value;
+ return true;
+ }
+ return false;
+ }
+
+ public void AddCustomShortcut()
+ {
+ var shortcutSettingWindow = new CustomShortcutSetting(this);
+ if (shortcutSettingWindow.ShowDialog() == true)
+ {
+ var shortcut = new CustomShortcutModel(shortcutSettingWindow.Key, shortcutSettingWindow.Value);
+ Settings.CustomShortcuts.Add(shortcut);
+ }
+ }
+
+ public bool ShortcutExists(string key)
+ {
+ return Settings.CustomShortcuts.Any(x => x.Key == key) || Settings.BuiltinShortcuts.Any(x => x.Key == key);
+ }
+
+ #endregion
+
#region about
public string Website => Constant.Website;
@@ -576,6 +760,45 @@ namespace Flow.Launcher.ViewModel
public string Github => Constant.GitHub;
public static string Version => Constant.Version;
public string ActivatedTimes => string.Format(_translater.GetTranslation("about_activate_times"), Settings.ActivateTimes);
+
+ public string CheckLogFolder
+ {
+ get
+ {
+ var dirInfo = new DirectoryInfo(Path.Combine(DataLocation.DataDirectory(), Constant.Logs, Constant.Version));
+ long size = dirInfo.EnumerateFiles("*", SearchOption.AllDirectories).Sum(file => file.Length);
+
+ return _translater.GetTranslation("clearlogfolder") + " (" + FormatBytes(size) + ")" ;
+ }
+ }
+
+ internal void ClearLogFolder()
+ {
+ var directory = new DirectoryInfo(
+ Path.Combine(
+ DataLocation.DataDirectory(),
+ Constant.Logs,
+ Constant.Version));
+
+ directory.EnumerateFiles()
+ .ToList()
+ .ForEach(x => x.Delete());
+ }
+ internal string FormatBytes(long bytes)
+ {
+ const int scale = 1024;
+ string[] orders = new string[] { "GB", "MB", "KB", "Bytes" };
+ long max = (long)Math.Pow(scale, orders.Length - 1);
+
+ foreach (string order in orders)
+ {
+ if (bytes > max)
+ return string.Format("{0:##.##} {1}", decimal.Divide(bytes, max), order);
+
+ max /= scale;
+ }
+ return "0 Bytes";
+ }
#endregion
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
index a741b8c9a..fcb2beef5 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
@@ -3,7 +3,7 @@
Marcadores del navegador
- Busque en sus marcadores del navegador
+ Busca en los marcadores del navegadorDatos de marcador
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
index f0f2d79bb..789738016 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
@@ -2,21 +2,21 @@
- Browser Bookmarks
- Search your browser bookmarks
+ Segnalibri del Browser
+ Cerca nei segnalibri del tuo browser
- Bookmark Data
- Open bookmarks in:
- New window
- New tab
- Set browser from path:
- Choose
- Copy url
- Copy the bookmark's url to clipboard
- Load Browser From:
- Browser Name
- Data Directory Path
+ Dati del segnalibro
+ Apri preferiti in:
+ Nuova finestra
+ Nuova scheda
+ Imposta il browser dal percorso:
+ Scegli
+ Copia url
+ Copia l'url del segnalibro negli appunti
+ Carica Il Browser Da:
+ Nome del browser
+ Percorso cartella DataAggiungiCancella
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
index 0fe809926..e65e7d497 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
@@ -62,7 +62,7 @@
-
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
index 15598118c..7809bcfa1 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
@@ -1,15 +1,15 @@
- Calculator
- Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
- Not a number (NaN)
- Expression wrong or incomplete (Did you forget some parentheses?)
- Copy this number to the clipboard
- Decimal separator
- The decimal separator to be used in the output.
- Use system locale
- Comma (,)
- Dot (.)
+ Calcolatrice
+ Consente di eseguire calcoli matematici (provare 5*3-2 in Flow Launcher)
+ Non è un numero (NaN)
+ Espressione sbagliata o incompleta (avete dimenticato delle parentesi?)
+ Copiare questo numero negli appunti
+ Separatore decimale
+ Il separatore decimale da usare nell'output.
+ Usa il locale del sistema
+ Virgola (,)
+ Punto (.)Max. decimal places
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Images/deletefilefolder.png b/Plugins/Flow.Launcher.Plugin.Explorer/Images/deletefilefolder.png
index a8e27d342..745b34935 100644
Binary files a/Plugins/Flow.Launcher.Plugin.Explorer/Images/deletefilefolder.png and b/Plugins/Flow.Launcher.Plugin.Explorer/Images/deletefilefolder.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
index bd74e0fa7..2f09d7f6d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
@@ -23,8 +23,8 @@
Personalizar palavras-chaveLigações de acesso rápidoCaminhos excluídos do índice de pesquisa
- Use Index Search For Path Search
- Turning this on will return indexed directories/files faster, but if a directory/file is not indexed it will not show up. If a directory/file has been added to Index Search Excluded Path then it will still show up even if this option is on
+ Utilizar índice de pesquisa para o caminho
+ Se ativar esta opção, os ficheiros e/ou diretórios indexados serão mostrados mais rapidamente mas, se um ficheiro ou diretório não estiver indexado não será mostrado. Se existirem ficheiros e/ou diretórios que tenham sido adicionados à exclusão do índice de pesquisa, serão mostrados.Opções de indexaçãoPesquisar:Pesquisa de caminho:
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
index ce4794b8d..5842974e2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
@@ -23,7 +23,7 @@
Upraviť aktivačný príkazOdkazy Rýchleho prístupuVylúčené umiestnenia indexovania
- Na vyhľadanie cesty použite vyhľadávanie v indexe
+ Na vyhľadanie cesty použiť vyhľadávanie v indexeZapnutím tejto funkcie sa zrýchli odozva indexovaných priečinkov/súborov, ale ak priečinok/súbor nie je indexovaný, nezobrazí sa. Ak bol priečinok/súbor pridaný do Vylúčené umiestnenia indexovania, zobrazí sa, aj keď je táto možnosť zapnutáMožnosti indexovaniaVyhľadávanie:
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
index 04026420c..dd32d0ec4 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
@@ -14,7 +14,7 @@
若要解决这个问题,请启动 Windows 搜索服务。点击此处删除警告警告消息已关闭。 作为搜索文件和文件夹的一个替代办法,你想要安装 Everything 插件吗?{0}{0}选择 '是'安装Everything插件',或者'否' 退出资源管理器选项
- Error occurred during search: {0}
+ 搜索时发生错误:{0}删除
@@ -23,8 +23,8 @@
自定义动作关键字快速访问链接索引搜索排除的路径
- Use Index Search For Path Search
- Turning this on will return indexed directories/files faster, but if a directory/file is not indexed it will not show up. If a directory/file has been added to Index Search Excluded Path then it will still show up even if this option is on
+ 使用索引进行路径搜索
+ 启用该选项会更快速地找到已索引的文件夹和文件,但未索引的项目不会出现在结果中。在“索引搜索排除的路径”中文件夹和文件仍会出现在结果中。索引选项搜索激活:路径搜索激活:
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/it.xaml
index 985aa6920..35e176367 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/it.xaml
@@ -1,7 +1,7 @@
- Plugin Indicator
- Provides plugins action words suggestions
+ Indicatore Plugin
+ Fornisce suggerimenti sulle parole d'azione dei plugin
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml
index 23fb6aa1e..2eaa6331b 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml
@@ -2,24 +2,24 @@
- Downloading plugin
- Successfully downloaded
- Error: Unable to download the plugin
- {0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
- {0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
- Plugin Install
- Download and install {0}
- Plugin Uninstall
- Plugin successfully installed. Restarting Flow, please wait...
- Unable to find the plugin.json metadata file from the extracted zip file.
- Error: A plugin which has the same or greater version with {0} already exists.
- Error installing plugin
- Error occured while trying to install {0}
- No update available
- All plugins are up to date
- {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
- Plugin Update
- This plugin has an update, would you like to see it?
+ Download del plugin
+ Download completato
+ Errore: non è possibile scaricare il plugin
+ {0} da {1} {2}{3}Vuoi disinstallare questo plugin? Dopo la disinstallazione, Flow si riavvierà automaticamente.
+ {0} da {1} {2}{3}Vuoi installare questo plugin? Dopo l'installazione, Flow si riavvierà automaticamente.
+ Installazione del plugin
+ Scarica e installa {0}
+ Disinstallazione del plugin
+ Plugin installato con successo. Riavvio di Flow, attendere...
+ Impossibile trovare il file dei metadati plugin.json dal file zip estratto.
+ Errore: esiste già un plugin che ha la stessa o maggiore versione con {0}.
+ Errore durante l'installazione del plugin
+ Errore durante il tentativo di installare {0}
+ Nessun aggiornamento disponibile
+ Tutti i plugin sono aggiornati
+ {0} da {1} {2}{3}Vuoi aggiornare questo plugin? Dopo l'aggiornamento, Flow si riavvierà automaticamente.
+ Aggiornamento del plugin
+ Questo plugin ha un aggiornamento, vuoi vederlo?This plugin is already installedPlugin Manifest Download FailedPlease check if you can connect to github.com. This error means you may not be able to install or update plugins.
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml
index 6c48bd8d9..bab436966 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml
@@ -30,7 +30,7 @@
플러그인 관리자
- Management of installing, uninstalling or updating Flow Launcher plugins
+ 플러그인의 설치/삭제/업데이트를 관리하는 플러그인알수없는 제작자
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml
index 72b2f0838..b0abdd468 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml
@@ -17,7 +17,7 @@
Nastala chyba počas inštalácie pluginu {0}Nie je k dispozícii žiadna aktualizáciaVšetky pluginy sú aktuálne
- {0} od {1} {2}{3}Chcete aktualizovať tento plugin? Po odinštalovaní sa Flow automaticky reštartuje.
+ {0} od {1} {2}{3}Chcete aktualizovať tento plugin? Po aktualizácii sa Flow automaticky reštartuje.Aktualizácia pluginuAktualizácia pre tento plugin je k dispozícii, chcete ju zobraziť?Tento plugin je už nainštalovaný
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs
index dddb7cf68..bf62caee8 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs
@@ -37,7 +37,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
contextMenu = new ContextMenu(Context);
pluginManager = new PluginsManager(Context, Settings);
- await pluginManager.UpdateManifestAsync();
+ _ = pluginManager.UpdateManifestAsync();
}
public List LoadContextMenus(Result selectedResult)
@@ -74,4 +74,4 @@ namespace Flow.Launcher.Plugin.PluginsManager
return Context.API.GetTranslation("plugin_pluginsmanager_plugin_description");
}
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml
index dee16d44b..27fda1db7 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml
@@ -2,7 +2,7 @@
Finalizador de procesos
- Finalizar procesos en ejecución desde Flow Launcher
+ Finaliza procesos en ejecución desde Flow Launcherfinalizar todas las instancias de "{0}"finalizar {0} procesos
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
index 2809e0b5c..83f9464c4 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
@@ -58,6 +58,7 @@
+
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
index 8d8cae02c..3132db36b 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
@@ -4,6 +4,7 @@
xmlns:system="clr-namespace:System;assembly=mscorlib">
+ Reset DefaultDeleteEditAdd
@@ -12,7 +13,7 @@
DisableLocationAll Programs
- File Suffixes
+ File TypeReindexIndexingIndex Start Menu
@@ -35,9 +36,24 @@
Are you sure you want to delete the selected program sources?OK
- Flow Launcher will only index files that end with the following suffixes. (Each suffix should split by ';' )
+ Program Plugin will only index files with selected suffixes and .url files with selected protocols.Successfully updated file suffixesFile suffixes can't be empty
+ Protocols can't be empty
+
+ File Suffixes
+ URL Protocols
+ Steam Games
+ Epic Games
+ Http/Https
+ Custom URL Protocols
+ Custom File Suffixes
+
+ Insert file suffixes you want to index. Suffixes should be separated by ';'. (ex>bat;py)
+
+
+ Insert protocols of .url files you want to index. Protocols should be separated by ';'. (ex>ftp;netflix)
+ Run As Different UserRun As Administrator
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml
index ee59d0221..eb241b300 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml
@@ -43,7 +43,7 @@
이 프로그램 표시 비활성화프로그램
- Flow Launcher에서 프로그램 검색
+ Flow Launcher에서 프로그램을 검색합니다잘못된 경로
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml
index 2d4a98770..4cac2004a 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml
@@ -14,19 +14,19 @@
重新索引索引中索引开始菜单
- 启用时,Flow 将从开始菜单加载程序
+ 启用时搜索开始菜单中的程序索引注册表
- 启用时,Flow 将从注册表中加载程序
+ 启用时搜索注册表中的程序隐藏应用路径
- 对于诸如UWP 或 lnk 等可执行文件,搜索时隐藏文件路径
+ 隐藏诸如UWP,lnk 等可执行文件的路径启用程序描述
- 禁用它也会同时阻止 Flow 通过程序描述搜索
+ 禁用时会阻止 Flow 通过程序描述搜索后缀最大深度目录浏览
- 文件后缀:
+ 文件后缀:最大搜索深度(-1 为无限制):请先选择一项
@@ -49,12 +49,12 @@
自定义资源管理器参数
- 您可以通过输入要使用的资源管理器的环境变量来自定义用于打开容器文件夹的资源管理器。 使用CMD来测试环境变量是否可用。
+ 您可以通过输入要使用的资源管理器的环境变量来自定义用于打开文件夹的资源管理器。 使用CMD来测试环境变量是否可用。输入要为自定义资源管理器添加的自定义参数。 %s代表父目录,%f代表完整路径(仅适用于win32)。 检查资源管理器的网站以获取详细信息。成功
- 成功禁用了该程序以使其无法显示在查询中
+ 成功禁止该程序在搜索结果中显示此应用程序不能作为管理员运行
diff --git a/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml b/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml
index e5f404141..fbe538b7f 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml
@@ -4,10 +4,12 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:ui="http://schemas.modernwpf.com/2019"
Title="{DynamicResource flowlauncher_plugin_program_suffixes}"
- Width="400"
+ Width="600"
Background="{DynamicResource PopuBGColor}"
Foreground="{DynamicResource PopupTextColor}"
+ DataContext="{Binding RelativeSource={RelativeSource Self}}"
ResizeMode="NoResize"
SizeToContent="Height"
WindowStartupLocation="CenterScreen"
@@ -15,9 +17,73 @@
-
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -55,7 +121,9 @@
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ appref-ms
+ exe
+ lnk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -90,7 +232,7 @@
MinWidth="140"
Margin="5,0,0,0"
HorizontalAlignment="Right"
- Click="ButtonBase_OnClick"
+ Click="BtnAdd_OnClick"
Content="{DynamicResource flowlauncher_plugin_program_update}"
Style="{DynamicResource AccentButtonStyle}" />
diff --git a/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml.cs b/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml.cs
index 2a10928e6..31565c8b0 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml.cs
@@ -1,44 +1,76 @@
using System;
+using System.Collections.Generic;
using System.Windows;
namespace Flow.Launcher.Plugin.Program
{
- ///
- /// ProgramSuffixes.xaml 的交互逻辑
- ///
public partial class ProgramSuffixes
{
private PluginInitContext context;
private Settings _settings;
+ public Dictionary SuffixesStatus { get; set; }
+ public Dictionary ProtocolsStatus { get; set; }
+ public bool UseCustomSuffixes { get; set; }
+ public bool UseCustomProtocols { get; set; }
public ProgramSuffixes(PluginInitContext context, Settings settings)
{
this.context = context;
- InitializeComponent();
_settings = settings;
- tbSuffixes.Text = string.Join(Settings.SuffixSeperator.ToString(), _settings.ProgramSuffixes);
+ SuffixesStatus = new Dictionary(_settings.BuiltinSuffixesStatus);
+ ProtocolsStatus = new Dictionary(_settings.BuiltinProtocolsStatus);
+ UseCustomSuffixes = _settings.UseCustomSuffixes;
+ UseCustomProtocols = _settings.UseCustomProtocols;
+ InitializeComponent();
+ tbSuffixes.Text = string.Join(Settings.SuffixSeparator, _settings.CustomSuffixes);
+ tbProtocols.Text = string.Join(Settings.SuffixSeparator, _settings.CustomProtocols);
}
+
private void BtnCancel_OnClick(object sender, RoutedEventArgs e)
{
Close();
}
- private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
- {
- var suffixes = tbSuffixes.Text.Split(Settings.SuffixSeperator, StringSplitOptions.RemoveEmptyEntries);
- if (suffixes.Length == 0)
+ private void BtnAdd_OnClick(object sender, RoutedEventArgs e)
+ {
+ var suffixes = tbSuffixes.Text.Split(Settings.SuffixSeparator, StringSplitOptions.RemoveEmptyEntries);
+ var protocols = tbProtocols.Text.Split(Settings.SuffixSeparator, StringSplitOptions.RemoveEmptyEntries);
+
+ if (suffixes.Length == 0 && UseCustomSuffixes)
{
string warning = context.API.GetTranslation("flowlauncher_plugin_program_suffixes_cannot_empty");
MessageBox.Show(warning);
return;
}
- _settings.ProgramSuffixes = suffixes;
+ if (protocols.Length == 0 && UseCustomProtocols)
+ {
+ string warning = context.API.GetTranslation("flowlauncher_plugin_protocols_cannot_empty");
+ MessageBox.Show(warning);
+ return;
+ }
- string msg = context.API.GetTranslation("flowlauncher_plugin_program_update_file_suffixes");
- MessageBox.Show(msg);
+ _settings.CustomSuffixes = suffixes;
+ _settings.CustomProtocols = protocols;
+ _settings.BuiltinSuffixesStatus = new Dictionary(SuffixesStatus);
+ _settings.BuiltinProtocolsStatus = new Dictionary(ProtocolsStatus);
+ _settings.UseCustomSuffixes = UseCustomSuffixes;
+ _settings.UseCustomProtocols = UseCustomProtocols;
DialogResult = true;
}
+
+ private void BtnReset_OnClick(object sender, RoutedEventArgs e)
+ {
+ apprefMS.IsChecked = true;
+ exe.IsChecked = true;
+ lnk.IsChecked = true;
+ CustomFiles.IsChecked = false;
+
+ steam.IsChecked = true;
+ epic.IsChecked = true;
+ http.IsChecked = false;
+ CustomProtocol.IsChecked = false;
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs
index ad7387f10..316aaaac3 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs
@@ -601,92 +601,97 @@ namespace Flow.Launcher.Plugin.Program.Programs
// windows 8.1 https://msdn.microsoft.com/en-us/library/windows/apps/hh965372.aspx#target_size
// windows 8 https://msdn.microsoft.com/en-us/library/windows/apps/br211475.aspx
- string path;
- if (uri.Contains("\\"))
- {
- path = Path.Combine(Package.Location, uri);
- }
- else
+ string path = Path.Combine(Package.Location, uri);
+
+ var logoPath = TryToFindLogo(uri, path);
+ if (String.IsNullOrEmpty(logoPath))
{
+ // TODO: Don't know why, just keep it at the moment
+ // Maybe on older version of Windows 10?
// for C:\Windows\MiracastView etc
- path = Path.Combine(Package.Location, "Assets", uri);
+ return TryToFindLogo(uri, Path.Combine(Package.Location, "Assets", uri));
}
+ return logoPath;
- var extension = Path.GetExtension(path);
- if (extension != null)
+ string TryToFindLogo(string uri, string path)
{
- var end = path.Length - extension.Length;
- var prefix = path.Substring(0, end);
- var paths = new List
+ var extension = Path.GetExtension(path);
+ if (extension != null)
{
- path
- };
+ //if (File.Exists(path))
+ //{
+ // return path; // shortcut, avoid enumerating files
+ //}
- var scaleFactors = new Dictionary>
- {
- // scale factors on win10: https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets#asset-size-tables,
+ var logoNamePrefix = Path.GetFileNameWithoutExtension(uri); // e.g Square44x44
+ var logoDir = Path.GetDirectoryName(path); // e.g ..\..\Assets
+ if (String.IsNullOrEmpty(logoNamePrefix) || String.IsNullOrEmpty(logoDir) || !Directory.Exists(logoDir))
{
- PackageVersion.Windows10, new List
- {
- 100,
- 125,
- 150,
- 200,
- 400
- }
- },
+ // Known issue: Edge always triggers it since logo is not at uri
+ ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" +
+ $"|{UserModelId} can't find logo uri for {uri} in package location (logo name or directory not found): {Package.Location}", new FileNotFoundException());
+ return string.Empty;
+ }
+
+ var files = Directory.EnumerateFiles(logoDir);
+
+ // Currently we don't care which one to choose
+ // Just ignore all qualifiers
+ // select like logo.[xxx_yyy].png
+ // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast
+ var logos = files.Where(file =>
+ Path.GetFileName(file)?.StartsWith(logoNamePrefix, StringComparison.OrdinalIgnoreCase) ?? false
+ && extension.Equals(Path.GetExtension(file), StringComparison.OrdinalIgnoreCase)
+ );
+
+ var selected = logos.FirstOrDefault();
+ var closest = selected;
+ int min = int.MaxValue;
+ foreach(var logo in logos)
{
- PackageVersion.Windows81, new List
+
+ var imageStream = File.OpenRead(logo);
+ var decoder = BitmapDecoder.Create(imageStream, BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.None);
+ var height = decoder.Frames[0].PixelHeight;
+ var width = decoder.Frames[0].PixelWidth;
+ int pixelCountDiff = Math.Abs(height * width - 1936); // 44*44=1936
+ if(pixelCountDiff < min)
{
- 100,
- 120,
- 140,
- 160,
- 180
- }
- },
- {
- PackageVersion.Windows8, new List
- {
- 100
+ // try to find the closest to 44x44 logo
+ closest = logo;
+ if (pixelCountDiff == 0)
+ break; // found 44x44
+ min = pixelCountDiff;
}
}
- };
- if (scaleFactors.ContainsKey(Package.Version))
- {
- foreach (var factor in scaleFactors[Package.Version])
+ selected = closest;
+ if (!string.IsNullOrEmpty(selected))
{
- paths.Add($"{prefix}.scale-{factor}{extension}");
+ return selected;
+ }
+ else
+ {
+ ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" +
+ $"|{UserModelId} can't find logo uri for {uri} in package location (can't find specified logo): {Package.Location}", new FileNotFoundException());
+ return string.Empty;
}
- }
-
- var selected = paths.FirstOrDefault(File.Exists);
- if (!string.IsNullOrEmpty(selected))
- {
- return selected;
}
else
{
ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" +
- $"|{UserModelId} can't find logo uri for {uri} in package location: {Package.Location}", new FileNotFoundException());
+ $"|Unable to find extension from {uri} for {UserModelId} " +
+ $"in package location {Package.Location}", new FileNotFoundException());
return string.Empty;
}
}
- else
- {
- ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" +
- $"|Unable to find extension from {uri} for {UserModelId} " +
- $"in package location {Package.Location}", new FileNotFoundException());
- return string.Empty;
- }
}
public ImageSource Logo()
{
var logo = ImageFromPath(LogoPath);
- var plated = PlatedImage(logo);
+ var plated = PlatedImage(logo); // TODO: maybe get plated directly from app package?
// todo magic! temp fix for cross thread object
plated.Freeze();
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
index 64a40954c..5e725c753 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
@@ -16,7 +16,10 @@ using System.Collections;
using System.Diagnostics;
using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch;
using System.Diagnostics.CodeAnalysis;
+using System.Text.RegularExpressions;
using System.Threading.Channels;
+using Flow.Launcher.Infrastructure.Image;
+using IniParser;
using System.Windows.Controls;
namespace Flow.Launcher.Plugin.Program.Programs
@@ -37,6 +40,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
public string Location => ParentDirectory;
private const string ShortcutExtension = "lnk";
+ private const string UrlExtension = "url";
private const string ExeExtension = "exe";
private static readonly Win32 Default = new Win32()
@@ -288,6 +292,45 @@ namespace Flow.Launcher.Plugin.Program.Programs
#endif
}
+ private static Win32 UrlProgram(string path)
+ {
+ var program = Win32Program(path);
+ program.Valid = false;
+
+ try
+ {
+ var parser = new FileIniDataParser();
+ var data = parser.ReadFile(path);
+ var urlSection = data["InternetShortcut"];
+ var url = urlSection?["URL"];
+ if (String.IsNullOrEmpty(url))
+ {
+ return program;
+ }
+ foreach(var protocol in Main._settings.GetProtocols())
+ {
+ if(url.StartsWith(protocol))
+ {
+ program.LnkResolvedPath = url;
+ program.Valid = true;
+ break;
+ }
+ }
+
+ var iconPath = urlSection?["IconFile"];
+ if (!String.IsNullOrEmpty(iconPath))
+ {
+ program.IcoPath = iconPath;
+ }
+ }
+ catch (Exception e)
+ {
+ // Many files do not have the required fields, so no logging is done.
+ }
+
+ return program;
+ }
+
private static Win32 ExeProgram(string path)
{
try
@@ -344,10 +387,10 @@ namespace Flow.Launcher.Plugin.Program.Programs
{
ExeExtension => ExeProgram(x),
ShortcutExtension => LnkProgram(x),
+ UrlExtension => UrlProgram(x),
_ => Win32Program(x)
});
-
return programs;
}
@@ -366,8 +409,9 @@ namespace Flow.Launcher.Plugin.Program.Programs
.Select(x => Extension(x) switch
{
ShortcutExtension => LnkProgram(x),
+ UrlExtension => UrlProgram(x),
_ => Win32Program(x)
- }).Where(x => x.Valid);
+ });
return programs;
}
@@ -505,7 +549,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
{
var programs = Enumerable.Empty();
- var unregistered = UnregisteredPrograms(settings.ProgramSources, settings.ProgramSuffixes);
+ var unregistered = UnregisteredPrograms(settings.ProgramSources, settings.GetSuffixes());
programs = programs.Concat(unregistered);
@@ -513,19 +557,19 @@ namespace Flow.Launcher.Plugin.Program.Programs
if (settings.EnableRegistrySource)
{
- var appPaths = AppPathsPrograms(settings.ProgramSuffixes);
+ var appPaths = AppPathsPrograms(settings.GetSuffixes());
autoIndexPrograms = autoIndexPrograms.Concat(appPaths);
}
if (settings.EnableStartMenuSource)
{
- var startMenu = StartMenuPrograms(settings.ProgramSuffixes);
+ var startMenu = StartMenuPrograms(settings.GetSuffixes());
autoIndexPrograms = autoIndexPrograms.Concat(startMenu);
}
autoIndexPrograms = ProgramsHasher(autoIndexPrograms);
- return programs.Concat(autoIndexPrograms).Distinct().ToArray();
+ return programs.Concat(autoIndexPrograms).Where(x => x.Valid).Distinct().ToArray();
}
#if DEBUG //This is to make developer aware of any unhandled exception and add in handling.
catch (Exception)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Settings.cs b/Plugins/Flow.Launcher.Plugin.Program/Settings.cs
index d97ddd993..96328ba62 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Settings.cs
@@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using System.IO;
+using System.Linq;
+using System.Text.Json.Serialization;
+using Windows.Foundation.Metadata;
namespace Flow.Launcher.Plugin.Program
{
@@ -9,17 +12,109 @@ namespace Flow.Launcher.Plugin.Program
public DateTime LastIndexTime { get; set; }
public List ProgramSources { get; set; } = new List();
public List DisabledProgramSources { get; set; } = new List();
- public string[] ProgramSuffixes { get; set; } = {"appref-ms", "exe", "lnk"};
+
+ [Obsolete, JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public string[] ProgramSuffixes { get; set; } = null;
+ public string[] CustomSuffixes { get; set; } = Array.Empty(); // Custom suffixes only
+ public string[] CustomProtocols { get; set; } = Array.Empty();
+
+ public Dictionary BuiltinSuffixesStatus { get; set; } = new Dictionary{
+ { "exe", true }, { "appref-ms", true }, { "lnk", true }
+ };
+
+ public Dictionary BuiltinProtocolsStatus { get; set; } = new Dictionary{
+ { "steam", true }, { "epic", true }, { "http", false }
+ };
+
+ [JsonIgnore]
+ public Dictionary BuiltinProtocols { get; set; } = new Dictionary{
+ { "steam", $"steam://run/{SuffixSeparator}steam://rungameid/" }, { "epic", "com.epicgames.launcher://apps/" }, { "http", $"http://{SuffixSeparator}https://"}
+ };
+
+ public bool UseCustomSuffixes { get; set; } = false;
+ public bool UseCustomProtocols { get; set; } = false;
+
+ public string[] GetSuffixes()
+ {
+ RemoveRedundantSuffixes();
+ List extensions = new List();
+ foreach (var item in BuiltinSuffixesStatus)
+ {
+ if (item.Value)
+ {
+ extensions.Add(item.Key);
+ }
+ }
+
+ if (BuiltinProtocolsStatus.Values.Any(x => x == true) || UseCustomProtocols)
+ {
+ extensions.Add("url");
+ }
+
+ if (UseCustomSuffixes)
+ {
+ return extensions.Concat(CustomSuffixes).DistinctBy(x => x.ToLower()).ToArray();
+ }
+ else
+ {
+ return extensions.DistinctBy(x => x.ToLower()).ToArray();
+ }
+ }
+
+ public string[] GetProtocols()
+ {
+ List protocols = new List();
+ foreach (var item in BuiltinProtocolsStatus)
+ {
+ if (item.Value)
+ {
+ if (BuiltinProtocols.TryGetValue(item.Key, out string ps))
+ {
+ var tmp = ps.Split(SuffixSeparator, StringSplitOptions.RemoveEmptyEntries);
+ foreach (var protocol in tmp)
+ {
+ protocols.Add(protocol);
+ }
+ }
+ }
+ }
+
+ if (UseCustomProtocols)
+ {
+ return protocols.Concat(CustomProtocols).DistinctBy(x => x.ToLower()).ToArray();
+ }
+ else
+ {
+ return protocols.DistinctBy(x => x.ToLower()).ToArray();
+ }
+ }
+
+ private void RemoveRedundantSuffixes()
+ {
+ // Migrate to new settings
+ // CustomSuffixes no longer contains custom suffixes
+ // users has tweaked the settings
+ // or this function has been executed once
+ if (UseCustomSuffixes == true || ProgramSuffixes == null)
+ return;
+ var suffixes = ProgramSuffixes.ToList();
+ foreach(var item in BuiltinSuffixesStatus)
+ {
+ suffixes.Remove(item.Key);
+ }
+ CustomSuffixes = suffixes.ToArray(); // Custom suffixes
+ UseCustomSuffixes = CustomSuffixes.Length != 0; // Search custom suffixes or not
+ ProgramSuffixes = null;
+ }
public bool EnableStartMenuSource { get; set; } = true;
-
public bool EnableDescription { get; set; } = false;
public bool HideAppsPath { get; set; } = true;
public bool EnableRegistrySource { get; set; } = true;
public string CustomizedExplorer { get; set; } = Explorer;
public string CustomizedArgs { get; set; } = ExplorerArgs;
- internal const char SuffixSeperator = ';';
+ internal const char SuffixSeparator = ';';
internal const string Explorer = "explorer";
diff --git a/Plugins/Flow.Launcher.Plugin.Program/SuffixesConverter.cs b/Plugins/Flow.Launcher.Plugin.Program/SuffixesConverter.cs
index a5e9f75dc..ef93913a5 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/SuffixesConverter.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/SuffixesConverter.cs
@@ -12,7 +12,7 @@ namespace Flow.Launcher.Plugin.Program
var text = value as string[];
if (text != null)
{
- return string.Join(";", text);
+ return string.Join(Settings.SuffixSeparator, text);
}
else
{
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Images/indexoption.png b/Plugins/Flow.Launcher.Plugin.Sys/Images/indexoption.png
new file mode 100644
index 000000000..5c2e99a67
Binary files /dev/null and b/Plugins/Flow.Launcher.Plugin.Sys/Images/indexoption.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Images/openrecyclebin.png b/Plugins/Flow.Launcher.Plugin.Sys/Images/openrecyclebin.png
new file mode 100644
index 000000000..769514ad2
Binary files /dev/null and b/Plugins/Flow.Launcher.Plugin.Sys/Images/openrecyclebin.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Images/recyclebin.png b/Plugins/Flow.Launcher.Plugin.Sys/Images/recyclebin.png
index 878a02189..745b34935 100644
Binary files a/Plugins/Flow.Launcher.Plugin.Sys/Images/recyclebin.png and b/Plugins/Flow.Launcher.Plugin.Sys/Images/recyclebin.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
index 1258dfec7..a09414367 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
@@ -1,7 +1,7 @@
-
+
CommandDescription
@@ -12,9 +12,11 @@
Lock this computerClose Flow LauncherRestart Flow Launcher
- Tweak this app
+ Tweak Flow Launcher's settingsPut computer to sleepEmpty recycle bin
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
FortsætAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
index ee637009b..1e549b4b2 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
@@ -1,7 +1,7 @@
-
+
BefehlBeschreibung
@@ -12,9 +12,11 @@
Computer sperrenFlow Launcher schließenFlow Launcher neu starten
- Anwendung beschleunigen
+ Tweak Flow Launcher's settingsComputer in Schlafmodus versetzenPapierkorb leeren
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
ErfolgreichAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
index 780084203..59fa8161a 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
@@ -17,6 +17,8 @@
Tweak Flow Launcher's settingsPut computer to sleepEmpty recycle bin
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
index b110046d1..36fac7cd7 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
@@ -1,7 +1,7 @@
-
+
CommandDescription
@@ -12,9 +12,11 @@
Lock this computerClose Flow LauncherRestart Flow Launcher
- Tweak this app
+ Tweak Flow Launcher's settingsPut computer to sleepEmpty recycle bin
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
SuccessAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
index 458f8c71b..0bf2cb695 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
@@ -1,29 +1,31 @@
-
+
ComandoDescripción
- Apagar el equipo
- Reiniciar el equipo
- Reiniciar el equipo con opciones avanzadas de arranque para el modo seguro y de depuración, entre otras opciones
- Cerrar sesión
- Bloquear el equipo
- Cerrar Flow Launcher
- Reiniciar Flow Launcher
- Ajustar esta aplicación
- Suspender el equipo
- Vaciar papelera de reciclaje
- Hibernar el equipo
- Guardar configuración de Flow Launcher
+ Apaga el equipo
+ Reinicia el equipo
+ Reinicia el equipo con opciones avanzadas de arranque para el modo seguro y de depuración, entre otras opciones
+ Cierra la sesión
+ Bloquea el equipo
+ Cierra Flow Launcher
+ Reinicia Flow Launcher
+ Ajustar la configuración de Flow Launcher
+ Duerme el equipo
+ Vacia la papelera de reciclaje
+ Abrir papelera de reciclaje
+ Opciones de indexación
+ Hiberna el equipo
+ Guarda la configuración de Flow LauncherRefresca los datos del complemento con nuevo contenido
- Abrir ubicación de los archivos de registro de Flow Launcher
- Buscar actualizaciones de Flow Launcher
+ Abre la ubicación de los archivos de registro de Flow Launcher
+ Busca actualizaciones de Flow LauncherVisite la documentación de Flow Launcher para más ayuda y consejos de uso
- Abrir la ubicación donde se almacena la configuración de Flow Launcher
+ Abre la ubicación donde se almacena la configuración de Flow Launcher
-
+
CorrectoToda la configuración de Flow Launcher ha sido guardadaSe recargaron todos los datos del complemento
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
index 0317a04a0..19b02b55f 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
@@ -1,7 +1,7 @@
-
+
CommandDescription
@@ -12,9 +12,11 @@
Lock this computerClose Flow LauncherRestart Flow Launcher
- Tweak this app
+ Tweak Flow Launcher's settingsPut computer to sleepEmpty recycle bin
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
AjoutAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
index 9a5201767..a16c205bf 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
@@ -1,7 +1,7 @@
-
+
CommandDescription
@@ -12,9 +12,11 @@
Lock this computerClose Flow LauncherRestart Flow Launcher
- Tweak this app
+ Tweak Flow Launcher's settingsPut computer to sleepEmpty recycle bin
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
SuccessoAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
index cd05fa34b..3b52196a1 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
@@ -1,7 +1,7 @@
-
+
コマンド説明
@@ -15,6 +15,8 @@
このアプリの設定スリープゴミ箱を空にする
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
成功しましAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
index 3442b180a..cdb6a32f0 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
@@ -1,7 +1,10 @@
-
-
+
+
-
+
명령어설명
@@ -15,6 +18,8 @@
이 프로그램을 조정합니다PC를 절전모드로 전환휴지통 비우기
+ 휴지통 열기
+ 색인 옵션최대 절전 모드Flow Launcher 설정 저장플러그인 데이터를 새 콘텐츠와 함께 다시 로드
@@ -23,7 +28,7 @@
Flow Launcher의 도움말 및 사용안내Flow Launcher의 설정이 저장된 위치 열기
-
+
성공모든 Flow Launcher 설정을 저장했습니다적용 가능한 모든 플러그인 데이터를 다시 로드했습니다
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
index b110046d1..36fac7cd7 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
@@ -1,7 +1,7 @@
-
+
CommandDescription
@@ -12,9 +12,11 @@
Lock this computerClose Flow LauncherRestart Flow Launcher
- Tweak this app
+ Tweak Flow Launcher's settingsPut computer to sleepEmpty recycle bin
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
SuccessAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
index 8b5b091d0..943e5e9a7 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
@@ -1,7 +1,7 @@
-
+
CommandDescription
@@ -12,9 +12,11 @@
Lock this computerClose Flow LauncherRestart Flow Launcher
- Tweak this app
+ Tweak Flow Launcher's settingsPut computer to sleepEmpty recycle bin
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
SuccesvolAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
index f9bece07e..bf6f4391c 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
@@ -1,7 +1,7 @@
-
+
KomendaOpis
@@ -15,6 +15,8 @@
Dostosuj ustawieniaPrzełącz komputer w tryb uśpieniaOpróżnij kosz
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
SukcesAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
index 7207e860f..01f990c4e 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
@@ -1,7 +1,7 @@
-
+
CommandDescription
@@ -12,9 +12,11 @@
Lock this computerClose Flow LauncherRestart Flow Launcher
- Tweak this app
+ Tweak Flow Launcher's settingsPut computer to sleepEmpty recycle bin
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
SucessoAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
index 9d27b6fec..3d1298736 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
@@ -1,7 +1,7 @@
-
+
ComandoDescrição
@@ -12,9 +12,11 @@
Bloquear computadorFechar Flow LauncherReiniciar Flow Launcher
- Ajustar esta aplicação
+ Ajustar definições de Flow LauncherSuspender computadorEsvaziar reciclagem
+ Open recycle bin
+ Opções de indexaçãoHibernar computadorGuardar definições do Flow LauncherRecarrega os dados do plugin com o novo conteúdo
@@ -23,7 +25,7 @@
Aceda à documentação para mais informações e dicas de utilizaçãoAbrir localização onde as definições do Flow Launcher estão guardadas
-
+
SucessoDefinições guardadas com sucessoRecarregar todos os dados aplicáveis ao plugin
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
index b193b5940..36d4108d7 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
@@ -1,7 +1,7 @@
-
+
CommandDescription
@@ -12,9 +12,11 @@
Lock this computerClose Flow LauncherRestart Flow Launcher
- Tweak this app
+ Tweak Flow Launcher's settingsPut computer to sleepEmpty recycle bin
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
УспешноAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
index 8fb0b1f6a..4b729713e 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
@@ -1,7 +1,7 @@
-
+
PríkazPopis
@@ -12,9 +12,11 @@
Zamknúť počítačZavrieť Flow LauncherReštartovať Flow Launcher
- Nastaviť Flow Launcher
+ Úprava nastavení Flow LauncheraUspať počítačVysypať kôš
+ Otvoriť kôš
+ Možnosti indexovaniaHibernovať počítačUložiť všetky nastavenia Flow LauncheraAktualizovať všetky nové dáta pluginov
@@ -23,7 +25,7 @@
V dokumentácii k aplikácii Flow Launcher nájdete ďalšiu pomoc a tipy na používanieOtvoriť umiestnenie, kde sú uložené nastavenia Flow Launchera
-
+
ÚspešnéVšetky nastavenia Flow Launchera uloženéVšetky dáta pluginov aktualizované
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
index 00636d0f9..00ba6b79d 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
@@ -1,7 +1,7 @@
-
+
CommandDescription
@@ -12,9 +12,11 @@
Lock this computerClose Flow LauncherRestart Flow Launcher
- Tweak this app
+ Tweak Flow Launcher's settingsPut computer to sleepEmpty recycle bin
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
UspešnoAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
index 479735d06..306e19675 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
@@ -1,7 +1,7 @@
-
+
KomutAçıklama
@@ -15,6 +15,8 @@
Flow Launcher Ayarlarını AçBilgisayarı Uyku Moduna AlGeri Dönüşüm Kutusunu Boşalt
+ Open recycle bin
+ Indexing OptionsBilgisayarı Askıya AlTüm Flow Launcher Ayarlarını KaydetEklentilerin verilerini Flow Launcher'un açılışından sonra yapılan değişiklikleri için günceller. Eklentilerin bu özelliği zaten eklemiş olması gerekir.
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
BaşarılıTüm Flow Launcher ayarları kaydedildi.Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
index a6b96a7ef..c9aebe7c0 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
@@ -1,7 +1,7 @@
-
+
CommandDescription
@@ -12,9 +12,11 @@
Lock this computerClose Flow LauncherRestart Flow Launcher
- Tweak this app
+ Tweak Flow Launcher's settingsPut computer to sleepEmpty recycle bin
+ Open recycle bin
+ Indexing OptionsHibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
УспішноAll Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
index 4c3119215..f120d0034 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
@@ -1,7 +1,7 @@
-
+
命令描述
@@ -12,9 +12,11 @@
锁定这台电脑退出 Flow Launcher重启 Flow Launcher
- 设置
+ Flow Launcher 设置休眠这台电脑清空回收站
+ 打开回收站
+ 索引选项休眠计算机保存所有 Flow Launcher 设置用新内容刷新插件数据
@@ -23,7 +25,7 @@
访问 Flow Launcher 的文档以获取更多帮助以及使用技巧打开存储 Flow Launcher 设置的位置
-
+
成功所有 Flow Launcher 设置已保存重新加载了所有插件数据
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
index 8ee59d464..ba4c40690 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
@@ -1,7 +1,7 @@
-
+
命令描述
@@ -15,6 +15,8 @@
設定睡眠清空資源回收桶
+ Open recycle bin
+ 索引選項Hibernate computerSave all Flow Launcher settingsRefreshes plugin data with new content
@@ -23,7 +25,7 @@
Visit Flow Launcher's documentation for more help and how to use tipsOpen the location where Flow Launcher's settings are stored
-
+
成All Flow Launcher settings savedReloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 808f8ef19..1b8ff3cc0 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -191,6 +191,21 @@ namespace Flow.Launcher.Plugin.Sys
return true;
}
},
+ new Result
+ {
+ Title = "Index Option",
+ SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_indexoption"),
+ IcoPath = "Images\\indexoption.png",
+ Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe773"),
+ Action = c =>
+ {
+ {
+ System.Diagnostics.Process.Start("control.exe", "srchadmin.dll");
+ }
+
+ return true;
+ }
+ },
new Result
{
Title = "Empty Recycle Bin",
@@ -215,6 +230,21 @@ namespace Flow.Launcher.Plugin.Sys
}
},
new Result
+ {
+ Title = "Open Recycle Bin",
+ SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin"),
+ IcoPath = "Images\\openrecyclebin.png",
+ Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe74d"),
+ Action = c =>
+ {
+ {
+ System.Diagnostics.Process.Start("explorer", "shell:RecycleBinFolder");
+ }
+
+ return true;
+ }
+ },
+ new Result
{
Title = "Exit",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_exit"),
diff --git a/Plugins/Flow.Launcher.Plugin.Url/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Url/Languages/it.xaml
index 9997fa841..1b0ea4b62 100644
--- a/Plugins/Flow.Launcher.Plugin.Url/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Url/Languages/it.xaml
@@ -12,6 +12,6 @@
Open the typed URL from Flow LauncherPlease set your browser path:
- Choose
+ ScegliApplication(*.exe)|*.exe|All files|*.*
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
index ca14aa299..e36b0a7de 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
@@ -14,16 +14,21 @@
Action KeywordURLSearch
- Use Search Query Autocomplete:
- Autocomplete Data from:
+ Use Search Query Autocomplete:
+ Autocomplete Data from:Please select a web searchAre you sure you want to delete {0}?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TitleEnableSelect Icon
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
index d06c30e64..887e2e9b5 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
@@ -14,16 +14,21 @@
AktionsschlüsselwortURLSuche
- Aktiviere Suchvorschläge
- Autocomplete Data from:
+ Aktiviere Suchvorschläge
+ Autocomplete Data from:Bitte wähle einen SuchdienstBist du sicher {0} zu löschen?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TitelAktivierenWähle Symbol
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
index 2f240a10a..e058e6e41 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
@@ -14,16 +14,21 @@
Palabra claveURLBuscar
- Autocompletar la búsqueda:
- Autocompletar datos de:
+ Autocompletar la búsqueda:
+ Autocompletar datos de:Por favor, seleccione una búsqueda¿Seguro que desea eliminar {0}?
- Si quiere utilizar un motor de búsqueda, puede añadirlo a Flow. Por ejemplo, puede seguir el formato de la url en la barra de direcciones si desea buscar 'casino' en Netflix: "https://www. etflix.com/search?q=Casino. Para ello, cambie el término de búsqueda 'Casino' de la siguiente manera.
- https://www.netflix.com/search?q={q}
- Agréguela al campo de URL. Ahora puede buscar en Netflix con Flow usando cualquier término de búsqueda.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TítuloHabilitarSeleccionar icono
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
index 7513dfcba..d9b0c0e32 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
@@ -14,16 +14,21 @@
Palabra clave de acciónURLBuscar
- Usar autocompletado en consultas de búsqueda:
- Autocompletar datos desde:
+ Usar autocompletado en consultas de búsqueda:
+ Autocompletar datos desde:Por favor, seleccione una búsqueda web¿Está seguro que desea eliminar {0}?
- Si dispone de un servicio de búsqueda web que desea utilizar, puede añadirlo a Flow. Por ejemplo, si desea buscar 'casino' en Netflix puede utilizar el siguiente formato url en la barra de direcciones: "https://www.netflix.com/search?q=Casino. Para ello, cambie el término de búsqueda 'Casino' de la siguiente manera.
- https://www.netflix.com/search?q={q}
- Añadirla a la sección URL, abajo indicada. Ahora puede buscar en Netflix utilizando cualquier término de búsqueda.
-
+ Si desea añadir una búsqueda de un sitio web concreto a Flow, introduzca primero una cadena de texto ficticia en la barra de búsqueda de ese sitio web, y ejecute la búsqueda. Ahora copie el contenido de la barra de direcciones del navegador y péguelo en el campo de la URL abajo indicado. Sustituya su cadena de prueba por {q}. Por ejemplo, si busca Casino en Netflix, su barra de direcciones debe decir
+ https://www.netflix.com/search?q=Casino
+
+ Ahora copie la cadena de entrada y péguela en el campo de la URL de la parte inferior.
+ A continuación, sustituya casino por {q}.
+ De esta manera, la fórmula genérica para una búsqueda en Netflix será https://www.netflix.com/search?q={q}
+
-
+
+
+
TítuloActivarSeleccionar icono
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
index 553db7167..da433832e 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
@@ -14,16 +14,21 @@
Action KeywordURLSearch
- Use Search Query Autocomplete:
- Autocomplete Data from:
+ Use Search Query Autocomplete:
+ Autocomplete Data from:Please select a web searchAre you sure you want to delete {0}?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TitleEnableSelect Icon
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
index 434036999..b7bd18deb 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
@@ -5,8 +5,8 @@
Open search in:New WindowNew Tab
- Set browser from path:
- Choose
+ Imposta il browser dal percorso:
+ ScegliCancellaModificaAggiungi
@@ -14,16 +14,21 @@
Action KeywordURLSearch
- Use Search Query Autocomplete:
- Autocomplete Data from:
+ Use Search Query Autocomplete:
+ Autocomplete Data from:Please select a web searchAre you sure you want to delete {0}?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TitleEnableSelect Icon
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
index 3bf51d734..0658f9f1f 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
@@ -14,16 +14,21 @@
キーワードURL検索
- 検索サジェスチョンを有効にする
- Autocomplete Data from:
+ 検索サジェスチョンを有効にする
+ Autocomplete Data from:web検索を選択してくださいAre you sure you want to delete {0}?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
タイトル有効アイコンを選択
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
index c0d8d6a6a..706e94365 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
@@ -14,16 +14,21 @@
액션 키워드URL검색
- 검색 쿼리 자동완성 사용:
- 자동완성 데이터 출처:
+ 검색 쿼리 자동완성 사용:
+ 자동완성 데이터 출처:웹 검색을 선택하세요Are you sure you want to delete {0}?
- 사용하고자 하는 서비스에 웹검색이 있다면 Flow에 추가할 수 있습니다. 예를들어 넷플릭스에서 "Casino"를 검색하면 주소표시줄에서 "https://www.netflix.com/search?q=Casino"형태가 되는 것을 확인할 수 있습니다. 이 경우, "Casino" 부분을 다음과 같이 변경합니다.
- https://www.netflix.com/search?q={q}
- 변경한 주소를 아래 URL 항목에 추가합니다. 이제 원하는 검색어를 사용하여 Flow에서 넷플릭스를 검색할 수 있습니다.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
이름활성화아이콘 선택
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
index 2faf8723f..01dfaf784 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
@@ -14,16 +14,21 @@
Action KeywordURLSearch
- Use Search Query Autocomplete:
- Autocomplete Data from:
+ Use Search Query Autocomplete:
+ Autocomplete Data from:Please select a web searchAre you sure you want to delete {0}?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TitleEnableSelect Icon
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
index 0d8977317..b5d303fab 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
@@ -14,16 +14,21 @@
Action KeywordURLSearch
- Use Search Query Autocomplete:
- Autocomplete Data from:
+ Use Search Query Autocomplete:
+ Autocomplete Data from:Please select a web searchAre you sure you want to delete {0}?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TitleEnableSelect Icon
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
index 214228dee..ae2b7e57f 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
@@ -14,16 +14,21 @@
WyzwalaczAdres URLSzukaj
- Pokazuj podpowiedzi wyszukiwania
- Autocomplete Data from:
+ Pokazuj podpowiedzi wyszukiwania
+ Autocomplete Data from:Musisz wybrać coś z listyCzy jesteś pewien że chcesz usunąć {0}?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TytułAktywneWybierz ikonę
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
index d1fd802ce..4fb45e7df 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
@@ -14,16 +14,21 @@
Action KeywordURLSearch
- Use Search Query Autocomplete:
- Autocomplete Data from:
+ Use Search Query Autocomplete:
+ Autocomplete Data from:Please select a web searchAre you sure you want to delete {0}?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TitleEnableSelect Icon
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
index 63f2683e9..9278b3e0d 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
@@ -14,16 +14,21 @@
Palavra-chave de açãoURLPesquisar
- Utilizar conclusão automática da consulta:
- Preencher dados a partir de:
+ Utilizar conclusão automática da consulta:
+ Preencher dados a partir de:Selecione uma pesquisa webTem a certeza de que deseja eliminar {0}?
- Se quiser, também pode adicionar um serviço web personalizado ao Flow Launcher. Por exemplo, pode utilizar o seguinte formato URL para pesquisar por 'casino' no Netflix: "https://www.netflix.com/search?q=Casino". Para o fazer, altere o termo de pesquisa 'Casino' como indicado a seguir.
- https://www.netflix.com/search?q={q}
- Adicione o URL à secção abaixo. Agora, já pode utilizar o Flow Launcher para pesquisar no Netflix.
-
+ Se quiser adicionar uma pesquisa por um determinado site ao Flow, digite uma sequência de texto fictícia na barra de pesquisa daquele site e inicie a pesquisa. Agora copie o conteúdo da barra de endereço do navegador e cole-o no campo URL abaixo. Substitua o texto fictício por {q}. Por exemplo, se quiser procurar casino na Netflix, a cadeia será:
+ https://www.netflix.com/search?q=Casino
+
+ Agora, copie esta cadeia e cole-a no campo URL abaixo.
+ De seguida, substitua casino por {q}.
+ Assim, a fórmula genérica de uma pesquisa na Netflix é https://www.netflix.com/search?q={q}
+
-
+
+
+
TítuloAtivarSelecionar ícone
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
index 645446738..f185a6dc2 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
@@ -14,16 +14,21 @@
Action KeywordURLSearch
- Use Search Query Autocomplete:
- Autocomplete Data from:
+ Use Search Query Autocomplete:
+ Autocomplete Data from:Please select a web searchAre you sure you want to delete {0}?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TitleEnableSelect Icon
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
index 08c8cb464..008b893bb 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
@@ -14,16 +14,21 @@
Aktivačný príkazAdresa URLHľadať
- Použiť automatické dokončovanie výrazov vyhľadávania:
- Automatické dokončovanie údajov z:
+ Použiť automatické dokončovanie výrazov vyhľadávania:
+ Automatické dokončovanie údajov z:Vyberte webové vyhľadávanieNaozaj chcete odstrániť {0}?
- Ak máte službu vyhľadávania na webe, ktorú chcete použiť, môžete ju pridať do programu Flow. Ak napríklad chcete na Netflixe hľadať „cestovatelia“, môžete postupovať podľa formátu adresy URL v paneli s adresou: „https://www.netflix.com/search?q=cestovatelia“. Ak to chcete urobiť, zmeňte hľadaný výraz „cestovatelia“ takto.
- https://www.netflix.com/search?q={q}
- Pridajte ju do sekcie URL nižšie. Teraz môžete s Flowom vyhľadávať na Netflixe pomocou ľubovoľných vyhľadávacích výrazov.
-
+ Ak chcete do Flowu pridať vyhľadávanie na konkrétnej webovej stránke, najprv zadajte testovací textový reťazec do vyhľadávacieho poľa danej webovej stránky a spustite vyhľadávanie. Teraz skopírujte obsah adresného riadka prehliadača a vložte ho do poľa URL nižšie. Nahraďte svoj testovací reťazec týmto {q}. Ak napríklad hľadáte na Netflixe kasíno, adresa bude vyzerať takto
+ https://www.netflix.com/search?q=Kasíno
+
+ Teraz skopírujte celý tento reťazec a vložte ho do poľa URL nižšie.
+ Potom nahraďte kasíno reťazcom {q}.
+ Všeobecný vzorec pre vyhľadávanie na Netflix je teda https://www.netflix.com/search?q={q}
+
-
+
+
+
NázovPovoliťVybrať ikonu
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
index 9dd6c34bb..9038585b6 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
@@ -14,16 +14,21 @@
Action KeywordURLSearch
- Use Search Query Autocomplete:
- Autocomplete Data from:
+ Use Search Query Autocomplete:
+ Autocomplete Data from:Please select a web searchAre you sure you want to delete {0}?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TitleEnableSelect Icon
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
index 701e78cd2..a30da0afe 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
@@ -14,16 +14,21 @@
Anahtar KelimeURLAra:
- Arama önerilerini etkinleştir
- Autocomplete Data from:
+ Arama önerilerini etkinleştir
+ Autocomplete Data from:Lütfen bir web araması seçin{0} bağlantısını silmek istediğinize emin misiniz?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
BaşlıkEtkinSimge Seç
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
index 094468a5d..ca17365b1 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
@@ -14,16 +14,21 @@
Action KeywordURLSearch
- Use Search Query Autocomplete:
- Autocomplete Data from:
+ Use Search Query Autocomplete:
+ Autocomplete Data from:Please select a web searchAre you sure you want to delete {0}?
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
TitleEnableSelect Icon
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
index 79c9b9018..b2bbe38e5 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
@@ -14,16 +14,21 @@
触发关键字打开链接搜索
- 启用搜索建议
- 自动补全数据:
+ 启用搜索建议
+ 自动补全数据:请选择一项您确定要删除 {0} 吗?
- 如果您有您想要使用的网页搜索服务,您可以将其添加到 Flow。例如,如果您想要在 Netflix 上搜索“casino”,您可以遵循地址栏中的 URL 格式:"https://www.netflix.com/search?q=Casino"。要做到这一点,使用搜索词“Casino”。
- https://www.netflix.com/search?q={q}
- 将其添加到下面的 URL 部分。您现在可以使用任意的搜索词来从 Netflix 中搜索。
-
+ 如果你想添加某个搜索,首先在网站的搜索框中输入任意内容并开始搜索。然后把浏览器地址栏中的URL复制到下面的 UR 输入框中,并把你搜索的内容换成 {q}。例如,你在 Netflix 上搜索 "Casino" ,那么搜索结果在浏览器地址栏中的 URL 就是
+ https://www.netflix.com/search?q=Casino
+
+ 把整个 URL 复制下来然后粘贴在下面的 URL 输入框里面。
+ 然后用{q}替换 "Casino" 。
+ 那么 Netflix 搜索的表达式就是 https://www.netflix.com/search?q={q}
+
-
+
+
+
标题启用选择图标
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
index ae6073e52..996b19dad 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
@@ -14,16 +14,21 @@
觸發關鍵字URL搜尋
- 啟用搜尋建議
- Autocomplete Data from:
+ 啟用搜尋建議
+ Autocomplete Data from:請選擇一項你確認要刪除{0}嗎
- If you have a web search service you want to use, you can add it to Flow. For example, you can follow the url format in the address bar if you want to search 'casino' on Netflix: "https://www.netflix.com/search?q=Casino". To do this, change the search term 'Casino' as follows.
- https://www.netflix.com/search?q={q}
- Add it to the URL section below. You can now search Netflix with Flow using any search terms.
-
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entrire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
-
+
+
+
標題啟用選擇圖示
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Images/ControlPanel_Small.png b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Images/ControlPanel_Small.png
index 8a8a41aeb..0897fd788 100644
Binary files a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Images/ControlPanel_Small.png and b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Images/ControlPanel_Small.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.it-IT.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.it-IT.resx
index 92fe51852..68597c289 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.it-IT.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.it-IT.resx
@@ -118,7 +118,7 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- About
+ InformazioniArea System
@@ -701,7 +701,7 @@
Area Gaming
- Game Mode
+ Modalità giocoArea Gaming
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
index 02f27d86e..ce51fe6e9 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
@@ -1929,28 +1929,28 @@
Change what closing the lid does
- Turn off unnecessary animations
+ Desativar animações desnecessárias
- Create a restore point
+ Criar um ponto de restauro
- Turn off automatic window arrangement
+ Desativar ajuste automático das janelas
- Troubleshooting History
+ Histórico da resolução de problemas
- Diagnose your computer's memory problems
+ Diagnosticar problemas de memória do computador
- View recommended actions to keep Windows running smoothly
+ Ver ações recomendadas para manter o sistema a funcionar nas melhores condiçõesChange cursor blink rate
- Add or remove programs
+ Adicionar ou remover programasCreate a password reset disk
@@ -1980,10 +1980,10 @@
View advanced system settings
- How to install a program
+ Como instalar um programa
- Change how your keyboard works
+ Alterar modo de funcionamento do tecladoAutomatically adjust for daylight saving time
@@ -1992,7 +1992,7 @@
Change the order of Windows SideShow gadgets
- Check keyboard status
+ Analisar estado do tecladoControl the computer without the mouse or keyboard
@@ -2004,7 +2004,7 @@
Change multi-touch gesture settings
- Set up ODBC data sources (64-bit)
+ Configurar origens ODBC (64 bits)Configurar servidor proxy
@@ -2118,19 +2118,19 @@
Change the file type associated with a file extension
- View event logs
+ Ver registo de eventos
- Manage Windows Credentials
+ Gerir credenciais do WindowsConfigurar um microfone
- Change how the mouse pointer looks
+ Alterar aparência do cursor
- Change power-saving settings
+ Alterar definições de poupança de energiaOptimise for blindness
@@ -2158,13 +2158,13 @@
Train the computer to recognise your voice
- Advanced printer setup
+ Configuração avançada de impressora
- Change default printer
+ Alterar impressora pré-definida
- Edit environment variables for your account
+ Editar variáveis de ambiente do seu utilizadorOptimise visual display
@@ -2320,7 +2320,7 @@
Set up dialling rules
- Enable or disable session cookies
+ Ativar ou desativar cookies da sessãoGive administrative rights to a domain user
@@ -2341,67 +2341,67 @@
Change text-to-speech settings
- Set the time and date
+ Definir hora e a data
- Change location settings
+ Alterar definições de localização
- Change mouse settings
+ Alterar definições do rato
- Manage Storage Spaces
+ Gerir espaços de armazenamento
- Show or hide file extensions
+ Mostrar ou ocultar a extensão dos ficheirosAllow an app through Windows Firewall
- Change system sounds
+ Alterar sons do sistema
- Adjust ClearType text
+ Ajustar texto Clear Type
- Turn screen saver on or off
+ Ativar ou desativar a proteção de ecrã
- Find and fix windows update problems
+ Localizar e corrigir problemas com as atualizações
- Change Bluetooth settings
+ Alterar definições Bluethooth
- Connect to a network
+ Ligar a uma rede
- Change the search provider in Internet Explorer
+ Alterar fornecedor de pesquisa do Internet Explorer
- Join a domain
+ Integrar um domínio
- Add a device
+ Adicionar um dispositivo
- Find and fix problems with Windows Search
+ Localizar e corrigir problemas com a pesquisa Windows
- Choose a power plan
+ Escolher um plano de energia
- Change how the mouse pointer looks when it’s moving
+ Alterar aparência do ponteiro do rato durante o movimento
- Uninstall a program
+ Desinstalar um programa
- Create and format hard disk partitions
+ Criar e formatar partições do disco rígido
- Change date, time or number formats
+ Alterar formatos de data, hora ou númerosChange PC wake-up settings
@@ -2410,19 +2410,19 @@
Manage network passwords
- Change input methods
+ Alterar métodos de entradaManage advanced sharing settings
- Change battery settings
+ Alterar definições da bateria
- Rename this computer
+ Mudar nome do computador
- Lock or unlock the taskbar
+ Bloquear ou desbloquear a barra de tarefasManage Web Credentials
@@ -2500,7 +2500,7 @@
Create an account
- Get more features with a new edition of Windows
+ Obter mais funcionalidades com uma nova edição WindowsPainel de controlo
@@ -2509,6 +2509,6 @@
TaskLink
- Unknown
+ Desconhecido
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.sk-SK.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.sk-SK.resx
index df4b4c072..5bac50743 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.sk-SK.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.sk-SK.resx
@@ -673,7 +673,7 @@
Area System
- Asistent na lepšie sústredenie - Obdobie kľudu
+ Asistent na lepšie sústredenie - Obdobie pokojaArea System
@@ -831,7 +831,7 @@
Area TimeAndLanguage
-
+ Svetlá farbaSvetlý režim
@@ -982,7 +982,7 @@
"NFC should not translated"
-
+ Nočné osvetlenieNastavenia nočného osvetlenia
@@ -1004,7 +1004,7 @@
Zastarané v systéme Windows 10, verzia 1809 (zostava 17763) a novších.
-
+ K dispozícii len v prípade, že je spárované zariadenie Dial.Dostupné iba vtedy, ak je povolený DirectAccess.
@@ -1031,7 +1031,7 @@
Dostupné iba v prípade, že je nainštalovaná aplikácia Mixed Reality Portal.
-
+ K dispozícii len v mobilných zariadeniach a v prípade, že podnik nasadil balík provisioningu.Pridané v systéme Windows 10, verzia 1903 (zostava 18362).
@@ -1052,7 +1052,7 @@
Zariadenie musí podporovať Windows Anywhere.
-
+ K dispozícii len v prípade, že podnik nasadil balík provisioningu.Oznámenia
@@ -1271,7 +1271,7 @@
Area TimeAndLanguage
-
+ Hranie hry na celú obrazovkuVysielače
@@ -1297,7 +1297,7 @@
Mean the weakness you can't differ between red and green colors
-
+ ProtanopiaMean you don't can see red colors
@@ -1427,7 +1427,7 @@
Area Personalization
-
+ Priečinky v ponuke ŠtartAplikácie pri spustení
@@ -1595,7 +1595,7 @@
Area Privacy
-
+ HlasitosťVPN
@@ -2290,7 +2290,7 @@
Skontrolovať stav zabezpečenia
- Delete cookies or temporary files
+ Odstrániť súbory cookie alebo dočasné súboryZadanie ruky používanej na písanie
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.zh-cn.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.zh-cn.resx
index f42f045a2..af8d029b0 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.zh-cn.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.zh-cn.resx
@@ -2353,7 +2353,7 @@
Manage Storage Spaces
- Show or hide file extensions
+ 是否显示文件扩展名Allow an app through Windows Firewall
@@ -2509,6 +2509,6 @@
TaskLink
- Unknown
+ 未知
\ No newline at end of file
diff --git a/README.md b/README.md
index 58dbd0be9..1441c8b39 100644
--- a/README.md
+++ b/README.md
@@ -288,6 +288,12 @@ Yes please, let us know in the [Q&A](https://github.com/Flow-Launcher/Flow.Launc
## Development
+### New changes
+
+All changes to flow are captured via pull requests. Some new changes will have been merged but still pending release, this means whilst a change may not exist in the current latest release, it may very well have been accepted and merged into the dev branch and available as a pre-release download. It is therefore a good idea that before you start to make changes, search through the open and closed pull requests to make sure the change you intend to make is not already done.
+
+Each of the pull requests will be marked with a milestone indicating the planned release version for the change.
+
### Contributing
Contributions are very welcome, in addition to the main project(C#) there are also [documentation](https://github.com/Flow-Launcher/docs)(md), [website](https://github.com/Flow-Launcher/flow-launcher.github.io)(html/css) and [others](https://github.com/Flow-Launcher) that can be contributed to. If you are unsure of a change you want to make, let us know in the [Discussions](https://github.com/Flow-Launcher/Flow.Launcher/discussions/categories/ideas), otherwise feel free to put in a pull request.
diff --git a/appveyor.yml b/appveyor.yml
index a71779fdc..d467792d7 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -7,6 +7,10 @@ init:
- sc config WSearch start= auto # Starts Windows Search service- Needed for running ExplorerTest
- net start WSearch
+cache:
+ - '%USERPROFILE%\.nuget\packages -> **.sln, **.csproj' # preserve nuget folder (packages) unless the solution or projects change
+
+
assembly_info:
patch: true
file: SolutionAssemblyInfo.cs
@@ -28,7 +32,9 @@ before_build:
build:
project: Flow.Launcher.sln
verbosity: minimal
-after_build:
+test_script:
+ - dotnet test --no-build -c Release
+after_test:
- ps: .\Scripts\post_build.ps1
artifacts:
diff --git a/global.json b/global.json
index 5e94f4b05..6ff5b35d3 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
{
"sdk": {
- "version": "6.0.100",
- "rollForward": "latestFeature"
+ "version": "6.0.*",
+ "rollForward": "latestPatch"
}
}
\ No newline at end of file