mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Merge pull request #2617 from Flow-Launcher/dev
Release 1.18.0 | Plugin 4.3.0
This commit is contained in:
commit
7ea5c68780
133 changed files with 1455 additions and 1308 deletions
|
|
@ -58,7 +58,7 @@ dotnet_style_prefer_conditional_expression_over_return = true:silent
|
|||
###############################
|
||||
# Style Definitions
|
||||
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
|
||||
# Use PascalCase for constant fields
|
||||
# Use PascalCase for constant fields
|
||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
|
||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
|
||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
|
||||
|
|
@ -134,7 +134,7 @@ csharp_preserve_single_line_statements = true
|
|||
csharp_preserve_single_line_blocks = true
|
||||
csharp_using_directive_placement = outside_namespace:silent
|
||||
csharp_prefer_simple_using_statement = true:suggestion
|
||||
csharp_style_namespace_declarations = block_scoped:silent
|
||||
csharp_style_namespace_declarations = file_scoped:silent
|
||||
csharp_style_prefer_method_group_conversion = true:silent
|
||||
csharp_style_expression_bodied_lambdas = true:silent
|
||||
csharp_style_expression_bodied_local_functions = false:silent
|
||||
|
|
|
|||
1
.github/actions/spelling/expect.txt
vendored
1
.github/actions/spelling/expect.txt
vendored
|
|
@ -106,3 +106,4 @@ alreadyexists
|
|||
JsonRPC
|
||||
JsonRPCV2
|
||||
Softpedia
|
||||
img
|
||||
|
|
|
|||
26
.github/workflows/default_plugins.yml
vendored
26
.github/workflows/default_plugins.yml
vendored
|
|
@ -18,7 +18,7 @@ jobs:
|
|||
dotnet-version: 7.0.x
|
||||
|
||||
- name: Determine New Plugin Updates
|
||||
uses: dorny/paths-filter@v2
|
||||
uses: dorny/paths-filter@v3
|
||||
id: changes
|
||||
with:
|
||||
filters: |
|
||||
|
|
@ -65,7 +65,7 @@ jobs:
|
|||
|
||||
- name: Publish BrowserBookmark
|
||||
if: steps.changes.outputs.browserbookmark == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.BrowserBookmark"
|
||||
files: "Flow.Launcher.Plugin.BrowserBookmark.zip"
|
||||
|
|
@ -92,7 +92,7 @@ jobs:
|
|||
|
||||
- name: Publish Calculator
|
||||
if: steps.changes.outputs.calculator == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.Calculator"
|
||||
files: "Flow.Launcher.Plugin.Calculator.zip"
|
||||
|
|
@ -119,7 +119,7 @@ jobs:
|
|||
|
||||
- name: Publish Explorer
|
||||
if: steps.changes.outputs.explorer == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.Explorer"
|
||||
files: "Flow.Launcher.Plugin.Explorer.zip"
|
||||
|
|
@ -146,7 +146,7 @@ jobs:
|
|||
|
||||
- name: Publish PluginIndicator
|
||||
if: steps.changes.outputs.pluginindicator == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.PluginIndicator"
|
||||
files: "Flow.Launcher.Plugin.PluginIndicator.zip"
|
||||
|
|
@ -173,7 +173,7 @@ jobs:
|
|||
|
||||
- name: Publish PluginsManager
|
||||
if: steps.changes.outputs.pluginsmanager == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.PluginsManager"
|
||||
files: "Flow.Launcher.Plugin.PluginsManager.zip"
|
||||
|
|
@ -200,7 +200,7 @@ jobs:
|
|||
|
||||
- name: Publish ProcessKiller
|
||||
if: steps.changes.outputs.processkiller == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.ProcessKiller"
|
||||
files: "Flow.Launcher.Plugin.ProcessKiller.zip"
|
||||
|
|
@ -227,7 +227,7 @@ jobs:
|
|||
|
||||
- name: Publish Program
|
||||
if: steps.changes.outputs.program == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.Program"
|
||||
files: "Flow.Launcher.Plugin.Program.zip"
|
||||
|
|
@ -254,7 +254,7 @@ jobs:
|
|||
|
||||
- name: Publish Shell
|
||||
if: steps.changes.outputs.shell == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.Shell"
|
||||
files: "Flow.Launcher.Plugin.Shell.zip"
|
||||
|
|
@ -281,7 +281,7 @@ jobs:
|
|||
|
||||
- name: Publish Sys
|
||||
if: steps.changes.outputs.sys == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.Sys"
|
||||
files: "Flow.Launcher.Plugin.Sys.zip"
|
||||
|
|
@ -308,7 +308,7 @@ jobs:
|
|||
|
||||
- name: Publish Url
|
||||
if: steps.changes.outputs.url == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.Url"
|
||||
files: "Flow.Launcher.Plugin.Url.zip"
|
||||
|
|
@ -335,7 +335,7 @@ jobs:
|
|||
|
||||
- name: Publish WebSearch
|
||||
if: steps.changes.outputs.websearch == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.WebSearch"
|
||||
files: "Flow.Launcher.Plugin.WebSearch.zip"
|
||||
|
|
@ -362,7 +362,7 @@ jobs:
|
|||
|
||||
- name: Publish WindowsSettings
|
||||
if: steps.changes.outputs.windowssettings == 'true'
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
repository: "Flow-Launcher/Flow.Launcher.Plugin.WindowsSettings"
|
||||
files: "Flow.Launcher.Plugin.WindowsSettings.zip"
|
||||
|
|
|
|||
|
|
@ -56,9 +56,9 @@
|
|||
<PackageReference Include="Droplex" Version="1.7.0" />
|
||||
<PackageReference Include="FSharp.Core" Version="7.0.401" />
|
||||
<PackageReference Include="Meziantou.Framework.Win32.Jobs" Version="3.2.1" />
|
||||
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="2.3.2" />
|
||||
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.0" />
|
||||
<PackageReference Include="squirrel.windows" Version="1.5.2" NoWarn="NU1701" />
|
||||
<PackageReference Include="StreamJsonRpc" Version="2.17.8" />
|
||||
<PackageReference Include="StreamJsonRpc" Version="2.17.11" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
|||
|
|
@ -12,15 +12,9 @@ namespace Flow.Launcher.Core.Plugin
|
|||
|
||||
public ExecutablePluginV2(string filename)
|
||||
{
|
||||
StartInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = filename,
|
||||
UseShellExecute = false,
|
||||
CreateNoWindow = true,
|
||||
RedirectStandardOutput = true,
|
||||
RedirectStandardError = true
|
||||
};
|
||||
StartInfo = new ProcessStartInfo { FileName = filename };
|
||||
}
|
||||
|
||||
protected override MessageHandlerType MessageHandler { get; } = MessageHandlerType.NewLineDelimited;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,8 +15,6 @@ namespace Flow.Launcher.Core.Plugin
|
|||
{
|
||||
internal abstract class JsonRPCPluginV2 : JsonRPCPluginBase, IAsyncDisposable, IAsyncReloadable, IResultUpdated
|
||||
{
|
||||
public abstract string SupportedLanguage { get; set; }
|
||||
|
||||
public const string JsonRpc = "JsonRPC";
|
||||
|
||||
protected abstract IDuplexPipe ClientPipe { get; set; }
|
||||
|
|
@ -41,9 +39,23 @@ namespace Flow.Launcher.Core.Plugin
|
|||
}
|
||||
}
|
||||
|
||||
private JoinableTaskFactory JTF { get; } = new JoinableTaskFactory(new JoinableTaskContext());
|
||||
|
||||
public override List<Result> LoadContextMenus(Result selectedResult)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
try
|
||||
{
|
||||
var res = JTF.Run(() => RPC.InvokeWithCancellationAsync<JsonRPCQueryResponseModel>("context_menu",
|
||||
new object[] { selectedResult.ContextData }));
|
||||
|
||||
var results = ParseResults(res);
|
||||
|
||||
return results;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return new List<Result>();
|
||||
}
|
||||
}
|
||||
|
||||
public override async Task<List<Result>> QueryAsync(Query query, CancellationToken token)
|
||||
|
|
@ -51,7 +63,7 @@ namespace Flow.Launcher.Core.Plugin
|
|||
try
|
||||
{
|
||||
var res = await RPC.InvokeWithCancellationAsync<JsonRPCQueryResponseModel>("query",
|
||||
new[] { query },
|
||||
new object[] { query, Settings.Inner },
|
||||
token);
|
||||
|
||||
var results = ParseResults(res);
|
||||
|
|
@ -88,12 +100,26 @@ namespace Flow.Launcher.Core.Plugin
|
|||
|
||||
public event ResultUpdatedEventHandler ResultsUpdated;
|
||||
|
||||
protected enum MessageHandlerType
|
||||
{
|
||||
HeaderDelimited,
|
||||
LengthHeaderDelimited,
|
||||
NewLineDelimited
|
||||
}
|
||||
|
||||
protected abstract MessageHandlerType MessageHandler { get; }
|
||||
|
||||
|
||||
private void SetupJsonRPC()
|
||||
{
|
||||
var formatter = new SystemTextJsonFormatter { JsonSerializerOptions = RequestSerializeOption };
|
||||
var handler = new NewLineDelimitedMessageHandler(ClientPipe,
|
||||
formatter);
|
||||
IJsonRpcMessageHandler handler = MessageHandler switch
|
||||
{
|
||||
MessageHandlerType.HeaderDelimited => new HeaderDelimitedMessageHandler(ClientPipe, formatter),
|
||||
MessageHandlerType.LengthHeaderDelimited => new LengthHeaderMessageHandler(ClientPipe, formatter),
|
||||
MessageHandlerType.NewLineDelimited => new NewLineDelimitedMessageHandler(ClientPipe, formatter),
|
||||
_ => throw new ArgumentOutOfRangeException()
|
||||
};
|
||||
|
||||
RPC = new JsonRpc(handler, new JsonRPCPublicAPI(Context.API));
|
||||
|
||||
|
|
|
|||
|
|
@ -10,29 +10,21 @@ namespace Flow.Launcher.Core.Plugin
|
|||
/// <summary>
|
||||
/// Execution of JavaScript & TypeScript plugins
|
||||
/// </summary>
|
||||
internal class NodePluginV2 : ProcessStreamPluginV2
|
||||
internal sealed class NodePluginV2 : ProcessStreamPluginV2
|
||||
{
|
||||
public NodePluginV2(string filename)
|
||||
{
|
||||
StartInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = filename,
|
||||
UseShellExecute = false,
|
||||
CreateNoWindow = true,
|
||||
RedirectStandardOutput = true,
|
||||
RedirectStandardError = true
|
||||
};
|
||||
StartInfo = new ProcessStartInfo { FileName = filename, };
|
||||
}
|
||||
|
||||
public override string SupportedLanguage { get; set; }
|
||||
protected override ProcessStartInfo StartInfo { get; set; }
|
||||
|
||||
public override async Task InitAsync(PluginInitContext context)
|
||||
{
|
||||
StartInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
|
||||
StartInfo.ArgumentList.Add(string.Empty);
|
||||
StartInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
|
||||
await base.InitAsync(context);
|
||||
}
|
||||
|
||||
protected override MessageHandlerType MessageHandler { get; } = MessageHandlerType.HeaderDelimited;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
using System;
|
||||
#nullable enable
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO.Pipelines;
|
||||
|
|
@ -6,6 +8,7 @@ using System.Threading.Tasks;
|
|||
using Flow.Launcher.Infrastructure;
|
||||
using Flow.Launcher.Plugin;
|
||||
using Meziantou.Framework.Win32;
|
||||
using Microsoft.VisualBasic.ApplicationServices;
|
||||
using Nerdbank.Streams;
|
||||
|
||||
namespace Flow.Launcher.Core.Plugin
|
||||
|
|
@ -18,18 +21,18 @@ namespace Flow.Launcher.Core.Plugin
|
|||
{
|
||||
_jobObject.SetLimits(new JobObjectLimits()
|
||||
{
|
||||
Flags = JobObjectLimitFlags.KillOnJobClose | JobObjectLimitFlags.DieOnUnhandledException
|
||||
Flags = JobObjectLimitFlags.KillOnJobClose | JobObjectLimitFlags.DieOnUnhandledException |
|
||||
JobObjectLimitFlags.SilentBreakawayOk
|
||||
});
|
||||
|
||||
|
||||
_jobObject.AssignProcess(Process.GetCurrentProcess());
|
||||
}
|
||||
|
||||
public override string SupportedLanguage { get; set; }
|
||||
protected sealed override IDuplexPipe ClientPipe { get; set; }
|
||||
protected sealed override IDuplexPipe ClientPipe { get; set; } = null!;
|
||||
|
||||
protected abstract ProcessStartInfo StartInfo { get; set; }
|
||||
|
||||
protected Process ClientProcess { get; set; }
|
||||
protected Process ClientProcess { get; set; } = null!;
|
||||
|
||||
public override async Task InitAsync(PluginInitContext context)
|
||||
{
|
||||
|
|
@ -37,12 +40,18 @@ namespace Flow.Launcher.Core.Plugin
|
|||
StartInfo.EnvironmentVariables["FLOW_PROGRAM_DIRECTORY"] = Constant.ProgramDirectory;
|
||||
StartInfo.EnvironmentVariables["FLOW_APPLICATION_DIRECTORY"] = Constant.ApplicationDirectory;
|
||||
|
||||
StartInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
|
||||
StartInfo.RedirectStandardError = true;
|
||||
StartInfo.RedirectStandardInput = true;
|
||||
StartInfo.RedirectStandardOutput = true;
|
||||
StartInfo.CreateNoWindow = true;
|
||||
StartInfo.UseShellExecute = false;
|
||||
StartInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
|
||||
|
||||
ClientProcess = Process.Start(StartInfo);
|
||||
ArgumentNullException.ThrowIfNull(ClientProcess);
|
||||
|
||||
var process = Process.Start(StartInfo);
|
||||
ArgumentNullException.ThrowIfNull(process);
|
||||
ClientProcess = process;
|
||||
_jobObject.AssignProcess(ClientProcess);
|
||||
|
||||
SetupPipe(ClientProcess);
|
||||
|
||||
ErrorStream = ClientProcess.StandardError;
|
||||
|
|
|
|||
|
|
@ -18,20 +18,11 @@ namespace Flow.Launcher.Core.Plugin
|
|||
{
|
||||
internal sealed class PythonPluginV2 : ProcessStreamPluginV2
|
||||
{
|
||||
public override string SupportedLanguage { get; set; } = AllowedLanguage.Python;
|
||||
protected override ProcessStartInfo StartInfo { get; set; }
|
||||
|
||||
|
||||
public PythonPluginV2(string filename)
|
||||
{
|
||||
StartInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = filename,
|
||||
UseShellExecute = false,
|
||||
CreateNoWindow = true,
|
||||
RedirectStandardOutput = true,
|
||||
RedirectStandardError = true,
|
||||
RedirectStandardInput = true
|
||||
};
|
||||
StartInfo = new ProcessStartInfo { FileName = filename, };
|
||||
|
||||
var path = Path.Combine(Constant.ProgramDirectory, JsonRpc);
|
||||
StartInfo.EnvironmentVariables["PYTHONPATH"] = path;
|
||||
|
|
@ -39,5 +30,13 @@ namespace Flow.Launcher.Core.Plugin
|
|||
//Add -B flag to tell python don't write .py[co] files. Because .pyc contains location infos which will prevent python portable
|
||||
StartInfo.ArgumentList.Add("-B");
|
||||
}
|
||||
|
||||
public override async Task InitAsync(PluginInitContext context)
|
||||
{
|
||||
StartInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
|
||||
await base.InitAsync(context);
|
||||
}
|
||||
|
||||
protected override MessageHandlerType MessageHandler { get; } = MessageHandlerType.NewLineDelimited;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,11 +49,12 @@
|
|||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Ben.Demystifier" Version="0.4.1" />
|
||||
<PackageReference Include="FastCache.Cached" Version="1.8.2" />
|
||||
<PackageReference Include="Fody" Version="6.5.5">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="MemoryPack" Version="1.10.0" />
|
||||
<PackageReference Include="MemoryPack" Version="1.21.1" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="17.7.30" />
|
||||
<PackageReference Include="NLog" Version="4.7.10" />
|
||||
<PackageReference Include="NLog.Schema" Version="4.7.10" />
|
||||
|
|
|
|||
|
|
@ -4,13 +4,13 @@ using System.Collections.Generic;
|
|||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Windows.Media;
|
||||
using FastCache;
|
||||
using FastCache.Services;
|
||||
|
||||
namespace Flow.Launcher.Infrastructure.Image
|
||||
{
|
||||
[Serializable]
|
||||
public class ImageUsage
|
||||
{
|
||||
|
||||
public int usage;
|
||||
public ImageSource imageSource;
|
||||
|
||||
|
|
@ -23,16 +23,13 @@ namespace Flow.Launcher.Infrastructure.Image
|
|||
|
||||
public class ImageCache
|
||||
{
|
||||
private const int MaxCached = 50;
|
||||
public ConcurrentDictionary<(string, bool), ImageUsage> Data { get; } = new();
|
||||
private const int permissibleFactor = 2;
|
||||
private SemaphoreSlim semaphore = new(1, 1);
|
||||
private const int MaxCached = 150;
|
||||
|
||||
public void Initialize(Dictionary<(string, bool), int> usage)
|
||||
{
|
||||
foreach (var key in usage.Keys)
|
||||
{
|
||||
Data[key] = new ImageUsage(usage[key], null);
|
||||
Cached<ImageUsage>.Save(key, new ImageUsage(usage[key], null), TimeSpan.MaxValue, MaxCached);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -40,70 +37,48 @@ namespace Flow.Launcher.Infrastructure.Image
|
|||
{
|
||||
get
|
||||
{
|
||||
if (!Data.TryGetValue((path, isFullImage), out var value))
|
||||
if (!Cached<ImageUsage>.TryGet((path, isFullImage), out var value))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
value.usage++;
|
||||
return value.imageSource;
|
||||
|
||||
value.Value.usage++;
|
||||
return value.Value.imageSource;
|
||||
}
|
||||
set
|
||||
{
|
||||
Data.AddOrUpdate(
|
||||
(path, isFullImage),
|
||||
new ImageUsage(0, value),
|
||||
(k, v) =>
|
||||
{
|
||||
v.imageSource = value;
|
||||
v.usage++;
|
||||
return v;
|
||||
}
|
||||
);
|
||||
|
||||
SliceExtra();
|
||||
|
||||
async void SliceExtra()
|
||||
if (Cached<ImageUsage>.TryGet((path, isFullImage), out var cached))
|
||||
{
|
||||
// To prevent the dictionary from drastically increasing in size by caching images, the dictionary size is not allowed to grow more than the permissibleFactor * maxCached size
|
||||
// This is done so that we don't constantly perform this resizing operation and also maintain the image cache size at the same time
|
||||
if (Data.Count > permissibleFactor * MaxCached)
|
||||
{
|
||||
await semaphore.WaitAsync().ConfigureAwait(false);
|
||||
// To delete the images from the data dictionary based on the resizing of the Usage Dictionary
|
||||
// Double Check to avoid concurrent remove
|
||||
if (Data.Count > permissibleFactor * MaxCached)
|
||||
foreach (var key in Data.OrderBy(x => x.Value.usage).Take(Data.Count - MaxCached).Select(x => x.Key))
|
||||
Data.TryRemove(key, out _);
|
||||
semaphore.Release();
|
||||
}
|
||||
cached.Value.imageSource = value;
|
||||
cached.Value.usage++;
|
||||
}
|
||||
|
||||
Cached<ImageUsage>.Save((path, isFullImage), new ImageUsage(0, value), TimeSpan.MaxValue,
|
||||
MaxCached);
|
||||
}
|
||||
}
|
||||
|
||||
public bool ContainsKey(string key, bool isFullImage)
|
||||
{
|
||||
return key is not null && Data.ContainsKey((key, isFullImage)) && Data[(key, isFullImage)].imageSource != null;
|
||||
return Cached<ImageUsage>.TryGet((key, isFullImage), out _);
|
||||
}
|
||||
|
||||
public bool TryGetValue(string key, bool isFullImage, out ImageSource image)
|
||||
{
|
||||
if (key is not null)
|
||||
if (Cached<ImageUsage>.TryGet((key, isFullImage), out var value))
|
||||
{
|
||||
bool hasKey = Data.TryGetValue((key, isFullImage), out var imageUsage);
|
||||
image = hasKey ? imageUsage.imageSource : null;
|
||||
return hasKey;
|
||||
}
|
||||
else
|
||||
{
|
||||
image = null;
|
||||
return false;
|
||||
image = value.Value.imageSource;
|
||||
value.Value.usage++;
|
||||
return image != null;
|
||||
}
|
||||
|
||||
image = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
public int CacheSize()
|
||||
{
|
||||
return Data.Count;
|
||||
return CacheManager.TotalCount<(string, bool), ImageUsage>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -111,7 +86,14 @@ namespace Flow.Launcher.Infrastructure.Image
|
|||
/// </summary>
|
||||
public int UniqueImagesInCache()
|
||||
{
|
||||
return Data.Values.Select(x => x.imageSource).Distinct().Count();
|
||||
return CacheManager.EnumerateEntries<(string, bool), ImageUsage>().Select(x => x.Value.imageSource)
|
||||
.Distinct()
|
||||
.Count();
|
||||
}
|
||||
|
||||
public IEnumerable<Cached<(string, bool), ImageUsage>> EnumerateEntries()
|
||||
{
|
||||
return CacheManager.EnumerateEntries<(string, bool), ImageUsage>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ namespace Flow.Launcher.Infrastructure.Image
|
|||
{
|
||||
await Stopwatch.NormalAsync("|ImageLoader.Initialize|Preload images cost", async () =>
|
||||
{
|
||||
foreach (var ((path, isFullImage), _) in ImageCache.Data)
|
||||
foreach (var ((path, isFullImage), _) in usage)
|
||||
{
|
||||
await LoadAsync(path, isFullImage);
|
||||
}
|
||||
|
|
@ -65,7 +65,7 @@ namespace Flow.Launcher.Infrastructure.Image
|
|||
|
||||
try
|
||||
{
|
||||
_storage.SaveAsync(ImageCache.Data
|
||||
await _storage.SaveAsync(ImageCache.EnumerateEntries()
|
||||
.ToDictionary(
|
||||
x => x.Key,
|
||||
x => x.Value.usage));
|
||||
|
|
@ -125,9 +125,12 @@ namespace Flow.Launcher.Infrastructure.Image
|
|||
return new ImageResult(MissingImage, ImageType.Error);
|
||||
}
|
||||
|
||||
if (ImageCache.ContainsKey(path, loadFullImage))
|
||||
// extra scope for use of same variable name
|
||||
{
|
||||
return new ImageResult(ImageCache[path, loadFullImage], ImageType.Cache);
|
||||
if (ImageCache.TryGetValue(path, loadFullImage, out var imageSource))
|
||||
{
|
||||
return new ImageResult(imageSource, ImageType.Cache);
|
||||
}
|
||||
}
|
||||
|
||||
if (Uri.TryCreate(path, UriKind.RelativeOrAbsolute, out var uriResult)
|
||||
|
|
|
|||
|
|
@ -54,6 +54,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
|
|||
public bool UseGlyphIcons { get; set; } = true;
|
||||
public bool UseAnimation { get; set; } = true;
|
||||
public bool UseSound { get; set; } = true;
|
||||
public double SoundVolume { get; set; } = 50;
|
||||
|
||||
public bool UseClock { get; set; } = true;
|
||||
public bool UseDate { get; set; } = false;
|
||||
public string TimeFormat { get; set; } = "hh:mm tt";
|
||||
|
|
|
|||
|
|
@ -14,10 +14,10 @@
|
|||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<Version>4.2.0</Version>
|
||||
<PackageVersion>4.2.0</PackageVersion>
|
||||
<AssemblyVersion>4.2.0</AssemblyVersion>
|
||||
<FileVersion>4.2.0</FileVersion>
|
||||
<Version>4.3.0</Version>
|
||||
<PackageVersion>4.3.0</PackageVersion>
|
||||
<AssemblyVersion>4.3.0</AssemblyVersion>
|
||||
<FileVersion>4.3.0</FileVersion>
|
||||
<PackageId>Flow.Launcher.Plugin</PackageId>
|
||||
<Authors>Flow-Launcher</Authors>
|
||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||
|
|
|
|||
|
|
@ -291,5 +291,12 @@ namespace Flow.Launcher.Plugin
|
|||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool IsGameModeOn();
|
||||
|
||||
/// <summary>
|
||||
/// Reloads the query.
|
||||
/// This method should run
|
||||
/// </summary>
|
||||
/// <param name="reselect">Choose the first result after reload if true; keep the last selected result if false. Default is true.</param>
|
||||
public void ReQuery(bool reselect = true);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -183,6 +183,31 @@ namespace Flow.Launcher.Plugin
|
|||
return Title + SubTitle + Score;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clones the current result
|
||||
/// </summary>
|
||||
public Result Clone()
|
||||
{
|
||||
return new Result
|
||||
{
|
||||
Title = Title,
|
||||
SubTitle = SubTitle,
|
||||
ActionKeywordAssigned = ActionKeywordAssigned,
|
||||
CopyText = CopyText,
|
||||
AutoCompleteText = AutoCompleteText,
|
||||
IcoPath = IcoPath,
|
||||
RoundedIcon = RoundedIcon,
|
||||
Icon = Icon,
|
||||
Glyph = Glyph,
|
||||
Action = Action,
|
||||
AsyncAction = AsyncAction,
|
||||
Score = Score,
|
||||
TitleHighlightData = TitleHighlightData,
|
||||
OriginQuery = OriginQuery,
|
||||
PluginDirectory = PluginDirectory
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Additional data associated with this result
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@
|
|||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
@ -3,53 +3,38 @@ using System.Globalization;
|
|||
using System.Windows.Data;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Flow.Launcher.Converters
|
||||
{
|
||||
internal class BoolToIMEConversionModeConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is bool v)
|
||||
{
|
||||
if (v)
|
||||
{
|
||||
return ImeConversionModeValues.Alphanumeric;
|
||||
}
|
||||
else
|
||||
{
|
||||
return ImeConversionModeValues.DoNotCare;
|
||||
}
|
||||
}
|
||||
return ImeConversionModeValues.DoNotCare;
|
||||
}
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
internal class BoolToIMEConversionModeConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return value switch
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
true => ImeConversionModeValues.Alphanumeric,
|
||||
_ => ImeConversionModeValues.DoNotCare
|
||||
};
|
||||
}
|
||||
|
||||
internal class BoolToIMEStateConverter : IValueConverter
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is bool v)
|
||||
{
|
||||
if (v)
|
||||
{
|
||||
return InputMethodState.Off;
|
||||
}
|
||||
else
|
||||
{
|
||||
return InputMethodState.DoNotCare;
|
||||
}
|
||||
}
|
||||
return InputMethodState.DoNotCare;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
internal class BoolToIMEStateConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return value switch
|
||||
{
|
||||
true => InputMethodState.Off,
|
||||
_ => InputMethodState.DoNotCare
|
||||
};
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,70 +2,39 @@
|
|||
using System.Windows;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Flow.Launcher.Converters
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
public class BoolToVisibilityConverter : IValueConverter
|
||||
{
|
||||
public class BoolToVisibilityConverter : IValueConverter
|
||||
public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
|
||||
return (value, parameter) switch
|
||||
{
|
||||
if (parameter != null)
|
||||
{
|
||||
if (value is true)
|
||||
{
|
||||
return Visibility.Collapsed;
|
||||
}
|
||||
(true, not null) => Visibility.Collapsed,
|
||||
(_, not null) => Visibility.Visible,
|
||||
|
||||
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();
|
||||
(true, null) => Visibility.Visible,
|
||||
(_, null) => Visibility.Collapsed
|
||||
};
|
||||
}
|
||||
|
||||
public class SplitterConverter : IValueConverter
|
||||
/* Prevents the dragging part of the preview area from working when preview is turned off. */
|
||||
{
|
||||
public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (parameter != null)
|
||||
{
|
||||
if (value is true)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
return 5;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (value is true)
|
||||
{
|
||||
return 5;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
|
||||
}
|
||||
public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
|
||||
}
|
||||
|
||||
public class SplitterConverter : IValueConverter
|
||||
/* Prevents the dragging part of the preview area from working when preview is turned off. */
|
||||
{
|
||||
public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return (value, parameter) switch
|
||||
{
|
||||
(true, not null) => 0,
|
||||
(_, not null) => 5,
|
||||
|
||||
(true, null) => 5,
|
||||
(_, null) => 0
|
||||
};
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,46 +7,41 @@ using System.Windows.Shapes;
|
|||
|
||||
// For Clipping inside listbox item
|
||||
|
||||
namespace Flow.Launcher.Converters
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
public class BorderClipConverter : IMultiValueConverter
|
||||
{
|
||||
public class BorderClipConverter : IMultiValueConverter
|
||||
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
||||
if (values is not [double width, double height, CornerRadius radius])
|
||||
{
|
||||
if (values.Length == 3 && values[0] is double && values[1] is double && values[2] is CornerRadius)
|
||||
{
|
||||
var width = (double)values[0];
|
||||
var height = (double)values[1];
|
||||
Path myPath = new Path();
|
||||
if (width < Double.Epsilon || height < Double.Epsilon)
|
||||
{
|
||||
return Geometry.Empty;
|
||||
}
|
||||
var radius = (CornerRadius)values[2];
|
||||
var radiusHeight = radius.TopLeft;
|
||||
|
||||
// Drawing Round box for bottom round, and rect for top area of listbox.
|
||||
var corner = new RectangleGeometry(new Rect(0, 0, width, height), radius.TopLeft, radius.TopLeft);
|
||||
var box = new RectangleGeometry(new Rect(0, 0, width, radiusHeight), 0, 0);
|
||||
|
||||
GeometryGroup myGeometryGroup = new GeometryGroup();
|
||||
myGeometryGroup.Children.Add(corner);
|
||||
myGeometryGroup.Children.Add(box);
|
||||
|
||||
CombinedGeometry c1 = new CombinedGeometry(GeometryCombineMode.Union, corner, box);
|
||||
myPath.Data = c1;
|
||||
|
||||
myPath.Data.Freeze();
|
||||
return myPath.Data;
|
||||
}
|
||||
|
||||
return DependencyProperty.UnsetValue;
|
||||
}
|
||||
|
||||
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
|
||||
Path myPath = new Path();
|
||||
if (width < Double.Epsilon || height < Double.Epsilon)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
return Geometry.Empty;
|
||||
}
|
||||
var radiusHeight = radius.TopLeft;
|
||||
|
||||
// Drawing Round box for bottom round, and rect for top area of listbox.
|
||||
var corner = new RectangleGeometry(new Rect(0, 0, width, height), radius.TopLeft, radius.TopLeft);
|
||||
var box = new RectangleGeometry(new Rect(0, 0, width, radiusHeight), 0, 0);
|
||||
|
||||
GeometryGroup myGeometryGroup = new GeometryGroup();
|
||||
myGeometryGroup.Children.Add(corner);
|
||||
myGeometryGroup.Children.Add(box);
|
||||
|
||||
CombinedGeometry c1 = new CombinedGeometry(GeometryCombineMode.Union, corner, box);
|
||||
myPath.Data = c1;
|
||||
|
||||
myPath.Data.Freeze();
|
||||
return myPath.Data;
|
||||
}
|
||||
|
||||
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,18 +2,17 @@
|
|||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Flow.Launcher.Converters
|
||||
{
|
||||
public class DateTimeFormatToNowConverter : IValueConverter
|
||||
{
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return value is not string format ? null : DateTime.Now.ToString(format);
|
||||
}
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
public class DateTimeFormatToNowConverter : IValueConverter
|
||||
{
|
||||
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return value is not string format ? null : DateTime.Now.ToString(format);
|
||||
}
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,23 +3,22 @@ using System.Globalization;
|
|||
using System.Windows;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Flow.Launcher.Converters
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
public class DiameterToCenterPointConverter : IValueConverter
|
||||
{
|
||||
public class DiameterToCenterPointConverter : IValueConverter
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
if (value is double d)
|
||||
{
|
||||
if (value is double d)
|
||||
{
|
||||
return new Point(d / 2, d / 2);
|
||||
}
|
||||
|
||||
return new Point(0, 0);
|
||||
return new Point(d / 2, d / 2);
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
return new Point(0, 0);
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,53 +1,48 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
|
||||
namespace Flow.Launcher.Converters
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
public class HighlightTextConverter : IMultiValueConverter
|
||||
{
|
||||
public class HighlightTextConverter : IMultiValueConverter
|
||||
public object Convert(object[] value, Type targetType, object parameter, CultureInfo cultureInfo)
|
||||
{
|
||||
public object Convert(object[] value, Type targetType, object parameter, CultureInfo cultureInfo)
|
||||
if (value.Length < 2)
|
||||
return new Run(string.Empty);
|
||||
|
||||
if (value[0] is not string text)
|
||||
return new Run(string.Empty);
|
||||
|
||||
if (value[1] is not List<int> { Count: > 0 } highlightData)
|
||||
// No highlight data, just return the text
|
||||
return new Run(text);
|
||||
|
||||
var highlightStyle = (Style)Application.Current.FindResource("HighlightStyle");
|
||||
var textBlock = new Span();
|
||||
|
||||
for (var i = 0; i < text.Length; i++)
|
||||
{
|
||||
var text = value[0] as string;
|
||||
var highlightData = value[1] as List<int>;
|
||||
|
||||
var textBlock = new Span();
|
||||
|
||||
if (highlightData == null || !highlightData.Any())
|
||||
var currentCharacter = text.Substring(i, 1);
|
||||
var run = new Run(currentCharacter)
|
||||
{
|
||||
// No highlight data, just return the text
|
||||
return new Run(text);
|
||||
}
|
||||
|
||||
for (var i = 0; i < text.Length; i++)
|
||||
{
|
||||
var currentCharacter = text.Substring(i, 1);
|
||||
if (this.ShouldHighlight(highlightData, i))
|
||||
{
|
||||
|
||||
textBlock.Inlines.Add(new Run(currentCharacter) { Style = (Style)Application.Current.FindResource("HighlightStyle") });
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
textBlock.Inlines.Add(new Run(currentCharacter));
|
||||
}
|
||||
}
|
||||
return textBlock;
|
||||
Style = ShouldHighlight(highlightData, i) ? highlightStyle : null
|
||||
};
|
||||
textBlock.Inlines.Add(run);
|
||||
}
|
||||
return textBlock;
|
||||
}
|
||||
|
||||
public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return new[] { DependencyProperty.UnsetValue, DependencyProperty.UnsetValue };
|
||||
}
|
||||
public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return new[] { DependencyProperty.UnsetValue, DependencyProperty.UnsetValue };
|
||||
}
|
||||
|
||||
private bool ShouldHighlight(List<int> highlightData, int index)
|
||||
{
|
||||
return highlightData.Contains(index);
|
||||
}
|
||||
private bool ShouldHighlight(List<int> highlightData, int index)
|
||||
{
|
||||
return highlightData.Contains(index);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,25 +2,19 @@
|
|||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Flow.Launcher.Converters
|
||||
{
|
||||
public class IconRadiusConverter : IMultiValueConverter
|
||||
{
|
||||
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (values.Length != 2)
|
||||
throw new ArgumentException("IconRadiusConverter must have 2 parameters");
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
return values[1] switch
|
||||
{
|
||||
true => (double)values[0] / 2,
|
||||
false => (double)values[0],
|
||||
_ => throw new ArgumentException("The second argument should be boolean", nameof(values))
|
||||
};
|
||||
}
|
||||
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
public class IconRadiusConverter : IMultiValueConverter
|
||||
{
|
||||
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (values is not [double size, bool isIconCircular])
|
||||
throw new ArgumentException("IconRadiusConverter must have 2 parameters: [double, bool]");
|
||||
|
||||
return isIconCircular ? size / 2 : size;
|
||||
}
|
||||
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,24 +4,23 @@ using System.Windows;
|
|||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Flow.Launcher.Converters
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
[ValueConversion(typeof(bool), typeof(Visibility))]
|
||||
public class OpenResultHotkeyVisibilityConverter : IValueConverter
|
||||
{
|
||||
[ValueConversion(typeof(bool), typeof(Visibility))]
|
||||
public class OpenResultHotkeyVisibilityConverter : IValueConverter
|
||||
private const int MaxVisibleHotkeys = 10;
|
||||
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
private const int MaxVisibleHotkeys = 10;
|
||||
var number = int.MaxValue;
|
||||
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
var number = int.MaxValue;
|
||||
if (value is ListBoxItem listBoxItem
|
||||
&& ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
|
||||
number = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
|
||||
|
||||
if (value is ListBoxItem listBoxItem
|
||||
&& ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
|
||||
number = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
|
||||
|
||||
return number <= MaxVisibleHotkeys ? Visibility.Visible : Visibility.Collapsed;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
|
||||
return number <= MaxVisibleHotkeys ? Visibility.Visible : Visibility.Collapsed;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new InvalidOperationException();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,23 +1,24 @@
|
|||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Flow.Launcher.Converters
|
||||
{
|
||||
public class OrdinalConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is ListBoxItem listBoxItem
|
||||
&& ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
|
||||
{
|
||||
var res = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
|
||||
return res == 10 ? 0 : res; // 10th item => HOTKEY+0
|
||||
}
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
public class OrdinalConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is not ListBoxItem listBoxItem
|
||||
|| ItemsControl.ItemsControlFromItemContainer(listBoxItem) is not ListBox listBox)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
|
||||
var res = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
|
||||
return res == 10 ? 0 : res; // 10th item => HOTKEY+0
|
||||
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new InvalidOperationException();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,74 +6,62 @@ using System.Windows.Media;
|
|||
using Flow.Launcher.Infrastructure.Logger;
|
||||
using Flow.Launcher.ViewModel;
|
||||
|
||||
namespace Flow.Launcher.Converters
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
public class QuerySuggestionBoxConverter : IMultiValueConverter
|
||||
{
|
||||
public class QuerySuggestionBoxConverter : IMultiValueConverter
|
||||
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
||||
// values[0] is TextBox: The textbox displaying the autocomplete suggestion
|
||||
// values[1] is ResultViewModel: Currently selected item in the list
|
||||
// values[2] is string: Query text
|
||||
if (
|
||||
values.Length != 3 ||
|
||||
values[0] is not TextBox queryTextBox ||
|
||||
values[1] is null ||
|
||||
values[2] is not string queryText ||
|
||||
string.IsNullOrEmpty(queryText)
|
||||
)
|
||||
return string.Empty;
|
||||
|
||||
if (values[1] is not ResultViewModel selectedItem)
|
||||
return Binding.DoNothing;
|
||||
|
||||
try
|
||||
{
|
||||
if (values.Length != 3)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
var QueryTextBox = values[0] as TextBox;
|
||||
var selectedResult = selectedItem.Result;
|
||||
var selectedResultActionKeyword = string.IsNullOrEmpty(selectedResult.ActionKeywordAssigned) ? "" : selectedResult.ActionKeywordAssigned + " ";
|
||||
var selectedResultPossibleSuggestion = selectedResultActionKeyword + selectedResult.Title;
|
||||
|
||||
var queryText = (string)values[2];
|
||||
|
||||
if (string.IsNullOrEmpty(queryText))
|
||||
if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase))
|
||||
return string.Empty;
|
||||
|
||||
// second prop is the current selected item result
|
||||
var val = values[1];
|
||||
if (val == null)
|
||||
{
|
||||
|
||||
// For AutocompleteQueryCommand.
|
||||
// When user typed lower case and result title is uppercase, we still want to display suggestion
|
||||
selectedItem.QuerySuggestionText = queryText + selectedResultPossibleSuggestion.Substring(queryText.Length);
|
||||
|
||||
// Check if Text will be larger than our QueryTextBox
|
||||
Typeface typeface = new Typeface(queryTextBox.FontFamily, queryTextBox.FontStyle, queryTextBox.FontWeight, queryTextBox.FontStretch);
|
||||
// TODO: Obsolete warning?
|
||||
var ft = new FormattedText(queryTextBox.Text, CultureInfo.DefaultThreadCurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, queryTextBox.FontSize, Brushes.Black);
|
||||
|
||||
var offset = queryTextBox.Padding.Right;
|
||||
|
||||
if (ft.Width + offset > queryTextBox.ActualWidth || queryTextBox.HorizontalOffset != 0)
|
||||
return string.Empty;
|
||||
}
|
||||
if (!(val is ResultViewModel))
|
||||
{
|
||||
return System.Windows.Data.Binding.DoNothing;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var selectedItem = (ResultViewModel)val;
|
||||
|
||||
var selectedResult = selectedItem.Result;
|
||||
var selectedResultActionKeyword = string.IsNullOrEmpty(selectedResult.ActionKeywordAssigned) ? "" : selectedResult.ActionKeywordAssigned + " ";
|
||||
var selectedResultPossibleSuggestion = selectedResultActionKeyword + selectedResult.Title;
|
||||
|
||||
if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase))
|
||||
return string.Empty;
|
||||
|
||||
|
||||
// For AutocompleteQueryCommand.
|
||||
// When user typed lower case and result title is uppercase, we still want to display suggestion
|
||||
selectedItem.QuerySuggestionText = queryText + selectedResultPossibleSuggestion.Substring(queryText.Length);
|
||||
|
||||
// Check if Text will be larger then our QueryTextBox
|
||||
System.Windows.Media.Typeface typeface = new Typeface(QueryTextBox.FontFamily, QueryTextBox.FontStyle, QueryTextBox.FontWeight, QueryTextBox.FontStretch);
|
||||
// TODO: Obsolete warning?
|
||||
System.Windows.Media.FormattedText ft = new FormattedText(QueryTextBox.Text, System.Globalization.CultureInfo.DefaultThreadCurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, QueryTextBox.FontSize, Brushes.Black);
|
||||
|
||||
var offset = QueryTextBox.Padding.Right;
|
||||
|
||||
if ((ft.Width + offset) > QueryTextBox.ActualWidth || QueryTextBox.HorizontalOffset != 0)
|
||||
{
|
||||
return string.Empty;
|
||||
};
|
||||
|
||||
return selectedItem.QuerySuggestionText;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Exception(nameof(QuerySuggestionBoxConverter), "fail to convert text for suggestion box", e);
|
||||
return string.Empty;
|
||||
}
|
||||
return selectedItem.QuerySuggestionText;
|
||||
}
|
||||
|
||||
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
Log.Exception(nameof(QuerySuggestionBoxConverter), "fail to convert text for suggestion box", e);
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,30 +3,27 @@ using System.Globalization;
|
|||
using System.Windows.Data;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Flow.Launcher.Converters
|
||||
{
|
||||
class StringToKeyBindingConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
var mode = parameter as string;
|
||||
var hotkeyStr = value as string;
|
||||
var converter = new KeyGestureConverter();
|
||||
var key = (KeyGesture)converter.ConvertFromString(hotkeyStr);
|
||||
if (mode == "key")
|
||||
{
|
||||
return key.Key;
|
||||
}
|
||||
else if (mode == "modifiers")
|
||||
{
|
||||
return key.Modifiers;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
class StringToKeyBindingConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (parameter is not string mode || value is not string hotkeyStr)
|
||||
return null;
|
||||
|
||||
var converter = new KeyGestureConverter();
|
||||
var key = (KeyGesture)converter.ConvertFromString(hotkeyStr);
|
||||
return mode switch
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
"key" => key?.Key,
|
||||
"modifiers" => key?.Modifiers,
|
||||
_ => null
|
||||
};
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,29 +4,27 @@ 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;
|
||||
}
|
||||
|
||||
}
|
||||
namespace Flow.Launcher.Converters;
|
||||
|
||||
public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
|
||||
public class TextConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
var id = value?.ToString();
|
||||
var translationKey = id switch
|
||||
{
|
||||
PluginStoreItemViewModel.NewRelease => "pluginStore_NewRelease",
|
||||
PluginStoreItemViewModel.RecentlyUpdated => "pluginStore_RecentlyUpdated",
|
||||
PluginStoreItemViewModel.None => "pluginStore_None",
|
||||
PluginStoreItemViewModel.Installed => "pluginStore_Installed",
|
||||
_ => null
|
||||
};
|
||||
|
||||
if (translationKey is null)
|
||||
return id;
|
||||
|
||||
return InternationalizationManager.Instance.GetTranslation(translationKey);
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new InvalidOperationException();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,57 +3,56 @@ using Flow.Launcher.Infrastructure;
|
|||
using Flow.Launcher.Infrastructure.Logger;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace Flow.Launcher.Helper
|
||||
namespace Flow.Launcher.Helper;
|
||||
|
||||
public class AutoStartup
|
||||
{
|
||||
public class AutoStartup
|
||||
private const string StartupPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
|
||||
|
||||
public static bool IsEnabled
|
||||
{
|
||||
private const string StartupPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
|
||||
|
||||
public static bool IsEnabled
|
||||
{
|
||||
get
|
||||
{
|
||||
try
|
||||
{
|
||||
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
|
||||
var path = key?.GetValue(Constant.FlowLauncher) as string;
|
||||
return path == Constant.ExecutablePath;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error("AutoStartup", $"Ignoring non-critical registry error (querying if enabled): {e}");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static void Disable()
|
||||
get
|
||||
{
|
||||
try
|
||||
{
|
||||
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
|
||||
key?.DeleteValue(Constant.FlowLauncher, false);
|
||||
var path = key?.GetValue(Constant.FlowLauncher) as string;
|
||||
return path == Constant.ExecutablePath;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error("AutoStartup", $"Failed to disable auto-startup: {e}");
|
||||
throw;
|
||||
Log.Error("AutoStartup", $"Ignoring non-critical registry error (querying if enabled): {e}");
|
||||
}
|
||||
}
|
||||
|
||||
internal static void Enable()
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static void Disable()
|
||||
{
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
|
||||
key?.SetValue(Constant.FlowLauncher, $"\"{Constant.ExecutablePath}\"");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error("AutoStartup", $"Failed to enable auto-startup: {e}");
|
||||
throw;
|
||||
}
|
||||
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
|
||||
key?.DeleteValue(Constant.FlowLauncher, false);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error("AutoStartup", $"Failed to disable auto-startup: {e}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
internal static void Enable()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
|
||||
key?.SetValue(Constant.FlowLauncher, $"\"{Constant.ExecutablePath}\"");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error("AutoStartup", $"Failed to enable auto-startup: {e}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,70 +4,69 @@ using System.Runtime.InteropServices;
|
|||
using System.Windows;
|
||||
using System.Windows.Interop;
|
||||
|
||||
namespace Flow.Launcher.Helper
|
||||
namespace Flow.Launcher.Helper;
|
||||
|
||||
public class DwmDropShadow
|
||||
{
|
||||
public class DwmDropShadow
|
||||
|
||||
[DllImport("dwmapi.dll", PreserveSig = true)]
|
||||
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
|
||||
|
||||
[DllImport("dwmapi.dll")]
|
||||
private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins pMarInset);
|
||||
|
||||
/// <summary>
|
||||
/// Drops a standard shadow to a WPF Window, even if the window isborderless. Only works with DWM (Vista and Seven).
|
||||
/// This method is much more efficient than setting AllowsTransparency to true and using the DropShadow effect,
|
||||
/// as AllowsTransparency involves a huge permormance issue (hardware acceleration is turned off for all the window).
|
||||
/// </summary>
|
||||
/// <param name="window">Window to which the shadow will be applied</param>
|
||||
public static void DropShadowToWindow(Window window)
|
||||
{
|
||||
|
||||
[DllImport("dwmapi.dll", PreserveSig = true)]
|
||||
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
|
||||
|
||||
[DllImport("dwmapi.dll")]
|
||||
private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins pMarInset);
|
||||
|
||||
/// <summary>
|
||||
/// Drops a standard shadow to a WPF Window, even if the window isborderless. Only works with DWM (Vista and Seven).
|
||||
/// This method is much more efficient than setting AllowsTransparency to true and using the DropShadow effect,
|
||||
/// as AllowsTransparency involves a huge permormance issue (hardware acceleration is turned off for all the window).
|
||||
/// </summary>
|
||||
/// <param name="window">Window to which the shadow will be applied</param>
|
||||
public static void DropShadowToWindow(Window window)
|
||||
if (!DropShadow(window))
|
||||
{
|
||||
if (!DropShadow(window))
|
||||
{
|
||||
window.SourceInitialized += window_SourceInitialized;
|
||||
}
|
||||
window.SourceInitialized += window_SourceInitialized;
|
||||
}
|
||||
}
|
||||
|
||||
private static void window_SourceInitialized(object sender, EventArgs e) //fixed typo
|
||||
private static void window_SourceInitialized(object sender, EventArgs e) //fixed typo
|
||||
{
|
||||
Window window = (Window)sender;
|
||||
|
||||
DropShadow(window);
|
||||
|
||||
window.SourceInitialized -= window_SourceInitialized;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The actual method that makes API calls to drop the shadow to the window
|
||||
/// </summary>
|
||||
/// <param name="window">Window to which the shadow will be applied</param>
|
||||
/// <returns>True if the method succeeded, false if not</returns>
|
||||
private static bool DropShadow(Window window)
|
||||
{
|
||||
try
|
||||
{
|
||||
Window window = (Window)sender;
|
||||
WindowInteropHelper helper = new WindowInteropHelper(window);
|
||||
int val = 2;
|
||||
int ret1 = DwmSetWindowAttribute(helper.Handle, 2, ref val, 4);
|
||||
|
||||
DropShadow(window);
|
||||
|
||||
window.SourceInitialized -= window_SourceInitialized;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The actual method that makes API calls to drop the shadow to the window
|
||||
/// </summary>
|
||||
/// <param name="window">Window to which the shadow will be applied</param>
|
||||
/// <returns>True if the method succeeded, false if not</returns>
|
||||
private static bool DropShadow(Window window)
|
||||
{
|
||||
try
|
||||
if (ret1 == 0)
|
||||
{
|
||||
WindowInteropHelper helper = new WindowInteropHelper(window);
|
||||
int val = 2;
|
||||
int ret1 = DwmSetWindowAttribute(helper.Handle, 2, ref val, 4);
|
||||
|
||||
if (ret1 == 0)
|
||||
{
|
||||
Margins m = new Margins { Bottom = 0, Left = 0, Right = 0, Top = 0 };
|
||||
int ret2 = DwmExtendFrameIntoClientArea(helper.Handle, ref m);
|
||||
return ret2 == 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Margins m = new Margins { Bottom = 0, Left = 0, Right = 0, Top = 0 };
|
||||
int ret2 = DwmExtendFrameIntoClientArea(helper.Handle, ref m);
|
||||
return ret2 == 0;
|
||||
}
|
||||
catch (Exception)
|
||||
else
|
||||
{
|
||||
// Probably dwmapi.dll not found (incompatible OS)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
catch (Exception)
|
||||
{
|
||||
// Probably dwmapi.dll not found (incompatible OS)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,68 +2,67 @@
|
|||
using System.IO;
|
||||
using System.Net;
|
||||
|
||||
namespace Flow.Launcher.Helper
|
||||
namespace Flow.Launcher.Helper;
|
||||
|
||||
public class DataWebRequestFactory : IWebRequestCreate
|
||||
{
|
||||
public class DataWebRequestFactory : IWebRequestCreate
|
||||
class DataWebRequest : WebRequest
|
||||
{
|
||||
class DataWebRequest : WebRequest
|
||||
private readonly Uri _uri;
|
||||
|
||||
public DataWebRequest(Uri uri)
|
||||
{
|
||||
private readonly Uri m_uri;
|
||||
|
||||
public DataWebRequest(Uri uri)
|
||||
{
|
||||
m_uri = uri;
|
||||
}
|
||||
|
||||
public override WebResponse GetResponse()
|
||||
{
|
||||
return new DataWebResponse(m_uri);
|
||||
}
|
||||
_uri = uri;
|
||||
}
|
||||
|
||||
class DataWebResponse : WebResponse
|
||||
public override WebResponse GetResponse()
|
||||
{
|
||||
private readonly string m_contentType;
|
||||
private readonly byte[] m_data;
|
||||
|
||||
public DataWebResponse(Uri uri)
|
||||
{
|
||||
string uriString = uri.AbsoluteUri;
|
||||
|
||||
int commaIndex = uriString.IndexOf(',');
|
||||
var headers = uriString.Substring(0, commaIndex).Split(';');
|
||||
m_contentType = headers[0];
|
||||
string dataString = uriString.Substring(commaIndex + 1);
|
||||
m_data = Convert.FromBase64String(dataString);
|
||||
}
|
||||
|
||||
public override string ContentType
|
||||
{
|
||||
get { return m_contentType; }
|
||||
set
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
||||
public override long ContentLength
|
||||
{
|
||||
get { return m_data.Length; }
|
||||
set
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
||||
public override Stream GetResponseStream()
|
||||
{
|
||||
return new MemoryStream(m_data);
|
||||
}
|
||||
}
|
||||
|
||||
public WebRequest Create(Uri uri)
|
||||
{
|
||||
return new DataWebRequest(uri);
|
||||
return new DataWebResponse(_uri);
|
||||
}
|
||||
}
|
||||
|
||||
class DataWebResponse : WebResponse
|
||||
{
|
||||
private readonly string _contentType;
|
||||
private readonly byte[] _data;
|
||||
|
||||
public DataWebResponse(Uri uri)
|
||||
{
|
||||
string uriString = uri.AbsoluteUri;
|
||||
|
||||
int commaIndex = uriString.IndexOf(',');
|
||||
var headers = uriString.Substring(0, commaIndex).Split(';');
|
||||
_contentType = headers[0];
|
||||
string dataString = uriString.Substring(commaIndex + 1);
|
||||
_data = Convert.FromBase64String(dataString);
|
||||
}
|
||||
|
||||
public override string ContentType
|
||||
{
|
||||
get { return _contentType; }
|
||||
set
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
||||
public override long ContentLength
|
||||
{
|
||||
get { return _data.Length; }
|
||||
set
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
||||
public override Stream GetResponseStream()
|
||||
{
|
||||
return new MemoryStream(_data);
|
||||
}
|
||||
}
|
||||
|
||||
public WebRequest Create(Uri uri)
|
||||
{
|
||||
return new DataWebRequest(uri);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,45 +4,52 @@ using NLog;
|
|||
using Flow.Launcher.Infrastructure;
|
||||
using Flow.Launcher.Infrastructure.Exception;
|
||||
|
||||
namespace Flow.Launcher.Helper
|
||||
namespace Flow.Launcher.Helper;
|
||||
|
||||
public static class ErrorReporting
|
||||
{
|
||||
public static class ErrorReporting
|
||||
private static void Report(Exception e)
|
||||
{
|
||||
private static void Report(Exception e)
|
||||
{
|
||||
var logger = LogManager.GetLogger("UnHandledException");
|
||||
logger.Fatal(ExceptionFormatter.FormatExcpetion(e));
|
||||
var reportWindow = new ReportWindow(e);
|
||||
reportWindow.Show();
|
||||
}
|
||||
var logger = LogManager.GetLogger("UnHandledException");
|
||||
logger.Fatal(ExceptionFormatter.FormatExcpetion(e));
|
||||
var reportWindow = new ReportWindow(e);
|
||||
reportWindow.Show();
|
||||
}
|
||||
|
||||
public static void UnhandledExceptionHandle(object sender, UnhandledExceptionEventArgs e)
|
||||
{
|
||||
//handle non-ui thread exceptions
|
||||
Report((Exception)e.ExceptionObject);
|
||||
}
|
||||
public static void UnhandledExceptionHandle(object sender, UnhandledExceptionEventArgs e)
|
||||
{
|
||||
//handle non-ui thread exceptions
|
||||
Report((Exception)e.ExceptionObject);
|
||||
}
|
||||
|
||||
public static void DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
|
||||
{
|
||||
//handle ui thread exceptions
|
||||
Report(e.Exception);
|
||||
//prevent application exist, so the user can copy prompted error info
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
public static string RuntimeInfo()
|
||||
{
|
||||
var info = $"\nFlow Launcher version: {Constant.Version}" +
|
||||
$"\nOS Version: {ExceptionFormatter.GetWindowsFullVersionFromRegistry()}" +
|
||||
$"\nIntPtr Length: {IntPtr.Size}" +
|
||||
$"\nx64: {Environment.Is64BitOperatingSystem}";
|
||||
return info;
|
||||
}
|
||||
public static void DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
|
||||
{
|
||||
//handle ui thread exceptions
|
||||
Report(e.Exception);
|
||||
//prevent application exist, so the user can copy prompted error info
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
public static string DependenciesInfo()
|
||||
{
|
||||
var info = $"\nPython Path: {Constant.PythonPath}\nNode Path: {Constant.NodePath}";
|
||||
return info;
|
||||
}
|
||||
public static string RuntimeInfo()
|
||||
{
|
||||
var info =
|
||||
$"""
|
||||
|
||||
Flow Launcher version: {Constant.Version}
|
||||
OS Version: {ExceptionFormatter.GetWindowsFullVersionFromRegistry()}
|
||||
IntPtr Length: {IntPtr.Size}
|
||||
x64: {Environment.Is64BitOperatingSystem}
|
||||
""";
|
||||
return info;
|
||||
}
|
||||
|
||||
public static string DependenciesInfo()
|
||||
{
|
||||
var info = $"""
|
||||
|
||||
Python Path: {Constant.PythonPath}
|
||||
Node Path: {Constant.NodePath}
|
||||
""";
|
||||
return info;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,97 +7,96 @@ using Flow.Launcher.Core.Resource;
|
|||
using System.Windows;
|
||||
using Flow.Launcher.ViewModel;
|
||||
|
||||
namespace Flow.Launcher.Helper
|
||||
namespace Flow.Launcher.Helper;
|
||||
|
||||
internal static class HotKeyMapper
|
||||
{
|
||||
internal static class HotKeyMapper
|
||||
private static Settings _settings;
|
||||
private static MainViewModel _mainViewModel;
|
||||
|
||||
internal static void Initialize(MainViewModel mainVM)
|
||||
{
|
||||
private static Settings settings;
|
||||
private static MainViewModel mainViewModel;
|
||||
_mainViewModel = mainVM;
|
||||
_settings = _mainViewModel.Settings;
|
||||
|
||||
internal static void Initialize(MainViewModel mainVM)
|
||||
SetHotkey(_settings.Hotkey, OnToggleHotkey);
|
||||
LoadCustomPluginHotkey();
|
||||
}
|
||||
|
||||
internal static void OnToggleHotkey(object sender, HotkeyEventArgs args)
|
||||
{
|
||||
if (!_mainViewModel.ShouldIgnoreHotkeys())
|
||||
_mainViewModel.ToggleFlowLauncher();
|
||||
}
|
||||
|
||||
private static void SetHotkey(string hotkeyStr, EventHandler<HotkeyEventArgs> action)
|
||||
{
|
||||
var hotkey = new HotkeyModel(hotkeyStr);
|
||||
SetHotkey(hotkey, action);
|
||||
}
|
||||
|
||||
internal static void SetHotkey(HotkeyModel hotkey, EventHandler<HotkeyEventArgs> action)
|
||||
{
|
||||
string hotkeyStr = hotkey.ToString();
|
||||
try
|
||||
{
|
||||
mainViewModel = mainVM;
|
||||
settings = mainViewModel.Settings;
|
||||
|
||||
SetHotkey(settings.Hotkey, OnToggleHotkey);
|
||||
LoadCustomPluginHotkey();
|
||||
HotkeyManager.Current.AddOrReplace(hotkeyStr, hotkey.CharKey, hotkey.ModifierKeys, action);
|
||||
}
|
||||
|
||||
internal static void OnToggleHotkey(object sender, HotkeyEventArgs args)
|
||||
catch (Exception)
|
||||
{
|
||||
if (!mainViewModel.ShouldIgnoreHotkeys())
|
||||
mainViewModel.ToggleFlowLauncher();
|
||||
}
|
||||
|
||||
private static void SetHotkey(string hotkeyStr, EventHandler<HotkeyEventArgs> action)
|
||||
{
|
||||
var hotkey = new HotkeyModel(hotkeyStr);
|
||||
SetHotkey(hotkey, action);
|
||||
}
|
||||
|
||||
internal static void SetHotkey(HotkeyModel hotkey, EventHandler<HotkeyEventArgs> action)
|
||||
{
|
||||
string hotkeyStr = hotkey.ToString();
|
||||
try
|
||||
{
|
||||
HotkeyManager.Current.AddOrReplace(hotkeyStr, hotkey.CharKey, hotkey.ModifierKeys, action);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
string errorMsg = string.Format(InternationalizationManager.Instance.GetTranslation("registerHotkeyFailed"), hotkeyStr);
|
||||
string errorMsgTitle = InternationalizationManager.Instance.GetTranslation("MessageBoxTitle");
|
||||
MessageBox.Show(errorMsg,errorMsgTitle);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void RemoveHotkey(string hotkeyStr)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(hotkeyStr))
|
||||
{
|
||||
HotkeyManager.Current.Remove(hotkeyStr);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void LoadCustomPluginHotkey()
|
||||
{
|
||||
if (settings.CustomPluginHotkeys == null)
|
||||
return;
|
||||
|
||||
foreach (CustomPluginHotkey hotkey in settings.CustomPluginHotkeys)
|
||||
{
|
||||
SetCustomQueryHotkey(hotkey);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void SetCustomQueryHotkey(CustomPluginHotkey hotkey)
|
||||
{
|
||||
SetHotkey(hotkey.Hotkey, (s, e) =>
|
||||
{
|
||||
if (mainViewModel.ShouldIgnoreHotkeys())
|
||||
return;
|
||||
|
||||
mainViewModel.Show();
|
||||
mainViewModel.ChangeQueryText(hotkey.ActionKeyword, true);
|
||||
});
|
||||
}
|
||||
|
||||
internal static bool CheckAvailability(HotkeyModel currentHotkey)
|
||||
{
|
||||
try
|
||||
{
|
||||
HotkeyManager.Current.AddOrReplace("HotkeyAvailabilityTest", currentHotkey.CharKey, currentHotkey.ModifierKeys, (sender, e) => { });
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
finally
|
||||
{
|
||||
HotkeyManager.Current.Remove("HotkeyAvailabilityTest");
|
||||
}
|
||||
|
||||
return false;
|
||||
string errorMsg = string.Format(InternationalizationManager.Instance.GetTranslation("registerHotkeyFailed"), hotkeyStr);
|
||||
string errorMsgTitle = InternationalizationManager.Instance.GetTranslation("MessageBoxTitle");
|
||||
MessageBox.Show(errorMsg,errorMsgTitle);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void RemoveHotkey(string hotkeyStr)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(hotkeyStr))
|
||||
{
|
||||
HotkeyManager.Current.Remove(hotkeyStr);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void LoadCustomPluginHotkey()
|
||||
{
|
||||
if (_settings.CustomPluginHotkeys == null)
|
||||
return;
|
||||
|
||||
foreach (CustomPluginHotkey hotkey in _settings.CustomPluginHotkeys)
|
||||
{
|
||||
SetCustomQueryHotkey(hotkey);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void SetCustomQueryHotkey(CustomPluginHotkey hotkey)
|
||||
{
|
||||
SetHotkey(hotkey.Hotkey, (s, e) =>
|
||||
{
|
||||
if (_mainViewModel.ShouldIgnoreHotkeys())
|
||||
return;
|
||||
|
||||
_mainViewModel.Show();
|
||||
_mainViewModel.ChangeQueryText(hotkey.ActionKeyword, true);
|
||||
});
|
||||
}
|
||||
|
||||
internal static bool CheckAvailability(HotkeyModel currentHotkey)
|
||||
{
|
||||
try
|
||||
{
|
||||
HotkeyManager.Current.AddOrReplace("HotkeyAvailabilityTest", currentHotkey.CharKey, currentHotkey.ModifierKeys, (sender, e) => { });
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
finally
|
||||
{
|
||||
HotkeyManager.Current.Remove("HotkeyAvailabilityTest");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,27 +2,26 @@
|
|||
using System.Linq;
|
||||
using System.Windows;
|
||||
|
||||
namespace Flow.Launcher.Helper
|
||||
{
|
||||
public static class SingletonWindowOpener
|
||||
{
|
||||
public static T Open<T>(params object[] args) where T : Window
|
||||
{
|
||||
var window = Application.Current.Windows.OfType<Window>().FirstOrDefault(x => x.GetType() == typeof(T))
|
||||
?? (T)Activator.CreateInstance(typeof(T), args);
|
||||
|
||||
// Fix UI bug
|
||||
// Add `window.WindowState = WindowState.Normal`
|
||||
// If only use `window.Show()`, Settings-window doesn't show when minimized in taskbar
|
||||
// Not sure why this works tho
|
||||
// Probably because, when `.Show()` fails, `window.WindowState == Minimized` (not `Normal`)
|
||||
// https://stackoverflow.com/a/59719760/4230390
|
||||
window.WindowState = WindowState.Normal;
|
||||
window.Show();
|
||||
|
||||
window.Focus();
|
||||
namespace Flow.Launcher.Helper;
|
||||
|
||||
return (T)window;
|
||||
}
|
||||
public static class SingletonWindowOpener
|
||||
{
|
||||
public static T Open<T>(params object[] args) where T : Window
|
||||
{
|
||||
var window = Application.Current.Windows.OfType<Window>().FirstOrDefault(x => x.GetType() == typeof(T))
|
||||
?? (T)Activator.CreateInstance(typeof(T), args);
|
||||
|
||||
// Fix UI bug
|
||||
// Add `window.WindowState = WindowState.Normal`
|
||||
// If only use `window.Show()`, Settings-window doesn't show when minimized in taskbar
|
||||
// Not sure why this works tho
|
||||
// Probably because, when `.Show()` fails, `window.WindowState == Minimized` (not `Normal`)
|
||||
// https://stackoverflow.com/a/59719760/4230390
|
||||
window.WindowState = WindowState.Normal;
|
||||
window.Show();
|
||||
|
||||
window.Focus();
|
||||
|
||||
return (T)window;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,24 +1,23 @@
|
|||
using System;
|
||||
|
||||
namespace Flow.Launcher.Helper
|
||||
{
|
||||
public static class SyntaxSugars
|
||||
{
|
||||
public static TResult CallOrRescueDefault<TResult>(Func<TResult> callback)
|
||||
{
|
||||
return CallOrRescueDefault(callback, default(TResult));
|
||||
}
|
||||
namespace Flow.Launcher.Helper;
|
||||
|
||||
public static TResult CallOrRescueDefault<TResult>(Func<TResult> callback, TResult def)
|
||||
public static class SyntaxSugars
|
||||
{
|
||||
public static TResult CallOrRescueDefault<TResult>(Func<TResult> callback)
|
||||
{
|
||||
return CallOrRescueDefault(callback, default(TResult));
|
||||
}
|
||||
|
||||
public static TResult CallOrRescueDefault<TResult>(Func<TResult> callback, TResult def)
|
||||
{
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
return callback();
|
||||
}
|
||||
catch
|
||||
{
|
||||
return def;
|
||||
}
|
||||
return callback();
|
||||
}
|
||||
catch
|
||||
{
|
||||
return def;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,44 +5,43 @@ using System.Text;
|
|||
using System.Windows.Media;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace Flow.Launcher.Helper
|
||||
namespace Flow.Launcher.Helper;
|
||||
|
||||
public static class WallpaperPathRetrieval
|
||||
{
|
||||
public static class WallpaperPathRetrieval
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
private static extern Int32 SystemParametersInfo(UInt32 action,
|
||||
Int32 uParam, StringBuilder vParam, UInt32 winIni);
|
||||
private static readonly UInt32 SPI_GETDESKWALLPAPER = 0x73;
|
||||
private static int MAX_PATH = 260;
|
||||
|
||||
public static string GetWallpaperPath()
|
||||
{
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
private static extern Int32 SystemParametersInfo(UInt32 action,
|
||||
Int32 uParam, StringBuilder vParam, UInt32 winIni);
|
||||
private static readonly UInt32 SPI_GETDESKWALLPAPER = 0x73;
|
||||
private static int MAX_PATH = 260;
|
||||
var wallpaper = new StringBuilder(MAX_PATH);
|
||||
SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, wallpaper, 0);
|
||||
|
||||
public static string GetWallpaperPath()
|
||||
var str = wallpaper.ToString();
|
||||
if (string.IsNullOrEmpty(str))
|
||||
return null;
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
public static Color GetWallpaperColor()
|
||||
{
|
||||
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Colors", true);
|
||||
var result = key?.GetValue("Background", null);
|
||||
if (result is string strResult)
|
||||
{
|
||||
var wallpaper = new StringBuilder(MAX_PATH);
|
||||
SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, wallpaper, 0);
|
||||
|
||||
var str = wallpaper.ToString();
|
||||
if (string.IsNullOrEmpty(str))
|
||||
return null;
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
public static Color GetWallpaperColor()
|
||||
{
|
||||
RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Colors", true);
|
||||
var result = key.GetValue(@"Background", null);
|
||||
if (result != null && result is string)
|
||||
try
|
||||
{
|
||||
var parts = strResult.Trim().Split(new[] {' '}, 3).Select(byte.Parse).ToList();
|
||||
return Color.FromRgb(parts[0], parts[1], parts[2]);
|
||||
}
|
||||
catch
|
||||
{
|
||||
try
|
||||
{
|
||||
var parts = result.ToString().Trim().Split(new[] {' '}, 3).Select(byte.Parse).ToList();
|
||||
return Color.FromRgb(parts[0], parts[1], parts[2]);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
return Colors.Transparent;
|
||||
}
|
||||
return Colors.Transparent;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,156 +8,152 @@ using System.Windows.Interop;
|
|||
using System.Windows.Media;
|
||||
using Point = System.Windows.Point;
|
||||
|
||||
namespace Flow.Launcher.Helper
|
||||
namespace Flow.Launcher.Helper;
|
||||
|
||||
public class WindowsInteropHelper
|
||||
{
|
||||
public class WindowsInteropHelper
|
||||
private const int GWL_STYLE = -16; //WPF's Message code for Title Bar's Style
|
||||
private const int WS_SYSMENU = 0x80000; //WPF's Message code for System Menu
|
||||
private static IntPtr _hwnd_shell;
|
||||
private static IntPtr _hwnd_desktop;
|
||||
|
||||
//Accessors for shell and desktop handlers
|
||||
//Will set the variables once and then will return them
|
||||
private static IntPtr HWND_SHELL
|
||||
{
|
||||
private const int GWL_STYLE = -16; //WPF's Message code for Title Bar's Style
|
||||
private const int WS_SYSMENU = 0x80000; //WPF's Message code for System Menu
|
||||
private static IntPtr _hwnd_shell;
|
||||
private static IntPtr _hwnd_desktop;
|
||||
|
||||
//Accessors for shell and desktop handlers
|
||||
//Will set the variables once and then will return them
|
||||
private static IntPtr HWND_SHELL
|
||||
get
|
||||
{
|
||||
get
|
||||
{
|
||||
return _hwnd_shell != IntPtr.Zero ? _hwnd_shell : _hwnd_shell = GetShellWindow();
|
||||
}
|
||||
return _hwnd_shell != IntPtr.Zero ? _hwnd_shell : _hwnd_shell = GetShellWindow();
|
||||
}
|
||||
private static IntPtr HWND_DESKTOP
|
||||
}
|
||||
private static IntPtr HWND_DESKTOP
|
||||
{
|
||||
get
|
||||
{
|
||||
get
|
||||
{
|
||||
return _hwnd_desktop != IntPtr.Zero ? _hwnd_desktop : _hwnd_desktop = GetDesktopWindow();
|
||||
}
|
||||
return _hwnd_desktop != IntPtr.Zero ? _hwnd_desktop : _hwnd_desktop = GetDesktopWindow();
|
||||
}
|
||||
}
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
internal static extern int GetWindowLong(IntPtr hWnd, int nIndex);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
internal static extern int GetWindowLong(IntPtr hWnd, int nIndex);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
internal static extern IntPtr GetForegroundWindow();
|
||||
[DllImport("user32.dll")]
|
||||
internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
internal static extern IntPtr GetDesktopWindow();
|
||||
[DllImport("user32.dll")]
|
||||
internal static extern IntPtr GetForegroundWindow();
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
internal static extern IntPtr GetShellWindow();
|
||||
[DllImport("user32.dll")]
|
||||
internal static extern IntPtr GetDesktopWindow();
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
internal static extern int GetWindowRect(IntPtr hwnd, out RECT rc);
|
||||
[DllImport("user32.dll")]
|
||||
internal static extern IntPtr GetShellWindow();
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
||||
internal static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
internal static extern int GetWindowRect(IntPtr hwnd, out RECT rc);
|
||||
|
||||
[DllImport("user32.DLL")]
|
||||
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
||||
internal static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
|
||||
|
||||
[DllImport("user32.DLL")]
|
||||
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
|
||||
|
||||
|
||||
const string WINDOW_CLASS_CONSOLE = "ConsoleWindowClass";
|
||||
const string WINDOW_CLASS_WINTAB = "Flip3D";
|
||||
const string WINDOW_CLASS_PROGMAN = "Progman";
|
||||
const string WINDOW_CLASS_WORKERW = "WorkerW";
|
||||
const string WINDOW_CLASS_CONSOLE = "ConsoleWindowClass";
|
||||
const string WINDOW_CLASS_WINTAB = "Flip3D";
|
||||
const string WINDOW_CLASS_PROGMAN = "Progman";
|
||||
const string WINDOW_CLASS_WORKERW = "WorkerW";
|
||||
|
||||
public static bool IsWindowFullscreen()
|
||||
public static bool IsWindowFullscreen()
|
||||
{
|
||||
//get current active window
|
||||
IntPtr hWnd = GetForegroundWindow();
|
||||
|
||||
if (hWnd.Equals(IntPtr.Zero))
|
||||
{
|
||||
//get current active window
|
||||
IntPtr hWnd = GetForegroundWindow();
|
||||
|
||||
if (!hWnd.Equals(IntPtr.Zero))
|
||||
{
|
||||
//if current active window is NOT desktop or shell
|
||||
if (!(hWnd.Equals(HWND_DESKTOP) || hWnd.Equals(HWND_SHELL)))
|
||||
{
|
||||
StringBuilder sb = new StringBuilder(256);
|
||||
GetClassName(hWnd, sb, sb.Capacity);
|
||||
string windowClass = sb.ToString();
|
||||
|
||||
//for Win+Tab (Flip3D)
|
||||
if (windowClass == WINDOW_CLASS_WINTAB)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
RECT appBounds;
|
||||
GetWindowRect(hWnd, out appBounds);
|
||||
|
||||
//for console (ConsoleWindowClass), we have to check for negative dimensions
|
||||
if (windowClass == WINDOW_CLASS_CONSOLE)
|
||||
{
|
||||
return appBounds.Top < 0 && appBounds.Bottom < 0;
|
||||
}
|
||||
|
||||
//for desktop (Progman or WorkerW, depends on the system), we have to check
|
||||
if (windowClass == WINDOW_CLASS_PROGMAN || windowClass == WINDOW_CLASS_WORKERW)
|
||||
{
|
||||
IntPtr hWndDesktop = FindWindowEx(hWnd, IntPtr.Zero, "SHELLDLL_DefView", null);
|
||||
hWndDesktop = FindWindowEx(hWndDesktop, IntPtr.Zero, "SysListView32", "FolderView");
|
||||
if (!hWndDesktop.Equals(IntPtr.Zero))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle screenBounds = Screen.FromHandle(hWnd).Bounds;
|
||||
if ((appBounds.Bottom - appBounds.Top) == screenBounds.Height && (appBounds.Right - appBounds.Left) == screenBounds.Width)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// disable windows toolbar's control box
|
||||
/// this will also disable system menu with Alt+Space hotkey
|
||||
/// </summary>
|
||||
public static void DisableControlBox(Window win)
|
||||
//if current active window is desktop or shell, exit early
|
||||
if (hWnd.Equals(HWND_DESKTOP) || hWnd.Equals(HWND_SHELL))
|
||||
{
|
||||
var hwnd = new WindowInteropHelper(win).Handle;
|
||||
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Transforms pixels to Device Independent Pixels used by WPF
|
||||
/// </summary>
|
||||
/// <param name="visual">current window, required to get presentation source</param>
|
||||
/// <param name="unitX">horizontal position in pixels</param>
|
||||
/// <param name="unitY">vertical position in pixels</param>
|
||||
/// <returns>point containing device independent pixels</returns>
|
||||
public static Point TransformPixelsToDIP(Visual visual, double unitX, double unitY)
|
||||
StringBuilder sb = new StringBuilder(256);
|
||||
GetClassName(hWnd, sb, sb.Capacity);
|
||||
string windowClass = sb.ToString();
|
||||
|
||||
//for Win+Tab (Flip3D)
|
||||
if (windowClass == WINDOW_CLASS_WINTAB)
|
||||
{
|
||||
Matrix matrix;
|
||||
var source = PresentationSource.FromVisual(visual);
|
||||
if (source != null)
|
||||
return false;
|
||||
}
|
||||
|
||||
RECT appBounds;
|
||||
GetWindowRect(hWnd, out appBounds);
|
||||
|
||||
//for console (ConsoleWindowClass), we have to check for negative dimensions
|
||||
if (windowClass == WINDOW_CLASS_CONSOLE)
|
||||
{
|
||||
return appBounds.Top < 0 && appBounds.Bottom < 0;
|
||||
}
|
||||
|
||||
//for desktop (Progman or WorkerW, depends on the system), we have to check
|
||||
if (windowClass is WINDOW_CLASS_PROGMAN or WINDOW_CLASS_WORKERW)
|
||||
{
|
||||
IntPtr hWndDesktop = FindWindowEx(hWnd, IntPtr.Zero, "SHELLDLL_DefView", null);
|
||||
hWndDesktop = FindWindowEx(hWndDesktop, IntPtr.Zero, "SysListView32", "FolderView");
|
||||
if (!hWndDesktop.Equals(IntPtr.Zero))
|
||||
{
|
||||
matrix = source.CompositionTarget.TransformFromDevice;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
using (var src = new HwndSource(new HwndSourceParameters()))
|
||||
{
|
||||
matrix = src.CompositionTarget.TransformFromDevice;
|
||||
}
|
||||
}
|
||||
return new Point((int)(matrix.M11 * unitX), (int)(matrix.M22 * unitY));
|
||||
}
|
||||
|
||||
Rectangle screenBounds = Screen.FromHandle(hWnd).Bounds;
|
||||
return (appBounds.Bottom - appBounds.Top) == screenBounds.Height && (appBounds.Right - appBounds.Left) == screenBounds.Width;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct RECT
|
||||
/// <summary>
|
||||
/// disable windows toolbar's control box
|
||||
/// this will also disable system menu with Alt+Space hotkey
|
||||
/// </summary>
|
||||
public static void DisableControlBox(Window win)
|
||||
{
|
||||
var hwnd = new WindowInteropHelper(win).Handle;
|
||||
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Transforms pixels to Device Independent Pixels used by WPF
|
||||
/// </summary>
|
||||
/// <param name="visual">current window, required to get presentation source</param>
|
||||
/// <param name="unitX">horizontal position in pixels</param>
|
||||
/// <param name="unitY">vertical position in pixels</param>
|
||||
/// <returns>point containing device independent pixels</returns>
|
||||
public static Point TransformPixelsToDIP(Visual visual, double unitX, double unitY)
|
||||
{
|
||||
Matrix matrix;
|
||||
var source = PresentationSource.FromVisual(visual);
|
||||
if (source is not null)
|
||||
{
|
||||
public int Left;
|
||||
public int Top;
|
||||
public int Right;
|
||||
public int Bottom;
|
||||
matrix = source.CompositionTarget.TransformFromDevice;
|
||||
}
|
||||
else
|
||||
{
|
||||
using var src = new HwndSource(new HwndSourceParameters());
|
||||
matrix = src.CompositionTarget.TransformFromDevice;
|
||||
}
|
||||
return new Point((int)(matrix.M11 * unitX), (int)(matrix.M22 * unitY));
|
||||
}
|
||||
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct RECT
|
||||
{
|
||||
public int Left;
|
||||
public int Top;
|
||||
public int Right;
|
||||
public int Bottom;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Dark</system:String>
|
||||
<system:String x:Key="SoundEffect">Sound Effect</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animation</system:String>
|
||||
<system:String x:Key="AnimationTip">Use Animation in UI</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Tmavý</system:String>
|
||||
<system:String x:Key="SoundEffect">Zvukový efekt</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Přehrát krátký zvuk při otevření okna vyhledávání</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animace</system:String>
|
||||
<system:String x:Key="AnimationTip">Použít animaci v UI</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Rychlost animace</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Dark</system:String>
|
||||
<system:String x:Key="SoundEffect">Sound Effect</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animation</system:String>
|
||||
<system:String x:Key="AnimationTip">Use Animation in UI</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Dunkel</system:String>
|
||||
<system:String x:Key="SoundEffect">Soundeffekt</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Ton abspielen, wenn das Suchfenster geöffnet wird</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animation</system:String>
|
||||
<system:String x:Key="AnimationTip">Animationen in der Oberfläche verwenden</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
|
|||
|
|
@ -156,6 +156,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Dark</system:String>
|
||||
<system:String x:Key="SoundEffect">Sound Effect</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animation</system:String>
|
||||
<system:String x:Key="AnimationTip">Use Animation in UI</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Oscuro</system:String>
|
||||
<system:String x:Key="SoundEffect">Efectos de Sonido</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Reproducir un sonido al abrir la ventana de búsqueda</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animación</system:String>
|
||||
<system:String x:Key="AnimationTip">Usar Animación en la Interfaz</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@
|
|||
<system:String x:Key="LastQuerySelected">Seleccionar la última consulta</system:String>
|
||||
<system:String x:Key="LastQueryEmpty">Limpiar la última consulta</system:String>
|
||||
<system:String x:Key="maxShowResults">Número máximo de resultados mostrados</system:String>
|
||||
<system:String x:Key="maxShowResultsToolTip">También puede ajustarlo rápidamente usando CTRL+Más y CTRL+Menos.</system:String>
|
||||
<system:String x:Key="maxShowResultsToolTip">También puede ajustarse rápidamente usando Ctrl+Más y Ctrl+Menos.</system:String>
|
||||
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignorar atajos de teclado en modo pantalla completa</system:String>
|
||||
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">No permite activar Flow Launcher con aplicaciones a pantalla completa (Recomendado para juegos).</system:String>
|
||||
<system:String x:Key="defaultFileManager">Administrador de archivos predeterminado</system:String>
|
||||
|
|
@ -73,13 +73,13 @@
|
|||
<system:String x:Key="hideOnStartup">Ocultar Flow Launcher al inicio</system:String>
|
||||
<system:String x:Key="hideNotifyIcon">Ocultar icono en la bandeja del sistema</system:String>
|
||||
<system:String x:Key="hideNotifyIconToolTip">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.</system:String>
|
||||
<system:String x:Key="querySearchPrecision">Precisión en la búsqueda de consultas</system:String>
|
||||
<system:String x:Key="querySearchPrecision">Precisión de búsqueda en consultas</system:String>
|
||||
<system:String x:Key="querySearchPrecisionToolTip">Cambia la puntuación mínima requerida para la coincidencia de los resultados.</system:String>
|
||||
<system:String x:Key="ShouldUsePinyin">Buscar con Pinyin</system:String>
|
||||
<system:String x:Key="ShouldUsePinyinToolTip">Permite utilizar Pinyin para la búsqueda. Pinyin es el sistema estándar de ortografía romanizado para traducir chino.</system:String>
|
||||
<system:String x:Key="AlwaysPreview">Mostrar siempre vista previa</system:String>
|
||||
<system:String x:Key="AlwaysPreviewToolTip">Muestra siempre el panel de vista previa al iniciar Flow. Pulse {0} para mostrar/ocultar la vista previa.</system:String>
|
||||
<system:String x:Key="shadowEffectNotAllowed">El efecto de sombra no está permitido mientras el tema actual tenga el efecto de desenfoque activado</system:String>
|
||||
<system:String x:Key="shadowEffectNotAllowed">El efecto de sombra no está permitido si el tema actual tiene activado el efecto de desenfoque</system:String>
|
||||
|
||||
<!-- Setting Plugin -->
|
||||
<system:String x:Key="searchplugin">Buscar complemento</system:String>
|
||||
|
|
@ -154,8 +154,10 @@
|
|||
<system:String x:Key="ColorSchemeDark">Oscuro</system:String>
|
||||
<system:String x:Key="SoundEffect">Efecto de sonido</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Reproduce un pequeño sonido cuando se abre el cuadro de búsqueda</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Volumen del efecto de sonido</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Ajusta el volumen del efecto de sonido</system:String>
|
||||
<system:String x:Key="Animation">Animación</system:String>
|
||||
<system:String x:Key="AnimationTip">Usar animación en la Interfaz de Usuario</system:String>
|
||||
<system:String x:Key="AnimationTip">Usa animación en la Interfaz de Usuario</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Velocidad de animación</system:String>
|
||||
<system:String x:Key="AnimationSpeedTip">Velocidad de animación de la interfaz de usuario</system:String>
|
||||
<system:String x:Key="AnimationSpeedSlow">Lenta</system:String>
|
||||
|
|
@ -170,7 +172,7 @@
|
|||
<system:String x:Key="hotkeys">Atajos de teclado</system:String>
|
||||
<system:String x:Key="flowlauncherHotkey">Atajo de teclado de Flow Launcher</system:String>
|
||||
<system:String x:Key="flowlauncherHotkeyToolTip">Introduzca el atajo de teclado para mostrar/ocultar Flow Launcher.</system:String>
|
||||
<system:String x:Key="previewHotkey">Atajo de teclado para vista previa</system:String>
|
||||
<system:String x:Key="previewHotkey">Acceso directo para vista previa</system:String>
|
||||
<system:String x:Key="previewHotkeyToolTip">Introduzca el acceso directo para mostrar/ocultar la vista previa en la ventana de búsqueda.</system:String>
|
||||
<system:String x:Key="openResultModifiers">Tecla modificadora para abrir resultado</system:String>
|
||||
<system:String x:Key="openResultModifiersToolTip">Seleccione una tecla modificadora para abrir el resultado seleccionado con el teclado.</system:String>
|
||||
|
|
@ -194,7 +196,7 @@
|
|||
<system:String x:Key="queryWindowShadowEffect">Efecto de sombra de la ventana de consultas</system:String>
|
||||
<system:String x:Key="shadowEffectCPUUsage">El efecto de sombra hace un uso sustancial de la GPU. No se recomienda para ordenadores de rendimiento limitado.</system:String>
|
||||
<system:String x:Key="windowWidthSize">Tamaño del ancho de la ventana</system:String>
|
||||
<system:String x:Key="windowWidthSizeToolTip">También puede ajustarlo rápidamente usando Ctrl+[y Ctrl+].</system:String>
|
||||
<system:String x:Key="windowWidthSizeToolTip">También puede ajustarse rápidamente usando Ctrl+[ y Ctrl+].</system:String>
|
||||
<system:String x:Key="useGlyphUI">Usar iconos Segoe Fluent</system:String>
|
||||
<system:String x:Key="useGlyphUIEffect">Usa iconos Segoe Fluent para los resultados de la consulta cuando sean compatibles</system:String>
|
||||
<system:String x:Key="flowlauncherPressHotkey">Pulsar Tecla</system:String>
|
||||
|
|
@ -296,7 +298,7 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci
|
|||
<system:String x:Key="emptyShortcut">El acceso directo y/o su expansión están vacíos.</system:String>
|
||||
|
||||
<!-- Hotkey Control -->
|
||||
<system:String x:Key="hotkeyUnavailable">Atajo de teclado no disponible</system:String>
|
||||
<system:String x:Key="hotkeyUnavailable">No disponible</system:String>
|
||||
|
||||
<!-- Crash Reporter -->
|
||||
<system:String x:Key="reportWindow_version">Versión</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Sombre</system:String>
|
||||
<system:String x:Key="SoundEffect">Effet Sonore</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Jouer un petit son lorsque la fenêtre de recherche s'ouvre</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Volume de l'effet sonore</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Ajuster le volume de l'effet sonore</system:String>
|
||||
<system:String x:Key="Animation">Animation</system:String>
|
||||
<system:String x:Key="AnimationTip">Utiliser l'animation dans l'interface</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Vitesse d'animation</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Scuro</system:String>
|
||||
<system:String x:Key="SoundEffect">Effetto sonoro</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Riproduce un piccolo suono all'apertura della finestra di ricerca</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animazione</system:String>
|
||||
<system:String x:Key="AnimationTip">Usa l'animazione nell'interfaccia utente</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Velocità di animazione</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Dark</system:String>
|
||||
<system:String x:Key="SoundEffect">Sound Effect</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animation</system:String>
|
||||
<system:String x:Key="AnimationTip">Use Animation in UI</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">어둡게</system:String>
|
||||
<system:String x:Key="SoundEffect">소리 효과</system:String>
|
||||
<system:String x:Key="SoundEffectTip">검색창을 열 때 작은 소리를 재생합니다.</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">애니메이션</system:String>
|
||||
<system:String x:Key="AnimationTip">일부 UI에 애니메이션을 사용합니다.</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Dark</system:String>
|
||||
<system:String x:Key="SoundEffect">Sound Effect</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animation</system:String>
|
||||
<system:String x:Key="AnimationTip">Use Animation in UI</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Donker</system:String>
|
||||
<system:String x:Key="SoundEffect">Geluidseffect</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Een klein geluid afspelen wanneer het zoekvenster wordt geopend</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animatie</system:String>
|
||||
<system:String x:Key="AnimationTip">Animatie gebruiken in UI</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
@ -182,7 +184,7 @@
|
|||
<system:String x:Key="customQuery">Query</system:String>
|
||||
<system:String x:Key="customShortcut">Shortcut</system:String>
|
||||
<system:String x:Key="customShortcutExpansion">Expansion</system:String>
|
||||
<system:String x:Key="builtinShortcutDescription">Description</system:String>
|
||||
<system:String x:Key="builtinShortcutDescription">Beschrijving</system:String>
|
||||
<system:String x:Key="delete">Verwijder</system:String>
|
||||
<system:String x:Key="edit">Bewerken</system:String>
|
||||
<system:String x:Key="add">Toevoegen</system:String>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0"?>
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
|
||||
<!-- MainWindow -->
|
||||
<system:String x:Key="registerHotkeyFailed">Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.</system:String>
|
||||
<system:String x:Key="registerHotkeyFailed">Nie udało się zarejestrować skrótu klawiszowego "{0}". Klucz skrótu może być używany przez inny program. Zmień skrót klawiszowy lub wyjdź z innego programu.</system:String>
|
||||
<system:String x:Key="MessageBoxTitle">Flow Launcher</system:String>
|
||||
<system:String x:Key="couldnotStartCmd">Nie udało się uruchomić: {0}</system:String>
|
||||
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Niepoprawny format pliku wtyczki</system:String>
|
||||
|
|
@ -21,11 +21,11 @@
|
|||
<system:String x:Key="selectAll">Zaznacz wszystko</system:String>
|
||||
<system:String x:Key="fileTitle">Plik</system:String>
|
||||
<system:String x:Key="folderTitle">Folder</system:String>
|
||||
<system:String x:Key="textTitle">Text</system:String>
|
||||
<system:String x:Key="textTitle">Tekst</system:String>
|
||||
<system:String x:Key="GameMode">Tryb grania</system:String>
|
||||
<system:String x:Key="GameModeToolTip">Wstrzymaj używanie skrótów.</system:String>
|
||||
<system:String x:Key="PositionReset">Position Reset</system:String>
|
||||
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
|
||||
<system:String x:Key="PositionReset">Resetowanie pozycji</system:String>
|
||||
<system:String x:Key="PositionResetToolTip">Zresetuj pozycję okna wyszukiwania</system:String>
|
||||
|
||||
<!-- Setting General -->
|
||||
<system:String x:Key="flowlauncher_settings">Ustawienia</system:String>
|
||||
|
|
@ -33,29 +33,29 @@
|
|||
<system:String x:Key="portableMode">Tryb przenośny</system:String>
|
||||
<system:String x:Key="portableModeToolTIp">Przechowuj wszystkie ustawienia i dane użytkownika w jednym folderze (Przydatne, gdy używane na dyskach wymiennych lub usługach chmurowych).</system:String>
|
||||
<system:String x:Key="startFlowLauncherOnSystemStartup">Uruchamiaj Flow Launcher przy starcie systemu</system:String>
|
||||
<system:String x:Key="setAutoStartFailed">Error setting launch on startup</system:String>
|
||||
<system:String x:Key="setAutoStartFailed">Błąd uruchamiania ustawień przy starcie</system:String>
|
||||
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Ukryj okno Flow Launcher kiedy przestanie ono być aktywne</system:String>
|
||||
<system:String x:Key="dontPromptUpdateMsg">Nie pokazuj powiadomienia o nowej wersji</system:String>
|
||||
<system:String x:Key="SearchWindowPosition">Search Window Position</system:String>
|
||||
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String>
|
||||
<system:String x:Key="SearchWindowScreenCursor">Monitor with Mouse Cursor</system:String>
|
||||
<system:String x:Key="SearchWindowScreenFocus">Monitor with Focused Window</system:String>
|
||||
<system:String x:Key="SearchWindowScreenPrimary">Primary Monitor</system:String>
|
||||
<system:String x:Key="SearchWindowScreenCustom">Custom Monitor</system:String>
|
||||
<system:String x:Key="SearchWindowAlign">Search Window Position on Monitor</system:String>
|
||||
<system:String x:Key="SearchWindowAlignCenter">Center</system:String>
|
||||
<system:String x:Key="SearchWindowAlignCenterTop">Center Top</system:String>
|
||||
<system:String x:Key="SearchWindowAlignLeftTop">Left Top</system:String>
|
||||
<system:String x:Key="SearchWindowAlignRightTop">Right Top</system:String>
|
||||
<system:String x:Key="SearchWindowAlignCustom">Custom Position</system:String>
|
||||
<system:String x:Key="SearchWindowPosition">Pozycja Okna Wyszukiwania</system:String>
|
||||
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Zapamiętaj Ostatnią Pozycję</system:String>
|
||||
<system:String x:Key="SearchWindowScreenCursor">Monitoruj kursorem myszy</system:String>
|
||||
<system:String x:Key="SearchWindowScreenFocus">Monitor z Dostosowanym Oknem</system:String>
|
||||
<system:String x:Key="SearchWindowScreenPrimary">Monitor główny</system:String>
|
||||
<system:String x:Key="SearchWindowScreenCustom">Monitor Niestandardowy </system:String>
|
||||
<system:String x:Key="SearchWindowAlign">Pozycja Okna Wyszukiwania na Monitorze</system:String>
|
||||
<system:String x:Key="SearchWindowAlignCenter">Wyśrodkowane</system:String>
|
||||
<system:String x:Key="SearchWindowAlignCenterTop">Środek Góra</system:String>
|
||||
<system:String x:Key="SearchWindowAlignLeftTop">Lewa Góra</system:String>
|
||||
<system:String x:Key="SearchWindowAlignRightTop">Prawa Góra</system:String>
|
||||
<system:String x:Key="SearchWindowAlignCustom">Pozycja niestandardowa</system:String>
|
||||
<system:String x:Key="language">Język</system:String>
|
||||
<system:String x:Key="lastQueryMode">Last Query Style</system:String>
|
||||
<system:String x:Key="lastQueryModeToolTip">Show/Hide previous results when Flow Launcher is reactivated.</system:String>
|
||||
<system:String x:Key="LastQueryPreserved">Preserve Last Query</system:String>
|
||||
<system:String x:Key="LastQuerySelected">Select last Query</system:String>
|
||||
<system:String x:Key="LastQueryEmpty">Empty last Query</system:String>
|
||||
<system:String x:Key="lastQueryMode">Styl ostatniego zapytania</system:String>
|
||||
<system:String x:Key="lastQueryModeToolTip">Pokaż/Ukryj poprzednie wyniki, gdy Flow Launcher jest ponownie aktywowany.</system:String>
|
||||
<system:String x:Key="LastQueryPreserved">Zachowaj ostatnie zapytanie</system:String>
|
||||
<system:String x:Key="LastQuerySelected">Wybierz ostatnie zapytanie</system:String>
|
||||
<system:String x:Key="LastQueryEmpty">Puste ostatnie zapytanie</system:String>
|
||||
<system:String x:Key="maxShowResults">Maksymalna liczba wyników</system:String>
|
||||
<system:String x:Key="maxShowResultsToolTip">You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.</system:String>
|
||||
<system:String x:Key="maxShowResultsToolTip">Możesz to również szybko dostosować używając CTRL+Plus i CTRL+Minus.</system:String>
|
||||
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignoruj skróty klawiszowe w trybie pełnego ekranu</system:String>
|
||||
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Wyłącz aktywowanie Flow Launcher, gdy uruchomiona jest aplikacja pełnoekranowa (Zalecane dla gier).</system:String>
|
||||
<system:String x:Key="defaultFileManager">Domyślny menedżer plików</system:String>
|
||||
|
|
@ -63,45 +63,45 @@
|
|||
<system:String x:Key="defaultBrowser">Domyślna przeglądarka</system:String>
|
||||
<system:String x:Key="defaultBrowserToolTip">Ustawienie dla nowej karty, nowego okna i trybu prywatnego.</system:String>
|
||||
<system:String x:Key="pythonFilePath">Python Path</system:String>
|
||||
<system:String x:Key="nodeFilePath">Node.js Path</system:String>
|
||||
<system:String x:Key="selectNodeExecutable">Please select the Node.js executable</system:String>
|
||||
<system:String x:Key="selectPythonExecutable">Please select pythonw.exe</system:String>
|
||||
<system:String x:Key="typingStartEn">Always Start Typing in English Mode</system:String>
|
||||
<system:String x:Key="typingStartEnTooltip">Temporarily change your input method to English mode when activating Flow.</system:String>
|
||||
<system:String x:Key="nodeFilePath">Ścieżka Node.js</system:String>
|
||||
<system:String x:Key="selectNodeExecutable">Wybierz plik wykonywalny Node.js</system:String>
|
||||
<system:String x:Key="selectPythonExecutable">Wybierz pythonw.exe</system:String>
|
||||
<system:String x:Key="typingStartEn">Zawsze rozpoczynaj wpisywanie w trybie angielskim</system:String>
|
||||
<system:String x:Key="typingStartEnTooltip">Tymczasowo zmień metodę wprowadzania na tryb angielski podczas aktywacji Flow.</system:String>
|
||||
<system:String x:Key="autoUpdates">Automatyczne aktualizacje</system:String>
|
||||
<system:String x:Key="select">Wybierz</system:String>
|
||||
<system:String x:Key="hideOnStartup">Uruchamiaj Flow Launcher zminimalizowany</system:String>
|
||||
<system:String x:Key="hideNotifyIcon">Ukryj ikonę zasobnika</system:String>
|
||||
<system:String x:Key="hideNotifyIconToolTip">When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.</system:String>
|
||||
<system:String x:Key="querySearchPrecision">Query Search Precision</system:String>
|
||||
<system:String x:Key="querySearchPrecisionToolTip">Changes minimum match score required for results.</system:String>
|
||||
<system:String x:Key="ShouldUsePinyin">Search with Pinyin</system:String>
|
||||
<system:String x:Key="ShouldUsePinyinToolTip">Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.</system:String>
|
||||
<system:String x:Key="AlwaysPreview">Always Preview</system:String>
|
||||
<system:String x:Key="AlwaysPreviewToolTip">Always open preview panel when Flow activates. Press {0} to toggle preview.</system:String>
|
||||
<system:String x:Key="shadowEffectNotAllowed">Shadow effect is not allowed while current theme has blur effect enabled</system:String>
|
||||
<system:String x:Key="hideNotifyIconToolTip">Gdy ikona jest ukryta w zasobniku, menu Ustawienia można otworzyć, klikając prawym przyciskiem myszy okno wyszukiwania.</system:String>
|
||||
<system:String x:Key="querySearchPrecision">Precyzja wyszukiwania zapytań</system:String>
|
||||
<system:String x:Key="querySearchPrecisionToolTip">Zmienia minimalny wynik dopasowania wymagany do uzyskania wyników.</system:String>
|
||||
<system:String x:Key="ShouldUsePinyin">Szukaj z Pinyin</system:String>
|
||||
<system:String x:Key="ShouldUsePinyinToolTip">Umożliwia wyszukiwanie przy użyciu Pinyin. Pinyin to standardowy system pisowni zromanizowanej służący do tłumaczenia języka chińskiego.</system:String>
|
||||
<system:String x:Key="AlwaysPreview">Zawsze Podgląd</system:String>
|
||||
<system:String x:Key="AlwaysPreviewToolTip">Zawsze otwieraj panel podglądu, gdy aktywowany jest Flow. Naciśnij {0}, aby przełączyć podgląd.</system:String>
|
||||
<system:String x:Key="shadowEffectNotAllowed">Efekt cienia jest niedozwolony, gdy bieżący motyw ma włączony efekt rozmycia</system:String>
|
||||
|
||||
<!-- Setting Plugin -->
|
||||
<system:String x:Key="searchplugin">Szukaj wtyczek</system:String>
|
||||
<system:String x:Key="searchpluginToolTip">Ctrl+F aby wyszukać wtyczki</system:String>
|
||||
<system:String x:Key="searchplugin_Noresult_Title">No results found</system:String>
|
||||
<system:String x:Key="searchplugin_Noresult_Subtitle">Please try a different search.</system:String>
|
||||
<system:String x:Key="plugin">Plugin</system:String>
|
||||
<system:String x:Key="searchplugin_Noresult_Title">Nie znaleziono wyników</system:String>
|
||||
<system:String x:Key="searchplugin_Noresult_Subtitle">Spróbuj użyć innego wyszukiwania.</system:String>
|
||||
<system:String x:Key="plugin">Wtyczka</system:String>
|
||||
<system:String x:Key="plugins">Wtyczki</system:String>
|
||||
<system:String x:Key="browserMorePlugins">Znajdź więcej wtyczek</system:String>
|
||||
<system:String x:Key="enable">On</system:String>
|
||||
<system:String x:Key="enable">Włącz</system:String>
|
||||
<system:String x:Key="disable">Wyłącz</system:String>
|
||||
<system:String x:Key="actionKeywordsTitle">Action keyword Setting</system:String>
|
||||
<system:String x:Key="actionKeywordsTitle">Ustawienie akcji słowa kluczowego</system:String>
|
||||
<system:String x:Key="actionKeywords">Wyzwalacze</system:String>
|
||||
<system:String x:Key="currentActionKeywords">Current action keyword</system:String>
|
||||
<system:String x:Key="newActionKeyword">New action keyword</system:String>
|
||||
<system:String x:Key="actionKeywordsTooltip">Change Action Keywords</system:String>
|
||||
<system:String x:Key="currentPriority">Current Priority</system:String>
|
||||
<system:String x:Key="newPriority">New Priority</system:String>
|
||||
<system:String x:Key="priority">Priority</system:String>
|
||||
<system:String x:Key="priorityToolTip">Change Plugin Results Priority</system:String>
|
||||
<system:String x:Key="currentActionKeywords">Bieżące słowo kluczowe akcji</system:String>
|
||||
<system:String x:Key="newActionKeyword">Nowe słowo kluczowe akcji</system:String>
|
||||
<system:String x:Key="actionKeywordsTooltip">Zmień słowa kluczowe akcji</system:String>
|
||||
<system:String x:Key="currentPriority">Obecny Priorytet</system:String>
|
||||
<system:String x:Key="newPriority">Nowy Priorytet</system:String>
|
||||
<system:String x:Key="priority">Priorytet</system:String>
|
||||
<system:String x:Key="priorityToolTip">Zmień priorytet wyników wtyczki</system:String>
|
||||
<system:String x:Key="pluginDirectory">Folder wtyczki</system:String>
|
||||
<system:String x:Key="author">by</system:String>
|
||||
<system:String x:Key="author">wg</system:String>
|
||||
<system:String x:Key="plugin_init_time">Czas ładowania:</system:String>
|
||||
<system:String x:Key="plugin_query_time">Czas zapytania:</system:String>
|
||||
<system:String x:Key="plugin_query_version">Wersja</system:String>
|
||||
|
|
@ -111,67 +111,69 @@
|
|||
|
||||
<!-- Setting Plugin Store -->
|
||||
<system:String x:Key="pluginStore">Sklep z wtyczkami</system:String>
|
||||
<system:String x:Key="pluginStore_NewRelease">New Release</system:String>
|
||||
<system:String x:Key="pluginStore_RecentlyUpdated">Recently Updated</system:String>
|
||||
<system:String x:Key="pluginStore_NewRelease">Nowe wydanie</system:String>
|
||||
<system:String x:Key="pluginStore_RecentlyUpdated">Ostatnio zaktualizowano</system:String>
|
||||
<system:String x:Key="pluginStore_None">Wtyczki</system:String>
|
||||
<system:String x:Key="pluginStore_Installed">Installed</system:String>
|
||||
<system:String x:Key="refresh">Refresh</system:String>
|
||||
<system:String x:Key="installbtn">Install</system:String>
|
||||
<system:String x:Key="pluginStore_Installed">Zainstalowany</system:String>
|
||||
<system:String x:Key="refresh">Odśwież</system:String>
|
||||
<system:String x:Key="installbtn">Instalacja</system:String>
|
||||
<system:String x:Key="uninstallbtn">Odinstalowywanie</system:String>
|
||||
<system:String x:Key="updatebtn">Aktualizuj</system:String>
|
||||
<system:String x:Key="LabelInstalledToolTip">Plugin already installed</system:String>
|
||||
<system:String x:Key="LabelNew">New Version</system:String>
|
||||
<system:String x:Key="LabelNewToolTip">This plugin has been updated within the last 7 days</system:String>
|
||||
<system:String x:Key="LabelUpdateToolTip">New Update is Available</system:String>
|
||||
<system:String x:Key="LabelInstalledToolTip">Plugin już jest zainstalowany</system:String>
|
||||
<system:String x:Key="LabelNew">Nowa wersja</system:String>
|
||||
<system:String x:Key="LabelNewToolTip">Ta wtyczka została zaktualizowana w ciągu ostatnich 7 dni</system:String>
|
||||
<system:String x:Key="LabelUpdateToolTip">Dostępna jest nowa aktualizacja</system:String>
|
||||
|
||||
|
||||
|
||||
<!-- Setting Theme -->
|
||||
<system:String x:Key="theme">Skórka</system:String>
|
||||
<system:String x:Key="appearance">Appearance</system:String>
|
||||
<system:String x:Key="appearance">Wygląd</system:String>
|
||||
<system:String x:Key="browserMoreThemes">Znajdź więcej skórek</system:String>
|
||||
<system:String x:Key="howToCreateTheme">How to create a theme</system:String>
|
||||
<system:String x:Key="hiThere">Hi There</system:String>
|
||||
<system:String x:Key="howToCreateTheme">Jak utworzyć motyw</system:String>
|
||||
<system:String x:Key="hiThere">Cześć,</system:String>
|
||||
<system:String x:Key="SampleTitleExplorer">Explorer</system:String>
|
||||
<system:String x:Key="SampleSubTitleExplorer">Search for files, folders and file contents</system:String>
|
||||
<system:String x:Key="SampleTitleWebSearch">WebSearch</system:String>
|
||||
<system:String x:Key="SampleSubTitleWebSearch">Search the web with different search engine support</system:String>
|
||||
<system:String x:Key="SampleSubTitleExplorer">Wyszukiwanie plików, folderów i zawartości plików</system:String>
|
||||
<system:String x:Key="SampleTitleWebSearch">Wyszukiwarka internetowa</system:String>
|
||||
<system:String x:Key="SampleSubTitleWebSearch">Wyszukiwanie w Internecie z obsługą różnych wyszukiwarek</system:String>
|
||||
<system:String x:Key="SampleTitleProgram">Programy</system:String>
|
||||
<system:String x:Key="SampleSubTitleProgram">Launch programs as admin or a different user</system:String>
|
||||
<system:String x:Key="SampleTitleProcessKiller">ProcessKiller</system:String>
|
||||
<system:String x:Key="SampleSubTitleProcessKiller">Terminate unwanted processes</system:String>
|
||||
<system:String x:Key="SampleSubTitleProgram">Uruchamiaj programy jako administrator lub inny użytkownik</system:String>
|
||||
<system:String x:Key="SampleTitleProcessKiller">ZabijProces</system:String>
|
||||
<system:String x:Key="SampleSubTitleProcessKiller">Zakończ niechciane procesy</system:String>
|
||||
<system:String x:Key="queryBoxFont">Czcionka okna zapytania</system:String>
|
||||
<system:String x:Key="resultItemFont">Czcionka okna wyników</system:String>
|
||||
<system:String x:Key="windowMode">Tryb w oknie</system:String>
|
||||
<system:String x:Key="opacity">Przeźroczystość</system:String>
|
||||
<system:String x:Key="theme_load_failure_path_not_exists">Theme {0} not exists, fallback to default theme</system:String>
|
||||
<system:String x:Key="theme_load_failure_parse_error">Fail to load theme {0}, fallback to default theme</system:String>
|
||||
<system:String x:Key="ThemeFolder">Theme Folder</system:String>
|
||||
<system:String x:Key="OpenThemeFolder">Open Theme Folder</system:String>
|
||||
<system:String x:Key="ColorScheme">Color Scheme</system:String>
|
||||
<system:String x:Key="ColorSchemeSystem">System Default</system:String>
|
||||
<system:String x:Key="ColorSchemeLight">Light</system:String>
|
||||
<system:String x:Key="ColorSchemeDark">Dark</system:String>
|
||||
<system:String x:Key="SoundEffect">Sound Effect</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
|
||||
<system:String x:Key="Animation">Animation</system:String>
|
||||
<system:String x:Key="AnimationTip">Use Animation in UI</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
<system:String x:Key="AnimationSpeedTip">The speed of the UI animation</system:String>
|
||||
<system:String x:Key="AnimationSpeedSlow">Slow</system:String>
|
||||
<system:String x:Key="AnimationSpeedMedium">Medium</system:String>
|
||||
<system:String x:Key="AnimationSpeedFast">Fast</system:String>
|
||||
<system:String x:Key="AnimationSpeedCustom">Custom</system:String>
|
||||
<system:String x:Key="Clock">Clock</system:String>
|
||||
<system:String x:Key="Date">Date</system:String>
|
||||
<system:String x:Key="theme_load_failure_path_not_exists">Motyw {0} nie istnieje, powróć do domyślnego motywu</system:String>
|
||||
<system:String x:Key="theme_load_failure_parse_error">Nie można załadować motywu {0}, wróć do motywu domyślnego</system:String>
|
||||
<system:String x:Key="ThemeFolder">Folder Motywu</system:String>
|
||||
<system:String x:Key="OpenThemeFolder">Otwórz folder motywu</system:String>
|
||||
<system:String x:Key="ColorScheme">Schemat kolorów</system:String>
|
||||
<system:String x:Key="ColorSchemeSystem">Domyślne ustawienie systemowe</system:String>
|
||||
<system:String x:Key="ColorSchemeLight">Jasny</system:String>
|
||||
<system:String x:Key="ColorSchemeDark">Ciemny</system:String>
|
||||
<system:String x:Key="SoundEffect">Efekty dźwiękowe</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Odtwarzaj krótki dźwięk po otwarciu okna wyszukiwania</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animacja</system:String>
|
||||
<system:String x:Key="AnimationTip">Użyj animacji w interfejsie użytkownika</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Szybkość animacji</system:String>
|
||||
<system:String x:Key="AnimationSpeedTip">Szybkość animacji interfejsu użytkownika</system:String>
|
||||
<system:String x:Key="AnimationSpeedSlow">Wolna</system:String>
|
||||
<system:String x:Key="AnimationSpeedMedium">Średnia</system:String>
|
||||
<system:String x:Key="AnimationSpeedFast">Szybka</system:String>
|
||||
<system:String x:Key="AnimationSpeedCustom">Niestandardowa</system:String>
|
||||
<system:String x:Key="Clock">Zegar</system:String>
|
||||
<system:String x:Key="Date">Data</system:String>
|
||||
|
||||
<!-- Setting Hotkey -->
|
||||
<system:String x:Key="hotkey">Skrót klawiszowy</system:String>
|
||||
<system:String x:Key="hotkeys">Skrót klawiszowy</system:String>
|
||||
<system:String x:Key="flowlauncherHotkey">Skrót klawiszowy Flow Launcher</system:String>
|
||||
<system:String x:Key="flowlauncherHotkeyToolTip">Enter shortcut to show/hide Flow Launcher.</system:String>
|
||||
<system:String x:Key="previewHotkey">Preview Hotkey</system:String>
|
||||
<system:String x:Key="previewHotkeyToolTip">Enter shortcut to show/hide preview in search window.</system:String>
|
||||
<system:String x:Key="flowlauncherHotkeyToolTip">Wprowadź skrót, aby pokazać/ukryć Flow Launcher.</system:String>
|
||||
<system:String x:Key="previewHotkey">Podgląd skrótu</system:String>
|
||||
<system:String x:Key="previewHotkeyToolTip">Wprowadź skrót, aby pokazać/ukryć podgląd w oknie wyszukiwania.</system:String>
|
||||
<system:String x:Key="openResultModifiers">Modyfikatory klawiszów otwierających wyniki</system:String>
|
||||
<system:String x:Key="openResultModifiersToolTip">Select a modifier key to open selected result via keyboard.</system:String>
|
||||
<system:String x:Key="showOpenResultHotkey">Pokaż skrót klawiszowy</system:String>
|
||||
|
|
@ -243,27 +245,27 @@
|
|||
<!-- FileManager Setting Dialog -->
|
||||
<system:String x:Key="fileManagerWindow">Select File Manager</system:String>
|
||||
<system:String x:Key="fileManager_tips">Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".</system:String>
|
||||
<system:String x:Key="fileManager_tips2">"%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".</system:String>
|
||||
<system:String x:Key="fileManager_name">File Manager</system:String>
|
||||
<system:String x:Key="fileManager_profile_name">Profile Name</system:String>
|
||||
<system:String x:Key="fileManager_path">File Manager Path</system:String>
|
||||
<system:String x:Key="fileManager_directory_arg">Arg For Folder</system:String>
|
||||
<system:String x:Key="fileManager_file_arg">Arg For File</system:String>
|
||||
<system:String x:Key="fileManager_tips2">"%f" jest argumentem reprezentującym ścieżkę do pliku. Służy do podkreślenia nazwy pliku/folderu podczas otwierania określonej lokalizacji pliku w menedżerze plików innych firm. Ten argument jest dostępny tylko w pozycji "Arg dla pliku". Jeśli menedżer plików nie ma tej funkcji, możesz użyć "%d".</system:String>
|
||||
<system:String x:Key="fileManager_name">Menadżer plików</system:String>
|
||||
<system:String x:Key="fileManager_profile_name">Nazwa profilu</system:String>
|
||||
<system:String x:Key="fileManager_path">Ścieżka menedżera plików</system:String>
|
||||
<system:String x:Key="fileManager_directory_arg">Arg dla folderu</system:String>
|
||||
<system:String x:Key="fileManager_file_arg">Arg dla pliku</system:String>
|
||||
|
||||
<!-- DefaultBrowser Setting Dialog -->
|
||||
<system:String x:Key="defaultBrowserTitle">Domyślna przeglądarka</system:String>
|
||||
<system:String x:Key="defaultBrowser_tips">The default setting follows the OS default browser setting. If specified separately, flow uses that browser.</system:String>
|
||||
<system:String x:Key="defaultBrowser_name">Browser</system:String>
|
||||
<system:String x:Key="defaultBrowser_profile_name">Browser Name</system:String>
|
||||
<system:String x:Key="defaultBrowser_path">Browser Path</system:String>
|
||||
<system:String x:Key="defaultBrowser_newWindow">New Window</system:String>
|
||||
<system:String x:Key="defaultBrowser_newTab">New Tab</system:String>
|
||||
<system:String x:Key="defaultBrowser_parameter">Private Mode</system:String>
|
||||
<system:String x:Key="defaultBrowser_tips">Ustawienie domyślne jest zgodne z domyślnym ustawieniem przeglądarki systemu operacyjnego. Jeśli określono to oddzielnie, flow korzysta z tej przeglądarki.</system:String>
|
||||
<system:String x:Key="defaultBrowser_name">Przeglądarka</system:String>
|
||||
<system:String x:Key="defaultBrowser_profile_name">Nazwa przeglądarki</system:String>
|
||||
<system:String x:Key="defaultBrowser_path">Ścieżka przeglądarki</system:String>
|
||||
<system:String x:Key="defaultBrowser_newWindow">Nowe okno</system:String>
|
||||
<system:String x:Key="defaultBrowser_newTab">Nowa zakładka</system:String>
|
||||
<system:String x:Key="defaultBrowser_parameter">Tryb prywatny</system:String>
|
||||
|
||||
<!-- Priority Setting Dialog -->
|
||||
<system:String x:Key="changePriorityWindow">Change Priority</system:String>
|
||||
<system:String x:Key="priority_tips">Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number</system:String>
|
||||
<system:String x:Key="invalidPriority">Please provide an valid integer for Priority!</system:String>
|
||||
<system:String x:Key="changePriorityWindow">Zmień priorytet</system:String>
|
||||
<system:String x:Key="priority_tips">Im większa liczba, tym wyższa pozycja w rankingu. Spróbuj ustawić go jako 5. Jeśli chcesz, aby wyniki były niższe niż w przypadku jakiejkolwiek innej wtyczki, podaj liczbę ujemną</system:String>
|
||||
<system:String x:Key="invalidPriority">Podaj prawidłową liczbę całkowitą dla priorytetu!</system:String>
|
||||
|
||||
<!-- Action Keyword Setting Dialog -->
|
||||
<system:String x:Key="oldActionKeywords">Stary wyzwalacz</system:String>
|
||||
|
|
@ -274,26 +276,26 @@
|
|||
<system:String x:Key="newActionKeywordsCannotBeEmpty">Nowy wyzwalacz nie może być pusty</system:String>
|
||||
<system:String x:Key="newActionKeywordsHasBeenAssigned">Ten wyzwalacz został już przypisany do innej wtyczki, musisz podać inny wyzwalacz.</system:String>
|
||||
<system:String x:Key="success">Sukces</system:String>
|
||||
<system:String x:Key="completedSuccessfully">Completed successfully</system:String>
|
||||
<system:String x:Key="completedSuccessfully">Zakończono pomyślnie</system:String>
|
||||
<system:String x:Key="actionkeyword_tips">Użyj * jeżeli nie chcesz podawać wyzwalacza</system:String>
|
||||
|
||||
<!-- Custom Query Hotkey Dialog -->
|
||||
<system:String x:Key="customeQueryHotkeyTitle">Skrót klawiszowy niestandardowych zapyta</system:String>
|
||||
<system:String x:Key="customeQueryHotkeyTips">Press a custom hotkey to open Flow Launcher and input the specified query automatically.</system:String>
|
||||
<system:String x:Key="customeQueryHotkeyTips">Naciśnij niestandardowy klawisz skrótu, aby otworzyć Flow Launcher i automatycznie wprowadzić określone zapytanie.</system:String>
|
||||
<system:String x:Key="preview">Podgląd</system:String>
|
||||
<system:String x:Key="hotkeyIsNotUnavailable">Skrót klawiszowy jest niedostępny, musisz podać inny skrót klawiszowy</system:String>
|
||||
<system:String x:Key="invalidPluginHotkey">Niepoprawny skrót klawiszowy</system:String>
|
||||
<system:String x:Key="update">Aktualizuj</system:String>
|
||||
|
||||
<!-- Custom Query Shortcut Dialog -->
|
||||
<system:String x:Key="customeQueryShortcutTitle">Custom Query Shortcut</system:String>
|
||||
<system:String x:Key="customeQueryShortcutTips">Enter a shortcut that automatically expands to the specified query.</system:String>
|
||||
<system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">A shortcut is expanded when it exactly matches the query.
|
||||
<system:String x:Key="customeQueryShortcutTitle">Niestandardowy skrót zapytania</system:String>
|
||||
<system:String x:Key="customeQueryShortcutTips">Wprowadź skrót, który automatycznie rozszerzy się do określonego zapytania.</system:String>
|
||||
<system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">Skrót jest rozwijany, gdy dokładnie pasuje do zapytania.
|
||||
|
||||
If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query.
|
||||
Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do dowolnej pozycji w zapytaniu. Wbudowane skróty pasują do każdej pozycji w zapytaniu.
|
||||
</system:String>
|
||||
<system:String x:Key="duplicateShortcut">Shortcut already exists, please enter a new Shortcut or edit the existing one.</system:String>
|
||||
<system:String x:Key="emptyShortcut">Shortcut and/or its expansion is empty.</system:String>
|
||||
<system:String x:Key="duplicateShortcut">Skrót już istnieje, wprowadź nowy skrót lub edytuj istniejący.</system:String>
|
||||
<system:String x:Key="emptyShortcut">Skrót i/lub jego rozwinięcie jest puste.</system:String>
|
||||
|
||||
<!-- Hotkey Control -->
|
||||
<system:String x:Key="hotkeyUnavailable">Niepoprawny skrót klawiszowy</system:String>
|
||||
|
|
@ -315,51 +317,51 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
|
|||
<system:String x:Key="reportWindow_flowlauncher_got_an_error">W programie Flow Launcher wystąpił błąd</system:String>
|
||||
|
||||
<!-- General Notice -->
|
||||
<system:String x:Key="pleaseWait">Please wait...</system:String>
|
||||
<system:String x:Key="pleaseWait">Proszę czekać...</system:String>
|
||||
|
||||
<!-- Update -->
|
||||
<system:String x:Key="update_flowlauncher_update_check">Checking for new update</system:String>
|
||||
<system:String x:Key="update_flowlauncher_already_on_latest">You already have the latest Flow Launcher version</system:String>
|
||||
<system:String x:Key="update_flowlauncher_update_found">Update found</system:String>
|
||||
<system:String x:Key="update_flowlauncher_updating">Updating...</system:String>
|
||||
<system:String x:Key="update_flowlauncher_update_check">Sprawdzanie nowej aktualizacji</system:String>
|
||||
<system:String x:Key="update_flowlauncher_already_on_latest">Masz już najnowszą wersję Flow Launcher</system:String>
|
||||
<system:String x:Key="update_flowlauncher_update_found">Znaleziono aktualizację</system:String>
|
||||
<system:String x:Key="update_flowlauncher_updating">Aktualizacja...</system:String>
|
||||
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">
|
||||
Flow Launcher was not able to move your user profile data to the new update version.
|
||||
Please manually move your profile data folder from {0} to {1}
|
||||
Flow Launcher nie był w stanie przenieść danych profilu użytkownika do nowej wersji aktualizacji.
|
||||
Ręcznie przenieś folder danych profilu z {0} do {1}
|
||||
</system:String>
|
||||
<system:String x:Key="update_flowlauncher_new_update">New Update</system:String>
|
||||
<system:String x:Key="update_flowlauncher_new_update">Nowa aktualizacja</system:String>
|
||||
<system:String x:Key="update_flowlauncher_update_new_version_available">Nowa wersja Flow Launcher {0} jest dostępna</system:String>
|
||||
<system:String x:Key="update_flowlauncher_update_error">Wystąpił błąd podczas instalowania aktualizacji programu</system:String>
|
||||
<system:String x:Key="update_flowlauncher_update">Aktualizuj</system:String>
|
||||
<system:String x:Key="update_flowlauncher_update_cancel">Anuluj</system:String>
|
||||
<system:String x:Key="update_flowlauncher_fail">Update Failed</system:String>
|
||||
<system:String x:Key="update_flowlauncher_check_connection">Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.</system:String>
|
||||
<system:String x:Key="update_flowlauncher_fail">Aktualizacja nie powiodła się</system:String>
|
||||
<system:String x:Key="update_flowlauncher_check_connection">Sprawdź połączenie i spróbuj zaktualizować ustawienia proxy do github-cloud.s3.amazonaws.com.</system:String>
|
||||
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">Aby dokończyć proces aktualizacji Flow Launcher musi zostać zresetowany</system:String>
|
||||
<system:String x:Key="update_flowlauncher_update_update_files">Następujące pliki zostaną zaktualizowane</system:String>
|
||||
<system:String x:Key="update_flowlauncher_update_files">Aktualizuj pliki</system:String>
|
||||
<system:String x:Key="update_flowlauncher_update_update_description">Opis aktualizacji</system:String>
|
||||
|
||||
<!-- Welcome Window -->
|
||||
<system:String x:Key="Skip">Skip</system:String>
|
||||
<system:String x:Key="Welcome_Page1_Title">Welcome to Flow Launcher</system:String>
|
||||
<system:String x:Key="Welcome_Page1_Text01">Hello, this is the first time you are running Flow Launcher!</system:String>
|
||||
<system:String x:Key="Welcome_Page1_Text02">Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language</system:String>
|
||||
<system:String x:Key="Welcome_Page2_Title">Search and run all files and applications on your PC</system:String>
|
||||
<system:String x:Key="Welcome_Page2_Text01">Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.</system:String>
|
||||
<system:String x:Key="Welcome_Page2_Text02">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.</system:String>
|
||||
<system:String x:Key="Welcome_Page3_Title">Hotkeys</system:String>
|
||||
<system:String x:Key="Welcome_Page4_Title">Action Keyword and Commands</system:String>
|
||||
<system:String x:Key="Welcome_Page4_Text01">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.</system:String>
|
||||
<system:String x:Key="Welcome_Page5_Title">Let's Start Flow Launcher</system:String>
|
||||
<system:String x:Key="Welcome_Page5_Text01">Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)</system:String>
|
||||
<system:String x:Key="Skip">Pomiń</system:String>
|
||||
<system:String x:Key="Welcome_Page1_Title">Witamy w Flow Launcher</system:String>
|
||||
<system:String x:Key="Welcome_Page1_Text01">Witaj, po raz pierwszy uruchamiasz Flow Launcher!</system:String>
|
||||
<system:String x:Key="Welcome_Page1_Text02">Przed rozpoczęciem ten kreator pomoże skonfigurować Flow Launcher. Jeśli chcesz, możesz to pominąć. Proszę wybierz język</system:String>
|
||||
<system:String x:Key="Welcome_Page2_Title">Wyszukiwanie i uruchamianie wszystkich plików i aplikacji na PC</system:String>
|
||||
<system:String x:Key="Welcome_Page2_Text01">Przeszukuj wszystko, od aplikacji, plików, zakładek, YouTube, X i nie tylko. Wszystko to z komfortowej klawiatury, bez konieczności dotykania myszy.</system:String>
|
||||
<system:String x:Key="Welcome_Page2_Text02">Flow Launcher uruchamia się za pomocą poniższego skrótu klawiszowego, śmiało i wypróbuj go teraz. Aby to zmienić, kliknij dane wejściowe i naciśnij żądany klawisz skrótu na klawiaturze.</system:String>
|
||||
<system:String x:Key="Welcome_Page3_Title">Skróty klawiszowe</system:String>
|
||||
<system:String x:Key="Welcome_Page4_Title">Słowo kluczowe akcji i polecenia</system:String>
|
||||
<system:String x:Key="Welcome_Page4_Text01">Przeszukuj sieć, uruchamiaj aplikacje lub uruchamiaj różne funkcje za pomocą wtyczek Flow Launcher. Niektóre funkcje zaczynają się od słowa kluczowego akcji, a w razie potrzeby można ich używać bez słów kluczowych akcji. Wypróbuj poniższe zapytania w Flow Launcher.</system:String>
|
||||
<system:String x:Key="Welcome_Page5_Title">Uruchom Flow Launcher</system:String>
|
||||
<system:String x:Key="Welcome_Page5_Text01">Zakończono. Ciesz się Flow Launcher. Nie zapomnij o klawiszu skrótu, aby rozpocząć :)</system:String>
|
||||
|
||||
<!-- General Guide & Hotkey -->
|
||||
|
||||
<system:String x:Key="HotkeyUpDownDesc">Back / Context Menu</system:String>
|
||||
<system:String x:Key="HotkeyLeftRightDesc">Item Navigation</system:String>
|
||||
<system:String x:Key="HotkeyShiftEnterDesc">Open Context Menu</system:String>
|
||||
<system:String x:Key="HotkeyCtrlEnterDesc">Open Containing Folder</system:String>
|
||||
<system:String x:Key="HotkeyCtrlShiftEnterDesc">Run as Admin / Open Folder in Default File Manager</system:String>
|
||||
<system:String x:Key="HotkeyCtrlHDesc">Query History</system:String>
|
||||
<system:String x:Key="HotkeyUpDownDesc">Powrót / Menu kontekstowe</system:String>
|
||||
<system:String x:Key="HotkeyLeftRightDesc">Nawigacja pozycji</system:String>
|
||||
<system:String x:Key="HotkeyShiftEnterDesc">Otwórz menu kontekstowe</system:String>
|
||||
<system:String x:Key="HotkeyCtrlEnterDesc">Otwórz folder zawierający</system:String>
|
||||
<system:String x:Key="HotkeyCtrlShiftEnterDesc">Uruchom jako administrator / Otwórz folder w domyślnym menedżerze plików</system:String>
|
||||
<system:String x:Key="HotkeyCtrlHDesc">Historia zapytań</system:String>
|
||||
<system:String x:Key="HotkeyESCDesc">Back to Result in Context Menu</system:String>
|
||||
<system:String x:Key="HotkeyTabDesc">Autocomplete</system:String>
|
||||
<system:String x:Key="HotkeyRunDesc">Open / Run Selected Item</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Escuro</system:String>
|
||||
<system:String x:Key="SoundEffect">Efeito Sonoro</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Reproduzir um pequeno som ao abrir a janela de pesquisa</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animação</system:String>
|
||||
<system:String x:Key="AnimationTip">Utilizar Animação na Interface</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Velocidade de Animação</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Escuro</system:String>
|
||||
<system:String x:Key="SoundEffect">Efeitos sonoros</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Reproduzir um som ao abrir a janela de pesquisa</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Volume dos efeitos sonoros</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Ajustar volume dos efeitos sonoros</system:String>
|
||||
<system:String x:Key="Animation">Animação</system:String>
|
||||
<system:String x:Key="AnimationTip">Utilizar animações na aplicação</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Velocidade da animação</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Тёмная</system:String>
|
||||
<system:String x:Key="SoundEffect">Звуковой эффект</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Воспроизведение небольшого звука при открытии окна поиска</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Анимация</system:String>
|
||||
<system:String x:Key="AnimationTip">Использование анимации в меню</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Скорость анимации</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Tmavá</system:String>
|
||||
<system:String x:Key="SoundEffect">Zvukový efekt</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Po otvorení okna vyhľadávania prehrať krátky zvuk</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Hlasitosť zvukového efektu</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Upraviť hlasitosť zvukového efektu</system:String>
|
||||
<system:String x:Key="Animation">Animácia</system:String>
|
||||
<system:String x:Key="AnimationTip">Animovať používateľské rozhranie</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Rýchlosť animácie</system:String>
|
||||
|
|
@ -171,7 +173,7 @@
|
|||
<system:String x:Key="flowlauncherHotkey">Klávesová skratka pre Flow Launcher</system:String>
|
||||
<system:String x:Key="flowlauncherHotkeyToolTip">Zadajte skratku na zobrazenie/skrytie Flow Launchera.</system:String>
|
||||
<system:String x:Key="previewHotkey">Klávesová skratka pre náhľad</system:String>
|
||||
<system:String x:Key="previewHotkeyToolTip">Zadajte klávesovú skratku pre zobrazenie/skytie náhľadu vo vyhľadávacom okne.</system:String>
|
||||
<system:String x:Key="previewHotkeyToolTip">Zadajte klávesovú skratku pre zobrazenie/skrytie náhľadu vo vyhľadávacom okne.</system:String>
|
||||
<system:String x:Key="openResultModifiers">Modifikačný kláves na otvorenie výsledkov</system:String>
|
||||
<system:String x:Key="openResultModifiersToolTip">Vyberte modifikačný kláves na otvorenie vybraného výsledku pomocou klávesnice.</system:String>
|
||||
<system:String x:Key="showOpenResultHotkey">Zobraziť klávesovú skratku</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Dark</system:String>
|
||||
<system:String x:Key="SoundEffect">Sound Effect</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animation</system:String>
|
||||
<system:String x:Key="AnimationTip">Use Animation in UI</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Koyu</system:String>
|
||||
<system:String x:Key="SoundEffect">Ses Efekti</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Arama penceresi açıldığında küçük bir ses oynat</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">Animasyon</system:String>
|
||||
<system:String x:Key="AnimationTip">Arayüzde Animasyon Kullan</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">Темна</system:String>
|
||||
<system:String x:Key="SoundEffect">Звуковий ефект</system:String>
|
||||
<system:String x:Key="SoundEffectTip">Відтворювати невеликий звук при відкритті вікна пошуку</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Гучність звукового ефекту</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Налаштуйте гучність звукового ефекту</system:String>
|
||||
<system:String x:Key="Animation">Анімація</system:String>
|
||||
<system:String x:Key="AnimationTip">Використовувати анімацію в інтерфейсі</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Швидкість анімації</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">深色</system:String>
|
||||
<system:String x:Key="SoundEffect">音效</system:String>
|
||||
<system:String x:Key="SoundEffectTip">启用激活音效</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">音效音量</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">调整音效音量</system:String>
|
||||
<system:String x:Key="Animation">动画</system:String>
|
||||
<system:String x:Key="AnimationTip">启用动画</system:String>
|
||||
<system:String x:Key="AnimationSpeed">动画速度</system:String>
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@
|
|||
<system:String x:Key="ColorSchemeDark">暗色系</system:String>
|
||||
<system:String x:Key="SoundEffect">音效</system:String>
|
||||
<system:String x:Key="SoundEffectTip">搜尋窗口打開時播放音效</system:String>
|
||||
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
|
||||
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
|
||||
<system:String x:Key="Animation">動畫</system:String>
|
||||
<system:String x:Key="AnimationTip">使用介面動畫</system:String>
|
||||
<system:String x:Key="AnimationSpeed">Animation Speed</system:String>
|
||||
|
|
|
|||
|
|
@ -186,6 +186,10 @@
|
|||
Key="F12"
|
||||
Command="{Binding ToggleGameModeCommand}"
|
||||
Modifiers="Ctrl" />
|
||||
<KeyBinding
|
||||
Key="C"
|
||||
Modifiers="Ctrl+Shift"
|
||||
Command="{Binding CopyAlternativeCommand}" />
|
||||
<KeyBinding
|
||||
Key="{Binding PreviewHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
|
||||
Command="{Binding TogglePreviewCommand}"
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ using Key = System.Windows.Input.Key;
|
|||
using System.Media;
|
||||
using static Flow.Launcher.ViewModel.SettingWindowViewModel;
|
||||
using DataObject = System.Windows.DataObject;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace Flow.Launcher
|
||||
{
|
||||
|
|
@ -40,7 +41,7 @@ namespace Flow.Launcher
|
|||
private ContextMenu contextMenu;
|
||||
private MainViewModel _viewModel;
|
||||
private bool _animating;
|
||||
SoundPlayer animationSound = new SoundPlayer(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav");
|
||||
MediaPlayer animationSound = new MediaPlayer();
|
||||
|
||||
#endregion
|
||||
|
||||
|
|
@ -52,6 +53,9 @@ namespace Flow.Launcher
|
|||
|
||||
InitializeComponent();
|
||||
InitializePosition();
|
||||
|
||||
animationSound.Open(new Uri(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav"));
|
||||
|
||||
DataObject.AddPastingHandler(QueryTextBox, OnPaste);
|
||||
}
|
||||
|
||||
|
|
@ -128,6 +132,8 @@ namespace Flow.Launcher
|
|||
{
|
||||
if (_settings.UseSound)
|
||||
{
|
||||
animationSound.Position = TimeSpan.Zero;
|
||||
animationSound.Volume = _settings.SoundVolume / 100.0;
|
||||
animationSound.Play();
|
||||
}
|
||||
UpdatePosition();
|
||||
|
|
|
|||
|
|
@ -315,6 +315,8 @@ namespace Flow.Launcher
|
|||
public void RegisterGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback) => _globalKeyboardHandlers.Add(callback);
|
||||
public void RemoveGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback) => _globalKeyboardHandlers.Remove(callback);
|
||||
|
||||
public void ReQuery(bool reselect = true) => _mainVM.ReQuery(reselect);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private Methods
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,4 +1,4 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
|
@ -137,6 +137,8 @@ namespace Flow.Launcher
|
|||
|
||||
isDragging = false;
|
||||
|
||||
App.API.HideMainWindow();
|
||||
|
||||
var data = new DataObject(DataFormats.FileDrop, new[]
|
||||
{
|
||||
path
|
||||
|
|
|
|||
|
|
@ -2474,27 +2474,81 @@
|
|||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
|
||||
<Border
|
||||
Margin="0"
|
||||
BorderThickness="0"
|
||||
Margin="0,12,0,12"
|
||||
Padding="0"
|
||||
CornerRadius="5"
|
||||
Style="{DynamicResource SettingGroupBox}">
|
||||
<ItemsControl Style="{StaticResource SettingGrid}">
|
||||
<StackPanel Style="{StaticResource TextPanel}">
|
||||
<TextBlock Style="{DynamicResource SettingTitleLabel}" Text="{DynamicResource SoundEffect}" />
|
||||
<TextBlock Style="{DynamicResource SettingSubTitleLabel}" Text="{DynamicResource SoundEffectTip}" />
|
||||
</StackPanel>
|
||||
<ui:ToggleSwitch
|
||||
<StackPanel Orientation="Vertical">
|
||||
<Border
|
||||
Margin="0"
|
||||
BorderThickness="0"
|
||||
Style="{DynamicResource SettingGroupBox}">
|
||||
<ItemsControl Style="{StaticResource SettingGrid}">
|
||||
<StackPanel Style="{StaticResource TextPanel}">
|
||||
<TextBlock Style="{DynamicResource SettingTitleLabel}" Text="{DynamicResource SoundEffect}" />
|
||||
<TextBlock Style="{DynamicResource SettingSubTitleLabel}" Text="{DynamicResource SoundEffectTip}" />
|
||||
</StackPanel>
|
||||
<ui:ToggleSwitch
|
||||
x:Name="SoundEffect"
|
||||
Grid.Row="0"
|
||||
Grid.Column="2"
|
||||
IsOn="{Binding UseSound, Mode=TwoWay}"
|
||||
OffContent="{DynamicResource disable}"
|
||||
OnContent="{DynamicResource enable}"
|
||||
Style="{DynamicResource SideToggleSwitch}" />
|
||||
<TextBlock Style="{StaticResource Glyph}">
|
||||
<TextBlock Style="{StaticResource Glyph}">
|
||||

|
||||
</TextBlock>
|
||||
</ItemsControl>
|
||||
</Border>
|
||||
<Separator
|
||||
Width="Auto"
|
||||
BorderThickness="1"
|
||||
Style="{StaticResource SettingSeparatorStyle}" />
|
||||
<Border Margin="0" BorderThickness="0">
|
||||
<Border.Style>
|
||||
<Style BasedOn="{StaticResource SettingGroupBox}" TargetType="Border">
|
||||
<Setter Property="Visibility" Value="Collapsed" />
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding ElementName=SoundEffect, Path=IsOn}" Value="True">
|
||||
<Setter Property="Visibility" Value="Visible" />
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Border.Style>
|
||||
|
||||
<ItemsControl Style="{StaticResource SettingGrid}">
|
||||
<StackPanel Style="{StaticResource TextPanel}">
|
||||
<TextBlock Style="{DynamicResource SettingTitleLabel}" Text="{DynamicResource SoundEffectVolume}" />
|
||||
<TextBlock Style="{DynamicResource SettingSubTitleLabel}" Text="{DynamicResource SoundEffectVolumeTip}" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="2" Orientation="Horizontal">
|
||||
<TextBlock
|
||||
Width="Auto"
|
||||
Margin="0,0,8,2"
|
||||
VerticalAlignment="Center"
|
||||
Foreground="{DynamicResource Color05B}"
|
||||
Text="{Binding ElementName=SoundEffectValue, Path=Value, UpdateSourceTrigger=PropertyChanged}"
|
||||
TextAlignment="Right" />
|
||||
<Slider
|
||||
Name="SoundEffectValue"
|
||||
Width="250"
|
||||
Margin="0,0,18,0"
|
||||
VerticalAlignment="Center"
|
||||
IsMoveToPointEnabled="True"
|
||||
IsSnapToTickEnabled="True"
|
||||
Maximum="100"
|
||||
Minimum="0"
|
||||
TickFrequency="1"
|
||||
Value="{Binding SoundEffectVolume, Mode=TwoWay}" />
|
||||
</StackPanel>
|
||||
<TextBlock Style="{StaticResource Glyph}">
|
||||

|
||||
</TextBlock>
|
||||
</ItemsControl>
|
||||
</TextBlock>
|
||||
</ItemsControl>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Border Margin="0,12,0,12" Style="{DynamicResource SettingGroupBox}">
|
||||
|
|
|
|||
|
|
@ -176,7 +176,8 @@ namespace Flow.Launcher.ViewModel
|
|||
var token = e.Token == default ? _updateToken : e.Token;
|
||||
|
||||
PluginManager.UpdatePluginMetadata(e.Results, pair.Metadata, e.Query);
|
||||
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(e.Results, pair.Metadata, e.Query, token)))
|
||||
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(e.Results, pair.Metadata, e.Query,
|
||||
token)))
|
||||
{
|
||||
Log.Error("MainViewModel", "Unable to add item to Result Update Queue");
|
||||
}
|
||||
|
|
@ -190,7 +191,8 @@ namespace Flow.Launcher.ViewModel
|
|||
Hide();
|
||||
|
||||
await PluginManager.ReloadDataAsync().ConfigureAwait(false);
|
||||
Notification.Show(InternationalizationManager.Instance.GetTranslation("success"), InternationalizationManager.Instance.GetTranslation("completedSuccessfully"));
|
||||
Notification.Show(InternationalizationManager.Instance.GetTranslation("success"),
|
||||
InternationalizationManager.Instance.GetTranslation("completedSuccessfully"));
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
|
|
@ -208,7 +210,7 @@ namespace Flow.Launcher.ViewModel
|
|||
}
|
||||
|
||||
[RelayCommand]
|
||||
private void ReQuery()
|
||||
public void ReQuery()
|
||||
{
|
||||
if (SelectedIsFromQueryResults())
|
||||
{
|
||||
|
|
@ -216,6 +218,14 @@ namespace Flow.Launcher.ViewModel
|
|||
}
|
||||
}
|
||||
|
||||
public void ReQuery(bool reselect)
|
||||
{
|
||||
if (SelectedIsFromQueryResults())
|
||||
{
|
||||
QueryResults(isReQuery: true, reSelect: reselect);
|
||||
}
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private void LoadContextMenu()
|
||||
{
|
||||
|
|
@ -265,6 +275,7 @@ namespace Flow.Launcher.ViewModel
|
|||
{
|
||||
autoCompleteText = $"{result.ActionKeywordAssigned} {defaultSuggestion}";
|
||||
}
|
||||
|
||||
autoCompleteText = SelectedResults.SelectedItem.QuerySuggestionText;
|
||||
}
|
||||
|
||||
|
|
@ -286,11 +297,13 @@ namespace Flow.Launcher.ViewModel
|
|||
{
|
||||
results.SelectedIndex = int.Parse(index);
|
||||
}
|
||||
|
||||
var result = results.SelectedItem?.Result;
|
||||
if (result == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var hideWindow = await result.ExecuteAsync(new ActionContext
|
||||
{
|
||||
// not null means pressing modifier key + number, should ignore the modifier key
|
||||
|
|
@ -371,6 +384,17 @@ namespace Flow.Launcher.ViewModel
|
|||
{
|
||||
GameModeStatus = !GameModeStatus;
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
public void CopyAlternative()
|
||||
{
|
||||
var result = Results.SelectedItem?.Result?.CopyText;
|
||||
|
||||
if (result != null)
|
||||
{
|
||||
App.API.CopyToClipboard(result, directCopy: false);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
|
@ -403,6 +427,7 @@ namespace Flow.Launcher.ViewModel
|
|||
public bool GameModeStatus { get; set; } = false;
|
||||
|
||||
private string _queryText;
|
||||
|
||||
public string QueryText
|
||||
{
|
||||
get => _queryText;
|
||||
|
|
@ -426,6 +451,7 @@ namespace Flow.Launcher.ViewModel
|
|||
Settings.WindowSize += 100;
|
||||
Settings.WindowLeft -= 50;
|
||||
}
|
||||
|
||||
OnPropertyChanged();
|
||||
}
|
||||
|
||||
|
|
@ -441,6 +467,7 @@ namespace Flow.Launcher.ViewModel
|
|||
Settings.WindowLeft += 50;
|
||||
Settings.WindowSize -= 100;
|
||||
}
|
||||
|
||||
OnPropertyChanged();
|
||||
}
|
||||
|
||||
|
|
@ -520,18 +547,17 @@ namespace Flow.Launcher.ViewModel
|
|||
{
|
||||
if (QueryText != queryText)
|
||||
{
|
||||
|
||||
// re-query is done in QueryText's setter method
|
||||
QueryText = queryText;
|
||||
// set to false so the subsequent set true triggers
|
||||
// PropertyChanged and MoveQueryTextToEnd is called
|
||||
QueryTextCursorMovedToEnd = false;
|
||||
|
||||
}
|
||||
else if (isReQuery)
|
||||
{
|
||||
Query(isReQuery: true);
|
||||
}
|
||||
|
||||
QueryTextCursorMovedToEnd = true;
|
||||
});
|
||||
}
|
||||
|
|
@ -601,8 +627,8 @@ namespace Flow.Launcher.ViewModel
|
|||
|
||||
public string OpenResultCommandModifiers => Settings.OpenResultModifiers;
|
||||
|
||||
public string PreviewHotkey
|
||||
{
|
||||
public string PreviewHotkey
|
||||
{
|
||||
get
|
||||
{
|
||||
// TODO try to patch issue #1755
|
||||
|
|
@ -616,6 +642,7 @@ namespace Flow.Launcher.ViewModel
|
|||
{
|
||||
Settings.PreviewHotkey = "F1";
|
||||
}
|
||||
|
||||
return Settings.PreviewHotkey;
|
||||
}
|
||||
}
|
||||
|
|
@ -661,20 +688,7 @@ namespace Flow.Launcher.ViewModel
|
|||
List<Result> results;
|
||||
if (selected == lastContextMenuResult)
|
||||
{
|
||||
// Use copy to keep the original results unchanged
|
||||
results = lastContextMenuResults.ConvertAll(result => new Result
|
||||
{
|
||||
Title = result.Title,
|
||||
SubTitle = result.SubTitle,
|
||||
IcoPath = result.IcoPath,
|
||||
PluginDirectory = result.PluginDirectory,
|
||||
Action = result.Action,
|
||||
ContextData = result.ContextData,
|
||||
Glyph = result.Glyph,
|
||||
OriginQuery = result.OriginQuery,
|
||||
Score = result.Score,
|
||||
AsyncAction = result.AsyncAction,
|
||||
});
|
||||
results = lastContextMenuResults;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -684,12 +698,11 @@ namespace Flow.Launcher.ViewModel
|
|||
results.Add(ContextMenuTopMost(selected));
|
||||
results.Add(ContextMenuPluginInfo(selected.PluginID));
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!string.IsNullOrEmpty(query))
|
||||
{
|
||||
var filtered = results.Where
|
||||
var filtered = results.Select(x => x.Clone()).Where
|
||||
(
|
||||
r =>
|
||||
{
|
||||
|
|
@ -703,7 +716,6 @@ namespace Flow.Launcher.ViewModel
|
|||
|
||||
r.Score = match.Score;
|
||||
return true;
|
||||
|
||||
}).ToList();
|
||||
ContextMenu.AddResults(filtered, id);
|
||||
}
|
||||
|
|
@ -730,10 +742,7 @@ namespace Flow.Launcher.ViewModel
|
|||
Title = string.Format(title, h.Query),
|
||||
SubTitle = string.Format(time, h.ExecutedDateTime),
|
||||
IcoPath = "Images\\history.png",
|
||||
OriginQuery = new Query
|
||||
{
|
||||
RawQuery = h.Query
|
||||
},
|
||||
OriginQuery = new Query { RawQuery = h.Query },
|
||||
Action = _ =>
|
||||
{
|
||||
SelectedResults = Results;
|
||||
|
|
@ -761,7 +770,7 @@ namespace Flow.Launcher.ViewModel
|
|||
|
||||
private readonly IReadOnlyList<Result> _emptyResult = new List<Result>();
|
||||
|
||||
private async void QueryResults(bool isReQuery = false)
|
||||
private async void QueryResults(bool isReQuery = false, bool reSelect = true)
|
||||
{
|
||||
_updateSource?.Cancel();
|
||||
|
||||
|
|
@ -836,7 +845,7 @@ namespace Flow.Launcher.ViewModel
|
|||
|
||||
var tasks = plugins.Select(plugin => plugin.Metadata.Disabled switch
|
||||
{
|
||||
false => QueryTask(plugin),
|
||||
false => QueryTask(plugin, reSelect),
|
||||
true => Task.CompletedTask
|
||||
}).ToArray();
|
||||
|
||||
|
|
@ -864,26 +873,29 @@ namespace Flow.Launcher.ViewModel
|
|||
}
|
||||
|
||||
// Local function
|
||||
async Task QueryTask(PluginPair plugin)
|
||||
async Task QueryTask(PluginPair plugin, bool reSelect = true)
|
||||
{
|
||||
// Since it is wrapped within a ThreadPool Thread, the synchronous context is null
|
||||
// Task.Yield will force it to run in ThreadPool
|
||||
await Task.Yield();
|
||||
|
||||
IReadOnlyList<Result> results = await PluginManager.QueryForPluginAsync(plugin, query, currentCancellationToken);
|
||||
IReadOnlyList<Result> results =
|
||||
await PluginManager.QueryForPluginAsync(plugin, query, currentCancellationToken);
|
||||
|
||||
currentCancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
results ??= _emptyResult;
|
||||
|
||||
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, plugin.Metadata, query, currentCancellationToken)))
|
||||
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, plugin.Metadata, query,
|
||||
currentCancellationToken, reSelect)))
|
||||
{
|
||||
Log.Error("MainViewModel", "Unable to add item to Result Update Queue");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Query ConstructQuery(string queryText, IEnumerable<CustomShortcutModel> customShortcuts, IEnumerable<BuiltinShortcutModel> builtInShortcuts)
|
||||
private Query ConstructQuery(string queryText, IEnumerable<CustomShortcutModel> customShortcuts,
|
||||
IEnumerable<BuiltinShortcutModel> builtInShortcuts)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(queryText))
|
||||
{
|
||||
|
|
@ -893,7 +905,8 @@ namespace Flow.Launcher.ViewModel
|
|||
StringBuilder queryBuilder = new(queryText);
|
||||
StringBuilder queryBuilderTmp = new(queryText);
|
||||
|
||||
foreach (var shortcut in customShortcuts)
|
||||
// Sorting order is important here, the reason is for matching longest shortcut by default
|
||||
foreach (var shortcut in customShortcuts.OrderByDescending(x => x.Key.Length))
|
||||
{
|
||||
if (queryBuilder.Equals(shortcut.Key))
|
||||
{
|
||||
|
|
@ -920,7 +933,9 @@ namespace Flow.Launcher.ViewModel
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Exception($"{nameof(MainViewModel)}.{nameof(ConstructQuery)}|Error when expanding shortcut {shortcut.Key}", e);
|
||||
Log.Exception(
|
||||
$"{nameof(MainViewModel)}.{nameof(ConstructQuery)}|Error when expanding shortcut {shortcut.Key}",
|
||||
e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
@ -1065,6 +1080,7 @@ namespace Flow.Launcher.ViewModel
|
|||
{
|
||||
SelectedResults = Results;
|
||||
}
|
||||
|
||||
switch (Settings.LastQueryMode)
|
||||
{
|
||||
case LastQueryMode.Empty:
|
||||
|
|
@ -1112,7 +1128,7 @@ namespace Flow.Launcher.ViewModel
|
|||
/// <summary>
|
||||
/// To avoid deadlock, this method should not called from main thread
|
||||
/// </summary>
|
||||
public void UpdateResultView(IEnumerable<ResultsForUpdate> resultsForUpdates)
|
||||
public void UpdateResultView(ICollection<ResultsForUpdate> resultsForUpdates)
|
||||
{
|
||||
if (!resultsForUpdates.Any())
|
||||
return;
|
||||
|
|
@ -1151,7 +1167,10 @@ namespace Flow.Launcher.ViewModel
|
|||
}
|
||||
}
|
||||
|
||||
Results.AddResults(resultsForUpdates, token);
|
||||
// it should be the same for all results
|
||||
bool reSelect = resultsForUpdates.First().ReSelectFirstResult;
|
||||
|
||||
Results.AddResults(resultsForUpdates, token, reSelect);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
|
|||
|
|
@ -4,23 +4,13 @@ using System.Threading;
|
|||
|
||||
namespace Flow.Launcher.ViewModel
|
||||
{
|
||||
public struct ResultsForUpdate
|
||||
public record struct ResultsForUpdate(
|
||||
IReadOnlyList<Result> Results,
|
||||
PluginMetadata Metadata,
|
||||
Query Query,
|
||||
CancellationToken Token,
|
||||
bool ReSelectFirstResult = true)
|
||||
{
|
||||
public IReadOnlyList<Result> Results { get; }
|
||||
|
||||
public PluginMetadata Metadata { get; }
|
||||
public string ID { get; }
|
||||
|
||||
public Query Query { get; }
|
||||
public CancellationToken Token { get; }
|
||||
|
||||
public ResultsForUpdate(IReadOnlyList<Result> results, PluginMetadata metadata, Query query, CancellationToken token)
|
||||
{
|
||||
Results = results;
|
||||
Metadata = metadata;
|
||||
Query = query;
|
||||
Token = token;
|
||||
ID = metadata.ID;
|
||||
}
|
||||
public string ID { get; } = Metadata.ID;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -147,23 +147,23 @@ namespace Flow.Launcher.ViewModel
|
|||
/// <summary>
|
||||
/// To avoid deadlock, this method should not called from main thread
|
||||
/// </summary>
|
||||
public void AddResults(IEnumerable<ResultsForUpdate> resultsForUpdates, CancellationToken token)
|
||||
public void AddResults(IEnumerable<ResultsForUpdate> resultsForUpdates, CancellationToken token, bool reselect = true)
|
||||
{
|
||||
var newResults = NewResults(resultsForUpdates);
|
||||
|
||||
if (token.IsCancellationRequested)
|
||||
return;
|
||||
|
||||
UpdateResults(newResults, token);
|
||||
UpdateResults(newResults, token, reselect);
|
||||
}
|
||||
|
||||
private void UpdateResults(List<ResultViewModel> newResults, CancellationToken token = default)
|
||||
private void UpdateResults(List<ResultViewModel> newResults, CancellationToken token = default, bool reselect = true)
|
||||
{
|
||||
lock (_collectionLock)
|
||||
{
|
||||
// update UI in one run, so it can avoid UI flickering
|
||||
Results.Update(newResults, token);
|
||||
if (Results.Any())
|
||||
if (reselect && Results.Any())
|
||||
SelectedItem = Results[0];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -63,6 +63,9 @@ namespace Flow.Launcher.ViewModel
|
|||
case nameof(Settings.PreviewHotkey):
|
||||
OnPropertyChanged(nameof(AlwaysPreviewToolTip));
|
||||
break;
|
||||
case nameof(Settings.SoundVolume):
|
||||
OnPropertyChanged(nameof(SoundEffectVolume));
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -631,6 +634,12 @@ namespace Flow.Launcher.ViewModel
|
|||
set => Settings.UseSound = value;
|
||||
}
|
||||
|
||||
public double SoundEffectVolume
|
||||
{
|
||||
get => Settings.SoundVolume;
|
||||
set => Settings.SoundVolume = value;
|
||||
}
|
||||
|
||||
public bool UseClock
|
||||
{
|
||||
get => Settings.UseClock;
|
||||
|
|
|
|||
|
|
@ -33,20 +33,32 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
|
|||
|
||||
protected List<Bookmark> LoadBookmarksFromFile(string path, string source)
|
||||
{
|
||||
if (!File.Exists(path))
|
||||
return new List<Bookmark>();
|
||||
|
||||
var bookmarks = new List<Bookmark>();
|
||||
|
||||
if (!File.Exists(path))
|
||||
return bookmarks;
|
||||
|
||||
using var jsonDocument = JsonDocument.Parse(File.ReadAllText(path));
|
||||
if (!jsonDocument.RootElement.TryGetProperty("roots", out var rootElement))
|
||||
return new List<Bookmark>();
|
||||
return bookmarks;
|
||||
EnumerateRoot(rootElement, bookmarks, source);
|
||||
return bookmarks;
|
||||
}
|
||||
|
||||
private void EnumerateRoot(JsonElement rootElement, ICollection<Bookmark> bookmarks, string source)
|
||||
{
|
||||
foreach (var folder in rootElement.EnumerateObject())
|
||||
{
|
||||
if (folder.Value.ValueKind == JsonValueKind.Object)
|
||||
if (folder.Value.ValueKind != JsonValueKind.Object)
|
||||
continue;
|
||||
|
||||
// Fix for Opera. It stores bookmarks slightly different than chrome. See PR and bug report for this change for details.
|
||||
// If various exceptions start to build up here consider splitting this Loader into multiple separate ones.
|
||||
if (folder.Name == "custom_root")
|
||||
EnumerateRoot(folder.Value, bookmarks, source);
|
||||
else
|
||||
EnumerateFolderBookmark(folder.Value, bookmarks, source);
|
||||
}
|
||||
|
||||
return bookmarks;
|
||||
}
|
||||
|
||||
private void EnumerateFolderBookmark(JsonElement folderElement, ICollection<Bookmark> bookmarks,
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
"Name": "Browser Bookmarks",
|
||||
"Description": "Search your browser bookmarks",
|
||||
"Author": "qianlifeng, Ioannis G.",
|
||||
"Version": "3.1.5",
|
||||
"Version": "3.2.0",
|
||||
"Language": "csharp",
|
||||
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
|
||||
"ExecuteFileName": "Flow.Launcher.Plugin.BrowserBookmark.dll",
|
||||
|
|
|
|||
|
|
@ -3,13 +3,13 @@
|
|||
|
||||
<!-- Dialogues -->
|
||||
<system:String x:Key="plugin_explorer_make_selection_warning">Сначала отметьте что-нибудь</system:String>
|
||||
<system:String x:Key="plugin_explorer_select_folder_link_warning">Please select a folder link</system:String>
|
||||
<system:String x:Key="plugin_explorer_select_folder_link_warning">Пожалуйста, выберите ссылку на папку</system:String>
|
||||
<system:String x:Key="plugin_explorer_delete_folder_link">Вы уверены, что хотите удалить {0}?</system:String>
|
||||
<system:String x:Key="plugin_explorer_deletefileconfirm">Вы действительно хотите безвозвратно удалить этот файл?</system:String>
|
||||
<system:String x:Key="plugin_explorer_deletefilefolderconfirm">Вы действительно хотите безвозвратно удалить этот файл/папку?</system:String>
|
||||
<system:String x:Key="plugin_explorer_deletefilefoldersuccess">Удаление завершено</system:String>
|
||||
<system:String x:Key="plugin_explorer_deletefilefoldersuccess_detail">Успешно удалено {0}</system:String>
|
||||
<system:String x:Key="plugin_explorer_globalActionKeywordInvalid">Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword</system:String>
|
||||
<system:String x:Key="plugin_explorer_globalActionKeywordInvalid">Назначение ключевого слова глобальных действий может привести к слишком большому количеству результатов поиска. Пожалуйста, выберите конкретное ключевое слово действий</system:String>
|
||||
<system:String x:Key="plugin_explorer_quickaccess_globalActionKeywordInvalid">Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword</system:String>
|
||||
<system:String x:Key="plugin_explorer_windowsSearchServiceNotRunning">The required service for Windows Index Search does not appear to be running</system:String>
|
||||
<system:String x:Key="plugin_explorer_windowsSearchServiceFix">To fix this, start the Windows Search service. Select here to remove this warning</system:String>
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
"Name": "Explorer",
|
||||
"Description": "Find and manage files and folders via Windows Search or Everything",
|
||||
"Author": "Jeremy Wu",
|
||||
"Version": "3.1.5",
|
||||
"Version": "3.1.6",
|
||||
"Language": "csharp",
|
||||
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
|
||||
"ExecuteFileName": "Flow.Launcher.Plugin.Explorer.dll",
|
||||
|
|
|
|||
|
|
@ -28,11 +28,11 @@
|
|||
<system:String x:Key="plugin_pluginsmanager_update_alreadyexists">此插件已安装</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_failed_title">插件列表下载失败</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_failed_subtitle">请检查您是否可以连接到 github.com。这个错误意味着您可能无法安装或更新插件。</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_title">Update all plugins</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_subtitle">Would you like to update all plugins?</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_prompt">Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_prompt_no_restart">Would you like to update {0} plugins?</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_success_restart">{0} plugins successfully updated. Restarting Flow, please wait...</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_title">更新所有插件</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_subtitle">您想要更新所有插件吗?</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_prompt">您想要更新 {0} 插件吗?{1}更新所有插件后 Flow Launcher 将重启。</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_prompt_no_restart">您想要更新 {0} 插件吗?</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_success_restart">插件 {0} 更新成功。正在重新启动 Flow Launcher,请稍候..……</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_success_restart">插件{0}更新成功。正在重新启动 Flow Launcher,请稍候...</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_install_unknown_source_warning_title">从未知源安装</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_install_unknown_source_warning">您正在从未知源安装此插件,它可能包含潜在风险!{0}{0}请确保您了解来源以及安全性。{0}{0}您想要继续吗?{0}{0}(您可以通过设置关闭此警告)</system:String>
|
||||
|
|
@ -40,7 +40,7 @@
|
|||
<system:String x:Key="plugin_pluginsmanager_install_success_no_restart">成功安装插件{0}。请重新启动 Flow Launcher。</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_uninstall_success_no_restart">成功卸载插件{0}。请重新启动 Flow Launcher。</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_success_no_restart">成功更新插件{0}。请重新启动 Flow Launcher。</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_success_no_restart">{0} plugins successfully updated. Please restart Flow.</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_update_all_success_no_restart">插件 {0} 更新成功。请重新启动 Flow Launcher。</system:String>
|
||||
<system:String x:Key="plugin_pluginsmanager_plugin_modified_error">插件 {0} 已被修改。请在进行任何进一步更改之前重新启动Flow。</system:String>
|
||||
|
||||
<!-- Plugin Infos -->
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
"Name": "Plugins Manager",
|
||||
"Description": "Management of installing, uninstalling or updating Flow Launcher plugins",
|
||||
"Author": "Jeremy Wu",
|
||||
"Version": "3.1.0",
|
||||
"Version": "3.1.1",
|
||||
"Language": "csharp",
|
||||
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
|
||||
"ExecuteFileName": "Flow.Launcher.Plugin.PluginsManager.dll",
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Run As Administrator</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Search programs in Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Spustit jako správce</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Otevřít umístění složky</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Zakázat zobrazování tohoto programu</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program </system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Vyhledávání programů ve Flow Launcheru</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Run As Administrator</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Search programs in Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Als Administrator ausführen</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Enthaltenden Ordner öffnen</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Programm</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Suche Programme mit Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Run As Administrator</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Search programs in Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Run As Administrator</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Search programs in Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Ejecutar como administrador</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Abrir carpeta contenedora</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Desactivar la visualización de este programa</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Abrir carpeta de destino</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Programa</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Busca programas en Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Exécuter en tant qu'administrateur</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Ouvrir le répertoire</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Désactiver l'affichage de ce programme</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Ouvrir le répertoire cible</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Programme</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Rechercher des programmes dans Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Run As Administrator</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Apri percorso file</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Search programs in Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Run As Administrator</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Search programs in Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">관리자 권한으로 실행</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">포함된 폴더 열기</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">이 프로그램 표시 비활성화</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">프로그램</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Flow Launcher에서 프로그램을 검색합니다</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Run As Administrator</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Search programs in Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Run As Administrator</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Search programs in Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Uruchom jako administrator</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Programy</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Szukaj i uruchamiaj programy z poziomu Flow Launchera</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Run As Administrator</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Search programs in Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Executar como administrador</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Abrir pasta de destino</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Desativar exibição deste programa</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Abrir pasta de destino</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Programas</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Pesquisa de programas com o Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Запустить от имени администратора</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Открыть содержащую папку</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Отключить отображение этой программы</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Программа</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Поиск программ в Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Spustiť ako správca</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Otvoriť umiestnenie priečinka</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Zakázať zobrazovanie tohto programu</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Otvoriť cieľový pričinok</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Vyhľadávanie programov vo Flow Launcheri</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Run As Administrator</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Search programs in Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Yönetici Olarak Çalıştır</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Open containing folder</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Disable this program from displaying</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Program</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Programları Flow Launcher'tan arayın</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">Запустити від імені адміністратора</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">Відкрити папку</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">Вимкнути відображення цієї програми</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Відкрити цільову папку</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">Програма</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">Пошук програм у Flow Launcher</system:String>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator">以管理员身份运行</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_containing_folder">打开文件所在文件夹</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_disable_program">禁止显示该程序</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_open_target_folder">Open target folder</system:String>
|
||||
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_name">程序</system:String>
|
||||
<system:String x:Key="flowlauncher_plugin_program_plugin_description">在 Flow Launcher 中搜索程序</system:String>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue