mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Merge pull request #697 from Flow-Launcher/dev
Release 1.9.0 | Plugin 2.1.0
This commit is contained in:
commit
54e690751b
286 changed files with 63402 additions and 4067 deletions
57
Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
Normal file
57
Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
using Flow.Launcher.Infrastructure.Http;
|
||||||
|
using Flow.Launcher.Infrastructure.Logger;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Core.ExternalPlugins
|
||||||
|
{
|
||||||
|
public static class PluginsManifest
|
||||||
|
{
|
||||||
|
static PluginsManifest()
|
||||||
|
{
|
||||||
|
UpdateTask = UpdateManifestAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<UserPlugin> UserPlugins { get; private set; } = new List<UserPlugin>();
|
||||||
|
|
||||||
|
public static Task UpdateTask { get; private set; }
|
||||||
|
|
||||||
|
private static readonly SemaphoreSlim manifestUpdateLock = new(1);
|
||||||
|
|
||||||
|
public static Task UpdateManifestAsync()
|
||||||
|
{
|
||||||
|
if (manifestUpdateLock.CurrentCount == 0)
|
||||||
|
{
|
||||||
|
return UpdateTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
return UpdateTask = DownloadManifestAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async static Task DownloadManifestAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await manifestUpdateLock.WaitAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
|
await using var jsonStream = await Http.GetStreamAsync("https://raw.githubusercontent.com/Flow-Launcher/Flow.Launcher.PluginsManifest/plugin_api_v2/plugins.json")
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
UserPlugins = await JsonSerializer.DeserializeAsync<List<UserPlugin>>(jsonStream).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Exception("|PluginManagement.GetManifest|Encountered error trying to download plugins manifest", e);
|
||||||
|
|
||||||
|
UserPlugins = new List<UserPlugin>();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
manifestUpdateLock.Release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
|
namespace Flow.Launcher.Core.ExternalPlugins
|
||||||
namespace Flow.Launcher.Plugin.PluginsManager.Models
|
|
||||||
{
|
{
|
||||||
public class UserPlugin
|
public record UserPlugin
|
||||||
{
|
{
|
||||||
public string ID { get; set; }
|
public string ID { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
@ -12,5 +11,6 @@ namespace Flow.Launcher.Plugin.PluginsManager.Models
|
||||||
public string Website { get; set; }
|
public string Website { get; set; }
|
||||||
public string UrlDownload { get; set; }
|
public string UrlDownload { get; set; }
|
||||||
public string UrlSourceCode { get; set; }
|
public string UrlSourceCode { get; set; }
|
||||||
|
public string IcoPath { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -53,8 +53,8 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Droplex" Version="1.3.1" />
|
<PackageReference Include="Droplex" Version="1.4.0" />
|
||||||
<PackageReference Include="FSharp.Core" Version="4.7.1" />
|
<PackageReference Include="FSharp.Core" Version="5.0.2" />
|
||||||
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="2.1.3" />
|
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="2.1.3" />
|
||||||
<PackageReference Include="squirrel.windows" Version="1.5.2" />
|
<PackageReference Include="squirrel.windows" Version="1.5.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -24,36 +24,16 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Task<Stream> ExecuteQueryAsync(Query query, CancellationToken token)
|
protected override Task<Stream> RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
JsonRPCServerRequestModel request = new JsonRPCServerRequestModel
|
|
||||||
{
|
|
||||||
Method = "query",
|
|
||||||
Parameters = new object[] {query.Search},
|
|
||||||
};
|
|
||||||
|
|
||||||
_startInfo.Arguments = $"\"{request}\"";
|
_startInfo.Arguments = $"\"{request}\"";
|
||||||
|
|
||||||
return ExecuteAsync(_startInfo, token);
|
return ExecuteAsync(_startInfo, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string ExecuteCallback(JsonRPCRequestModel rpcRequest)
|
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
_startInfo.Arguments = $"\"{rpcRequest}\"";
|
_startInfo.Arguments = $"\"{rpcRequest}\"";
|
||||||
return Execute(_startInfo);
|
return Execute(_startInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string ExecuteContextMenu(Result selectedResult)
|
|
||||||
{
|
|
||||||
JsonRPCServerRequestModel request = new JsonRPCServerRequestModel
|
|
||||||
{
|
|
||||||
Method = "contextmenu",
|
|
||||||
Parameters = new object[] {selectedResult.ContextData},
|
|
||||||
};
|
|
||||||
|
|
||||||
_startInfo.Arguments = $"\"{request}\"";
|
|
||||||
|
|
||||||
return Execute(_startInfo);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -43,15 +43,19 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
[JsonPropertyName("result")]
|
[JsonPropertyName("result")]
|
||||||
public new List<JsonRPCResult> Result { get; set; }
|
public new List<JsonRPCResult> Result { get; set; }
|
||||||
|
|
||||||
|
public Dictionary<string, object> SettingsChange { get; set; }
|
||||||
|
|
||||||
public string DebugMessage { get; set; }
|
public string DebugMessage { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class JsonRPCRequestModel
|
public class JsonRPCRequestModel
|
||||||
{
|
{
|
||||||
public string Method { get; set; }
|
public string Method { get; set; }
|
||||||
|
|
||||||
public object[] Parameters { get; set; }
|
public object[] Parameters { get; set; }
|
||||||
|
|
||||||
|
public Dictionary<string, object> Settings { get; set; }
|
||||||
|
|
||||||
private static readonly JsonSerializerOptions options = new()
|
private static readonly JsonSerializerOptions options = new()
|
||||||
{
|
{
|
||||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
|
||||||
|
|
@ -86,5 +90,7 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
public class JsonRPCResult : Result
|
public class JsonRPCResult : Result
|
||||||
{
|
{
|
||||||
public JsonRPCClientRequestModel JsonRPCAction { get; set; }
|
public JsonRPCClientRequestModel JsonRPCAction { get; set; }
|
||||||
|
|
||||||
|
public Dictionary<string, object> SettingsChange { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
43
Flow.Launcher.Core/Plugin/JsonRPCConfigurationModel.cs
Normal file
43
Flow.Launcher.Core/Plugin/JsonRPCConfigurationModel.cs
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Core.Plugin
|
||||||
|
{
|
||||||
|
public class JsonRpcConfigurationModel
|
||||||
|
{
|
||||||
|
public List<SettingField> Body { get; set; }
|
||||||
|
public void Deconstruct(out List<SettingField> Body)
|
||||||
|
{
|
||||||
|
Body = this.Body;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SettingField
|
||||||
|
{
|
||||||
|
public string Type { get; set; }
|
||||||
|
public FieldAttributes Attributes { get; set; }
|
||||||
|
public void Deconstruct(out string Type, out FieldAttributes attributes)
|
||||||
|
{
|
||||||
|
Type = this.Type;
|
||||||
|
attributes = this.Attributes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class FieldAttributes
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Label { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public bool Validation { get; set; }
|
||||||
|
public List<string> Options { get; set; }
|
||||||
|
public string DefaultValue { get; set; }
|
||||||
|
public char passwordChar { get; set; }
|
||||||
|
public void Deconstruct(out string Name, out string Label, out string Description, out bool Validation, out List<string> Options, out string DefaultValue)
|
||||||
|
{
|
||||||
|
Name = this.Name;
|
||||||
|
Label = this.Label;
|
||||||
|
Description = this.Description;
|
||||||
|
Validation = this.Validation;
|
||||||
|
Options = this.Options;
|
||||||
|
DefaultValue = this.DefaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
using Flow.Launcher.Core.Resource;
|
using Accessibility;
|
||||||
|
using Flow.Launcher.Core.Resource;
|
||||||
|
using Flow.Launcher.Infrastructure;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
@ -8,12 +10,24 @@ using System.Reflection;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
|
||||||
using Flow.Launcher.Infrastructure.Logger;
|
using Flow.Launcher.Infrastructure.Logger;
|
||||||
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
using Flow.Launcher.Plugin;
|
using Flow.Launcher.Plugin;
|
||||||
using ICSharpCode.SharpZipLib.Zip;
|
using ICSharpCode.SharpZipLib.Zip;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using Microsoft.IO;
|
using Microsoft.IO;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using YamlDotNet.Serialization;
|
||||||
|
using YamlDotNet.Serialization.NamingConventions;
|
||||||
|
using CheckBox = System.Windows.Controls.CheckBox;
|
||||||
|
using Control = System.Windows.Controls.Control;
|
||||||
|
using Label = System.Windows.Controls.Label;
|
||||||
|
using Orientation = System.Windows.Controls.Orientation;
|
||||||
|
using TextBox = System.Windows.Controls.TextBox;
|
||||||
|
using UserControl = System.Windows.Controls.UserControl;
|
||||||
|
using System.Windows.Data;
|
||||||
|
|
||||||
namespace Flow.Launcher.Core.Plugin
|
namespace Flow.Launcher.Core.Plugin
|
||||||
{
|
{
|
||||||
|
|
@ -21,7 +35,7 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
/// Represent the plugin that using JsonPRC
|
/// Represent the plugin that using JsonPRC
|
||||||
/// every JsonRPC plugin should has its own plugin instance
|
/// every JsonRPC plugin should has its own plugin instance
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal abstract class JsonRPCPlugin : IAsyncPlugin, IContextMenu
|
internal abstract class JsonRPCPlugin : IAsyncPlugin, IContextMenu, ISettingProvider, ISavable
|
||||||
{
|
{
|
||||||
protected PluginInitContext context;
|
protected PluginInitContext context;
|
||||||
public const string JsonRPC = "JsonRPC";
|
public const string JsonRPC = "JsonRPC";
|
||||||
|
|
@ -30,16 +44,25 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
/// The language this JsonRPCPlugin support
|
/// The language this JsonRPCPlugin support
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract string SupportedLanguage { get; set; }
|
public abstract string SupportedLanguage { get; set; }
|
||||||
|
protected abstract Task<Stream> RequestAsync(JsonRPCRequestModel rpcRequest, CancellationToken token = default);
|
||||||
protected abstract Task<Stream> ExecuteQueryAsync(Query query, CancellationToken token);
|
protected abstract string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default);
|
||||||
protected abstract string ExecuteCallback(JsonRPCRequestModel rpcRequest);
|
|
||||||
protected abstract string ExecuteContextMenu(Result selectedResult);
|
|
||||||
|
|
||||||
private static readonly RecyclableMemoryStreamManager BufferManager = new();
|
private static readonly RecyclableMemoryStreamManager BufferManager = new();
|
||||||
|
|
||||||
|
private string SettingConfigurationPath => Path.Combine(context.CurrentPluginMetadata.PluginDirectory, "SettingsTemplate.yaml");
|
||||||
|
private string SettingPath => Path.Combine(DataLocation.PluginSettingsDirectory, context.CurrentPluginMetadata.Name, "Settings.json");
|
||||||
|
|
||||||
public List<Result> LoadContextMenus(Result selectedResult)
|
public List<Result> LoadContextMenus(Result selectedResult)
|
||||||
{
|
{
|
||||||
var output = ExecuteContextMenu(selectedResult);
|
var request = new JsonRPCRequestModel
|
||||||
|
{
|
||||||
|
Method = "context_menu",
|
||||||
|
Parameters = new[]
|
||||||
|
{
|
||||||
|
selectedResult.ContextData
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var output = Request(request);
|
||||||
return DeserializedResult(output);
|
return DeserializedResult(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -53,6 +76,14 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private static readonly JsonSerializerOptions settingSerializeOption = new()
|
||||||
|
{
|
||||||
|
WriteIndented = true
|
||||||
|
};
|
||||||
|
private Dictionary<string, object> Settings { get; set; }
|
||||||
|
|
||||||
|
private Dictionary<string, FrameworkElement> _settingControls = new();
|
||||||
|
|
||||||
private async Task<List<Result>> DeserializedResultAsync(Stream output)
|
private async Task<List<Result>> DeserializedResultAsync(Stream output)
|
||||||
{
|
{
|
||||||
if (output == Stream.Null) return null;
|
if (output == Stream.Null) return null;
|
||||||
|
|
@ -86,6 +117,8 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
{
|
{
|
||||||
result.Action = c =>
|
result.Action = c =>
|
||||||
{
|
{
|
||||||
|
UpdateSettings(result.SettingsChange);
|
||||||
|
|
||||||
if (result.JsonRPCAction == null) return false;
|
if (result.JsonRPCAction == null) return false;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(result.JsonRPCAction.Method))
|
if (string.IsNullOrEmpty(result.JsonRPCAction.Method))
|
||||||
|
|
@ -100,7 +133,7 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var actionResponse = ExecuteCallback(result.JsonRPCAction);
|
var actionResponse = Request(result.JsonRPCAction);
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(actionResponse))
|
if (string.IsNullOrEmpty(actionResponse))
|
||||||
{
|
{
|
||||||
|
|
@ -125,6 +158,8 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
|
|
||||||
results.AddRange(queryResponseModel.Result);
|
results.AddRange(queryResponseModel.Result);
|
||||||
|
|
||||||
|
UpdateSettings(queryResponseModel.SettingsChange);
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -192,15 +227,6 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result.StartsWith("DEBUG:"))
|
|
||||||
{
|
|
||||||
MessageBox.Show(new Form
|
|
||||||
{
|
|
||||||
TopMost = true
|
|
||||||
}, result.Substring(6));
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
@ -255,8 +281,8 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
|
|
||||||
if (buffer.Length == 0)
|
if (buffer.Length == 0)
|
||||||
{
|
{
|
||||||
var errorMessage = process.StandardError.EndOfStream ?
|
var errorMessage = process.StandardError.EndOfStream ?
|
||||||
"Empty JSONRPC Response" :
|
"Empty JSONRPC Response" :
|
||||||
await process.StandardError.ReadToEndAsync();
|
await process.StandardError.ReadToEndAsync();
|
||||||
throw new InvalidDataException($"{context.CurrentPluginMetadata.Name}|{errorMessage}");
|
throw new InvalidDataException($"{context.CurrentPluginMetadata.Name}|{errorMessage}");
|
||||||
}
|
}
|
||||||
|
|
@ -283,14 +309,225 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
|
|
||||||
public async Task<List<Result>> QueryAsync(Query query, CancellationToken token)
|
public async Task<List<Result>> QueryAsync(Query query, CancellationToken token)
|
||||||
{
|
{
|
||||||
var output = await ExecuteQueryAsync(query, token);
|
var request = new JsonRPCRequestModel
|
||||||
|
{
|
||||||
|
Method = "query",
|
||||||
|
Parameters = new object[]
|
||||||
|
{
|
||||||
|
query.Search
|
||||||
|
},
|
||||||
|
Settings = Settings
|
||||||
|
};
|
||||||
|
var output = await RequestAsync(request, token);
|
||||||
return await DeserializedResultAsync(output);
|
return await DeserializedResultAsync(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual Task InitAsync(PluginInitContext context)
|
public async Task InitSettingAsync()
|
||||||
|
{
|
||||||
|
if (!File.Exists(SettingConfigurationPath))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (File.Exists(SettingPath))
|
||||||
|
{
|
||||||
|
await using var fileStream = File.OpenRead(SettingPath);
|
||||||
|
Settings = await JsonSerializer.DeserializeAsync<Dictionary<string, object>>(fileStream, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
|
||||||
|
_settingsTemplate = deserializer.Deserialize<JsonRpcConfigurationModel>(await File.ReadAllTextAsync(SettingConfigurationPath));
|
||||||
|
|
||||||
|
Settings ??= new Dictionary<string, object>();
|
||||||
|
|
||||||
|
foreach (var (type, attribute) in _settingsTemplate.Body)
|
||||||
|
{
|
||||||
|
if (type == "textBlock")
|
||||||
|
continue;
|
||||||
|
if (!Settings.ContainsKey(attribute.Name))
|
||||||
|
{
|
||||||
|
Settings[attribute.Name] = attribute.DefaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task InitAsync(PluginInitContext context)
|
||||||
{
|
{
|
||||||
this.context = context;
|
this.context = context;
|
||||||
return Task.CompletedTask;
|
await InitSettingAsync();
|
||||||
|
}
|
||||||
|
private static readonly Thickness settingControlMargin = new(10);
|
||||||
|
private JsonRpcConfigurationModel _settingsTemplate;
|
||||||
|
public Control CreateSettingPanel()
|
||||||
|
{
|
||||||
|
if (Settings == null)
|
||||||
|
return new();
|
||||||
|
var settingWindow = new UserControl();
|
||||||
|
var mainPanel = new StackPanel
|
||||||
|
{
|
||||||
|
Margin = settingControlMargin,
|
||||||
|
Orientation = Orientation.Vertical
|
||||||
|
};
|
||||||
|
settingWindow.Content = mainPanel;
|
||||||
|
|
||||||
|
foreach (var (type, attribute) in _settingsTemplate.Body)
|
||||||
|
{
|
||||||
|
var panel = new StackPanel
|
||||||
|
{
|
||||||
|
Orientation = Orientation.Horizontal,
|
||||||
|
Margin = settingControlMargin
|
||||||
|
};
|
||||||
|
var name = new Label()
|
||||||
|
{
|
||||||
|
Content = attribute.Label,
|
||||||
|
Margin = settingControlMargin
|
||||||
|
};
|
||||||
|
|
||||||
|
FrameworkElement contentControl;
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case "textBlock":
|
||||||
|
{
|
||||||
|
contentControl = new TextBlock
|
||||||
|
{
|
||||||
|
Text = attribute.Description.Replace("\\r\\n", "\r\n"),
|
||||||
|
Margin = settingControlMargin,
|
||||||
|
MaxWidth = 400,
|
||||||
|
TextWrapping = TextWrapping.WrapWithOverflow
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "input":
|
||||||
|
{
|
||||||
|
var textBox = new TextBox()
|
||||||
|
{
|
||||||
|
Width = 300,
|
||||||
|
Text = Settings[attribute.Name] as string ?? string.Empty,
|
||||||
|
Margin = settingControlMargin,
|
||||||
|
ToolTip = attribute.Description
|
||||||
|
};
|
||||||
|
textBox.TextChanged += (_, _) =>
|
||||||
|
{
|
||||||
|
Settings[attribute.Name] = textBox.Text;
|
||||||
|
};
|
||||||
|
contentControl = textBox;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "textarea":
|
||||||
|
{
|
||||||
|
var textBox = new TextBox()
|
||||||
|
{
|
||||||
|
Width = 300,
|
||||||
|
Height = 120,
|
||||||
|
Margin = settingControlMargin,
|
||||||
|
TextWrapping = TextWrapping.WrapWithOverflow,
|
||||||
|
AcceptsReturn = true,
|
||||||
|
Text = Settings[attribute.Name] as string ?? string.Empty,
|
||||||
|
ToolTip = attribute.Description
|
||||||
|
};
|
||||||
|
textBox.TextChanged += (sender, _) =>
|
||||||
|
{
|
||||||
|
Settings[attribute.Name] = ((TextBox)sender).Text;
|
||||||
|
};
|
||||||
|
contentControl = textBox;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "passwordBox":
|
||||||
|
{
|
||||||
|
var passwordBox = new PasswordBox()
|
||||||
|
{
|
||||||
|
Width = 300,
|
||||||
|
Margin = settingControlMargin,
|
||||||
|
Password = Settings[attribute.Name] as string ?? string.Empty,
|
||||||
|
PasswordChar = attribute.passwordChar == default ? '*' : attribute.passwordChar,
|
||||||
|
ToolTip = attribute.Description
|
||||||
|
};
|
||||||
|
passwordBox.PasswordChanged += (sender, _) =>
|
||||||
|
{
|
||||||
|
Settings[attribute.Name] = ((PasswordBox)sender).Password;
|
||||||
|
};
|
||||||
|
contentControl = passwordBox;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "dropdown":
|
||||||
|
{
|
||||||
|
var comboBox = new ComboBox()
|
||||||
|
{
|
||||||
|
ItemsSource = attribute.Options,
|
||||||
|
SelectedItem = Settings[attribute.Name],
|
||||||
|
Margin = settingControlMargin,
|
||||||
|
ToolTip = attribute.Description
|
||||||
|
};
|
||||||
|
comboBox.SelectionChanged += (sender, _) =>
|
||||||
|
{
|
||||||
|
Settings[attribute.Name] = (string)((ComboBox)sender).SelectedItem;
|
||||||
|
};
|
||||||
|
contentControl = comboBox;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "checkbox":
|
||||||
|
var checkBox = new CheckBox
|
||||||
|
{
|
||||||
|
IsChecked = Settings[attribute.Name] is bool isChecked ? isChecked : bool.Parse(attribute.DefaultValue),
|
||||||
|
Margin = settingControlMargin,
|
||||||
|
ToolTip = attribute.Description
|
||||||
|
};
|
||||||
|
checkBox.Click += (sender, _) =>
|
||||||
|
{
|
||||||
|
Settings[attribute.Name] = ((CheckBox)sender).IsChecked;
|
||||||
|
};
|
||||||
|
contentControl = checkBox;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (type != "textBlock")
|
||||||
|
_settingControls[attribute.Name] = contentControl;
|
||||||
|
panel.Children.Add(name);
|
||||||
|
panel.Children.Add(contentControl);
|
||||||
|
mainPanel.Children.Add(panel);
|
||||||
|
}
|
||||||
|
return settingWindow;
|
||||||
|
}
|
||||||
|
public void Save()
|
||||||
|
{
|
||||||
|
if (Settings != null)
|
||||||
|
{
|
||||||
|
Helper.ValidateDirectory(Path.Combine(DataLocation.PluginSettingsDirectory, context.CurrentPluginMetadata.Name));
|
||||||
|
File.WriteAllText(SettingPath, JsonSerializer.Serialize(Settings, settingSerializeOption));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateSettings(Dictionary<string, object> settings)
|
||||||
|
{
|
||||||
|
if (settings == null || settings.Count == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
foreach (var (key, value) in settings)
|
||||||
|
{
|
||||||
|
if (Settings.ContainsKey(key))
|
||||||
|
{
|
||||||
|
Settings[key] = value;
|
||||||
|
}
|
||||||
|
if (_settingControls.ContainsKey(key))
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (_settingControls[key])
|
||||||
|
{
|
||||||
|
case TextBox textBox:
|
||||||
|
textBox.Dispatcher.Invoke(() => textBox.Text = value as string);
|
||||||
|
break;
|
||||||
|
case PasswordBox passwordBox:
|
||||||
|
passwordBox.Dispatcher.Invoke(() => passwordBox.Password = value as string);
|
||||||
|
break;
|
||||||
|
case ComboBox comboBox:
|
||||||
|
comboBox.Dispatcher.Invoke(() => comboBox.SelectedItem = value);
|
||||||
|
break;
|
||||||
|
case CheckBox checkBox:
|
||||||
|
checkBox.Dispatcher.Invoke(() => checkBox.IsChecked = value is bool isChecked ? isChecked : bool.Parse(value as string));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
@ -45,8 +45,56 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return allPluginMetadata;
|
(List<PluginMetadata> uniqueList, List<PluginMetadata> duplicateList) = GetUniqueLatestPluginMetadata(allPluginMetadata);
|
||||||
|
|
||||||
|
duplicateList
|
||||||
|
.ForEach(
|
||||||
|
x => Log.Warn("PluginConfig",
|
||||||
|
string.Format("Duplicate plugin name: {0}, id: {1}, version: {2} " +
|
||||||
|
"not loaded due to version not the highest of the duplicates",
|
||||||
|
x.Name, x.ID, x.Version),
|
||||||
|
"GetUniqueLatestPluginMetadata"));
|
||||||
|
|
||||||
|
return uniqueList;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static (List<PluginMetadata>, List<PluginMetadata>) GetUniqueLatestPluginMetadata(List<PluginMetadata> allPluginMetadata)
|
||||||
|
{
|
||||||
|
var duplicate_list = new List<PluginMetadata>();
|
||||||
|
var unique_list = new List<PluginMetadata>();
|
||||||
|
|
||||||
|
var duplicateGroups = allPluginMetadata.GroupBy(x => x.ID).Where(g => g.Count() > 1).Select(y => y).ToList();
|
||||||
|
|
||||||
|
foreach (var metadata in allPluginMetadata)
|
||||||
|
{
|
||||||
|
var duplicatesExist = false;
|
||||||
|
foreach (var group in duplicateGroups)
|
||||||
|
{
|
||||||
|
if (metadata.ID == group.Key)
|
||||||
|
{
|
||||||
|
duplicatesExist = true;
|
||||||
|
|
||||||
|
// If metadata's version greater than each duplicate's version, CompareTo > 0
|
||||||
|
var count = group.Where(x => metadata.Version.CompareTo(x.Version) > 0).Count();
|
||||||
|
|
||||||
|
// Only add if the meatadata's version is the highest of all duplicates in the group
|
||||||
|
if (count == group.Count() - 1)
|
||||||
|
{
|
||||||
|
unique_list.Add(metadata);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
duplicate_list.Add(metadata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!duplicatesExist)
|
||||||
|
unique_list.Add(metadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (unique_list, duplicate_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PluginMetadata GetPluginMetadata(string pluginDirectory)
|
private static PluginMetadata GetPluginMetadata(string pluginDirectory)
|
||||||
|
|
|
||||||
|
|
@ -120,8 +120,8 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
|
|
||||||
var pythonPath = string.Empty;
|
var pythonPath = string.Empty;
|
||||||
|
|
||||||
if (MessageBox.Show("Flow detected you have installed Python plugins, " +
|
if (MessageBox.Show("Flow detected you have installed Python plugins, which " +
|
||||||
"would you like to install Python to run them? " +
|
"will need Python to run. Would you like to download Python? " +
|
||||||
Environment.NewLine + Environment.NewLine +
|
Environment.NewLine + Environment.NewLine +
|
||||||
"Click no if it's already installed, " +
|
"Click no if it's already installed, " +
|
||||||
"and you will be prompted to select the folder that contains the Python executable",
|
"and you will be prompted to select the folder that contains the Python executable",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
@ -28,52 +28,35 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
var path = Path.Combine(Constant.ProgramDirectory, JsonRPC);
|
var path = Path.Combine(Constant.ProgramDirectory, JsonRPC);
|
||||||
_startInfo.EnvironmentVariables["PYTHONPATH"] = path;
|
_startInfo.EnvironmentVariables["PYTHONPATH"] = path;
|
||||||
|
|
||||||
|
_startInfo.EnvironmentVariables["FLOW_VERSION"] = Constant.Version;
|
||||||
|
_startInfo.EnvironmentVariables["FLOW_PROGRAM_DIRECTORY"] = Constant.ProgramDirectory;
|
||||||
|
_startInfo.EnvironmentVariables["FLOW_APPLICATION_DIRECTORY"] = Constant.ApplicationDirectory;
|
||||||
|
|
||||||
|
|
||||||
//Add -B flag to tell python don't write .py[co] files. Because .pyc contains location infos which will prevent python portable
|
//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");
|
_startInfo.ArgumentList.Add("-B");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Task<Stream> ExecuteQueryAsync(Query query, CancellationToken token)
|
protected override Task<Stream> RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
JsonRPCServerRequestModel request = new JsonRPCServerRequestModel
|
|
||||||
{
|
|
||||||
Method = "query", Parameters = new object[] {query.Search},
|
|
||||||
};
|
|
||||||
|
|
||||||
_startInfo.ArgumentList[2] = request.ToString();
|
_startInfo.ArgumentList[2] = request.ToString();
|
||||||
|
|
||||||
// todo happlebao why context can't be used in constructor
|
|
||||||
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
|
|
||||||
|
|
||||||
return ExecuteAsync(_startInfo, token);
|
return ExecuteAsync(_startInfo, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string ExecuteCallback(JsonRPCRequestModel rpcRequest)
|
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
_startInfo.ArgumentList[2] = rpcRequest.ToString();
|
_startInfo.ArgumentList[2] = rpcRequest.ToString();
|
||||||
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
|
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
|
||||||
// TODO: Async Action
|
// TODO: Async Action
|
||||||
return Execute(_startInfo);
|
return Execute(_startInfo);
|
||||||
}
|
}
|
||||||
|
public override async Task InitAsync(PluginInitContext context)
|
||||||
protected override string ExecuteContextMenu(Result selectedResult)
|
|
||||||
{
|
{
|
||||||
JsonRPCServerRequestModel request = new JsonRPCServerRequestModel
|
|
||||||
{
|
|
||||||
Method = "context_menu", Parameters = new object[] {selectedResult.ContextData},
|
|
||||||
};
|
|
||||||
_startInfo.ArgumentList[2] = request.ToString();
|
|
||||||
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
|
|
||||||
|
|
||||||
// TODO: Async Action
|
|
||||||
return Execute(_startInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Task InitAsync(PluginInitContext context)
|
|
||||||
{
|
|
||||||
this.context = context;
|
|
||||||
_startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
|
_startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
|
||||||
_startInfo.ArgumentList.Add("");
|
_startInfo.ArgumentList.Add("");
|
||||||
return Task.CompletedTask;
|
await base.InitAsync(context);
|
||||||
|
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,35 +10,31 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
public static Query Build(string text, Dictionary<string, PluginPair> nonGlobalPlugins)
|
public static Query Build(string text, Dictionary<string, PluginPair> nonGlobalPlugins)
|
||||||
{
|
{
|
||||||
// replace multiple white spaces with one white space
|
// replace multiple white spaces with one white space
|
||||||
var terms = text.Split(new[] { Query.TermSeperater }, StringSplitOptions.RemoveEmptyEntries);
|
var terms = text.Split(Query.TermSeparator, StringSplitOptions.RemoveEmptyEntries);
|
||||||
if (terms.Length == 0)
|
if (terms.Length == 0)
|
||||||
{ // nothing was typed
|
{ // nothing was typed
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var rawQuery = string.Join(Query.TermSeperater, terms);
|
var rawQuery = string.Join(Query.TermSeparator, terms);
|
||||||
string actionKeyword, search;
|
string actionKeyword, search;
|
||||||
string possibleActionKeyword = terms[0];
|
string possibleActionKeyword = terms[0];
|
||||||
List<string> actionParameters;
|
string[] searchTerms;
|
||||||
|
|
||||||
if (nonGlobalPlugins.TryGetValue(possibleActionKeyword, out var pluginPair) && !pluginPair.Metadata.Disabled)
|
if (nonGlobalPlugins.TryGetValue(possibleActionKeyword, out var pluginPair) && !pluginPair.Metadata.Disabled)
|
||||||
{ // use non global plugin for query
|
{ // use non global plugin for query
|
||||||
actionKeyword = possibleActionKeyword;
|
actionKeyword = possibleActionKeyword;
|
||||||
actionParameters = terms.Skip(1).ToList();
|
search = terms.Length > 1 ? rawQuery[(actionKeyword.Length + 1)..] : string.Empty;
|
||||||
search = actionParameters.Count > 0 ? rawQuery.Substring(actionKeyword.Length + 1) : string.Empty;
|
searchTerms = terms[1..];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // non action keyword
|
{ // non action keyword
|
||||||
actionKeyword = string.Empty;
|
actionKeyword = string.Empty;
|
||||||
search = rawQuery;
|
search = rawQuery;
|
||||||
|
searchTerms = terms;
|
||||||
}
|
}
|
||||||
|
|
||||||
var query = new Query
|
var query = new Query(rawQuery, search,terms, searchTerms, actionKeyword);
|
||||||
{
|
|
||||||
Terms = terms,
|
|
||||||
RawQuery = rawQuery,
|
|
||||||
ActionKeyword = actionKeyword,
|
|
||||||
Search = search
|
|
||||||
};
|
|
||||||
|
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,8 @@ namespace Flow.Launcher.Core.Resource
|
||||||
public static Language German = new Language("de", "Deutsch");
|
public static Language German = new Language("de", "Deutsch");
|
||||||
public static Language Korean = new Language("ko", "한국어");
|
public static Language Korean = new Language("ko", "한국어");
|
||||||
public static Language Serbian = new Language("sr", "Srpski");
|
public static Language Serbian = new Language("sr", "Srpski");
|
||||||
public static Language Portuguese_BR = new Language("pt-br", "Português (Brasil)");
|
public static Language Portuguese_Portugal = new Language("pt-pt", "Português");
|
||||||
|
public static Language Portuguese_Brazil = new Language("pt-br", "Português (Brasil)");
|
||||||
public static Language Italian = new Language("it", "Italiano");
|
public static Language Italian = new Language("it", "Italiano");
|
||||||
public static Language Norwegian_Bokmal = new Language("nb-NO", "Norsk Bokmål");
|
public static Language Norwegian_Bokmal = new Language("nb-NO", "Norsk Bokmål");
|
||||||
public static Language Slovak = new Language("sk", "Slovenský");
|
public static Language Slovak = new Language("sk", "Slovenský");
|
||||||
|
|
@ -40,7 +41,8 @@ namespace Flow.Launcher.Core.Resource
|
||||||
German,
|
German,
|
||||||
Korean,
|
Korean,
|
||||||
Serbian,
|
Serbian,
|
||||||
Portuguese_BR,
|
Portuguese_Portugal,
|
||||||
|
Portuguese_Brazil,
|
||||||
Italian,
|
Italian,
|
||||||
Norwegian_Bokmal,
|
Norwegian_Bokmal,
|
||||||
Slovak,
|
Slovak,
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,8 @@ using Flow.Launcher.Infrastructure;
|
||||||
using Flow.Launcher.Infrastructure.Logger;
|
using Flow.Launcher.Infrastructure.Logger;
|
||||||
using Flow.Launcher.Infrastructure.UserSettings;
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
using Flow.Launcher.Plugin;
|
using Flow.Launcher.Plugin;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Flow.Launcher.Core.Resource
|
namespace Flow.Launcher.Core.Resource
|
||||||
{
|
{
|
||||||
|
|
@ -94,9 +96,13 @@ namespace Flow.Launcher.Core.Resource
|
||||||
{
|
{
|
||||||
LoadLanguage(language);
|
LoadLanguage(language);
|
||||||
}
|
}
|
||||||
UpdatePluginMetadataTranslations();
|
|
||||||
Settings.Language = language.LanguageCode;
|
Settings.Language = language.LanguageCode;
|
||||||
|
CultureInfo.CurrentCulture = new CultureInfo(language.LanguageCode);
|
||||||
|
CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture;
|
||||||
|
Task.Run(() =>
|
||||||
|
{
|
||||||
|
UpdatePluginMetadataTranslations();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool PromptShouldUsePinyin(string languageCodeToSet)
|
public bool PromptShouldUsePinyin(string languageCodeToSet)
|
||||||
|
|
|
||||||
|
|
@ -145,11 +145,9 @@ namespace Flow.Launcher.Core.Resource
|
||||||
public ResourceDictionary GetResourceDictionary()
|
public ResourceDictionary GetResourceDictionary()
|
||||||
{
|
{
|
||||||
var dict = CurrentThemeResourceDictionary();
|
var dict = CurrentThemeResourceDictionary();
|
||||||
|
|
||||||
Style queryBoxStyle = dict["QueryBoxStyle"] as Style;
|
if (dict["QueryBoxStyle"] is Style queryBoxStyle &&
|
||||||
Style querySuggestionBoxStyle = dict["QuerySuggestionBoxStyle"] as Style;
|
dict["QuerySuggestionBoxStyle"] is Style querySuggestionBoxStyle)
|
||||||
|
|
||||||
if (queryBoxStyle != null && querySuggestionBoxStyle != null)
|
|
||||||
{
|
{
|
||||||
var fontFamily = new FontFamily(Settings.QueryBoxFont);
|
var fontFamily = new FontFamily(Settings.QueryBoxFont);
|
||||||
var fontStyle = FontHelper.GetFontStyleFromInvariantStringOrNormal(Settings.QueryBoxFontStyle);
|
var fontStyle = FontHelper.GetFontStyleFromInvariantStringOrNormal(Settings.QueryBoxFontStyle);
|
||||||
|
|
@ -174,11 +172,12 @@ namespace Flow.Launcher.Core.Resource
|
||||||
querySuggestionBoxStyle.Setters.Add(new Setter(TextBox.FontStretchProperty, fontStretch));
|
querySuggestionBoxStyle.Setters.Add(new Setter(TextBox.FontStretchProperty, fontStretch));
|
||||||
}
|
}
|
||||||
|
|
||||||
Style resultItemStyle = dict["ItemTitleStyle"] as Style;
|
if (dict["ItemTitleStyle"] is Style resultItemStyle &&
|
||||||
Style resultSubItemStyle = dict["ItemSubTitleStyle"] as Style;
|
dict["ItemSubTitleStyle"] is Style resultSubItemStyle &&
|
||||||
Style resultItemSelectedStyle = dict["ItemTitleSelectedStyle"] as Style;
|
dict["ItemSubTitleSelectedStyle"] is Style resultSubItemSelectedStyle &&
|
||||||
Style resultSubItemSelectedStyle = dict["ItemSubTitleSelectedStyle"] as Style;
|
dict["ItemTitleSelectedStyle"] is Style resultItemSelectedStyle &&
|
||||||
if (resultItemStyle != null && resultSubItemStyle != null && resultSubItemSelectedStyle != null && resultItemSelectedStyle != null)
|
dict["ItemHotkeyStyle"] is Style resultHotkeyItemStyle &&
|
||||||
|
dict["ItemHotkeySelectedStyle"] is Style resultHotkeyItemSelectedStyle)
|
||||||
{
|
{
|
||||||
Setter fontFamily = new Setter(TextBlock.FontFamilyProperty, new FontFamily(Settings.ResultFont));
|
Setter fontFamily = new Setter(TextBlock.FontFamilyProperty, new FontFamily(Settings.ResultFont));
|
||||||
Setter fontStyle = new Setter(TextBlock.FontStyleProperty, FontHelper.GetFontStyleFromInvariantStringOrNormal(Settings.ResultFontStyle));
|
Setter fontStyle = new Setter(TextBlock.FontStyleProperty, FontHelper.GetFontStyleFromInvariantStringOrNormal(Settings.ResultFontStyle));
|
||||||
|
|
@ -186,24 +185,15 @@ namespace Flow.Launcher.Core.Resource
|
||||||
Setter fontStretch = new Setter(TextBlock.FontStretchProperty, FontHelper.GetFontStretchFromInvariantStringOrNormal(Settings.ResultFontStretch));
|
Setter fontStretch = new Setter(TextBlock.FontStretchProperty, FontHelper.GetFontStretchFromInvariantStringOrNormal(Settings.ResultFontStretch));
|
||||||
|
|
||||||
Setter[] setters = { fontFamily, fontStyle, fontWeight, fontStretch };
|
Setter[] setters = { fontFamily, fontStyle, fontWeight, fontStretch };
|
||||||
Array.ForEach(new[] { resultItemStyle, resultSubItemStyle, resultItemSelectedStyle, resultSubItemSelectedStyle }, o => Array.ForEach(setters, p => o.Setters.Add(p)));
|
Array.ForEach(
|
||||||
|
new[] { resultItemStyle, resultSubItemStyle, resultItemSelectedStyle, resultSubItemSelectedStyle, resultHotkeyItemStyle, resultHotkeyItemSelectedStyle }, o
|
||||||
|
=> Array.ForEach(setters, p => o.Setters.Add(p)));
|
||||||
}
|
}
|
||||||
|
/* Ignore Theme Window Width and use setting */
|
||||||
var windowStyle = dict["WindowStyle"] as Style;
|
var windowStyle = dict["WindowStyle"] as Style;
|
||||||
|
var width = Settings.WindowSize;
|
||||||
var width = windowStyle?.Setters.OfType<Setter>().Where(x => x.Property.Name == "Width")
|
windowStyle.Setters.Add(new Setter(Window.WidthProperty, width));
|
||||||
.Select(x => x.Value).FirstOrDefault();
|
|
||||||
|
|
||||||
if (width == null)
|
|
||||||
{
|
|
||||||
windowStyle = dict["BaseWindowStyle"] as Style;
|
|
||||||
|
|
||||||
width = windowStyle?.Setters.OfType<Setter>().Where(x => x.Property.Name == "Width")
|
|
||||||
.Select(x => x.Value).FirstOrDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
mainWindowWidth = (double)width;
|
mainWindowWidth = (double)width;
|
||||||
|
|
||||||
return dict;
|
return dict;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -236,17 +226,19 @@ namespace Flow.Launcher.Core.Resource
|
||||||
|
|
||||||
public void AddDropShadowEffectToCurrentTheme()
|
public void AddDropShadowEffectToCurrentTheme()
|
||||||
{
|
{
|
||||||
var dict = CurrentThemeResourceDictionary();
|
var dict = GetResourceDictionary();
|
||||||
|
|
||||||
var windowBorderStyle = dict["WindowBorderStyle"] as Style;
|
var windowBorderStyle = dict["WindowBorderStyle"] as Style;
|
||||||
|
|
||||||
var effectSetter = new Setter();
|
var effectSetter = new Setter
|
||||||
effectSetter.Property = Border.EffectProperty;
|
|
||||||
effectSetter.Value = new DropShadowEffect
|
|
||||||
{
|
{
|
||||||
Opacity = 0.9,
|
Property = Border.EffectProperty,
|
||||||
ShadowDepth = 2,
|
Value = new DropShadowEffect
|
||||||
BlurRadius = 15
|
{
|
||||||
|
Opacity = 0.4,
|
||||||
|
ShadowDepth = 2,
|
||||||
|
BlurRadius = 15
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var marginSetter = windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.MarginProperty) as Setter;
|
var marginSetter = windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.MarginProperty) as Setter;
|
||||||
|
|
@ -261,7 +253,7 @@ namespace Flow.Launcher.Core.Resource
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var baseMargin = (Thickness) marginSetter.Value;
|
var baseMargin = (Thickness)marginSetter.Value;
|
||||||
var newMargin = new Thickness(
|
var newMargin = new Thickness(
|
||||||
baseMargin.Left + ShadowExtraMargin,
|
baseMargin.Left + ShadowExtraMargin,
|
||||||
baseMargin.Top + ShadowExtraMargin,
|
baseMargin.Top + ShadowExtraMargin,
|
||||||
|
|
@ -282,8 +274,8 @@ namespace Flow.Launcher.Core.Resource
|
||||||
|
|
||||||
var effectSetter = windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.EffectProperty) as Setter;
|
var effectSetter = windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.EffectProperty) as Setter;
|
||||||
var marginSetter = windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.MarginProperty) as Setter;
|
var marginSetter = windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.MarginProperty) as Setter;
|
||||||
|
|
||||||
if(effectSetter != null)
|
if (effectSetter != null)
|
||||||
{
|
{
|
||||||
windowBorderStyle.Setters.Remove(effectSetter);
|
windowBorderStyle.Setters.Remove(effectSetter);
|
||||||
}
|
}
|
||||||
|
|
@ -371,11 +363,9 @@ namespace Flow.Launcher.Core.Resource
|
||||||
private void SetWindowAccent(Window w, AccentState state)
|
private void SetWindowAccent(Window w, AccentState state)
|
||||||
{
|
{
|
||||||
var windowHelper = new WindowInteropHelper(w);
|
var windowHelper = new WindowInteropHelper(w);
|
||||||
|
|
||||||
// this determines the width of the main query window
|
|
||||||
w.Width = mainWindowWidth;
|
|
||||||
windowHelper.EnsureHandle();
|
windowHelper.EnsureHandle();
|
||||||
|
|
||||||
var accent = new AccentPolicy { AccentState = state };
|
var accent = new AccentPolicy { AccentState = state };
|
||||||
var accentStructSize = Marshal.SizeOf(accent);
|
var accentStructSize = Marshal.SizeOf(accent);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ using Flow.Launcher.Infrastructure.Logger;
|
||||||
using Flow.Launcher.Infrastructure.UserSettings;
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
using Flow.Launcher.Plugin;
|
using Flow.Launcher.Plugin;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace Flow.Launcher.Core
|
namespace Flow.Launcher.Core
|
||||||
{
|
{
|
||||||
|
|
@ -28,21 +29,21 @@ namespace Flow.Launcher.Core
|
||||||
GitHubRepository = gitHubRepository;
|
GitHubRepository = gitHubRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateApp(IPublicAPI api, bool silentUpdate = true)
|
private SemaphoreSlim UpdateLock { get; } = new SemaphoreSlim(1);
|
||||||
|
|
||||||
|
public async Task UpdateAppAsync(IPublicAPI api, bool silentUpdate = true)
|
||||||
{
|
{
|
||||||
|
await UpdateLock.WaitAsync();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
UpdateInfo newUpdateInfo;
|
|
||||||
|
|
||||||
if (!silentUpdate)
|
if (!silentUpdate)
|
||||||
api.ShowMsg(api.GetTranslation("pleaseWait"),
|
api.ShowMsg(api.GetTranslation("pleaseWait"),
|
||||||
api.GetTranslation("update_flowlauncher_update_check"));
|
api.GetTranslation("update_flowlauncher_update_check"));
|
||||||
|
|
||||||
using var updateManager = await GitHubUpdateManager(GitHubRepository).ConfigureAwait(false);
|
using var updateManager = await GitHubUpdateManager(GitHubRepository).ConfigureAwait(false);
|
||||||
|
|
||||||
|
|
||||||
// UpdateApp CheckForUpdate will return value only if the app is squirrel installed
|
// UpdateApp CheckForUpdate will return value only if the app is squirrel installed
|
||||||
newUpdateInfo = await updateManager.CheckForUpdate().NonNull().ConfigureAwait(false);
|
var newUpdateInfo = await updateManager.CheckForUpdate().NonNull().ConfigureAwait(false);
|
||||||
|
|
||||||
var newReleaseVersion = Version.Parse(newUpdateInfo.FutureReleaseEntry.Version.ToString());
|
var newReleaseVersion = Version.Parse(newUpdateInfo.FutureReleaseEntry.Version.ToString());
|
||||||
var currentVersion = Version.Parse(Constant.Version);
|
var currentVersion = Version.Parse(Constant.Version);
|
||||||
|
|
@ -58,7 +59,7 @@ namespace Flow.Launcher.Core
|
||||||
|
|
||||||
if (!silentUpdate)
|
if (!silentUpdate)
|
||||||
api.ShowMsg(api.GetTranslation("update_flowlauncher_update_found"),
|
api.ShowMsg(api.GetTranslation("update_flowlauncher_update_found"),
|
||||||
api.GetTranslation("update_flowlauncher_updating"));
|
api.GetTranslation("update_flowlauncher_updating"));
|
||||||
|
|
||||||
await updateManager.DownloadReleases(newUpdateInfo.ReleasesToApply).ConfigureAwait(false);
|
await updateManager.DownloadReleases(newUpdateInfo.ReleasesToApply).ConfigureAwait(false);
|
||||||
|
|
||||||
|
|
@ -70,8 +71,8 @@ namespace Flow.Launcher.Core
|
||||||
FilesFolders.CopyAll(DataLocation.PortableDataPath, targetDestination);
|
FilesFolders.CopyAll(DataLocation.PortableDataPath, targetDestination);
|
||||||
if (!FilesFolders.VerifyBothFolderFilesEqual(DataLocation.PortableDataPath, targetDestination))
|
if (!FilesFolders.VerifyBothFolderFilesEqual(DataLocation.PortableDataPath, targetDestination))
|
||||||
MessageBox.Show(string.Format(api.GetTranslation("update_flowlauncher_fail_moving_portable_user_profile_data"),
|
MessageBox.Show(string.Format(api.GetTranslation("update_flowlauncher_fail_moving_portable_user_profile_data"),
|
||||||
DataLocation.PortableDataPath,
|
DataLocation.PortableDataPath,
|
||||||
targetDestination));
|
targetDestination));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -87,12 +88,15 @@ namespace Flow.Launcher.Core
|
||||||
UpdateManager.RestartApp(Constant.ApplicationFileName);
|
UpdateManager.RestartApp(Constant.ApplicationFileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e) when (e is HttpRequestException || e is WebException || e is SocketException || e.InnerException is TimeoutException)
|
catch (Exception e) when (e is HttpRequestException or WebException or SocketException || e.InnerException is TimeoutException)
|
||||||
{
|
{
|
||||||
Log.Exception($"|Updater.UpdateApp|Check your connection and proxy settings to github-cloud.s3.amazonaws.com.", e);
|
Log.Exception($"|Updater.UpdateApp|Check your connection and proxy settings to github-cloud.s3.amazonaws.com.", e);
|
||||||
api.ShowMsg(api.GetTranslation("update_flowlauncher_fail"),
|
api.ShowMsg(api.GetTranslation("update_flowlauncher_fail"),
|
||||||
api.GetTranslation("update_flowlauncher_check_connection"));
|
api.GetTranslation("update_flowlauncher_check_connection"));
|
||||||
return;
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
UpdateLock.Release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -115,13 +119,16 @@ namespace Flow.Launcher.Core
|
||||||
var uri = new Uri(repository);
|
var uri = new Uri(repository);
|
||||||
var api = $"https://api.github.com/repos{uri.AbsolutePath}/releases";
|
var api = $"https://api.github.com/repos{uri.AbsolutePath}/releases";
|
||||||
|
|
||||||
var jsonStream = await Http.GetStreamAsync(api).ConfigureAwait(false);
|
await using var jsonStream = await Http.GetStreamAsync(api).ConfigureAwait(false);
|
||||||
|
|
||||||
var releases = await System.Text.Json.JsonSerializer.DeserializeAsync<List<GithubRelease>>(jsonStream).ConfigureAwait(false);
|
var releases = await System.Text.Json.JsonSerializer.DeserializeAsync<List<GithubRelease>>(jsonStream).ConfigureAwait(false);
|
||||||
var latest = releases.Where(r => !r.Prerelease).OrderByDescending(r => r.PublishedAt).First();
|
var latest = releases.Where(r => !r.Prerelease).OrderByDescending(r => r.PublishedAt).First();
|
||||||
var latestUrl = latest.HtmlUrl.Replace("/tag/", "/download/");
|
var latestUrl = latest.HtmlUrl.Replace("/tag/", "/download/");
|
||||||
|
|
||||||
var client = new WebClient { Proxy = Http.WebProxy };
|
var client = new WebClient
|
||||||
|
{
|
||||||
|
Proxy = Http.WebProxy
|
||||||
|
};
|
||||||
var downloader = new FileDownloader(client);
|
var downloader = new FileDownloader(client);
|
||||||
|
|
||||||
var manager = new UpdateManager(latestUrl, urlDownloader: downloader);
|
var manager = new UpdateManager(latestUrl, urlDownloader: downloader);
|
||||||
|
|
|
||||||
|
|
@ -33,10 +33,18 @@ namespace Flow.Launcher.Infrastructure
|
||||||
|
|
||||||
public static readonly string QueryTextBoxIconImagePath = $"{ProgramDirectory}\\Images\\mainsearch.svg";
|
public static readonly string QueryTextBoxIconImagePath = $"{ProgramDirectory}\\Images\\mainsearch.svg";
|
||||||
|
|
||||||
public const string DefaultTheme = "Darker";
|
public const string DefaultTheme = "Win11Light";
|
||||||
|
|
||||||
|
public const string Light = "Light";
|
||||||
|
public const string Dark = "Dark";
|
||||||
|
public const string System = "System";
|
||||||
|
|
||||||
public const string Themes = "Themes";
|
public const string Themes = "Themes";
|
||||||
|
public const string Settings = "Settings";
|
||||||
|
public const string Logs = "Logs";
|
||||||
|
|
||||||
public const string Website = "https://flow-launcher.github.io";
|
public const string Website = "https://flow-launcher.github.io";
|
||||||
|
public const string GitHub = "https://github.com/Flow-Launcher/Flow.Launcher";
|
||||||
|
public const string Docs = "https://flow-launcher.github.io/docs";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||||
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
|
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
|
||||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
|
@ -21,7 +22,6 @@
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|
@ -32,7 +32,6 @@
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
|
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|
@ -50,11 +49,18 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Ben.Demystifier" Version="0.4.1" />
|
<PackageReference Include="Ben.Demystifier" Version="0.4.1" />
|
||||||
|
<PackageReference Include="Fody" Version="6.5.5">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="16.10.56" />
|
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="16.10.56" />
|
||||||
<PackageReference Include="NLog" Version="4.7.10" />
|
<PackageReference Include="NLog" Version="4.7.10" />
|
||||||
<PackageReference Include="NLog.Schema" Version="4.7.10" />
|
<PackageReference Include="NLog.Schema" Version="4.7.10" />
|
||||||
<PackageReference Include="NLog.Web.AspNetCore" Version="4.12.0" />
|
<PackageReference Include="NLog.Web.AspNetCore" Version="4.13.0" />
|
||||||
<PackageReference Include="System.Drawing.Common" Version="4.7.0" />
|
<PackageReference Include="PropertyChanged.Fody" Version="3.4.0" />
|
||||||
|
<PackageReference Include="System.Drawing.Common" Version="5.0.2" />
|
||||||
|
<!--ToolGood.Words.Pinyin v3.0.2.6 results in high memory usage when search with pinyin is enabled-->
|
||||||
|
<!--Bumping to it or higher needs to test and ensure this is no longer a problem-->
|
||||||
<PackageReference Include="ToolGood.Words.Pinyin" Version="3.0.1.4" />
|
<PackageReference Include="ToolGood.Words.Pinyin" Version="3.0.1.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,13 +9,14 @@ namespace Flow.Launcher.Infrastructure.Hotkey
|
||||||
/// Listens keyboard globally.
|
/// Listens keyboard globally.
|
||||||
/// <remarks>Uses WH_KEYBOARD_LL.</remarks>
|
/// <remarks>Uses WH_KEYBOARD_LL.</remarks>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class GlobalHotkey : IDisposable
|
public unsafe class GlobalHotkey : IDisposable
|
||||||
{
|
{
|
||||||
private static GlobalHotkey instance;
|
private static readonly IntPtr hookId;
|
||||||
private InterceptKeys.LowLevelKeyboardProc hookedLowLevelKeyboardProc;
|
|
||||||
private IntPtr hookId = IntPtr.Zero;
|
|
||||||
|
|
||||||
public delegate bool KeyboardCallback(KeyEvent keyEvent, int vkCode, SpecialKeyState state);
|
public delegate bool KeyboardCallback(KeyEvent keyEvent, int vkCode, SpecialKeyState state);
|
||||||
public event KeyboardCallback hookedKeyboardCallback;
|
internal static Func<KeyEvent, int, SpecialKeyState, bool> hookedKeyboardCallback;
|
||||||
|
|
||||||
//Modifier key constants
|
//Modifier key constants
|
||||||
private const int VK_SHIFT = 0x10;
|
private const int VK_SHIFT = 0x10;
|
||||||
|
|
@ -23,27 +24,13 @@ namespace Flow.Launcher.Infrastructure.Hotkey
|
||||||
private const int VK_ALT = 0x12;
|
private const int VK_ALT = 0x12;
|
||||||
private const int VK_WIN = 91;
|
private const int VK_WIN = 91;
|
||||||
|
|
||||||
public static GlobalHotkey Instance
|
static GlobalHotkey()
|
||||||
{
|
{
|
||||||
get
|
|
||||||
{
|
|
||||||
if (instance == null)
|
|
||||||
{
|
|
||||||
instance = new GlobalHotkey();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private GlobalHotkey()
|
|
||||||
{
|
|
||||||
// We have to store the LowLevelKeyboardProc, so that it is not garbage collected runtime
|
|
||||||
hookedLowLevelKeyboardProc = LowLevelKeyboardProc;
|
|
||||||
// Set the hook
|
// Set the hook
|
||||||
hookId = InterceptKeys.SetHook(hookedLowLevelKeyboardProc);
|
hookId = InterceptKeys.SetHook(& LowLevelKeyboardProc);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SpecialKeyState CheckModifiers()
|
public static SpecialKeyState CheckModifiers()
|
||||||
{
|
{
|
||||||
SpecialKeyState state = new SpecialKeyState();
|
SpecialKeyState state = new SpecialKeyState();
|
||||||
if ((InterceptKeys.GetKeyState(VK_SHIFT) & 0x8000) != 0)
|
if ((InterceptKeys.GetKeyState(VK_SHIFT) & 0x8000) != 0)
|
||||||
|
|
@ -70,8 +57,8 @@ namespace Flow.Launcher.Infrastructure.Hotkey
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.NoInlining)]
|
[UnmanagedCallersOnly]
|
||||||
private IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam)
|
private static IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
bool continues = true;
|
bool continues = true;
|
||||||
|
|
||||||
|
|
@ -91,17 +78,17 @@ namespace Flow.Launcher.Infrastructure.Hotkey
|
||||||
{
|
{
|
||||||
return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam);
|
return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam);
|
||||||
}
|
}
|
||||||
return (IntPtr)1;
|
return (IntPtr)(-1);
|
||||||
}
|
|
||||||
|
|
||||||
~GlobalHotkey()
|
|
||||||
{
|
|
||||||
Dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
InterceptKeys.UnhookWindowsHookEx(hookId);
|
InterceptKeys.UnhookWindowsHookEx(hookId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~GlobalHotkey()
|
||||||
|
{
|
||||||
|
Dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4,13 +4,13 @@ using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Flow.Launcher.Infrastructure.Hotkey
|
namespace Flow.Launcher.Infrastructure.Hotkey
|
||||||
{
|
{
|
||||||
internal static class InterceptKeys
|
internal static unsafe class InterceptKeys
|
||||||
{
|
{
|
||||||
public delegate IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam);
|
public delegate IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam);
|
||||||
|
|
||||||
private const int WH_KEYBOARD_LL = 13;
|
private const int WH_KEYBOARD_LL = 13;
|
||||||
|
|
||||||
public static IntPtr SetHook(LowLevelKeyboardProc proc)
|
public static IntPtr SetHook(delegate* unmanaged<int, UIntPtr, IntPtr, IntPtr> proc)
|
||||||
{
|
{
|
||||||
using (Process curProcess = Process.GetCurrentProcess())
|
using (Process curProcess = Process.GetCurrentProcess())
|
||||||
using (ProcessModule curModule = curProcess.MainModule)
|
using (ProcessModule curModule = curProcess.MainModule)
|
||||||
|
|
@ -20,7 +20,7 @@ namespace Flow.Launcher.Infrastructure.Hotkey
|
||||||
}
|
}
|
||||||
|
|
||||||
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||||
public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
|
public static extern IntPtr SetWindowsHookEx(int idHook, delegate* unmanaged<int, UIntPtr, IntPtr, IntPtr> lpfn, IntPtr hMod, uint dwThreadId);
|
||||||
|
|
||||||
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
using Flow.Launcher.Plugin;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Infrastructure.UserSettings
|
||||||
|
{
|
||||||
|
public class CustomBrowserViewModel : BaseModel
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Path { get; set; }
|
||||||
|
public string PrivateArg { get; set; }
|
||||||
|
public bool EnablePrivate { get; set; }
|
||||||
|
public bool OpenInTab { get; set; } = true;
|
||||||
|
[JsonIgnore]
|
||||||
|
public bool OpenInNewWindow => !OpenInTab;
|
||||||
|
public bool Editable { get; set; } = true;
|
||||||
|
|
||||||
|
public CustomBrowserViewModel Copy()
|
||||||
|
{
|
||||||
|
return new CustomBrowserViewModel
|
||||||
|
{
|
||||||
|
Name = Name,
|
||||||
|
Path = Path,
|
||||||
|
OpenInTab = OpenInTab,
|
||||||
|
PrivateArg = PrivateArg,
|
||||||
|
EnablePrivate = EnablePrivate,
|
||||||
|
Editable = Editable
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
using Flow.Launcher.Plugin;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.ViewModel
|
||||||
|
{
|
||||||
|
public class CustomExplorerViewModel : BaseModel
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Path { get; set; }
|
||||||
|
public string FileArgument { get; set; } = "\"%d\"";
|
||||||
|
public string DirectoryArgument { get; set; } = "\"%d\"";
|
||||||
|
public bool Editable { get; init; } = true;
|
||||||
|
|
||||||
|
public CustomExplorerViewModel Copy()
|
||||||
|
{
|
||||||
|
return new CustomExplorerViewModel
|
||||||
|
{
|
||||||
|
Name = Name,
|
||||||
|
Path = Path,
|
||||||
|
FileArgument = FileArgument,
|
||||||
|
DirectoryArgument = DirectoryArgument,
|
||||||
|
Editable = Editable
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Flow.Launcher.Plugin;
|
using Flow.Launcher.Plugin;
|
||||||
|
|
||||||
namespace Flow.Launcher.Infrastructure.UserSettings
|
namespace Flow.Launcher.Infrastructure.UserSettings
|
||||||
|
|
@ -15,13 +15,24 @@ namespace Flow.Launcher.Infrastructure.UserSettings
|
||||||
if (Plugins.ContainsKey(metadata.ID))
|
if (Plugins.ContainsKey(metadata.ID))
|
||||||
{
|
{
|
||||||
var settings = Plugins[metadata.ID];
|
var settings = Plugins[metadata.ID];
|
||||||
|
|
||||||
// TODO: Remove. This is backwards compatibility for 1.8.0 release.
|
|
||||||
// Introduced two new action keywords in Explorer, so need to update plugin setting in the UserData folder.
|
|
||||||
if (metadata.ID == "572be03c74c642baae319fc283e561a8" && metadata.ActionKeywords.Count > settings.ActionKeywords.Count)
|
if (metadata.ID == "572be03c74c642baae319fc283e561a8" && metadata.ActionKeywords.Count > settings.ActionKeywords.Count)
|
||||||
{
|
{
|
||||||
settings.ActionKeywords.Add(Query.GlobalPluginWildcardSign); // for index search
|
// TODO: Remove. This is backwards compatibility for Explorer 1.8.0 release.
|
||||||
settings.ActionKeywords.Add(Query.GlobalPluginWildcardSign); // for path search
|
// Introduced two new action keywords in Explorer, so need to update plugin setting in the UserData folder.
|
||||||
|
if (settings.Version.CompareTo("1.8.0") < 0)
|
||||||
|
{
|
||||||
|
settings.ActionKeywords.Add(Query.GlobalPluginWildcardSign); // for index search
|
||||||
|
settings.ActionKeywords.Add(Query.GlobalPluginWildcardSign); // for path search
|
||||||
|
settings.ActionKeywords.Add(Query.GlobalPluginWildcardSign); // for quick access action keyword
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Remove. This is backwards compatibility for Explorer 1.9.0 release.
|
||||||
|
// Introduced a new action keywords in Explorer since 1.8.0, so need to update plugin setting in the UserData folder.
|
||||||
|
if (settings.Version.CompareTo("1.8.0") > 0)
|
||||||
|
{
|
||||||
|
settings.ActionKeywords.Add(Query.GlobalPluginWildcardSign); // for quick access action keyword
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(settings.Version))
|
if (string.IsNullOrEmpty(settings.Version))
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,28 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
using Flow.Launcher.Plugin;
|
using Flow.Launcher.Plugin;
|
||||||
using Flow.Launcher.Plugin.SharedModels;
|
using Flow.Launcher.Plugin.SharedModels;
|
||||||
|
using Flow.Launcher;
|
||||||
|
using Flow.Launcher.ViewModel;
|
||||||
|
|
||||||
namespace Flow.Launcher.Infrastructure.UserSettings
|
namespace Flow.Launcher.Infrastructure.UserSettings
|
||||||
{
|
{
|
||||||
public class Settings : BaseModel
|
public class Settings : BaseModel
|
||||||
{
|
{
|
||||||
private string language = "en";
|
private string language = "en";
|
||||||
|
|
||||||
public string Hotkey { get; set; } = $"{KeyConstant.Alt} + {KeyConstant.Space}";
|
public string Hotkey { get; set; } = $"{KeyConstant.Alt} + {KeyConstant.Space}";
|
||||||
public string OpenResultModifiers { get; set; } = KeyConstant.Alt;
|
public string OpenResultModifiers { get; set; } = KeyConstant.Alt;
|
||||||
|
public string ColorScheme { get; set; } = "System";
|
||||||
public bool ShowOpenResultHotkey { get; set; } = true;
|
public bool ShowOpenResultHotkey { get; set; } = true;
|
||||||
|
public double WindowSize { get; set; } = 580;
|
||||||
|
|
||||||
public string Language
|
public string Language
|
||||||
{
|
{
|
||||||
get => language; set
|
get => language;
|
||||||
|
set
|
||||||
{
|
{
|
||||||
language = value;
|
language = value;
|
||||||
OnPropertyChanged();
|
OnPropertyChanged();
|
||||||
|
|
@ -32,6 +38,99 @@ namespace Flow.Launcher.Infrastructure.UserSettings
|
||||||
public string ResultFontStyle { get; set; }
|
public string ResultFontStyle { get; set; }
|
||||||
public string ResultFontWeight { get; set; }
|
public string ResultFontWeight { get; set; }
|
||||||
public string ResultFontStretch { get; set; }
|
public string ResultFontStretch { get; set; }
|
||||||
|
public bool UseGlyphIcons { get; set; } = true;
|
||||||
|
public bool UseAnimation { get; set; } = true;
|
||||||
|
public bool UseSound { get; set; } = true;
|
||||||
|
public bool FirstLaunch { get; set; } = true;
|
||||||
|
|
||||||
|
public int CustomExplorerIndex { get; set; } = 0;
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
public CustomExplorerViewModel CustomExplorer
|
||||||
|
{
|
||||||
|
get => CustomExplorerList[CustomExplorerIndex < CustomExplorerList.Count ? CustomExplorerIndex : 0];
|
||||||
|
set => CustomExplorerList[CustomExplorerIndex] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CustomExplorerViewModel> CustomExplorerList { get; set; } = new()
|
||||||
|
{
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Name = "Explorer",
|
||||||
|
Path = "explorer",
|
||||||
|
DirectoryArgument = "\"%d\"",
|
||||||
|
FileArgument = "/select, \"%f\"",
|
||||||
|
Editable = false
|
||||||
|
},
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Name = "Total Commander",
|
||||||
|
Path = @"C:\Program Files\totalcmd\TOTALCMD64.exe",
|
||||||
|
DirectoryArgument = "/O /A /S /T \"%d\"",
|
||||||
|
FileArgument = "/O /A /S /T \"%f\""
|
||||||
|
},
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Name = "Directory Opus",
|
||||||
|
Path = @"C:\Program Files\GPSoftware\Directory Opus\dopusrt.exe",
|
||||||
|
DirectoryArgument = "/cmd Go \"%d\" NEW",
|
||||||
|
FileArgument = "/cmd Go \"%f\" NEW"
|
||||||
|
|
||||||
|
},
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Name = "Files",
|
||||||
|
Path = "Files",
|
||||||
|
DirectoryArgument = "-select \"%d\"",
|
||||||
|
FileArgument = "-select \"%f\""
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public int CustomBrowserIndex { get; set; } = 0;
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
public CustomBrowserViewModel CustomBrowser
|
||||||
|
{
|
||||||
|
get => CustomBrowserList[CustomBrowserIndex];
|
||||||
|
set => CustomBrowserList[CustomBrowserIndex] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CustomBrowserViewModel> CustomBrowserList { get; set; } = new()
|
||||||
|
{
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Name = "Default",
|
||||||
|
Path = "*",
|
||||||
|
PrivateArg = "",
|
||||||
|
EnablePrivate = false,
|
||||||
|
Editable = false
|
||||||
|
},
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Name = "Google Chrome",
|
||||||
|
Path = "chrome",
|
||||||
|
PrivateArg = "-incognito",
|
||||||
|
EnablePrivate = false,
|
||||||
|
Editable = false
|
||||||
|
},
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Name = "Mozilla Firefox",
|
||||||
|
Path = "firefox",
|
||||||
|
PrivateArg = "-private",
|
||||||
|
EnablePrivate = false,
|
||||||
|
Editable = false
|
||||||
|
}
|
||||||
|
,
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Name = "MS Edge",
|
||||||
|
Path = "msedge",
|
||||||
|
PrivateArg = "-inPrivate",
|
||||||
|
EnablePrivate = false,
|
||||||
|
Editable = false
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -51,7 +150,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var precisionScore = (SearchPrecisionScore)Enum
|
var precisionScore = (SearchPrecisionScore)Enum
|
||||||
.Parse(typeof(SearchPrecisionScore), value);
|
.Parse(typeof(SearchPrecisionScore), value);
|
||||||
|
|
||||||
QuerySearchPrecision = precisionScore;
|
QuerySearchPrecision = precisionScore;
|
||||||
StringMatcher.Instance.UserSettingSearchPrecision = precisionScore;
|
StringMatcher.Instance.UserSettingSearchPrecision = precisionScore;
|
||||||
|
|
@ -81,8 +180,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
|
||||||
public bool DontPromptUpdateMsg { get; set; }
|
public bool DontPromptUpdateMsg { get; set; }
|
||||||
public bool EnableUpdateLog { get; set; }
|
public bool EnableUpdateLog { get; set; }
|
||||||
|
|
||||||
public bool StartFlowLauncherOnSystemStartup { get; set; } = true;
|
public bool StartFlowLauncherOnSystemStartup { get; set; } = false;
|
||||||
public bool HideOnStartup { get; set; }
|
public bool HideOnStartup { get; set; } = true;
|
||||||
bool _hideNotifyIcon { get; set; }
|
bool _hideNotifyIcon { get; set; }
|
||||||
public bool HideNotifyIcon
|
public bool HideNotifyIcon
|
||||||
{
|
{
|
||||||
|
|
@ -98,8 +197,6 @@ namespace Flow.Launcher.Infrastructure.UserSettings
|
||||||
public bool RememberLastLaunchLocation { get; set; }
|
public bool RememberLastLaunchLocation { get; set; }
|
||||||
public bool IgnoreHotkeysOnFullscreen { get; set; }
|
public bool IgnoreHotkeysOnFullscreen { get; set; }
|
||||||
|
|
||||||
public bool AutoHideScrollBar { get; set; }
|
|
||||||
|
|
||||||
public HttpProxy Proxy { get; set; } = new HttpProxy();
|
public HttpProxy Proxy { get; set; } = new HttpProxy();
|
||||||
|
|
||||||
[JsonConverter(typeof(JsonStringEnumConverter))]
|
[JsonConverter(typeof(JsonStringEnumConverter))]
|
||||||
|
|
@ -116,4 +213,11 @@ namespace Flow.Launcher.Infrastructure.UserSettings
|
||||||
Empty,
|
Empty,
|
||||||
Preserved
|
Preserved
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum ColorSchemes
|
||||||
|
{
|
||||||
|
System,
|
||||||
|
Light,
|
||||||
|
Dark
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -14,10 +14,10 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Version>2.0.0</Version>
|
<Version>2.1.0</Version>
|
||||||
<PackageVersion>2.0.0</PackageVersion>
|
<PackageVersion>2.1.0</PackageVersion>
|
||||||
<AssemblyVersion>2.0.0</AssemblyVersion>
|
<AssemblyVersion>2.1.0</AssemblyVersion>
|
||||||
<FileVersion>2.0.0</FileVersion>
|
<FileVersion>2.1.0</FileVersion>
|
||||||
<PackageId>Flow.Launcher.Plugin</PackageId>
|
<PackageId>Flow.Launcher.Plugin</PackageId>
|
||||||
<Authors>Flow-Launcher</Authors>
|
<Authors>Flow-Launcher</Authors>
|
||||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
|
|
@ -60,8 +60,13 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Fody" Version="6.5.4">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
|
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
|
||||||
<PackageReference Include="JetBrains.Annotations" Version="2019.1.3" />
|
<PackageReference Include="JetBrains.Annotations" Version="2021.2.0" />
|
||||||
|
<PackageReference Include="PropertyChanged.Fody" Version="3.4.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
11
Flow.Launcher.Plugin/GlyphInfo.cs
Normal file
11
Flow.Launcher.Plugin/GlyphInfo.cs
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Media;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Plugin
|
||||||
|
{
|
||||||
|
public record GlyphInfo(string FontFamily, string Glyph);
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
namespace Flow.Launcher.Plugin
|
using System.Globalization;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Plugin
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represent plugins that support internationalization
|
/// Represent plugins that support internationalization
|
||||||
|
|
@ -8,5 +10,13 @@
|
||||||
string GetTranslatedPluginTitle();
|
string GetTranslatedPluginTitle();
|
||||||
|
|
||||||
string GetTranslatedPluginDescription();
|
string GetTranslatedPluginDescription();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The method will be invoked when language of flow changed
|
||||||
|
/// </summary>
|
||||||
|
void OnCultureInfoChanged(CultureInfo newCulture)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -29,6 +29,21 @@ namespace Flow.Launcher.Plugin
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void RestartApp();
|
void RestartApp();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Run a shell command
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cmd">The command or program to run</param>
|
||||||
|
/// <param name="filename">the shell type to run, e.g. powershell.exe</param>
|
||||||
|
/// <exception cref="FileNotFoundException">Thrown when unable to find the file specified in the command </exception>
|
||||||
|
/// <exception cref="Win32Exception">Thrown when error occurs during the execution of the command </exception>
|
||||||
|
void ShellRun(string cmd, string filename = "cmd.exe");
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy Text to clipboard
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Text">Text to save on clipboard</param>
|
||||||
|
public void CopyToClipboard(string text);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Save everything, all of Flow Launcher and plugins' data and settings
|
/// Save everything, all of Flow Launcher and plugins' data and settings
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -59,6 +74,11 @@ namespace Flow.Launcher.Plugin
|
||||||
/// <param name="subTitle">Optional message subtitle</param>
|
/// <param name="subTitle">Optional message subtitle</param>
|
||||||
void ShowMsgError(string title, string subTitle = "");
|
void ShowMsgError(string title, string subTitle = "");
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Show the MainWindow when hiding
|
||||||
|
/// </summary>
|
||||||
|
void ShowMainWindow();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Show message box
|
/// Show message box
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -99,7 +119,21 @@ namespace Flow.Launcher.Plugin
|
||||||
/// Fired after global keyboard events
|
/// Fired after global keyboard events
|
||||||
/// if you want to hook something like Ctrl+R, you should use this event
|
/// if you want to hook something like Ctrl+R, you should use this event
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete("Unable to Retrieve correct return value")]
|
||||||
event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent;
|
event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Register a callback for Global Keyboard Event
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="callback"></param>
|
||||||
|
public void RegisterGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Remove a callback for Global Keyboard Event
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="callback"></param>
|
||||||
|
public void RemoveGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback);
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fuzzy Search the string with the given query. This is the core search mechanism Flow uses
|
/// Fuzzy Search the string with the given query. This is the core search mechanism Flow uses
|
||||||
|
|
@ -185,5 +219,17 @@ namespace Flow.Launcher.Plugin
|
||||||
/// <typeparam name="T">Type for Serialization</typeparam>
|
/// <typeparam name="T">Type for Serialization</typeparam>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
void SaveSettingJsonStorage<T>() where T : new();
|
void SaveSettingJsonStorage<T>() where T : new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Open directory in an explorer configured by user via Flow's Settings. The default is Windows Explorer
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="DirectoryPath">Directory Path to open</param>
|
||||||
|
/// <param name="FileName">Extra FileName Info</param>
|
||||||
|
public void OpenDirectory(string DirectoryPath, string FileName = null);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Opens the url. The browser and mode used is based on what's configured in Flow's default browser settings.
|
||||||
|
/// </summary>
|
||||||
|
public void OpenUrl(string url, bool? inPrivate = null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using JetBrains.Annotations;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
|
|
@ -11,11 +12,12 @@ namespace Flow.Launcher.Plugin
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// to allow unit tests for plug ins
|
/// to allow unit tests for plug ins
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Query(string rawQuery, string search, string[] terms, string actionKeyword = "")
|
public Query(string rawQuery, string search, string[] terms, string[] searchTerms, string actionKeyword = "")
|
||||||
{
|
{
|
||||||
Search = search;
|
Search = search;
|
||||||
RawQuery = rawQuery;
|
RawQuery = rawQuery;
|
||||||
Terms = terms;
|
Terms = terms;
|
||||||
|
SearchTerms = searchTerms;
|
||||||
ActionKeyword = actionKeyword;
|
ActionKeyword = actionKeyword;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -23,7 +25,7 @@ namespace Flow.Launcher.Plugin
|
||||||
/// Raw query, this includes action keyword if it has
|
/// Raw query, this includes action keyword if it has
|
||||||
/// We didn't recommend use this property directly. You should always use Search property.
|
/// We didn't recommend use this property directly. You should always use Search property.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string RawQuery { get; internal set; }
|
public string RawQuery { get; internal init; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Search part of a query.
|
/// Search part of a query.
|
||||||
|
|
@ -31,45 +33,53 @@ namespace Flow.Launcher.Plugin
|
||||||
/// Since we allow user to switch a exclusive plugin to generic plugin,
|
/// Since we allow user to switch a exclusive plugin to generic plugin,
|
||||||
/// so this property will always give you the "real" query part of the query
|
/// so this property will always give you the "real" query part of the query
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Search { get; internal set; }
|
public string Search { get; internal init; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The raw query splited into a string array.
|
/// The search string split into a string array.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string[] Terms { get; set; }
|
public string[] SearchTerms { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The raw query split into a string array
|
||||||
|
/// </summary>
|
||||||
|
[Obsolete("It may or may not include action keyword, which can be confusing. Use SearchTerms instead")]
|
||||||
|
public string[] Terms { get; init; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Query can be splited into multiple terms by whitespace
|
/// Query can be splited into multiple terms by whitespace
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string TermSeperater = " ";
|
public const string TermSeparator = " ";
|
||||||
|
|
||||||
|
[Obsolete("Typo")]
|
||||||
|
public const string TermSeperater = TermSeparator;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// User can set multiple action keywords seperated by ';'
|
/// User can set multiple action keywords seperated by ';'
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string ActionKeywordSeperater = ";";
|
public const string ActionKeywordSeparator = ";";
|
||||||
|
|
||||||
|
[Obsolete("Typo")]
|
||||||
|
public const string ActionKeywordSeperater = ActionKeywordSeparator;
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// '*' is used for System Plugin
|
/// '*' is used for System Plugin
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string GlobalPluginWildcardSign = "*";
|
public const string GlobalPluginWildcardSign = "*";
|
||||||
|
|
||||||
public string ActionKeyword { get; set; }
|
public string ActionKeyword { get; init; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Return first search split by space if it has
|
/// Return first search split by space if it has
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string FirstSearch => SplitSearch(0);
|
public string FirstSearch => SplitSearch(0);
|
||||||
|
|
||||||
|
private string _secondToEndSearch;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// strings from second search (including) to last search
|
/// strings from second search (including) to last search
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string SecondToEndSearch
|
public string SecondToEndSearch => SearchTerms.Length > 1 ? (_secondToEndSearch ??= string.Join(' ', SearchTerms[1..])) : "";
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
var index = string.IsNullOrEmpty(ActionKeyword) ? 1 : 2;
|
|
||||||
return string.Join(TermSeperater, Terms.Skip(index).ToArray());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Return second search split by space if it has
|
/// Return second search split by space if it has
|
||||||
|
|
@ -83,16 +93,9 @@ namespace Flow.Launcher.Plugin
|
||||||
|
|
||||||
private string SplitSearch(int index)
|
private string SplitSearch(int index)
|
||||||
{
|
{
|
||||||
try
|
return index < SearchTerms.Length ? SearchTerms[index] : string.Empty;
|
||||||
{
|
|
||||||
return string.IsNullOrEmpty(ActionKeyword) ? Terms[index] : Terms[index + 1];
|
|
||||||
}
|
|
||||||
catch (IndexOutOfRangeException)
|
|
||||||
{
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString() => RawQuery;
|
public override string ToString() => RawQuery;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -29,6 +29,13 @@ namespace Flow.Launcher.Plugin
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string ActionKeywordAssigned { get; set; }
|
public string ActionKeywordAssigned { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This holds the text which can be provided by plugin to help Flow autocomplete text
|
||||||
|
/// for user on the plugin result. If autocomplete action for example is tab, pressing tab will have
|
||||||
|
/// the default constructed autocomplete text (result's Title), or the text provided here if not empty.
|
||||||
|
/// </summary>
|
||||||
|
public string AutoCompleteText { get; set; }
|
||||||
|
|
||||||
public string IcoPath
|
public string IcoPath
|
||||||
{
|
{
|
||||||
get { return _icoPath; }
|
get { return _icoPath; }
|
||||||
|
|
@ -47,8 +54,16 @@ namespace Flow.Launcher.Plugin
|
||||||
|
|
||||||
public delegate ImageSource IconDelegate();
|
public delegate ImageSource IconDelegate();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delegate to Get Image Source
|
||||||
|
/// </summary>
|
||||||
public IconDelegate Icon;
|
public IconDelegate Icon;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Information for Glyph Icon
|
||||||
|
/// </summary>
|
||||||
|
public GlyphInfo Glyph { get; init; }
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// return true to hide flowlauncher after select result
|
/// return true to hide flowlauncher after select result
|
||||||
|
|
|
||||||
|
|
@ -35,18 +35,21 @@ namespace Flow.Launcher.Plugin.SharedCommands
|
||||||
/// Opens search in a new browser. If no browser path is passed in then Chrome is used.
|
/// Opens search in a new browser. If no browser path is passed in then Chrome is used.
|
||||||
/// Leave browser path blank to use Chrome.
|
/// Leave browser path blank to use Chrome.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void NewBrowserWindow(this string url, string browserPath = "")
|
public static void OpenInBrowserWindow(this string url, string browserPath = "", bool inPrivate = false, string privateArg = "")
|
||||||
{
|
{
|
||||||
browserPath = string.IsNullOrEmpty(browserPath) ? GetDefaultBrowserPath() : browserPath;
|
browserPath = string.IsNullOrEmpty(browserPath) ? GetDefaultBrowserPath() : browserPath;
|
||||||
|
|
||||||
var browserExecutableName = browserPath?
|
var browserExecutableName = browserPath?
|
||||||
.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.None)
|
.Split(new[]
|
||||||
.Last();
|
{
|
||||||
|
Path.DirectorySeparatorChar
|
||||||
|
}, StringSplitOptions.None)
|
||||||
|
.Last();
|
||||||
|
|
||||||
var browser = string.IsNullOrEmpty(browserExecutableName) ? "chrome" : browserPath;
|
var browser = string.IsNullOrEmpty(browserExecutableName) ? "chrome" : browserPath;
|
||||||
|
|
||||||
// Internet Explorer will open url in new browser window, and does not take the --new-window parameter
|
// Internet Explorer will open url in new browser window, and does not take the --new-window parameter
|
||||||
var browserArguements = browserExecutableName == "iexplore.exe" ? url : "--new-window " + url;
|
var browserArguements = (browserExecutableName == "iexplore.exe" ? "" : "--new-window ") + (inPrivate ? $"{privateArg} " : "") + url;
|
||||||
|
|
||||||
var psi = new ProcessStartInfo
|
var psi = new ProcessStartInfo
|
||||||
{
|
{
|
||||||
|
|
@ -61,24 +64,36 @@ namespace Flow.Launcher.Plugin.SharedCommands
|
||||||
}
|
}
|
||||||
catch (System.ComponentModel.Win32Exception)
|
catch (System.ComponentModel.Win32Exception)
|
||||||
{
|
{
|
||||||
Process.Start(new ProcessStartInfo { FileName = url, UseShellExecute = true });
|
Process.Start(new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = url, UseShellExecute = true
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Obsolete("This is provided for backwards compatibility after 1.9.0 release, e.g. GitHub plugin. Use the new method instead")]
|
||||||
|
public static void NewBrowserWindow(this string url, string browserPath = "")
|
||||||
|
{
|
||||||
|
OpenInBrowserWindow(url, browserPath);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Opens search as a tab in the default browser chosen in Windows settings.
|
/// Opens search as a tab in the default browser chosen in Windows settings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void NewTabInBrowser(this string url, string browserPath = "")
|
public static void OpenInBrowserTab(this string url, string browserPath = "", bool inPrivate = false, string privateArg = "")
|
||||||
{
|
{
|
||||||
browserPath = string.IsNullOrEmpty(browserPath) ? GetDefaultBrowserPath() : browserPath;
|
browserPath = string.IsNullOrEmpty(browserPath) ? GetDefaultBrowserPath() : browserPath;
|
||||||
|
|
||||||
var psi = new ProcessStartInfo() { UseShellExecute = true };
|
var psi = new ProcessStartInfo()
|
||||||
|
{
|
||||||
|
UseShellExecute = true
|
||||||
|
};
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrEmpty(browserPath))
|
if (!string.IsNullOrEmpty(browserPath))
|
||||||
{
|
{
|
||||||
psi.FileName = browserPath;
|
psi.FileName = browserPath;
|
||||||
psi.Arguments = url;
|
psi.Arguments = (inPrivate ? $"{privateArg} " : "") + url;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -90,8 +105,17 @@ namespace Flow.Launcher.Plugin.SharedCommands
|
||||||
// This error may be thrown if browser path is incorrect
|
// This error may be thrown if browser path is incorrect
|
||||||
catch (System.ComponentModel.Win32Exception)
|
catch (System.ComponentModel.Win32Exception)
|
||||||
{
|
{
|
||||||
Process.Start(new ProcessStartInfo { FileName = url, UseShellExecute = true });
|
Process.Start(new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = url, UseShellExecute = true
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Obsolete("This is provided for backwards compatibility after 1.9.0 release, e.g. GitHub plugin. Use the new method instead")]
|
||||||
|
public static void NewTabInBrowser(this string url, string browserPath = "")
|
||||||
|
{
|
||||||
|
OpenInBrowserTab(url, browserPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
@ -60,17 +60,39 @@ namespace Flow.Launcher.Plugin.SharedCommands
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ProcessStartInfo SetProcessStartInfo(this string fileName, string workingDirectory = "", string arguments = "", string verb = "")
|
public static ProcessStartInfo SetProcessStartInfo(this string fileName, string workingDirectory = "", string arguments = "", string verb = "", bool createNoWindow = false)
|
||||||
{
|
{
|
||||||
var info = new ProcessStartInfo
|
var info = new ProcessStartInfo
|
||||||
{
|
{
|
||||||
FileName = fileName,
|
FileName = fileName,
|
||||||
WorkingDirectory = workingDirectory,
|
WorkingDirectory = workingDirectory,
|
||||||
Arguments = arguments,
|
Arguments = arguments,
|
||||||
Verb = verb
|
Verb = verb,
|
||||||
|
CreateNoWindow = createNoWindow
|
||||||
};
|
};
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Runs a windows command using the provided ProcessStartInfo
|
||||||
|
/// </summary>
|
||||||
|
/// <exception cref="FileNotFoundException">Thrown when unable to find the file specified in the command </exception>
|
||||||
|
/// <exception cref="Win32Exception">Thrown when error occurs during the execution of the command </exception>
|
||||||
|
public static void Execute(ProcessStartInfo info)
|
||||||
|
{
|
||||||
|
Execute(Process.Start, info);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Runs a windows command using the provided ProcessStartInfo using a custom execute command function
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Func startProcess">allows you to pass in a custom command execution function</param>
|
||||||
|
/// <exception cref="FileNotFoundException">Thrown when unable to find the file specified in the command </exception>
|
||||||
|
/// <exception cref="Win32Exception">Thrown when error occurs during the execution of the command </exception>
|
||||||
|
public static void Execute(Func<ProcessStartInfo, Process> startProcess, ProcessStartInfo info)
|
||||||
|
{
|
||||||
|
startProcess(info);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,13 +48,13 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Moq" Version="4.14.1" />
|
<PackageReference Include="Moq" Version="4.16.1" />
|
||||||
<PackageReference Include="nunit" Version="3.13.2" />
|
<PackageReference Include="nunit" Version="3.13.2" />
|
||||||
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0">
|
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
92
Flow.Launcher.Test/PluginLoadTest.cs
Normal file
92
Flow.Launcher.Test/PluginLoadTest.cs
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
using NUnit.Framework;
|
||||||
|
using Flow.Launcher.Core.Plugin;
|
||||||
|
using Flow.Launcher.Plugin;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Test
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
class PluginLoadTest
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void GivenDuplicatePluginMetadatasWhenLoadedThenShouldReturnOnlyUniqueList()
|
||||||
|
{
|
||||||
|
// Given
|
||||||
|
var duplicateList = new List<PluginMetadata>
|
||||||
|
{
|
||||||
|
new PluginMetadata
|
||||||
|
{
|
||||||
|
ID = "CEA0TYUC6D3B4085823D60DC76F28855",
|
||||||
|
Version = "1.0.0"
|
||||||
|
},
|
||||||
|
new PluginMetadata
|
||||||
|
{
|
||||||
|
ID = "CEA0TYUC6D3B4085823D60DC76F28855",
|
||||||
|
Version = "1.0.1"
|
||||||
|
},
|
||||||
|
new PluginMetadata
|
||||||
|
{
|
||||||
|
ID = "CEA0TYUC6D3B4085823D60DC76F28855",
|
||||||
|
Version = "1.0.2"
|
||||||
|
},
|
||||||
|
new PluginMetadata
|
||||||
|
{
|
||||||
|
ID = "CEA0TYUC6D3B4085823D60DC76F28855",
|
||||||
|
Version = "1.0.0"
|
||||||
|
},
|
||||||
|
new PluginMetadata
|
||||||
|
{
|
||||||
|
ID = "CEA0TYUC6D3B4085823D60DC76F28855",
|
||||||
|
Version = "1.0.0"
|
||||||
|
},
|
||||||
|
new PluginMetadata
|
||||||
|
{
|
||||||
|
ID = "ABC0TYUC6D3B7855823D60DC76F28855",
|
||||||
|
Version = "1.0.0"
|
||||||
|
},
|
||||||
|
new PluginMetadata
|
||||||
|
{
|
||||||
|
ID = "ABC0TYUC6D3B7855823D60DC76F28855",
|
||||||
|
Version = "1.0.0"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// When
|
||||||
|
(var unique, var duplicates) = PluginConfig.GetUniqueLatestPluginMetadata(duplicateList);
|
||||||
|
|
||||||
|
// Then
|
||||||
|
Assert.True(unique.FirstOrDefault().ID == "CEA0TYUC6D3B4085823D60DC76F28855" && unique.FirstOrDefault().Version == "1.0.2");
|
||||||
|
Assert.True(unique.Count() == 1);
|
||||||
|
|
||||||
|
Assert.False(duplicates.Any(x => x.Version == "1.0.2" && x.ID == "CEA0TYUC6D3B4085823D60DC76F28855"));
|
||||||
|
Assert.True(duplicates.Count() == 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GivenDuplicatePluginMetadatasWithNoUniquePluginWhenLoadedThenShouldReturnEmptyList()
|
||||||
|
{
|
||||||
|
// Given
|
||||||
|
var duplicateList = new List<PluginMetadata>
|
||||||
|
{
|
||||||
|
new PluginMetadata
|
||||||
|
{
|
||||||
|
ID = "CEA0TYUC6D3B7855823D60DC76F28855",
|
||||||
|
Version = "1.0.0"
|
||||||
|
},
|
||||||
|
new PluginMetadata
|
||||||
|
{
|
||||||
|
ID = "CEA0TYUC6D3B7855823D60DC76F28855",
|
||||||
|
Version = "1.0.0"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// When
|
||||||
|
(var unique, var duplicates) = PluginConfig.GetUniqueLatestPluginMetadata(duplicateList);
|
||||||
|
|
||||||
|
// Then
|
||||||
|
Assert.True(unique.Count() == 0);
|
||||||
|
Assert.True(duplicates.Count() == 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -18,19 +18,14 @@ namespace Flow.Launcher.Test.Plugins
|
||||||
{
|
{
|
||||||
public override string SupportedLanguage { get; set; } = AllowedLanguage.Executable;
|
public override string SupportedLanguage { get; set; } = AllowedLanguage.Executable;
|
||||||
|
|
||||||
protected override string ExecuteCallback(JsonRPCRequestModel rpcRequest)
|
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string ExecuteContextMenu(Result selectedResult)
|
protected override Task<Stream> RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
var byteInfo = Encoding.UTF8.GetBytes(request.Parameters[0] as string ?? string.Empty);
|
||||||
}
|
|
||||||
|
|
||||||
protected override Task<Stream> ExecuteQueryAsync(Query query, CancellationToken token)
|
|
||||||
{
|
|
||||||
var byteInfo = Encoding.UTF8.GetBytes(query.RawQuery);
|
|
||||||
|
|
||||||
var resultStream = new MemoryStream(byteInfo);
|
var resultStream = new MemoryStream(byteInfo);
|
||||||
return Task.FromResult((Stream)resultStream);
|
return Task.FromResult((Stream)resultStream);
|
||||||
|
|
@ -45,7 +40,7 @@ namespace Flow.Launcher.Test.Plugins
|
||||||
{
|
{
|
||||||
var results = await QueryAsync(new Query
|
var results = await QueryAsync(new Query
|
||||||
{
|
{
|
||||||
RawQuery = resultText
|
Search = resultText
|
||||||
}, default);
|
}, default);
|
||||||
|
|
||||||
Assert.IsNotNull(results);
|
Assert.IsNotNull(results);
|
||||||
|
|
@ -85,8 +80,8 @@ namespace Flow.Launcher.Test.Plugins
|
||||||
|
|
||||||
var pascalText = JsonSerializer.Serialize(reference);
|
var pascalText = JsonSerializer.Serialize(reference);
|
||||||
|
|
||||||
var results1 = await QueryAsync(new Query { RawQuery = camelText }, default);
|
var results1 = await QueryAsync(new Query { Search = camelText }, default);
|
||||||
var results2 = await QueryAsync(new Query { RawQuery = pascalText }, default);
|
var results2 = await QueryAsync(new Query { Search = pascalText }, default);
|
||||||
|
|
||||||
Assert.IsNotNull(results1);
|
Assert.IsNotNull(results1);
|
||||||
Assert.IsNotNull(results2);
|
Assert.IsNotNull(results2);
|
||||||
|
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
using NUnit.Framework;
|
|
||||||
using Flow.Launcher.Core.Plugin;
|
|
||||||
using Flow.Launcher.Infrastructure.Exception;
|
|
||||||
|
|
||||||
namespace Flow.Launcher.Test.Plugins
|
|
||||||
{
|
|
||||||
|
|
||||||
[TestFixture]
|
|
||||||
public class PluginInitTest
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void PublicAPIIsNullTest()
|
|
||||||
{
|
|
||||||
//Assert.Throws(typeof(Flow.LauncherFatalException), () => PluginManager.Initialize(null));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -13,7 +13,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{3A73
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher", "Flow.Launcher\Flow.Launcher.csproj", "{DB90F671-D861-46BB-93A3-F1304F5BA1C5}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher", "Flow.Launcher\Flow.Launcher.csproj", "{DB90F671-D861-46BB-93A3-F1304F5BA1C5}"
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0} = {1EE20B48-82FB-48A2-8086-675D6DDAB4F0}
|
|
||||||
{0B9DE348-9361-4940-ADB6-F5953BFFCCEC} = {0B9DE348-9361-4940-ADB6-F5953BFFCCEC}
|
{0B9DE348-9361-4940-ADB6-F5953BFFCCEC} = {0B9DE348-9361-4940-ADB6-F5953BFFCCEC}
|
||||||
{4792A74A-0CEA-4173-A8B2-30E6764C6217} = {4792A74A-0CEA-4173-A8B2-30E6764C6217}
|
{4792A74A-0CEA-4173-A8B2-30E6764C6217} = {4792A74A-0CEA-4173-A8B2-30E6764C6217}
|
||||||
{FDB3555B-58EF-4AE6-B5F1-904719637AB4} = {FDB3555B-58EF-4AE6-B5F1-904719637AB4}
|
{FDB3555B-58EF-4AE6-B5F1-904719637AB4} = {FDB3555B-58EF-4AE6-B5F1-904719637AB4}
|
||||||
|
|
@ -23,6 +22,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher", "Flow.Launc
|
||||||
{9B130CC5-14FB-41FF-B310-0A95B6894C37} = {9B130CC5-14FB-41FF-B310-0A95B6894C37}
|
{9B130CC5-14FB-41FF-B310-0A95B6894C37} = {9B130CC5-14FB-41FF-B310-0A95B6894C37}
|
||||||
{FDED22C8-B637-42E8-824A-63B5B6E05A3A} = {FDED22C8-B637-42E8-824A-63B5B6E05A3A}
|
{FDED22C8-B637-42E8-824A-63B5B6E05A3A} = {FDED22C8-B637-42E8-824A-63B5B6E05A3A}
|
||||||
{A3DCCBCA-ACC1-421D-B16E-210896234C26} = {A3DCCBCA-ACC1-421D-B16E-210896234C26}
|
{A3DCCBCA-ACC1-421D-B16E-210896234C26} = {A3DCCBCA-ACC1-421D-B16E-210896234C26}
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A} = {5043CECE-E6A7-4867-9CBE-02D27D83747A}
|
||||||
{403B57F2-1856-4FC7-8A24-36AB346B763E} = {403B57F2-1856-4FC7-8A24-36AB346B763E}
|
{403B57F2-1856-4FC7-8A24-36AB346B763E} = {403B57F2-1856-4FC7-8A24-36AB346B763E}
|
||||||
{588088F4-3262-4F9F-9663-A05DE12534C3} = {588088F4-3262-4F9F-9663-A05DE12534C3}
|
{588088F4-3262-4F9F-9663-A05DE12534C3} = {588088F4-3262-4F9F-9663-A05DE12534C3}
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
|
|
@ -35,8 +35,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Progra
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.WebSearch", "Plugins\Flow.Launcher.Plugin.WebSearch\Flow.Launcher.Plugin.WebSearch.csproj", "{403B57F2-1856-4FC7-8A24-36AB346B763E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.WebSearch", "Plugins\Flow.Launcher.Plugin.WebSearch\Flow.Launcher.Plugin.WebSearch.csproj", "{403B57F2-1856-4FC7-8A24-36AB346B763E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.ControlPanel", "Plugins\Flow.Launcher.Plugin.ControlPanel\Flow.Launcher.Plugin.ControlPanel.csproj", "{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.PluginIndicator", "Plugins\Flow.Launcher.Plugin.PluginIndicator\Flow.Launcher.Plugin.PluginIndicator.csproj", "{FDED22C8-B637-42E8-824A-63B5B6E05A3A}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.PluginIndicator", "Plugins\Flow.Launcher.Plugin.PluginIndicator\Flow.Launcher.Plugin.PluginIndicator.csproj", "{FDED22C8-B637-42E8-824A-63B5B6E05A3A}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Sys", "Plugins\Flow.Launcher.Plugin.Sys\Flow.Launcher.Plugin.Sys.csproj", "{0B9DE348-9361-4940-ADB6-F5953BFFCCEC}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Sys", "Plugins\Flow.Launcher.Plugin.Sys\Flow.Launcher.Plugin.Sys.csproj", "{0B9DE348-9361-4940-ADB6-F5953BFFCCEC}"
|
||||||
|
|
@ -68,6 +66,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Proces
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.PluginsManager", "Plugins\Flow.Launcher.Plugin.PluginsManager\Flow.Launcher.Plugin.PluginsManager.csproj", "{4792A74A-0CEA-4173-A8B2-30E6764C6217}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.PluginsManager", "Plugins\Flow.Launcher.Plugin.PluginsManager\Flow.Launcher.Plugin.PluginsManager.csproj", "{4792A74A-0CEA-4173-A8B2-30E6764C6217}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.WindowsSettings", "Plugins\Flow.Launcher.Plugin.WindowsSettings\Flow.Launcher.Plugin.WindowsSettings.csproj", "{5043CECE-E6A7-4867-9CBE-02D27D83747A}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
|
@ -162,18 +162,6 @@ Global
|
||||||
{403B57F2-1856-4FC7-8A24-36AB346B763E}.Release|x64.Build.0 = Release|Any CPU
|
{403B57F2-1856-4FC7-8A24-36AB346B763E}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{403B57F2-1856-4FC7-8A24-36AB346B763E}.Release|x86.ActiveCfg = Release|Any CPU
|
{403B57F2-1856-4FC7-8A24-36AB346B763E}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{403B57F2-1856-4FC7-8A24-36AB346B763E}.Release|x86.Build.0 = Release|Any CPU
|
{403B57F2-1856-4FC7-8A24-36AB346B763E}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{FDED22C8-B637-42E8-824A-63B5B6E05A3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{FDED22C8-B637-42E8-824A-63B5B6E05A3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{FDED22C8-B637-42E8-824A-63B5B6E05A3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{FDED22C8-B637-42E8-824A-63B5B6E05A3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{FDED22C8-B637-42E8-824A-63B5B6E05A3A}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{FDED22C8-B637-42E8-824A-63B5B6E05A3A}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
|
@ -283,6 +271,18 @@ Global
|
||||||
{4792A74A-0CEA-4173-A8B2-30E6764C6217}.Release|x64.Build.0 = Release|Any CPU
|
{4792A74A-0CEA-4173-A8B2-30E6764C6217}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{4792A74A-0CEA-4173-A8B2-30E6764C6217}.Release|x86.ActiveCfg = Release|Any CPU
|
{4792A74A-0CEA-4173-A8B2-30E6764C6217}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{4792A74A-0CEA-4173-A8B2-30E6764C6217}.Release|x86.Build.0 = Release|Any CPU
|
{4792A74A-0CEA-4173-A8B2-30E6764C6217}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
@ -290,7 +290,6 @@ Global
|
||||||
GlobalSection(NestedProjects) = preSolution
|
GlobalSection(NestedProjects) = preSolution
|
||||||
{FDB3555B-58EF-4AE6-B5F1-904719637AB4} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
{FDB3555B-58EF-4AE6-B5F1-904719637AB4} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
||||||
{403B57F2-1856-4FC7-8A24-36AB346B763E} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
{403B57F2-1856-4FC7-8A24-36AB346B763E} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
||||||
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
|
||||||
{FDED22C8-B637-42E8-824A-63B5B6E05A3A} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
{FDED22C8-B637-42E8-824A-63B5B6E05A3A} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
||||||
{0B9DE348-9361-4940-ADB6-F5953BFFCCEC} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
{0B9DE348-9361-4940-ADB6-F5953BFFCCEC} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
||||||
{A3DCCBCA-ACC1-421D-B16E-210896234C26} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
{A3DCCBCA-ACC1-421D-B16E-210896234C26} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
||||||
|
|
@ -300,6 +299,7 @@ Global
|
||||||
{F9C4C081-4CC3-4146-95F1-E102B4E10A5F} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
{F9C4C081-4CC3-4146-95F1-E102B4E10A5F} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
||||||
{588088F4-3262-4F9F-9663-A05DE12534C3} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
{588088F4-3262-4F9F-9663-A05DE12534C3} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
||||||
{4792A74A-0CEA-4173-A8B2-30E6764C6217} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
{4792A74A-0CEA-4173-A8B2-30E6764C6217} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
||||||
|
{5043CECE-E6A7-4867-9CBE-02D27D83747A} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {F26ACB50-3F6C-4907-B0C9-1ADACC1D0DED}
|
SolutionGuid = {F26ACB50-3F6C-4907-B0C9-1ADACC1D0DED}
|
||||||
|
|
|
||||||
|
|
@ -1,43 +1,137 @@
|
||||||
<Window x:Class="Flow.Launcher.ActionKeywords"
|
<Window
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
x:Class="Flow.Launcher.ActionKeywords"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
Title="ActionKeywords"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
Icon="Images\app.png"
|
Title="{DynamicResource actionKeywordsTitle}"
|
||||||
ResizeMode="NoResize"
|
Width="450"
|
||||||
Loaded="ActionKeyword_OnLoaded"
|
Background="{DynamicResource PopuBGColor}"
|
||||||
WindowStartupLocation="CenterScreen"
|
Foreground="{DynamicResource PopupTextColor}"
|
||||||
Height="250" Width="500">
|
Icon="Images\app.png"
|
||||||
|
Loaded="ActionKeyword_OnLoaded"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
SizeToContent="Height"
|
||||||
|
WindowStartupLocation="CenterScreen">
|
||||||
|
<WindowChrome.WindowChrome>
|
||||||
|
<WindowChrome CaptionHeight="32" ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" />
|
||||||
|
</WindowChrome.WindowChrome>
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition />
|
<RowDefinition />
|
||||||
<RowDefinition Height="60"/>
|
<RowDefinition Height="80" />
|
||||||
<RowDefinition />
|
|
||||||
<RowDefinition />
|
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid>
|
||||||
<ColumnDefinition Width="150" />
|
<StackPanel Grid.Row="0">
|
||||||
<ColumnDefinition />
|
<StackPanel>
|
||||||
</Grid.ColumnDefinitions>
|
<Grid>
|
||||||
<TextBlock FontSize="14" Grid.Row="0" Grid.Column="1" VerticalAlignment="Center"
|
<Grid.ColumnDefinitions>
|
||||||
HorizontalAlignment="Left" Text="{DynamicResource currentActionKeywords}" />
|
<ColumnDefinition Width="Auto" />
|
||||||
<TextBlock x:Name="tbOldActionKeyword" Grid.Row="0" Grid.Column="1" Margin="170 10 10 10" FontSize="14"
|
<ColumnDefinition Width="*" />
|
||||||
VerticalAlignment="Center" HorizontalAlignment="Left" />
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
<TextBlock FontSize="14" Grid.Row="1" Grid.Column="1" VerticalAlignment="Center"
|
<ColumnDefinition Width="Auto" />
|
||||||
HorizontalAlignment="Left" Text="{DynamicResource newActionKeyword}" />
|
</Grid.ColumnDefinitions>
|
||||||
<StackPanel Grid.Row="1" Orientation="Horizontal" Grid.Column="1">
|
<Button
|
||||||
<TextBox x:Name="tbAction" Margin="170 10 15 10" Width="105" VerticalAlignment="Center" HorizontalAlignment="Left" />
|
Grid.Column="4"
|
||||||
</StackPanel>
|
Click="BtnCancel_OnClick"
|
||||||
|
Style="{StaticResource TitleBarCloseButtonStyle}">
|
||||||
|
<Path
|
||||||
|
Width="46"
|
||||||
|
Height="32"
|
||||||
|
Data="M 18,11 27,20 M 18,20 27,11"
|
||||||
|
Stroke="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
|
||||||
|
StrokeThickness="1">
|
||||||
|
<Path.Style>
|
||||||
|
<Style TargetType="Path">
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding Path=IsActive, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Value="False">
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Path.Style>
|
||||||
|
</Path>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Margin="26,12,26,0">
|
||||||
|
<StackPanel Grid.Row="0" Margin="0,0,0,12">
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="0,0,0,0"
|
||||||
|
FontFamily="Segoe UI"
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource actionKeywordsTitle}"
|
||||||
|
TextAlignment="Left" />
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource actionkeyword_tips}"
|
||||||
|
TextAlignment="Left"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
<TextBlock Grid.Row="2" Grid.ColumnSpan="1" Grid.Column="1" Foreground="Gray"
|
<StackPanel Margin="0,18,0,0" Orientation="Horizontal">
|
||||||
Text="{DynamicResource actionkeyword_tips}" />
|
<TextBlock
|
||||||
|
Grid.Row="0"
|
||||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Row="3" Grid.Column="1">
|
Grid.Column="1"
|
||||||
<Button x:Name="btnCancel" Click="BtnCancel_OnClick" Margin="10 0 10 0" Width="80" Height="30"
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource currentActionKeywords}" />
|
||||||
|
<TextBlock
|
||||||
|
x:Name="tbOldActionKeyword"
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="14,10,10,10"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Foreground="{DynamicResource Color05B}" />
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Margin="0,0,0,10" Orientation="Horizontal">
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="1"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource newActionKeyword}" />
|
||||||
|
<TextBox
|
||||||
|
x:Name="tbAction"
|
||||||
|
Width="105"
|
||||||
|
Margin="10,10,15,10"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
<Border
|
||||||
|
Grid.Row="1"
|
||||||
|
Background="{DynamicResource PopupButtonAreaBGColor}"
|
||||||
|
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
|
||||||
|
BorderThickness="0,1,0,0">
|
||||||
|
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
|
||||||
|
<Button
|
||||||
|
x:Name="btnCancel"
|
||||||
|
Width="145"
|
||||||
|
Height="30"
|
||||||
|
Margin="10,0,5,0"
|
||||||
|
Click="BtnCancel_OnClick"
|
||||||
Content="{DynamicResource cancel}" />
|
Content="{DynamicResource cancel}" />
|
||||||
<Button x:Name="btnDone" Margin="10 0 10 0" Width="80" Height="30" Click="btnDone_OnClick">
|
<Button
|
||||||
<TextBlock x:Name="lblAdd" Text="{DynamicResource done}" />
|
x:Name="btnDone"
|
||||||
</Button>
|
Width="145"
|
||||||
</StackPanel>
|
Height="30"
|
||||||
|
Margin="5,0,10,0"
|
||||||
|
Click="btnDone_OnClick"
|
||||||
|
Style="{StaticResource AccentButtonStyle}">
|
||||||
|
<TextBlock x:Name="lblAdd" Text="{DynamicResource done}" />
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
|
|
@ -30,7 +30,7 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
private void ActionKeyword_OnLoaded(object sender, RoutedEventArgs e)
|
private void ActionKeyword_OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
tbOldActionKeyword.Text = string.Join(Query.ActionKeywordSeperater, plugin.Metadata.ActionKeywords.ToArray());
|
tbOldActionKeyword.Text = string.Join(Query.ActionKeywordSeparator, plugin.Metadata.ActionKeywords.ToArray());
|
||||||
tbAction.Focus();
|
tbAction.Focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -44,7 +44,7 @@ namespace Flow.Launcher
|
||||||
var oldActionKeyword = plugin.Metadata.ActionKeywords[0];
|
var oldActionKeyword = plugin.Metadata.ActionKeywords[0];
|
||||||
var newActionKeyword = tbAction.Text.Trim();
|
var newActionKeyword = tbAction.Text.Trim();
|
||||||
newActionKeyword = newActionKeyword.Length > 0 ? newActionKeyword : "*";
|
newActionKeyword = newActionKeyword.Length > 0 ? newActionKeyword : "*";
|
||||||
if (!pluginViewModel.IsActionKeywordRegistered(newActionKeyword))
|
if (!PluginViewModel.IsActionKeywordRegistered(newActionKeyword))
|
||||||
{
|
{
|
||||||
pluginViewModel.ChangeActionKeyword(newActionKeyword, oldActionKeyword);
|
pluginViewModel.ChangeActionKeyword(newActionKeyword, oldActionKeyword);
|
||||||
Close();
|
Close();
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,30 @@
|
||||||
<Application x:Class="Flow.Launcher.App"
|
<Application
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
x:Class="Flow.Launcher.App"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:ui="http://schemas.modernwpf.com/2019"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
ShutdownMode="OnMainWindowClose"
|
xmlns:ui="http://schemas.modernwpf.com/2019"
|
||||||
Startup="OnStartupAsync">
|
ShutdownMode="OnMainWindowClose"
|
||||||
|
Startup="OnStartupAsync">
|
||||||
<Application.Resources>
|
<Application.Resources>
|
||||||
<ResourceDictionary>
|
<ResourceDictionary>
|
||||||
<ResourceDictionary.MergedDictionaries>
|
<ResourceDictionary.MergedDictionaries>
|
||||||
<ui:ThemeResources RequestedTheme="Light" />
|
<ui:ThemeResources>
|
||||||
|
<ui:ThemeResources.ThemeDictionaries>
|
||||||
|
<ResourceDictionary x:Key="Light">
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/Resources/Light.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
</ResourceDictionary>
|
||||||
|
<ResourceDictionary x:Key="Dark">
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/Resources/Dark.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
</ResourceDictionary>
|
||||||
|
</ui:ThemeResources.ThemeDictionaries>
|
||||||
|
</ui:ThemeResources>
|
||||||
<ui:XamlControlsResources />
|
<ui:XamlControlsResources />
|
||||||
<ResourceDictionary Source="pack://application:,,,/Themes/Darker.xaml" />
|
<ResourceDictionary Source="pack://application:,,,/Resources/CustomControlTemplate.xaml" />
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/Themes/Win11System.xaml" />
|
||||||
<ResourceDictionary Source="pack://application:,,,/Languages/en.xaml" />
|
<ResourceDictionary Source="pack://application:,,,/Languages/en.xaml" />
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
|
||||||
|
|
@ -100,8 +100,6 @@ namespace Flow.Launcher
|
||||||
AutoUpdates();
|
AutoUpdates();
|
||||||
|
|
||||||
API.SaveAppAllSettings();
|
API.SaveAppAllSettings();
|
||||||
|
|
||||||
_mainVM.MainWindowVisibility = _settings.HideOnStartup ? Visibility.Hidden : Visibility.Visible;
|
|
||||||
Log.Info("|App.OnStartup|End Flow Launcher startup ---------------------------------------------------- ");
|
Log.Info("|App.OnStartup|End Flow Launcher startup ---------------------------------------------------- ");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -129,12 +127,12 @@ namespace Flow.Launcher
|
||||||
var timer = new Timer(1000 * 60 * 60 * 5);
|
var timer = new Timer(1000 * 60 * 60 * 5);
|
||||||
timer.Elapsed += async (s, e) =>
|
timer.Elapsed += async (s, e) =>
|
||||||
{
|
{
|
||||||
await _updater.UpdateApp(API);
|
await _updater.UpdateAppAsync(API);
|
||||||
};
|
};
|
||||||
timer.Start();
|
timer.Start();
|
||||||
|
|
||||||
// check updates on startup
|
// check updates on startup
|
||||||
await _updater.UpdateApp(API);
|
await _updater.UpdateAppAsync(API);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -178,7 +176,7 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
public void OnSecondAppStarted()
|
public void OnSecondAppStarted()
|
||||||
{
|
{
|
||||||
Current.MainWindow.Visibility = Visibility.Visible;
|
Current.MainWindow.Show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
57
Flow.Launcher/Converters/BorderClipConverter.cs
Normal file
57
Flow.Launcher/Converters/BorderClipConverter.cs
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
|
||||||
|
// For Clipping inside listbox item
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Converters
|
||||||
|
{
|
||||||
|
public class BorderClipConverter : IMultiValueConverter
|
||||||
|
{
|
||||||
|
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
throw new NotSupportedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Data;
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Media;
|
||||||
using System.Windows.Documents;
|
using System.Windows.Documents;
|
||||||
|
|
||||||
namespace Flow.Launcher.Converters
|
namespace Flow.Launcher.Converters
|
||||||
|
|
@ -30,7 +31,9 @@ namespace Flow.Launcher.Converters
|
||||||
var currentCharacter = text.Substring(i, 1);
|
var currentCharacter = text.Substring(i, 1);
|
||||||
if (this.ShouldHighlight(highlightData, i))
|
if (this.ShouldHighlight(highlightData, i))
|
||||||
{
|
{
|
||||||
textBlock.Inlines.Add(new Bold(new Run(currentCharacter)));
|
|
||||||
|
textBlock.Inlines.Add(new Run(currentCharacter) { Style = (Style)Application.Current.FindResource("HighlightStyle") });
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -16,12 +16,10 @@ namespace Flow.Launcher.Converters
|
||||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
{
|
{
|
||||||
var hotkeyNumber = int.MaxValue;
|
var hotkeyNumber = int.MaxValue;
|
||||||
|
|
||||||
if (value is ListBoxItem listBoxItem)
|
if (value is ListBoxItem listBoxItem
|
||||||
{
|
&& ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
|
||||||
ListBox listBox = ItemsControl.ItemsControlFromItemContainer(listBoxItem) as ListBox;
|
|
||||||
hotkeyNumber = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
|
hotkeyNumber = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
|
||||||
}
|
|
||||||
|
|
||||||
return hotkeyNumber <= MaxVisibleHotkeys ? Visibility.Visible : Visibility.Collapsed;
|
return hotkeyNumber <= MaxVisibleHotkeys ? Visibility.Visible : Visibility.Collapsed;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,9 @@ namespace Flow.Launcher.Converters
|
||||||
{
|
{
|
||||||
public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
|
public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
|
||||||
{
|
{
|
||||||
if (value is ListBoxItem listBoxItem)
|
if (value is ListBoxItem listBoxItem
|
||||||
{
|
&& ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
|
||||||
ListBox listBox = ItemsControl.ItemsControlFromItemContainer(listBoxItem) as ListBox;
|
|
||||||
return listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
|
return listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using System.Windows.Controls;
|
||||||
using System.Windows.Data;
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Media;
|
||||||
using Flow.Launcher.Infrastructure.Logger;
|
using Flow.Launcher.Infrastructure.Logger;
|
||||||
using Flow.Launcher.ViewModel;
|
using Flow.Launcher.ViewModel;
|
||||||
|
|
||||||
|
|
@ -10,13 +12,13 @@ namespace Flow.Launcher.Converters
|
||||||
{
|
{
|
||||||
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
||||||
{
|
{
|
||||||
if (values.Length != 2)
|
if (values.Length != 3)
|
||||||
{
|
{
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
|
var QueryTextBox = values[0] as TextBox;
|
||||||
|
|
||||||
// first prop is the current query string
|
var queryText = (string)values[2];
|
||||||
var queryText = (string)values[0];
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(queryText))
|
if (string.IsNullOrEmpty(queryText))
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
|
|
@ -43,8 +45,20 @@ namespace Flow.Launcher.Converters
|
||||||
if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase))
|
if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase))
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
|
|
||||||
|
|
||||||
|
// For AutocompleteQueryCommand.
|
||||||
// When user typed lower case and result title is uppercase, we still want to display suggestion
|
// When user typed lower case and result title is uppercase, we still want to display suggestion
|
||||||
return queryText + selectedResultPossibleSuggestion.Substring(queryText.Length);
|
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);
|
||||||
|
System.Windows.Media.FormattedText ft = new FormattedText(QueryTextBox.Text, System.Globalization.CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, QueryTextBox.FontSize, Brushes.Black);
|
||||||
|
if (ft.Width > QueryTextBox.ActualWidth || QueryTextBox.HorizontalOffset != 0)
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
};
|
||||||
|
|
||||||
|
return selectedItem.QuerySuggestionText;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,45 +1,160 @@
|
||||||
<Window x:Class="Flow.Launcher.CustomQueryHotkeySetting"
|
<Window
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
x:Class="Flow.Launcher.CustomQueryHotkeySetting"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:flowlauncher="clr-namespace:Flow.Launcher"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
Icon="Images\app.png"
|
xmlns:flowlauncher="clr-namespace:Flow.Launcher"
|
||||||
ResizeMode="NoResize"
|
Title="{DynamicResource customeQueryHotkeyTitle}"
|
||||||
WindowStartupLocation="CenterScreen"
|
Width="500"
|
||||||
Title="{DynamicResource customeQueryHotkeyTitle}" Height="200" Width="674.766">
|
Background="{DynamicResource PopuBGColor}"
|
||||||
|
Foreground="{DynamicResource PopupTextColor}"
|
||||||
|
Icon="Images\app.png"
|
||||||
|
MouseDown="window_MouseDown"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
SizeToContent="Height"
|
||||||
|
WindowStartupLocation="CenterScreen">
|
||||||
|
<WindowChrome.WindowChrome>
|
||||||
|
<WindowChrome CaptionHeight="32" ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" />
|
||||||
|
</WindowChrome.WindowChrome>
|
||||||
<Window.InputBindings>
|
<Window.InputBindings>
|
||||||
<KeyBinding Key="Escape" Command="Close"/>
|
<KeyBinding Key="Escape" Command="Close" />
|
||||||
</Window.InputBindings>
|
</Window.InputBindings>
|
||||||
<Window.CommandBindings>
|
<Window.CommandBindings>
|
||||||
<CommandBinding Command="Close" Executed="cmdEsc_OnPress"/>
|
<CommandBinding Command="Close" Executed="cmdEsc_OnPress" />
|
||||||
</Window.CommandBindings>
|
</Window.CommandBindings>
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition />
|
<RowDefinition />
|
||||||
<RowDefinition />
|
<RowDefinition Height="80" />
|
||||||
<RowDefinition />
|
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
<StackPanel Grid.Row="0">
|
||||||
<ColumnDefinition Width="150" />
|
<StackPanel>
|
||||||
<ColumnDefinition />
|
<Grid>
|
||||||
</Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<TextBlock Margin="10" FontSize="14" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center"
|
<ColumnDefinition Width="Auto" />
|
||||||
HorizontalAlignment="Right" Text="{DynamicResource hotkey}" />
|
<ColumnDefinition Width="*" />
|
||||||
<flowlauncher:HotkeyControl x:Name="ctlHotkey" Margin="10,0,10,0" Grid.Column="1" VerticalAlignment="Center" Height="32" />
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Button
|
||||||
|
Grid.Column="4"
|
||||||
|
Click="BtnCancel_OnClick"
|
||||||
|
Style="{StaticResource TitleBarCloseButtonStyle}">
|
||||||
|
<Path
|
||||||
|
Width="46"
|
||||||
|
Height="32"
|
||||||
|
Data="M 18,11 27,20 M 18,20 27,11"
|
||||||
|
Stroke="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
|
||||||
|
StrokeThickness="1">
|
||||||
|
<Path.Style>
|
||||||
|
<Style TargetType="Path">
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding Path=IsActive, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Value="False">
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Path.Style>
|
||||||
|
</Path>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Margin="26,0,26,0">
|
||||||
|
<StackPanel Grid.Row="0" Margin="0,0,0,12">
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="0,0,0,0"
|
||||||
|
FontFamily="Segoe UI"
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource customeQueryHotkeyTitle}"
|
||||||
|
TextAlignment="Left" />
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource customeQueryHotkeyTips}"
|
||||||
|
TextAlignment="Left"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
<TextBlock Margin="10" FontSize="14" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center"
|
<StackPanel Margin="0,20,0,0" Orientation="Horizontal">
|
||||||
HorizontalAlignment="Right" Text="{DynamicResource actionKeyword}" />
|
<TextBlock
|
||||||
<StackPanel Grid.Row="1" Orientation="Horizontal" Grid.Column="1">
|
Grid.Row="0"
|
||||||
<TextBox x:Name="tbAction" Margin="10" Width="400" VerticalAlignment="Center" HorizontalAlignment="Left" />
|
Grid.Column="0"
|
||||||
<Button x:Name="btnTestActionKeyword" Padding="10 5 10 5" Height="30" Click="BtnTestActionKeyword_OnClick"
|
Width="60"
|
||||||
Content="{DynamicResource preview}" />
|
Margin="10"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource hotkey}" />
|
||||||
|
<flowlauncher:HotkeyControl
|
||||||
|
x:Name="ctlHotkey"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
|
Height="34"
|
||||||
|
Margin="10,0,10,0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
HorizontalContentAlignment="Left" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="10"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource actionKeyword}" />
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Margin="0,0,0,0" Orientation="Horizontal">
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
Width="60"
|
||||||
|
Margin="10"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource customQuery}" />
|
||||||
|
<TextBox
|
||||||
|
x:Name="tbAction"
|
||||||
|
Width="250"
|
||||||
|
Margin="10"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center" />
|
||||||
|
<Button
|
||||||
|
x:Name="btnTestActionKeyword"
|
||||||
|
Height="30"
|
||||||
|
Padding="10,5,10,5"
|
||||||
|
Click="BtnTestActionKeyword_OnClick"
|
||||||
|
Content="{DynamicResource preview}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
<Border
|
||||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Row="2" Grid.Column="1">
|
Grid.Row="1"
|
||||||
<Button x:Name="btnCancel" Click="BtnCancel_OnClick" Margin="10 0 10 0" Width="80" Height="32"
|
Margin="0,14,0,0"
|
||||||
|
Background="{DynamicResource PopupButtonAreaBGColor}"
|
||||||
|
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
|
||||||
|
BorderThickness="0,1,0,0">
|
||||||
|
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
|
||||||
|
<Button
|
||||||
|
x:Name="btnCancel"
|
||||||
|
Width="100"
|
||||||
|
Height="32"
|
||||||
|
Margin="10,0,5,0"
|
||||||
|
Click="BtnCancel_OnClick"
|
||||||
Content="{DynamicResource cancel}" />
|
Content="{DynamicResource cancel}" />
|
||||||
<Button x:Name="btnAdd" Margin="10 0 10 0" Width="80" Height="32" Click="btnAdd_OnClick">
|
<Button
|
||||||
<TextBlock x:Name="lblAdd" Text="{DynamicResource done}" />
|
x:Name="btnAdd"
|
||||||
</Button>
|
Width="100"
|
||||||
</StackPanel>
|
Height="32"
|
||||||
|
Margin="5,0,10,0"
|
||||||
|
Click="btnAdd_OnClick">
|
||||||
|
<TextBlock x:Name="lblAdd" Text="{DynamicResource done}" />
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
|
|
@ -1,12 +1,11 @@
|
||||||
using Flow.Launcher.Core.Resource;
|
using Flow.Launcher.Core.Resource;
|
||||||
using Flow.Launcher.Helper;
|
using Flow.Launcher.Helper;
|
||||||
using Flow.Launcher.Infrastructure.Hotkey;
|
|
||||||
using Flow.Launcher.Infrastructure.UserSettings;
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
using System;
|
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
|
||||||
namespace Flow.Launcher
|
namespace Flow.Launcher
|
||||||
{
|
{
|
||||||
|
|
@ -90,14 +89,24 @@ namespace Flow.Launcher
|
||||||
private void BtnTestActionKeyword_OnClick(object sender, RoutedEventArgs e)
|
private void BtnTestActionKeyword_OnClick(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
App.API.ChangeQuery(tbAction.Text);
|
App.API.ChangeQuery(tbAction.Text);
|
||||||
Application.Current.MainWindow.Visibility = Visibility.Visible;
|
Application.Current.MainWindow.Show();
|
||||||
|
Application.Current.MainWindow.Opacity = 1;
|
||||||
Application.Current.MainWindow.Focus();
|
Application.Current.MainWindow.Focus();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cmdEsc_OnPress(object sender, ExecutedRoutedEventArgs e)
|
private void cmdEsc_OnPress(object sender, ExecutedRoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void window_MouseDown(object sender, MouseButtonEventArgs e) /* for close hotkey popup */
|
||||||
|
{
|
||||||
|
TextBox textBox = Keyboard.FocusedElement as TextBox;
|
||||||
|
if (textBox != null)
|
||||||
|
{
|
||||||
|
TraversalRequest tRequest = new TraversalRequest(FocusNavigationDirection.Next);
|
||||||
|
textBox.MoveFocus(tRequest);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -77,18 +77,25 @@
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="Resources\Segoe Fluent Icons.ttf">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Fody" Version="6.5.4">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
<PackageReference Include="InputSimulator" Version="1.0.4" />
|
<PackageReference Include="InputSimulator" Version="1.0.4" />
|
||||||
<PackageReference Include="ModernWpfUI" Version="0.9.3" />
|
<PackageReference Include="ModernWpfUI" Version="0.9.4" />
|
||||||
<PackageReference Include="NHotkey.Wpf" Version="1.2.1" />
|
<PackageReference Include="NHotkey.Wpf" Version="2.1.0" />
|
||||||
<PackageReference Include="NuGet.CommandLine" Version="5.4.0">
|
<PackageReference Include="NuGet.CommandLine" Version="5.4.0">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="PropertyChanged.Fody" Version="3.3.1" />
|
<PackageReference Include="PropertyChanged.Fody" Version="3.4.0" />
|
||||||
<PackageReference Include="SharpVectors" Version="1.7.1" />
|
<PackageReference Include="SharpVectors" Version="1.7.6" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
@ -97,6 +104,12 @@
|
||||||
<ProjectReference Include="..\Flow.Launcher.Plugin\Flow.Launcher.Plugin.csproj" />
|
<ProjectReference Include="..\Flow.Launcher.Plugin\Flow.Launcher.Plugin.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="Resources\open.wav">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
|
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
|
||||||
<Exec Command="taskkill /f /fi "IMAGENAME eq Flow.Launcher.exe"" />
|
<Exec Command="taskkill /f /fi "IMAGENAME eq Flow.Launcher.exe"" />
|
||||||
</Target>
|
</Target>
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,16 @@ namespace Flow.Launcher.Helper
|
||||||
mainViewModel = mainVM;
|
mainViewModel = mainVM;
|
||||||
settings = mainViewModel._settings;
|
settings = mainViewModel._settings;
|
||||||
|
|
||||||
SetHotkey(settings.Hotkey, OnHotkey);
|
SetHotkey(settings.Hotkey, OnToggleHotkey);
|
||||||
LoadCustomPluginHotkey();
|
LoadCustomPluginHotkey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static void OnToggleHotkey(object sender, HotkeyEventArgs args)
|
||||||
|
{
|
||||||
|
if (!mainViewModel.GameModeStatus)
|
||||||
|
mainViewModel.ToggleFlowLauncher();
|
||||||
|
}
|
||||||
|
|
||||||
private static void SetHotkey(string hotkeyStr, EventHandler<HotkeyEventArgs> action)
|
private static void SetHotkey(string hotkeyStr, EventHandler<HotkeyEventArgs> action)
|
||||||
{
|
{
|
||||||
var hotkey = new HotkeyModel(hotkeyStr);
|
var hotkey = new HotkeyModel(hotkeyStr);
|
||||||
|
|
@ -53,44 +59,6 @@ namespace Flow.Launcher.Helper
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void OnHotkey(object sender, HotkeyEventArgs e)
|
|
||||||
{
|
|
||||||
if (!ShouldIgnoreHotkeys())
|
|
||||||
{
|
|
||||||
UpdateLastQUeryMode();
|
|
||||||
|
|
||||||
mainViewModel.ToggleFlowLauncher();
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Checks if Flow Launcher should ignore any hotkeys
|
|
||||||
/// </summary>
|
|
||||||
private static bool ShouldIgnoreHotkeys()
|
|
||||||
{
|
|
||||||
return settings.IgnoreHotkeysOnFullscreen && WindowsInteropHelper.IsWindowFullscreen();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void UpdateLastQUeryMode()
|
|
||||||
{
|
|
||||||
switch(settings.LastQueryMode)
|
|
||||||
{
|
|
||||||
case LastQueryMode.Empty:
|
|
||||||
mainViewModel.ChangeQueryText(string.Empty);
|
|
||||||
break;
|
|
||||||
case LastQueryMode.Preserved:
|
|
||||||
mainViewModel.LastQuerySelected = true;
|
|
||||||
break;
|
|
||||||
case LastQueryMode.Selected:
|
|
||||||
mainViewModel.LastQuerySelected = false;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new ArgumentException($"wrong LastQueryMode: <{settings.LastQueryMode}>");
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void LoadCustomPluginHotkey()
|
internal static void LoadCustomPluginHotkey()
|
||||||
{
|
{
|
||||||
if (settings.CustomPluginHotkeys == null)
|
if (settings.CustomPluginHotkeys == null)
|
||||||
|
|
@ -106,11 +74,11 @@ namespace Flow.Launcher.Helper
|
||||||
{
|
{
|
||||||
SetHotkey(hotkey.Hotkey, (s, e) =>
|
SetHotkey(hotkey.Hotkey, (s, e) =>
|
||||||
{
|
{
|
||||||
if (ShouldIgnoreHotkeys())
|
if (mainViewModel.ShouldIgnoreHotkeys() || mainViewModel.GameModeStatus)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mainViewModel.MainWindowVisibility = Visibility.Visible;
|
mainViewModel.Show();
|
||||||
mainViewModel.ChangeQueryText(hotkey.ActionKeyword);
|
mainViewModel.ChangeQueryText(hotkey.ActionKeyword, true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ namespace Flow.Launcher.Helper
|
||||||
{
|
{
|
||||||
var window = Application.Current.Windows.OfType<Window>().FirstOrDefault(x => x.GetType() == typeof(T))
|
var window = Application.Current.Windows.OfType<Window>().FirstOrDefault(x => x.GetType() == typeof(T))
|
||||||
?? (T)Activator.CreateInstance(typeof(T), args);
|
?? (T)Activator.CreateInstance(typeof(T), args);
|
||||||
Application.Current.MainWindow.Hide();
|
|
||||||
|
|
||||||
// Fix UI bug
|
// Fix UI bug
|
||||||
// Add `window.WindowState = WindowState.Normal`
|
// Add `window.WindowState = WindowState.Normal`
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,56 @@
|
||||||
<UserControl x:Class="Flow.Launcher.HotkeyControl"
|
<UserControl
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
x:Class="Flow.Launcher.HotkeyControl"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:input="clr-namespace:System.Windows.Input;assembly=PresentationCore"
|
xmlns:input="clr-namespace:System.Windows.Input;assembly=PresentationCore"
|
||||||
mc:Ignorable="d"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
Height="24"
|
Height="24"
|
||||||
d:DesignHeight="300" d:DesignWidth="300">
|
d:DesignHeight="300"
|
||||||
|
d:DesignWidth="300"
|
||||||
|
mc:Ignorable="d">
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="150" />
|
<ColumnDefinition Width="200" />
|
||||||
<ColumnDefinition Width="125" />
|
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<TextBox x:Name="tbHotkey" TabIndex="100" VerticalContentAlignment="Center" Grid.Column="0"
|
<Popup
|
||||||
PreviewKeyDown="TbHotkey_OnPreviewKeyDown" input:InputMethod.IsInputMethodEnabled="False"/>
|
x:Name="popup"
|
||||||
<TextBlock x:Name="tbMsg" Visibility="Hidden" Margin="5 0 0 0" VerticalAlignment="Center" Grid.Column="1" />
|
AllowDrop="True"
|
||||||
|
AllowsTransparency="True"
|
||||||
|
IsOpen="{Binding IsKeyboardFocused, ElementName=tbHotkey, Mode=OneWay}"
|
||||||
|
Placement="Top"
|
||||||
|
PlacementTarget="{Binding ElementName=tbHotkey}"
|
||||||
|
PopupAnimation="Fade"
|
||||||
|
StaysOpen="True"
|
||||||
|
VerticalOffset="-5">
|
||||||
|
<Border
|
||||||
|
Width="140"
|
||||||
|
Height="30"
|
||||||
|
Background="{DynamicResource Color01B}"
|
||||||
|
BorderBrush="{DynamicResource Color21B}"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="4">
|
||||||
|
<TextBlock
|
||||||
|
x:Name="tbMsg"
|
||||||
|
Margin="0,0,0,0"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="13"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Foreground="{DynamicResource Color05B}"
|
||||||
|
Visibility="Visible">
|
||||||
|
Press key
|
||||||
|
</TextBlock>
|
||||||
|
</Border>
|
||||||
|
</Popup>
|
||||||
|
|
||||||
|
<TextBox
|
||||||
|
x:Name="tbHotkey"
|
||||||
|
Margin="0,0,18,0"
|
||||||
|
VerticalContentAlignment="Center"
|
||||||
|
input:InputMethod.IsInputMethodEnabled="False"
|
||||||
|
PreviewKeyDown="TbHotkey_OnPreviewKeyDown"
|
||||||
|
TabIndex="100"
|
||||||
|
LostFocus="tbHotkey_LostFocus"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|
@ -8,11 +8,16 @@ using Flow.Launcher.Core.Resource;
|
||||||
using Flow.Launcher.Helper;
|
using Flow.Launcher.Helper;
|
||||||
using Flow.Launcher.Infrastructure.Hotkey;
|
using Flow.Launcher.Infrastructure.Hotkey;
|
||||||
using Flow.Launcher.Plugin;
|
using Flow.Launcher.Plugin;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace Flow.Launcher
|
namespace Flow.Launcher
|
||||||
{
|
{
|
||||||
public partial class HotkeyControl : UserControl
|
public partial class HotkeyControl : UserControl
|
||||||
{
|
{
|
||||||
|
private Brush tbMsgForegroundColorOriginal;
|
||||||
|
|
||||||
|
private string tbMsgTextOriginal;
|
||||||
|
|
||||||
public HotkeyModel CurrentHotkey { get; private set; }
|
public HotkeyModel CurrentHotkey { get; private set; }
|
||||||
public bool CurrentHotkeyAvailable { get; private set; }
|
public bool CurrentHotkeyAvailable { get; private set; }
|
||||||
|
|
||||||
|
|
@ -23,17 +28,24 @@ namespace Flow.Launcher
|
||||||
public HotkeyControl()
|
public HotkeyControl()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
tbMsgTextOriginal = tbMsg.Text;
|
||||||
|
tbMsgForegroundColorOriginal = tbMsg.Foreground;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TbHotkey_OnPreviewKeyDown(object sender, KeyEventArgs e)
|
private CancellationTokenSource hotkeyUpdateSource;
|
||||||
|
|
||||||
|
private void TbHotkey_OnPreviewKeyDown(object sender, KeyEventArgs e)
|
||||||
{
|
{
|
||||||
|
hotkeyUpdateSource?.Cancel();
|
||||||
|
hotkeyUpdateSource?.Dispose();
|
||||||
|
hotkeyUpdateSource = new();
|
||||||
|
var token = hotkeyUpdateSource.Token;
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
tbMsg.Visibility = Visibility.Hidden;
|
|
||||||
|
|
||||||
//when alt is pressed, the real key should be e.SystemKey
|
//when alt is pressed, the real key should be e.SystemKey
|
||||||
Key key = (e.Key == Key.System ? e.SystemKey : e.Key);
|
Key key = e.Key == Key.System ? e.SystemKey : e.Key;
|
||||||
|
|
||||||
SpecialKeyState specialKeyState = GlobalHotkey.Instance.CheckModifiers();
|
SpecialKeyState specialKeyState = GlobalHotkey.CheckModifiers();
|
||||||
|
|
||||||
var hotkeyModel = new HotkeyModel(
|
var hotkeyModel = new HotkeyModel(
|
||||||
specialKeyState.AltPressed,
|
specialKeyState.AltPressed,
|
||||||
|
|
@ -49,14 +61,15 @@ namespace Flow.Launcher
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Dispatcher.InvokeAsync(async () =>
|
_ = Dispatcher.InvokeAsync(async () =>
|
||||||
{
|
{
|
||||||
await Task.Delay(500);
|
await Task.Delay(500, token);
|
||||||
SetHotkey(hotkeyModel);
|
if (!token.IsCancellationRequested)
|
||||||
|
await SetHotkey(hotkeyModel);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetHotkey(HotkeyModel keyModel, bool triggerValidate = true)
|
public async Task SetHotkey(HotkeyModel keyModel, bool triggerValidate = true)
|
||||||
{
|
{
|
||||||
CurrentHotkey = keyModel;
|
CurrentHotkey = keyModel;
|
||||||
|
|
||||||
|
|
@ -78,6 +91,13 @@ namespace Flow.Launcher
|
||||||
}
|
}
|
||||||
tbMsg.Visibility = Visibility.Visible;
|
tbMsg.Visibility = Visibility.Visible;
|
||||||
OnHotkeyChanged();
|
OnHotkeyChanged();
|
||||||
|
|
||||||
|
var token = hotkeyUpdateSource.Token;
|
||||||
|
await Task.Delay(500, token);
|
||||||
|
if (token.IsCancellationRequested)
|
||||||
|
return;
|
||||||
|
FocusManager.SetFocusedElement(FocusManager.GetFocusScope(this), null);
|
||||||
|
Keyboard.ClearFocus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -88,9 +108,12 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
private bool CheckHotkeyAvailability() => HotKeyMapper.CheckAvailability(CurrentHotkey);
|
private bool CheckHotkeyAvailability() => HotKeyMapper.CheckAvailability(CurrentHotkey);
|
||||||
|
|
||||||
public new bool IsFocused
|
public new bool IsFocused => tbHotkey.IsFocused;
|
||||||
|
|
||||||
|
private void tbHotkey_LostFocus(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
get { return tbHotkey.IsFocused; }
|
tbMsg.Text = tbMsgTextOriginal;
|
||||||
|
tbMsg.Foreground = tbMsgForegroundColorOriginal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BIN
Flow.Launcher/Images/gamemode.ico
Normal file
BIN
Flow.Launcher/Images/gamemode.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.4 KiB |
BIN
Flow.Launcher/Images/page_img01.png
Normal file
BIN
Flow.Launcher/Images/page_img01.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
BIN
Flow.Launcher/Images/wizard.png
Normal file
BIN
Flow.Launcher/Images/wizard.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.9 KiB |
|
|
@ -1,7 +1,8 @@
|
||||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
<ResourceDictionary
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:system="clr-namespace:System;assembly=mscorlib">
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
<!--MainWindow-->
|
xmlns:system="clr-namespace:System;assembly=mscorlib">
|
||||||
|
<!-- MainWindow -->
|
||||||
<system:String x:Key="registerHotkeyFailed">Failed to register hotkey: {0}</system:String>
|
<system:String x:Key="registerHotkeyFailed">Failed to register hotkey: {0}</system:String>
|
||||||
<system:String x:Key="couldnotStartCmd">Could not start {0}</system:String>
|
<system:String x:Key="couldnotStartCmd">Could not start {0}</system:String>
|
||||||
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Invalid Flow Launcher plugin file format</system:String>
|
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Invalid Flow Launcher plugin file format</system:String>
|
||||||
|
|
@ -13,53 +14,72 @@
|
||||||
<system:String x:Key="iconTraySettings">Settings</system:String>
|
<system:String x:Key="iconTraySettings">Settings</system:String>
|
||||||
<system:String x:Key="iconTrayAbout">About</system:String>
|
<system:String x:Key="iconTrayAbout">About</system:String>
|
||||||
<system:String x:Key="iconTrayExit">Exit</system:String>
|
<system:String x:Key="iconTrayExit">Exit</system:String>
|
||||||
|
<system:String x:Key="closeWindow">Close</system:String>
|
||||||
|
<system:String x:Key="GameMode">Game Mode</system:String>
|
||||||
|
<system:String x:Key="GameModeToolTip">Suspend the use of Hotkeys.</system:String>
|
||||||
|
|
||||||
<!--Setting General-->
|
<!-- Setting General -->
|
||||||
<system:String x:Key="flowlauncher_settings">Flow Launcher Settings</system:String>
|
<system:String x:Key="flowlauncher_settings">Flow Launcher Settings</system:String>
|
||||||
<system:String x:Key="general">General</system:String>
|
<system:String x:Key="general">General</system:String>
|
||||||
<system:String x:Key="portableMode">Portable Mode</system:String>
|
<system:String x:Key="portableMode">Portable Mode</system:String>
|
||||||
|
<system:String x:Key="portableModeToolTIp">Store all settings and user data in one folder (Useful when used with removable drives or cloud services).</system:String>
|
||||||
<system:String x:Key="startFlowLauncherOnSystemStartup">Start Flow Launcher on system startup</system:String>
|
<system:String x:Key="startFlowLauncherOnSystemStartup">Start Flow Launcher on system startup</system:String>
|
||||||
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Hide Flow Launcher when focus is lost</system:String>
|
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Hide Flow Launcher when focus is lost</system:String>
|
||||||
<system:String x:Key="dontPromptUpdateMsg">Do not show new version notifications</system:String>
|
<system:String x:Key="dontPromptUpdateMsg">Do not show new version notifications</system:String>
|
||||||
<system:String x:Key="rememberLastLocation">Remember last launch location</system:String>
|
<system:String x:Key="rememberLastLocation">Remember last launch location</system:String>
|
||||||
<system:String x:Key="language">Language</system:String>
|
<system:String x:Key="language">Language</system:String>
|
||||||
<system:String x:Key="lastQueryMode">Last Query Style</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="LastQueryPreserved">Preserve Last Query</system:String>
|
||||||
<system:String x:Key="LastQuerySelected">Select 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="LastQueryEmpty">Empty last Query</system:String>
|
||||||
<system:String x:Key="maxShowResults">Maximum results shown</system:String>
|
<system:String x:Key="maxShowResults">Maximum results shown</system:String>
|
||||||
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignore hotkeys in fullscreen mode</system:String>
|
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignore hotkeys in fullscreen mode</system:String>
|
||||||
|
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Disable Flow Launcher activation when a full screen application is active (Recommended for games).</system:String>
|
||||||
|
<system:String x:Key="defaultFileManager">Default File Manager</system:String>
|
||||||
|
<system:String x:Key="defaultFileManagerToolTip">Select the file manager to use when opening the folder.</system:String>
|
||||||
|
<system:String x:Key="defaultBrowser">Default Web Browser</system:String>
|
||||||
|
<system:String x:Key="defaultBrowserToolTip">Setting for New Tab, New Window, Private Mode.</system:String>
|
||||||
<system:String x:Key="pythonDirectory">Python Directory</system:String>
|
<system:String x:Key="pythonDirectory">Python Directory</system:String>
|
||||||
<system:String x:Key="autoUpdates">Auto Update</system:String>
|
<system:String x:Key="autoUpdates">Auto Update</system:String>
|
||||||
<system:String x:Key="autoHideScrollBar">Auto Hide Scroll Bar</system:String>
|
|
||||||
<system:String x:Key="autoHideScrollBarToolTip">Automatically hides the Settings window scroll bar and show when hover the mouse over it</system:String>
|
|
||||||
<system:String x:Key="selectPythonDirectory">Select</system:String>
|
<system:String x:Key="selectPythonDirectory">Select</system:String>
|
||||||
<system:String x:Key="hideOnStartup">Hide Flow Launcher on startup</system:String>
|
<system:String x:Key="hideOnStartup">Hide Flow Launcher on startup</system:String>
|
||||||
<system:String x:Key="hideNotifyIcon">Hide tray icon</system:String>
|
<system:String x:Key="hideNotifyIcon">Hide tray icon</system:String>
|
||||||
<system:String x:Key="querySearchPrecision">Query Search Precision</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">Should Use Pinyin</system:String>
|
<system:String x:Key="ShouldUsePinyin">Should Use Pinyin</system:String>
|
||||||
<system:String x:Key="ShouldUsePinyinToolTip">Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for transliterating Chinese</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="shadowEffectNotAllowed">Shadow effect is not allowed while current theme has blur effect enabled</system:String>
|
<system:String x:Key="shadowEffectNotAllowed">Shadow effect is not allowed while current theme has blur effect enabled</system:String>
|
||||||
|
|
||||||
<!--Setting Plugin-->
|
<!-- Setting Plugin -->
|
||||||
<system:String x:Key="plugin">Plugin</system:String>
|
<system:String x:Key="plugin">Plugins</system:String>
|
||||||
<system:String x:Key="browserMorePlugins">Find more plugins</system:String>
|
<system:String x:Key="browserMorePlugins">Find more plugins</system:String>
|
||||||
<system:String x:Key="enable">Enable</system:String>
|
<system:String x:Key="enable">On</system:String>
|
||||||
<system:String x:Key="disable">Disable</system:String>
|
<system:String x:Key="disable">Off</system:String>
|
||||||
<system:String x:Key="actionKeywords">Action keyword:</system:String>
|
<system:String x:Key="actionKeywordsTitle">Action keyword Setting</system:String>
|
||||||
<system:String x:Key="currentActionKeywords">Current action keyword:</system:String>
|
<system:String x:Key="actionKeywords">Action keyword</system:String>
|
||||||
<system:String x:Key="newActionKeyword">New action keyword:</system:String>
|
<system:String x:Key="currentActionKeywords">Current action keyword</system:String>
|
||||||
<system:String x:Key="currentPriority">Current Priority:</system:String>
|
<system:String x:Key="newActionKeyword">New action keyword</system:String>
|
||||||
<system:String x:Key="newPriority">New Priority:</system:String>
|
<system:String x:Key="currentPriority">Current Priority</system:String>
|
||||||
<system:String x:Key="priority">Priority:</system:String>
|
<system:String x:Key="newPriority">New Priority</system:String>
|
||||||
|
<system:String x:Key="priority">Priority</system:String>
|
||||||
<system:String x:Key="pluginDirectory">Plugin Directory</system:String>
|
<system:String x:Key="pluginDirectory">Plugin Directory</system:String>
|
||||||
<system:String x:Key="author">Author</system:String>
|
<system:String x:Key="author">by</system:String>
|
||||||
<system:String x:Key="plugin_init_time">Init time:</system:String>
|
<system:String x:Key="plugin_init_time">Init time:</system:String>
|
||||||
<system:String x:Key="plugin_query_time">Query time:</system:String>
|
<system:String x:Key="plugin_query_time">Query time:</system:String>
|
||||||
|
<system:String x:Key="plugin_query_version">| Version</system:String>
|
||||||
|
<system:String x:Key="plugin_query_web">Website</system:String>
|
||||||
|
|
||||||
<!--Setting Theme-->
|
|
||||||
|
<!-- Setting Plugin Store -->
|
||||||
|
<system:String x:Key="pluginStore">Plugin Store</system:String>
|
||||||
|
<system:String x:Key="refresh">Refresh</system:String>
|
||||||
|
<system:String x:Key="install">Install</system:String>
|
||||||
|
|
||||||
|
<!-- Setting Theme -->
|
||||||
<system:String x:Key="theme">Theme</system:String>
|
<system:String x:Key="theme">Theme</system:String>
|
||||||
<system:String x:Key="browserMoreThemes">Browse for more themes</system:String>
|
<system:String x:Key="browserMoreThemes">Theme Gallery</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="hiThere">Hi There</system:String>
|
||||||
<system:String x:Key="queryBoxFont">Query Box Font</system:String>
|
<system:String x:Key="queryBoxFont">Query Box Font</system:String>
|
||||||
<system:String x:Key="resultItemFont">Result Item Font</system:String>
|
<system:String x:Key="resultItemFont">Result Item Font</system:String>
|
||||||
|
|
@ -67,12 +87,25 @@
|
||||||
<system:String x:Key="opacity">Opacity</system:String>
|
<system:String x:Key="opacity">Opacity</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_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="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>
|
||||||
|
|
||||||
<!--Setting Hotkey-->
|
<!-- Setting Hotkey -->
|
||||||
<system:String x:Key="hotkey">Hotkey</system:String>
|
<system:String x:Key="hotkey">Hotkey</system:String>
|
||||||
<system:String x:Key="flowlauncherHotkey">Flow Launcher Hotkey</system:String>
|
<system:String x:Key="flowlauncherHotkey">Flow Launcher Hotkey</system:String>
|
||||||
<system:String x:Key="openResultModifiers">Open Result Modifiers</system:String>
|
<system:String x:Key="flowlauncherHotkeyToolTip">Enter shortcut to show/hide Flow Launcher.</system:String>
|
||||||
|
<system:String x:Key="openResultModifiers">Open Result Modifier Key</system:String>
|
||||||
|
<system:String x:Key="openResultModifiersToolTip">Select a modifier key to open selected result via keyboard.</system:String>
|
||||||
<system:String x:Key="showOpenResultHotkey">Show Hotkey</system:String>
|
<system:String x:Key="showOpenResultHotkey">Show Hotkey</system:String>
|
||||||
|
<system:String x:Key="showOpenResultHotkeyToolTip">Show result selection hotkey with results.</system:String>
|
||||||
<system:String x:Key="customQueryHotkey">Custom Query Hotkey</system:String>
|
<system:String x:Key="customQueryHotkey">Custom Query Hotkey</system:String>
|
||||||
<system:String x:Key="customQuery">Query</system:String>
|
<system:String x:Key="customQuery">Query</system:String>
|
||||||
<system:String x:Key="delete">Delete</system:String>
|
<system:String x:Key="delete">Delete</system:String>
|
||||||
|
|
@ -81,10 +114,12 @@
|
||||||
<system:String x:Key="pleaseSelectAnItem">Please select an item</system:String>
|
<system:String x:Key="pleaseSelectAnItem">Please select an item</system:String>
|
||||||
<system:String x:Key="deleteCustomHotkeyWarning">Are you sure you want to delete {0} plugin hotkey?</system:String>
|
<system:String x:Key="deleteCustomHotkeyWarning">Are you sure you want to delete {0} plugin hotkey?</system:String>
|
||||||
<system:String x:Key="queryWindowShadowEffect">Query window shadow effect</system:String>
|
<system:String x:Key="queryWindowShadowEffect">Query window shadow effect</system:String>
|
||||||
<system:String x:Key="shadowEffectCPUUsage">Shadow effect has a substantial usage of GPU.</system:String>
|
<system:String x:Key="shadowEffectCPUUsage">Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.</system:String>
|
||||||
<system:String x:Key="shadowEffectPerformance">Not recommended if your computer performance is limited.</system:String>
|
<system:String x:Key="windowWidthSize">Window Width Size</system:String>
|
||||||
|
<system:String x:Key="useGlyphUI">Use Segoe Fluent Icons</system:String>
|
||||||
|
<system:String x:Key="useGlyphUIEffect">Use Segoe Fluent Icons for query results where supported</system:String>
|
||||||
|
|
||||||
<!--Setting Proxy-->
|
<!-- Setting Proxy -->
|
||||||
<system:String x:Key="proxy">HTTP Proxy</system:String>
|
<system:String x:Key="proxy">HTTP Proxy</system:String>
|
||||||
<system:String x:Key="enableProxy">Enable HTTP Proxy</system:String>
|
<system:String x:Key="enableProxy">Enable HTTP Proxy</system:String>
|
||||||
<system:String x:Key="server">HTTP Server</system:String>
|
<system:String x:Key="server">HTTP Server</system:String>
|
||||||
|
|
@ -100,26 +135,53 @@
|
||||||
<system:String x:Key="proxyIsCorrect">Proxy configured correctly</system:String>
|
<system:String x:Key="proxyIsCorrect">Proxy configured correctly</system:String>
|
||||||
<system:String x:Key="proxyConnectFailed">Proxy connection failed</system:String>
|
<system:String x:Key="proxyConnectFailed">Proxy connection failed</system:String>
|
||||||
|
|
||||||
<!--Setting About-->
|
<!-- Setting About -->
|
||||||
<system:String x:Key="about">About</system:String>
|
<system:String x:Key="about">About</system:String>
|
||||||
<system:String x:Key="website">Website</system:String>
|
<system:String x:Key="website">Website</system:String>
|
||||||
|
<system:String x:Key="github">Github</system:String>
|
||||||
|
<system:String x:Key="docs">Docs</system:String>
|
||||||
<system:String x:Key="version">Version</system:String>
|
<system:String x:Key="version">Version</system:String>
|
||||||
<system:String x:Key="about_activate_times">You have activated Flow Launcher {0} times</system:String>
|
<system:String x:Key="about_activate_times">You have activated Flow Launcher {0} times</system:String>
|
||||||
<system:String x:Key="checkUpdates">Check for Updates</system:String>
|
<system:String x:Key="checkUpdates">Check for Updates</system:String>
|
||||||
<system:String x:Key="newVersionTips">New version {0} is available, would you like to restart Flow Launcher to use the update?</system:String>
|
<system:String x:Key="newVersionTips">New version {0} is available, would you like to restart Flow Launcher to use the update?</system:String>
|
||||||
<system:String x:Key="checkUpdatesFailed">Check updates failed, please check your connection and proxy settings to api.github.com.</system:String>
|
<system:String x:Key="checkUpdatesFailed">Check updates failed, please check your connection and proxy settings to api.github.com.</system:String>
|
||||||
<system:String x:Key="downloadUpdatesFailed">
|
<system:String x:Key="downloadUpdatesFailed">
|
||||||
Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
|
Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
|
||||||
or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
|
or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
|
||||||
</system:String>
|
</system:String>
|
||||||
<system:String x:Key="releaseNotes">Release Notes</system:String>
|
<system:String x:Key="releaseNotes">Release Notes</system:String>
|
||||||
<system:String x:Key="documentation">Usage Tips:</system:String>
|
<system:String x:Key="documentation">Usage Tips</system:String>
|
||||||
|
<system:String x:Key="devtool">DevTools</system:String>
|
||||||
|
<system:String x:Key="settingfolder">Setting Folder</system:String>
|
||||||
|
<system:String x:Key="logfolder">Log Folder</system:String>
|
||||||
|
<system:String x:Key="welcomewindow">Wizard</system:String>
|
||||||
|
|
||||||
<!--Priority Setting Dialog-->
|
<!-- 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>
|
||||||
|
|
||||||
|
<!-- DefaultBrowser Setting Dialog -->
|
||||||
|
<system:String x:Key="defaultBrowserTitle">Default Web Browser</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_newtab">New Window</system:String>
|
||||||
|
<system:String x:Key="defaultBrowser_newWindow">New Tab</system:String>
|
||||||
|
<system:String x:Key="defaultBrowser_parameter">Priviate Mode</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="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="invalidPriority">Please provide an valid integer for Priority!</system:String>
|
||||||
|
|
||||||
<!--Action Keyword Setting Dialog-->
|
<!-- Action Keyword Setting Dialog -->
|
||||||
<system:String x:Key="oldActionKeywords">Old Action Keyword</system:String>
|
<system:String x:Key="oldActionKeywords">Old Action Keyword</system:String>
|
||||||
<system:String x:Key="newActionKeywords">New Action Keyword</system:String>
|
<system:String x:Key="newActionKeywords">New Action Keyword</system:String>
|
||||||
<system:String x:Key="cancel">Cancel</system:String>
|
<system:String x:Key="cancel">Cancel</system:String>
|
||||||
|
|
@ -129,19 +191,20 @@
|
||||||
<system:String x:Key="newActionKeywordsHasBeenAssigned">This new Action Keyword is already assigned to another plugin, please choose a different one</system:String>
|
<system:String x:Key="newActionKeywordsHasBeenAssigned">This new Action Keyword is already assigned to another plugin, please choose a different one</system:String>
|
||||||
<system:String x:Key="success">Success</system:String>
|
<system:String x:Key="success">Success</system:String>
|
||||||
<system:String x:Key="completedSuccessfully">Completed successfully</system:String>
|
<system:String x:Key="completedSuccessfully">Completed successfully</system:String>
|
||||||
<system:String x:Key="actionkeyword_tips">Use * if you don't want to specify an action keyword</system:String>
|
<system:String x:Key="actionkeyword_tips">Enter the action keyword you like to use to start the plugin. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords.</system:String>
|
||||||
|
|
||||||
<!--Custom Query Hotkey Dialog-->
|
<!-- Custom Query Hotkey Dialog -->
|
||||||
<system:String x:Key="customeQueryHotkeyTitle">Custom Plugin Hotkey</system:String>
|
<system:String x:Key="customeQueryHotkeyTitle">Custom Query Hotkey</system:String>
|
||||||
|
<system:String x:Key="customeQueryHotkeyTips">Press the custom hotkey to automatically insert the specified query.</system:String>
|
||||||
<system:String x:Key="preview">Preview</system:String>
|
<system:String x:Key="preview">Preview</system:String>
|
||||||
<system:String x:Key="hotkeyIsNotUnavailable">Hotkey is unavailable, please select a new hotkey</system:String>
|
<system:String x:Key="hotkeyIsNotUnavailable">Hotkey is unavailable, please select a new hotkey</system:String>
|
||||||
<system:String x:Key="invalidPluginHotkey">Invalid plugin hotkey</system:String>
|
<system:String x:Key="invalidPluginHotkey">Invalid plugin hotkey</system:String>
|
||||||
<system:String x:Key="update">Update</system:String>
|
<system:String x:Key="update">Update</system:String>
|
||||||
|
|
||||||
<!--Hotkey Control-->
|
<!-- Hotkey Control -->
|
||||||
<system:String x:Key="hotkeyUnavailable">Hotkey Unavailable</system:String>
|
<system:String x:Key="hotkeyUnavailable">Hotkey Unavailable</system:String>
|
||||||
|
|
||||||
<!--Crash Reporter-->
|
<!-- Crash Reporter -->
|
||||||
<system:String x:Key="reportWindow_version">Version</system:String>
|
<system:String x:Key="reportWindow_version">Version</system:String>
|
||||||
<system:String x:Key="reportWindow_time">Time</system:String>
|
<system:String x:Key="reportWindow_time">Time</system:String>
|
||||||
<system:String x:Key="reportWindow_reproduce">Please tell us how application crashed so we can fix it</system:String>
|
<system:String x:Key="reportWindow_reproduce">Please tell us how application crashed so we can fix it</system:String>
|
||||||
|
|
@ -157,16 +220,18 @@
|
||||||
<system:String x:Key="reportWindow_report_failed">Failed to send report</system:String>
|
<system:String x:Key="reportWindow_report_failed">Failed to send report</system:String>
|
||||||
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Flow Launcher got an error</system:String>
|
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Flow Launcher got an error</system:String>
|
||||||
|
|
||||||
<!--General Notice-->
|
<!-- General Notice -->
|
||||||
<system:String x:Key="pleaseWait">Please wait...</system:String>
|
<system:String x:Key="pleaseWait">Please wait...</system:String>
|
||||||
|
|
||||||
<!--update-->
|
<!-- update -->
|
||||||
<system:String x:Key="update_flowlauncher_update_check">Checking for new update</system:String>
|
<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_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_update_found">Update found</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_updating">Updating...</system:String>
|
<system:String x:Key="update_flowlauncher_updating">Updating...</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.
|
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">
|
||||||
Please manually move your profile data folder from {0} to {1}</system:String>
|
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}
|
||||||
|
</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_new_update">New Update</system:String>
|
<system:String x:Key="update_flowlauncher_new_update">New Update</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_new_version_available">New Flow Launcher release {0} is now available</system:String>
|
<system:String x:Key="update_flowlauncher_update_new_version_available">New Flow Launcher release {0} is now available</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_error">An error occurred while trying to install software updates</system:String>
|
<system:String x:Key="update_flowlauncher_update_error">An error occurred while trying to install software updates</system:String>
|
||||||
|
|
@ -179,4 +244,40 @@
|
||||||
<system:String x:Key="update_flowlauncher_update_files">Update files</system:String>
|
<system:String x:Key="update_flowlauncher_update_files">Update files</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_upadte_description">Update description</system:String>
|
<system:String x:Key="update_flowlauncher_update_upadte_description">Update description</system:String>
|
||||||
|
|
||||||
</ResourceDictionary>
|
<!-- 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>
|
||||||
|
|
||||||
|
<!-- 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 Contaning Folder</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlShiftEnterDesc">Run as Admin</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlHDesc">Query History</system:String>
|
||||||
|
<system:String x:Key="HotkeyESCDesc">Back to Result in Context Menu</system:String>
|
||||||
|
<system:String x:Key="HotkeyRunDesc">Open / Run Selected Item</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlIDesc">Open Setting Window</system:String>
|
||||||
|
<system:String x:Key="HotkeyF5Desc">Reload Plugin Data</system:String>
|
||||||
|
|
||||||
|
<system:String x:Key="RecommendWeather">Weather</system:String>
|
||||||
|
<system:String x:Key="RecommendWeatherDesc">Weather in Google Result</system:String>
|
||||||
|
<system:String x:Key="RecommendShell">> ping 8.8.8.8</system:String>
|
||||||
|
<system:String x:Key="RecommendShellDesc">Shell Command</system:String>
|
||||||
|
<system:String x:Key="RecommendBluetooth">Bluetooth</system:String>
|
||||||
|
<system:String x:Key="RecommendBluetoothDesc">Bluetooth in Windows Setting</system:String>
|
||||||
|
<system:String x:Key="RecommendAcronyms">sn</system:String>
|
||||||
|
<system:String x:Key="RecommendAcronymsDesc">Sticky Notes</system:String>
|
||||||
|
|
||||||
|
</ResourceDictionary>
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
<ResourceDictionary
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:system="clr-namespace:System;assembly=mscorlib">
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
<!--MainWindow-->
|
xmlns:system="clr-namespace:System;assembly=mscorlib">
|
||||||
<system:String x:Key="registerHotkeyFailed">핫키 등록 실패: {0}</system:String>
|
<!-- MainWindow -->
|
||||||
|
<system:String x:Key="registerHotkeyFailed">단축키 등록 실패: {0}</system:String>
|
||||||
<system:String x:Key="couldnotStartCmd">{0}을 실행할 수 없습니다.</system:String>
|
<system:String x:Key="couldnotStartCmd">{0}을 실행할 수 없습니다.</system:String>
|
||||||
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Flow Launcher 플러그인 파일 형식이 유효하지 않습니다.</system:String>
|
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Flow Launcher 플러그인 파일 형식이 유효하지 않습니다.</system:String>
|
||||||
<system:String x:Key="setAsTopMostInThisQuery">이 쿼리의 최상위로 설정</system:String>
|
<system:String x:Key="setAsTopMostInThisQuery">이 쿼리의 최상위로 설정</system:String>
|
||||||
|
|
@ -13,57 +14,110 @@
|
||||||
<system:String x:Key="iconTraySettings">설정</system:String>
|
<system:String x:Key="iconTraySettings">설정</system:String>
|
||||||
<system:String x:Key="iconTrayAbout">정보</system:String>
|
<system:String x:Key="iconTrayAbout">정보</system:String>
|
||||||
<system:String x:Key="iconTrayExit">종료</system:String>
|
<system:String x:Key="iconTrayExit">종료</system:String>
|
||||||
|
<system:String x:Key="closeWindow">닫기</system:String>
|
||||||
|
<system:String x:Key="GameMode">게임 모드</system:String>
|
||||||
|
<system:String x:Key="GameModeToolTip">단축키 사용을 일시중단합니다.</system:String>
|
||||||
|
|
||||||
<!--Setting General-->
|
<!-- Setting General -->
|
||||||
<system:String x:Key="flowlauncher_settings">Flow Launcher 설정</system:String>
|
<system:String x:Key="flowlauncher_settings">Flow Launcher 설정</system:String>
|
||||||
<system:String x:Key="general">일반</system:String>
|
<system:String x:Key="general">일반</system:String>
|
||||||
|
<system:String x:Key="portableMode">포터블 모드</system:String>
|
||||||
|
<system:String x:Key="portableModeToolTIp">모든 설정이 폴더안에 들어갑니다. USB 드라이브나 클라우드로 사용 가능합니다.</system:String>
|
||||||
<system:String x:Key="startFlowLauncherOnSystemStartup">시스템 시작 시 Flow Launcher 실행</system:String>
|
<system:String x:Key="startFlowLauncherOnSystemStartup">시스템 시작 시 Flow Launcher 실행</system:String>
|
||||||
<system:String x:Key="hideFlowLauncherWhenLoseFocus">포커스 잃으면 Flow Launcher 숨김</system:String>
|
<system:String x:Key="hideFlowLauncherWhenLoseFocus">포커스 잃으면 Flow Launcher 숨김</system:String>
|
||||||
<system:String x:Key="dontPromptUpdateMsg">새 버전 알림 끄기</system:String>
|
<system:String x:Key="dontPromptUpdateMsg">새 버전 알림 끄기</system:String>
|
||||||
<system:String x:Key="rememberLastLocation">마지막 실행 위치 기억</system:String>
|
<system:String x:Key="rememberLastLocation">마지막 실행 위치 기억</system:String>
|
||||||
<system:String x:Key="language">언어</system:String>
|
<system:String x:Key="language">언어</system:String>
|
||||||
<system:String x:Key="lastQueryMode">마지막 쿼리 스타일</system:String>
|
<system:String x:Key="lastQueryMode">마지막 쿼리 스타일</system:String>
|
||||||
|
<system:String x:Key="lastQueryModeToolTip">쿼리박스를 열었을 때 쿼리 처리 방식</system:String>
|
||||||
<system:String x:Key="LastQueryPreserved">직전 쿼리에 계속 입력</system:String>
|
<system:String x:Key="LastQueryPreserved">직전 쿼리에 계속 입력</system:String>
|
||||||
<system:String x:Key="LastQuerySelected">직전 쿼리 내용 선택</system:String>
|
<system:String x:Key="LastQuerySelected">직전 쿼리 내용 선택</system:String>
|
||||||
<system:String x:Key="LastQueryEmpty">직전 쿼리 지우기</system:String>
|
<system:String x:Key="LastQueryEmpty">직전 쿼리 지우기</system:String>
|
||||||
<system:String x:Key="maxShowResults">표시할 결과 수</system:String>
|
<system:String x:Key="maxShowResults">표시할 결과 수</system:String>
|
||||||
<system:String x:Key="ignoreHotkeysOnFullscreen">전체화면 모드에서는 핫키 무시</system:String>
|
<system:String x:Key="ignoreHotkeysOnFullscreen">전체화면 모드에서는 단축키 무시</system:String>
|
||||||
|
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">게이머라면 켜는 것을 추천합니다.</system:String>
|
||||||
|
<system:String x:Key="defaultFileManager">기본 파일관리자</system:String>
|
||||||
|
<system:String x:Key="defaultFileManagerToolTip">폴더를 열 때 사용할 파일관리자를 선택하세요.</system:String>
|
||||||
<system:String x:Key="pythonDirectory">Python 디렉토리</system:String>
|
<system:String x:Key="pythonDirectory">Python 디렉토리</system:String>
|
||||||
<system:String x:Key="autoUpdates">자동 업데이트</system:String>
|
<system:String x:Key="autoUpdates">자동 업데이트</system:String>
|
||||||
<system:String x:Key="selectPythonDirectory">선택</system:String>
|
<system:String x:Key="selectPythonDirectory">선택</system:String>
|
||||||
<system:String x:Key="hideOnStartup">시작 시 Flow Launcher 숨김</system:String>
|
<system:String x:Key="hideOnStartup">시작 시 Flow Launcher 숨김</system:String>
|
||||||
|
<system:String x:Key="hideNotifyIcon">트레이 아이콘 숨기기</system:String>
|
||||||
|
<system:String x:Key="querySearchPrecision">쿼리 검색 정밀도</system:String>
|
||||||
|
<system:String x:Key="querySearchPrecisionToolTip">검색 결과에 필요한 최소 매치 점수를 변경합니다.</system:String>
|
||||||
|
<system:String x:Key="ShouldUsePinyin">항상 Pinyin 사용</system:String>
|
||||||
|
<system:String x:Key="ShouldUsePinyinToolTip">Pinyin을 사용하여 검색할 수 있습니다. Pinyin(병음)은 로마자 중국어 입력 방식입니다.</system:String>
|
||||||
|
<system:String x:Key="shadowEffectNotAllowed">반투명 흐림 효과를 사용하는 경우, 그림자 효과를 쓸 수 없습니다.</system:String>
|
||||||
|
|
||||||
<!--Setting Plugin-->
|
<!-- Setting Plugin -->
|
||||||
<system:String x:Key="plugin">플러그인</system:String>
|
<system:String x:Key="plugin">플러그인</system:String>
|
||||||
<system:String x:Key="browserMorePlugins">플러그인 더 찾아보기</system:String>
|
<system:String x:Key="browserMorePlugins">플러그인 더 찾아보기</system:String>
|
||||||
<system:String x:Key="disable">비활성화</system:String>
|
<system:String x:Key="enable">켬</system:String>
|
||||||
|
<system:String x:Key="disable">끔</system:String>
|
||||||
<system:String x:Key="actionKeywords">액션 키워드</system:String>
|
<system:String x:Key="actionKeywords">액션 키워드</system:String>
|
||||||
<system:String x:Key="pluginDirectory">플러그인 디렉토리</system:String>
|
<system:String x:Key="currentActionKeywords">현재 액션 키워드</system:String>
|
||||||
<system:String x:Key="author">저자</system:String>
|
<system:String x:Key="newActionKeyword">새 액션 키워드</system:String>
|
||||||
|
<system:String x:Key="currentPriority">현재 중요도:</system:String>
|
||||||
|
<system:String x:Key="newPriority">새 중요도:</system:String>
|
||||||
|
<system:String x:Key="priority">중요도</system:String>
|
||||||
|
<system:String x:Key="pluginDirectory">플러그인 폴더</system:String>
|
||||||
|
<system:String x:Key="author">제작자</system:String>
|
||||||
<system:String x:Key="plugin_init_time">초기화 시간:</system:String>
|
<system:String x:Key="plugin_init_time">초기화 시간:</system:String>
|
||||||
<system:String x:Key="plugin_query_time">쿼리 시간:</system:String>
|
<system:String x:Key="plugin_query_time">쿼리 시간:</system:String>
|
||||||
|
<system:String x:Key="plugin_query_version">| 버전</system:String>
|
||||||
|
<system:String x:Key="plugin_query_web">웹사이트</system:String>
|
||||||
|
|
||||||
<!--Setting Theme-->
|
|
||||||
|
<!-- Setting Plugin Store -->
|
||||||
|
<system:String x:Key="pluginStore">플러그인 스토어</system:String>
|
||||||
|
<system:String x:Key="refresh">새로고침</system:String>
|
||||||
|
<system:String x:Key="install">설치</system:String>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Setting Theme -->
|
||||||
<system:String x:Key="theme">테마</system:String>
|
<system:String x:Key="theme">테마</system:String>
|
||||||
<system:String x:Key="browserMoreThemes">테마 더 찾아보기</system:String>
|
<system:String x:Key="browserMoreThemes">테마 갤러리</system:String>
|
||||||
|
<system:String x:Key="howToCreateTheme">테마 제작 안내</system:String>
|
||||||
|
<system:String x:Key="hiThere">Hi There</system:String>
|
||||||
<system:String x:Key="queryBoxFont">쿼리 상자 글꼴</system:String>
|
<system:String x:Key="queryBoxFont">쿼리 상자 글꼴</system:String>
|
||||||
<system:String x:Key="resultItemFont">결과 항목 글꼴</system:String>
|
<system:String x:Key="resultItemFont">결과 항목 글꼴</system:String>
|
||||||
<system:String x:Key="windowMode">윈도우 모드</system:String>
|
<system:String x:Key="windowMode">윈도우 모드</system:String>
|
||||||
<system:String x:Key="opacity">투명도</system:String>
|
<system:String x:Key="opacity">투명도</system:String>
|
||||||
|
<system:String x:Key="theme_load_failure_path_not_exists">{0} 테마가 존재하지 않습니다. 기본 테마로 변경합니다.</system:String>
|
||||||
|
<system:String x:Key="theme_load_failure_parse_error">{0} 테마 로드에 실패했습니다. 기본 테마로 변경합니다.</system:String>
|
||||||
|
<system:String x:Key="ThemeFolder">테마 폴더</system:String>
|
||||||
|
<system:String x:Key="OpenThemeFolder">테마 폴더 열기</system:String>
|
||||||
|
<system:String x:Key="ColorScheme">앱 색상</system:String>
|
||||||
|
<system:String x:Key="ColorSchemeSystem">시스템 기본</system:String>
|
||||||
|
<system:String x:Key="ColorSchemeLight">밝게</system:String>
|
||||||
|
<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="Animation">애니메이션</system:String>
|
||||||
|
<system:String x:Key="AnimationTip">일부 UI에 애니메이션을 사용합니다.</system:String>
|
||||||
|
|
||||||
<!--Setting Hotkey-->
|
<!-- Setting Hotkey -->
|
||||||
<system:String x:Key="hotkey">핫키</system:String>
|
<system:String x:Key="hotkey">단축키</system:String>
|
||||||
<system:String x:Key="flowlauncherHotkey">Flow Launcher 핫키</system:String>
|
<system:String x:Key="flowlauncherHotkey">Flow Launcher 단축키</system:String>
|
||||||
<system:String x:Key="openResultModifiers">결과 수정 자 열기</system:String>
|
<system:String x:Key="flowlauncherHotkeyToolTip">Flow Launcher를 열 때 사용할 단축키를 입력합니다.</system:String>
|
||||||
<system:String x:Key="customQueryHotkey">사용자지정 쿼리 핫키</system:String>
|
<system:String x:Key="openResultModifiers">결과 선택 단축키</system:String>
|
||||||
|
<system:String x:Key="openResultModifiersToolTip">결과 목록을 선택하는 단축키입니다.</system:String>
|
||||||
<system:String x:Key="showOpenResultHotkey">단축키 표시</system:String>
|
<system:String x:Key="showOpenResultHotkey">단축키 표시</system:String>
|
||||||
|
<system:String x:Key="showOpenResultHotkeyToolTip">결과창에서 결과 선택 단축키를 표시합니다.</system:String>
|
||||||
|
<system:String x:Key="customQueryHotkey">사용자지정 쿼리 단축키</system:String>
|
||||||
|
<system:String x:Key="customQuery">쿼리</system:String>
|
||||||
<system:String x:Key="delete">삭제</system:String>
|
<system:String x:Key="delete">삭제</system:String>
|
||||||
<system:String x:Key="edit">편집</system:String>
|
<system:String x:Key="edit">편집</system:String>
|
||||||
<system:String x:Key="add">추가</system:String>
|
<system:String x:Key="add">추가</system:String>
|
||||||
<system:String x:Key="pleaseSelectAnItem">항목을 선택하세요.</system:String>
|
<system:String x:Key="pleaseSelectAnItem">항목을 선택하세요.</system:String>
|
||||||
<system:String x:Key="deleteCustomHotkeyWarning">{0} 플러그인 핫키를 삭제하시겠습니까?</system:String>
|
<system:String x:Key="deleteCustomHotkeyWarning">{0} 플러그인 단축키를 삭제하시겠습니까?</system:String>
|
||||||
|
<system:String x:Key="queryWindowShadowEffect">그림자 효과</system:String>
|
||||||
|
<system:String x:Key="shadowEffectCPUUsage">그림자 효과는 GPU를 사용합니다. 컴퓨터 퍼포먼스가 제한적인 경우 사용을 추천하지 않습니다.</system:String>
|
||||||
|
<system:String x:Key="windowWidthSize">창 넓이</system:String>
|
||||||
|
<system:String x:Key="useGlyphUI">플루언트 아이콘 사용</system:String>
|
||||||
|
<system:String x:Key="useGlyphUIEffect">결과 및 일부 메뉴에서 플루언트 아이콘을 사용합니다.</system:String>
|
||||||
|
|
||||||
<!--Setting Proxy-->
|
<!-- Setting Proxy -->
|
||||||
<system:String x:Key="proxy">HTTP 프록시</system:String>
|
<system:String x:Key="proxy">HTTP 프록시</system:String>
|
||||||
<system:String x:Key="enableProxy">HTTP 프록시 켜기</system:String>
|
<system:String x:Key="enableProxy">HTTP 프록시 켜기</system:String>
|
||||||
<system:String x:Key="server">HTTP 서버</system:String>
|
<system:String x:Key="server">HTTP 서버</system:String>
|
||||||
|
|
@ -79,16 +133,42 @@
|
||||||
<system:String x:Key="proxyIsCorrect">프록시 설정 정상</system:String>
|
<system:String x:Key="proxyIsCorrect">프록시 설정 정상</system:String>
|
||||||
<system:String x:Key="proxyConnectFailed">프록시 연결 실패</system:String>
|
<system:String x:Key="proxyConnectFailed">프록시 연결 실패</system:String>
|
||||||
|
|
||||||
<!--Setting About-->
|
<!-- Setting About -->
|
||||||
<system:String x:Key="about">정보</system:String>
|
<system:String x:Key="about">정보</system:String>
|
||||||
<system:String x:Key="website">웹사이트</system:String>
|
<system:String x:Key="website">웹사이트</system:String>
|
||||||
|
<system:String x:Key="github">Github</system:String>
|
||||||
|
<system:String x:Key="docs">문서</system:String>
|
||||||
<system:String x:Key="version">버전</system:String>
|
<system:String x:Key="version">버전</system:String>
|
||||||
<system:String x:Key="about_activate_times">Flow Launcher를 {0}번 실행했습니다.</system:String>
|
<system:String x:Key="about_activate_times">Flow Launcher를 {0}번 실행했습니다.</system:String>
|
||||||
<system:String x:Key="checkUpdates">업데이트 확인</system:String>
|
<system:String x:Key="checkUpdates">업데이트 확인</system:String>
|
||||||
<system:String x:Key="newVersionTips">새 버전({0})이 있습니다. Flow Launcher를 재시작하세요.</system:String>
|
<system:String x:Key="newVersionTips">새 버전({0})이 있습니다. Flow Launcher를 재시작하세요.</system:String>
|
||||||
<system:String x:Key="releaseNotes">릴리즈 노트:</system:String>
|
<system:String x:Key="checkUpdatesFailed">업데이트 확인을 실패했습니다. api.github.com로의 연결 또는 프록시 설정을 확인해주세요.</system:String>
|
||||||
|
<system:String x:Key="downloadUpdatesFailed">
|
||||||
|
업데이트 다운로드에 실패했습니다. github-cloud.s3.amazonaws.com의 연결 또는 프록시 설정을 확인해주세요.
|
||||||
|
수동 다운로드를 하려면 https://github.com/Flow-Launcher/Flow.Launcher/releases 으로 방문하세요.
|
||||||
|
</system:String>
|
||||||
|
<system:String x:Key="releaseNotes">릴리즈 노트</system:String>
|
||||||
|
<system:String x:Key="documentation">사용 팁</system:String>
|
||||||
|
<system:String x:Key="devtool">개발자도구</system:String>
|
||||||
|
<system:String x:Key="settingfolder">설정 폴더</system:String>
|
||||||
|
<system:String x:Key="logfolder">로그 폴더</system:String>
|
||||||
|
<system:String x:Key="welcomewindow">마법사</system:String>
|
||||||
|
|
||||||
<!--Action Keyword Setting Dialog-->
|
<!-- FileManager Setting Dialog -->
|
||||||
|
<system:String x:Key="fileManagerWindow">파일관리자 선택</system:String>
|
||||||
|
<system:String x:Key="fileManager_tips">사용하려는 파일관리자를 선택하고 필요한 경우 인수를 추가하세요. 기본 인수는 "%d" 이며 해당 위치에 경로가 입력됩니다. 예를들어 "totalcmd.exe /A c:\windows"와 같은 명령이 필요한 경우, 인수는 /A "%d" 입니다.</system:String>
|
||||||
|
<system:String x:Key="fileManager_tips2">"%f"는 특정 파일의 경로를 나타냅니다. 파일관리자에서 선택한 파일/폴더의 위치를 강조하는 기능에서 사용됩니다. 이 인수는 "파일경로 인수" 항목에서만 사용할 수 있습니다. 파일관리자에 해당 기능이 없거나 잘 모를 경우 "%d" 인수를 사용할 수 있습니다.</system:String>
|
||||||
|
<system:String x:Key="fileManager_name">파일관리자</system:String>
|
||||||
|
<system:String x:Key="fileManager_profile_name">프로필 이름</system:String>
|
||||||
|
<system:String x:Key="fileManager_path">파일관리자 경로</system:String>
|
||||||
|
<system:String x:Key="fileManager_directory_arg">폴더경로 인수</system:String>
|
||||||
|
<system:String x:Key="fileManager_file_arg">파일경로 인수</system:String>
|
||||||
|
|
||||||
|
<!-- Priority Setting Dialog -->
|
||||||
|
<system:String x:Key="changePriorityWindow">중요도 변경</system:String>
|
||||||
|
<system:String x:Key="priority_tips">높은 수를 넣을수록 상위 결과에 표시됩니다. 5를 시도해보세요. 다른 플러그인 보다 결과를 낮춰 표시하고 싶다면, 그보다 낮은 수를 입력하세요.</system:String>
|
||||||
|
<system:String x:Key="invalidPriority">중요도에 올바른 정수를 입력하세요.</system:String>
|
||||||
|
<!-- Action Keyword Setting Dialog -->
|
||||||
<system:String x:Key="oldActionKeywords">예전 액션 키워드</system:String>
|
<system:String x:Key="oldActionKeywords">예전 액션 키워드</system:String>
|
||||||
<system:String x:Key="newActionKeywords">새 액션 키워드</system:String>
|
<system:String x:Key="newActionKeywords">새 액션 키워드</system:String>
|
||||||
<system:String x:Key="cancel">취소</system:String>
|
<system:String x:Key="cancel">취소</system:String>
|
||||||
|
|
@ -97,18 +177,21 @@
|
||||||
<system:String x:Key="newActionKeywordsCannotBeEmpty">새 액션 키워드를 입력하세요.</system:String>
|
<system:String x:Key="newActionKeywordsCannotBeEmpty">새 액션 키워드를 입력하세요.</system:String>
|
||||||
<system:String x:Key="newActionKeywordsHasBeenAssigned">새 액션 키워드가 할당된 플러그인이 이미 있습니다. 다른 액션 키워드를 입력하세요.</system:String>
|
<system:String x:Key="newActionKeywordsHasBeenAssigned">새 액션 키워드가 할당된 플러그인이 이미 있습니다. 다른 액션 키워드를 입력하세요.</system:String>
|
||||||
<system:String x:Key="success">성공</system:String>
|
<system:String x:Key="success">성공</system:String>
|
||||||
<system:String x:Key="actionkeyword_tips">액션 키워드를 지정하지 않으려면 *를 사용하세요.</system:String>
|
<system:String x:Key="completedSuccessfully">성공적으로 완료했습니다.</system:String>
|
||||||
|
<system:String x:Key="actionkeyword_tips">플러그인을 시작하는데 필요한 액션 키워드를 입력하세요. 액션 키워드를 지정하지 않으려면 *를 사용하세요. 이 경우 키워드를 입력하지 않아도 동작합니다.</system:String>
|
||||||
|
|
||||||
<!--Custom Query Hotkey Dialog-->
|
<!-- Custom Query Hotkey Dialog -->
|
||||||
|
<system:String x:Key="customeQueryHotkeyTitle">커스텀 플러그인 단축키</system:String>
|
||||||
|
<system:String x:Key="customeQueryHotkeyTips">단축키를 지정하여 특정 쿼리를 자동으로 입력할 수 있습니다. 사용하고 싶은 단축키를 눌러 지정한 후, 사용할 쿼리를 입력하세요.</system:String>
|
||||||
<system:String x:Key="preview">미리보기</system:String>
|
<system:String x:Key="preview">미리보기</system:String>
|
||||||
<system:String x:Key="hotkeyIsNotUnavailable">핫키를 사용할 수 없습니다. 다른 핫키를 입력하세요.</system:String>
|
<system:String x:Key="hotkeyIsNotUnavailable">단축키를 사용할 수 없습니다. 다른 단축키를 입력하세요.</system:String>
|
||||||
<system:String x:Key="invalidPluginHotkey">플러그인 핫키가 유효하지 않습니다.</system:String>
|
<system:String x:Key="invalidPluginHotkey">플러그인 단축키가 유효하지 않습니다.</system:String>
|
||||||
<system:String x:Key="update">업데이트</system:String>
|
<system:String x:Key="update">업데이트</system:String>
|
||||||
|
|
||||||
<!--Hotkey Control-->
|
<!-- Hotkey Control -->
|
||||||
<system:String x:Key="hotkeyUnavailable">핫키를 사용할 수 없습니다.</system:String>
|
<system:String x:Key="hotkeyUnavailable">단축키를 사용할 수 없습니다.</system:String>
|
||||||
|
|
||||||
<!--Crash Reporter-->
|
<!-- Crash Reporter -->
|
||||||
<system:String x:Key="reportWindow_version">버전</system:String>
|
<system:String x:Key="reportWindow_version">버전</system:String>
|
||||||
<system:String x:Key="reportWindow_time">시간</system:String>
|
<system:String x:Key="reportWindow_time">시간</system:String>
|
||||||
<system:String x:Key="reportWindow_reproduce">수정을 위해 애플리케이션이 어떻게 충돌했는지 알려주세요.</system:String>
|
<system:String x:Key="reportWindow_reproduce">수정을 위해 애플리케이션이 어떻게 충돌했는지 알려주세요.</system:String>
|
||||||
|
|
@ -124,14 +207,64 @@
|
||||||
<system:String x:Key="reportWindow_report_failed">보고서를 보내지 못했습니다.</system:String>
|
<system:String x:Key="reportWindow_report_failed">보고서를 보내지 못했습니다.</system:String>
|
||||||
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Flow Launcher에 문제가 발생했습니다.</system:String>
|
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Flow Launcher에 문제가 발생했습니다.</system:String>
|
||||||
|
|
||||||
<!--update-->
|
<!-- General Notice -->
|
||||||
|
<system:String x:Key="pleaseWait">잠시 기다려주세요...</system:String>
|
||||||
|
<!-- update -->
|
||||||
|
<system:String x:Key="update_flowlauncher_update_check">새 업데이트 확인 중</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_new_version_available">새 Flow Launcher 버전({0})을 사용할 수 있습니다.</system:String>
|
<system:String x:Key="update_flowlauncher_update_new_version_available">새 Flow Launcher 버전({0})을 사용할 수 있습니다.</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_already_on_latest">이미 가장 최신 버전의 Flow Launcher를 사용중입니다.</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_found">업데이트 발견</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_updating">업데이트 중...</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">
|
||||||
|
Flow Launcher가 유저 정보 데이터를 새버전으로 옮길 수 없습니다.
|
||||||
|
프로필 데이터 폴더를 수동으로 {0} 에서 {1}로 옮겨주세요.
|
||||||
|
</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_new_update">새 업데이트</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_error">소프트웨어 업데이트를 설치하는 중에 오류가 발생했습니다.</system:String>
|
<system:String x:Key="update_flowlauncher_update_error">소프트웨어 업데이트를 설치하는 중에 오류가 발생했습니다.</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update">업데이트</system:String>
|
<system:String x:Key="update_flowlauncher_update">업데이트</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_cancel">취소</system:String>
|
<system:String x:Key="update_flowlauncher_update_cancel">취소</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_fail">업데이트 실패</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_update_restart_flowlauncher_tip">업데이트를 위해 Flow Launcher를 재시작합니다.</system:String>
|
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">업데이트를 위해 Flow Launcher를 재시작합니다.</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_upadte_files">아래 파일들이 업데이트됩니다.</system:String>
|
<system:String x:Key="update_flowlauncher_update_upadte_files">아래 파일들이 업데이트됩니다.</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_files">업데이트 파일</system:String>
|
<system:String x:Key="update_flowlauncher_update_files">업데이트 파일</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_upadte_description">업데이트 설명</system:String>
|
<system:String x:Key="update_flowlauncher_update_upadte_description">업데이트 설명</system:String>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Welcome Window -->
|
||||||
|
<system:String x:Key="Skip">건너뛰기</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page1_Title">Flow Launcher에 오신 것을 환영합니다</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page1_Text01">안녕하세요, Flow Launcher를 처음 실행하시네요!</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page1_Text02">시작하기전에 이 마법사가 간단한 설정을 도와드릴겁니다. 물론 건너 뛰셔도 됩니다. 사용하시는 언어를 선택해주세요.</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page2_Title">PC에서 모든 파일과 프로그램을 검색하고 실행합니다</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page2_Text01">프로그램, 파일, 즐겨찾기, YouTube, Twitter 등 모든 것을 검색하세요. 마우스에 손대지 않고 키보드만으로 모든 것을 얻을 수 있습니다.</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page2_Text02">Flow는 아래의 단축키로 실행합니다. 변경하려면 입력창을 선택하고 키보드에서 원하는 단축키를 누릅니다.</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page3_Title">단축키</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page4_Title">액션 키워드와 명령어</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page4_Text01">Flow Launcher는 플러그인을 통해 웹 검색, 프로그램 실행, 다양한 기능을 실행합니다. 특정 기능은 액션 키워드로 시작하며, 필요한 경우 액션 키워드 없이 사용할 수 있습니다. Flow Launcher에서 아래 쿼리를 사용해 보세요.</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page5_Title">Flow Launcher를 시작합시다</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page5_Text01">끝났습니다. Flow Launcher를 즐겨주세요. 시작하는 단축키를 잊지마세요 :)</system:String>
|
||||||
|
|
||||||
|
<!-- General Guide & Hotkey -->
|
||||||
|
|
||||||
|
<system:String x:Key="HotkeyUpDownDesc">뒤로/ 콘텍스트 메뉴</system:String>
|
||||||
|
<system:String x:Key="HotkeyLeftRightDesc">아이템 이동</system:String>
|
||||||
|
<system:String x:Key="HotkeyShiftEnterDesc">콘텍스트 메뉴 열기</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlEnterDesc">포함된 폴더 열기</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlShiftEnterDesc">관리자 권한으로 실행</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlHDesc">검색 기록</system:String>
|
||||||
|
<system:String x:Key="HotkeyESCDesc">콘텍스트 메뉴에서 뒤로 가기</system:String>
|
||||||
|
<system:String x:Key="HotkeyRunDesc">선택한 아이템 열기</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlIDesc">설정창 열기</system:String>
|
||||||
|
<system:String x:Key="HotkeyF5Desc">플러그인 데이터 새로고침</system:String>
|
||||||
|
|
||||||
|
<system:String x:Key="RecommendWeather">날씨</system:String>
|
||||||
|
<system:String x:Key="RecommendWeatherDesc">구글 날씨 검색</system:String>
|
||||||
|
<system:String x:Key="RecommendShell">> ping 8.8.8.8</system:String>
|
||||||
|
<system:String x:Key="RecommendShellDesc">쉘 명령어</system:String>
|
||||||
|
<system:String x:Key="RecommendBluetooth">블루투스</system:String>
|
||||||
|
<system:String x:Key="RecommendBluetoothDesc">윈도우 블루투스 설정</system:String>
|
||||||
|
<system:String x:Key="RecommendAcronyms">스메</system:String>
|
||||||
|
<system:String x:Key="RecommendAcronymsDesc">스티커 메모</system:String>
|
||||||
|
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
231
Flow.Launcher/Languages/pt-pt.xaml
Normal file
231
Flow.Launcher/Languages/pt-pt.xaml
Normal file
|
|
@ -0,0 +1,231 @@
|
||||||
|
<?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">Falha ao registar tecla de atalho: {0}</system:String>
|
||||||
|
<system:String x:Key="couldnotStartCmd">Não foi possível iniciar {0}</system:String>
|
||||||
|
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Formato do ficheiro inválido como plugin</system:String>
|
||||||
|
<system:String x:Key="setAsTopMostInThisQuery">Definir como principal para esta consulta</system:String>
|
||||||
|
<system:String x:Key="cancelTopMostInThisQuery">Cancelar como principal para esta consulta</system:String>
|
||||||
|
<system:String x:Key="executeQuery">Executar consulta: {0}</system:String>
|
||||||
|
<system:String x:Key="lastExecuteTime">Última execução: {0}</system:String>
|
||||||
|
<system:String x:Key="iconTrayOpen">Abrir</system:String>
|
||||||
|
<system:String x:Key="iconTraySettings">Definições</system:String>
|
||||||
|
<system:String x:Key="iconTrayAbout">Acerca</system:String>
|
||||||
|
<system:String x:Key="iconTrayExit">Sair</system:String>
|
||||||
|
<system:String x:Key="closeWindow">Fechar</system:String>
|
||||||
|
<system:String x:Key="GameMode">Modo de jogo</system:String>
|
||||||
|
<system:String x:Key="GameModeToolTip">Suspender utilização de teclas de atalho</system:String>
|
||||||
|
|
||||||
|
<!-- Setting General -->
|
||||||
|
<system:String x:Key="flowlauncher_settings">Definições Flow launcher</system:String>
|
||||||
|
<system:String x:Key="general">Geral</system:String>
|
||||||
|
<system:String x:Key="portableMode">Modo portátil</system:String>
|
||||||
|
<system:String x:Key="portableModeToolTIp">Guardar todas as definições e dados do utilizador numa pasta (indicado se utilizar discos amovíveis ou serviços cloud)</system:String>
|
||||||
|
<system:String x:Key="startFlowLauncherOnSystemStartup">Iniciar Flow launcher ao arrancar o sistema</system:String>
|
||||||
|
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Ocultar Flow launcher ao perder o foco</system:String>
|
||||||
|
<system:String x:Key="dontPromptUpdateMsg">Não notificar acerca de novas versões</system:String>
|
||||||
|
<system:String x:Key="rememberLastLocation">Memorizar localização anterior</system:String>
|
||||||
|
<system:String x:Key="language">Idioma</system:String>
|
||||||
|
<system:String x:Key="lastQueryMode">Estilo da última consulta</system:String>
|
||||||
|
<system:String x:Key="lastQueryModeToolTip">Mostrar/ocultar resultados anteriores ao reiniciar Flow Launcher</system:String>
|
||||||
|
<system:String x:Key="LastQueryPreserved">Manter última consulta</system:String>
|
||||||
|
<system:String x:Key="LastQuerySelected">Selecionar última consulta</system:String>
|
||||||
|
<system:String x:Key="LastQueryEmpty">Limpar última consulta</system:String>
|
||||||
|
<system:String x:Key="maxShowResults">N.º máximo de resultados</system:String>
|
||||||
|
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignorar teclas de atalho se em ecrã completo</system:String>
|
||||||
|
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Desativar ativação do Flow Launcher se alguma aplicação estiver em ecrã completo (recomendado para jogos)</system:String>
|
||||||
|
<system:String x:Key="defaultFileManager">Gestor de ficheiros padrão</system:String>
|
||||||
|
<system:String x:Key="defaultFileManagerToolTip">Selecione o gestor de ficheiros utilizado para abrir a página</system:String>
|
||||||
|
<system:String x:Key="pythonDirectory">Diretório Python</system:String>
|
||||||
|
<system:String x:Key="autoUpdates">Atualização automática</system:String>
|
||||||
|
<system:String x:Key="selectPythonDirectory">Selecionar</system:String>
|
||||||
|
<system:String x:Key="hideOnStartup">Ocultar Flow Launcher no arranque</system:String>
|
||||||
|
<system:String x:Key="hideNotifyIcon">Ocultar ícone da bandeja</system:String>
|
||||||
|
<system:String x:Key="querySearchPrecision">Precisão da pesquisa</system:String>
|
||||||
|
<system:String x:Key="querySearchPrecisionToolTip">Altera a precisão mínima necessário para obter resultados</system:String>
|
||||||
|
<system:String x:Key="ShouldUsePinyin">Utilizar Pinyin</system:String>
|
||||||
|
<system:String x:Key="ShouldUsePinyinToolTip">Permitir Pinyin para a pesquisa. Pinyin é o sistema padrão da ortografia romanizada para tradução de mandarim</system:String>
|
||||||
|
<system:String x:Key="shadowEffectNotAllowed">O efeito sombra não é permitido com este tema porque o efeito desfocar está ativo</system:String>
|
||||||
|
|
||||||
|
<!-- Setting Plugin -->
|
||||||
|
<system:String x:Key="plugin">Plugins</system:String>
|
||||||
|
<system:String x:Key="browserMorePlugins">Mais plugins</system:String>
|
||||||
|
<system:String x:Key="enable">Ativar</system:String>
|
||||||
|
<system:String x:Key="disable">Desativar</system:String>
|
||||||
|
<system:String x:Key="actionKeywordsTitle">Definição de palavra-chave</system:String>
|
||||||
|
<system:String x:Key="actionKeywords">Palavra-chave da ação</system:String>
|
||||||
|
<system:String x:Key="currentActionKeywords">Palavra-chave atual</system:String>
|
||||||
|
<system:String x:Key="newActionKeyword">Nova palavra-chave</system:String>
|
||||||
|
<system:String x:Key="currentPriority">Prioridade atual</system:String>
|
||||||
|
<system:String x:Key="newPriority">Nova prioridade</system:String>
|
||||||
|
<system:String x:Key="priority">Prioridade</system:String>
|
||||||
|
<system:String x:Key="pluginDirectory">Diretório de plugins</system:String>
|
||||||
|
<system:String x:Key="author">Autor:</system:String>
|
||||||
|
<system:String x:Key="plugin_init_time">Tempo de inicialização:</system:String>
|
||||||
|
<system:String x:Key="plugin_query_time">Tempo de consulta:</system:String>
|
||||||
|
<system:String x:Key="plugin_query_version">| Versão</system:String>
|
||||||
|
<system:String x:Key="plugin_query_web">Site</system:String>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Setting Plugin Store -->
|
||||||
|
<system:String x:Key="pluginStore">Loja de plugins</system:String>
|
||||||
|
<system:String x:Key="refresh">Recarregar</system:String>
|
||||||
|
<system:String x:Key="install">Instalar</system:String>
|
||||||
|
|
||||||
|
<!-- Setting Theme -->
|
||||||
|
<system:String x:Key="theme">Tema</system:String>
|
||||||
|
<system:String x:Key="browserMoreThemes">Galeria de temas</system:String>
|
||||||
|
<system:String x:Key="howToCreateTheme">Como criar um tema</system:String>
|
||||||
|
<system:String x:Key="hiThere">Olá</system:String>
|
||||||
|
<system:String x:Key="queryBoxFont">Tipo de letra da caixa de pesquisa</system:String>
|
||||||
|
<system:String x:Key="resultItemFont">Tipo de letra dos resultados</system:String>
|
||||||
|
<system:String x:Key="windowMode">Modo da janela</system:String>
|
||||||
|
<system:String x:Key="opacity">Opacidade</system:String>
|
||||||
|
<system:String x:Key="theme_load_failure_path_not_exists">O tema {0} não existe e será utilizado o tema padrão</system:String>
|
||||||
|
<system:String x:Key="theme_load_failure_parse_error">Não foi possível carregar o tema {0}, será utilizado o tema padrão</system:String>
|
||||||
|
<system:String x:Key="ThemeFolder">Pasta de temas</system:String>
|
||||||
|
<system:String x:Key="OpenThemeFolder">Abrir pasta de temas</system:String>
|
||||||
|
<system:String x:Key="ColorScheme">Esquema de cores</system:String>
|
||||||
|
<system:String x:Key="ColorSchemeSystem">Padrão do sistema</system:String>
|
||||||
|
<system:String x:Key="ColorSchemeLight">Claro</system:String>
|
||||||
|
<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="Animation">Animação</system:String>
|
||||||
|
<system:String x:Key="AnimationTip">Utilizar animações na aplicação</system:String>
|
||||||
|
|
||||||
|
<!-- Setting Hotkey -->
|
||||||
|
<system:String x:Key="hotkey">Tecla de atalho</system:String>
|
||||||
|
<system:String x:Key="flowlauncherHotkey">Tecla de atalho Flow Launcher</system:String>
|
||||||
|
<system:String x:Key="flowlauncherHotkeyToolTip">Introduza o atalho para mostrar/ocultar Flow launcher</system:String>
|
||||||
|
<system:String x:Key="openResultModifiers">Tecla modificadora para os resultados</system:String>
|
||||||
|
<system:String x:Key="openResultModifiersToolTip">Selecione a tecla modificadora para abrir o resultado através do teclado</system:String>
|
||||||
|
<system:String x:Key="showOpenResultHotkey">Mostrar tecla de atalho</system:String>
|
||||||
|
<system:String x:Key="showOpenResultHotkeyToolTip">Mostrar tecla de atalho em conjunto com os resultados.</system:String>
|
||||||
|
<system:String x:Key="customQueryHotkey">Tecla de atalho personalizada</system:String>
|
||||||
|
<system:String x:Key="customQuery">Consulta</system:String>
|
||||||
|
<system:String x:Key="delete">Eliminar</system:String>
|
||||||
|
<system:String x:Key="edit">Editar</system:String>
|
||||||
|
<system:String x:Key="add">Adicionar</system:String>
|
||||||
|
<system:String x:Key="pleaseSelectAnItem">Selecione um item</system:String>
|
||||||
|
<system:String x:Key="deleteCustomHotkeyWarning">Tem a certeza de que deseja remover a tecla de atalho do plugin {0}?</system:String>
|
||||||
|
<system:String x:Key="queryWindowShadowEffect">Efeito de sombra da janela</system:String>
|
||||||
|
<system:String x:Key="shadowEffectCPUUsage">Este efeito intensifica a utilização da GPU. Não deve ativar esta opção se o desempenho do seu computador for fraco.</system:String>
|
||||||
|
<system:String x:Key="windowWidthSize">Largura da janela</system:String>
|
||||||
|
<system:String x:Key="useGlyphUI">Utilizar ícones Segoe Fluent</system:String>
|
||||||
|
<system:String x:Key="useGlyphUIEffect">Se possível, utilizar ícones Segoe Fluent para os resultados</system:String>
|
||||||
|
|
||||||
|
<!-- Setting Proxy -->
|
||||||
|
<system:String x:Key="proxy">Proxy HTTP</system:String>
|
||||||
|
<system:String x:Key="enableProxy">Ativar proxy HTTP</system:String>
|
||||||
|
<system:String x:Key="server">Servidor HTTP</system:String>
|
||||||
|
<system:String x:Key="port">Porta</system:String>
|
||||||
|
<system:String x:Key="userName">Nome de utilizador</system:String>
|
||||||
|
<system:String x:Key="password">Palavra-passe</system:String>
|
||||||
|
<system:String x:Key="testProxy">Testar</system:String>
|
||||||
|
<system:String x:Key="save">Guardar</system:String>
|
||||||
|
<system:String x:Key="serverCantBeEmpty">Campo Servidor não pode estar vazio</system:String>
|
||||||
|
<system:String x:Key="portCantBeEmpty">Campo Porta não pode estar vazio</system:String>
|
||||||
|
<system:String x:Key="invalidPortFormat">Formato de porta inválido</system:String>
|
||||||
|
<system:String x:Key="saveProxySuccessfully">Configuração proxy guardada com sucesso</system:String>
|
||||||
|
<system:String x:Key="proxyIsCorrect">Proxy configurado corretamente</system:String>
|
||||||
|
<system:String x:Key="proxyConnectFailed">Falha na ligação ao proxy</system:String>
|
||||||
|
|
||||||
|
<!-- Setting About -->
|
||||||
|
<system:String x:Key="about">Acerca</system:String>
|
||||||
|
<system:String x:Key="website">Site</system:String>
|
||||||
|
<system:String x:Key="github">GitHub</system:String>
|
||||||
|
<system:String x:Key="docs">Documentos</system:String>
|
||||||
|
<system:String x:Key="version">Versão</system:String>
|
||||||
|
<system:String x:Key="about_activate_times">Ativou o Flow Launcher {0} vezes</system:String>
|
||||||
|
<system:String x:Key="checkUpdates">Procurar atualizações</system:String>
|
||||||
|
<system:String x:Key="newVersionTips">Está disponível a versão {0}. Gostaria de reiniciar Flow Launcher para atualizar a sua versão?</system:String>
|
||||||
|
<system:String x:Key="checkUpdatesFailed">Erro ao procurar atualizações. Verifique a sua ligação e as definições do proxy estabelecidas para api.github.com</system:String>
|
||||||
|
<system:String x:Key="downloadUpdatesFailed">
|
||||||
|
Não foi possível descarregar a atualização. Verifique a sua ligação e as definições do proxy estabelecidas para github-cloud.s3.amazonaws.com ou aceda a https://github.com/Flow-Launcher/Flow.Launcher/releases para descarregar a atualização.
|
||||||
|
</system:String>
|
||||||
|
<system:String x:Key="releaseNotes">Notas da versão</system:String>
|
||||||
|
<system:String x:Key="documentation">Dicas de utilização</system:String>
|
||||||
|
<system:String x:Key="devtool">DevTools</system:String>
|
||||||
|
<system:String x:Key="settingfolder">Pasta de definições</system:String>
|
||||||
|
<system:String x:Key="logfolder">Pasta de registos</system:String>
|
||||||
|
|
||||||
|
<!-- FileManager Setting Dialog -->
|
||||||
|
<system:String x:Key="fileManagerWindow">Selecione o gestor de ficheiros</system:String>
|
||||||
|
<system:String x:Key="fileManager_tips">Especifique a localização do executável do gestor de ficheiros e, eventualmente, alguns argumentos. Os argumentos padrão são "%d" e o caminho é introduzido nesse local. Por exemplo, se necessitar de um comando como "totalcmd.exe /A c:\windows", o argumento é /A "%d".</system:String>
|
||||||
|
<system:String x:Key="fileManager_tips2">"%f" é o argumento que representa o caminho do ficheiro. É utilizado para dar ênfase ao nome do ficheiro ou da pasta se utilizar um gestor de ficheiros não nativo. Este argumento apenas está disponível para o item "Arg para ficheiro". Se o seu gestor de ficheiros não possuir esta funcionalidade, pode utilizar "%d".</system:String>
|
||||||
|
<system:String x:Key="fileManager_name">Gestor de ficheiros</system:String>
|
||||||
|
<system:String x:Key="fileManager_profile_name">Nome do perfil</system:String>
|
||||||
|
<system:String x:Key="fileManager_path">Caminho do gestor de ficheiros</system:String>
|
||||||
|
<system:String x:Key="fileManager_directory_arg">Argumento para pasta</system:String>
|
||||||
|
<system:String x:Key="fileManager_file_arg">Argumento para ficheiro</system:String>
|
||||||
|
|
||||||
|
<!-- Priority Setting Dialog -->
|
||||||
|
<system:String x:Key="changePriorityWindow">Alterar prioridade</system:String>
|
||||||
|
<system:String x:Key="priority_tips">Quanto maior for o número, melhor avaliação terá o resultado. Experimente com o número 5. Se quiser que os resultados sejam inferiores aos dos outros plugins, indique um número negativo.</system:String>
|
||||||
|
<system:String x:Key="invalidPriority">Tem que indicar um valor inteiro para a prioridade!</system:String>
|
||||||
|
|
||||||
|
<!-- Action Keyword Setting Dialog -->
|
||||||
|
<system:String x:Key="oldActionKeywords">Palavra-chave atual</system:String>
|
||||||
|
<system:String x:Key="newActionKeywords">Nova palavra-chave</system:String>
|
||||||
|
<system:String x:Key="cancel">Cancelar</system:String>
|
||||||
|
<system:String x:Key="done">Feito</system:String>
|
||||||
|
<system:String x:Key="cannotFindSpecifiedPlugin">Plugin não encontrado</system:String>
|
||||||
|
<system:String x:Key="newActionKeywordsCannotBeEmpty">A nova palavra-chave não pode estar vazia</system:String>
|
||||||
|
<system:String x:Key="newActionKeywordsHasBeenAssigned">Esta palavra-chave já está associada a um plugin. Por favor escolha outra.</system:String>
|
||||||
|
<system:String x:Key="success">Sucesso</system:String>
|
||||||
|
<system:String x:Key="completedSuccessfully">Terminado com sucesso</system:String>
|
||||||
|
<system:String x:Key="actionkeyword_tips">Introduza a palavra-chave a utilizar para iniciar o plugin. Utilize * se não quiser utilizar esta funcionalidade e o plugin não será ativada com palavras-chave.</system:String>
|
||||||
|
|
||||||
|
<!-- Custom Query Hotkey Dialog -->
|
||||||
|
<system:String x:Key="customeQueryHotkeyTitle">Tecla de atalho personalizada</system:String>
|
||||||
|
<system:String x:Key="customeQueryHotkeyTips">Prima a tecla de atalho personalizada para introduzir automaticamente a consulta especificada</system:String>
|
||||||
|
<system:String x:Key="preview">Antevisão</system:String>
|
||||||
|
<system:String x:Key="hotkeyIsNotUnavailable">Tecla de atalho indisponível, por favor escolha outra</system:String>
|
||||||
|
<system:String x:Key="invalidPluginHotkey">Tecla de atalho inválida</system:String>
|
||||||
|
<system:String x:Key="update">Atualizar</system:String>
|
||||||
|
|
||||||
|
<!-- Hotkey Control -->
|
||||||
|
<system:String x:Key="hotkeyUnavailable">Tecla de atalho indisponível</system:String>
|
||||||
|
|
||||||
|
<!-- Crash Reporter -->
|
||||||
|
<system:String x:Key="reportWindow_version">Versão</system:String>
|
||||||
|
<system:String x:Key="reportWindow_time">Hora</system:String>
|
||||||
|
<system:String x:Key="reportWindow_reproduce">Indique-nos, por favor, como é que o erro ocorreu para que o possamos corrigir</system:String>
|
||||||
|
<system:String x:Key="reportWindow_send_report">Enviar relatório</system:String>
|
||||||
|
<system:String x:Key="reportWindow_cancel">Cancelar</system:String>
|
||||||
|
<system:String x:Key="reportWindow_general">Geral</system:String>
|
||||||
|
<system:String x:Key="reportWindow_exceptions">Exceções</system:String>
|
||||||
|
<system:String x:Key="reportWindow_exception_type">Tipo de exceção</system:String>
|
||||||
|
<system:String x:Key="reportWindow_source">Origem</system:String>
|
||||||
|
<system:String x:Key="reportWindow_stack_trace">Stack Trace</system:String>
|
||||||
|
<system:String x:Key="reportWindow_sending">A enviar</system:String>
|
||||||
|
<system:String x:Key="reportWindow_report_succeed">Relatório enviado com sucesso</system:String>
|
||||||
|
<system:String x:Key="reportWindow_report_failed">Falha ao enviar o relatório</system:String>
|
||||||
|
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Ocorreu um erro</system:String>
|
||||||
|
|
||||||
|
<!-- General Notice -->
|
||||||
|
<system:String x:Key="pleaseWait">Por favor aguarde...</system:String>
|
||||||
|
|
||||||
|
<!-- update -->
|
||||||
|
<system:String x:Key="update_flowlauncher_update_check">A procurar atualizações...</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_already_on_latest">A sua versão de Flow Launcher é a mais recente</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_found">Atualização encontrada</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_updating">A atualizar...</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">
|
||||||
|
Flow Launcher não conseguiu mover o seu perfil de dados para a nova versão.
|
||||||
|
Queira por favor mover a pasta do seu perfil de {0} para {1}
|
||||||
|
</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_new_update">Nova atualização</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_new_version_available">Está disponível a versão {0} do Flow Launcher</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_error">Ocorreu um erro ao tentar instalar as atualizações</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update">Atualizar</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_cancel">Cancelar</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_fail">Falha ao atualizar</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_check_connection">Verifique a sua ligação e as definições do proxy estabelecidas para github-cloud.s3.amazonaws.com</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">Esta atualização irá reiniciar o Flow Launcher</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_upadte_files">Os seguintes ficheiros serão atualizados</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_files">Atualizar ficheiros</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_upadte_description">Atualizar descrição</system:String>
|
||||||
|
|
||||||
|
</ResourceDictionary>
|
||||||
|
|
@ -1,182 +1,269 @@
|
||||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
<?xml version="1.0"?>
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
<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">
|
||||||
xmlns:system="clr-namespace:System;assembly=mscorlib">
|
<!-- MainWindow -->
|
||||||
<!--MainWindow-->
|
<system:String x:Key="registerHotkeyFailed">Nepodarilo sa registrovať klávesovú skratku {0}</system:String>
|
||||||
<system:String x:Key="registerHotkeyFailed">Nepodarilo sa registrovať klávesovú skratku {0}</system:String>
|
<system:String x:Key="couldnotStartCmd">Nepodarilo sa spustiť {0}</system:String>
|
||||||
<system:String x:Key="couldnotStartCmd">Nepodarilo sa spustiť {0}</system:String>
|
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Neplatný formát súboru pre plugin Flow Launchera</system:String>
|
||||||
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Neplatný formát súboru pre plugin Flow Launchera</system:String>
|
<system:String x:Key="setAsTopMostInThisQuery">Pri tomto zadaní umiestniť navrchu</system:String>
|
||||||
<system:String x:Key="setAsTopMostInThisQuery">Pri tomto zadaní umiestniť navrchu</system:String>
|
<system:String x:Key="cancelTopMostInThisQuery">Zrušiť umiestnenie navrchu pri tomto zadaní</system:String>
|
||||||
<system:String x:Key="cancelTopMostInThisQuery">Zrušiť umiestnenie navrchu pri tomto zadaní</system:String>
|
<system:String x:Key="executeQuery">Spustiť dopyt: {0}</system:String>
|
||||||
<system:String x:Key="executeQuery">Spustiť dopyt: {0}</system:String>
|
<system:String x:Key="lastExecuteTime">Posledný čas realizácie: {0}</system:String>
|
||||||
<system:String x:Key="lastExecuteTime">Posledný čas realizácie: {0}</system:String>
|
<system:String x:Key="iconTrayOpen">Otvoriť</system:String>
|
||||||
<system:String x:Key="iconTrayOpen">Otvoriť</system:String>
|
<system:String x:Key="iconTraySettings">Nastavenia</system:String>
|
||||||
<system:String x:Key="iconTraySettings">Nastavenia</system:String>
|
<system:String x:Key="iconTrayAbout">O aplikácii</system:String>
|
||||||
<system:String x:Key="iconTrayAbout">O aplikácii</system:String>
|
<system:String x:Key="iconTrayExit">Ukončiť</system:String>
|
||||||
<system:String x:Key="iconTrayExit">Ukončiť</system:String>
|
<system:String x:Key="closeWindow">Zavrieť</system:String>
|
||||||
|
<system:String x:Key="GameMode">Herný režim</system:String>
|
||||||
<!--Setting General-->
|
<system:String x:Key="GameModeToolTip">Pozastaviť používanie klávesových skratiek.</system:String>
|
||||||
<system:String x:Key="flowlauncher_settings">Nastavenia Flow Launchera</system:String>
|
|
||||||
<system:String x:Key="general">Všeobecné</system:String>
|
<!-- Setting General -->
|
||||||
<system:String x:Key="portableMode">Prenosný režim</system:String>
|
<system:String x:Key="flowlauncher_settings">Nastavenia Flow Launchera</system:String>
|
||||||
<system:String x:Key="startFlowLauncherOnSystemStartup">Spustiť Flow Launcher po štarte systému</system:String>
|
<system:String x:Key="general">Všeobecné</system:String>
|
||||||
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Schovať Flow Launcher po strate fokusu</system:String>
|
<system:String x:Key="portableMode">Prenosný režim</system:String>
|
||||||
<system:String x:Key="dontPromptUpdateMsg">Nezobrazovať upozornenia na novú verziu</system:String>
|
<system:String x:Key="portableModeToolTIp">Uloží všetky nastavenia a používateľské údaje do jedného priečinka (Užitočné pri vyberateľných diskoch a cloudových službách).</system:String>
|
||||||
<system:String x:Key="rememberLastLocation">Zapamätať si posledné umiestnenie</system:String>
|
<system:String x:Key="startFlowLauncherOnSystemStartup">Spustiť Flow Launcher po štarte systému</system:String>
|
||||||
<system:String x:Key="language">Jazyk</system:String>
|
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Schovať Flow Launcher po strate fokusu</system:String>
|
||||||
<system:String x:Key="lastQueryMode">Posledné vyhľadávanie</system:String>
|
<system:String x:Key="dontPromptUpdateMsg">Nezobrazovať upozornenia na novú verziu</system:String>
|
||||||
<system:String x:Key="LastQueryPreserved">Ponechať</system:String>
|
<system:String x:Key="rememberLastLocation">Zapamätať si posledné umiestnenie</system:String>
|
||||||
<system:String x:Key="LastQuerySelected">Označiť</system:String>
|
<system:String x:Key="language">Jazyk</system:String>
|
||||||
<system:String x:Key="LastQueryEmpty">Vymazať</system:String>
|
<system:String x:Key="lastQueryMode">Posledné vyhľadávanie</system:String>
|
||||||
<system:String x:Key="maxShowResults">Max. výsledkov</system:String>
|
<system:String x:Key="lastQueryModeToolTip">Zobrazí/skryje predchádzajúce výsledky pri opätovnej aktivácii Flow Launchera.</system:String>
|
||||||
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignorovať klávesové skratky v režime na celú obrazovku</system:String>
|
<system:String x:Key="LastQueryPreserved">Ponechať</system:String>
|
||||||
<system:String x:Key="pythonDirectory">Priečinok s Pythonom</system:String>
|
<system:String x:Key="LastQuerySelected">Označiť</system:String>
|
||||||
<system:String x:Key="autoUpdates">Automatická aktualizácia</system:String>
|
<system:String x:Key="LastQueryEmpty">Vymazať</system:String>
|
||||||
<system:String x:Key="autoHideScrollBar">Automaticky skryť posuvník</system:String>
|
<system:String x:Key="maxShowResults">Max. výsledkov</system:String>
|
||||||
<system:String x:Key="autoHideScrollBarToolTip">Automaticky skrývať posuvník v okne nastavení a zobraziť ho, keď naň prejdete myšou</system:String>
|
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignorovať klávesové skratky v režime na celú obrazovku</system:String>
|
||||||
<system:String x:Key="selectPythonDirectory">Vybrať</system:String>
|
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Zakázať aktiváciu Flow Launchera, keď je aktívna aplikácia na celú obrazovku (odporúčané pre hry).</system:String>
|
||||||
<system:String x:Key="hideOnStartup">Schovať Flow Launcher po spustení</system:String>
|
<system:String x:Key="defaultFileManager">Predvolený správca súborov</system:String>
|
||||||
<system:String x:Key="hideNotifyIcon">Schovať ikonu z oblasti oznámení</system:String>
|
<system:String x:Key="defaultFileManagerToolTip">Vyberte správcu súborov, ktorý sa má použiť pri otváraní priečinka.</system:String>
|
||||||
<system:String x:Key="querySearchPrecision">Presnosť vyhľadávania</system:String>
|
<system:String x:Key="pythonDirectory">Priečinok s Pythonom</system:String>
|
||||||
<system:String x:Key="ShouldUsePinyin">Použiť Pinyin</system:String>
|
<system:String x:Key="autoUpdates">Automatická aktualizácia</system:String>
|
||||||
<system:String x:Key="ShouldUsePinyinToolTip">Umožňuje vyhľadávanie pomocou Pinyin. Pinyin je štandardný systém romanizovaného pravopisu pre transliteráciu čínštiny</system:String>
|
<system:String x:Key="selectPythonDirectory">Vybrať</system:String>
|
||||||
<system:String x:Key="shadowEffectNotAllowed">Efekt tieňa nie je povolený, kým má aktuálny motív povolený efekt rozostrenia</system:String>
|
<system:String x:Key="hideOnStartup">Schovať Flow Launcher po spustení</system:String>
|
||||||
|
<system:String x:Key="hideNotifyIcon">Schovať ikonu z oblasti oznámení</system:String>
|
||||||
<!--Setting Plugin-->
|
<system:String x:Key="querySearchPrecision">Presnosť vyhľadávania</system:String>
|
||||||
<system:String x:Key="plugin">Plugin</system:String>
|
<system:String x:Key="querySearchPrecisionToolTip">Mení minimálne skóre zhody potrebné na zobrazenie výsledkov.</system:String>
|
||||||
<system:String x:Key="browserMorePlugins">Nájsť ďalšie pluginy</system:String>
|
<system:String x:Key="ShouldUsePinyin">Použiť Pinyin</system:String>
|
||||||
<system:String x:Key="enable">Povolené</system:String>
|
<system:String x:Key="ShouldUsePinyinToolTip">Umožňuje vyhľadávanie pomocou Pinyin. Pinyin je štandardný systém romanizovaného pravopisu pre transliteráciu čínštiny</system:String>
|
||||||
<system:String x:Key="disable">Zakázané</system:String>
|
<system:String x:Key="shadowEffectNotAllowed">Efekt tieňa nie je povolený, kým má aktuálny motív povolený efekt rozostrenia</system:String>
|
||||||
<system:String x:Key="actionKeywords">Skratka akcie</system:String>
|
|
||||||
<system:String x:Key="currentActionKeywords">Aktuálna akcia skratky:</system:String>
|
<!-- Setting Plugin -->
|
||||||
<system:String x:Key="newActionKeyword">Nová akcia skratky:</system:String>
|
<system:String x:Key="plugin">Pluginy</system:String>
|
||||||
<system:String x:Key="currentPriority">Aktuálna priorita:</system:String>
|
<system:String x:Key="browserMorePlugins">Nájsť ďalšie pluginy</system:String>
|
||||||
<system:String x:Key="newPriority">Nová priorita:</system:String>
|
<system:String x:Key="enable">Zap.</system:String>
|
||||||
<system:String x:Key="priority">Priorita:</system:String>
|
<system:String x:Key="disable">Vyp.</system:String>
|
||||||
<system:String x:Key="pluginDirectory">Priečinok s pluginmi</system:String>
|
<system:String x:Key="actionKeywordsTitle">Nastavenie kľúčového slova akcie</system:String>
|
||||||
<system:String x:Key="author">Autor</system:String>
|
<system:String x:Key="actionKeywords">Skratka akcie</system:String>
|
||||||
<system:String x:Key="plugin_init_time">Príprava:</system:String>
|
<system:String x:Key="currentActionKeywords">Aktuálna akcia skratky:</system:String>
|
||||||
<system:String x:Key="plugin_query_time">Čas dopytu:</system:String>
|
<system:String x:Key="newActionKeyword">Nová akcia skratky:</system:String>
|
||||||
|
<system:String x:Key="currentPriority">Aktuálna priorita:</system:String>
|
||||||
<!--Setting Theme-->
|
<system:String x:Key="newPriority">Nová priorita:</system:String>
|
||||||
<system:String x:Key="theme">Motív</system:String>
|
<system:String x:Key="priority">Priorita</system:String>
|
||||||
<system:String x:Key="browserMoreThemes">Prehliadať viac motívov</system:String>
|
<system:String x:Key="pluginDirectory">Priečinok s pluginmi</system:String>
|
||||||
<system:String x:Key="hiThere">Ahojte</system:String>
|
<system:String x:Key="author">od</system:String>
|
||||||
<system:String x:Key="queryBoxFont">Písmo vyhľadávacieho poľa</system:String>
|
<system:String x:Key="plugin_init_time">Príprava:</system:String>
|
||||||
<system:String x:Key="resultItemFont">Písmo výsledkov</system:String>
|
<system:String x:Key="plugin_query_time">Čas dopytu:</system:String>
|
||||||
<system:String x:Key="windowMode">Režim okno</system:String>
|
<system:String x:Key="plugin_query_version">| Verzia</system:String>
|
||||||
<system:String x:Key="opacity">Nepriehľadnosť</system:String>
|
<system:String x:Key="plugin_query_web">Webstránka</system:String>
|
||||||
<system:String x:Key="theme_load_failure_path_not_exists">Motív {0} neexistuje, návrat na predvolený motív</system:String>
|
|
||||||
<system:String x:Key="theme_load_failure_parse_error">Nepodarilo sa nečítať motív {0}, návrat na predvolený motív</system:String>
|
|
||||||
|
<!-- Setting Plugin Store -->
|
||||||
<!--Setting Hotkey-->
|
<system:String x:Key="pluginStore">Repozitár pluginov</system:String>
|
||||||
<system:String x:Key="hotkey">Klávesové skratky</system:String>
|
<system:String x:Key="refresh">Obnoviť</system:String>
|
||||||
<system:String x:Key="flowlauncherHotkey">Klávesová skratka pre Flow Launcher</system:String>
|
<system:String x:Key="install">Inštalovať</system:String>
|
||||||
<system:String x:Key="openResultModifiers">Modifikáčné klávesy na otvorenie výsledkov</system:String>
|
|
||||||
<system:String x:Key="showOpenResultHotkey">Zobraziť klávesovú skratku</system:String>
|
<!-- Setting Theme -->
|
||||||
<system:String x:Key="customQueryHotkey">Vlastná klávesová skratka na vyhľadávanie</system:String>
|
<system:String x:Key="theme">Motív</system:String>
|
||||||
<system:String x:Key="customQuery">Dopyt</system:String>
|
<system:String x:Key="browserMoreThemes">Galéria motívov</system:String>
|
||||||
<system:String x:Key="delete">Odstrániť</system:String>
|
<system:String x:Key="howToCreateTheme">Ako vytvoriť motív</system:String>
|
||||||
<system:String x:Key="edit">Upraviť</system:String>
|
<system:String x:Key="hiThere">Ahojte</system:String>
|
||||||
<system:String x:Key="add">Pridať</system:String>
|
<system:String x:Key="queryBoxFont">Písmo vyhľadávacieho poľa</system:String>
|
||||||
<system:String x:Key="pleaseSelectAnItem">Vyberte položku, prosím</system:String>
|
<system:String x:Key="resultItemFont">Písmo výsledkov</system:String>
|
||||||
<system:String x:Key="deleteCustomHotkeyWarning">Ste si istý, že chcete odstrániť klávesovú skratku {0} pre plugin?</system:String>
|
<system:String x:Key="windowMode">Režim okno</system:String>
|
||||||
<system:String x:Key="queryWindowShadowEffect">Tieňový efekt v poli vyhľadávania</system:String>
|
<system:String x:Key="opacity">Nepriehľadnosť</system:String>
|
||||||
<system:String x:Key="shadowEffectCPUUsage">Tieňový efekt významne využíva GPU.</system:String>
|
<system:String x:Key="theme_load_failure_path_not_exists">Motív {0} neexistuje, návrat na predvolený motív</system:String>
|
||||||
<system:String x:Key="shadowEffectPerformance">Neodporúča sa, ak je výkon počítača obmedzený.</system:String>
|
<system:String x:Key="theme_load_failure_parse_error">Nepodarilo sa nečítať motív {0}, návrat na predvolený motív</system:String>
|
||||||
|
<system:String x:Key="ThemeFolder">Priečinok s motívmi</system:String>
|
||||||
<!--Setting Proxy-->
|
<system:String x:Key="OpenThemeFolder">Otvoriť priečinok s motívmi</system:String>
|
||||||
<system:String x:Key="proxy">HTTP Proxy</system:String>
|
<system:String x:Key="ColorScheme">Farebná schéma</system:String>
|
||||||
<system:String x:Key="enableProxy">Povoliť HTTP Proxy</system:String>
|
<system:String x:Key="ColorSchemeSystem">Predvolené systémom</system:String>
|
||||||
<system:String x:Key="server">HTTP Server</system:String>
|
<system:String x:Key="ColorSchemeLight">Svetlý</system:String>
|
||||||
<system:String x:Key="port">Port</system:String>
|
<system:String x:Key="ColorSchemeDark">Tmavý</system:String>
|
||||||
<system:String x:Key="userName">Použív. meno</system:String>
|
<system:String x:Key="SoundEffect">Zvukový efekt</system:String>
|
||||||
<system:String x:Key="password">Heslo</system:String>
|
<system:String x:Key="SoundEffectTip">Po otvorení okna vyhľadávania prehrať krátky zvuk</system:String>
|
||||||
<system:String x:Key="testProxy">Test Proxy</system:String>
|
<system:String x:Key="Animation">Animácia</system:String>
|
||||||
<system:String x:Key="save">Uložiť</system:String>
|
<system:String x:Key="AnimationTip">Animovať používateľské rozhranie</system:String>
|
||||||
<system:String x:Key="serverCantBeEmpty">Pole Server nemôže byť prázdne</system:String>
|
|
||||||
<system:String x:Key="portCantBeEmpty">Pole Port nemôže byť prázdne</system:String>
|
<!-- Setting Hotkey -->
|
||||||
<system:String x:Key="invalidPortFormat">Neplatný formát portu</system:String>
|
<system:String x:Key="hotkey">Klávesové skratky</system:String>
|
||||||
<system:String x:Key="saveProxySuccessfully">Nastavenie proxy úspešne uložené</system:String>
|
<system:String x:Key="flowlauncherHotkey">Klávesová skratka pre Flow Launcher</system:String>
|
||||||
<system:String x:Key="proxyIsCorrect">Nastavenie proxy je v poriadku</system:String>
|
<system:String x:Key="flowlauncherHotkeyToolTip">Zadajte skratku na zobrazenie/skrytie Flow Launchera.</system:String>
|
||||||
<system:String x:Key="proxyConnectFailed">Pripojenie proxy zlyhalo</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>
|
||||||
<!--Setting About-->
|
<system:String x:Key="showOpenResultHotkey">Zobraziť klávesovú skratku</system:String>
|
||||||
<system:String x:Key="about">O aplikácii</system:String>
|
<system:String x:Key="showOpenResultHotkeyToolTip">Zobrazí klávesovú skratku spolu s výsledkami.</system:String>
|
||||||
<system:String x:Key="website">Webstránka</system:String>
|
<system:String x:Key="customQueryHotkey">Vlastná klávesová skratka na vyhľadávanie</system:String>
|
||||||
<system:String x:Key="version">Verzia</system:String>
|
<system:String x:Key="customQuery">Dopyt</system:String>
|
||||||
<system:String x:Key="about_activate_times">Flow Launcher bol aktivovaný {0}-krát</system:String>
|
<system:String x:Key="delete">Odstrániť</system:String>
|
||||||
<system:String x:Key="checkUpdates">Skontrolovať aktualizácie</system:String>
|
<system:String x:Key="edit">Upraviť</system:String>
|
||||||
<system:String x:Key="newVersionTips">Je dostupná nová verzia {0}, chcete reštartovať Flow Launcher, aby sa mohol aktualizovať?</system:String>
|
<system:String x:Key="add">Pridať</system:String>
|
||||||
<system:String x:Key="checkUpdatesFailed">Kontrola aktualizácií zlyhala, prosím, skontrolujte pripojenie na internet a nastavenie proxy k api.github.com.</system:String>
|
<system:String x:Key="pleaseSelectAnItem">Vyberte položku, prosím</system:String>
|
||||||
<system:String x:Key="downloadUpdatesFailed">
|
<system:String x:Key="deleteCustomHotkeyWarning">Ste si istý, že chcete odstrániť klávesovú skratku {0} pre plugin?</system:String>
|
||||||
Sťahovanie aktualizácií zlyhalo, skontrolujte pripojenie na internet a nastavenie proxy k github-cloud.s3.amazonaws.com,
|
<system:String x:Key="queryWindowShadowEffect">Tieňový efekt v poli vyhľadávania</system:String>
|
||||||
alebo prejdite na https://github.com/Flow-Launcher/Flow.Launcher/releases pre manuálne stiahnutie aktualizácie.
|
<system:String x:Key="shadowEffectCPUUsage">Tieňový efekt významne využíva GPU. Neodporúča sa, ak je výkon počítača obmedzený.</system:String>
|
||||||
</system:String>
|
<system:String x:Key="windowWidthSize">Veľkosť šírky okna</system:String>
|
||||||
<system:String x:Key="releaseNotes">Poznámky k vydaniu</system:String>
|
<system:String x:Key="useGlyphUI">Použiť ikony Segoe Fluent</system:String>
|
||||||
<system:String x:Key="documentation">Tipy na používanie:</system:String>
|
<system:String x:Key="useGlyphUIEffect">Použiť ikony Segoe Fluent, ak sú podporované</system:String>
|
||||||
|
|
||||||
<!--Priority Setting Dialog-->
|
<!-- Setting Proxy -->
|
||||||
<system:String x:Key="priority_tips">Vyššie číslo znamená, že výsledok bude vyššie. Skúste nastaviť napr. 5. Ak chcete, aby boli výsledky nižšie ako ktorékoľvek iné doplnky, zadajte záporné číslo</system:String>
|
<system:String x:Key="proxy">HTTP proxy</system:String>
|
||||||
<system:String x:Key="invalidPriority">Prosím, zadajte platné číslo pre prioritu!</system:String>
|
<system:String x:Key="enableProxy">Povoliť HTTP Proxy</system:String>
|
||||||
|
<system:String x:Key="server">HTTP server</system:String>
|
||||||
<!--Action Keyword Setting Dialog-->
|
<system:String x:Key="port">Port</system:String>
|
||||||
<system:String x:Key="oldActionKeywords">Stará skratka akcie</system:String>
|
<system:String x:Key="userName">Používateľské meno</system:String>
|
||||||
<system:String x:Key="newActionKeywords">Nová skratka akcie</system:String>
|
<system:String x:Key="password">Heslo</system:String>
|
||||||
<system:String x:Key="cancel">Zrušiť</system:String>
|
<system:String x:Key="testProxy">Test proxy</system:String>
|
||||||
<system:String x:Key="done">Hotovo</system:String>
|
<system:String x:Key="save">Uložiť</system:String>
|
||||||
<system:String x:Key="cannotFindSpecifiedPlugin">Nepodarilo sa nájsť zadaný plugin</system:String>
|
<system:String x:Key="serverCantBeEmpty">Pole Server nemôže byť prázdne</system:String>
|
||||||
<system:String x:Key="newActionKeywordsCannotBeEmpty">Nová skratka pre akciu nemôže byť prázdna</system:String>
|
<system:String x:Key="portCantBeEmpty">Pole Port nemôže byť prázdne</system:String>
|
||||||
<system:String x:Key="newActionKeywordsHasBeenAssigned">Nová skratka pre akciu bola priradená pre iný plugin, prosím, zvoľte inú skratku</system:String>
|
<system:String x:Key="invalidPortFormat">Neplatný formát portu</system:String>
|
||||||
<system:String x:Key="success">Úspešné</system:String>
|
<system:String x:Key="saveProxySuccessfully">Nastavenie proxy úspešne uložené</system:String>
|
||||||
<system:String x:Key="completedSuccessfully">Úspešne dokončené</system:String>
|
<system:String x:Key="proxyIsCorrect">Nastavenie proxy je v poriadku</system:String>
|
||||||
<system:String x:Key="actionkeyword_tips">Použite * ak nechcete určiť skratku pre akciu</system:String>
|
<system:String x:Key="proxyConnectFailed">Pripojenie proxy zlyhalo</system:String>
|
||||||
|
|
||||||
<!--Custom Query Hotkey Dialog-->
|
<!-- Setting About -->
|
||||||
<system:String x:Key="customeQueryHotkeyTitle">Vlastná klávesová skratka pre plugin</system:String>
|
<system:String x:Key="about">O aplikácii</system:String>
|
||||||
<system:String x:Key="preview">Náhľad</system:String>
|
<system:String x:Key="website">Webstránka</system:String>
|
||||||
<system:String x:Key="hotkeyIsNotUnavailable">Klávesová skratka je nedostupná, prosím, zadajte novú</system:String>
|
<system:String x:Key="github">Github</system:String>
|
||||||
<system:String x:Key="invalidPluginHotkey">Neplatná klávesová skratka pluginu</system:String>
|
<system:String x:Key="docs">Dokumentácia</system:String>
|
||||||
<system:String x:Key="update">Aktualizovať</system:String>
|
<system:String x:Key="version">Verzia</system:String>
|
||||||
|
<system:String x:Key="about_activate_times">Flow Launcher bol aktivovaný {0}-krát</system:String>
|
||||||
<!--Hotkey Control-->
|
<system:String x:Key="checkUpdates">Skontrolovať aktualizácie</system:String>
|
||||||
<system:String x:Key="hotkeyUnavailable">Klávesová skratka nedostupná</system:String>
|
<system:String x:Key="newVersionTips">Je dostupná nová verzia {0}, chcete reštartovať Flow Launcher, aby sa mohol aktualizovať?</system:String>
|
||||||
|
<system:String x:Key="checkUpdatesFailed">Kontrola aktualizácií zlyhala, prosím, skontrolujte pripojenie na internet a nastavenie proxy k api.github.com.</system:String>
|
||||||
<!--Crash Reporter-->
|
<system:String x:Key="downloadUpdatesFailed">
|
||||||
<system:String x:Key="reportWindow_version">Verzia</system:String>
|
Sťahovanie aktualizácií zlyhalo, skontrolujte pripojenie na internet a nastavenie proxy k github-cloud.s3.amazonaws.com,
|
||||||
<system:String x:Key="reportWindow_time">Čas</system:String>
|
alebo prejdite na https://github.com/Flow-Launcher/Flow.Launcher/releases pre manuálne stiahnutie aktualizácie.
|
||||||
<system:String x:Key="reportWindow_reproduce">Prosím, napíšte nám, ako došlo k pádu aplikácie, aby sme to mohli opraviť</system:String>
|
</system:String>
|
||||||
<system:String x:Key="reportWindow_send_report">Odoslať hlásenie</system:String>
|
<system:String x:Key="releaseNotes">Poznámky k vydaniu</system:String>
|
||||||
<system:String x:Key="reportWindow_cancel">Zrušiť</system:String>
|
<system:String x:Key="documentation">Tipy na používanie</system:String>
|
||||||
<system:String x:Key="reportWindow_general">Všeobecné</system:String>
|
<system:String x:Key="devtool">Nástroje pre vývojárov</system:String>
|
||||||
<system:String x:Key="reportWindow_exceptions">Výnimky</system:String>
|
<system:String x:Key="settingfolder">Priečinok s nastaveniami</system:String>
|
||||||
<system:String x:Key="reportWindow_exception_type">Typ výnimky</system:String>
|
<system:String x:Key="logfolder">Priečinok s logmi</system:String>
|
||||||
<system:String x:Key="reportWindow_source">Zdroj</system:String>
|
<system:String x:Key="welcomewindow">Sprievodca</system:String>
|
||||||
<system:String x:Key="reportWindow_stack_trace">Stack Trace</system:String>
|
|
||||||
<system:String x:Key="reportWindow_sending">Odosiela sa</system:String>
|
<!-- FileManager Setting Dialog -->
|
||||||
<system:String x:Key="reportWindow_report_succeed">Hlásenie bolo úspešne odoslané</system:String>
|
<system:String x:Key="fileManagerWindow">Vyberte správcu súborov</system:String>
|
||||||
<system:String x:Key="reportWindow_report_failed">Odoslanie hlásenia zlyhalo</system:String>
|
<system:String x:Key="fileManager_tips">Zadajte umiestnenie súboru správcu súborov, ktorý používate, a v prípade potreby pridajte argumenty. Predvolené argumenty sú "%d" a cesta sa zadáva na tomto mieste. Napríklad, ak sa vyžaduje príkaz, ako napríklad "totalcmd.exe /A c:\windows", argument je /A "%d".</system:String>
|
||||||
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Flow Launcher zaznamenal chybu</system:String>
|
<system:String x:Key="fileManager_tips2">"%f" je argument, ktorý predstavuje cestu k súboru. Používa sa na zvýraznenie názvu súboru/priečinka pri otváraní konkrétneho umiestnenia súboru v správcovi súborov tretej strany. Tento argument je k dispozícii len v položke "Arg. pre súbor". Ak správca súborov nemá túto funkciu, môžete použiť "%d".</system:String>
|
||||||
|
<system:String x:Key="fileManager_name">Správca súborov</system:String>
|
||||||
<!--General Notice-->
|
<system:String x:Key="fileManager_profile_name">Názov profilu</system:String>
|
||||||
<system:String x:Key="pleaseWait">Čakajte, prosím…</system:String>
|
<system:String x:Key="fileManager_path">Cesta k správcovi súborov</system:String>
|
||||||
|
<system:String x:Key="fileManager_directory_arg">Arg. pre priečinok</system:String>
|
||||||
<!--update-->
|
<system:String x:Key="fileManager_file_arg">Arg. pre súbor</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_check">Kontrolujú sa akutalizácie</system:String>
|
|
||||||
<system:String x:Key="update_flowlauncher_already_on_latest">Už máte najnovšiu verizu Flow Launchera</system:String>
|
<!-- Priority Setting Dialog -->
|
||||||
<system:String x:Key="update_flowlauncher_update_found">Bola nájdená aktualizácia</system:String>
|
<system:String x:Key="changePriorityWindow">Zmena priority</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_updating">Aktualizuje sa…</system:String>
|
<system:String x:Key="priority_tips">Vyššie číslo znamená, že výsledok bude vyššie. Skúste nastaviť napr. 5. Ak chcete, aby boli výsledky nižšie ako ktorékoľvek iné doplnky, zadajte záporné číslo</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">Flow Launcher nedokázal presunúť používateľské údaje do aktualizovanej verzie.
|
<system:String x:Key="invalidPriority">Prosím, zadajte platné číslo pre prioritu!</system:String>
|
||||||
Prosím, presuňte profilový priečinok data z {0} do {1}</system:String>
|
|
||||||
<system:String x:Key="update_flowlauncher_new_update">Nová aktualizácia</system:String>
|
<!-- Action Keyword Setting Dialog -->
|
||||||
<system:String x:Key="update_flowlauncher_update_new_version_available">Je dostupná nová verzia Flow Launchera {0}</system:String>
|
<system:String x:Key="oldActionKeywords">Stará skratka akcie</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_error">Počas inštalácie aktualizácií došlo k chybe</system:String>
|
<system:String x:Key="newActionKeywords">Nová skratka akcie</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update">Aktualizovať</system:String>
|
<system:String x:Key="cancel">Zrušiť</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_cancel">Zrušiť</system:String>
|
<system:String x:Key="done">Hotovo</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_fail">Aktualizácia zlyhala</system:String>
|
<system:String x:Key="cannotFindSpecifiedPlugin">Nepodarilo sa nájsť zadaný plugin</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_check_connection">Skontrolujte pripojenie a skúste aktualizovať nastavenia servera proxy na github-cloud.s3.amazonaws.com.</system:String>
|
<system:String x:Key="newActionKeywordsCannotBeEmpty">Nová skratka pre akciu nemôže byť prázdna</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">Tento upgrade reštartuje Flow Launcher</system:String>
|
<system:String x:Key="newActionKeywordsHasBeenAssigned">Nová skratka pre akciu bola priradená pre iný plugin, prosím, zvoľte inú skratku</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_upadte_files">Nasledujúce súbory budú aktualizované</system:String>
|
<system:String x:Key="success">Úspešné</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_files">Aktualizovať súbory</system:String>
|
<system:String x:Key="completedSuccessfully">Úspešne dokončené</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_upadte_description">Aktualizovať popis</system:String>
|
<system:String x:Key="actionkeyword_tips">Zadajte skratku akcie, ktorá je potrebná na spustenie pluginu. Ak nechcete zadať skratku akcie, použite *. V tom prípade plugin funguje bez kľúčových slov.</system:String>
|
||||||
|
|
||||||
</ResourceDictionary>
|
<!-- Custom Query Hotkey Dialog -->
|
||||||
|
<system:String x:Key="customeQueryHotkeyTitle">Klávesová skratka pre vlastné vyhľadávanie</system:String>
|
||||||
|
<system:String x:Key="customeQueryHotkeyTips">Stlačením klávesovej skratky sa automaticky vloží zadaný výraz.</system:String>
|
||||||
|
<system:String x:Key="preview">Náhľad</system:String>
|
||||||
|
<system:String x:Key="hotkeyIsNotUnavailable">Klávesová skratka je nedostupná, prosím, zadajte novú</system:String>
|
||||||
|
<system:String x:Key="invalidPluginHotkey">Neplatná klávesová skratka pluginu</system:String>
|
||||||
|
<system:String x:Key="update">Aktualizovať</system:String>
|
||||||
|
|
||||||
|
<!-- Hotkey Control -->
|
||||||
|
<system:String x:Key="hotkeyUnavailable">Klávesová skratka nedostupná</system:String>
|
||||||
|
|
||||||
|
<!-- Crash Reporter -->
|
||||||
|
<system:String x:Key="reportWindow_version">Verzia</system:String>
|
||||||
|
<system:String x:Key="reportWindow_time">Čas</system:String>
|
||||||
|
<system:String x:Key="reportWindow_reproduce">Prosím, napíšte nám, ako došlo k pádu aplikácie, aby sme to mohli opraviť</system:String>
|
||||||
|
<system:String x:Key="reportWindow_send_report">Odoslať hlásenie</system:String>
|
||||||
|
<system:String x:Key="reportWindow_cancel">Zrušiť</system:String>
|
||||||
|
<system:String x:Key="reportWindow_general">Všeobecné</system:String>
|
||||||
|
<system:String x:Key="reportWindow_exceptions">Výnimky</system:String>
|
||||||
|
<system:String x:Key="reportWindow_exception_type">Typ výnimky</system:String>
|
||||||
|
<system:String x:Key="reportWindow_source">Zdroj</system:String>
|
||||||
|
<system:String x:Key="reportWindow_stack_trace">Trasovanie zásobníka</system:String>
|
||||||
|
<system:String x:Key="reportWindow_sending">Odosiela sa</system:String>
|
||||||
|
<system:String x:Key="reportWindow_report_succeed">Hlásenie bolo úspešne odoslané</system:String>
|
||||||
|
<system:String x:Key="reportWindow_report_failed">Odoslanie hlásenia zlyhalo</system:String>
|
||||||
|
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Flow Launcher zaznamenal chybu</system:String>
|
||||||
|
|
||||||
|
<!-- General Notice -->
|
||||||
|
<system:String x:Key="pleaseWait">Čakajte, prosím…</system:String>
|
||||||
|
|
||||||
|
<!-- update -->
|
||||||
|
<system:String x:Key="update_flowlauncher_update_check">Kontrolujú sa aktualizácie</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_already_on_latest">Už máte najnovšiu verziu Flow Launchera</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_found">Bola nájdená aktualizácia</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_updating">Aktualizuje sa…</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">
|
||||||
|
Flow Launcher nedokázal presunúť používateľské údaje do aktualizovanej verzie.
|
||||||
|
Prosím, presuňte profilový priečinok data z {0} do {1}
|
||||||
|
</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_new_update">Nová aktualizácia</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_new_version_available">Je dostupná nová verzia Flow Launchera {0}</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_error">Počas inštalácie aktualizácií došlo k chybe</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update">Aktualizovať</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_cancel">Zrušiť</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_fail">Aktualizácia zlyhala</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_check_connection">Skontrolujte pripojenie a skúste aktualizovať nastavenia servera proxy na github-cloud.s3.amazonaws.com.</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">Tento upgrade reštartuje Flow Launcher</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_upadte_files">Nasledujúce súbory budú aktualizované</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_files">Aktualizovať súbory</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_upadte_description">Aktualizovať popis</system:String>
|
||||||
|
|
||||||
|
<!-- Welcome Window -->
|
||||||
|
<system:String x:Key="Skip">Preskočiť</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page1_Title">Vitajte vo Flow Launcheri</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page1_Text01">Dobrý deň, toto je prvýkrát, čo spúšťate Flow Launcher!</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page1_Text02">Pred spustením vám tento sprievodca pomôže s nastavením aplikácie Flow Launcher. Ak chcete, môžete ho preskočiť. Vyberte si jazyk</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page2_Title">Vyhľadávajte a spúšťajte všetky súbory a aplikácie v počítači</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page2_Text01">Vyhľadávajte vo všetkých aplikáciách, súboroch, záložkách, YouTube, Twitteri a ďalších. Všetko z pohodlia klávesnice bez toho, aby ste sa dotkli myši.</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page2_Text02">Flow Launcher sa spúšťa pomocou dole uvedenej klávesovej skratky, poďte si to vyskúšať. Ak ju chcete zmeniť, kliknite na vstupné pole a stlačte požadovanú klávesovú skratku na klávesnici.</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page3_Title">Klávesové skratky</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page4_Title">Kľúčové slovo akcie a príkazy</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page4_Text01">Vyhľadávajte na webe, spúšťajte aplikácie alebo spúšťajte rôzne funkcie pomocou pluginov Flow Launchera. Niektoré funkcie sa začínajú kľúčovým slovom akcie a v prípade potreby ich možno použiť aj bez kľúčových slov akcie. Vyskúšajte nižšie uvedené dopyty v aplikácii Flow Launcher.</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page5_Title">Spustite Flow Launcher</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page5_Text01">Hotovo. Užite si Flow Launcher. Nezabudnite na klávesovú skratku na spustenie :)</system:String>
|
||||||
|
|
||||||
|
<!-- General Guide & Hotkey -->
|
||||||
|
|
||||||
|
<system:String x:Key="HotkeyUpDownDesc">Späť/kontextová ponuka</system:String>
|
||||||
|
<system:String x:Key="HotkeyLeftRightDesc">Navigácia medzi položkami</system:String>
|
||||||
|
<system:String x:Key="HotkeyShiftEnterDesc">Otvoriť kontextovú ponuku</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlEnterDesc">Otvoriť umiestnenie priečinka</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlShiftEnterDesc">Spustiť ako správca</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlHDesc">História dopytov</system:String>
|
||||||
|
<system:String x:Key="HotkeyESCDesc">Návrat na výsledky z kontextovej ponuky</system:String>
|
||||||
|
<system:String x:Key="HotkeyRunDesc">Otvoriť/spustiť vybranú položku</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlIDesc">Otvoriť okno s nastaveniami</system:String>
|
||||||
|
<system:String x:Key="HotkeyF5Desc">Znova načítať údaje pluginov</system:String>
|
||||||
|
|
||||||
|
<system:String x:Key="RecommendWeather">Počasie</system:String>
|
||||||
|
<system:String x:Key="RecommendWeatherDesc">Počasie na Googli</system:String>
|
||||||
|
<system:String x:Key="RecommendShell">> ping 8.8.8.8</system:String>
|
||||||
|
<system:String x:Key="RecommendShellDesc">Príkazový riadok</system:String>
|
||||||
|
<system:String x:Key="RecommendBluetooth">Bluetooth</system:String>
|
||||||
|
<system:String x:Key="RecommendBluetoothDesc">Bluetooth v nastaveniach Windowsu</system:String>
|
||||||
|
<system:String x:Key="RecommendAcronyms">sn</system:String>
|
||||||
|
<system:String x:Key="RecommendAcronymsDesc">Sticky Notes</system:String>
|
||||||
|
|
||||||
|
</ResourceDictionary>
|
||||||
|
|
|
||||||
|
|
@ -1,177 +1,269 @@
|
||||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
<?xml version="1.0"?>
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
<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">
|
||||||
xmlns:system="clr-namespace:System;assembly=mscorlib">
|
<!-- MainWindow -->
|
||||||
<!--主窗体-->
|
<system:String x:Key="registerHotkeyFailed">注册热键:{0} 失败</system:String>
|
||||||
<system:String x:Key="registerHotkeyFailed">注册热键:{0} 失败</system:String>
|
<system:String x:Key="couldnotStartCmd">启动命令 {0} 失败</system:String>
|
||||||
<system:String x:Key="couldnotStartCmd">启动命令 {0} 失败</system:String>
|
<system:String x:Key="invalidFlowLauncherPluginFileFormat">无效的 Flow Launcher 插件文件格式</system:String>
|
||||||
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Flow Launcher插件格式错误</system:String>
|
<system:String x:Key="setAsTopMostInThisQuery">在当前查询中置顶</system:String>
|
||||||
<system:String x:Key="setAsTopMostInThisQuery">在当前查询中置顶</system:String>
|
<system:String x:Key="cancelTopMostInThisQuery">取消置顶</system:String>
|
||||||
<system:String x:Key="cancelTopMostInThisQuery">取消置顶</system:String>
|
<system:String x:Key="executeQuery">执行查询:{0}</system:String>
|
||||||
<system:String x:Key="executeQuery">执行查询:{0}</system:String>
|
<system:String x:Key="lastExecuteTime">上次执行时间:{0}</system:String>
|
||||||
<system:String x:Key="lastExecuteTime">上次执行时间:{0}</system:String>
|
<system:String x:Key="iconTrayOpen">打开</system:String>
|
||||||
<system:String x:Key="iconTrayOpen">打开</system:String>
|
<system:String x:Key="iconTraySettings">设置</system:String>
|
||||||
<system:String x:Key="iconTraySettings">设置</system:String>
|
<system:String x:Key="iconTrayAbout">关于</system:String>
|
||||||
<system:String x:Key="iconTrayAbout">关于</system:String>
|
<system:String x:Key="iconTrayExit">退出</system:String>
|
||||||
<system:String x:Key="iconTrayExit">退出</system:String>
|
<system:String x:Key="closeWindow">关闭</system:String>
|
||||||
|
<system:String x:Key="GameMode">游戏模式</system:String>
|
||||||
<!--设置,通用-->
|
<system:String x:Key="GameModeToolTip">暂停使用快捷键。</system:String>
|
||||||
<system:String x:Key="flowlauncher_settings">Flow Launcher设置</system:String>
|
|
||||||
<system:String x:Key="general">通用</system:String>
|
<!-- Setting General -->
|
||||||
<system:String x:Key="portableMode">便携模式</system:String>
|
<system:String x:Key="flowlauncher_settings">Flow Launcher设置</system:String>
|
||||||
<system:String x:Key="startFlowLauncherOnSystemStartup">开机自动启动</system:String>
|
<system:String x:Key="general">通用</system:String>
|
||||||
<system:String x:Key="hideFlowLauncherWhenLoseFocus">失去焦点时自动隐藏Flow Launcher</system:String>
|
<system:String x:Key="portableMode">便携模式</system:String>
|
||||||
<system:String x:Key="dontPromptUpdateMsg">不显示新版本提示</system:String>
|
<system:String x:Key="portableModeToolTIp">将所有设置和用户数据存储在一个文件夹中 (可用于可移除驱动器或云服务)。</system:String>
|
||||||
<system:String x:Key="rememberLastLocation">记住上次启动位置</system:String>
|
<system:String x:Key="startFlowLauncherOnSystemStartup">开机自启</system:String>
|
||||||
<system:String x:Key="language">语言</system:String>
|
<system:String x:Key="hideFlowLauncherWhenLoseFocus">失去焦点时自动隐藏Flow Launcher</system:String>
|
||||||
<system:String x:Key="lastQueryMode">上次搜索关键字模式</system:String>
|
<system:String x:Key="dontPromptUpdateMsg">不显示新版本提示</system:String>
|
||||||
<system:String x:Key="LastQueryPreserved">保留上次搜索关键字</system:String>
|
<system:String x:Key="rememberLastLocation">记住上次启动位置</system:String>
|
||||||
<system:String x:Key="LastQuerySelected">选择上次搜索关键字</system:String>
|
<system:String x:Key="language">语言</system:String>
|
||||||
<system:String x:Key="LastQueryEmpty">清空上次搜索关键字</system:String>
|
<system:String x:Key="lastQueryMode">再次激活时</system:String>
|
||||||
<system:String x:Key="maxShowResults">最大结果显示个数</system:String>
|
<system:String x:Key="lastQueryModeToolTip">重启Flow Launcher时显示/隐藏以前的结果。</system:String>
|
||||||
<system:String x:Key="ignoreHotkeysOnFullscreen">全屏模式下忽略热键</system:String>
|
<system:String x:Key="LastQueryPreserved">保留上次搜索关键字</system:String>
|
||||||
<system:String x:Key="pythonDirectory">Python 路径</system:String>
|
<system:String x:Key="LastQuerySelected">选择上次搜索关键字</system:String>
|
||||||
<system:String x:Key="autoUpdates">自动更新</system:String>
|
<system:String x:Key="LastQueryEmpty">清空上次搜索关键字</system:String>
|
||||||
<system:String x:Key="selectPythonDirectory">选择</system:String>
|
<system:String x:Key="maxShowResults">最大结果显示个数</system:String>
|
||||||
<system:String x:Key="hideOnStartup">启动时不显示主窗口</system:String>
|
<system:String x:Key="ignoreHotkeysOnFullscreen">全屏模式下忽略热键</system:String>
|
||||||
<system:String x:Key="hideNotifyIcon">隐藏任务栏图标</system:String>
|
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">当全屏应用程序激活时禁用快捷键。</system:String>
|
||||||
<system:String x:Key="querySearchPrecision">查询搜索精度</system:String>
|
<system:String x:Key="defaultFileManager">默认文件管理器</system:String>
|
||||||
<system:String x:Key="ShouldUsePinyin">启动拼音搜索</system:String>
|
<system:String x:Key="defaultFileManagerToolTip">选择打开文件夹时要使用的文件管理器。</system:String>
|
||||||
<system:String x:Key="ShouldUsePinyinToolTip">允许使用拼音进行搜索。</system:String>
|
<system:String x:Key="pythonDirectory">Python 路径</system:String>
|
||||||
|
<system:String x:Key="autoUpdates">自动更新</system:String>
|
||||||
<!--设置,插件-->
|
<system:String x:Key="selectPythonDirectory">选择</system:String>
|
||||||
<system:String x:Key="plugin">插件</system:String>
|
<system:String x:Key="hideOnStartup">系统启动时不显示主窗口</system:String>
|
||||||
<system:String x:Key="browserMorePlugins">浏览更多插件</system:String>
|
<system:String x:Key="hideNotifyIcon">隐藏任务栏图标</system:String>
|
||||||
<system:String x:Key="enable">启用</system:String>
|
<system:String x:Key="querySearchPrecision">查询搜索精度</system:String>
|
||||||
<system:String x:Key="disable">禁用</system:String>
|
<system:String x:Key="querySearchPrecisionToolTip">更改匹配成功所需的最低分数。</system:String>
|
||||||
<system:String x:Key="actionKeywords">触发关键字</system:String>
|
<system:String x:Key="ShouldUsePinyin">启动拼音搜索</system:String>
|
||||||
<system:String x:Key="currentActionKeywords">当前操作关键字:</system:String>
|
<system:String x:Key="ShouldUsePinyinToolTip">允许使用拼音进行搜索</system:String>
|
||||||
<system:String x:Key="newActionKeyword">新动作关键字:</system:String>
|
<system:String x:Key="shadowEffectNotAllowed">当前主题已启用模糊效果,不允许启用阴影效果</system:String>
|
||||||
<system:String x:Key="currentPriority">当前优先级:</system:String>
|
|
||||||
<system:String x:Key="newPriority">新优先级:</system:String>
|
<!-- Setting Plugin -->
|
||||||
<system:String x:Key="pluginDirectory">插件目录</system:String>
|
<system:String x:Key="plugin">插件</system:String>
|
||||||
<system:String x:Key="author">作者</system:String>
|
<system:String x:Key="browserMorePlugins">浏览更多插件</system:String>
|
||||||
<system:String x:Key="plugin_init_time">加载耗时</system:String>
|
<system:String x:Key="enable">启用</system:String>
|
||||||
<system:String x:Key="plugin_query_time">查询耗时</system:String>
|
<system:String x:Key="disable">禁用</system:String>
|
||||||
|
<system:String x:Key="actionKeywordsTitle">动作关键字设置</system:String>
|
||||||
<!--设置,主题-->
|
<system:String x:Key="actionKeywords">触发关键字</system:String>
|
||||||
<system:String x:Key="theme">主题</system:String>
|
<system:String x:Key="currentActionKeywords">当前触发关键字</system:String>
|
||||||
<system:String x:Key="browserMoreThemes">浏览更多主题</system:String>
|
<system:String x:Key="newActionKeyword">新触发关键字</system:String>
|
||||||
<system:String x:Key="hiThere">在这里输入</system:String>
|
<system:String x:Key="currentPriority">当前优先级</system:String>
|
||||||
<system:String x:Key="queryBoxFont">查询框字体</system:String>
|
<system:String x:Key="newPriority">新优先级</system:String>
|
||||||
<system:String x:Key="resultItemFont">结果项字体</system:String>
|
<system:String x:Key="priority">优先级</system:String>
|
||||||
<system:String x:Key="windowMode">窗口模式</system:String>
|
<system:String x:Key="pluginDirectory">插件目录</system:String>
|
||||||
<system:String x:Key="opacity">透明度</system:String>
|
<system:String x:Key="author">出自</system:String>
|
||||||
<system:String x:Key="theme_load_failure_path_not_exists">无法找到主题 {0} ,切换为默认主题</system:String>
|
<system:String x:Key="plugin_init_time">加载耗时:</system:String>
|
||||||
<system:String x:Key="theme_load_failure_parse_error">无法加载主题 {0} ,切换为默认主题</system:String>
|
<system:String x:Key="plugin_query_time">查询耗时:</system:String>
|
||||||
|
<system:String x:Key="plugin_query_version">| 版本</system:String>
|
||||||
<!--设置,热键-->
|
<system:String x:Key="plugin_query_web">官方网站</system:String>
|
||||||
<system:String x:Key="hotkey">热键</system:String>
|
|
||||||
<system:String x:Key="flowlauncherHotkey">Flow Launcher激活热键</system:String>
|
|
||||||
<system:String x:Key="openResultModifiers">开放结果修饰符</system:String>
|
<!-- Setting Plugin Store -->
|
||||||
<system:String x:Key="showOpenResultHotkey">显示热键</system:String>
|
<system:String x:Key="pluginStore">插件商店</system:String>
|
||||||
<system:String x:Key="customQueryHotkey">自定义查询热键</system:String>
|
<system:String x:Key="refresh">刷新</system:String>
|
||||||
<system:String x:Key="delete">删除</system:String>
|
<system:String x:Key="install">安装</system:String>
|
||||||
<system:String x:Key="edit">编辑</system:String>
|
|
||||||
<system:String x:Key="add">增加</system:String>
|
<!-- Setting Theme -->
|
||||||
<system:String x:Key="pleaseSelectAnItem">请选择一项</system:String>
|
<system:String x:Key="theme">主题</system:String>
|
||||||
<system:String x:Key="deleteCustomHotkeyWarning">你确定要删除插件 {0} 的热键吗?</system:String>
|
<system:String x:Key="browserMoreThemes">浏览更多主题</system:String>
|
||||||
<system:String x:Key="queryWindowShadowEffect">查询窗口阴影效果</system:String>
|
<system:String x:Key="howToCreateTheme">如何创建一个主题</system:String>
|
||||||
<system:String x:Key="shadowEffectCPUUsage">阴影效果将占用大量的GPU资源。</system:String>
|
<system:String x:Key="hiThere">你好!</system:String>
|
||||||
<system:String x:Key="shadowEffectPerformance">如果您的计算机性能有限,则不建议使用。</system:String>
|
<system:String x:Key="queryBoxFont">查询框字体</system:String>
|
||||||
|
<system:String x:Key="resultItemFont">结果项字体</system:String>
|
||||||
<!--设置,代理-->
|
<system:String x:Key="windowMode">窗口模式</system:String>
|
||||||
<system:String x:Key="proxy">HTTP 代理</system:String>
|
<system:String x:Key="opacity">透明度</system:String>
|
||||||
<system:String x:Key="enableProxy">启用 HTTP 代理</system:String>
|
<system:String x:Key="theme_load_failure_path_not_exists">无法找到主题 {0} ,切换为默认主题</system:String>
|
||||||
<system:String x:Key="server">HTTP 服务器</system:String>
|
<system:String x:Key="theme_load_failure_parse_error">无法加载主题 {0} ,切换为默认主题</system:String>
|
||||||
<system:String x:Key="port">端口</system:String>
|
<system:String x:Key="ThemeFolder">主题目录</system:String>
|
||||||
<system:String x:Key="userName">用户名</system:String>
|
<system:String x:Key="OpenThemeFolder">打开主题目录...</system:String>
|
||||||
<system:String x:Key="password">密码</system:String>
|
<system:String x:Key="ColorScheme">颜色主题</system:String>
|
||||||
<system:String x:Key="testProxy">测试代理</system:String>
|
<system:String x:Key="ColorSchemeSystem">跟随系统</system:String>
|
||||||
<system:String x:Key="save">保存</system:String>
|
<system:String x:Key="ColorSchemeLight">浅色</system:String>
|
||||||
<system:String x:Key="serverCantBeEmpty">服务器不能为空</system:String>
|
<system:String x:Key="ColorSchemeDark">深色</system:String>
|
||||||
<system:String x:Key="portCantBeEmpty">端口不能为空</system:String>
|
<system:String x:Key="SoundEffect">音效</system:String>
|
||||||
<system:String x:Key="invalidPortFormat">非法的端口格式</system:String>
|
<system:String x:Key="SoundEffectTip">启用激活音效</system:String>
|
||||||
<system:String x:Key="saveProxySuccessfully">保存代理设置成功</system:String>
|
<system:String x:Key="Animation">动画</system:String>
|
||||||
<system:String x:Key="proxyIsCorrect">代理设置正确</system:String>
|
<system:String x:Key="AnimationTip">启用动画</system:String>
|
||||||
<system:String x:Key="proxyConnectFailed">代理连接失败</system:String>
|
|
||||||
|
<!-- Setting Hotkey -->
|
||||||
<!--设置 关于-->
|
<system:String x:Key="hotkey">热键</system:String>
|
||||||
<system:String x:Key="about">关于</system:String>
|
<system:String x:Key="flowlauncherHotkey">Flow Launcher激活热键</system:String>
|
||||||
<system:String x:Key="website">网站</system:String>
|
<system:String x:Key="flowlauncherHotkeyToolTip">输入显示/隐藏Flow Launcher的快捷键。</system:String>
|
||||||
<system:String x:Key="version">版本</system:String>
|
<system:String x:Key="openResultModifiers">开放结果修饰符</system:String>
|
||||||
<system:String x:Key="about_activate_times">你已经激活了Flow Launcher {0} 次</system:String>
|
<system:String x:Key="openResultModifiersToolTip">指定修饰符用于打开指定的选项。</system:String>
|
||||||
<system:String x:Key="checkUpdates">检查更新</system:String>
|
<system:String x:Key="showOpenResultHotkey">显示热键</system:String>
|
||||||
<system:String x:Key="newVersionTips">发现新版本 {0} , 请重启 Flow Launcher。</system:String>
|
<system:String x:Key="showOpenResultHotkeyToolTip">显示热键用于快速选择选项。</system:String>
|
||||||
<system:String x:Key="checkUpdatesFailed">下载更新失败,请检查您与 api.github.com 的连接状态或检查代理设置。</system:String>
|
<system:String x:Key="customQueryHotkey">自定义查询热键</system:String>
|
||||||
<system:String x:Key="downloadUpdatesFailed">
|
<system:String x:Key="customQuery">查询</system:String>
|
||||||
下载更新失败,请检查您与 github-cloud.s3.amazonaws.com 的连接状态或检查代理设置,
|
<system:String x:Key="delete">删除</system:String>
|
||||||
或访问 https://github.com/Flow-Launcher/Flow.Launcher/releases 手动下载更新。
|
<system:String x:Key="edit">编辑</system:String>
|
||||||
</system:String>
|
<system:String x:Key="add">增加</system:String>
|
||||||
<system:String x:Key="releaseNotes">更新说明:</system:String>
|
<system:String x:Key="pleaseSelectAnItem">请选择一项</system:String>
|
||||||
<system:String x:Key="documentation">使用技巧:</system:String>
|
<system:String x:Key="deleteCustomHotkeyWarning">你确定要删除插件 {0} 的热键吗?</system:String>
|
||||||
|
<system:String x:Key="queryWindowShadowEffect">查询窗口阴影效果</system:String>
|
||||||
<!--优先级设置对话框-->
|
<system:String x:Key="shadowEffectCPUUsage">阴影效果将占用大量的GPU资源。 如果您的计算机性能有限,则不建议使用。</system:String>
|
||||||
<system:String x:Key="priority_tips">数字越大,结果排名越高。如果你想要结果比任何其他插件的低,请使用负数</system:String>
|
<system:String x:Key="windowWidthSize">窗口宽度</system:String>
|
||||||
<system:String x:Key="invalidPriority">请提供有效的整数作为优先级设置值!</system:String>
|
<system:String x:Key="useGlyphUI">使用Segoe Fluent图标</system:String>
|
||||||
|
<system:String x:Key="useGlyphUIEffect">在支持时在选项中显示 Segoe Fluent 图标</system:String>
|
||||||
<!--Action Keyword 设置对话框-->
|
|
||||||
<system:String x:Key="oldActionKeywords">旧触发关键字</system:String>
|
<!-- Setting Proxy -->
|
||||||
<system:String x:Key="newActionKeywords">新触发关键字</system:String>
|
<system:String x:Key="proxy">HTTP 代理</system:String>
|
||||||
<system:String x:Key="cancel">取消</system:String>
|
<system:String x:Key="enableProxy">启用 HTTP 代理</system:String>
|
||||||
<system:String x:Key="done">确定</system:String>
|
<system:String x:Key="server">HTTP 服务器</system:String>
|
||||||
<system:String x:Key="cannotFindSpecifiedPlugin">找不到指定的插件</system:String>
|
<system:String x:Key="port">端口</system:String>
|
||||||
<system:String x:Key="newActionKeywordsCannotBeEmpty">新触发关键字不能为空</system:String>
|
<system:String x:Key="userName">用户名</system:String>
|
||||||
<system:String x:Key="newActionKeywordsHasBeenAssigned">新触发关键字已经被指派给其他插件了,请换一个关键字</system:String>
|
<system:String x:Key="password">密码</system:String>
|
||||||
<system:String x:Key="success">成功</system:String>
|
<system:String x:Key="testProxy">测试代理</system:String>
|
||||||
<system:String x:Key="completedSuccessfully">成功完成</system:String>
|
<system:String x:Key="save">保存</system:String>
|
||||||
<system:String x:Key="actionkeyword_tips">如果你不想设置触发关键字,可以使用*代替</system:String>
|
<system:String x:Key="serverCantBeEmpty">服务器不能为空</system:String>
|
||||||
|
<system:String x:Key="portCantBeEmpty">端口不能为空</system:String>
|
||||||
<!--Custom Query Hotkey 对话框-->
|
<system:String x:Key="invalidPortFormat">非法的端口格式</system:String>
|
||||||
<system:String x:Key="customeQueryHotkeyTitle">自定义插件热键</system:String>
|
<system:String x:Key="saveProxySuccessfully">保存代理设置成功</system:String>
|
||||||
<system:String x:Key="preview">预览</system:String>
|
<system:String x:Key="proxyIsCorrect">代理设置正确</system:String>
|
||||||
<system:String x:Key="hotkeyIsNotUnavailable">热键不可用,请选择一个新的热键</system:String>
|
<system:String x:Key="proxyConnectFailed">代理连接失败</system:String>
|
||||||
<system:String x:Key="invalidPluginHotkey">插件热键不合法</system:String>
|
|
||||||
<system:String x:Key="update">更新</system:String>
|
<!-- Setting About -->
|
||||||
|
<system:String x:Key="about">关于</system:String>
|
||||||
<!--Hotkey 控件-->
|
<system:String x:Key="website">网站</system:String>
|
||||||
<system:String x:Key="hotkeyUnavailable">热键不可用</system:String>
|
<system:String x:Key="github">Github</system:String>
|
||||||
|
<system:String x:Key="docs">文档</system:String>
|
||||||
<!--崩溃报告窗体-->
|
<system:String x:Key="version">版本</system:String>
|
||||||
<system:String x:Key="reportWindow_version">版本</system:String>
|
<system:String x:Key="about_activate_times">你已经激活了Flow Launcher {0} 次</system:String>
|
||||||
<system:String x:Key="reportWindow_time">时间</system:String>
|
<system:String x:Key="checkUpdates">检查更新</system:String>
|
||||||
<system:String x:Key="reportWindow_reproduce">请告诉我们如何重现此问题,以便我们进行修复</system:String>
|
<system:String x:Key="newVersionTips">发现新版本 {0} , 请重启 Flow Launcher</system:String>
|
||||||
<system:String x:Key="reportWindow_send_report">发送报告</system:String>
|
<system:String x:Key="checkUpdatesFailed">下载更新失败,请检查您与 api.github.com 的连接状态或检查代理设置</system:String>
|
||||||
<system:String x:Key="reportWindow_cancel">取消</system:String>
|
<system:String x:Key="downloadUpdatesFailed">
|
||||||
<system:String x:Key="reportWindow_general">基本信息</system:String>
|
下载更新失败,请检查您与 github-cloud.s3.amazonaws.com 的连接状态或检查代理设置,
|
||||||
<system:String x:Key="reportWindow_exceptions">异常信息</system:String>
|
或访问 https://github.com/Flow-Launcher/Flow.Launcher/releases 手动下载更新
|
||||||
<system:String x:Key="reportWindow_exception_type">异常类型</system:String>
|
</system:String>
|
||||||
<system:String x:Key="reportWindow_source">异常源</system:String>
|
<system:String x:Key="releaseNotes">更新说明:</system:String>
|
||||||
<system:String x:Key="reportWindow_stack_trace">堆栈信息</system:String>
|
<system:String x:Key="documentation">使用技巧:</system:String>
|
||||||
<system:String x:Key="reportWindow_sending">发送中</system:String>
|
<system:String x:Key="devtool">开发工具</system:String>
|
||||||
<system:String x:Key="reportWindow_report_succeed">发送成功</system:String>
|
<system:String x:Key="settingfolder">设置目录</system:String>
|
||||||
<system:String x:Key="reportWindow_report_failed">发送失败</system:String>
|
<system:String x:Key="logfolder">日志目录</system:String>
|
||||||
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Flow Launcher出错啦</system:String>
|
<system:String x:Key="welcomewindow">向导</system:String>
|
||||||
|
|
||||||
<!--General Notice-->
|
<!-- FileManager Setting Dialog -->
|
||||||
<system:String x:Key="pleaseWait">请稍等...</system:String>
|
<system:String x:Key="fileManagerWindow">默认文件管理器</system:String>
|
||||||
|
<system:String x:Key="fileManager_tips">请指定文件管理器的文件位置,并在必要时修改参数。 默认参数是%d",作为占位符代表文件路径。 例如命令 “totalcmd.exe /A c:\winds”,参数是 /A "%d”。</system:String>
|
||||||
<!--更新-->
|
<system:String x:Key="fileManager_tips2">%f是一个表示文件路径的参数。 它用于在第三方文件管理器中打开特定文件位置时强调文件/文件夹名称。 此参数仅在“选中文件参数”项目中可用。 如果文件管理器没有该功能,“%d” 仍然可用。</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_check">检查新的更新</system:String>
|
<system:String x:Key="fileManager_name">文件管理器</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_already_on_latest">您已经拥有最新的Flow Launcher版本</system:String>
|
<system:String x:Key="fileManager_profile_name">档案名称</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_found">检查到更新</system:String>
|
<system:String x:Key="fileManager_path">文件管理器路径</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_updating">更新中...</system:String>
|
<system:String x:Key="fileManager_directory_arg">文件夹路径参数</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">Flow Launcher无法将您的用户配置文件数据移动到新的更新版本中。
|
<system:String x:Key="fileManager_file_arg">选中文件路径参数</system:String>
|
||||||
请手动将您的用户配置文件数据文件夹从 {0} 到 {1}</system:String>
|
|
||||||
<system:String x:Key="update_flowlauncher_new_update">新的更新</system:String>
|
<!-- Priority Setting Dialog -->
|
||||||
<system:String x:Key="update_flowlauncher_update_new_version_available">发现Flow Launcher新版本 V{0}</system:String>
|
<system:String x:Key="changePriorityWindow">更改优先级</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_error">尝试安装软件更新时发生错误</system:String>
|
<system:String x:Key="priority_tips">数字越大,结果排名越高。如果你想要结果比任何其他插件的低,请使用负数</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update">更新</system:String>
|
<system:String x:Key="invalidPriority">请提供有效的整数作为优先级设置值</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_cancel">取消</system:String>
|
|
||||||
<system:String x:Key="update_flowlauncher_fail">更新错误</system:String>
|
<!-- Action Keyword Setting Dialog -->
|
||||||
<system:String x:Key="update_flowlauncher_check_connection">检查网络是否可以连接至github-cloud.s3.amazonaws.com.</system:String>
|
<system:String x:Key="oldActionKeywords">旧触发关键字</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">此次更新需要重启Flow Launcher</system:String>
|
<system:String x:Key="newActionKeywords">新触发关键字</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_upadte_files">下列文件会被更新</system:String>
|
<system:String x:Key="cancel">取消</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_files">更新文件</system:String>
|
<system:String x:Key="done">确认</system:String>
|
||||||
<system:String x:Key="update_flowlauncher_update_upadte_description">更新日志</system:String>
|
<system:String x:Key="cannotFindSpecifiedPlugin">找不到指定的插件</system:String>
|
||||||
|
<system:String x:Key="newActionKeywordsCannotBeEmpty">新触发关键字不能为空</system:String>
|
||||||
</ResourceDictionary>
|
<system:String x:Key="newActionKeywordsHasBeenAssigned">此触发关键字已经被指派给其他插件了,请换一个关键字</system:String>
|
||||||
|
<system:String x:Key="success">成功</system:String>
|
||||||
|
<system:String x:Key="completedSuccessfully">成功完成</system:String>
|
||||||
|
<system:String x:Key="actionkeyword_tips">如果你不想设置触发关键字,可以使用*代替</system:String>
|
||||||
|
|
||||||
|
<!-- Custom Query Hotkey Dialog -->
|
||||||
|
<system:String x:Key="customeQueryHotkeyTitle">自定义插件热键</system:String>
|
||||||
|
<system:String x:Key="customeQueryHotkeyTips">按下自定义快捷键激活Flow Launcher并插入指定的查询前缀。</system:String>
|
||||||
|
<system:String x:Key="preview">预览</system:String>
|
||||||
|
<system:String x:Key="hotkeyIsNotUnavailable">热键不可用,请选择一个新的热键</system:String>
|
||||||
|
<system:String x:Key="invalidPluginHotkey">插件热键不合法</system:String>
|
||||||
|
<system:String x:Key="update">更新</system:String>
|
||||||
|
|
||||||
|
<!-- Hotkey Control -->
|
||||||
|
<system:String x:Key="hotkeyUnavailable">热键不可用</system:String>
|
||||||
|
|
||||||
|
<!-- Crash Reporter -->
|
||||||
|
<system:String x:Key="reportWindow_version">版本</system:String>
|
||||||
|
<system:String x:Key="reportWindow_time">时间</system:String>
|
||||||
|
<system:String x:Key="reportWindow_reproduce">请告诉我们如何重现此问题,以便我们进行修复</system:String>
|
||||||
|
<system:String x:Key="reportWindow_send_report">发送报告</system:String>
|
||||||
|
<system:String x:Key="reportWindow_cancel">取消</system:String>
|
||||||
|
<system:String x:Key="reportWindow_general">基本信息</system:String>
|
||||||
|
<system:String x:Key="reportWindow_exceptions">异常信息</system:String>
|
||||||
|
<system:String x:Key="reportWindow_exception_type">异常类型</system:String>
|
||||||
|
<system:String x:Key="reportWindow_source">异常源</system:String>
|
||||||
|
<system:String x:Key="reportWindow_stack_trace">堆栈信息</system:String>
|
||||||
|
<system:String x:Key="reportWindow_sending">发送中</system:String>
|
||||||
|
<system:String x:Key="reportWindow_report_succeed">发送成功</system:String>
|
||||||
|
<system:String x:Key="reportWindow_report_failed">发送失败</system:String>
|
||||||
|
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Flow Launcher出错啦</system:String>
|
||||||
|
|
||||||
|
<!-- General Notice -->
|
||||||
|
<system:String x:Key="pleaseWait">请稍等...</system:String>
|
||||||
|
|
||||||
|
<!-- update -->
|
||||||
|
<system:String x:Key="update_flowlauncher_update_check">检查新的更新</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_already_on_latest">您已经拥有最新的Flow Launcher版本</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_found">检查到更新</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_updating">更新中...</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">
|
||||||
|
Flow Launcher无法将您的用户配置文件数据移动到新的更新版本中。
|
||||||
|
请手动将您的用户配置文件数据文件夹从 {0} 到 {1}
|
||||||
|
</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_new_update">新的更新</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_new_version_available">发现Flow Launcher新版本 V{0}</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_error">尝试安装软件更新时发生错误</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update">更新</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_cancel">取消</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_fail">更新失败</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_check_connection">检查网络是否可以连接至github-cloud.s3.amazonaws.com.</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">此次更新需要重启Flow Launcher</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_upadte_files">下列文件会被更新</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_files">更新文件</system:String>
|
||||||
|
<system:String x:Key="update_flowlauncher_update_upadte_description">更新日志</system:String>
|
||||||
|
|
||||||
|
<!-- Welcome Window -->
|
||||||
|
<system:String x:Key="Skip">跳过</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page1_Title">欢迎使用Flow Launcher</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page1_Text01">你好,这是你第一次运行Flow Launcher!</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page1_Text02">在启动前,这个向导将有助于设置Flow Launcher。如果您愿意,您可以跳过。请选择一种语言</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page2_Title">搜索并运行您PC上的文件和应用程序</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page2_Text01">搜索所有应用程序、 文件、 书签、 YouTube、 Twitter等。所有都只需要键盘而不需要触摸鼠标。</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page2_Text02">Flow Launcher默认使用下面的快捷键激活。 要更改它,请点击输入并按键盘上所需的热键。</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page3_Title">快捷键</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page4_Title">动作关键词和命令</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page4_Text01">通过Flow Launcher 插件搜索网站、启动应用程序或运行各种功能。 某些函数起始于一个动作关键词,如有必要,它们可以在没有动作关键词的情况下使用。欢迎尝试一下的查询语句。</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page5_Title">开始使用Flow Launcher</system:String>
|
||||||
|
<system:String x:Key="Welcome_Page5_Text01">完成了!享受Flow Launcher。不要忘记激活快捷键 :)</system:String>
|
||||||
|
|
||||||
|
<!-- General Guide & Hotkey -->
|
||||||
|
|
||||||
|
<system:String x:Key="HotkeyUpDownDesc">返回/上下文菜单</system:String>
|
||||||
|
<system:String x:Key="HotkeyLeftRightDesc">选项导航</system:String>
|
||||||
|
<system:String x:Key="HotkeyShiftEnterDesc">打开菜单目录</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlEnterDesc">打开所在目录</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlShiftEnterDesc">以管理员身份运行</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlHDesc">查询历史</system:String>
|
||||||
|
<system:String x:Key="HotkeyESCDesc">返回查询界面</system:String>
|
||||||
|
<system:String x:Key="HotkeyRunDesc">打开/运行选中项目</system:String>
|
||||||
|
<system:String x:Key="HotkeyCtrlIDesc">打开设置窗口</system:String>
|
||||||
|
<system:String x:Key="HotkeyF5Desc">重新加载插件数据</system:String>
|
||||||
|
|
||||||
|
<system:String x:Key="RecommendWeather">天气</system:String>
|
||||||
|
<system:String x:Key="RecommendWeatherDesc">谷歌天气结果</system:String>
|
||||||
|
<system:String x:Key="RecommendShell">> ping 8.8.8.8</system:String>
|
||||||
|
<system:String x:Key="RecommendShellDesc">命令行命令</system:String>
|
||||||
|
<system:String x:Key="RecommendBluetooth">Bluetooth</system:String>
|
||||||
|
<system:String x:Key="RecommendBluetoothDesc">Windows 设置中的蓝牙</system:String>
|
||||||
|
<system:String x:Key="RecommendAcronyms">sn</system:String>
|
||||||
|
<system:String x:Key="RecommendAcronymsDesc">Sticky Notes</system:String>
|
||||||
|
|
||||||
|
</ResourceDictionary>
|
||||||
|
|
|
||||||
|
|
@ -1,114 +1,288 @@
|
||||||
<Window x:Class="Flow.Launcher.MainWindow"
|
<Window
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
x:Class="Flow.Launcher.MainWindow"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:flowlauncher="clr-namespace:Flow.Launcher"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
|
xmlns:converters="clr-namespace:Flow.Launcher.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:flowlauncher="clr-namespace:Flow.Launcher"
|
||||||
xmlns:converters="clr-namespace:Flow.Launcher.Converters"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
|
xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
|
||||||
mc:Ignorable="d"
|
xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
|
||||||
Title="Flow Launcher"
|
Name="FlowMainWindow"
|
||||||
Topmost="True"
|
Title="Flow Launcher"
|
||||||
SizeToContent="Height"
|
MinWidth="{Binding MainWindowWidth, Mode=OneWay}"
|
||||||
ResizeMode="NoResize"
|
MaxWidth="{Binding MainWindowWidth, Mode=OneWay}"
|
||||||
WindowStyle="None"
|
d:DataContext="{d:DesignInstance vm:MainViewModel}"
|
||||||
WindowStartupLocation="Manual"
|
AllowDrop="True"
|
||||||
AllowDrop="True"
|
AllowsTransparency="True"
|
||||||
ShowInTaskbar="False"
|
Background="Transparent"
|
||||||
Style="{DynamicResource WindowStyle}"
|
Closing="OnClosing"
|
||||||
Icon="Images/app.png"
|
Deactivated="OnDeactivated"
|
||||||
AllowsTransparency="True"
|
Icon="Images/app.png"
|
||||||
Background="Transparent"
|
Initialized="OnInitialized"
|
||||||
Loaded="OnLoaded"
|
Loaded="OnLoaded"
|
||||||
Initialized="OnInitialized"
|
LocationChanged="OnLocationChanged"
|
||||||
Closing="OnClosing"
|
Opacity="{Binding MainWindowOpacity, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
LocationChanged="OnLocationChanged"
|
PreviewKeyDown="OnKeyDown"
|
||||||
Deactivated="OnDeactivated"
|
ResizeMode="NoResize"
|
||||||
PreviewKeyDown="OnKeyDown"
|
ShowInTaskbar="False"
|
||||||
Visibility="{Binding MainWindowVisibility, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
SizeToContent="Height"
|
||||||
d:DataContext="{d:DesignInstance vm:MainViewModel}">
|
Style="{DynamicResource WindowStyle}"
|
||||||
|
Topmost="True"
|
||||||
|
Visibility="{Binding MainWindowVisibility, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
WindowStartupLocation="Manual"
|
||||||
|
WindowStyle="None"
|
||||||
|
mc:Ignorable="d">
|
||||||
<Window.Resources>
|
<Window.Resources>
|
||||||
<converters:QuerySuggestionBoxConverter x:Key="QuerySuggestionBoxConverter"/>
|
<converters:QuerySuggestionBoxConverter x:Key="QuerySuggestionBoxConverter" />
|
||||||
|
<converters:BorderClipConverter x:Key="BorderClipConverter" />
|
||||||
</Window.Resources>
|
</Window.Resources>
|
||||||
<Window.InputBindings>
|
<Window.InputBindings>
|
||||||
<KeyBinding Key="Escape" Command="{Binding EscCommand}"></KeyBinding>
|
<KeyBinding Key="Escape" Command="{Binding EscCommand}" />
|
||||||
<KeyBinding Key="F1" Command="{Binding StartHelpCommand}"></KeyBinding>
|
<KeyBinding Key="F1" Command="{Binding StartHelpCommand}" />
|
||||||
<KeyBinding Key="F5" Command="{Binding ReloadPluginDataCommand}"></KeyBinding>
|
<KeyBinding Key="F5" Command="{Binding ReloadPluginDataCommand}" />
|
||||||
<KeyBinding Key="Tab" Command="{Binding SelectNextItemCommand}"></KeyBinding>
|
<KeyBinding
|
||||||
<KeyBinding Key="Tab" Modifiers="Shift" Command="{Binding SelectPrevItemCommand}"></KeyBinding>
|
Key="Tab"
|
||||||
<KeyBinding Key="N" Modifiers="Ctrl" Command="{Binding SelectNextItemCommand}"></KeyBinding>
|
Command="{Binding AutocompleteQueryCommand}"/>
|
||||||
<KeyBinding Key="J" Modifiers="Ctrl" Command="{Binding SelectNextItemCommand}"></KeyBinding>
|
<KeyBinding
|
||||||
<KeyBinding Key="D" Modifiers="Ctrl" Command="{Binding SelectNextPageCommand}"></KeyBinding>
|
Key="Tab"
|
||||||
<KeyBinding Key="P" Modifiers="Ctrl" Command="{Binding SelectPrevItemCommand}"></KeyBinding>
|
Command="{Binding AutocompleteQueryCommand}"
|
||||||
<KeyBinding Key="K" Modifiers="Ctrl" Command="{Binding SelectPrevItemCommand}"></KeyBinding>
|
Modifiers="Shift" />
|
||||||
<KeyBinding Key="U" Modifiers="Ctrl" Command="{Binding SelectPrevPageCommand}"></KeyBinding>
|
<KeyBinding
|
||||||
<KeyBinding Key="Home" Modifiers="Alt" Command="{Binding SelectFirstResultCommand}"></KeyBinding>
|
Key="I"
|
||||||
<KeyBinding Key="O" Modifiers="Ctrl" Command="{Binding LoadContextMenuCommand}"></KeyBinding>
|
Command="{Binding OpenSettingCommand}"
|
||||||
<KeyBinding Key="H" Modifiers="Ctrl" Command="{Binding LoadHistoryCommand}"></KeyBinding>
|
Modifiers="Ctrl" />
|
||||||
<KeyBinding Key="Enter" Modifiers="Shift" Command="{Binding LoadContextMenuCommand}"></KeyBinding>
|
<KeyBinding
|
||||||
<KeyBinding Key="Enter" Command="{Binding OpenResultCommand}"></KeyBinding>
|
Key="N"
|
||||||
<KeyBinding Key="Enter" Modifiers="Ctrl" Command="{Binding OpenResultCommand}"></KeyBinding>
|
Command="{Binding SelectNextItemCommand}"
|
||||||
<KeyBinding Key="Enter" Modifiers="Alt" Command="{Binding OpenResultCommand}"></KeyBinding>
|
Modifiers="Ctrl" />
|
||||||
<KeyBinding Key="D1" Modifiers="{Binding OpenResultCommandModifiers}" Command="{Binding OpenResultCommand}" CommandParameter="0"></KeyBinding>
|
<KeyBinding
|
||||||
<KeyBinding Key="D2" Modifiers="{Binding OpenResultCommandModifiers}" Command="{Binding OpenResultCommand}" CommandParameter="1"></KeyBinding>
|
Key="J"
|
||||||
<KeyBinding Key="D3" Modifiers="{Binding OpenResultCommandModifiers}" Command="{Binding OpenResultCommand}" CommandParameter="2"></KeyBinding>
|
Command="{Binding SelectNextItemCommand}"
|
||||||
<KeyBinding Key="D4" Modifiers="{Binding OpenResultCommandModifiers}" Command="{Binding OpenResultCommand}" CommandParameter="3"></KeyBinding>
|
Modifiers="Ctrl" />
|
||||||
<KeyBinding Key="D5" Modifiers="{Binding OpenResultCommandModifiers}" Command="{Binding OpenResultCommand}" CommandParameter="4"></KeyBinding>
|
<KeyBinding
|
||||||
<KeyBinding Key="D6" Modifiers="{Binding OpenResultCommandModifiers}" Command="{Binding OpenResultCommand}" CommandParameter="5"></KeyBinding>
|
Key="D"
|
||||||
<KeyBinding Key="D7" Modifiers="{Binding OpenResultCommandModifiers}" Command="{Binding OpenResultCommand}" CommandParameter="6"></KeyBinding>
|
Command="{Binding SelectNextPageCommand}"
|
||||||
<KeyBinding Key="D8" Modifiers="{Binding OpenResultCommandModifiers}" Command="{Binding OpenResultCommand}" CommandParameter="7"></KeyBinding>
|
Modifiers="Ctrl" />
|
||||||
<KeyBinding Key="D9" Modifiers="{Binding OpenResultCommandModifiers}" Command="{Binding OpenResultCommand}" CommandParameter="8"></KeyBinding>
|
<KeyBinding
|
||||||
|
Key="P"
|
||||||
|
Command="{Binding SelectPrevItemCommand}"
|
||||||
|
Modifiers="Ctrl" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="K"
|
||||||
|
Command="{Binding SelectPrevItemCommand}"
|
||||||
|
Modifiers="Ctrl" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="U"
|
||||||
|
Command="{Binding SelectPrevPageCommand}"
|
||||||
|
Modifiers="Ctrl" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="Home"
|
||||||
|
Command="{Binding SelectFirstResultCommand}"
|
||||||
|
Modifiers="Alt" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="O"
|
||||||
|
Command="{Binding LoadContextMenuCommand}"
|
||||||
|
Modifiers="Ctrl" />
|
||||||
|
<KeyBinding Key="Right" Command="{Binding LoadContextMenuCommand}" />
|
||||||
|
<KeyBinding Key="Left" Command="{Binding EscCommand}" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="H"
|
||||||
|
Command="{Binding LoadHistoryCommand}"
|
||||||
|
Modifiers="Ctrl" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="Enter"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
Modifiers="Ctrl+Shift" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="Enter"
|
||||||
|
Command="{Binding LoadContextMenuCommand}"
|
||||||
|
Modifiers="Shift" />
|
||||||
|
<KeyBinding Key="Enter" Command="{Binding OpenResultCommand}" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="Enter"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
Modifiers="Ctrl" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="Enter"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
Modifiers="Alt" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="D1"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
CommandParameter="0"
|
||||||
|
Modifiers="{Binding OpenResultCommandModifiers}" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="D2"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
CommandParameter="1"
|
||||||
|
Modifiers="{Binding OpenResultCommandModifiers}" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="D3"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
CommandParameter="2"
|
||||||
|
Modifiers="{Binding OpenResultCommandModifiers}" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="D4"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
CommandParameter="3"
|
||||||
|
Modifiers="{Binding OpenResultCommandModifiers}" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="D5"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
CommandParameter="4"
|
||||||
|
Modifiers="{Binding OpenResultCommandModifiers}" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="D6"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
CommandParameter="5"
|
||||||
|
Modifiers="{Binding OpenResultCommandModifiers}" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="D7"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
CommandParameter="6"
|
||||||
|
Modifiers="{Binding OpenResultCommandModifiers}" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="D8"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
CommandParameter="7"
|
||||||
|
Modifiers="{Binding OpenResultCommandModifiers}" />
|
||||||
|
<KeyBinding
|
||||||
|
Key="D9"
|
||||||
|
Command="{Binding OpenResultCommand}"
|
||||||
|
CommandParameter="8"
|
||||||
|
Modifiers="{Binding OpenResultCommandModifiers}" />
|
||||||
</Window.InputBindings>
|
</Window.InputBindings>
|
||||||
<Grid>
|
<Grid>
|
||||||
<Border Style="{DynamicResource WindowBorderStyle}" MouseDown="OnMouseDown" CornerRadius="5" >
|
<Border MouseDown="OnMouseDown" Style="{DynamicResource WindowBorderStyle}">
|
||||||
<StackPanel Orientation="Vertical">
|
<StackPanel Orientation="Vertical">
|
||||||
<Grid>
|
<Grid>
|
||||||
<TextBox x:Name="QueryTextSuggestionBox"
|
<TextBox
|
||||||
Style="{DynamicResource QuerySuggestionBoxStyle}"
|
x:Name="QueryTextSuggestionBox"
|
||||||
IsEnabled="False"
|
IsEnabled="False"
|
||||||
Margin="18,0,56,0">
|
Style="{DynamicResource QuerySuggestionBoxStyle}">
|
||||||
<TextBox.Text>
|
<TextBox.Text>
|
||||||
<MultiBinding Converter="{StaticResource QuerySuggestionBoxConverter}">
|
<MultiBinding Converter="{StaticResource QuerySuggestionBoxConverter}">
|
||||||
<Binding ElementName="QueryTextBox" Path="Text"/>
|
<Binding ElementName="QueryTextBox" Mode="OneTime" />
|
||||||
<Binding ElementName="ResultListBox" Path="SelectedItem"/>
|
<Binding ElementName="ResultListBox" Path="SelectedItem" />
|
||||||
|
<Binding ElementName="QueryTextBox" Path="Text" />
|
||||||
</MultiBinding>
|
</MultiBinding>
|
||||||
</TextBox.Text>
|
</TextBox.Text>
|
||||||
</TextBox>
|
</TextBox>
|
||||||
<TextBox x:Name="QueryTextBox"
|
<TextBox
|
||||||
Style="{DynamicResource QueryBoxStyle}"
|
x:Name="QueryTextBox"
|
||||||
Text="{Binding QueryText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
AllowDrop="True"
|
||||||
PreviewDragOver="OnPreviewDragOver"
|
Background="Transparent"
|
||||||
AllowDrop="True"
|
PreviewDragOver="OnPreviewDragOver"
|
||||||
Visibility="Visible"
|
Style="{DynamicResource QueryBoxStyle}"
|
||||||
Background="Transparent"
|
Text="{Binding QueryText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
Margin="18,0,56,0">
|
Visibility="Visible">
|
||||||
<TextBox.ContextMenu>
|
<TextBox.ContextMenu>
|
||||||
<ContextMenu>
|
<ContextMenu>
|
||||||
<MenuItem Command="ApplicationCommands.Cut"/>
|
<MenuItem Command="ApplicationCommands.Cut" />
|
||||||
<MenuItem Command="ApplicationCommands.Copy"/>
|
<MenuItem Command="ApplicationCommands.Copy" />
|
||||||
<MenuItem Command="ApplicationCommands.Paste"/>
|
<MenuItem Command="ApplicationCommands.Paste" />
|
||||||
<Separator />
|
<Separator
|
||||||
<MenuItem Header="Settings" Click="OnContextMenusForSettingsClick" />
|
Margin="0"
|
||||||
|
Padding="0,4,0,4"
|
||||||
|
Background="{DynamicResource ContextSeparator}" />
|
||||||
|
<MenuItem Click="OnContextMenusForSettingsClick" Header="{DynamicResource flowlauncher_settings}" />
|
||||||
|
<MenuItem Command="{Binding EscCommand}" Header="{DynamicResource closeWindow}" />
|
||||||
</ContextMenu>
|
</ContextMenu>
|
||||||
</TextBox.ContextMenu>
|
</TextBox.ContextMenu>
|
||||||
</TextBox>
|
</TextBox>
|
||||||
<svgc:SvgControl Source="{Binding Image}" HorizontalAlignment="Right" Width="42" Height="42"
|
<Canvas Style="{DynamicResource SearchIconPosition}">
|
||||||
Background="Transparent"/>
|
<Path
|
||||||
|
Name="SearchIcon"
|
||||||
|
Margin="0"
|
||||||
|
Data="{DynamicResource SearchIconImg}"
|
||||||
|
Stretch="Fill"
|
||||||
|
Style="{DynamicResource SearchIconStyle}" />
|
||||||
|
</Canvas>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Line x:Name="ProgressBar" HorizontalAlignment="Right"
|
|
||||||
Style="{DynamicResource PendingLineStyle}" Visibility="{Binding ProgressBarVisibility, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
<Grid ClipToBounds="True">
|
||||||
Y1="0" Y2="0" X2="100" Height="2" Width="752" StrokeThickness="1">
|
<ContentControl>
|
||||||
</Line>
|
<ContentControl.Style>
|
||||||
<ContentControl>
|
<Style TargetType="ContentControl">
|
||||||
<flowlauncher:ResultListBox x:Name="ResultListBox" DataContext="{Binding Results}" PreviewMouseDown="OnPreviewMouseButtonDown" />
|
<Setter Property="Visibility" Value="Collapsed" />
|
||||||
</ContentControl>
|
<Style.Triggers>
|
||||||
<ContentControl>
|
<DataTrigger Binding="{Binding ElementName=ResultListBox, Path=Visibility}" Value="Visible">
|
||||||
<flowlauncher:ResultListBox DataContext="{Binding ContextMenu}" PreviewMouseDown="OnPreviewMouseButtonDown" />
|
<Setter Property="Visibility" Value="Visible" />
|
||||||
</ContentControl>
|
</DataTrigger>
|
||||||
<ContentControl>
|
<DataTrigger Binding="{Binding ElementName=ContextMenu, Path=Visibility}" Value="Visible">
|
||||||
<flowlauncher:ResultListBox DataContext="{Binding History}" PreviewMouseDown="OnPreviewMouseButtonDown" />
|
<Setter Property="Visibility" Value="Visible" />
|
||||||
</ContentControl>
|
</DataTrigger>
|
||||||
|
<DataTrigger Binding="{Binding ElementName=History, Path=Visibility}" Value="Visible">
|
||||||
|
<Setter Property="Visibility" Value="Visible" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</ContentControl.Style>
|
||||||
|
<Rectangle
|
||||||
|
Width="Auto"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Style="{DynamicResource SeparatorStyle}" />
|
||||||
|
</ContentControl>
|
||||||
|
<Line
|
||||||
|
x:Name="ProgressBar"
|
||||||
|
Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=ActualWidth}"
|
||||||
|
Height="2"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
StrokeThickness="1"
|
||||||
|
Style="{DynamicResource PendingLineStyle}"
|
||||||
|
Visibility="{Binding ProgressBarVisibility, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
X1="-150"
|
||||||
|
X2="-50"
|
||||||
|
Y1="0"
|
||||||
|
Y2="0" />
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Border Style="{DynamicResource WindowRadius}">
|
||||||
|
<Border.Clip>
|
||||||
|
<MultiBinding Converter="{StaticResource BorderClipConverter}">
|
||||||
|
<Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}" />
|
||||||
|
<Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}" />
|
||||||
|
<Binding Path="CornerRadius" RelativeSource="{RelativeSource Self}" />
|
||||||
|
</MultiBinding>
|
||||||
|
</Border.Clip>
|
||||||
|
<ContentControl>
|
||||||
|
<flowlauncher:ResultListBox
|
||||||
|
x:Name="ResultListBox"
|
||||||
|
DataContext="{Binding Results}"
|
||||||
|
PreviewMouseDown="OnPreviewMouseButtonDown" />
|
||||||
|
</ContentControl>
|
||||||
|
</Border>
|
||||||
|
<Border Style="{DynamicResource WindowRadius}">
|
||||||
|
<Border.Clip>
|
||||||
|
<MultiBinding Converter="{StaticResource BorderClipConverter}">
|
||||||
|
<Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}" />
|
||||||
|
<Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}" />
|
||||||
|
<Binding Path="CornerRadius" RelativeSource="{RelativeSource Self}" />
|
||||||
|
</MultiBinding>
|
||||||
|
</Border.Clip>
|
||||||
|
<ContentControl>
|
||||||
|
<flowlauncher:ResultListBox
|
||||||
|
x:Name="ContextMenu"
|
||||||
|
DataContext="{Binding ContextMenu}"
|
||||||
|
PreviewMouseDown="OnPreviewMouseButtonDown" />
|
||||||
|
</ContentControl>
|
||||||
|
</Border>
|
||||||
|
<Border Style="{DynamicResource WindowRadius}">
|
||||||
|
<Border.Clip>
|
||||||
|
<MultiBinding Converter="{StaticResource BorderClipConverter}">
|
||||||
|
<Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}" />
|
||||||
|
<Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}" />
|
||||||
|
<Binding Path="CornerRadius" RelativeSource="{RelativeSource Self}" />
|
||||||
|
</MultiBinding>
|
||||||
|
</Border.Clip>
|
||||||
|
<ContentControl>
|
||||||
|
<flowlauncher:ResultListBox
|
||||||
|
x:Name="History"
|
||||||
|
DataContext="{Binding History}"
|
||||||
|
PreviewMouseDown="OnPreviewMouseButtonDown" />
|
||||||
|
</ContentControl>
|
||||||
|
</Border>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
|
@ -11,14 +11,12 @@ using Flow.Launcher.Core.Resource;
|
||||||
using Flow.Launcher.Helper;
|
using Flow.Launcher.Helper;
|
||||||
using Flow.Launcher.Infrastructure.UserSettings;
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
using Flow.Launcher.ViewModel;
|
using Flow.Launcher.ViewModel;
|
||||||
using Application = System.Windows.Application;
|
|
||||||
using Screen = System.Windows.Forms.Screen;
|
using Screen = System.Windows.Forms.Screen;
|
||||||
using ContextMenuStrip = System.Windows.Forms.ContextMenuStrip;
|
using ContextMenuStrip = System.Windows.Forms.ContextMenuStrip;
|
||||||
using DataFormats = System.Windows.DataFormats;
|
|
||||||
using DragEventArgs = System.Windows.DragEventArgs;
|
using DragEventArgs = System.Windows.DragEventArgs;
|
||||||
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
|
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
|
||||||
using MessageBox = System.Windows.MessageBox;
|
|
||||||
using NotifyIcon = System.Windows.Forms.NotifyIcon;
|
using NotifyIcon = System.Windows.Forms.NotifyIcon;
|
||||||
|
using Flow.Launcher.Infrastructure;
|
||||||
|
|
||||||
namespace Flow.Launcher
|
namespace Flow.Launcher
|
||||||
{
|
{
|
||||||
|
|
@ -30,7 +28,9 @@ namespace Flow.Launcher
|
||||||
private bool isProgressBarStoryboardPaused;
|
private bool isProgressBarStoryboardPaused;
|
||||||
private Settings _settings;
|
private Settings _settings;
|
||||||
private NotifyIcon _notifyIcon;
|
private NotifyIcon _notifyIcon;
|
||||||
|
private ContextMenu contextMenu;
|
||||||
private MainViewModel _viewModel;
|
private MainViewModel _viewModel;
|
||||||
|
private bool _animating;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
@ -40,6 +40,7 @@ namespace Flow.Launcher
|
||||||
_viewModel = mainVM;
|
_viewModel = mainVM;
|
||||||
_settings = settings;
|
_settings = settings;
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
InitializePosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
public MainWindow()
|
public MainWindow()
|
||||||
|
|
@ -49,11 +50,13 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
private async void OnClosing(object sender, CancelEventArgs e)
|
private async void OnClosing(object sender, CancelEventArgs e)
|
||||||
{
|
{
|
||||||
|
_settings.WindowTop = Top;
|
||||||
|
_settings.WindowLeft = Left;
|
||||||
_notifyIcon.Visible = false;
|
_notifyIcon.Visible = false;
|
||||||
_viewModel.Save();
|
_viewModel.Save();
|
||||||
e.Cancel = true;
|
e.Cancel = true;
|
||||||
await PluginManager.DisposePluginsAsync();
|
await PluginManager.DisposePluginsAsync();
|
||||||
Application.Current.Shutdown();
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnInitialized(object sender, EventArgs e)
|
private void OnInitialized(object sender, EventArgs e)
|
||||||
|
|
@ -62,12 +65,13 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
private void OnLoaded(object sender, RoutedEventArgs _)
|
private void OnLoaded(object sender, RoutedEventArgs _)
|
||||||
{
|
{
|
||||||
|
CheckFirstLaunch();
|
||||||
|
HideStartup();
|
||||||
// show notify icon when flowlauncher is hidden
|
// show notify icon when flowlauncher is hidden
|
||||||
InitializeNotifyIcon();
|
InitializeNotifyIcon();
|
||||||
|
InitializeColorScheme();
|
||||||
WindowsInteropHelper.DisableControlBox(this);
|
WindowsInteropHelper.DisableControlBox(this);
|
||||||
InitProgressbarAnimation();
|
InitProgressbarAnimation();
|
||||||
InitializePosition();
|
|
||||||
// since the default main window visibility is visible
|
// since the default main window visibility is visible
|
||||||
// so we need set focus during startup
|
// so we need set focus during startup
|
||||||
QueryTextBox.Focus();
|
QueryTextBox.Focus();
|
||||||
|
|
@ -76,13 +80,13 @@ namespace Flow.Launcher
|
||||||
{
|
{
|
||||||
switch (e.PropertyName)
|
switch (e.PropertyName)
|
||||||
{
|
{
|
||||||
case nameof(MainViewModel.MainWindowVisibility):
|
case nameof(MainViewModel.MainWindowVisibilityStatus):
|
||||||
{
|
{
|
||||||
if (_viewModel.MainWindowVisibility == Visibility.Visible)
|
if (_viewModel.MainWindowVisibilityStatus)
|
||||||
{
|
{
|
||||||
|
UpdatePosition();
|
||||||
Activate();
|
Activate();
|
||||||
QueryTextBox.Focus();
|
QueryTextBox.Focus();
|
||||||
UpdatePosition();
|
|
||||||
_settings.ActivateTimes++;
|
_settings.ActivateTimes++;
|
||||||
if (!_viewModel.LastQuerySelected)
|
if (!_viewModel.LastQuerySelected)
|
||||||
{
|
{
|
||||||
|
|
@ -114,7 +118,7 @@ namespace Flow.Launcher
|
||||||
_progressBarStoryboard.Stop(ProgressBar);
|
_progressBarStoryboard.Stop(ProgressBar);
|
||||||
isProgressBarStoryboardPaused = true;
|
isProgressBarStoryboardPaused = true;
|
||||||
}
|
}
|
||||||
else if (_viewModel.MainWindowVisibility == Visibility.Visible &&
|
else if (_viewModel.MainWindowVisibilityStatus &&
|
||||||
isProgressBarStoryboardPaused)
|
isProgressBarStoryboardPaused)
|
||||||
{
|
{
|
||||||
_progressBarStoryboard.Begin(ProgressBar, true);
|
_progressBarStoryboard.Begin(ProgressBar, true);
|
||||||
|
|
@ -145,28 +149,29 @@ namespace Flow.Launcher
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
InitializePosition();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializePosition()
|
private void InitializePosition()
|
||||||
{
|
{
|
||||||
Top = WindowTop();
|
if (_settings.RememberLastLaunchLocation)
|
||||||
Left = WindowLeft();
|
{
|
||||||
_settings.WindowTop = Top;
|
Top = _settings.WindowTop;
|
||||||
_settings.WindowLeft = Left;
|
Left = _settings.WindowLeft;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Left = WindowLeft();
|
||||||
|
Top = WindowTop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateNotifyIconText()
|
private void UpdateNotifyIconText()
|
||||||
{
|
{
|
||||||
var menu = _notifyIcon.ContextMenuStrip;
|
var menu = contextMenu;
|
||||||
var open = menu.Items[0];
|
((MenuItem)menu.Items[1]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen");
|
||||||
var setting = menu.Items[1];
|
((MenuItem)menu.Items[2]).Header = InternationalizationManager.Instance.GetTranslation("GameMode");
|
||||||
var exit = menu.Items[2];
|
((MenuItem)menu.Items[3]).Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings");
|
||||||
|
((MenuItem)menu.Items[4]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit");
|
||||||
open.Text = InternationalizationManager.Instance.GetTranslation("iconTrayOpen");
|
|
||||||
setting.Text = InternationalizationManager.Instance.GetTranslation("iconTraySettings");
|
|
||||||
exit.Text = InternationalizationManager.Instance.GetTranslation("iconTrayExit");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeNotifyIcon()
|
private void InitializeNotifyIcon()
|
||||||
|
|
@ -177,39 +182,89 @@ namespace Flow.Launcher
|
||||||
Icon = Properties.Resources.app,
|
Icon = Properties.Resources.app,
|
||||||
Visible = !_settings.HideNotifyIcon
|
Visible = !_settings.HideNotifyIcon
|
||||||
};
|
};
|
||||||
var menu = new ContextMenuStrip();
|
contextMenu = new ContextMenu();
|
||||||
var items = menu.Items;
|
|
||||||
|
|
||||||
var open = items.Add(InternationalizationManager.Instance.GetTranslation("iconTrayOpen"));
|
var header = new MenuItem
|
||||||
open.Click += (o, e) => Visibility = Visibility.Visible;
|
{
|
||||||
var setting = items.Add(InternationalizationManager.Instance.GetTranslation("iconTraySettings"));
|
Header = "Flow Launcher",
|
||||||
setting.Click += (o, e) => App.API.OpenSettingDialog();
|
IsEnabled = false
|
||||||
var exit = items.Add(InternationalizationManager.Instance.GetTranslation("iconTrayExit"));
|
};
|
||||||
|
var open = new MenuItem
|
||||||
|
{
|
||||||
|
Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen")
|
||||||
|
};
|
||||||
|
var gamemode = new MenuItem
|
||||||
|
{
|
||||||
|
Header = InternationalizationManager.Instance.GetTranslation("GameMode")
|
||||||
|
};
|
||||||
|
var settings = new MenuItem
|
||||||
|
{
|
||||||
|
Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings")
|
||||||
|
};
|
||||||
|
var exit = new MenuItem
|
||||||
|
{
|
||||||
|
Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit")
|
||||||
|
};
|
||||||
|
|
||||||
|
open.Click += (o, e) => _viewModel.ToggleFlowLauncher();
|
||||||
|
gamemode.Click += (o, e) => ToggleGameMode();
|
||||||
|
settings.Click += (o, e) => App.API.OpenSettingDialog();
|
||||||
exit.Click += (o, e) => Close();
|
exit.Click += (o, e) => Close();
|
||||||
|
contextMenu.Items.Add(header);
|
||||||
|
contextMenu.Items.Add(open);
|
||||||
|
gamemode.ToolTip = InternationalizationManager.Instance.GetTranslation("GameModeToolTip");
|
||||||
|
contextMenu.Items.Add(gamemode);
|
||||||
|
contextMenu.Items.Add(settings);
|
||||||
|
contextMenu.Items.Add(exit);
|
||||||
|
|
||||||
_notifyIcon.ContextMenuStrip = menu;
|
_notifyIcon.ContextMenuStrip = new ContextMenuStrip(); // it need for close the context menu. if not, context menu can't close.
|
||||||
_notifyIcon.MouseClick += (o, e) =>
|
_notifyIcon.MouseClick += (o, e) =>
|
||||||
{
|
{
|
||||||
if (e.Button == MouseButtons.Left)
|
switch (e.Button)
|
||||||
{
|
{
|
||||||
if (menu.Visible)
|
case MouseButtons.Left:
|
||||||
{
|
_viewModel.ToggleFlowLauncher();
|
||||||
menu.Close();
|
break;
|
||||||
}
|
|
||||||
else
|
case MouseButtons.Right:
|
||||||
{
|
contextMenu.IsOpen = true;
|
||||||
var p = System.Windows.Forms.Cursor.Position;
|
break;
|
||||||
menu.Show(p);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CheckFirstLaunch()
|
||||||
|
{
|
||||||
|
if (_settings.FirstLaunch)
|
||||||
|
{
|
||||||
|
_settings.FirstLaunch = false;
|
||||||
|
PluginManager.API.SaveAppAllSettings();
|
||||||
|
OpenWelcomeWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void OpenWelcomeWindow()
|
||||||
|
{
|
||||||
|
var WelcomeWindow = new WelcomeWindow(_settings);
|
||||||
|
WelcomeWindow.Show();
|
||||||
|
}
|
||||||
|
private void ToggleGameMode()
|
||||||
|
{
|
||||||
|
if (_viewModel.GameModeStatus)
|
||||||
|
{
|
||||||
|
_notifyIcon.Icon = Properties.Resources.app;
|
||||||
|
_viewModel.GameModeStatus = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_notifyIcon.Icon = Properties.Resources.gamemode;
|
||||||
|
_viewModel.GameModeStatus = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
private void InitProgressbarAnimation()
|
private void InitProgressbarAnimation()
|
||||||
{
|
{
|
||||||
var da = new DoubleAnimation(ProgressBar.X2, ActualWidth + 100,
|
var da = new DoubleAnimation(ProgressBar.X2, ActualWidth + 150,
|
||||||
new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
|
new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
|
||||||
var da1 = new DoubleAnimation(ProgressBar.X1, ActualWidth, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
|
var da1 = new DoubleAnimation(ProgressBar.X1, ActualWidth + 50, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
|
||||||
Storyboard.SetTargetProperty(da, new PropertyPath("(Line.X2)"));
|
Storyboard.SetTargetProperty(da, new PropertyPath("(Line.X2)"));
|
||||||
Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X1)"));
|
Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X1)"));
|
||||||
_progressBarStoryboard.Children.Add(da);
|
_progressBarStoryboard.Children.Add(da);
|
||||||
|
|
@ -219,6 +274,53 @@ namespace Flow.Launcher
|
||||||
_viewModel.ProgressBarVisibility = Visibility.Hidden;
|
_viewModel.ProgressBarVisibility = Visibility.Hidden;
|
||||||
isProgressBarStoryboardPaused = true;
|
isProgressBarStoryboardPaused = true;
|
||||||
}
|
}
|
||||||
|
public void WindowAnimator()
|
||||||
|
{
|
||||||
|
if (_animating)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_animating = true;
|
||||||
|
UpdatePosition();
|
||||||
|
Storyboard sb = new Storyboard();
|
||||||
|
Storyboard iconsb = new Storyboard();
|
||||||
|
CircleEase easing = new CircleEase(); // or whatever easing class you want
|
||||||
|
easing.EasingMode = EasingMode.EaseInOut;
|
||||||
|
var da = new DoubleAnimation
|
||||||
|
{
|
||||||
|
From = 0,
|
||||||
|
To = 1,
|
||||||
|
Duration = TimeSpan.FromSeconds(0.25),
|
||||||
|
FillBehavior = FillBehavior.Stop
|
||||||
|
};
|
||||||
|
|
||||||
|
var da2 = new DoubleAnimation
|
||||||
|
{
|
||||||
|
From = Top + 10,
|
||||||
|
To = Top,
|
||||||
|
Duration = TimeSpan.FromSeconds(0.25),
|
||||||
|
FillBehavior = FillBehavior.Stop
|
||||||
|
};
|
||||||
|
var da3 = new DoubleAnimation
|
||||||
|
{
|
||||||
|
From = 12,
|
||||||
|
To = 0,
|
||||||
|
EasingFunction = easing,
|
||||||
|
Duration = TimeSpan.FromSeconds(0.36),
|
||||||
|
FillBehavior = FillBehavior.Stop
|
||||||
|
};
|
||||||
|
Storyboard.SetTarget(da, this);
|
||||||
|
Storyboard.SetTargetProperty(da, new PropertyPath(Window.OpacityProperty));
|
||||||
|
Storyboard.SetTargetProperty(da2, new PropertyPath(Window.TopProperty));
|
||||||
|
Storyboard.SetTargetProperty(da3, new PropertyPath(TopProperty));
|
||||||
|
sb.Children.Add(da);
|
||||||
|
sb.Children.Add(da2);
|
||||||
|
iconsb.Children.Add(da3);
|
||||||
|
sb.Completed += (_, _) => _animating = false;
|
||||||
|
_settings.WindowLeft = Left;
|
||||||
|
_settings.WindowTop = Top;
|
||||||
|
iconsb.Begin(SearchIcon);
|
||||||
|
sb.Begin(FlowMainWindow);
|
||||||
|
}
|
||||||
|
|
||||||
private void OnMouseDown(object sender, MouseButtonEventArgs e)
|
private void OnMouseDown(object sender, MouseButtonEventArgs e)
|
||||||
{
|
{
|
||||||
|
|
@ -252,22 +354,41 @@ namespace Flow.Launcher
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnContextMenusForSettingsClick(object sender, RoutedEventArgs e)
|
private async void OnContextMenusForSettingsClick(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
|
_viewModel.Hide();
|
||||||
|
|
||||||
|
if(_settings.UseAnimation)
|
||||||
|
await Task.Delay(100);
|
||||||
|
|
||||||
App.API.OpenSettingDialog();
|
App.API.OpenSettingDialog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void OnDeactivated(object sender, EventArgs e)
|
private async void OnDeactivated(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (_settings.HideWhenDeactive)
|
//This condition stops extra hide call when animator is on,
|
||||||
|
// which causes the toggling to occasional hide instead of show.
|
||||||
|
if (_viewModel.MainWindowVisibilityStatus)
|
||||||
{
|
{
|
||||||
Hide();
|
// Need time to initialize the main query window animation.
|
||||||
|
// This also stops the mainwindow from flickering occasionally after Settings window is opened
|
||||||
|
// and always after Settings window is closed.
|
||||||
|
if (_settings.UseAnimation)
|
||||||
|
await Task.Delay(100);
|
||||||
|
|
||||||
|
if (_settings.HideWhenDeactive)
|
||||||
|
{
|
||||||
|
_viewModel.Hide();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdatePosition()
|
private void UpdatePosition()
|
||||||
{
|
{
|
||||||
|
if (_animating)
|
||||||
|
return;
|
||||||
|
|
||||||
if (_settings.RememberLastLaunchLocation)
|
if (_settings.RememberLastLaunchLocation)
|
||||||
{
|
{
|
||||||
Left = _settings.WindowLeft;
|
Left = _settings.WindowLeft;
|
||||||
|
|
@ -282,6 +403,8 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
private void OnLocationChanged(object sender, EventArgs e)
|
private void OnLocationChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
if (_animating)
|
||||||
|
return;
|
||||||
if (_settings.RememberLastLaunchLocation)
|
if (_settings.RememberLastLaunchLocation)
|
||||||
{
|
{
|
||||||
_settings.WindowLeft = Left;
|
_settings.WindowLeft = Left;
|
||||||
|
|
@ -289,7 +412,20 @@ namespace Flow.Launcher
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private double WindowLeft()
|
public void HideStartup()
|
||||||
|
{
|
||||||
|
UpdatePosition();
|
||||||
|
if (_settings.HideOnStartup)
|
||||||
|
{
|
||||||
|
_viewModel.Hide();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_viewModel.Show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double WindowLeft()
|
||||||
{
|
{
|
||||||
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
|
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
|
||||||
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
|
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
|
||||||
|
|
@ -298,7 +434,7 @@ namespace Flow.Launcher
|
||||||
return left;
|
return left;
|
||||||
}
|
}
|
||||||
|
|
||||||
private double WindowTop()
|
public double WindowTop()
|
||||||
{
|
{
|
||||||
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
|
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
|
||||||
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
|
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
|
||||||
|
|
@ -313,25 +449,43 @@ namespace Flow.Launcher
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void OnKeyDown(object sender, KeyEventArgs e)
|
private void OnKeyDown(object sender, KeyEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.Key == Key.Down)
|
switch (e.Key)
|
||||||
{
|
{
|
||||||
_viewModel.SelectNextItemCommand.Execute(null);
|
case Key.Down:
|
||||||
e.Handled = true;
|
_viewModel.SelectNextItemCommand.Execute(null);
|
||||||
}
|
e.Handled = true;
|
||||||
else if (e.Key == Key.Up)
|
break;
|
||||||
{
|
case Key.Up:
|
||||||
_viewModel.SelectPrevItemCommand.Execute(null);
|
_viewModel.SelectPrevItemCommand.Execute(null);
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
break;
|
||||||
else if (e.Key == Key.PageDown)
|
case Key.PageDown:
|
||||||
{
|
_viewModel.SelectNextPageCommand.Execute(null);
|
||||||
_viewModel.SelectNextPageCommand.Execute(null);
|
e.Handled = true;
|
||||||
e.Handled = true;
|
break;
|
||||||
}
|
case Key.PageUp:
|
||||||
else if (e.Key == Key.PageUp)
|
_viewModel.SelectPrevPageCommand.Execute(null);
|
||||||
{
|
e.Handled = true;
|
||||||
_viewModel.SelectPrevPageCommand.Execute(null);
|
break;
|
||||||
e.Handled = true;
|
case Key.Right:
|
||||||
|
if (_viewModel.SelectedIsFromQueryResults()
|
||||||
|
&& QueryTextBox.CaretIndex == QueryTextBox.Text.Length
|
||||||
|
&& !string.IsNullOrEmpty(QueryTextBox.Text))
|
||||||
|
{
|
||||||
|
_viewModel.LoadContextMenuCommand.Execute(null);
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Key.Left:
|
||||||
|
if (!_viewModel.SelectedIsFromQueryResults() && QueryTextBox.CaretIndex == 0)
|
||||||
|
{
|
||||||
|
_viewModel.EscCommand.Execute(null);
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -339,5 +493,17 @@ namespace Flow.Launcher
|
||||||
{
|
{
|
||||||
QueryTextBox.CaretIndex = QueryTextBox.Text.Length;
|
QueryTextBox.CaretIndex = QueryTextBox.Text.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void InitializeColorScheme()
|
||||||
|
{
|
||||||
|
if (_settings.ColorScheme == Constant.Light)
|
||||||
|
{
|
||||||
|
ModernWpf.ThemeManager.Current.ApplicationTheme = ModernWpf.ApplicationTheme.Light;
|
||||||
|
}
|
||||||
|
else if (_settings.ColorScheme == Constant.Dark)
|
||||||
|
{
|
||||||
|
ModernWpf.ThemeManager.Current.ApplicationTheme = ModernWpf.ApplicationTheme.Dark;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
42
Flow.Launcher/Notification.cs
Normal file
42
Flow.Launcher/Notification.cs
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
using Flow.Launcher.Infrastructure;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using Windows.Data.Xml.Dom;
|
||||||
|
using Windows.UI.Notifications;
|
||||||
|
|
||||||
|
namespace Flow.Launcher
|
||||||
|
{
|
||||||
|
internal static class Notification
|
||||||
|
{
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")]
|
||||||
|
public static void Show(string title, string subTitle, string iconPath)
|
||||||
|
{
|
||||||
|
var legacy = Environment.OSVersion.Version.Build < 19041;
|
||||||
|
// Handle notification for win7/8/early win10
|
||||||
|
if (legacy)
|
||||||
|
{
|
||||||
|
LegacyShow(title, subTitle, iconPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Using Windows Notification System
|
||||||
|
var Icon = !File.Exists(iconPath)
|
||||||
|
? Path.Combine(Constant.ProgramDirectory, "Images\\app.png")
|
||||||
|
: iconPath;
|
||||||
|
|
||||||
|
var xml = $"<?xml version=\"1.0\"?><toast><visual><binding template=\"ToastImageAndText04\"><image id=\"1\" src=\"{Icon}\" alt=\"meziantou\"/><text id=\"1\">{title}</text>" +
|
||||||
|
$"<text id=\"2\">{subTitle}</text></binding></visual></toast>";
|
||||||
|
var toastXml = new XmlDocument();
|
||||||
|
toastXml.LoadXml(xml);
|
||||||
|
var toast = new ToastNotification(toastXml);
|
||||||
|
ToastNotificationManager.CreateToastNotifier("Flow Launcher").Show(toast);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void LegacyShow(string title, string subTitle, string iconPath)
|
||||||
|
{
|
||||||
|
var msg = new Msg();
|
||||||
|
msg.Show(title, subTitle, iconPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,45 +1,124 @@
|
||||||
<Window x:Class="Flow.Launcher.PriorityChangeWindow"
|
<Window
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
x:Class="Flow.Launcher.PriorityChangeWindow"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:local="clr-namespace:Flow.Launcher"
|
xmlns:local="clr-namespace:Flow.Launcher"
|
||||||
Loaded="PriorityChangeWindow_Loaded"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
mc:Ignorable="d"
|
xmlns:ui="http://schemas.modernwpf.com/2019"
|
||||||
WindowStartupLocation="CenterScreen"
|
Title="{DynamicResource changePriorityWindow}"
|
||||||
Title="PriorityChangeWindow" Height="250" Width="300">
|
Width="350"
|
||||||
|
Background="{DynamicResource PopuBGColor}"
|
||||||
|
Foreground="{DynamicResource PopupTextColor}"
|
||||||
|
Loaded="PriorityChangeWindow_Loaded"
|
||||||
|
MouseDown="window_MouseDown"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
SizeToContent="Height"
|
||||||
|
WindowStartupLocation="CenterScreen"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<WindowChrome.WindowChrome>
|
||||||
|
<WindowChrome CaptionHeight="32" ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" />
|
||||||
|
</WindowChrome.WindowChrome>
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition />
|
<RowDefinition />
|
||||||
<RowDefinition Height="60"/>
|
<RowDefinition Height="80" />
|
||||||
<RowDefinition Height="75"/>
|
|
||||||
<RowDefinition />
|
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
|
||||||
<ColumnDefinition Width="20" />
|
|
||||||
<ColumnDefinition />
|
|
||||||
</Grid.ColumnDefinitions>
|
|
||||||
<TextBlock FontSize="14" Grid.Row="0" Grid.Column="1" VerticalAlignment="Center"
|
|
||||||
HorizontalAlignment="Left" Text="{DynamicResource currentPriority}" />
|
|
||||||
<TextBlock x:Name="OldPriority" Grid.Row="0" Grid.Column="1" Margin="170 10 10 10" FontSize="14"
|
|
||||||
VerticalAlignment="Center" HorizontalAlignment="Left" />
|
|
||||||
|
|
||||||
<TextBlock FontSize="14" Grid.Row="1" Grid.Column="1" VerticalAlignment="Center"
|
<StackPanel Grid.Row="0">
|
||||||
HorizontalAlignment="Left" Text="{DynamicResource newPriority}" />
|
<StackPanel>
|
||||||
<StackPanel Grid.Row="1" Orientation="Horizontal" Grid.Column="1">
|
<Grid>
|
||||||
<TextBox x:Name="tbAction" Margin="140 10 15 10" Width="105" VerticalAlignment="Center" HorizontalAlignment="Left" />
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Button
|
||||||
|
Grid.Column="4"
|
||||||
|
Click="BtnCancel_OnClick"
|
||||||
|
Style="{StaticResource TitleBarCloseButtonStyle}">
|
||||||
|
<Path
|
||||||
|
Width="46"
|
||||||
|
Height="32"
|
||||||
|
Data="M 18,11 27,20 M 18,20 27,11"
|
||||||
|
Stroke="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
|
||||||
|
StrokeThickness="1">
|
||||||
|
<Path.Style>
|
||||||
|
<Style TargetType="Path">
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding Path=IsActive, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Value="False">
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Path.Style>
|
||||||
|
</Path>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Margin="26,12,26,0">
|
||||||
|
<StackPanel Margin="0,0,0,12">
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="0,0,0,0"
|
||||||
|
FontFamily="Segoe UI"
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource changePriorityWindow}"
|
||||||
|
TextAlignment="Left" />
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource priority_tips}"
|
||||||
|
TextAlignment="Left"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Margin="0,24,0,24" Orientation="Horizontal">
|
||||||
|
<TextBlock
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource priority}" />
|
||||||
|
<ui:NumberBox
|
||||||
|
x:Name="tbAction"
|
||||||
|
Width="200"
|
||||||
|
Margin="10,0,15,0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
CornerRadius="4"
|
||||||
|
Minimum="0"
|
||||||
|
SmallChange="1"
|
||||||
|
SpinButtonPlacementMode="Inline" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
<Border
|
||||||
<TextBlock Grid.Row="2" Grid.ColumnSpan="1" Grid.Column="1" Foreground="Gray"
|
Grid.Row="1"
|
||||||
Text="{DynamicResource priority_tips}" TextWrapping="Wrap"
|
Background="{DynamicResource PopupButtonAreaBGColor}"
|
||||||
Margin="0,0,20,0"/>
|
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
|
||||||
|
BorderThickness="0,1,0,0">
|
||||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Row="3" Grid.Column="1">
|
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
|
||||||
<Button x:Name="btnCancel" Click="BtnCancel_OnClick" Margin="10 0 10 0" Width="80" Height="30"
|
<Button
|
||||||
|
x:Name="btnCancel"
|
||||||
|
Width="145"
|
||||||
|
Height="30"
|
||||||
|
Margin="0,0,5,0"
|
||||||
|
Click="BtnCancel_OnClick"
|
||||||
Content="{DynamicResource cancel}" />
|
Content="{DynamicResource cancel}" />
|
||||||
<Button x:Name="btnDone" Margin="10 0 10 0" Width="80" Height="30" Click="btnDone_OnClick">
|
<Button
|
||||||
<TextBlock x:Name="lblAdd" Text="{DynamicResource done}" />
|
x:Name="btnDone"
|
||||||
</Button>
|
Width="145"
|
||||||
</StackPanel>
|
Height="30"
|
||||||
|
Margin="5,0,0,0"
|
||||||
|
Click="btnDone_OnClick"
|
||||||
|
Style="{StaticResource AccentButtonStyle}">
|
||||||
|
<TextBlock x:Name="lblAdd" Text="{DynamicResource done}" />
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,6 @@ namespace Flow.Launcher
|
||||||
private Settings settings;
|
private Settings settings;
|
||||||
private readonly Internationalization translater = InternationalizationManager.Instance;
|
private readonly Internationalization translater = InternationalizationManager.Instance;
|
||||||
private readonly PluginViewModel pluginViewModel;
|
private readonly PluginViewModel pluginViewModel;
|
||||||
|
|
||||||
public PriorityChangeWindow(string pluginId, Settings settings, PluginViewModel pluginViewModel)
|
public PriorityChangeWindow(string pluginId, Settings settings, PluginViewModel pluginViewModel)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
@ -62,8 +61,17 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
private void PriorityChangeWindow_Loaded(object sender, RoutedEventArgs e)
|
private void PriorityChangeWindow_Loaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
OldPriority.Text = pluginViewModel.Priority.ToString();
|
tbAction.Text = pluginViewModel.Priority.ToString();
|
||||||
tbAction.Focus();
|
tbAction.Focus();
|
||||||
}
|
}
|
||||||
|
private void window_MouseDown(object sender, MouseButtonEventArgs e) /* for close hotkey popup */
|
||||||
|
{
|
||||||
|
TextBox textBox = Keyboard.FocusedElement as TextBox;
|
||||||
|
if (textBox != null)
|
||||||
|
{
|
||||||
|
TraversalRequest tRequest = new TraversalRequest(FocusNavigationDirection.Next);
|
||||||
|
textBox.MoveFocus(tRequest);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
8
Flow.Launcher/Properties/Resources.Designer.cs
generated
8
Flow.Launcher/Properties/Resources.Designer.cs
generated
|
|
@ -69,5 +69,13 @@ namespace Flow.Launcher.Properties {
|
||||||
return ((System.Drawing.Icon)(obj));
|
return ((System.Drawing.Icon)(obj));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
internal static System.Drawing.Icon gamemode
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
object obj = ResourceManager.GetObject("gamemode", resourceCulture);
|
||||||
|
return ((System.Drawing.Icon)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -112,13 +112,16 @@
|
||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
<data name="app" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="app" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="gamemode" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
|
@ -14,6 +14,7 @@ using Flow.Launcher.Infrastructure.Image;
|
||||||
using Flow.Launcher.Plugin;
|
using Flow.Launcher.Plugin;
|
||||||
using Flow.Launcher.ViewModel;
|
using Flow.Launcher.ViewModel;
|
||||||
using Flow.Launcher.Plugin.SharedModels;
|
using Flow.Launcher.Plugin.SharedModels;
|
||||||
|
using Flow.Launcher.Plugin.SharedCommands;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using Flow.Launcher.Infrastructure.Http;
|
using Flow.Launcher.Infrastructure.Http;
|
||||||
|
|
@ -22,6 +23,8 @@ using System.Runtime.CompilerServices;
|
||||||
using Flow.Launcher.Infrastructure.Logger;
|
using Flow.Launcher.Infrastructure.Logger;
|
||||||
using Flow.Launcher.Infrastructure.Storage;
|
using Flow.Launcher.Infrastructure.Storage;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
|
using Flow.Launcher.Plugin.SharedCommands;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace Flow.Launcher
|
namespace Flow.Launcher
|
||||||
{
|
{
|
||||||
|
|
@ -38,7 +41,7 @@ namespace Flow.Launcher
|
||||||
_settingsVM = settingsVM;
|
_settingsVM = settingsVM;
|
||||||
_mainVM = mainVM;
|
_mainVM = mainVM;
|
||||||
_alphabet = alphabet;
|
_alphabet = alphabet;
|
||||||
GlobalHotkey.Instance.hookedKeyboardCallback += KListener_hookedKeyboardCallback;
|
GlobalHotkey.hookedKeyboardCallback = KListener_hookedKeyboardCallback;
|
||||||
WebRequest.RegisterPrefix("data", new DataWebRequestFactory());
|
WebRequest.RegisterPrefix("data", new DataWebRequestFactory());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -48,17 +51,12 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
public void ChangeQuery(string query, bool requery = false)
|
public void ChangeQuery(string query, bool requery = false)
|
||||||
{
|
{
|
||||||
_mainVM.ChangeQueryText(query);
|
_mainVM.ChangeQueryText(query, requery);
|
||||||
}
|
|
||||||
|
|
||||||
public void ChangeQueryText(string query, bool selectAll = false)
|
|
||||||
{
|
|
||||||
_mainVM.ChangeQueryText(query);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RestartApp()
|
public void RestartApp()
|
||||||
{
|
{
|
||||||
_mainVM.MainWindowVisibility = Visibility.Hidden;
|
_mainVM.Hide();
|
||||||
|
|
||||||
// we must manually save
|
// we must manually save
|
||||||
// UpdateManager.RestartApp() will call Environment.Exit(0)
|
// UpdateManager.RestartApp() will call Environment.Exit(0)
|
||||||
|
|
@ -73,6 +71,8 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
public void RestarApp() => RestartApp();
|
public void RestarApp() => RestartApp();
|
||||||
|
|
||||||
|
public void ShowMainWindow() => _mainVM.Show();
|
||||||
|
|
||||||
public void CheckForNewUpdate() => _settingsVM.UpdateApp();
|
public void CheckForNewUpdate() => _settingsVM.UpdateApp();
|
||||||
|
|
||||||
public void SaveAppAllSettings()
|
public void SaveAppAllSettings()
|
||||||
|
|
@ -95,8 +95,7 @@ namespace Flow.Launcher
|
||||||
{
|
{
|
||||||
Application.Current.Dispatcher.Invoke(() =>
|
Application.Current.Dispatcher.Invoke(() =>
|
||||||
{
|
{
|
||||||
var msg = useMainWindowAsOwner ? new Msg {Owner = Application.Current.MainWindow} : new Msg();
|
Notification.Show(title, subTitle, iconPath);
|
||||||
msg.Show(title, subTitle, iconPath);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -108,6 +107,19 @@ namespace Flow.Launcher
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ShellRun(string cmd, string filename = "cmd.exe")
|
||||||
|
{
|
||||||
|
var args = filename == "cmd.exe" ? $"/C {cmd}" : $"{cmd}";
|
||||||
|
|
||||||
|
var startInfo = ShellCommand.SetProcessStartInfo(filename, arguments: args, createNoWindow: true);
|
||||||
|
ShellCommand.Execute(startInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CopyToClipboard(string text)
|
||||||
|
{
|
||||||
|
Clipboard.SetDataObject(text);
|
||||||
|
}
|
||||||
|
|
||||||
public void StartLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Visible;
|
public void StartLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Visible;
|
||||||
|
|
||||||
public void StopLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Collapsed;
|
public void StopLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Collapsed;
|
||||||
|
|
@ -162,7 +174,7 @@ namespace Flow.Launcher
|
||||||
if (!_pluginJsonStorages.ContainsKey(type))
|
if (!_pluginJsonStorages.ContainsKey(type))
|
||||||
_pluginJsonStorages[type] = new PluginJsonStorage<T>();
|
_pluginJsonStorages[type] = new PluginJsonStorage<T>();
|
||||||
|
|
||||||
return ((PluginJsonStorage<T>) _pluginJsonStorages[type]).Load();
|
return ((PluginJsonStorage<T>)_pluginJsonStorages[type]).Load();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SaveSettingJsonStorage<T>() where T : new()
|
public void SaveSettingJsonStorage<T>() where T : new()
|
||||||
|
|
@ -171,7 +183,7 @@ namespace Flow.Launcher
|
||||||
if (!_pluginJsonStorages.ContainsKey(type))
|
if (!_pluginJsonStorages.ContainsKey(type))
|
||||||
_pluginJsonStorages[type] = new PluginJsonStorage<T>();
|
_pluginJsonStorages[type] = new PluginJsonStorage<T>();
|
||||||
|
|
||||||
((PluginJsonStorage<T>) _pluginJsonStorages[type]).Save();
|
((PluginJsonStorage<T>)_pluginJsonStorages[type]).Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SaveJsonStorage<T>(T settings) where T : new()
|
public void SaveJsonStorage<T>(T settings) where T : new()
|
||||||
|
|
@ -179,25 +191,67 @@ namespace Flow.Launcher
|
||||||
var type = typeof(T);
|
var type = typeof(T);
|
||||||
_pluginJsonStorages[type] = new PluginJsonStorage<T>(settings);
|
_pluginJsonStorages[type] = new PluginJsonStorage<T>(settings);
|
||||||
|
|
||||||
((PluginJsonStorage<T>) _pluginJsonStorages[type]).Save();
|
((PluginJsonStorage<T>)_pluginJsonStorages[type]).Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OpenDirectory(string DirectoryPath, string FileName = null)
|
||||||
|
{
|
||||||
|
using var explorer = new Process();
|
||||||
|
var explorerInfo = _settingsVM.Settings.CustomExplorer;
|
||||||
|
explorer.StartInfo = new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = explorerInfo.Path,
|
||||||
|
Arguments = FileName is null ?
|
||||||
|
explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) :
|
||||||
|
explorerInfo.FileArgument.Replace("%d", DirectoryPath).Replace("%f",
|
||||||
|
Path.IsPathRooted(FileName) ? FileName : Path.Combine(DirectoryPath, FileName))
|
||||||
|
};
|
||||||
|
explorer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OpenUrl(string url, bool? inPrivate = null)
|
||||||
|
{
|
||||||
|
var browserInfo = _settingsVM.Settings.CustomBrowser;
|
||||||
|
|
||||||
|
var path = browserInfo.Path == "*" ? "" : browserInfo.Path;
|
||||||
|
|
||||||
|
if (browserInfo.OpenInTab)
|
||||||
|
{
|
||||||
|
url.OpenInBrowserTab(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
url.OpenInBrowserWindow(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent;
|
public event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent;
|
||||||
|
|
||||||
|
private readonly List<Func<int, int, SpecialKeyState, bool>> _globalKeyboardHandlers = new();
|
||||||
|
|
||||||
|
public void RegisterGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback) => _globalKeyboardHandlers.Add(callback);
|
||||||
|
public void RemoveGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback) => _globalKeyboardHandlers.Remove(callback);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Private Methods
|
#region Private Methods
|
||||||
|
|
||||||
private bool KListener_hookedKeyboardCallback(KeyEvent keyevent, int vkcode, SpecialKeyState state)
|
private bool KListener_hookedKeyboardCallback(KeyEvent keyevent, int vkcode, SpecialKeyState state)
|
||||||
{
|
{
|
||||||
|
var continueHook = true;
|
||||||
if (GlobalKeyboardEvent != null)
|
if (GlobalKeyboardEvent != null)
|
||||||
{
|
{
|
||||||
return GlobalKeyboardEvent((int) keyevent, vkcode, state);
|
continueHook = GlobalKeyboardEvent((int)keyevent, vkcode, state);
|
||||||
|
}
|
||||||
|
foreach (var x in _globalKeyboardHandlers)
|
||||||
|
{
|
||||||
|
continueHook &= x((int)keyevent, vkcode, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return continueHook;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2755
Flow.Launcher/Resources/CustomControlTemplate.xaml
Normal file
2755
Flow.Launcher/Resources/CustomControlTemplate.xaml
Normal file
File diff suppressed because it is too large
Load diff
1628
Flow.Launcher/Resources/Dark.xaml
Normal file
1628
Flow.Launcher/Resources/Dark.xaml
Normal file
File diff suppressed because it is too large
Load diff
1622
Flow.Launcher/Resources/Light.xaml
Normal file
1622
Flow.Launcher/Resources/Light.xaml
Normal file
File diff suppressed because it is too large
Load diff
189
Flow.Launcher/Resources/Pages/WelcomePage1.xaml
Normal file
189
Flow.Launcher/Resources/Pages/WelcomePage1.xaml
Normal file
|
|
@ -0,0 +1,189 @@
|
||||||
|
<ui:Page
|
||||||
|
x:Class="Flow.Launcher.Resources.Pages.WelcomePage1"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:Flow.Launcher.Resources.Pages"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:ui="http://schemas.modernwpf.com/2019"
|
||||||
|
Title="WelcomePage1"
|
||||||
|
DataContext="{Binding RelativeSource={RelativeSource Self}}"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<Page.Resources>
|
||||||
|
<Style x:Key="StyleImageFadeIn" TargetType="{x:Type Image}">
|
||||||
|
<Style.Triggers>
|
||||||
|
<!-- Fades-in the image when it becomes visible -->
|
||||||
|
<Trigger Property="IsVisible" Value="True">
|
||||||
|
<Trigger.EnterActions>
|
||||||
|
<BeginStoryboard>
|
||||||
|
<BeginStoryboard.Storyboard>
|
||||||
|
<Storyboard x:Name="FadeIn">
|
||||||
|
<DoubleAnimation
|
||||||
|
Storyboard.TargetProperty="(Canvas.Top)"
|
||||||
|
From="105"
|
||||||
|
To="95"
|
||||||
|
Duration="0:0:1">
|
||||||
|
<DoubleAnimation.EasingFunction>
|
||||||
|
<QuadraticEase EasingMode="EaseOut" />
|
||||||
|
</DoubleAnimation.EasingFunction>
|
||||||
|
</DoubleAnimation>
|
||||||
|
<DoubleAnimation
|
||||||
|
Storyboard.TargetProperty="Opacity"
|
||||||
|
From="0"
|
||||||
|
To="1"
|
||||||
|
Duration="0:0:1">
|
||||||
|
<DoubleAnimation.EasingFunction>
|
||||||
|
<QuadraticEase EasingMode="EaseOut" />
|
||||||
|
</DoubleAnimation.EasingFunction>
|
||||||
|
</DoubleAnimation>
|
||||||
|
</Storyboard>
|
||||||
|
</BeginStoryboard.Storyboard>
|
||||||
|
</BeginStoryboard>
|
||||||
|
</Trigger.EnterActions>
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="StyleImageFadeInText" TargetType="{x:Type TextBlock}">
|
||||||
|
<Style.Triggers>
|
||||||
|
<Trigger Property="IsVisible" Value="True">
|
||||||
|
<Trigger.EnterActions>
|
||||||
|
<BeginStoryboard>
|
||||||
|
<BeginStoryboard.Storyboard>
|
||||||
|
<Storyboard x:Name="FadeIn">
|
||||||
|
<DoubleAnimation
|
||||||
|
Storyboard.TargetProperty="(Canvas.Top)"
|
||||||
|
From="110"
|
||||||
|
To="100"
|
||||||
|
Duration="0:0:1">
|
||||||
|
<DoubleAnimation.EasingFunction>
|
||||||
|
<QuadraticEase EasingMode="EaseOut" />
|
||||||
|
</DoubleAnimation.EasingFunction>
|
||||||
|
</DoubleAnimation>
|
||||||
|
<DoubleAnimation
|
||||||
|
Storyboard.TargetProperty="Opacity"
|
||||||
|
From="0"
|
||||||
|
To="1"
|
||||||
|
Duration="0:0:1">
|
||||||
|
<DoubleAnimation.EasingFunction>
|
||||||
|
<QuadraticEase EasingMode="EaseOut" />
|
||||||
|
</DoubleAnimation.EasingFunction>
|
||||||
|
</DoubleAnimation>
|
||||||
|
</Storyboard>
|
||||||
|
</BeginStoryboard.Storyboard>
|
||||||
|
</BeginStoryboard>
|
||||||
|
</Trigger.EnterActions>
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="WizardMove" TargetType="{x:Type Image}">
|
||||||
|
<Style.Triggers>
|
||||||
|
<Trigger Property="IsVisible" Value="True">
|
||||||
|
<Trigger.EnterActions>
|
||||||
|
<BeginStoryboard>
|
||||||
|
<BeginStoryboard.Storyboard>
|
||||||
|
<Storyboard x:Name="Move">
|
||||||
|
<DoubleAnimation
|
||||||
|
Storyboard.TargetProperty="(Canvas.Bottom)"
|
||||||
|
From="-150"
|
||||||
|
To="0"
|
||||||
|
Duration="0:0:2.5">
|
||||||
|
<DoubleAnimation.EasingFunction>
|
||||||
|
<QuadraticEase EasingMode="EaseOut" />
|
||||||
|
</DoubleAnimation.EasingFunction>
|
||||||
|
</DoubleAnimation>
|
||||||
|
</Storyboard>
|
||||||
|
</BeginStoryboard.Storyboard>
|
||||||
|
</BeginStoryboard>
|
||||||
|
</Trigger.EnterActions>
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Page.Resources>
|
||||||
|
<ScrollViewer>
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="250" />
|
||||||
|
<RowDefinition />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<Border Grid.Row="0" HorizontalAlignment="Stretch">
|
||||||
|
<Border.Background>
|
||||||
|
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
|
||||||
|
<LinearGradientBrush.GradientStops>
|
||||||
|
<GradientStop Offset="0.0" Color="#1494df" />
|
||||||
|
<GradientStop Offset="1.0" Color="#1073bd" />
|
||||||
|
</LinearGradientBrush.GradientStops>
|
||||||
|
</LinearGradientBrush>
|
||||||
|
</Border.Background>
|
||||||
|
|
||||||
|
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
|
||||||
|
<Canvas Width="550" Height="250">
|
||||||
|
<Image
|
||||||
|
Name="Logo"
|
||||||
|
Canvas.Left="140"
|
||||||
|
Width="60"
|
||||||
|
Height="60"
|
||||||
|
Source="../../images/app.png"
|
||||||
|
Style="{DynamicResource StyleImageFadeIn}" />
|
||||||
|
<TextBlock
|
||||||
|
Canvas.Left="205"
|
||||||
|
Margin="12,0,0,0"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="30"
|
||||||
|
Foreground="White"
|
||||||
|
Opacity="0"
|
||||||
|
Style="{DynamicResource StyleImageFadeInText}">
|
||||||
|
Flow Launcher
|
||||||
|
</TextBlock>
|
||||||
|
</Canvas>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
|
||||||
|
<Canvas Grid.Row="1" Height="288">
|
||||||
|
<Image
|
||||||
|
Name="wizard"
|
||||||
|
Canvas.Right="30"
|
||||||
|
Canvas.Bottom="0"
|
||||||
|
Width="60"
|
||||||
|
Height="60"
|
||||||
|
Source="../../images/wizard.png"
|
||||||
|
Style="{DynamicResource WizardMove}" />
|
||||||
|
|
||||||
|
|
||||||
|
<StackPanel Width="550" Margin="24,20,24,20">
|
||||||
|
<StackPanel Margin="0,0,24,0">
|
||||||
|
<TextBlock
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource Welcome_Page1_Title}" />
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,10,24,0"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource Welcome_Page1_Text01}"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,10,24,0"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource Welcome_Page1_Text02}"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,30,0,0"
|
||||||
|
FontSize="14"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource language}" />
|
||||||
|
<ComboBox
|
||||||
|
Width="200"
|
||||||
|
Margin="0,10,0,0"
|
||||||
|
DisplayMemberPath="Display"
|
||||||
|
ItemsSource="{Binding Languages}"
|
||||||
|
SelectedValue="{Binding CustomLanguage, Mode=TwoWay}"
|
||||||
|
SelectedValuePath="LanguageCode" />
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
</Canvas>
|
||||||
|
</Grid>
|
||||||
|
</ScrollViewer>
|
||||||
|
</ui:Page>
|
||||||
40
Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs
Normal file
40
Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
|
using Flow.Launcher.Core.Resource;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Resources.Pages
|
||||||
|
{
|
||||||
|
public partial class WelcomePage1
|
||||||
|
{
|
||||||
|
protected override void OnNavigatedTo(NavigationEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.ExtraData is Settings settings)
|
||||||
|
Settings = settings;
|
||||||
|
else
|
||||||
|
throw new ArgumentException("Unexpected Navigation Parameter for Settings");
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
private Internationalization _translater => InternationalizationManager.Instance;
|
||||||
|
public List<Language> Languages => _translater.LoadAvailableLanguages();
|
||||||
|
|
||||||
|
public Settings Settings { get; set; }
|
||||||
|
|
||||||
|
public string CustomLanguage
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Settings.Language;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
InternationalizationManager.Instance.ChangeLanguage(value);
|
||||||
|
|
||||||
|
if (InternationalizationManager.Instance.PromptShouldUsePinyin(value))
|
||||||
|
Settings.ShouldUsePinyin = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
124
Flow.Launcher/Resources/Pages/WelcomePage2.xaml
Normal file
124
Flow.Launcher/Resources/Pages/WelcomePage2.xaml
Normal file
|
|
@ -0,0 +1,124 @@
|
||||||
|
<ui:Page
|
||||||
|
x:Class="Flow.Launcher.Resources.Pages.WelcomePage2"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:converters="clr-namespace:Flow.Launcher.Converters"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:flowlauncher="clr-namespace:Flow.Launcher"
|
||||||
|
xmlns:local="clr-namespace:Flow.Launcher.Resources.Pages"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:ui="http://schemas.modernwpf.com/2019"
|
||||||
|
Title="WelcomePage2"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<Page.Resources>
|
||||||
|
<converters:BorderClipConverter x:Key="BorderClipConverter" />
|
||||||
|
<Style x:Key="StyleImageFadeIn" TargetType="{x:Type Image}">
|
||||||
|
<Setter Property="Opacity" Value="0" />
|
||||||
|
<Style.Triggers>
|
||||||
|
<!-- Fades-in the image when it becomes visible -->
|
||||||
|
<Trigger Property="IsVisible" Value="True">
|
||||||
|
<Trigger.EnterActions>
|
||||||
|
<BeginStoryboard>
|
||||||
|
<BeginStoryboard.Storyboard>
|
||||||
|
<Storyboard x:Name="FadeIn">
|
||||||
|
<DoubleAnimation
|
||||||
|
Storyboard.TargetProperty="Opacity"
|
||||||
|
To="1"
|
||||||
|
Duration="0:0:2" />
|
||||||
|
</Storyboard>
|
||||||
|
</BeginStoryboard.Storyboard>
|
||||||
|
</BeginStoryboard>
|
||||||
|
</Trigger.EnterActions>
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Page.Resources>
|
||||||
|
<ScrollViewer>
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="250" />
|
||||||
|
<RowDefinition />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<Border Grid.Row="0" HorizontalAlignment="Stretch">
|
||||||
|
<Border.Background>
|
||||||
|
<LinearGradientBrush StartPoint="1 0" EndPoint="0 1">
|
||||||
|
<LinearGradientBrush.GradientStops>
|
||||||
|
<GradientStop Offset="0.0" Color="#6e34a4" />
|
||||||
|
<GradientStop Offset="1.0" Color="#ab58f8" />
|
||||||
|
</LinearGradientBrush.GradientStops>
|
||||||
|
</LinearGradientBrush>
|
||||||
|
</Border.Background>
|
||||||
|
|
||||||
|
<StackPanel
|
||||||
|
Grid.Row="1"
|
||||||
|
Margin="0"
|
||||||
|
Background="{Binding PreviewBackground}">
|
||||||
|
<StackPanel
|
||||||
|
Margin="0,80,0,0"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Border Width="450" Style="{DynamicResource WindowBorderStyle}">
|
||||||
|
<Border Style="{DynamicResource WindowRadius}">
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="54" />
|
||||||
|
<RowDefinition />
|
||||||
|
<RowDefinition />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Border Grid.Row="0">
|
||||||
|
<TextBox
|
||||||
|
IsReadOnly="True"
|
||||||
|
Style="{DynamicResource QueryBoxStyle}"
|
||||||
|
Text="{DynamicResource hiThere}" />
|
||||||
|
|
||||||
|
</Border>
|
||||||
|
<Canvas Style="{DynamicResource SearchIconPosition}">
|
||||||
|
<Path
|
||||||
|
Margin="0"
|
||||||
|
Data="{DynamicResource SearchIconImg}"
|
||||||
|
Stretch="Fill"
|
||||||
|
Style="{DynamicResource SearchIconStyle}" />
|
||||||
|
</Canvas>
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="1" Margin="24,20,24,20">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource Welcome_Page2_Title}" />
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,10,0,0"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource Welcome_Page2_Text01}"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,10,0,0"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource Welcome_Page2_Text02}"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,30,0,0"
|
||||||
|
FontSize="14"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource flowlauncherHotkey}" />
|
||||||
|
<flowlauncher:HotkeyControl
|
||||||
|
x:Name="HotkeyControl"
|
||||||
|
Width="300"
|
||||||
|
Height="35"
|
||||||
|
Margin="-206,10,0,0"
|
||||||
|
GotFocus="HotkeyControl_OnGotFocus"
|
||||||
|
LostFocus="HotkeyControl_OnLostFocus"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
</ScrollViewer>
|
||||||
|
</ui:Page>
|
||||||
52
Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs
Normal file
52
Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
using Flow.Launcher.Helper;
|
||||||
|
using Flow.Launcher.Infrastructure.Hotkey;
|
||||||
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
|
using System;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Resources.Pages
|
||||||
|
{
|
||||||
|
public partial class WelcomePage2
|
||||||
|
{
|
||||||
|
private Settings Settings { get; set; }
|
||||||
|
|
||||||
|
private Brush tbMsgForegroundColorOriginal;
|
||||||
|
|
||||||
|
private string tbMsgTextOriginal;
|
||||||
|
|
||||||
|
protected override void OnNavigatedTo(NavigationEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.ExtraData is Settings settings)
|
||||||
|
Settings = settings;
|
||||||
|
else
|
||||||
|
throw new ArgumentException("Unexpected Parameter setting.");
|
||||||
|
|
||||||
|
InitializeComponent();
|
||||||
|
tbMsgTextOriginal = HotkeyControl.tbMsg.Text;
|
||||||
|
tbMsgForegroundColorOriginal = HotkeyControl.tbMsg.Foreground;
|
||||||
|
|
||||||
|
HotkeyControl.SetHotkey(new Infrastructure.Hotkey.HotkeyModel(Settings.Hotkey), false);
|
||||||
|
}
|
||||||
|
private void HotkeyControl_OnGotFocus(object sender, RoutedEventArgs args)
|
||||||
|
{
|
||||||
|
HotKeyMapper.RemoveHotkey(Settings.Hotkey);
|
||||||
|
}
|
||||||
|
private void HotkeyControl_OnLostFocus(object sender, RoutedEventArgs args)
|
||||||
|
{
|
||||||
|
if (HotkeyControl.CurrentHotkeyAvailable)
|
||||||
|
{
|
||||||
|
HotKeyMapper.SetHotkey(HotkeyControl.CurrentHotkey, HotKeyMapper.OnToggleHotkey);
|
||||||
|
Settings.Hotkey = HotkeyControl.CurrentHotkey.ToString();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HotKeyMapper.SetHotkey(new HotkeyModel(Settings.Hotkey), HotKeyMapper.OnToggleHotkey);
|
||||||
|
}
|
||||||
|
|
||||||
|
HotkeyControl.tbMsg.Text = tbMsgTextOriginal;
|
||||||
|
HotkeyControl.tbMsg.Foreground = tbMsgForegroundColorOriginal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
307
Flow.Launcher/Resources/Pages/WelcomePage3.xaml
Normal file
307
Flow.Launcher/Resources/Pages/WelcomePage3.xaml
Normal file
|
|
@ -0,0 +1,307 @@
|
||||||
|
<ui:Page
|
||||||
|
x:Class="Flow.Launcher.Resources.Pages.WelcomePage3"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:Flow.Launcher.Resources.Pages"
|
||||||
|
xmlns:ui="http://schemas.modernwpf.com/2019"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
Title="WelcomePage3"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<Page.Resources>
|
||||||
|
<Style x:Key="KbdLine" TargetType="Border">
|
||||||
|
<Setter Property="CornerRadius" Value="8" />
|
||||||
|
<Setter Property="Margin" Value="0,4,0,4" />
|
||||||
|
<Setter Property="Background" Value="{DynamicResource Color01B}" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="Kbd" TargetType="Border">
|
||||||
|
<Setter Property="CornerRadius" Value="4" />
|
||||||
|
<Setter Property="Padding" Value="12,4,12,4" />
|
||||||
|
<Setter Property="Background" Value="{DynamicResource Color00B}" />
|
||||||
|
<Setter Property="BorderBrush" Value="{DynamicResource Color18B}" />
|
||||||
|
<Setter Property="BorderThickness" Value="1,1,1,2" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="KbdText" TargetType="TextBlock">
|
||||||
|
<Setter Property="TextAlignment" Value="Center" />
|
||||||
|
<Setter Property="FontSize" Value="12" />
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource Color05B}" />
|
||||||
|
</Style>
|
||||||
|
</Page.Resources>
|
||||||
|
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="0" />
|
||||||
|
<RowDefinition />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<Border Grid.Row="0" HorizontalAlignment="Stretch">
|
||||||
|
<Border.Background>
|
||||||
|
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
|
||||||
|
<LinearGradientBrush.GradientStops>
|
||||||
|
<GradientStop Offset="0.0" Color="#16af7b" />
|
||||||
|
<GradientStop Offset="1.0" Color="#34c191" />
|
||||||
|
</LinearGradientBrush.GradientStops>
|
||||||
|
</LinearGradientBrush>
|
||||||
|
</Border.Background>
|
||||||
|
|
||||||
|
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
|
||||||
|
<Image
|
||||||
|
Width="300"
|
||||||
|
Height="100"
|
||||||
|
Margin="0,0,0,0"
|
||||||
|
Source="../../images/page_img02.png"
|
||||||
|
Style="{DynamicResource StyleImageFadeIn}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<ScrollViewer
|
||||||
|
Grid.Row="1"
|
||||||
|
HorizontalScrollBarVisibility="Auto"
|
||||||
|
VerticalScrollBarVisibility="Auto">
|
||||||
|
<Grid>
|
||||||
|
<StackPanel Margin="24,20,24,20">
|
||||||
|
<StackPanel Margin="0,0,0,20">
|
||||||
|
<TextBlock
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource Welcome_Page3_Title}" />
|
||||||
|
</StackPanel>
|
||||||
|
<Border Style="{DynamicResource KbdLine}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<StackPanel
|
||||||
|
Width="210"
|
||||||
|
Margin="20,5,4,5"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Border Margin="0,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}">←</TextBlock>
|
||||||
|
</Border>
|
||||||
|
<TextBlock VerticalAlignment="Center">,</TextBlock>
|
||||||
|
<Border Margin="5,0,0,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}">→</TextBlock>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel VerticalAlignment="Center">
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="13"
|
||||||
|
Text="{DynamicResource HotkeyUpDownDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Style="{DynamicResource KbdLine}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<StackPanel
|
||||||
|
Width="210"
|
||||||
|
Margin="20,5,4,5"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Border Margin="0,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}">↑</TextBlock>
|
||||||
|
</Border>
|
||||||
|
<TextBlock VerticalAlignment="Center">,</TextBlock>
|
||||||
|
<Border Margin="5,0,0,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}">↓</TextBlock>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel VerticalAlignment="Center">
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="13"
|
||||||
|
Text="{DynamicResource HotkeyLeftRightDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Style="{DynamicResource KbdLine}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<StackPanel
|
||||||
|
Width="210"
|
||||||
|
Margin="20,5,4,5"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Border Margin="0,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}">Enter</TextBlock>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel VerticalAlignment="Center">
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="13"
|
||||||
|
Text="{DynamicResource HotkeyRunDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Style="{DynamicResource KbdLine}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<StackPanel
|
||||||
|
Width="210"
|
||||||
|
Margin="20,5,4,5"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Border Margin="0,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="ESC" />
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel VerticalAlignment="Center">
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="13"
|
||||||
|
Text="{DynamicResource HotkeyESCDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Style="{DynamicResource KbdLine}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<StackPanel
|
||||||
|
Width="210"
|
||||||
|
Margin="20,5,4,5"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Border Margin="0,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="Shift" />
|
||||||
|
</Border>
|
||||||
|
<TextBlock VerticalAlignment="Center">+</TextBlock>
|
||||||
|
<Border Margin="5,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="ENTER" />
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel VerticalAlignment="Center">
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="13"
|
||||||
|
Text="{DynamicResource HotkeyShiftEnterDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Style="{DynamicResource KbdLine}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<StackPanel
|
||||||
|
Width="210"
|
||||||
|
Margin="20,5,4,5"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Border Margin="0,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="Ctrl" />
|
||||||
|
</Border>
|
||||||
|
<TextBlock VerticalAlignment="Center">+</TextBlock>
|
||||||
|
<Border Margin="5,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="ENTER" />
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel VerticalAlignment="Center">
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="13"
|
||||||
|
Text="{DynamicResource HotkeyCtrlEnterDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Style="{DynamicResource KbdLine}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<StackPanel
|
||||||
|
Width="210"
|
||||||
|
Margin="20,5,4,5"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Border Margin="0,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="Ctrl" />
|
||||||
|
</Border>
|
||||||
|
<TextBlock VerticalAlignment="Center">+</TextBlock>
|
||||||
|
<Border Margin="5,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="Shift" />
|
||||||
|
</Border>
|
||||||
|
<TextBlock VerticalAlignment="Center">+</TextBlock>
|
||||||
|
<Border Margin="5,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="ENTER" />
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel VerticalAlignment="Center">
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="13"
|
||||||
|
Text="{DynamicResource HotkeyCtrlShiftEnterDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Style="{DynamicResource KbdLine}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<StackPanel
|
||||||
|
Width="210"
|
||||||
|
Margin="20,5,4,5"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Border Margin="0,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="Ctrl" />
|
||||||
|
</Border>
|
||||||
|
<TextBlock VerticalAlignment="Center">+</TextBlock>
|
||||||
|
<Border Margin="5,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="H" />
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel VerticalAlignment="Center">
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="13"
|
||||||
|
Text="{DynamicResource HotkeyCtrlHDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Style="{DynamicResource KbdLine}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<StackPanel
|
||||||
|
Width="210"
|
||||||
|
Margin="20,5,4,5"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Border Margin="0,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="Ctrl" />
|
||||||
|
</Border>
|
||||||
|
<TextBlock VerticalAlignment="Center">+</TextBlock>
|
||||||
|
<Border Margin="5,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="I" />
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel VerticalAlignment="Center">
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="13"
|
||||||
|
Text="{DynamicResource HotkeyCtrlIDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<Border Style="{DynamicResource KbdLine}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<StackPanel
|
||||||
|
Width="210"
|
||||||
|
Margin="20,5,4,5"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Border Margin="0,0,5,0" Style="{DynamicResource Kbd}">
|
||||||
|
<TextBlock Style="{DynamicResource KbdText}" Text="F5" />
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel VerticalAlignment="Center">
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="13"
|
||||||
|
Text="{DynamicResource HotkeyF5Desc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
</ScrollViewer>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</ScrollViewer>
|
||||||
|
</ui:Page>
|
||||||
20
Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs
Normal file
20
Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
using System;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Resources.Pages
|
||||||
|
{
|
||||||
|
public partial class WelcomePage3
|
||||||
|
{
|
||||||
|
protected override void OnNavigatedTo(NavigationEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.ExtraData is Settings settings)
|
||||||
|
Settings = settings;
|
||||||
|
else if(Settings is null)
|
||||||
|
throw new ArgumentException("Unexpected Navigation Parameter for Settings");
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Settings Settings { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
136
Flow.Launcher/Resources/Pages/WelcomePage4.xaml
Normal file
136
Flow.Launcher/Resources/Pages/WelcomePage4.xaml
Normal file
|
|
@ -0,0 +1,136 @@
|
||||||
|
<ui:Page
|
||||||
|
x:Class="Flow.Launcher.Resources.Pages.WelcomePage4"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:Flow.Launcher.Resources.Pages"
|
||||||
|
xmlns:ui="http://schemas.modernwpf.com/2019"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
Title="WelcomePage4"
|
||||||
|
d:DesignHeight="450"
|
||||||
|
d:DesignWidth="800"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<Page.Resources>
|
||||||
|
<Style x:Key="StyleImageFadeIn" TargetType="{x:Type Image}">
|
||||||
|
<Style.Triggers>
|
||||||
|
<Trigger Property="IsVisible" Value="True">
|
||||||
|
<Trigger.EnterActions>
|
||||||
|
<BeginStoryboard>
|
||||||
|
<BeginStoryboard.Storyboard>
|
||||||
|
<Storyboard x:Name="Move">
|
||||||
|
<DoubleAnimation
|
||||||
|
Storyboard.TargetProperty="(Canvas.Left)"
|
||||||
|
From="0"
|
||||||
|
To="100"
|
||||||
|
Duration="0:0:20">
|
||||||
|
<DoubleAnimation.EasingFunction>
|
||||||
|
<QuadraticEase EasingMode="EaseOut" />
|
||||||
|
</DoubleAnimation.EasingFunction>
|
||||||
|
</DoubleAnimation>
|
||||||
|
</Storyboard>
|
||||||
|
</BeginStoryboard.Storyboard>
|
||||||
|
</BeginStoryboard>
|
||||||
|
</Trigger.EnterActions>
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="RecommendQuery" TargetType="Border">
|
||||||
|
<Setter Property="CornerRadius" Value="8" />
|
||||||
|
<Setter Property="Padding" Value="20,7,12,7" />
|
||||||
|
<Setter Property="Margin" Value="4,4,4,4" />
|
||||||
|
<Setter Property="Background" Value="{DynamicResource Color01B}" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="QueryText" TargetType="TextBlock">
|
||||||
|
<Setter Property="TextAlignment" Value="Left" />
|
||||||
|
<Setter Property="TextAlignment" Value="Left" />
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource Color05B}" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ResultText" TargetType="TextBlock">
|
||||||
|
<Setter Property="TextAlignment" Value="Left" />
|
||||||
|
<Setter Property="TextAlignment" Value="Left" />
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
<Setter Property="Margin" Value="0,4,0,0" />
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource Color04B}" />
|
||||||
|
</Style>
|
||||||
|
</Page.Resources>
|
||||||
|
<ScrollViewer>
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="250" />
|
||||||
|
<RowDefinition />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<Border Grid.Row="0" HorizontalAlignment="Stretch">
|
||||||
|
<Border.Background>
|
||||||
|
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
|
||||||
|
<LinearGradientBrush.GradientStops>
|
||||||
|
<GradientStop Offset="0.0" Color="#e8457c" />
|
||||||
|
<GradientStop Offset="1.0" Color="#bc1948" />
|
||||||
|
</LinearGradientBrush.GradientStops>
|
||||||
|
</LinearGradientBrush>
|
||||||
|
</Border.Background>
|
||||||
|
|
||||||
|
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
|
||||||
|
<Canvas
|
||||||
|
Width="600"
|
||||||
|
Height="301"
|
||||||
|
ClipToBounds="True">
|
||||||
|
<Image
|
||||||
|
Name="Logo"
|
||||||
|
Canvas.Left="0"
|
||||||
|
Width="450"
|
||||||
|
Height="280"
|
||||||
|
Margin="0,0,0,0"
|
||||||
|
Source="../../images/page_img01.png"
|
||||||
|
Style="{DynamicResource StyleImageFadeIn}" />
|
||||||
|
</Canvas>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="1" Margin="24,20,24,20">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource Welcome_Page4_Title}" />
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,10,0,10"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource Welcome_Page4_Text01}"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
<UniformGrid
|
||||||
|
Margin="0,14,0,0"
|
||||||
|
Columns="2"
|
||||||
|
Rows="2">
|
||||||
|
<Border Style="{DynamicResource RecommendQuery}">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{DynamicResource QueryText}" Text="{DynamicResource RecommendWeather}" />
|
||||||
|
<TextBlock Style="{DynamicResource ResultText}" Text="{DynamicResource RecommendWeatherDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border Style="{DynamicResource RecommendQuery}">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{DynamicResource QueryText}" Text="{DynamicResource RecommendShell}" />
|
||||||
|
<TextBlock Style="{DynamicResource ResultText}" Text="{DynamicResource RecommendShellDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border Style="{DynamicResource RecommendQuery}">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{DynamicResource QueryText}" Text="{DynamicResource RecommendBluetooth}" />
|
||||||
|
<TextBlock Style="{DynamicResource ResultText}" Text="{DynamicResource RecommendBluetoothDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border Style="{DynamicResource RecommendQuery}">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{DynamicResource QueryText}" Text="{DynamicResource RecommendAcronyms}" />
|
||||||
|
<TextBlock Style="{DynamicResource ResultText}" Text="{DynamicResource RecommendAcronymsDesc}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</UniformGrid>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
</ScrollViewer>
|
||||||
|
</ui:Page>
|
||||||
20
Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs
Normal file
20
Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
|
using System;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Resources.Pages
|
||||||
|
{
|
||||||
|
public partial class WelcomePage4
|
||||||
|
{
|
||||||
|
protected override void OnNavigatedTo(NavigationEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.ExtraData is Settings settings)
|
||||||
|
Settings = settings;
|
||||||
|
else
|
||||||
|
throw new ArgumentException("Unexpected Navigation Parameter for Settings");
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Settings Settings { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
122
Flow.Launcher/Resources/Pages/WelcomePage5.xaml
Normal file
122
Flow.Launcher/Resources/Pages/WelcomePage5.xaml
Normal file
|
|
@ -0,0 +1,122 @@
|
||||||
|
<ui:Page
|
||||||
|
x:Class="Flow.Launcher.Resources.Pages.WelcomePage5"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:Flow.Launcher.Resources.Pages"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:ui="http://schemas.modernwpf.com/2019"
|
||||||
|
xmlns:userSettings="clr-namespace:Flow.Launcher.Infrastructure.UserSettings;assembly=Flow.Launcher.Infrastructure"
|
||||||
|
Title="WelcomePage5"
|
||||||
|
d:DesignHeight="450"
|
||||||
|
d:DesignWidth="800"
|
||||||
|
DataContext="{Binding RelativeSource={RelativeSource Self}}"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<Page.Resources>
|
||||||
|
<Style x:Key="StyleImageFadeIn" TargetType="{x:Type Image}">
|
||||||
|
<Setter Property="Opacity" Value="0" />
|
||||||
|
<Style.Triggers>
|
||||||
|
<!-- Fades-in the image when it becomes visible -->
|
||||||
|
<Trigger Property="IsVisible" Value="True">
|
||||||
|
<Trigger.EnterActions>
|
||||||
|
<BeginStoryboard>
|
||||||
|
<BeginStoryboard.Storyboard>
|
||||||
|
<Storyboard x:Name="FadeIn">
|
||||||
|
|
||||||
|
<DoubleAnimation
|
||||||
|
Storyboard.TargetProperty="(Canvas.Top)"
|
||||||
|
From="110"
|
||||||
|
To="75"
|
||||||
|
Duration="0:0:1">
|
||||||
|
<DoubleAnimation.EasingFunction>
|
||||||
|
<QuadraticEase EasingMode="EaseOut" />
|
||||||
|
</DoubleAnimation.EasingFunction>
|
||||||
|
</DoubleAnimation>
|
||||||
|
<DoubleAnimation
|
||||||
|
Storyboard.TargetProperty="Opacity"
|
||||||
|
From="0"
|
||||||
|
To="1"
|
||||||
|
Duration="0:0:1">
|
||||||
|
<DoubleAnimation.EasingFunction>
|
||||||
|
<QuadraticEase EasingMode="EaseOut" />
|
||||||
|
</DoubleAnimation.EasingFunction>
|
||||||
|
</DoubleAnimation>
|
||||||
|
</Storyboard>
|
||||||
|
</BeginStoryboard.Storyboard>
|
||||||
|
</BeginStoryboard>
|
||||||
|
</Trigger.EnterActions>
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Page.Resources>
|
||||||
|
<ScrollViewer>
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="250" />
|
||||||
|
<RowDefinition />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<Border Grid.Row="0" HorizontalAlignment="Stretch">
|
||||||
|
<Border.Background>
|
||||||
|
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
|
||||||
|
<LinearGradientBrush.GradientStops>
|
||||||
|
<GradientStop Offset="0.0" Color="#7b83eb" />
|
||||||
|
<GradientStop Offset="1.0" Color="#555dc0" />
|
||||||
|
</LinearGradientBrush.GradientStops>
|
||||||
|
</LinearGradientBrush>
|
||||||
|
</Border.Background>
|
||||||
|
|
||||||
|
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
|
||||||
|
<Canvas Width="550" Height="250">
|
||||||
|
<Image
|
||||||
|
Name="Logo"
|
||||||
|
Canvas.Left="225"
|
||||||
|
Width="100"
|
||||||
|
Height="100"
|
||||||
|
Source="../../images/app.png"
|
||||||
|
Style="{DynamicResource StyleImageFadeIn}" />
|
||||||
|
</Canvas>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="1" Margin="24,20,24,20">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource Welcome_Page5_Title}" />
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,10,0,0"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource Welcome_Page5_Text01}"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
<StackPanel Margin="0,30,0,0" Orientation="Horizontal">
|
||||||
|
<CheckBox
|
||||||
|
Checked="OnAutoStartupChecked"
|
||||||
|
Content="{DynamicResource startFlowLauncherOnSystemStartup}"
|
||||||
|
IsChecked="{Binding Settings.StartFlowLauncherOnSystemStartup}"
|
||||||
|
Style="{DynamicResource DefaultCheckBoxStyle}"
|
||||||
|
Unchecked="OnAutoStartupUncheck" />
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Margin="0,0,0,0" Orientation="Horizontal">
|
||||||
|
<CheckBox
|
||||||
|
Checked="OnHideOnStartupChecked"
|
||||||
|
Content="{DynamicResource hideOnStartup}"
|
||||||
|
IsChecked="{Binding Settings.HideOnStartup}"
|
||||||
|
Style="{DynamicResource DefaultCheckBoxStyle}"
|
||||||
|
Unchecked="OnHideOnStartupUnchecked" />
|
||||||
|
</StackPanel>
|
||||||
|
<Button
|
||||||
|
Width="150"
|
||||||
|
Height="40"
|
||||||
|
Margin="0,60,0,0"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
Click="BtnCancel_OnClick"
|
||||||
|
Content="{DynamicResource done}"
|
||||||
|
Style="{DynamicResource AccentButtonStyle}" />
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
</ScrollViewer>
|
||||||
|
</ui:Page>
|
||||||
63
Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs
Normal file
63
Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
using System;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
|
using Microsoft.Win32;
|
||||||
|
using Flow.Launcher.Infrastructure;
|
||||||
|
|
||||||
|
namespace Flow.Launcher.Resources.Pages
|
||||||
|
{
|
||||||
|
public partial class WelcomePage5
|
||||||
|
{
|
||||||
|
private const string StartupPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
|
||||||
|
public Settings Settings { get; set; }
|
||||||
|
public bool HideOnStartup { get; set; }
|
||||||
|
|
||||||
|
protected override void OnNavigatedTo(NavigationEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.ExtraData is Settings settings)
|
||||||
|
Settings = settings;
|
||||||
|
else
|
||||||
|
throw new ArgumentException("Unexpected Navigation Parameter for Settings");
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnAutoStartupChecked(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
SetStartup();
|
||||||
|
}
|
||||||
|
private void OnAutoStartupUncheck(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
RemoveStartup();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemoveStartup()
|
||||||
|
{
|
||||||
|
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
|
||||||
|
key?.DeleteValue(Constant.FlowLauncher, false);
|
||||||
|
Settings.StartFlowLauncherOnSystemStartup = false;
|
||||||
|
}
|
||||||
|
private void SetStartup()
|
||||||
|
{
|
||||||
|
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
|
||||||
|
key?.SetValue(Constant.FlowLauncher, Constant.ExecutablePath);
|
||||||
|
Settings.StartFlowLauncherOnSystemStartup = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnHideOnStartupChecked(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Settings.HideOnStartup = true;
|
||||||
|
}
|
||||||
|
private void OnHideOnStartupUnchecked(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Settings.HideOnStartup = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BtnCancel_OnClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
var window = Window.GetWindow(this);
|
||||||
|
window.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Flow.Launcher/Resources/Segoe Fluent Icons.ttf
Normal file
BIN
Flow.Launcher/Resources/Segoe Fluent Icons.ttf
Normal file
Binary file not shown.
BIN
Flow.Launcher/Resources/open.wav
Normal file
BIN
Flow.Launcher/Resources/open.wav
Normal file
Binary file not shown.
|
|
@ -1,25 +1,33 @@
|
||||||
<ListBox x:Class="Flow.Launcher.ResultListBox"
|
<ListBox
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
x:Class="Flow.Launcher.ResultListBox"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:converter="clr-namespace:Flow.Launcher.Converters"
|
||||||
xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:converter="clr-namespace:Flow.Launcher.Converters"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
mc:Ignorable="d" d:DesignWidth="100" d:DesignHeight="100"
|
xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
|
||||||
d:DataContext="{d:DesignInstance vm:ResultsViewModel}"
|
MaxHeight="{Binding MaxHeight}"
|
||||||
MaxHeight="{Binding MaxHeight}"
|
Margin="{Binding Margin}"
|
||||||
SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}"
|
HorizontalContentAlignment="Stretch"
|
||||||
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
|
d:DataContext="{d:DesignInstance vm:ResultsViewModel}"
|
||||||
HorizontalContentAlignment="Stretch" ItemsSource="{Binding Results}"
|
d:DesignHeight="100"
|
||||||
Margin="{Binding Margin}"
|
d:DesignWidth="100"
|
||||||
Visibility="{Binding Visbility}"
|
Focusable="False"
|
||||||
Style="{DynamicResource BaseListboxStyle}" Focusable="False"
|
IsSynchronizedWithCurrentItem="True"
|
||||||
KeyboardNavigation.DirectionalNavigation="Cycle" SelectionMode="Single"
|
ItemsSource="{Binding Results}"
|
||||||
VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Standard"
|
KeyboardNavigation.DirectionalNavigation="Cycle"
|
||||||
SelectionChanged="OnSelectionChanged"
|
PreviewMouseDown="ListBox_PreviewMouseDown"
|
||||||
IsSynchronizedWithCurrentItem="True"
|
SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}"
|
||||||
PreviewMouseDown="ListBox_PreviewMouseDown">
|
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
|
||||||
<!--IsSynchronizedWithCurrentItem: http://stackoverflow.com/a/7833798/2833083-->
|
SelectionChanged="OnSelectionChanged"
|
||||||
|
SelectionMode="Single"
|
||||||
|
Style="{DynamicResource BaseListboxStyle}"
|
||||||
|
VirtualizingStackPanel.IsVirtualizing="True"
|
||||||
|
VirtualizingStackPanel.VirtualizationMode="Standard"
|
||||||
|
Visibility="{Binding Visbility}"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<!-- IsSynchronizedWithCurrentItem: http://stackoverflow.com/a/7833798/2833083 -->
|
||||||
|
|
||||||
<ListBox.ItemTemplate>
|
<ListBox.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<Button>
|
<Button>
|
||||||
|
|
@ -29,41 +37,88 @@
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
</Button.Template>
|
</Button.Template>
|
||||||
<Button.Content>
|
<Button.Content>
|
||||||
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5"
|
<Grid
|
||||||
Cursor="Hand" UseLayoutRounding="False">
|
Margin="0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Stretch"
|
||||||
|
Cursor="Hand"
|
||||||
|
UseLayoutRounding="False">
|
||||||
<Grid.Resources>
|
<Grid.Resources>
|
||||||
<converter:HighlightTextConverter x:Key="HighlightTextConverter"/>
|
<converter:HighlightTextConverter x:Key="HighlightTextConverter" />
|
||||||
<converter:OrdinalConverter x:Key="OrdinalConverter" />
|
<converter:OrdinalConverter x:Key="OrdinalConverter" />
|
||||||
<converter:OpenResultHotkeyVisibilityConverter x:Key="OpenResultHotkeyVisibilityConverter" />
|
<converter:OpenResultHotkeyVisibilityConverter x:Key="OpenResultHotkeyVisibilityConverter" />
|
||||||
</Grid.Resources>
|
</Grid.Resources>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="32" />
|
<ColumnDefinition Width="60" />
|
||||||
<ColumnDefinition />
|
<ColumnDefinition Width="*" />
|
||||||
<ColumnDefinition Width="0" />
|
<ColumnDefinition Width="Auto" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<Image x:Name="ImageIcon" Width="32" Height="32" HorizontalAlignment="Left"
|
<StackPanel
|
||||||
Source="{Binding Image}" />
|
Grid.Column="2"
|
||||||
<Grid Margin="5 0 5 0" Grid.Column="1" HorizontalAlignment="Stretch">
|
Margin="0,0,10,0"
|
||||||
|
Visibility="{Binding ShowOpenResultHotkey}">
|
||||||
|
<TextBlock
|
||||||
|
x:Name="Hotkey"
|
||||||
|
Margin="12,0,12,0"
|
||||||
|
Padding="0,10,0,10"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Opacity="0.8"
|
||||||
|
Style="{DynamicResource ItemHotkeyStyle}">
|
||||||
|
<TextBlock.Visibility>
|
||||||
|
<Binding Converter="{StaticResource ResourceKey=OpenResultHotkeyVisibilityConverter}" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}" />
|
||||||
|
</TextBlock.Visibility>
|
||||||
|
<TextBlock.Text>
|
||||||
|
<MultiBinding StringFormat="{}{0}+{1}">
|
||||||
|
<Binding Path="OpenResultModifiers" />
|
||||||
|
<Binding Converter="{StaticResource ResourceKey=OrdinalConverter}" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}" />
|
||||||
|
</MultiBinding>
|
||||||
|
</TextBlock.Text>
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
<Border
|
||||||
|
Margin="9,0,0,0"
|
||||||
|
BorderBrush="Transparent"
|
||||||
|
BorderThickness="0">
|
||||||
|
<Image
|
||||||
|
x:Name="ImageIcon"
|
||||||
|
Width="32"
|
||||||
|
Height="32"
|
||||||
|
Margin="0,0,0,0"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
Source="{Binding Image}"
|
||||||
|
Stretch="Uniform"
|
||||||
|
Visibility="{Binding ShowIcon}" />
|
||||||
|
</Border>
|
||||||
|
<Border
|
||||||
|
Margin="9,0,0,0"
|
||||||
|
BorderBrush="Transparent"
|
||||||
|
BorderThickness="0">
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="0"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontFamily="{Binding Glyph.FontFamily}"
|
||||||
|
Style="{DynamicResource ItemGlyph}"
|
||||||
|
Text="{Binding Glyph.Glyph}"
|
||||||
|
Visibility="{Binding ShowGlyph}" />
|
||||||
|
</Border>
|
||||||
|
<Grid
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="6,0,10,0"
|
||||||
|
HorizontalAlignment="Stretch">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition />
|
<RowDefinition />
|
||||||
<RowDefinition Height="Auto" x:Name="SubTitleRowDefinition" />
|
<RowDefinition x:Name="SubTitleRowDefinition" Height="Auto" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<StackPanel Visibility="{Binding ShowOpenResultHotkey}">
|
|
||||||
<TextBlock Margin="0 5 5 0" Style="{DynamicResource ItemSubTitleStyle}" HorizontalAlignment="Right" Opacity="0.8" >
|
<TextBlock
|
||||||
<TextBlock.Visibility>
|
x:Name="Title"
|
||||||
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}" Converter="{StaticResource ResourceKey=OpenResultHotkeyVisibilityConverter}" />
|
VerticalAlignment="Center"
|
||||||
</TextBlock.Visibility>
|
DockPanel.Dock="Left"
|
||||||
<TextBlock.Text>
|
Style="{DynamicResource ItemTitleStyle}"
|
||||||
<MultiBinding StringFormat="{}{0}+{1}">
|
Text="{Binding Result.Title}"
|
||||||
<Binding Path="OpenResultModifiers" />
|
ToolTip="{Binding ShowTitleToolTip}">
|
||||||
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}" Converter="{StaticResource ResourceKey=OrdinalConverter}" />
|
|
||||||
</MultiBinding>
|
|
||||||
</TextBlock.Text>
|
|
||||||
</TextBlock>
|
|
||||||
</StackPanel>
|
|
||||||
<TextBlock Style="{DynamicResource ItemTitleStyle}" DockPanel.Dock="Left"
|
|
||||||
VerticalAlignment="Center" ToolTip="{Binding ShowTitleToolTip}" x:Name="Title"
|
|
||||||
Text="{Binding Result.Title}">
|
|
||||||
<vm:ResultsViewModel.FormattedText>
|
<vm:ResultsViewModel.FormattedText>
|
||||||
<MultiBinding Converter="{StaticResource HighlightTextConverter}">
|
<MultiBinding Converter="{StaticResource HighlightTextConverter}">
|
||||||
<Binding Path="Result.Title" />
|
<Binding Path="Result.Title" />
|
||||||
|
|
@ -71,8 +126,13 @@
|
||||||
</MultiBinding>
|
</MultiBinding>
|
||||||
</vm:ResultsViewModel.FormattedText>
|
</vm:ResultsViewModel.FormattedText>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
<TextBlock Style="{DynamicResource ItemSubTitleStyle}" ToolTip="{Binding ShowSubTitleToolTip}"
|
<TextBlock
|
||||||
Grid.Row="1" x:Name="SubTitle" Text="{Binding Result.SubTitle}" MinWidth="750">
|
x:Name="SubTitle"
|
||||||
|
Grid.Row="1"
|
||||||
|
MinWidth="750"
|
||||||
|
Style="{DynamicResource ItemSubTitleStyle}"
|
||||||
|
Text="{Binding Result.SubTitle}"
|
||||||
|
ToolTip="{Binding ShowSubTitleToolTip}">
|
||||||
<vm:ResultsViewModel.FormattedText>
|
<vm:ResultsViewModel.FormattedText>
|
||||||
<MultiBinding Converter="{StaticResource HighlightTextConverter}">
|
<MultiBinding Converter="{StaticResource HighlightTextConverter}">
|
||||||
<Binding Path="Result.SubTitle" />
|
<Binding Path="Result.SubTitle" />
|
||||||
|
|
@ -80,51 +140,52 @@
|
||||||
</MultiBinding>
|
</MultiBinding>
|
||||||
</vm:ResultsViewModel.FormattedText>
|
</vm:ResultsViewModel.FormattedText>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</Button.Content>
|
</Button.Content>
|
||||||
</Button>
|
</Button>
|
||||||
<!-- a result item height is 50 including margin -->
|
<!-- a result item height is 52 including margin -->
|
||||||
<DataTemplate.Triggers>
|
<DataTemplate.Triggers>
|
||||||
<DataTrigger
|
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True">
|
||||||
Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}}, Path=IsSelected}"
|
|
||||||
Value="True">
|
|
||||||
<Setter TargetName="Title" Property="Style" Value="{DynamicResource ItemTitleSelectedStyle}" />
|
<Setter TargetName="Title" Property="Style" Value="{DynamicResource ItemTitleSelectedStyle}" />
|
||||||
<Setter TargetName="SubTitle" Property="Style" Value="{DynamicResource ItemSubTitleSelectedStyle}" />
|
<Setter TargetName="SubTitle" Property="Style" Value="{DynamicResource ItemSubTitleSelectedStyle}" />
|
||||||
|
<Setter TargetName="Hotkey" Property="Style" Value="{DynamicResource ItemHotkeySelectedStyle}" />
|
||||||
<Setter TargetName="ImageIcon" Property="Style" Value="{DynamicResource ItemImageSelectedStyle}" />
|
<Setter TargetName="ImageIcon" Property="Style" Value="{DynamicResource ItemImageSelectedStyle}" />
|
||||||
</DataTrigger>
|
</DataTrigger>
|
||||||
</DataTemplate.Triggers>
|
</DataTemplate.Triggers>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ListBox.ItemTemplate>
|
</ListBox.ItemTemplate>
|
||||||
<!--http://stackoverflow.com/questions/16819577/setting-background-color-or-wpf-4-0-listbox-windows-8/#16820062-->
|
<!-- http://stackoverflow.com/questions/16819577/setting-background-color-or-wpf-4-0-listbox-windows-8/#16820062 -->
|
||||||
<ListBox.ItemContainerStyle>
|
<ListBox.ItemContainerStyle>
|
||||||
<Style TargetType="{x:Type ListBoxItem}">
|
<Style TargetType="{x:Type ListBoxItem}">
|
||||||
<EventSetter Event="MouseEnter" Handler="OnMouseEnter" />
|
<EventSetter Event="MouseEnter" Handler="OnMouseEnter" />
|
||||||
<EventSetter Event="MouseMove" Handler="OnMouseMove" />
|
<EventSetter Event="MouseMove" Handler="OnMouseMove" />
|
||||||
<Setter Property="Height" Value="50" />
|
<Setter Property="Height" Value="52" />
|
||||||
<Setter Property="Margin" Value="0" />
|
<Setter Property="Margin" Value="0" />
|
||||||
<Setter Property="Padding" Value="0" />
|
<Setter Property="Padding" Value="0" />
|
||||||
<Setter Property="BorderThickness" Value="0" />
|
<Setter Property="BorderThickness" Value="0" />
|
||||||
<Setter Property="Template">
|
<Setter Property="Template">
|
||||||
<Setter.Value>
|
<Setter.Value>
|
||||||
<ControlTemplate TargetType="{x:Type ListBoxItem}">
|
<ControlTemplate TargetType="{x:Type ListBoxItem}">
|
||||||
<Border x:Name="Bd"
|
<Border
|
||||||
Background="{TemplateBinding Background}"
|
x:Name="Bd"
|
||||||
BorderBrush="{TemplateBinding BorderBrush}"
|
Background="{TemplateBinding Background}"
|
||||||
SnapsToDevicePixels="True">
|
BorderBrush="{TemplateBinding BorderBrush}"
|
||||||
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
|
SnapsToDevicePixels="True">
|
||||||
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
<ContentPresenter
|
||||||
Content="{TemplateBinding Content}"
|
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
|
||||||
ContentStringFormat="{TemplateBinding ContentStringFormat}"
|
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||||
ContentTemplate="{TemplateBinding ContentTemplate}"
|
Content="{TemplateBinding Content}"
|
||||||
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
|
ContentStringFormat="{TemplateBinding ContentStringFormat}"
|
||||||
|
ContentTemplate="{TemplateBinding ContentTemplate}"
|
||||||
|
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
|
||||||
</Border>
|
</Border>
|
||||||
<ControlTemplate.Triggers>
|
<ControlTemplate.Triggers>
|
||||||
<Trigger Property="IsSelected" Value="True">
|
<Trigger Property="IsSelected" Value="True">
|
||||||
<Setter TargetName="Bd" Property="Background"
|
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource ItemSelectedBackgroundColor}" />
|
||||||
Value="{DynamicResource ItemSelectedBackgroundColor}" />
|
<Setter TargetName="Bd" Property="BorderBrush" Value="{DynamicResource ItemSelectedBackgroundColor}" />
|
||||||
<Setter TargetName="Bd" Property="BorderBrush"
|
|
||||||
Value="{DynamicResource ItemSelectedBackgroundColor}" />
|
|
||||||
</Trigger>
|
</Trigger>
|
||||||
</ControlTemplate.Triggers>
|
</ControlTemplate.Triggers>
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
|
|
|
||||||
264
Flow.Launcher/SelectBrowserWindow.xaml
Normal file
264
Flow.Launcher/SelectBrowserWindow.xaml
Normal file
|
|
@ -0,0 +1,264 @@
|
||||||
|
<Window
|
||||||
|
x:Class="Flow.Launcher.SelectBrowserWindow"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:Flow.Launcher"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:ui="http://schemas.modernwpf.com/2019"
|
||||||
|
Title="{DynamicResource defaultBrowserTitle}"
|
||||||
|
Width="550"
|
||||||
|
Background="{DynamicResource PopuBGColor}"
|
||||||
|
DataContext="{Binding RelativeSource={RelativeSource Self}}"
|
||||||
|
Foreground="{DynamicResource PopupTextColor}"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
SizeToContent="Height"
|
||||||
|
WindowStartupLocation="CenterScreen"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<WindowChrome.WindowChrome>
|
||||||
|
<WindowChrome CaptionHeight="32" ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" />
|
||||||
|
</WindowChrome.WindowChrome>
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition />
|
||||||
|
<RowDefinition Height="80" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="0">
|
||||||
|
<StackPanel>
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Button
|
||||||
|
Grid.Column="4"
|
||||||
|
Click="btnCancel_Click"
|
||||||
|
Style="{StaticResource TitleBarCloseButtonStyle}">
|
||||||
|
<Path
|
||||||
|
Width="46"
|
||||||
|
Height="32"
|
||||||
|
Data="M 18,11 27,20 M 18,20 27,11"
|
||||||
|
Stroke="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
|
||||||
|
StrokeThickness="1">
|
||||||
|
<Path.Style>
|
||||||
|
<Style TargetType="Path">
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding Path=IsActive, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Value="False">
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Path.Style>
|
||||||
|
</Path>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Margin="26,12,26,0">
|
||||||
|
<StackPanel Margin="0,0,0,12">
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="0,0,0,0"
|
||||||
|
FontFamily="Segoe UI"
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource defaultBrowserTitle}"
|
||||||
|
TextAlignment="Left" />
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource defaultBrowser_tips}"
|
||||||
|
TextAlignment="Left"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
|
||||||
|
<StackPanel Margin="14,28,0,0" Orientation="Horizontal">
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="1"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource defaultBrowser_name}" />
|
||||||
|
<ComboBox
|
||||||
|
Name="comboBox"
|
||||||
|
Width="200"
|
||||||
|
Height="35"
|
||||||
|
Margin="14,0,0,0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
ItemsSource="{Binding CustomBrowsers}"
|
||||||
|
SelectedIndex="{Binding SelectedCustomBrowserIndex}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock Text="{Binding Name}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
<Button
|
||||||
|
Margin="10,0,0,0"
|
||||||
|
Click="btnAdd_Click"
|
||||||
|
Content="{DynamicResource add}" />
|
||||||
|
<Button
|
||||||
|
Margin="10,0,0,0"
|
||||||
|
Click="btnDelete_Click"
|
||||||
|
Content="{DynamicResource delete}"
|
||||||
|
IsEnabled="{Binding CustomBrowser.Editable}" />
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
<Rectangle
|
||||||
|
Height="1"
|
||||||
|
Margin="0,20,0,12"
|
||||||
|
Fill="{DynamicResource SeparatorForeground}" />
|
||||||
|
<StackPanel
|
||||||
|
Margin="0,0,0,0"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
DataContext="{Binding CustomBrowser}"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Grid Width="480">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="150" />
|
||||||
|
<ColumnDefinition />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition />
|
||||||
|
<RowDefinition />
|
||||||
|
<RowDefinition />
|
||||||
|
<RowDefinition />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="14,5,0,0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource defaultBrowser_profile_name}" />
|
||||||
|
<TextBox
|
||||||
|
x:Name="ProfileTextBox"
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="Auto"
|
||||||
|
Margin="10,5,15,0"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
IsEnabled="{Binding Editable}"
|
||||||
|
Text="{Binding Name}" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="14,10,0,0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource defaultBrowser_path}" />
|
||||||
|
<StackPanel
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="1"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<TextBox
|
||||||
|
x:Name="PathTextBox"
|
||||||
|
Width="220"
|
||||||
|
Margin="10,10,5,0"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
IsEnabled="{Binding Editable}"
|
||||||
|
Text="{Binding Path}" />
|
||||||
|
<Button
|
||||||
|
Name="btnBrowseFile"
|
||||||
|
Width="80"
|
||||||
|
Margin="0,10,0,0"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Click="btnBrowseFile_Click"
|
||||||
|
Content="{DynamicResource selectPythonDirectory}"
|
||||||
|
DockPanel.Dock="Right">
|
||||||
|
<Button.Style>
|
||||||
|
<Style BasedOn="{StaticResource DefaultButtonStyle}" TargetType="{x:Type Button}">
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding ElementName=PathTextBox, UpdateSourceTrigger=PropertyChanged, Path=IsEnabled}" Value="False">
|
||||||
|
<Setter Property="IsEnabled" Value="False" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Button.Style>
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel
|
||||||
|
Grid.Row="2"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="14,10,14,0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<RadioButton IsChecked="{Binding OpenInTab}">New Tab</RadioButton>
|
||||||
|
<RadioButton IsChecked="{Binding OpenInNewWindow, Mode=OneTime}">New Window</RadioButton>
|
||||||
|
</StackPanel>
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="3"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="14,10,0,20"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource defaultBrowser_parameter}" />
|
||||||
|
<StackPanel
|
||||||
|
Grid.Row="3"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="0,10,0,15"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<TextBox
|
||||||
|
x:Name="fileArgTextBox"
|
||||||
|
Width="180"
|
||||||
|
Margin="10,0,0,0"
|
||||||
|
Text="{Binding PrivateArg}" />
|
||||||
|
<CheckBox
|
||||||
|
Margin="12,0,0,0"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
IsChecked="{Binding EnablePrivate}">
|
||||||
|
<CheckBox.Style>
|
||||||
|
<Style BasedOn="{StaticResource DefaultCheckBoxStyle}" TargetType="{x:Type CheckBox}">
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding Text.Length, ElementName=fileArgTextBox, UpdateSourceTrigger=PropertyChanged}" Value="0">
|
||||||
|
<Setter Property="IsEnabled" Value="False" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</CheckBox.Style>
|
||||||
|
</CheckBox>
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
<Border
|
||||||
|
Grid.Row="1"
|
||||||
|
Background="{DynamicResource PopupButtonAreaBGColor}"
|
||||||
|
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
|
||||||
|
BorderThickness="0,1,0,0">
|
||||||
|
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
|
||||||
|
<Button
|
||||||
|
x:Name="btnCancel"
|
||||||
|
Width="145"
|
||||||
|
Margin="0,0,5,0"
|
||||||
|
Click="btnCancel_Click"
|
||||||
|
Content="{DynamicResource cancel}" />
|
||||||
|
<Button
|
||||||
|
x:Name="btnDone"
|
||||||
|
Width="145"
|
||||||
|
Margin="5,0,0,0"
|
||||||
|
Click="btnDone_Click"
|
||||||
|
Content="{DynamicResource done}"
|
||||||
|
ForceCursor="True"
|
||||||
|
Style="{DynamicResource AccentButtonStyle}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
</Window>
|
||||||
88
Flow.Launcher/SelectBrowserWindow.xaml.cs
Normal file
88
Flow.Launcher/SelectBrowserWindow.xaml.cs
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
|
using Flow.Launcher.ViewModel;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
|
||||||
|
namespace Flow.Launcher
|
||||||
|
{
|
||||||
|
public partial class SelectBrowserWindow : Window, INotifyPropertyChanged
|
||||||
|
{
|
||||||
|
private int selectedCustomBrowserIndex;
|
||||||
|
|
||||||
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
|
|
||||||
|
public Settings Settings { get; }
|
||||||
|
|
||||||
|
public int SelectedCustomBrowserIndex
|
||||||
|
{
|
||||||
|
get => selectedCustomBrowserIndex; set
|
||||||
|
{
|
||||||
|
selectedCustomBrowserIndex = value;
|
||||||
|
PropertyChanged?.Invoke(this, new(nameof(CustomBrowser)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public ObservableCollection<CustomBrowserViewModel> CustomBrowsers { get; set; }
|
||||||
|
|
||||||
|
public CustomBrowserViewModel CustomBrowser => CustomBrowsers[SelectedCustomBrowserIndex];
|
||||||
|
public SelectBrowserWindow(Settings settings)
|
||||||
|
{
|
||||||
|
Settings = settings;
|
||||||
|
CustomBrowsers = new ObservableCollection<CustomBrowserViewModel>(Settings.CustomBrowserList.Select(x => x.Copy()));
|
||||||
|
SelectedCustomBrowserIndex = Settings.CustomBrowserIndex;
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnDone_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Settings.CustomBrowserList = CustomBrowsers.ToList();
|
||||||
|
Settings.CustomBrowserIndex = SelectedCustomBrowserIndex;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnAdd_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
CustomBrowsers.Add(new()
|
||||||
|
{
|
||||||
|
Name = "New Profile"
|
||||||
|
});
|
||||||
|
SelectedCustomBrowserIndex = CustomBrowsers.Count - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnDelete_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
CustomBrowsers.RemoveAt(SelectedCustomBrowserIndex--);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnBrowseFile_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
|
||||||
|
Nullable<bool> result = dlg.ShowDialog();
|
||||||
|
|
||||||
|
if (result == true)
|
||||||
|
{
|
||||||
|
TextBox path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
|
||||||
|
path.Text = dlg.FileName;
|
||||||
|
path.Focus();
|
||||||
|
((Button)sender).Focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
275
Flow.Launcher/SelectFileManagerWindow.xaml
Normal file
275
Flow.Launcher/SelectFileManagerWindow.xaml
Normal file
|
|
@ -0,0 +1,275 @@
|
||||||
|
<Window
|
||||||
|
x:Class="Flow.Launcher.SelectFileManagerWindow"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:Flow.Launcher"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:ui="http://schemas.modernwpf.com/2019"
|
||||||
|
Title="{DynamicResource fileManagerWindow}"
|
||||||
|
Width="600"
|
||||||
|
Background="{DynamicResource PopuBGColor}"
|
||||||
|
DataContext="{Binding RelativeSource={RelativeSource Self}}"
|
||||||
|
Foreground="{DynamicResource PopupTextColor}"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
SizeToContent="Height"
|
||||||
|
WindowStartupLocation="CenterScreen"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<WindowChrome.WindowChrome>
|
||||||
|
<WindowChrome CaptionHeight="32" ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" />
|
||||||
|
</WindowChrome.WindowChrome>
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition />
|
||||||
|
<RowDefinition Height="80" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid>
|
||||||
|
<StackPanel>
|
||||||
|
<StackPanel>
|
||||||
|
<Grid Grid.Row="0">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Button
|
||||||
|
Grid.Column="4"
|
||||||
|
Click="btnCancel_Click"
|
||||||
|
Style="{StaticResource TitleBarCloseButtonStyle}">
|
||||||
|
<Path
|
||||||
|
Width="46"
|
||||||
|
Height="32"
|
||||||
|
Data="M 18,11 27,20 M 18,20 27,11"
|
||||||
|
Stroke="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
|
||||||
|
StrokeThickness="1">
|
||||||
|
<Path.Style>
|
||||||
|
<Style TargetType="Path">
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding Path=IsActive, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Value="False">
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Path.Style>
|
||||||
|
</Path>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Margin="26,12,26,0">
|
||||||
|
<StackPanel Grid.Row="1" Margin="0,0,0,12">
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="0,0,0,0"
|
||||||
|
FontFamily="Segoe UI"
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="SemiBold"
|
||||||
|
Text="{DynamicResource fileManagerWindow}"
|
||||||
|
TextAlignment="Left" />
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource fileManager_tips}"
|
||||||
|
TextAlignment="Left"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
<TextBlock Margin="0,14,0,0" FontSize="14">
|
||||||
|
<TextBlock Text="{DynamicResource fileManager_tips2}" TextWrapping="WrapWithOverflow" />
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Margin="14,28,0,0" Orientation="Horizontal">
|
||||||
|
<TextBlock
|
||||||
|
Grid.Column="1"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource fileManager_name}" />
|
||||||
|
<ComboBox
|
||||||
|
Name="comboBox"
|
||||||
|
Width="200"
|
||||||
|
Height="35"
|
||||||
|
Margin="14,0,0,0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
ItemsSource="{Binding CustomExplorers}"
|
||||||
|
SelectedIndex="{Binding SelectedCustomExplorerIndex}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock Text="{Binding Name}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
<Button
|
||||||
|
Margin="10,0,0,0"
|
||||||
|
Click="btnAdd_Click"
|
||||||
|
Content="{DynamicResource add}" />
|
||||||
|
<Button
|
||||||
|
Margin="10,0,0,0"
|
||||||
|
Click="btnDelete_Click"
|
||||||
|
Content="{DynamicResource delete}"
|
||||||
|
IsEnabled="{Binding CustomExplorer.Editable}" />
|
||||||
|
|
||||||
|
</StackPanel>
|
||||||
|
<Rectangle
|
||||||
|
Height="1"
|
||||||
|
Margin="0,20,0,12"
|
||||||
|
Fill="{StaticResource Color03B}" />
|
||||||
|
<StackPanel
|
||||||
|
Margin="0,0,0,0"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
DataContext="{Binding CustomExplorer}"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Grid Width="545">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="180" />
|
||||||
|
<ColumnDefinition />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition />
|
||||||
|
<RowDefinition />
|
||||||
|
<RowDefinition />
|
||||||
|
<RowDefinition />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="14,5,0,0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource fileManager_profile_name}" />
|
||||||
|
<TextBox
|
||||||
|
x:Name="ProfileTextBox"
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="Auto"
|
||||||
|
Margin="10,5,15,0"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
IsEnabled="{Binding Editable}"
|
||||||
|
Text="{Binding Name}" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="14,10,0,0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource fileManager_path}" />
|
||||||
|
<DockPanel Grid.Row="1" Grid.Column="1">
|
||||||
|
<TextBox
|
||||||
|
x:Name="PathTextBox"
|
||||||
|
Width="250"
|
||||||
|
Margin="10,10,10,0"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
IsEnabled="{Binding Editable}"
|
||||||
|
Text="{Binding Path}" />
|
||||||
|
<Button
|
||||||
|
Name="btnBrowseFile"
|
||||||
|
Width="80"
|
||||||
|
Margin="0,10,15,0"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Click="btnBrowseFile_Click"
|
||||||
|
Content="{DynamicResource selectPythonDirectory}"
|
||||||
|
DockPanel.Dock="Right">
|
||||||
|
<Button.Style>
|
||||||
|
<Style BasedOn="{StaticResource DefaultButtonStyle}" TargetType="{x:Type Button}">
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding ElementName=ProfileTextBox, UpdateSourceTrigger=PropertyChanged, Path=IsEnabled}" Value="False">
|
||||||
|
<Setter Property="IsEnabled" Value="False" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Button.Style>
|
||||||
|
</Button>
|
||||||
|
</DockPanel>
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="2"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="14,10,0,0"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource fileManager_directory_arg}"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
<TextBox
|
||||||
|
x:Name="directoryArgTextBox"
|
||||||
|
Grid.Row="2"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="Auto"
|
||||||
|
Margin="10,10,15,0"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
IsEnabled="{Binding Editable}"
|
||||||
|
Text="{Binding DirectoryArgument}" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="3"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="14,10,0,20"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{DynamicResource fileManager_file_arg}"
|
||||||
|
TextWrapping="WrapWithOverflow" />
|
||||||
|
<TextBox
|
||||||
|
x:Name="fileArgTextBox"
|
||||||
|
Grid.Row="3"
|
||||||
|
Grid.Column="1"
|
||||||
|
Width="Auto"
|
||||||
|
Margin="10,10,15,20"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
IsEnabled="{Binding Editable}"
|
||||||
|
Text="{Binding FileArgument}" />
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Border
|
||||||
|
Grid.Row="2"
|
||||||
|
Background="{DynamicResource PopupButtonAreaBGColor}"
|
||||||
|
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
|
||||||
|
BorderThickness="0,1,0,0">
|
||||||
|
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
|
||||||
|
<Button
|
||||||
|
x:Name="btnCancel"
|
||||||
|
Width="145"
|
||||||
|
Margin="0,0,5,0"
|
||||||
|
Click="btnCancel_Click"
|
||||||
|
Content="{DynamicResource cancel}" />
|
||||||
|
<Button
|
||||||
|
x:Name="btnDone"
|
||||||
|
Width="145"
|
||||||
|
Margin="5,0,0,0"
|
||||||
|
Click="btnDone_Click"
|
||||||
|
Content="{DynamicResource done}"
|
||||||
|
ForceCursor="True">
|
||||||
|
<Button.Style>
|
||||||
|
<Style BasedOn="{StaticResource AccentButtonStyle}" TargetType="{x:Type Button}">
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding Text.Length, ElementName=ProfileTextBox, UpdateSourceTrigger=PropertyChanged}" Value="0">
|
||||||
|
<Setter Property="IsEnabled" Value="False" />
|
||||||
|
</DataTrigger>
|
||||||
|
<DataTrigger Binding="{Binding Text.Length, ElementName=PathTextBox, UpdateSourceTrigger=PropertyChanged}" Value="0">
|
||||||
|
<Setter Property="IsEnabled" Value="False" />
|
||||||
|
</DataTrigger>
|
||||||
|
<DataTrigger Binding="{Binding Text.Length, ElementName=directoryArgTextBox, UpdateSourceTrigger=PropertyChanged}" Value="0">
|
||||||
|
<Setter Property="IsEnabled" Value="False" />
|
||||||
|
</DataTrigger>
|
||||||
|
<DataTrigger Binding="{Binding Text.Length, ElementName=fileArgTextBox, UpdateSourceTrigger=PropertyChanged}" Value="0">
|
||||||
|
<Setter Property="IsEnabled" Value="False" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Button.Style>
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
</Window>
|
||||||
88
Flow.Launcher/SelectFileManagerWindow.xaml.cs
Normal file
88
Flow.Launcher/SelectFileManagerWindow.xaml.cs
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
|
using Flow.Launcher.ViewModel;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
|
||||||
|
namespace Flow.Launcher
|
||||||
|
{
|
||||||
|
public partial class SelectFileManagerWindow : Window, INotifyPropertyChanged
|
||||||
|
{
|
||||||
|
private int selectedCustomExplorerIndex;
|
||||||
|
|
||||||
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
|
|
||||||
|
public Settings Settings { get; }
|
||||||
|
|
||||||
|
public int SelectedCustomExplorerIndex
|
||||||
|
{
|
||||||
|
get => selectedCustomExplorerIndex; set
|
||||||
|
{
|
||||||
|
selectedCustomExplorerIndex = value;
|
||||||
|
PropertyChanged?.Invoke(this, new(nameof(CustomExplorer)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public ObservableCollection<CustomExplorerViewModel> CustomExplorers { get; set; }
|
||||||
|
|
||||||
|
public CustomExplorerViewModel CustomExplorer => CustomExplorers[SelectedCustomExplorerIndex];
|
||||||
|
public SelectFileManagerWindow(Settings settings)
|
||||||
|
{
|
||||||
|
Settings = settings;
|
||||||
|
CustomExplorers = new ObservableCollection<CustomExplorerViewModel>(Settings.CustomExplorerList.Select(x => x.Copy()));
|
||||||
|
SelectedCustomExplorerIndex = Settings.CustomExplorerIndex;
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnDone_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Settings.CustomExplorerList = CustomExplorers.ToList();
|
||||||
|
Settings.CustomExplorerIndex = SelectedCustomExplorerIndex;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnAdd_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
CustomExplorers.Add(new()
|
||||||
|
{
|
||||||
|
Name = "New Profile"
|
||||||
|
});
|
||||||
|
SelectedCustomExplorerIndex = CustomExplorers.Count - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnDelete_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
CustomExplorers.RemoveAt(SelectedCustomExplorerIndex--);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnBrowseFile_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
|
||||||
|
Nullable<bool> result = dlg.ShowDialog();
|
||||||
|
|
||||||
|
if (result == true)
|
||||||
|
{
|
||||||
|
TextBox path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
|
||||||
|
path.Text = dlg.FileName;
|
||||||
|
path.Focus();
|
||||||
|
((Button)sender).Focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,18 +1,27 @@
|
||||||
using System;
|
using Flow.Launcher.Core.ExternalPlugins;
|
||||||
using System.IO;
|
|
||||||
using System.Windows;
|
|
||||||
using System.Windows.Input;
|
|
||||||
using System.Windows.Interop;
|
|
||||||
using System.Windows.Navigation;
|
|
||||||
using Microsoft.Win32;
|
|
||||||
using Flow.Launcher.Core.Plugin;
|
using Flow.Launcher.Core.Plugin;
|
||||||
using Flow.Launcher.Core.Resource;
|
using Flow.Launcher.Core.Resource;
|
||||||
|
using Flow.Launcher.Helper;
|
||||||
using Flow.Launcher.Infrastructure;
|
using Flow.Launcher.Infrastructure;
|
||||||
|
using Flow.Launcher.Infrastructure.Hotkey;
|
||||||
using Flow.Launcher.Infrastructure.UserSettings;
|
using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
using Flow.Launcher.Plugin;
|
using Flow.Launcher.Plugin;
|
||||||
using Flow.Launcher.Plugin.SharedCommands;
|
using Flow.Launcher.Plugin.SharedCommands;
|
||||||
using Flow.Launcher.ViewModel;
|
using Flow.Launcher.ViewModel;
|
||||||
using Flow.Launcher.Helper;
|
using Microsoft.Win32;
|
||||||
|
using ModernWpf;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Interop;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using Button = System.Windows.Controls.Button;
|
||||||
|
using Control = System.Windows.Controls.Control;
|
||||||
|
using MessageBox = System.Windows.MessageBox;
|
||||||
|
using TextBox = System.Windows.Controls.TextBox;
|
||||||
|
using ThemeManager = ModernWpf.ThemeManager;
|
||||||
|
|
||||||
namespace Flow.Launcher
|
namespace Flow.Launcher
|
||||||
{
|
{
|
||||||
|
|
@ -23,6 +32,7 @@ namespace Flow.Launcher
|
||||||
public readonly IPublicAPI API;
|
public readonly IPublicAPI API;
|
||||||
private Settings settings;
|
private Settings settings;
|
||||||
private SettingWindowViewModel viewModel;
|
private SettingWindowViewModel viewModel;
|
||||||
|
private static MainViewModel mainViewModel;
|
||||||
|
|
||||||
public SettingWindow(IPublicAPI api, SettingWindowViewModel viewModel)
|
public SettingWindow(IPublicAPI api, SettingWindowViewModel viewModel)
|
||||||
{
|
{
|
||||||
|
|
@ -36,6 +46,7 @@ namespace Flow.Launcher
|
||||||
#region General
|
#region General
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
|
RefreshMaximizeRestoreButton();
|
||||||
// Fix (workaround) for the window freezes after lock screen (Win+L)
|
// Fix (workaround) for the window freezes after lock screen (Win+L)
|
||||||
// https://stackoverflow.com/questions/4951058/software-rendering-mode-wpf
|
// https://stackoverflow.com/questions/4951058/software-rendering-mode-wpf
|
||||||
HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
|
HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
|
||||||
|
|
@ -55,39 +66,30 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
public static void SetStartup()
|
public static void SetStartup()
|
||||||
{
|
{
|
||||||
using (var key = Registry.CurrentUser.OpenSubKey(StartupPath, true))
|
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
|
||||||
{
|
key?.SetValue(Constant.FlowLauncher, Constant.ExecutablePath);
|
||||||
key?.SetValue(Infrastructure.Constant.FlowLauncher, Infrastructure.Constant.ExecutablePath);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RemoveStartup()
|
private void RemoveStartup()
|
||||||
{
|
{
|
||||||
using (var key = Registry.CurrentUser.OpenSubKey(StartupPath, true))
|
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
|
||||||
{
|
key?.DeleteValue(Constant.FlowLauncher, false);
|
||||||
key?.DeleteValue(Infrastructure.Constant.FlowLauncher, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool StartupSet()
|
public static bool StartupSet()
|
||||||
{
|
{
|
||||||
using (var key = Registry.CurrentUser.OpenSubKey(StartupPath, true))
|
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
|
||||||
|
var path = key?.GetValue(Constant.FlowLauncher) as string;
|
||||||
|
if (path != null)
|
||||||
{
|
{
|
||||||
var path = key?.GetValue(Infrastructure.Constant.FlowLauncher) as string;
|
return path == Constant.ExecutablePath;
|
||||||
if (path != null)
|
|
||||||
{
|
|
||||||
return path == Infrastructure.Constant.ExecutablePath;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnSelectPythonDirectoryClick(object sender, RoutedEventArgs e)
|
private void OnSelectPythonDirectoryClick(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
var dlg = new System.Windows.Forms.FolderBrowserDialog
|
var dlg = new FolderBrowserDialog
|
||||||
{
|
{
|
||||||
SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
|
SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
|
||||||
};
|
};
|
||||||
|
|
@ -112,6 +114,18 @@ namespace Flow.Launcher
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnSelectFileManagerClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
SelectFileManagerWindow fileManagerChangeWindow = new SelectFileManagerWindow(settings);
|
||||||
|
fileManagerChangeWindow.ShowDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSelectDefaultBrowserClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
var browserWindow = new SelectBrowserWindow(settings);
|
||||||
|
browserWindow.ShowDialog();
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Hotkey
|
#region Hotkey
|
||||||
|
|
@ -121,15 +135,23 @@ namespace Flow.Launcher
|
||||||
HotkeyControl.SetHotkey(viewModel.Settings.Hotkey, false);
|
HotkeyControl.SetHotkey(viewModel.Settings.Hotkey, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnHotkeyChanged(object sender, EventArgs e)
|
private void OnHotkeyControlFocused(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
HotKeyMapper.RemoveHotkey(settings.Hotkey);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnHotkeyControlFocusLost(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (HotkeyControl.CurrentHotkeyAvailable)
|
if (HotkeyControl.CurrentHotkeyAvailable)
|
||||||
{
|
{
|
||||||
|
HotKeyMapper.SetHotkey(HotkeyControl.CurrentHotkey, HotKeyMapper.OnToggleHotkey);
|
||||||
HotKeyMapper.SetHotkey(HotkeyControl.CurrentHotkey, HotKeyMapper.OnHotkey);
|
|
||||||
HotKeyMapper.RemoveHotkey(settings.Hotkey);
|
HotKeyMapper.RemoveHotkey(settings.Hotkey);
|
||||||
settings.Hotkey = HotkeyControl.CurrentHotkey.ToString();
|
settings.Hotkey = HotkeyControl.CurrentHotkey.ToString();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HotKeyMapper.SetHotkey(new HotkeyModel(settings.Hotkey), HotKeyMapper.OnToggleHotkey);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnDeleteCustomHotkeyClick(object sender, RoutedEventArgs e)
|
private void OnDeleteCustomHotkeyClick(object sender, RoutedEventArgs e)
|
||||||
|
|
@ -184,23 +206,20 @@ namespace Flow.Launcher
|
||||||
settings.PluginSettings.Plugins[id].Disabled = viewModel.SelectedPlugin.PluginPair.Metadata.Disabled;
|
settings.PluginSettings.Plugins[id].Disabled = viewModel.SelectedPlugin.PluginPair.Metadata.Disabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnPluginPriorityClick(object sender, MouseButtonEventArgs e)
|
private void OnPluginPriorityClick(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.ChangedButton == MouseButton.Left)
|
if (sender is Control { DataContext: PluginViewModel pluginViewModel })
|
||||||
{
|
{
|
||||||
PriorityChangeWindow priorityChangeWindow = new PriorityChangeWindow(viewModel.SelectedPlugin.PluginPair.Metadata.ID, settings, viewModel.SelectedPlugin);
|
PriorityChangeWindow priorityChangeWindow = new PriorityChangeWindow(pluginViewModel.PluginPair.Metadata.ID, settings, pluginViewModel);
|
||||||
priorityChangeWindow.ShowDialog();
|
priorityChangeWindow.ShowDialog();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnPluginActionKeywordsClick(object sender, MouseButtonEventArgs e)
|
private void OnPluginActionKeywordsClick(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.ChangedButton == MouseButton.Left)
|
var id = viewModel.SelectedPlugin.PluginPair.Metadata.ID;
|
||||||
{
|
ActionKeywords changeKeywordsWindow = new ActionKeywords(id, settings, viewModel.SelectedPlugin);
|
||||||
var id = viewModel.SelectedPlugin.PluginPair.Metadata.ID;
|
changeKeywordsWindow.ShowDialog();
|
||||||
ActionKeywords changeKeywordsWindow = new ActionKeywords(id, settings, viewModel.SelectedPlugin);
|
|
||||||
changeKeywordsWindow.ShowDialog();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnPluginNameClick(object sender, MouseButtonEventArgs e)
|
private void OnPluginNameClick(object sender, MouseButtonEventArgs e)
|
||||||
|
|
@ -213,7 +232,7 @@ namespace Flow.Launcher
|
||||||
var uri = new Uri(website);
|
var uri = new Uri(website);
|
||||||
if (Uri.CheckSchemeName(uri.Scheme))
|
if (Uri.CheckSchemeName(uri.Scheme))
|
||||||
{
|
{
|
||||||
SearchWeb.NewTabInBrowser(website);
|
website.NewTabInBrowser();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -225,7 +244,7 @@ namespace Flow.Launcher
|
||||||
{
|
{
|
||||||
var directory = viewModel.SelectedPlugin.PluginPair.Metadata.PluginDirectory;
|
var directory = viewModel.SelectedPlugin.PluginPair.Metadata.PluginDirectory;
|
||||||
if (!string.IsNullOrEmpty(directory))
|
if (!string.IsNullOrEmpty(directory))
|
||||||
FilesFolders.OpenPath(directory);
|
PluginManager.API.OpenDirectory(directory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -247,7 +266,7 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
private void OnRequestNavigate(object sender, RequestNavigateEventArgs e)
|
private void OnRequestNavigate(object sender, RequestNavigateEventArgs e)
|
||||||
{
|
{
|
||||||
SearchWeb.NewTabInBrowser(e.Uri.AbsoluteUri);
|
API.OpenUrl(e.Uri.AbsoluteUri);
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -261,10 +280,95 @@ namespace Flow.Launcher
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OpenPluginFolder(object sender, RoutedEventArgs e)
|
private void OpenThemeFolder(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
FilesFolders.OpenPath(Path.Combine(DataLocation.DataDirectory(), Constant.Themes));
|
PluginManager.API.OpenDirectory(Path.Combine(DataLocation.DataDirectory(), Constant.Themes));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OpenSettingFolder(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
PluginManager.API.OpenDirectory(Path.Combine(DataLocation.DataDirectory(), Constant.Settings));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OpenWelcomeWindow(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
var WelcomeWindow = new WelcomeWindow(settings);
|
||||||
|
WelcomeWindow.Show();
|
||||||
|
}
|
||||||
|
private void OpenLogFolder(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
PluginManager.API.OpenDirectory(Path.Combine(DataLocation.DataDirectory(), Constant.Logs, Constant.Version));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPluginStoreRefreshClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
_ = viewModel.RefreshExternalPluginsAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnExternalPluginInstallClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if(sender is Button { DataContext: UserPlugin plugin })
|
||||||
|
{
|
||||||
|
var pluginsManagerPlugin = PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7");
|
||||||
|
var actionKeyword = pluginsManagerPlugin.Metadata.ActionKeywords.Count == 0 ? "" : pluginsManagerPlugin.Metadata.ActionKeywords[0];
|
||||||
|
API.ChangeQuery($"{actionKeyword} install {plugin.Name}");
|
||||||
|
API.ShowMainWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void window_MouseDown(object sender, MouseButtonEventArgs e) /* for close hotkey popup */
|
||||||
|
{
|
||||||
|
if (Keyboard.FocusedElement is not TextBox textBox)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var tRequest = new TraversalRequest(FocusNavigationDirection.Next);
|
||||||
|
textBox.MoveFocus(tRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ColorSchemeSelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
=> ThemeManager.Current.ApplicationTheme = settings.ColorScheme switch
|
||||||
|
{
|
||||||
|
Constant.Light => ApplicationTheme.Light,
|
||||||
|
Constant.Dark => ApplicationTheme.Dark,
|
||||||
|
Constant.System => null,
|
||||||
|
_ => ThemeManager.Current.ApplicationTheme
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Custom TitleBar */
|
||||||
|
|
||||||
|
private void OnMinimizeButtonClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
WindowState = WindowState.Minimized;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnMaximizeRestoreButtonClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnCloseButtonClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RefreshMaximizeRestoreButton()
|
||||||
|
{
|
||||||
|
if (WindowState == WindowState.Maximized)
|
||||||
|
{
|
||||||
|
maximizeButton.Visibility = Visibility.Collapsed;
|
||||||
|
restoreButton.Visibility = Visibility.Visible;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
maximizeButton.Visibility = Visibility.Visible;
|
||||||
|
restoreButton.Visibility = Visibility.Collapsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void Window_StateChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
RefreshMaximizeRestoreButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
103
Flow.Launcher/Themes/Atom.xaml
Normal file
103
Flow.Launcher/Themes/Atom.xaml
Normal file
|
|
@ -0,0 +1,103 @@
|
||||||
|
<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">
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/Themes/Base.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
<Style x:Key="ItemGlyph" BasedOn="{StaticResource BaseGlyphStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#9fb2bf" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="SelectionBrush" Value="#515a6b"/>
|
||||||
|
<Setter Property="FontSize" Value="24" />
|
||||||
|
<Setter Property="Background" Value="#282c34" />
|
||||||
|
<Setter Property="Foreground" Value="#61afef" />
|
||||||
|
<Setter Property="CaretBrush" Value="#ffb86c" />
|
||||||
|
<Setter Property="FontSize" Value="26" />
|
||||||
|
<Setter Property="Padding" Value="0 4 66 0" />
|
||||||
|
<Setter Property="Height" Value="42" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="QuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="Background" Value="#282c34" />
|
||||||
|
<Setter Property="Foreground" Value="#454e61" />
|
||||||
|
<Setter Property="FontSize" Value="26" />
|
||||||
|
<Setter Property="Padding" Value="0 4 66 0" />
|
||||||
|
<Setter Property="Height" Value="42" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
||||||
|
<Setter Property="BorderThickness" Value="2" />
|
||||||
|
<Setter Property="BorderBrush" Value="#44475a" />
|
||||||
|
<Setter Property="CornerRadius" Value="5" />
|
||||||
|
<Setter Property="Background" Value="#282c34" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="WindowStyle" BasedOn="{StaticResource BaseWindowStyle}" TargetType="{x:Type Window}">
|
||||||
|
<Setter Property="Width" Value="576" />
|
||||||
|
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}">
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<!-- Item Style -->
|
||||||
|
<Style x:Key="ItemTitleStyle" BasedOn="{StaticResource BaseItemTitleStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#9fb2bf" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Foreground" Value="#6272a4 " />
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemNumberStyle" BasedOn="{StaticResource BaseItemNumberStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#6272a4" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemTitleSelectedStyle" BasedOn="{StaticResource BaseItemTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
|
<Setter Property="Foreground" Value="#e5c07b" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemSubTitleSelectedStyle" BasedOn="{StaticResource BaseItemSubTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
|
<Setter Property="Foreground" Value="#c678dd" />
|
||||||
|
</Style>
|
||||||
|
<SolidColorBrush x:Key="ItemSelectedBackgroundColor">#2c313c</SolidColorBrush>
|
||||||
|
<Style x:Key="ItemImageSelectedStyle" BasedOn="{StaticResource BaseItemImageSelectedStyle}" TargetType="{x:Type Image}" >
|
||||||
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="HighlightStyle">
|
||||||
|
<Setter Property="Inline.Foreground" Value="#e06c75 " />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeyStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
<Setter Property="Foreground" Value="#6272a4" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeySelectedStyle" TargetType="{x:Type TextBlock}" BasedOn="{StaticResource BaseItemHotkeySelecetedStyle}">
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
<Setter Property="Foreground" Value="#56b6c2" />
|
||||||
|
</Style>
|
||||||
|
<!-- button style in the middle of the scrollbar -->
|
||||||
|
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
||||||
|
<Setter Property="SnapsToDevicePixels" Value="True"/>
|
||||||
|
<Setter Property="OverridesDefaultStyle" Value="true"/>
|
||||||
|
<Setter Property="IsTabStop" Value="false"/>
|
||||||
|
<Setter Property="Width" Value="2"/>
|
||||||
|
<Setter Property="Focusable" Value="false"/>
|
||||||
|
<Setter Property="Template">
|
||||||
|
<Setter.Value>
|
||||||
|
<ControlTemplate TargetType="{x:Type Thumb}">
|
||||||
|
<Border CornerRadius="2" DockPanel.Dock="Right" Background="#b4b5b7" BorderBrush="Transparent" BorderThickness="0" />
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}">
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="SeparatorStyle" BasedOn="{StaticResource BaseSeparatorStyle}" TargetType="{x:Type Rectangle}">
|
||||||
|
<Setter Property="Fill" Value="#495162"/>
|
||||||
|
<Setter Property="Height" Value="1"/>
|
||||||
|
<Setter Property="Margin" Value="12 0 12 8"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="SearchIconStyle" TargetType="{x:Type Path}" BasedOn="{StaticResource BaseSearchIconStyle}">
|
||||||
|
<Setter Property="Fill" Value="#495162" />
|
||||||
|
<Setter Property="Width" Value="32" />
|
||||||
|
<Setter Property="Height" Value="32" />
|
||||||
|
<Setter Property="Opacity" Value="0.8" />
|
||||||
|
</Style>
|
||||||
|
</ResourceDictionary>
|
||||||
|
|
@ -1,17 +1,21 @@
|
||||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:system="clr-namespace:System;assembly=mscorlib">
|
xmlns:system="clr-namespace:System;assembly=mscorlib"
|
||||||
|
xmlns:userSettings="clr-namespace:Flow.Launcher.Infrastructure.UserSettings;assembly=Flow.Launcher.Infrastructure">
|
||||||
|
|
||||||
<!-- Further font customisations are dynamically loaded in Theme.cs -->
|
<!-- Further font customisations are dynamically loaded in Theme.cs -->
|
||||||
<Style x:Key="BaseQueryBoxStyle" TargetType="{x:Type TextBox}">
|
<Style x:Key="BaseQueryBoxStyle" TargetType="{x:Type TextBox}">
|
||||||
<Setter Property="BorderThickness" Value="0" />
|
<Setter Property="BorderThickness" Value="0" />
|
||||||
<Setter Property="FontSize" Value="28" />
|
<Setter Property="FontSize" Value="28" />
|
||||||
<Setter Property="FontWeight" Value="Normal" />
|
<Setter Property="FontWeight" Value="Regular" />
|
||||||
<Setter Property="Height" Value="46" />
|
<Setter Property="Margin" Value="16 7 0 7" />
|
||||||
|
<Setter Property="Padding" Value="0 4 68 0" />
|
||||||
<Setter Property="Background" Value="#2F2F2F" />
|
<Setter Property="Background" Value="#2F2F2F" />
|
||||||
|
<Setter Property="Height" Value="48" />
|
||||||
<Setter Property="Foreground" Value="#E3E0E3" />
|
<Setter Property="Foreground" Value="#E3E0E3" />
|
||||||
<Setter Property="CaretBrush" Value="#E3E0E3" />
|
<Setter Property="CaretBrush" Value="#E3E0E3" />
|
||||||
<Setter Property="VerticalContentAlignment" Value="Center" />
|
<Setter Property="VerticalContentAlignment" Value="Center" />
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Stretch" />
|
||||||
<Setter Property="Stylus.IsFlicksEnabled" Value="False" />
|
<Setter Property="Stylus.IsFlicksEnabled" Value="False" />
|
||||||
<Setter Property="Template">
|
<Setter Property="Template">
|
||||||
<Setter.Value>
|
<Setter.Value>
|
||||||
|
|
@ -36,24 +40,34 @@
|
||||||
<!-- Further font customisations are dynamically loaded in Theme.cs -->
|
<!-- Further font customisations are dynamically loaded in Theme.cs -->
|
||||||
<Style x:Key="BaseQuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
<Style x:Key="BaseQuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
<Setter Property="Foreground" Value="DarkGray" />
|
<Setter Property="Foreground" Value="DarkGray" />
|
||||||
|
<Setter Property="Height" Value="48" />
|
||||||
|
<Setter Property="Margin" Value="16 7 0 7" />
|
||||||
<Setter Property="Background" Value="Transparent" />
|
<Setter Property="Background" Value="Transparent" />
|
||||||
|
<Setter Property="Padding" Value="0 4 68 0" />
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Stretch" />
|
||||||
|
<Setter Property="VerticalAlignment" Value="Center" />
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="BaseWindowBorderStyle" TargetType="{x:Type Border}">
|
<Style x:Key="BaseWindowBorderStyle" TargetType="{x:Type Border}">
|
||||||
<Setter Property="BorderThickness" Value="0" />
|
<Setter Property="BorderThickness" Value="0" />
|
||||||
<Setter Property="CornerRadius" Value="0" />
|
|
||||||
<Setter Property="Background" Value="#2F2F2F"></Setter>
|
<Setter Property="Background" Value="#2F2F2F"></Setter>
|
||||||
<Setter Property="Padding" Value="8 10 8 8" />
|
<Setter Property="Padding" Value="0 0 0 0" />
|
||||||
|
<Setter Property="CornerRadius" Value="5" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="BaseWindowStyle" TargetType="{x:Type Window}">
|
<Style x:Key="BaseWindowStyle" TargetType="{x:Type Window}">
|
||||||
<Setter Property="Width" Value="750" />
|
<Setter Property="Width" Value="600" />
|
||||||
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="WindowRadius" TargetType="{x:Type Border}">
|
||||||
|
<Setter Property="CornerRadius" Value="5" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="BasePendingLineStyle" TargetType="{x:Type Line}">
|
<Style x:Key="BasePendingLineStyle" TargetType="{x:Type Line}">
|
||||||
<Setter Property="Stroke" Value="Blue" />
|
<Setter Property="Stroke" Value="Blue" />
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
|
|
||||||
<!-- Item Style -->
|
<!-- Item Style -->
|
||||||
<Style x:Key="BaseItemTitleStyle" TargetType="{x:Type TextBlock}">
|
<Style x:Key="BaseItemTitleStyle" TargetType="{x:Type TextBlock}">
|
||||||
<Setter Property="Foreground" Value="#FFFFF8" />
|
<Setter Property="Foreground" Value="#FFFFF8" />
|
||||||
|
|
@ -64,6 +78,13 @@
|
||||||
<Style x:Key="BaseItemSubTitleStyle" TargetType="{x:Type TextBlock}" >
|
<Style x:Key="BaseItemSubTitleStyle" TargetType="{x:Type TextBlock}" >
|
||||||
<Setter Property="Foreground" Value="#D9D9D4" />
|
<Setter Property="Foreground" Value="#D9D9D4" />
|
||||||
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
<Setter Property="FontWeight" Value="Normal" />
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding ElementName=SubTitle, UpdateSourceTrigger=PropertyChanged, Path=Text.Length}" Value="0">
|
||||||
|
<Setter Property="Height" Value="0" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="BaseItemNumberStyle" TargetType="{x:Type TextBlock}">
|
<Style x:Key="BaseItemNumberStyle" TargetType="{x:Type TextBlock}">
|
||||||
<Setter Property="VerticalAlignment" Value="Center" />
|
<Setter Property="VerticalAlignment" Value="Center" />
|
||||||
|
|
@ -72,31 +93,58 @@
|
||||||
<Setter Property="FontSize" Value="22" />
|
<Setter Property="FontSize" Value="22" />
|
||||||
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
||||||
</Style>
|
</Style>
|
||||||
|
<Style x:Key="BaseGlyphStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#ffffff" />
|
||||||
|
<Setter Property="VerticalAlignment" Value="Center" />
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Center" />
|
||||||
|
<Setter Property="Width" Value="25" />
|
||||||
|
<Setter Property="Height" Value="25" />
|
||||||
|
<Setter Property="FontSize" Value="25"/>
|
||||||
|
</Style>
|
||||||
<Style x:Key="BaseItemTitleSelectedStyle" TargetType="{x:Type TextBlock}" >
|
<Style x:Key="BaseItemTitleSelectedStyle" TargetType="{x:Type TextBlock}" >
|
||||||
<Setter Property="Foreground" Value="#FFFFF8" />
|
<Setter Property="Foreground" Value="#FFFFF8" />
|
||||||
<Setter Property="FontSize" Value="16" />
|
<Setter Property="FontSize" Value="16" />
|
||||||
<Setter Property="FontWeight" Value="Medium" />
|
<Setter Property="FontWeight" Value="Normal" />
|
||||||
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="BaseItemSubTitleSelectedStyle" TargetType="{x:Type TextBlock}" >
|
<Style x:Key="BaseItemSubTitleSelectedStyle" TargetType="{x:Type TextBlock}" >
|
||||||
<Setter Property="Foreground" Value="#D9D9D4" />
|
<Setter Property="Foreground" Value="#D9D9D4" />
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding ElementName=SubTitle, UpdateSourceTrigger=PropertyChanged, Path=Text.Length}" Value="0">
|
||||||
|
<Setter Property="Height" Value="0" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="BaseItemImageSelectedStyle" TargetType="{x:Type Image}" >
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<SolidColorBrush x:Key="ItemSelectedBackgroundColor">#4D4D4D</SolidColorBrush>
|
|
||||||
|
|
||||||
<Style x:Key="BaseItemImageSelectedStyle" TargetType="{x:Type Image}" >
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style x:Key="BaseListboxStyle" TargetType="{x:Type ListBox}">
|
<Style x:Key="BaseListboxStyle" TargetType="{x:Type ListBox}">
|
||||||
<Setter Property="BorderBrush" Value="Transparent"/>
|
<Setter Property="BorderBrush" Value="Transparent"/>
|
||||||
<Setter Property="Background" Value="Transparent"/>
|
<Setter Property="Background" Value="Transparent"/>
|
||||||
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
|
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
|
||||||
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
|
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
|
||||||
|
<Setter Property="Margin" Value="0 0 0 0" />
|
||||||
|
<Setter Property="Padding" Value="0 0 0 0" />
|
||||||
<Setter Property="Template">
|
<Setter Property="Template">
|
||||||
<Setter.Value>
|
<Setter.Value>
|
||||||
<ControlTemplate TargetType="ListBox">
|
<ControlTemplate TargetType="ListBox">
|
||||||
<ScrollViewer Focusable="false" Template="{DynamicResource ScrollViewerControlTemplate}">
|
<ScrollViewer Focusable="false" Template="{DynamicResource ScrollViewerControlTemplate}">
|
||||||
|
<ScrollViewer.Style>
|
||||||
|
<Style TargetType="ScrollViewer">
|
||||||
|
<Style.Triggers>
|
||||||
|
<Trigger Property="ComputedVerticalScrollBarVisibility" Value="Visible">
|
||||||
|
<Setter Property="Margin" Value="0 0 0 0" />
|
||||||
|
<Setter Property="Padding" Value="0 0 0 0" />
|
||||||
|
</Trigger>
|
||||||
|
<Trigger Property="ComputedVerticalScrollBarVisibility" Value="Collapsed">
|
||||||
|
<Setter Property="Margin" Value="0 0 0 0" />
|
||||||
|
<Setter Property="Padding" Value="0 0 0 0" />
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</ScrollViewer.Style>
|
||||||
<VirtualizingStackPanel IsItemsHost="True" />
|
<VirtualizingStackPanel IsItemsHost="True" />
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
|
|
@ -120,15 +168,16 @@
|
||||||
ContentTemplate="{TemplateBinding ContentTemplate}"
|
ContentTemplate="{TemplateBinding ContentTemplate}"
|
||||||
Content="{TemplateBinding Content}"
|
Content="{TemplateBinding Content}"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{TemplateBinding Padding}"
|
Margin="0"
|
||||||
Grid.Row="0" />
|
Grid.Row="0" />
|
||||||
|
|
||||||
<!--Scrollbar in thr rigth of ScrollViewer-->
|
<!--Scrollbar in thr rigth of ScrollViewer-->
|
||||||
<ScrollBar x:Name="PART_VerticalScrollBar"
|
<ScrollBar x:Name="PART_VerticalScrollBar"
|
||||||
AutomationProperties.AutomationId="VerticalScrollBar"
|
AutomationProperties.AutomationId="VerticalScrollBar"
|
||||||
Cursor="Arrow"
|
Cursor="Arrow"
|
||||||
Grid.Column="1"
|
Grid.Column="0"
|
||||||
Margin="3 0 0 0"
|
HorizontalAlignment="Right"
|
||||||
|
Margin="0 0 0 0"
|
||||||
Maximum="{TemplateBinding ScrollableHeight}"
|
Maximum="{TemplateBinding ScrollableHeight}"
|
||||||
Minimum="0"
|
Minimum="0"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
|
|
@ -136,7 +185,6 @@
|
||||||
Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
|
Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
|
||||||
ViewportSize="{TemplateBinding ViewportHeight}"
|
ViewportSize="{TemplateBinding ViewportHeight}"
|
||||||
Style="{DynamicResource ScrollBarStyle}" />
|
Style="{DynamicResource ScrollBarStyle}" />
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
|
|
||||||
|
|
@ -149,7 +197,7 @@
|
||||||
<Setter Property="Template">
|
<Setter Property="Template">
|
||||||
<Setter.Value>
|
<Setter.Value>
|
||||||
<ControlTemplate TargetType="{x:Type Thumb}">
|
<ControlTemplate TargetType="{x:Type Thumb}">
|
||||||
<Border CornerRadius="2" DockPanel.Dock="Right" Background="#616161" BorderBrush="Transparent" BorderThickness="0" />
|
<Border CornerRadius="2" DockPanel.Dock="Right" Background="#898989" BorderBrush="Transparent" />
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
</Setter.Value>
|
</Setter.Value>
|
||||||
</Setter>
|
</Setter>
|
||||||
|
|
@ -158,6 +206,7 @@
|
||||||
<Style x:Key="BaseScrollBarStyle" TargetType="{x:Type ScrollBar}">
|
<Style x:Key="BaseScrollBarStyle" TargetType="{x:Type ScrollBar}">
|
||||||
<Setter Property="Stylus.IsPressAndHoldEnabled" Value="false" />
|
<Setter Property="Stylus.IsPressAndHoldEnabled" Value="false" />
|
||||||
<Setter Property="Stylus.IsFlicksEnabled" Value="false" />
|
<Setter Property="Stylus.IsFlicksEnabled" Value="false" />
|
||||||
|
<Setter Property="Background" Value="Black" />
|
||||||
<!-- must set min width -->
|
<!-- must set min width -->
|
||||||
<Setter Property="MinWidth" Value="0"/>
|
<Setter Property="MinWidth" Value="0"/>
|
||||||
<Setter Property="Width" Value="5"/>
|
<Setter Property="Width" Value="5"/>
|
||||||
|
|
@ -174,6 +223,59 @@
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
</Setter.Value>
|
</Setter.Value>
|
||||||
</Setter>
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="BaseSeparatorStyle" TargetType="Rectangle">
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="HighlightStyle">
|
||||||
|
<Setter Property="Inline.FontWeight" Value="Bold" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="BaseItemHotkeyStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="15" />
|
||||||
|
<Setter Property="Foreground" Value="#8f8f8f" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="BaseItemHotkeySelecetedStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="15" />
|
||||||
|
<Setter Property="Foreground" Value="#8f8f8f" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
|
||||||
|
<Geometry x:Key="SearchIconImg">F1 M12000,12000z M0,0z M10354,10962C10326,10951 10279,10927 10249,10907 10216,10886 9476,10153 8370,9046 7366,8042 6541,7220 6536,7220 6532,7220 6498,7242 6461,7268 6213,7447 5883,7619 5592,7721 5194,7860 4802,7919 4360,7906 3612,7886 2953,7647 2340,7174 2131,7013 1832,6699 1664,6465 1394,6088 1188,5618 1097,5170 1044,4909 1030,4764 1030,4470 1030,4130 1056,3914 1135,3609 1263,3110 1511,2633 1850,2235 1936,2134 2162,1911 2260,1829 2781,1395 3422,1120 4090,1045 4271,1025 4667,1025 4848,1045 5505,1120 6100,1368 6630,1789 6774,1903 7081,2215 7186,2355 7362,2588 7467,2759 7579,2990 7802,3455 7911,3937 7911,4460 7911,4854 7861,5165 7737,5542 7684,5702 7675,5724 7602,5885 7517,6071 7390,6292 7270,6460 7242,6499 7220,6533 7220,6538 7220,6542 8046,7371 9055,8380 10441,9766 10898,10229 10924,10274 10945,10308 10966,10364 10976,10408 10990,10472 10991,10493 10980,10554 10952,10717 10840,10865 10690,10937 10621,10971 10607,10974 10510,10977 10425,10980 10395,10977 10354,10962z M4685,7050C5214,7001 5694,6809 6100,6484 6209,6396 6396,6209 6484,6100 7151,5267 7246,4110 6721,3190 6369,2571 5798,2137 5100,1956 4706,1855 4222,1855 3830,1957 3448,2056 3140,2210 2838,2453 2337,2855 2010,3427 1908,4080 1877,4274 1877,4656 1908,4850 1948,5105 2028,5370 2133,5590 2459,6272 3077,6782 3810,6973 3967,7014 4085,7034 4290,7053 4371,7061 4583,7059 4685,7050z</Geometry>
|
||||||
|
|
||||||
|
<Style x:Key="BaseSearchIconStyle" TargetType="{x:Type Path}">
|
||||||
|
<Setter Property="Fill" Value="#555555" />
|
||||||
|
<Setter Property="Width" Value="32" />
|
||||||
|
<Setter Property="Height" Value="32" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="BaseSearchIconPosition" TargetType="{x:Type Canvas}">
|
||||||
|
<Setter Property="Width" Value="32" />
|
||||||
|
<Setter Property="Height" Value="32" />
|
||||||
|
<Setter Property="Margin" Value="0 2 18 0" />
|
||||||
|
<Setter Property="Background" Value="Transparent" />
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Right" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<!--for classic themes-->
|
||||||
|
<Style x:Key="SearchIconStyle" TargetType="{x:Type Path}">
|
||||||
|
<Setter Property="Fill" Value="#555555" />
|
||||||
|
<Setter Property="Width" Value="32" />
|
||||||
|
<Setter Property="Height" Value="32" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="SearchIconPosition" TargetType="{x:Type Canvas}">
|
||||||
|
<Setter Property="Width" Value="32" />
|
||||||
|
<Setter Property="Height" Value="32" />
|
||||||
|
<Setter Property="Margin" Value="0 2 18 0" />
|
||||||
|
<Setter Property="Background" Value="Transparent" />
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Right" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeyStyle" TargetType="{x:Type TextBlock}" BasedOn="{StaticResource BaseItemHotkeyStyle}">
|
||||||
|
<Setter Property="FontSize" Value="15" />
|
||||||
|
<Setter Property="Foreground" Value="#8f8f8f" />
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeySelectedStyle" TargetType="{x:Type TextBlock}" BasedOn="{StaticResource BaseItemHotkeySelecetedStyle}">
|
||||||
|
<Setter Property="FontSize" Value="15" />
|
||||||
|
<Setter Property="Foreground" Value="#8f8f8f" />
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
</Style>
|
</Style>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
||||||
|
|
@ -3,32 +3,51 @@
|
||||||
<ResourceDictionary.MergedDictionaries>
|
<ResourceDictionary.MergedDictionaries>
|
||||||
<ResourceDictionary Source="Base.xaml" />
|
<ResourceDictionary Source="Base.xaml" />
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
<Style x:Key="ItemGlyph" BasedOn="{StaticResource BaseGlyphStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#ffffff" />
|
||||||
|
</Style>
|
||||||
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
<Setter Property="Background" Value="#000000" />
|
<Setter Property="Background" Value="#000000" />
|
||||||
<Setter Property="Foreground" Value="#ffffff" />
|
<Setter Property="Foreground" Value="#ffffff" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="QuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}" TargetType="{x:Type TextBox}">
|
<Style x:Key="QuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
<Setter Property="Background" Value="#000000" />
|
<Setter Property="Background" Value="#000000" />
|
||||||
<Setter Property="Foreground" Value="#ffffff" />
|
<Setter Property="Foreground" Value="#8f8f8f" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
||||||
|
<Setter Property="CornerRadius" Value="4" />
|
||||||
|
<Setter Property="BorderThickness" Value="1" />
|
||||||
|
<Setter Property="BorderBrush" Value="#494949" />
|
||||||
<Setter Property="Background" Value="#000000" />
|
<Setter Property="Background" Value="#000000" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="WindowStyle" TargetType="{x:Type Window}" BasedOn="{StaticResource BaseWindowStyle}" />
|
<Style x:Key="WindowStyle" TargetType="{x:Type Window}" BasedOn="{StaticResource BaseWindowStyle}" />
|
||||||
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}" />
|
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}">
|
||||||
|
<Setter Property="Stroke" Value="White" />
|
||||||
|
</Style>
|
||||||
<Style x:Key="ItemTitleStyle" BasedOn="{StaticResource BaseItemTitleStyle}" TargetType="{x:Type TextBlock}">
|
<Style x:Key="ItemTitleStyle" BasedOn="{StaticResource BaseItemTitleStyle}" TargetType="{x:Type TextBlock}">
|
||||||
<Setter Property="Foreground" Value="#FFFFF8" />
|
<Setter Property="Foreground" Value="#FFFFF8" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}">
|
<Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}">
|
||||||
<Setter Property="Foreground" Value="#D9D9D4" />
|
<Setter Property="Foreground" Value="#8f8f8f" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="ItemTitleSelectedStyle" BasedOn="{StaticResource BaseItemTitleSelectedStyle}" TargetType="{x:Type TextBlock}">
|
<Style x:Key="ItemTitleSelectedStyle" BasedOn="{StaticResource BaseItemTitleSelectedStyle}" TargetType="{x:Type TextBlock}">
|
||||||
<Setter Property="Foreground" Value="#FFFFF8" />
|
<Setter Property="Foreground" Value="#FFFFF8" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="ItemSubTitleSelectedStyle" BasedOn="{StaticResource BaseItemSubTitleSelectedStyle}" TargetType="{x:Type TextBlock}">
|
<Style x:Key="ItemSubTitleSelectedStyle" BasedOn="{StaticResource BaseItemSubTitleSelectedStyle}" TargetType="{x:Type TextBlock}">
|
||||||
<Setter Property="Foreground" Value="#D9D9D4" />
|
<Setter Property="Foreground" Value="#8f8f8f" />
|
||||||
</Style>
|
</Style>
|
||||||
<SolidColorBrush x:Key="ItemSelectedBackgroundColor">#4F6180</SolidColorBrush>
|
<SolidColorBrush x:Key="ItemSelectedBackgroundColor">#494949</SolidColorBrush>
|
||||||
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}" />
|
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}" />
|
||||||
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}" />
|
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}" />
|
||||||
|
<Style x:Key="HighlightStyle">
|
||||||
|
<Setter Property="Inline.FontWeight" Value="Bold" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeyStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="15" />
|
||||||
|
<Setter Property="Foreground" Value="#b2b2b2" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeySelectedStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="15" />
|
||||||
|
<Setter Property="Foreground" Value="#b2b2b2" />
|
||||||
|
</Style>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
@ -7,6 +7,9 @@
|
||||||
|
|
||||||
<system:Boolean x:Key="ThemeBlurEnabled">True</system:Boolean>
|
<system:Boolean x:Key="ThemeBlurEnabled">True</system:Boolean>
|
||||||
|
|
||||||
|
<Style x:Key="ItemGlyph" BasedOn="{StaticResource BaseGlyphStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#ffffff" />
|
||||||
|
</Style>
|
||||||
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
<Setter Property="Foreground" Value="#FFFFFFFF" />
|
<Setter Property="Foreground" Value="#FFFFFFFF" />
|
||||||
<Setter Property="Background" Value="Transparent" />
|
<Setter Property="Background" Value="Transparent" />
|
||||||
|
|
@ -14,6 +17,7 @@
|
||||||
|
|
||||||
<Style x:Key="QuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}" TargetType="{x:Type TextBox}">
|
<Style x:Key="QuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
<Setter Property="Foreground" Value="LightGray" />
|
<Setter Property="Foreground" Value="LightGray" />
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
||||||
|
|
@ -27,12 +31,13 @@
|
||||||
<Style x:Key="WindowStyle" BasedOn="{StaticResource BaseWindowStyle}" TargetType="{x:Type Window}">
|
<Style x:Key="WindowStyle" BasedOn="{StaticResource BaseWindowStyle}" TargetType="{x:Type Window}">
|
||||||
<Setter Property="Background">
|
<Setter Property="Background">
|
||||||
<Setter.Value>
|
<Setter.Value>
|
||||||
<SolidColorBrush Color="Black" Opacity="0.6"/>
|
<SolidColorBrush Color="Black" Opacity="0.7"/>
|
||||||
</Setter.Value>
|
</Setter.Value>
|
||||||
</Setter>
|
</Setter>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}">
|
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}">
|
||||||
|
<Setter Property="Stroke" Value="White" />
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<!-- Item Style -->
|
<!-- Item Style -->
|
||||||
|
|
@ -42,6 +47,7 @@
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}" >
|
<Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
<Setter Property="Foreground" Value="#FFFFFFFF"/>
|
<Setter Property="Foreground" Value="#FFFFFFFF"/>
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="ItemTitleSelectedStyle" BasedOn="{StaticResource BaseItemTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
<Style x:Key="ItemTitleSelectedStyle" BasedOn="{StaticResource BaseItemTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
<Setter Property="Margin" Value="0, -10"/>
|
<Setter Property="Margin" Value="0, -10"/>
|
||||||
|
|
@ -49,14 +55,38 @@
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="ItemSubTitleSelectedStyle" BasedOn="{StaticResource BaseItemSubTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
<Style x:Key="ItemSubTitleSelectedStyle" BasedOn="{StaticResource BaseItemSubTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
<Setter Property="Foreground" Value="#FFFFFFFF"/>
|
<Setter Property="Foreground" Value="#FFFFFFFF"/>
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
</Style>
|
</Style>
|
||||||
<SolidColorBrush x:Key="ItemSelectedBackgroundColor">#356ef3</SolidColorBrush>
|
<SolidColorBrush x:Key="ItemSelectedBackgroundColor">#356ef3</SolidColorBrush>
|
||||||
|
|
||||||
<!-- button style in the middle of the scrollbar -->
|
<!-- button style in the middle of the scrollbar -->
|
||||||
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
||||||
|
<Setter Property="Template">
|
||||||
|
<Setter.Value>
|
||||||
|
<ControlTemplate TargetType="{x:Type Thumb}">
|
||||||
|
<Border CornerRadius="2" DockPanel.Dock="Right" Background="#FFFFFF" Opacity="0.5" BorderBrush="Transparent" BorderThickness="0" />
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}">
|
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}">
|
||||||
<Setter Property="Background" Value="#a0a0a0"/>
|
<Setter Property="Background" Value="#a0a0a0"/>
|
||||||
</Style>
|
</Style>
|
||||||
|
<Style x:Key="SearchIconStyle" TargetType="{x:Type Path}" BasedOn="{StaticResource BaseSearchIconStyle}">
|
||||||
|
<Setter Property="Fill" Value="#ffffff" />
|
||||||
|
<Setter Property="Width" Value="32" />
|
||||||
|
<Setter Property="Height" Value="32" />
|
||||||
|
<Setter Property="Opacity" Value="0.2" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeyStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
<Setter Property="Foreground" Value="#ffffff" />
|
||||||
|
<Setter Property="Opacity" Value="0.2" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeySelectedStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
<Setter Property="Foreground" Value="#ffffff" />
|
||||||
|
<Setter Property="Opacity" Value="0.2" />
|
||||||
|
</Style>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,9 @@
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
|
||||||
<system:Boolean x:Key="ThemeBlurEnabled">True</system:Boolean>
|
<system:Boolean x:Key="ThemeBlurEnabled">True</system:Boolean>
|
||||||
|
<Style x:Key="ItemGlyph" BasedOn="{StaticResource BaseGlyphStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#ffffff" />
|
||||||
|
</Style>
|
||||||
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
<Setter Property="Foreground" Value="#FFFFFFFF" />
|
<Setter Property="Foreground" Value="#FFFFFFFF" />
|
||||||
<Setter Property="Background" Value="Transparent" />
|
<Setter Property="Background" Value="Transparent" />
|
||||||
|
|
@ -19,7 +21,7 @@
|
||||||
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
||||||
<Setter Property="Background">
|
<Setter Property="Background">
|
||||||
<Setter.Value>
|
<Setter.Value>
|
||||||
<SolidColorBrush Color="Black" Opacity="0.3"/>
|
<SolidColorBrush Color="Black" Opacity="0.7"/>
|
||||||
</Setter.Value>
|
</Setter.Value>
|
||||||
</Setter>
|
</Setter>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
@ -33,6 +35,7 @@
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}">
|
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}">
|
||||||
|
<Setter Property="Stroke" Value="White" />
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<!-- Item Style -->
|
<!-- Item Style -->
|
||||||
|
|
@ -54,9 +57,32 @@
|
||||||
|
|
||||||
<!-- button style in the middle of the scrollbar -->
|
<!-- button style in the middle of the scrollbar -->
|
||||||
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
||||||
|
<Setter Property="Template">
|
||||||
|
<Setter.Value>
|
||||||
|
<ControlTemplate TargetType="{x:Type Thumb}">
|
||||||
|
<Border CornerRadius="2" DockPanel.Dock="Right" Background="#ffffff" Opacity="0.5" BorderBrush="Transparent" BorderThickness="0" />
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}">
|
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}">
|
||||||
<Setter Property="Background" Value="#a0a0a0"/>
|
<Setter Property="Background" Value="#a0a0a0"/>
|
||||||
</Style>
|
</Style>
|
||||||
</ResourceDictionary>
|
<Style x:Key="SearchIconStyle" TargetType="{x:Type Path}" BasedOn="{StaticResource BaseSearchIconStyle}">
|
||||||
|
<Setter Property="Fill" Value="#ffffff" />
|
||||||
|
<Setter Property="Width" Value="32" />
|
||||||
|
<Setter Property="Height" Value="32" />
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeyStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
<Setter Property="Foreground" Value="#ffffff" />
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeySelectedStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
<Setter Property="Foreground" Value="#ffffff" />
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
|
</Style>
|
||||||
|
</ResourceDictionary>
|
||||||
|
|
@ -6,7 +6,9 @@
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
|
||||||
<system:Boolean x:Key="ThemeBlurEnabled">True</system:Boolean>
|
<system:Boolean x:Key="ThemeBlurEnabled">True</system:Boolean>
|
||||||
|
<Style x:Key="ItemGlyph" BasedOn="{StaticResource BaseGlyphStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#FF000000" />
|
||||||
|
</Style>
|
||||||
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
<Setter Property="Foreground" Value="#FF000000" />
|
<Setter Property="Foreground" Value="#FF000000" />
|
||||||
<Setter Property="Background" Value="Transparent" />
|
<Setter Property="Background" Value="Transparent" />
|
||||||
|
|
@ -52,9 +54,31 @@
|
||||||
|
|
||||||
<!-- button style in the middle of the scrollbar -->
|
<!-- button style in the middle of the scrollbar -->
|
||||||
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
||||||
|
<Setter Property="Template">
|
||||||
|
<Setter.Value>
|
||||||
|
<ControlTemplate TargetType="{x:Type Thumb}">
|
||||||
|
<Border CornerRadius="2" DockPanel.Dock="Right" Background="#FFFFFF" BorderBrush="Transparent" BorderThickness="0" />
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}">
|
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}">
|
||||||
<Setter Property="Background" Value="#a0a0a0"/>
|
<Setter Property="Background" Value="#a0a0a0"/>
|
||||||
</Style>
|
</Style>
|
||||||
|
<Style x:Key="SearchIconStyle" TargetType="{x:Type Path}" BasedOn="{StaticResource BaseSearchIconStyle}">
|
||||||
|
<Setter Property="Fill" Value="#000000" />
|
||||||
|
<Setter Property="Width" Value="32" />
|
||||||
|
<Setter Property="Height" Value="32" />
|
||||||
|
<Setter Property="Opacity" Value="0.2" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeyStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
<Setter Property="Foreground" Value="#000000" />
|
||||||
|
<Setter Property="Opacity" Value="0.2" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeySelectedStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
<Setter Property="Foreground" Value="#000000" />
|
||||||
|
<Setter Property="Opacity" Value="0.2" />
|
||||||
|
</Style>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
|
||||||
95
Flow.Launcher/Themes/Darker Glass.xaml
Normal file
95
Flow.Launcher/Themes/Darker Glass.xaml
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
<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">
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/Themes/Base.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
|
||||||
|
<Style x:Key="ItemGlyph" BasedOn="{StaticResource BaseGlyphStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#ebebeb" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="Foreground" Value="#ebebeb" />
|
||||||
|
<Setter Property="Background" Value="Transparent" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="QuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="Foreground" Value="Transparent" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
||||||
|
<Setter Property="CornerRadius" Value="5" />
|
||||||
|
<Setter Property="BorderThickness" Value="1 1 0 0" />
|
||||||
|
<Setter Property="BorderBrush" Value="#666666" />
|
||||||
|
<Setter Property="Background">
|
||||||
|
<Setter.Value>
|
||||||
|
<SolidColorBrush Color="#333333" Opacity="0.95"/>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="WindowStyle" BasedOn="{StaticResource BaseWindowStyle}" TargetType="{x:Type Window}">
|
||||||
|
<Setter Property="Background">
|
||||||
|
<Setter.Value>
|
||||||
|
<SolidColorBrush Color="White" Opacity="0.5"/>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}">
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<!-- Item Style -->
|
||||||
|
<Style x:Key="ItemTitleStyle" BasedOn="{StaticResource BaseItemTitleStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Margin" Value="0, -10"/>
|
||||||
|
<Setter Property="Foreground" Value="#ebebeb"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Foreground" Value="#787878"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemTitleSelectedStyle" BasedOn="{StaticResource BaseItemTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Margin" Value="0, -10"/>
|
||||||
|
<Setter Property="Foreground" Value="#ffffff"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemSubTitleSelectedStyle" BasedOn="{StaticResource BaseItemSubTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Foreground" Value="#949494"/>
|
||||||
|
</Style>
|
||||||
|
<SolidColorBrush x:Key="ItemSelectedBackgroundColor">#545454</SolidColorBrush>
|
||||||
|
|
||||||
|
<!-- button style in the middle of the scrollbar -->
|
||||||
|
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
||||||
|
<Setter Property="Template">
|
||||||
|
<Setter.Value>
|
||||||
|
<ControlTemplate TargetType="{x:Type Thumb}">
|
||||||
|
<Border CornerRadius="2" DockPanel.Dock="Right" Background="#525252" BorderBrush="Transparent" BorderThickness="0" />
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}">
|
||||||
|
<Setter Property="Background" Value="#a0a0a0"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="SearchIconStyle" TargetType="{x:Type Path}" BasedOn="{StaticResource BaseSearchIconStyle}">
|
||||||
|
<Setter Property="Fill" Value="#FFFFFF" />
|
||||||
|
<Setter Property="Width" Value="32" />
|
||||||
|
<Setter Property="Height" Value="32" />
|
||||||
|
<Setter Property="Opacity" Value="0.2" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="SeparatorStyle" BasedOn="{StaticResource BaseSeparatorStyle}" TargetType="{x:Type Rectangle}">
|
||||||
|
<Setter Property="Fill" Value="#787878"/>
|
||||||
|
<Setter Property="Height" Value="1"/>
|
||||||
|
<Setter Property="Margin" Value="0 0 0 8"/>
|
||||||
|
<Setter Property="Opacity" Value="0.3" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeyStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
<Setter Property="Foreground" Value="#787878" />
|
||||||
|
<Setter Property="Opacity" Value="0.1" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeySelectedStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
<Setter Property="Foreground" Value="#787878" />
|
||||||
|
<Setter Property="Opacity" Value="0.1" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
</ResourceDictionary>
|
||||||
|
|
@ -4,20 +4,23 @@
|
||||||
<ResourceDictionary.MergedDictionaries>
|
<ResourceDictionary.MergedDictionaries>
|
||||||
<ResourceDictionary Source="pack://application:,,,/Themes/Base.xaml" />
|
<ResourceDictionary Source="pack://application:,,,/Themes/Base.xaml" />
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
<Style x:Key="ItemGlyph" BasedOn="{StaticResource BaseGlyphStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#ffffff" />
|
||||||
|
</Style>
|
||||||
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="SelectionBrush" Value="#6e6e6e"/>
|
||||||
<Setter Property="SelectionBrush" Value="#4D4D4D"/>
|
<Setter Property="SelectionBrush" Value="#4D4D4D"/>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="QuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}" TargetType="{x:Type TextBox}"/>
|
<Style x:Key="QuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="Foreground" Value="#8f8f8f" />
|
||||||
|
</Style>
|
||||||
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="WindowStyle" BasedOn="{StaticResource BaseWindowStyle}" TargetType="{x:Type Window}">
|
<Style x:Key="WindowStyle" BasedOn="{StaticResource BaseWindowStyle}" TargetType="{x:Type Window}">
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}">
|
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}">
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
|
|
@ -25,18 +28,20 @@
|
||||||
<Style x:Key="ItemTitleStyle" BasedOn="{StaticResource BaseItemTitleStyle}" TargetType="{x:Type TextBlock}">
|
<Style x:Key="ItemTitleStyle" BasedOn="{StaticResource BaseItemTitleStyle}" TargetType="{x:Type TextBlock}">
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}" >
|
<Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Foreground" Value="#8f8f8f" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="ItemTitleSelectedStyle" BasedOn="{StaticResource BaseItemTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
<Style x:Key="ItemTitleSelectedStyle" BasedOn="{StaticResource BaseItemTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
<Setter Property="Cursor" Value="Arrow" />
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="ItemSubTitleSelectedStyle" BasedOn="{StaticResource BaseItemSubTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
<Style x:Key="ItemSubTitleSelectedStyle" BasedOn="{StaticResource BaseItemSubTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Foreground" Value="#8f8f8f" />
|
||||||
<Setter Property="Cursor" Value="Arrow" />
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
</Style>
|
</Style>
|
||||||
|
<SolidColorBrush x:Key="ItemSelectedBackgroundColor">#4d4d4d</SolidColorBrush>
|
||||||
<Style x:Key="ItemImageSelectedStyle" BasedOn="{StaticResource BaseItemImageSelectedStyle}" TargetType="{x:Type Image}" >
|
<Style x:Key="ItemImageSelectedStyle" BasedOn="{StaticResource BaseItemImageSelectedStyle}" TargetType="{x:Type Image}" >
|
||||||
<Setter Property="Cursor" Value="Arrow" />
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<!-- button style in the middle of the scrollbar -->
|
<!-- button style in the middle of the scrollbar -->
|
||||||
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
||||||
</Style>
|
</Style>
|
||||||
|
|
|
||||||
103
Flow.Launcher/Themes/Discord Dark.xaml
Normal file
103
Flow.Launcher/Themes/Discord Dark.xaml
Normal file
|
|
@ -0,0 +1,103 @@
|
||||||
|
<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">
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/Themes/Base.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
<Style x:Key="ItemGlyph" BasedOn="{StaticResource BaseGlyphStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#ffffff" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="Foreground" Value="#dcddde" />
|
||||||
|
<Setter Property="Background" Value="#36393f" />
|
||||||
|
<Setter Property="CaretBrush" Value="#ffffff" />
|
||||||
|
<Setter Property="SelectionBrush" Value="#0a68d8"/>
|
||||||
|
<Setter Property="Height" Value="42" />
|
||||||
|
<Setter Property="FontSize" Value="24" />
|
||||||
|
<Setter Property="Padding" Value="0 0 66 0" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="QuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="Foreground" Value="#72767d" />
|
||||||
|
<Setter Property="Background" Value="#36393f" />
|
||||||
|
<Setter Property="Height" Value="42" />
|
||||||
|
<Setter Property="FontSize" Value="24" />
|
||||||
|
<Setter Property="Padding" Value="0 0 66 0" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
||||||
|
<Setter Property="BorderThickness" Value="2" />
|
||||||
|
<Setter Property="BorderBrush" Value="#2f3136" />
|
||||||
|
<Setter Property="CornerRadius" Value="4" />
|
||||||
|
<Setter Property="Background" Value="#36393f" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="WindowStyle" BasedOn="{StaticResource BaseWindowStyle}" TargetType="{x:Type Window}">
|
||||||
|
<Setter Property="Width" Value="576" />
|
||||||
|
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}">
|
||||||
|
<Setter Property="Stroke" Value="#ffffff" />
|
||||||
|
<Setter Property="Opacity" Value="0.6" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<!-- Item Style -->
|
||||||
|
<Style x:Key="ItemTitleStyle" BasedOn="{StaticResource BaseItemTitleStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#dcddde" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Foreground" Value="#72767d" />
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemNumberStyle" BasedOn="{StaticResource BaseItemNumberStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#A6A6A6" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemTitleSelectedStyle" BasedOn="{StaticResource BaseItemTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
|
<Setter Property="Foreground" Value="#32bd6a" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemSubTitleSelectedStyle" BasedOn="{StaticResource BaseItemSubTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
|
<Setter Property="Foreground" Value="#72767d" />
|
||||||
|
</Style>
|
||||||
|
<SolidColorBrush x:Key="ItemSelectedBackgroundColor">#49443c</SolidColorBrush>
|
||||||
|
<Style x:Key="ItemImageSelectedStyle" BasedOn="{StaticResource BaseItemImageSelectedStyle}" TargetType="{x:Type Image}" >
|
||||||
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="HighlightStyle">
|
||||||
|
<Setter Property="Inline.FontWeight" Value="Bold" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeyStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="15" />
|
||||||
|
<Setter Property="Foreground" Value="#72767d" />
|
||||||
|
<Setter Property="Opacity" Value="0.8" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeySelectedStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="15" />
|
||||||
|
<Setter Property="Foreground" Value="#72767d" />
|
||||||
|
<Setter Property="Opacity" Value="0.8" />
|
||||||
|
</Style>
|
||||||
|
<!-- button style in the middle of the scrollbar -->
|
||||||
|
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
||||||
|
<Setter Property="SnapsToDevicePixels" Value="True"/>
|
||||||
|
<Setter Property="OverridesDefaultStyle" Value="true"/>
|
||||||
|
<Setter Property="IsTabStop" Value="false"/>
|
||||||
|
<Setter Property="Focusable" Value="false"/>
|
||||||
|
<Setter Property="Template">
|
||||||
|
<Setter.Value>
|
||||||
|
<ControlTemplate TargetType="{x:Type Thumb}">
|
||||||
|
<Border CornerRadius="2" DockPanel.Dock="Right" Background="#202225" BorderBrush="Transparent" BorderThickness="0" />
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}">
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="SeparatorStyle" BasedOn="{StaticResource BaseSeparatorStyle}" TargetType="{x:Type Rectangle}">
|
||||||
|
<Setter Property="Fill" Value="#42454a"/>
|
||||||
|
<Setter Property="Height" Value="1"/>
|
||||||
|
<Setter Property="Margin" Value="12 0 12 8"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="SearchIconStyle" TargetType="{x:Type Path}" BasedOn="{StaticResource BaseSearchIconStyle}">
|
||||||
|
<Setter Property="Fill" Value="#42454a" />
|
||||||
|
<Setter Property="Width" Value="32" />
|
||||||
|
<Setter Property="Height" Value="32" />
|
||||||
|
</Style>
|
||||||
|
</ResourceDictionary>
|
||||||
103
Flow.Launcher/Themes/Dracula.xaml
Normal file
103
Flow.Launcher/Themes/Dracula.xaml
Normal file
|
|
@ -0,0 +1,103 @@
|
||||||
|
<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">
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/Themes/Base.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
<Style x:Key="ItemGlyph" BasedOn="{StaticResource BaseGlyphStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#f8f8f2" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="QueryBoxStyle" BasedOn="{StaticResource BaseQueryBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="SelectionBrush" Value="#ff79c6"/>
|
||||||
|
<Setter Property="FontSize" Value="24" />
|
||||||
|
<Setter Property="Background" Value="#282a36" />
|
||||||
|
<Setter Property="Foreground" Value="#f8f8f2" />
|
||||||
|
<Setter Property="CaretBrush" Value="#ffb86c" />
|
||||||
|
<Setter Property="FontSize" Value="26" />
|
||||||
|
<Setter Property="Padding" Value="0 4 66 0" />
|
||||||
|
<Setter Property="Height" Value="42" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="QuerySuggestionBoxStyle" BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}" TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="Background" Value="#282a36" />
|
||||||
|
<Setter Property="Foreground" Value="#6272a4" />
|
||||||
|
<Setter Property="FontSize" Value="26" />
|
||||||
|
<Setter Property="Padding" Value="0 4 66 0" />
|
||||||
|
<Setter Property="Height" Value="42" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}">
|
||||||
|
<Setter Property="BorderThickness" Value="2" />
|
||||||
|
<Setter Property="BorderBrush" Value="#44475a" />
|
||||||
|
<Setter Property="CornerRadius" Value="5" />
|
||||||
|
<Setter Property="Background" Value="#282a36" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="WindowStyle" BasedOn="{StaticResource BaseWindowStyle}" TargetType="{x:Type Window}">
|
||||||
|
<Setter Property="Width" Value="576" />
|
||||||
|
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="PendingLineStyle" BasedOn="{StaticResource BasePendingLineStyle}" TargetType="{x:Type Line}">
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<!-- Item Style -->
|
||||||
|
<Style x:Key="ItemTitleStyle" BasedOn="{StaticResource BaseItemTitleStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#f8f8f2" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Foreground" Value="#6272a4" />
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemNumberStyle" BasedOn="{StaticResource BaseItemNumberStyle}" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="Foreground" Value="#6272a4" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemTitleSelectedStyle" BasedOn="{StaticResource BaseItemTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
|
<Setter Property="Foreground" Value="#ff79c6" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemSubTitleSelectedStyle" BasedOn="{StaticResource BaseItemSubTitleSelectedStyle}" TargetType="{x:Type TextBlock}" >
|
||||||
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
|
<Setter Property="Foreground" Value="#6272a4" />
|
||||||
|
</Style>
|
||||||
|
<SolidColorBrush x:Key="ItemSelectedBackgroundColor">#44475a</SolidColorBrush>
|
||||||
|
<Style x:Key="ItemImageSelectedStyle" BasedOn="{StaticResource BaseItemImageSelectedStyle}" TargetType="{x:Type Image}" >
|
||||||
|
<Setter Property="Cursor" Value="Arrow" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="HighlightStyle">
|
||||||
|
<Setter Property="Inline.Foreground" Value="#bd93f9" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeyStyle" TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
<Setter Property="Foreground" Value="#6272a4" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ItemHotkeySelectedStyle" TargetType="{x:Type TextBlock}" BasedOn="{StaticResource BaseItemHotkeySelecetedStyle}">
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
<Setter Property="Foreground" Value="#ff79c6" />
|
||||||
|
</Style>
|
||||||
|
<!-- button style in the middle of the scrollbar -->
|
||||||
|
<Style x:Key="ThumbStyle" BasedOn="{StaticResource BaseThumbStyle}" TargetType="{x:Type Thumb}">
|
||||||
|
<Setter Property="SnapsToDevicePixels" Value="True"/>
|
||||||
|
<Setter Property="OverridesDefaultStyle" Value="true"/>
|
||||||
|
<Setter Property="IsTabStop" Value="false"/>
|
||||||
|
<Setter Property="Width" Value="2"/>
|
||||||
|
<Setter Property="Focusable" Value="false"/>
|
||||||
|
<Setter Property="Template">
|
||||||
|
<Setter.Value>
|
||||||
|
<ControlTemplate TargetType="{x:Type Thumb}">
|
||||||
|
<Border CornerRadius="2" DockPanel.Dock="Right" Background="#44475a" BorderBrush="Transparent" BorderThickness="0" />
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ScrollBarStyle" BasedOn="{StaticResource BaseScrollBarStyle}" TargetType="{x:Type ScrollBar}">
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="SeparatorStyle" BasedOn="{StaticResource BaseSeparatorStyle}" TargetType="{x:Type Rectangle}">
|
||||||
|
<Setter Property="Fill" Value="#44475a"/>
|
||||||
|
<Setter Property="Height" Value="1"/>
|
||||||
|
<Setter Property="Margin" Value="12 0 12 8"/>
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="SearchIconStyle" TargetType="{x:Type Path}" BasedOn="{StaticResource BaseSearchIconStyle}">
|
||||||
|
<Setter Property="Fill" Value="#6272a4" />
|
||||||
|
<Setter Property="Width" Value="32" />
|
||||||
|
<Setter Property="Height" Value="32" />
|
||||||
|
<Setter Property="Opacity" Value="0.8" />
|
||||||
|
</Style>
|
||||||
|
</ResourceDictionary>
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue