Merge pull request #2 from microsoft/master

Update with latest changes
This commit is contained in:
Den Delimarsky 2021-04-20 07:28:00 -07:00 committed by GitHub
commit c13840b114
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
150 changed files with 2723 additions and 2209 deletions

View file

@ -1,11 +1,8 @@
name: "🐛 Bug report"
description: Report errors or unexpected behavior
title: ''
labels:
- Issue-Bug
- Triage-Needed
assignees: ''
issue_body: true
body:
- type: markdown
attributes:
@ -56,7 +53,7 @@ body:
- type: textarea
attributes:
label: Steps to reproduce
description: We highly suggest including a screenshots and a bug report log (System tray->Report bug). To include, paste them into the markdown editor below the form or follow up with a separate comment.
description: We highly suggest including a screenshots and a bug report log (System tray->Report bug).
placeholder: Tell us the steps required to trigger your bug.
validations:
required: true

View file

@ -1,14 +0,0 @@
---
name: "\U0001F4DA Documentation Issue"
about: Report issues in our documentation
title: ''
labels: Issue-Docs,Triage-Needed
assignees: ''
---
<!-- Briefly describe which document needs to be corrected and why. -->
## 📝 Provide a description of requested docs changes
_What is the purpose and what should be changed?_

View file

@ -0,0 +1,12 @@
name: "📚 Documentation Issue"
description: Report issues in our documentation
labels:
- Issue-Docs
- Triage-Needed
body:
- type: textarea
attributes:
label: Provide a description of requested docs changes
placeholder: Briefly describe which document needs to be corrected and why.
validations:
required: true

View file

@ -1,22 +1,19 @@
name: "🌐 Localization/Translation issue"
description: Report incorrect translations.
title: ''
labels:
- Issue-Bug
- Area-Localization
- Issue-Translation
- Triage-Needed
assignees: ''
issue_body: true
body:
- type: markdown
attributes:
value: |
Please make sure to [search for existing issues](https://github.com/microsoft/PowerTOys/issues) before filing a new one!
Please make sure to [search for existing issues](https://github.com/microsoft/PowerToys/issues) before filing a new one!
- type: input
attributes:
label: Microsoft PowerToys version
placeholder: "0.33.1"
placeholder: "0.35.0"
description: |
Hover over system tray icon or look at Settings
validations:
@ -24,8 +21,6 @@ body:
- type: dropdown
attributes:
label: Utility with translation issue
description: |
Please include a screenshot as that is extremely helpful. To include, paste them into the markdown editor below the form or follow up with a separate comment.
options:
- General
- ColorPicker
@ -54,7 +49,7 @@ body:
- type: textarea
attributes:
label: ❌ Actual phrase(s)
placeholder: What is there?
placeholder: What is there? Please include a screenshot as that is extremely helpful.
validations:
required: true
- type: textarea

View file

@ -192,6 +192,7 @@ buildtransitive
BValue
bytearray
callbackptr
capitalized
CANRENAME
Captureascreenshot
CAPTURECHANGED
@ -1585,6 +1586,8 @@ pguid
phbm
phbmp
Phishing
php
phptest
phwnd
pici
pid
@ -1700,6 +1703,7 @@ pwcs
PWSTR
pwtd
px
py
Qand
QI
qianlifeng
@ -1825,6 +1829,7 @@ runsettings
runtimeclass
runtimeconfig
runtimes
rutkas
rv
rvalue
rvm

View file

@ -32,14 +32,12 @@ Microsoft PowerToys is a set of utilities for power users to tune and streamline
#### Stable version
Install from the [Microsoft PowerToys GitHub releases page][github-release-link]. Click on `Assets` to show the files available in the release and then click on `PowerToysSetup-0.33.1-x64.exe` to download the PowerToys installer.
Install from the [Microsoft PowerToys GitHub releases page][github-release-link]. Click on `Assets` to show the files available in the release and then click on `PowerToysSetup-0.35.0-x64.exe` to download the PowerToys installer.
This is our preferred method.
#### Experimental version
To install the Video Conference mute, please use the [v0.28 pre-release experimental version of PowerToys][github-prerelease-link] to try out this version. It includes all improvements from v0.27 in addition to the Video conference utility. Click on `Assets` to show the files available in the release and then download the .exe installer.
We hope to have an updated version in February 2021 with the new DirectShow driver.
To install the Video Conference mute, please use the [v0.36 experimental version of PowerToys][github-prerelease-link] to try out this version. It includes all improvements from v0.35 in addition to the Video conference utility. Click on `Assets` to show the files available in the release and then download the .exe installer.
### Via WinGet (Preview)
Download PowerToys from [WinGet](https://github.com/microsoft/winget-cli#installing-the-client). To install PowerToys, run the following command from the command line / PowerShell:
@ -78,7 +76,9 @@ Our [prioritized roadmap][roadmap] of features and utilities that the core team
### 0.35 - March 2021 Update
Our goals for the [v0.35 release cycle][github-release-link] were to add in new functionality to support quick swapping layouts for FancyZones, wrap up work for the DirectShow migration for Video Conference Mute so we can migrate into the main dev branch as well as fixing bugs. The 0.36 experimental release will happen the week of April 5th toward the end of the week pending testing. Throughout these efforts, we continue working towards stability across all PowerToys utilities.
Our goals for the [v0.35 release cycle][github-release-link] were to add in new functionality to support quick swapping layouts for FancyZones, wrap up work for the DirectShow migration for Video Conference Mute so we can migrate into the main dev branch as well as fixing bugs.
The 0.36 experimental release was released as well which includes Video Conference Mute.
Our [prioritized roadmap][roadmap] of features and utilities will dictate what the core team is focusing on for the near future.
@ -166,4 +166,4 @@ The application logs basic telemetry. Our Telemetry Data page (Coming Soon) has
<!-- items that need to be updated release to release -->
[github-next-release-work]: https://github.com/microsoft/PowerToys/issues?q=is%3Aopen+is%3Aissue+project%3Amicrosoft%2FPowerToys%2F19
[github-prerelease-link]: https://github.com/microsoft/PowerToys/releases/tag/v0.28.0
[github-prerelease-link]: https://github.com/microsoft/PowerToys/releases/tag/v0.36.0

View file

@ -0,0 +1,30 @@
# New plugin checklist
- [ ] The plugin is a project under `modules\launcher\Plugins`
- [ ] Microsoft plugin project name pattern: `Microsoft.PowerToys.Run.Plugin.{PluginName}`
- [ ] Community plugin project name pattern: `Community.PowerToys.Run.Plugin.{PluginName}`
- [ ] [`GlobalSuppressions.cs`](/src/codeAnalysis/GlobalSuppressions.cs) and [`StyleCop.json`](/src/codeAnalysis/StyleCop.json) have to be included in the plugin project so it follows PowerToys code guidelines
- [ ] The plugin has to have `{PowerToys version}.0` version
- [ ] Make sure `*.csproj` specify only x64 platform target
- [ ] The plugin has to contain a `plugin.json` file of the following format in its root folder
```
{
"ID": string, // GUID string
"ActionKeyword": string, // Direct activation phrase
"IsGlobal": boolean,
"Name": string, // Has to be unique, same as 'PluginName' in the project name pattern
"Author": string,
"Version": "1.0.0", // For future compatibility
"Language": "csharp", // So far we support only csharp
"Website": "https://aka.ms/powertoys",
"ExecuteFileName": string, // Should be {Type}.PowerToys.Run.Plugin.{PluginName}.dll
"IcoPathDark": string, // Path to dark theme icon. The path is relative to the root plugin folder
"IcoPathLight": string // Path to light theme icon. The path is relative to the root plugin folder
}
```
- [ ] Do not use plugin name or PowerToys as prefixes for entities inside of the plugin project
- [ ] The plugin has to have Unit tests. Use MSTest framework
- [ ] To enable localization add `LocProject.json` file to the plugin root folder. For details see [`localization.md`](/doc/devdocs/localization.md#enabling-localization-on-a-new-project)
- [ ] Plugin's output code and assets have to be included in the installer [`Product.wxs`](/installer/PowerToysSetup/Product.wxs)
- [ ] Test the plugin with a local build. Build the installer, install, check that the plugin works as expected
- [ ] All plugin's binaries have to be included in the signed build [`pipeline.user.windows.yml`](/.pipelines/pipeline.user.windows.yml)
- [ ] The plugin target framework has to be .NET Core 3.1. All dependencies have to have .NET 5 version

View file

@ -136,8 +136,9 @@ int Bootstrapper(HINSTANCE hInstance)
options.add_options()
("h,help", "Show help")
("no_full_ui", "Use reduced UI for MSI")
("s,silent", "Suppress MSI UI and notifications")
("s,silent", "Suppress all UI, notifications and does not start PowerToys")
("no_start_pt", "Do not launch PowerToys after the installation is complete")
("start_pt", "Always launch PowerToys after the installation is complete")
("skip_dotnet_install", "Skip dotnet 3.X installation even if it's not detected")
("log_level", "Log level. Possible values: off|debug|error", cxxopts::value<std::string>()->default_value("off"))
("log_dir", "Log directory", cxxopts::value<std::string>()->default_value("."))
@ -169,10 +170,11 @@ int Bootstrapper(HINSTANCE hInstance)
const bool noFullUI = cmdArgs["no_full_ui"].as<bool>();
const bool skipDotnetInstall = cmdArgs["skip_dotnet_install"].as<bool>();
const bool noStartPT = cmdArgs["no_start_pt"].as<bool>();
const bool startPT = cmdArgs["start_pt"].as<bool>();
const auto logLevel = cmdArgs["log_level"].as<std::string>();
const auto logDirArg = cmdArgs["log_dir"].as<std::string>();
const auto installDirArg = cmdArgs["install_dir"].as<std::string>();
const bool extract_msi_only = cmdArgs["extract_msi"].as<bool>();
const bool extractMsiOnly = cmdArgs["extract_msi"].as<bool>();
std::wstring installFolderProp;
if (!installDirArg.empty())
@ -216,7 +218,7 @@ int Bootstrapper(HINSTANCE hInstance)
}
SetupLogger(logDir, severity);
spdlog::debug("PowerToys Bootstrapper is launched\nnoFullUI: {}\nsilent: {}\nno_start_pt: {}\nskip_dotnet_install: {}\nlog_level: {}\ninstall_dir: {}\nextract_msi: {}\n", noFullUI, g_Silent, noStartPT, skipDotnetInstall, logLevel, installDirArg, extract_msi_only);
spdlog::debug("PowerToys Bootstrapper is launched\nnoFullUI: {}\nsilent: {}\nno_start_pt: {}\nskip_dotnet_install: {}\nlog_level: {}\ninstall_dir: {}\nextract_msi: {}\n", noFullUI, g_Silent, noStartPT, skipDotnetInstall, logLevel, installDirArg, extractMsiOnly);
const VersionHelper myVersion(VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION);
@ -229,7 +231,7 @@ int Bootstrapper(HINSTANCE hInstance)
}
// If a user requested an MSI -> extract it and exit
if (extract_msi_only)
if (extractMsiOnly)
{
if (const auto installerPath = ExtractEmbeddedInstaller(fs::current_path()))
{
@ -402,8 +404,6 @@ int Bootstrapper(HINSTANCE hInstance)
ShowMessageBoxError(IDS_DOTNET_INSTALL_ERROR);
}
CleanupSettingsFromOlderVersions();
// At this point, there's no reason to show progress bar window, since MSI installers have their own
CloseProgressBarDialog();
@ -418,7 +418,7 @@ int Bootstrapper(HINSTANCE hInstance)
spdlog::debug("Installation completed");
if (!noStartPT && !g_Silent)
if ((!noStartPT && !g_Silent) || startPT)
{
spdlog::debug("Starting the newly installed PowerToys.exe");
auto newPTPath = updating::get_msi_package_installed_path();

View file

@ -35,8 +35,8 @@
<Property Id="WINDOWSBUILDNUMBER" Secure="yes">
<RegistrySearch Id="BuildNumberSearch" Root="HKLM" Key="SOFTWARE\Microsoft\Windows NT\CurrentVersion" Name="CurrentBuildNumber" Type="raw" />
</Property>
<Condition Message="This application is only supported on Windows 10 version 1803 (build 17134) or higher.">
<![CDATA[(WINDOWSBUILDNUMBER >= 17134)]]>
<Condition Message="This application is only supported on Windows 10 version 1903 (build 18362) or higher.">
<![CDATA[(WINDOWSBUILDNUMBER >= 18362)]]>
</Condition>
<Icon Id="powertoys.exe" SourceFile="$(var.BinX64Dir)svgs\icon.ico"/>
@ -642,7 +642,7 @@
<File Source="$(var.BinX64Dir)Settings\PowerToys.Settings.exe"/>
<File Source="$(var.BinX64Dir)Settings\Microsoft.PowerToys.Settings.UI.exe"/>
<!-- dll -->
<?foreach File in concrt140_app.dll;Microsoft.Bcl.AsyncInterfaces.dll;System.IO.Abstractions.dll;Microsoft.PowerToys.Settings.UI.Lib.dll;PowerToys.Settings.dll;Microsoft.Toolkit.dll;Microsoft.Toolkit.Uwp.dll;Microsoft.Toolkit.Uwp.UI.dll;Microsoft.Toolkit.Win32.UI.XamlHost.dll;Microsoft.Toolkit.Win32.UI.XamlHost.Managed.dll;Microsoft.Toolkit.Wpf.UI.Controls.dll;Microsoft.Toolkit.Wpf.UI.XamlHost.dll;Microsoft.UI.Xaml.dll;Microsoft.Xaml.Interactions.dll;Microsoft.Xaml.Interactivity.dll;msvcp140_1_app.dll;msvcp140_2_app.dll;msvcp140_app.dll;Newtonsoft.Json.dll;PowerToysInterop.dll;System.Runtime.CompilerServices.Unsafe.dll;System.Text.Encodings.Web.dll;System.Text.Json.dll;vcamp140_app.dll;vccorlib140_app.dll;vcomp140_app.dll;vcruntime140_1_app.dll;vcruntime140_app.dll;ManagedTelemetry.dll;ManagedCommon.dll?>
<?foreach File in concrt140_app.dll;Microsoft.Bcl.AsyncInterfaces.dll;System.IO.Abstractions.dll;Microsoft.PowerToys.Settings.UI.Lib.dll;PowerToys.Settings.dll;Microsoft.Toolkit.dll;Microsoft.Toolkit.Uwp.dll;Microsoft.Toolkit.Uwp.UI.dll;Microsoft.Toolkit.Win32.UI.XamlHost.dll;Microsoft.Toolkit.Win32.UI.XamlHost.Managed.dll;Microsoft.Toolkit.Wpf.UI.Controls.dll;Microsoft.Toolkit.Wpf.UI.XamlHost.dll;Microsoft.UI.Xaml.dll;Microsoft.Xaml.Interactions.dll;Microsoft.Xaml.Interactivity.dll;msvcp140_1_app.dll;msvcp140_2_app.dll;msvcp140_app.dll;Newtonsoft.Json.dll;PowerToysInterop.dll;System.Runtime.CompilerServices.Unsafe.dll;System.Text.Encodings.Web.dll;System.Text.Json.dll;vcamp140_app.dll;vccorlib140_app.dll;vcomp140_app.dll;vcruntime140_1_app.dll;vcruntime140_app.dll;ManagedTelemetry.dll;ManagedCommon.dll;ColorCode.Core.dll;ColorCode.UWP.dll;Microsoft.Graphics.Canvas.winmd;Microsoft.Toolkit.Parsers.dll;Microsoft.Toolkit.Uwp.UI.Animations.dll;Microsoft.Toolkit.Uwp.UI.Controls.dll?>
<File Id="SettingsV2_$(var.File)" Source="$(var.BinX64Dir)Settings\$(var.File)" />
<?endforeach?>
<!-- json -->

View file

@ -87,6 +87,7 @@
<ClInclude Include="KeyboardHook.h" />
<ClInclude Include="pch.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="shared_constants.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="Generated Files\AssemblyInfo.cpp" />

View file

@ -27,6 +27,9 @@
<ClInclude Include="resource.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="shared_constants.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="interop.cpp">

View file

@ -22,9 +22,6 @@ namespace Microsoft.Interop.Tests
[TestInitialize]
public void Initialize()
{
// Make sure we don't crash
Assert.IsTrue(CommonManaged.ShouldNewSettingsBeUsed() == CommonManaged.ShouldNewSettingsBeUsed());
ClientPipe = new TwoWayPipeMessageIPCManaged(ClientSidePipe, ServerSidePipe, null);
}

View file

@ -122,11 +122,6 @@ public
static String ^ GetProductVersion() {
return gcnew String(get_product_version().c_str());
}
static bool ShouldNewSettingsBeUsed()
{
return UseNewSettings();
}
};
public
@ -160,5 +155,9 @@ public
static String ^ ShowShortcutGuideSharedEvent() {
return gcnew String(CommonSharedConstants::SHOW_SHORTCUT_GUIDE_SHARED_EVENT);
}
static String ^ KeyboardManagerConfigFileMutexName() {
return gcnew String(CommonSharedConstants::KEYBOARD_MANAGER_CONFIG_FILE_MUTEX_NAME);
}
};
}

View file

@ -27,4 +27,7 @@ namespace CommonSharedConstants
// Max DWORD for key code to disable keys.
const int VK_DISABLED = 0x100;
}
// Name of the mutex which controls access to the configuration file for Keyboard Manager
const wchar_t KEYBOARD_MANAGER_CONFIG_FILE_MUTEX_NAME[] = L"Local\\PowerToys_KeyboardManager_ConfigFileMutex";
}

View file

@ -10,7 +10,6 @@
#include <common/notifications/notifications.h>
#include <common/SettingsAPI/settings_helpers.h>
#include <common/utils/json.h>
#include <common/utils/os-detect.h>
namespace // Strings in this namespace should not be localized
{
@ -77,9 +76,6 @@ namespace updating
const VersionHelper current_version(VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION);
VersionHelper github_version = current_version;
// On a <1903 system, block updates to 0.36+
const bool blockNonPatchReleases = current_version.major == 0 && current_version.minor == 35 && !Is19H1OrHigher();
if (prerelease)
{
const auto body = co_await client.request(Uri{ ALL_RELEASES_ENDPOINT });
@ -108,11 +104,6 @@ namespace updating
}
}
if (blockNonPatchReleases && github_version >= VersionHelper{ 0, 36, 0 })
{
co_return version_up_to_date{};
}
if (github_version <= current_version)
{
co_return version_up_to_date{};

View file

@ -10,17 +10,13 @@
namespace
{
constexpr inline wchar_t POWERTOYS_MSI_MUTEX_NAME[] = L"Local\\PowerToyRunMutex";
constexpr inline wchar_t POWERTOYS_MSIX_MUTEX_NAME[] = L"Local\\PowerToyMSIXRunMutex";
constexpr inline wchar_t POWERTOYS_BOOTSTRAPPER_MUTEX_NAME[] = L"PowerToysBootstrapperMutex";
constexpr inline wchar_t POWERTOYS_MSI_MUTEX_NAME[] = L"Local\\PowerToys_Runner_MSI_InstanceMutex";
constexpr inline wchar_t POWERTOYS_MSIX_MUTEX_NAME[] = L"Local\\PowerToys_Runner_MSIX_InstanceMutex";
constexpr inline wchar_t POWERTOYS_BOOTSTRAPPER_MUTEX_NAME[] = L"Local\\PowerToys_Bootstrapper_InstanceMutex";
}
inline wil::unique_mutex_nothrow createAppMutex(std::wstring mutexName)
inline wil::unique_mutex_nothrow createAppMutex(const std::wstring& mutexName)
{
wchar_t username[UNLEN + 1];
DWORD username_length = UNLEN + 1;
GetUserNameW(username, &username_length);
mutexName += username;
wil::unique_mutex_nothrow result{ CreateMutexW(nullptr, TRUE, mutexName.c_str()) };
return GetLastError() == ERROR_ALREADY_EXISTS ? wil::unique_mutex_nothrow{} : std::move(result);

View file

@ -28,13 +28,40 @@ namespace LoggerHelpers
return false;
}
inline bool dir_exists(std::filesystem::path dir)
{
std::error_code err;
auto entry = std::filesystem::directory_entry(dir, err);
if (err.value())
{
Logger::error("Failed to create directory entry. {}", err.message());
return false;
}
return entry.exists();
}
inline bool delete_other_versions_log_folders(std::wstring_view appPath, const std::filesystem::path& currentVersionLogFolder)
{
bool result = true;
std::filesystem::path logFolderPath(appPath);
logFolderPath.append(LogSettings::logPath);
for (const auto& dir : std::filesystem::directory_iterator(logFolderPath))
if (!dir_exists(logFolderPath))
{
Logger::trace("Directory {} does not exist", logFolderPath.string());
return true;
}
std::error_code err;
auto folders = std::filesystem::directory_iterator(logFolderPath, err);
if (err.value())
{
Logger::error("Failed to create directory iterator for {}. {}", logFolderPath.string(), err.message());
return false;
}
for (const auto& dir : folders)
{
if (dir != currentVersionLogFolder)
{

View file

@ -6,7 +6,6 @@
#include "Generated Files/resource.h"
#include <common/logger/logger.h>
#include <common/SettingsAPI/settings_objects.h>
#include <common/utils/os-detect.h>
#include <common/utils/resources.h>
#include <colorPicker/ColorPicker/ColorPickerConstants.h>
@ -227,12 +226,8 @@ public:
{
ResetEvent(send_telemetry_event);
ResetEvent(m_hInvokeEvent);
// use only with new settings?
if (UseNewSettings())
{
launch_process();
m_enabled = true;
}
launch_process();
m_enabled = true;
};
virtual void disable()

View file

@ -54,7 +54,7 @@ namespace ColorPicker.Helpers
}
}
public void EndUserSession()
public bool EndUserSession()
{
lock (_colorPickerVisibilityLock)
{
@ -70,7 +70,11 @@ namespace ColorPicker.Helpers
}
SessionEventHelper.End();
return true;
}
return false;
}
}

View file

@ -72,7 +72,7 @@ namespace ColorPicker.Keyboard
// ESC pressed
if (virtualCode == KeyInterop.VirtualKeyFromKey(Key.Escape))
{
_appStateHandler.EndUserSession();
e.Handled = _appStateHandler.EndUserSession();
return;
}

View file

@ -65,13 +65,13 @@
</AdditionalFiles>
</ItemGroup>
<ItemGroup>
<PackageReference Include="ModernWpfUI" Version="0.9.3" />
<PackageReference Include="ModernWpfUI" Version="0.9.4" />
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="System.IO.Abstractions" Version="12.2.5" />
<PackageReference Include="System.Text.Json" Version="5.0.1" />
<PackageReference Include="System.Text.Json" Version="5.0.2" />
</ItemGroup>
<ItemGroup>
<Resource Include="images\FancyZonesEditor.ico" />

View file

@ -2,16 +2,16 @@
x:Name="MainWindow1"
AutomationProperties.Name="{x:Static props:Resources.Fancy_Zones_Main_Editor}"
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:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="http://schemas.modernwpf.com/2019"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:FancyZonesEditor"
xmlns:Converters="clr-namespace:FancyZonesEditor.Converters"
xmlns:props="clr-namespace:FancyZonesEditor.Properties"
xmlns:local1="clr-namespace:FancyZonesEditor.ViewModels"
xmlns:ui="http://schemas.modernwpf.com/2019"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:controls="clr-namespace:ModernWpf.Controls;assembly=ModernWpf"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="FancyZones Editor"
ui:WindowHelper.UseModernWindowStyle="True"
@ -84,18 +84,17 @@
</StackPanel>
</ToolTip>
</Border.ToolTip>
<StackPanel Orientation="Vertical" VerticalAlignment="Center">
<TextBlock Name="IndexText"
TextTrimming="CharacterEllipsis"
Text="{Binding Index}"
FontSize="26"
Grid.Row="0"
FontWeight="SemiBold"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{DynamicResource PrimaryForegroundBrush}" />
<StackPanel Orientation="Vertical"
VerticalAlignment="Center">
<TextBlock Name="IndexText"
TextTrimming="CharacterEllipsis"
Text="{Binding Index}"
FontSize="26"
Grid.Row="0"
FontWeight="SemiBold"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{DynamicResource PrimaryForegroundBrush}" />
<TextBlock Name="ResolutionText"
TextTrimming="CharacterEllipsis"
Text="{Binding Dimensions}"
@ -125,6 +124,9 @@
</DataTemplate.Triggers>
</DataTemplate>
<DataTemplate x:Key="LayoutItemTemplate">
<Grid Background="Transparent"
Width="216"
@ -204,7 +206,7 @@
<Setter TargetName="LayoutItem"
Property="BorderBrush"
Value="{DynamicResource LayoutItemBorderPointerOverBrush}" />
<Setter TargetName="EditLayoutButton"
Property="Foreground"
Value="{DynamicResource SystemControlBackgroundAccentBrush}" />
@ -232,6 +234,7 @@
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Text="{x:Static props:Resources.Templates}"
x:Name="TemplatesHeaderBlock"
FontWeight="SemiBold"
@ -302,7 +305,7 @@
</Grid>
</ScrollViewer>
<Button x:Name="NewLayoutButton"
Click="NewLayoutButton_Click"
HorizontalAlignment="Right"
@ -376,7 +379,7 @@
Opened="Dialog_Opened"
Closed="Dialog_Closed">
<Grid DataContext="{Binding SelectedModel}"
MinWidth="320" Margin="0,0,0,32">
MinWidth="320" Margin="4,4,4,32">
<StackPanel Margin="0,-37,0,0"
HorizontalAlignment="Right"
@ -412,120 +415,192 @@
</StackPanel>
<StackPanel>
<local:LayoutPreview Width="216"
Height="132"
Margin="0,16,0,16" />
<Button Click="EditZones_Click"
x:Name="editZoneLayoutButton"
HorizontalAlignment="Stretch"
AutomationProperties.Name="{x:Static props:Resources.Edit_zones}"
HorizontalContentAlignment="Center"
Foreground="{DynamicResource SystemControlBackgroundAccentBrush}"
Style="{StaticResource IconOnlyButtonStyle}"
Visibility="{Binding Path=Type, Converter={StaticResource LayoutTypeCustomToVisibilityConverter}}">
<Button.Content>
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE104;"
Margin="0,2,8,0"
FontFamily="Segoe MDL2 Assets" />
<TextBlock Text="{x:Static props:Resources.Edit_zones}" />
</StackPanel>
</Button.Content>
</Button>
<StackPanel Orientation="Horizontal"
Margin="0,24,0,0"
HorizontalAlignment="Stretch"
Visibility="{Binding IsCustom, Converter={StaticResource BooleanToVisibilityConverter}}">
<TextBlock FontFamily="Segoe MDL2 Assets"
ToolTip="{x:Static props:Resources.Name}"
FontSize="16"
VerticalAlignment="Bottom" Margin="0,0,0,8"
Text="&#xE932;" />
<TextBox Text="{Binding Name}"
ui:ControlHelper.PlaceholderText="{x:Static props:Resources.Name}"
AutomationProperties.Name="{x:Static props:Resources.Name}"
Margin="12,0,0,0"
ui:ControlHelper.Header="{x:Static props:Resources.Name}"
MinWidth="286"
HorizontalAlignment="Stretch" />
</StackPanel>
<!-- Shortcut panel -->
<StackPanel Orientation="Vertical"
Visibility="{Binding IsCustom, Converter={StaticResource BooleanToVisibilityConverter}}"
Margin="0,12,0,36">
<StackPanel Margin="28,0,0,4"
Orientation="Horizontal">
<TextBlock x:Name="QuickKeyTitle"
Text="{x:Static props:Resources.QuickKey_Title}" />
<TextBlock FontFamily="Segoe MDL2 Assets"
Margin="8,4,0,0"
Foreground="{DynamicResource SystemControlBackgroundAccentBrush}"
Text="&#xE946;"
ToolTip="{x:Static props:Resources.QuickKey_Description}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock FontFamily="Segoe MDL2 Assets"
VerticalAlignment="Center"
FontSize="16"
ToolTip="{x:Static props:Resources.QuickKey_Title}"
Text="&#xEDA7;" />
<ComboBox x:Name="quickKeySelectionComboBox"
Margin="12,0,0,0"
Width="286"
AutomationProperties.LabeledBy="{Binding ElementName=QuickKeyTitle}"
AutomationProperties.HelpText="{x:Static props:Resources.QuickKey_Description}"
AutomationProperties.Name="{x:Static props:Resources.QuickKey_Title}"
ItemsSource="{Binding QuickKeysAvailable}"
SelectedItem="{Binding QuickKey}" />
</StackPanel>
</StackPanel>
<Grid Width="218"
Height="124"
HorizontalAlignment="Left"
Margin="24,12,0,24">
<local:LayoutPreview />
<Button Content="&#xE104;"
x:Name="editZoneLayoutButton"
FontFamily="Segoe MDL2 Assets"
FontSize="14"
HorizontalAlignment="Center"
Visibility="{Binding Path=Type, Converter={StaticResource LayoutTypeTemplateToVisibilityConverter}}">
<Button x:Name="decrementZones"
Width="40"
Height="40"
AutomationProperties.Name="{x:Static props:Resources.Zone_Count_Decrement}"
ToolTip="{x:Static props:Resources.Zone_Count_Decrement}"
Foreground="{DynamicResource SystemControlBackgroundAccentBrush}"
Style="{StaticResource IconOnlyButtonStyle}"
Click="DecrementZones_Click">
<Button.Content>
<TextBlock Text="&#xE108;"
FontFamily="Segoe MDL2 Assets" />
</Button.Content>
</Button>
<TextBlock x:Name="zoneCount"
Text="{Binding TemplateZoneCount}"
FontWeight="SemiBold"
FontSize="18"
Width="32"
HorizontalAlignment="Center"
TextAlignment="Center"
Margin="0,-4,0,0"
ToolTip="Number of zones"
VerticalAlignment="Center" />
<Button x:Name="incrementZones"
Width="40"
Height="40"
AutomationProperties.Name="{x:Static props:Resources.Zone_Count_Increment}"
ToolTip="{x:Static props:Resources.Zone_Count_Increment}"
Foreground="{DynamicResource SystemControlBackgroundAccentBrush}"
Style="{StaticResource IconOnlyButtonStyle}"
Click="IncrementZones_Click">
<Button.Content>
<TextBlock Text="&#xE109;"
FontFamily="Segoe MDL2 Assets" />
</Button.Content>
</Button>
</StackPanel>
<TextBox Text="{Binding Name}"
ui:ControlHelper.Header="{x:Static props:Resources.Name}"
Margin="0,16,2,0"
Visibility="{Binding IsCustom, Converter={StaticResource BooleanToVisibilityConverter}}"
HorizontalAlignment="Stretch" />
<CheckBox x:Name="spaceAroundSetting"
Content="{x:Static props:Resources.Show_Space_Zones}"
IsChecked="{Binding ShowSpacing}"
Margin="0,16,12,0"
Visibility="{Binding Converter={StaticResource LayoutModelTypeToVisibilityConverter}}" />
VerticalAlignment="Center"
Height="36"
Width="36"
Padding="0"
BorderBrush="Transparent"
Click="EditZones_Click"
Visibility="{Binding Path=Type, Converter={StaticResource LayoutTypeCustomToVisibilityConverter}}"
ToolTip="{x:Static props:Resources.Edit_zones}"
AutomationProperties.Name="{x:Static props:Resources.Edit_zones}"
Style="{StaticResource AccentButtonStyle}"
ui:ControlHelper.CornerRadius="36">
</Button>
<ui:NumberBox Margin="0,6,0,0"
IsEnabled="{Binding ShowSpacing}"
Text="{Binding Spacing}"
Width="106"
Minimum="-20"
Maximum="1000"
SpinButtonPlacementMode="Compact"
HorizontalAlignment="Left"
AutomationProperties.LabeledBy="{Binding ElementName=spaceAroundSetting}"
Visibility="{Binding Converter={StaticResource LayoutModelTypeToVisibilityConverter}}" />
</Grid>
<TextBlock Text="{x:Static props:Resources.Distance_adjacent_zones}"
IsEnabled="{Binding ShowSpacing}"
Margin="0,16,12,0"
TextWrapping="Wrap"
Foreground="{DynamicResource PrimaryForegroundBrush}"
x:Name="sensitivityRadiusValue" />
<ui:NumberBox Margin="0,6,0,0"
Text="{Binding SensitivityRadius}"
Width="106"
Minimum="0"
Maximum="1000"
SpinButtonPlacementMode="Compact"
HorizontalAlignment="Left"
AutomationProperties.LabeledBy="{Binding ElementName=sensitivityRadiusValue}" />
<TextBlock Text="{x:Static props:Resources.QuickKey_Select}"
Margin="0,16,12,0"
Foreground="{DynamicResource PrimaryForegroundBrush}"
TextWrapping="Wrap"
Visibility="{Binding Path=Type, Converter={StaticResource LayoutTypeCustomToVisibilityConverter}}"/>
<ComboBox x:Name="quickKeySelectionComboBox"
Margin="0,6,0,0"
ItemsSource="{Binding QuickKeysAvailable}"
SelectedItem="{Binding QuickKey}"
Width="106"
Visibility="{Binding Path=Type, Converter={StaticResource LayoutTypeCustomToVisibilityConverter}}"/>
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Left"
Margin="0,16,0,0"
Visibility="{Binding Path=Type, Converter={StaticResource LayoutTypeTemplateToVisibilityConverter}}">
<TextBlock FontFamily="Segoe MDL2 Assets"
VerticalAlignment="Center"
FontSize="16"
Margin="0,16,0,0"
ToolTip="{x:Static props:Resources.Number_of_zones}"
Text="&#xECA5;" />
<ui:NumberBox Minimum="1"
Maximum="40"
Width="216"
KeyDown="EditDialogNumberBox_KeyDown"
Margin="12,0,0,0"
Header="{x:Static props:Resources.Number_of_zones}"
SpinButtonPlacementMode="Compact"
Text="{Binding TemplateZoneCount}" />
</StackPanel>
<StackPanel Margin="0, 12, 0, 0"
Visibility="{Binding Converter={StaticResource LayoutModelTypeToVisibilityConverter}}">
<TextBlock Text="{x:Static props:Resources.Space_Around_Zones}"
x:Name="spacingTitle"
Margin="28,0,0,4"
TextWrapping="Wrap" />
<StackPanel Orientation="Horizontal">
<TextBlock FontFamily="Segoe MDL2 Assets"
VerticalAlignment="Center"
FontSize="16"
ToolTip="{x:Static props:Resources.Space_Around_Zones}"
Text="&#xE91B;" />
<ui:NumberBox Margin="12,0,0,0"
IsEnabled="{Binding ShowSpacing}"
Text="{Binding Spacing}"
Width="216"
Minimum="-20"
Maximum="1000"
KeyDown="EditDialogNumberBox_KeyDown"
SpinButtonPlacementMode="Compact"
HorizontalAlignment="Left"
VerticalAlignment="Center"
AutomationProperties.Name="{x:Static props:Resources.Space_Around_Zones}"
AutomationProperties.LabeledBy="{Binding ElementName=spacingTitle}" />
<TextBlock Text="{x:Static props:Resources.Pixels}"
Margin="6,-4,0,0"
FontSize="12"
Foreground="{DynamicResource SecondaryForegroundBrush}"
TextWrapping="Wrap"
VerticalAlignment="Center" />
<ui:ToggleSwitch x:Name="spaceAroundSetting"
IsOn="{Binding ShowSpacing}"
Margin="12,0,0,0"
OffContent=""
OnContent=""
ui:FocusVisualHelper.FocusVisualMargin="-3,-3,8,-3"
VerticalAlignment="Center"
AutomationProperties.Name="{x:Static props:Resources.Show_Space_Zones}">
<ui:ToggleSwitch.Resources>
<sys:Double x:Key="ToggleSwitchThemeMinWidth">0</sys:Double>
</ui:ToggleSwitch.Resources>
</ui:ToggleSwitch>
</StackPanel>
</StackPanel>
<StackPanel Margin="0, 12, 0, 0">
<TextBlock Text="{x:Static props:Resources.Distance_adjacent_zones}"
x:Name="distanceTitle"
Margin="28,0,0,4"
TextWrapping="Wrap" />
<StackPanel Orientation="Horizontal">
<TextBlock FontFamily="Segoe MDL2 Assets"
VerticalAlignment="Center"
FontSize="16"
ToolTip="{x:Static props:Resources.Distance_adjacent_zones}"
Text="&#xF617;" />
<ui:NumberBox Text="{Binding SensitivityRadius}"
Width="216"
Minimum="0"
Maximum="1000"
KeyDown="EditDialogNumberBox_KeyDown"
Margin="12,0,0,0"
AutomationProperties.Name="{x:Static props:Resources.Distance_adjacent_zones}"
AutomationProperties.LabeledBy="{Binding ElementName=distanceTitle}"
SpinButtonPlacementMode="Compact"
HorizontalAlignment="Left" />
<TextBlock Text="{x:Static props:Resources.Pixels}"
Margin="6,-4,0,0"
FontSize="12"
Foreground="{DynamicResource SecondaryForegroundBrush}"
TextWrapping="Wrap"
VerticalAlignment="Center" />
</StackPanel>
</StackPanel>
</StackPanel>
</Grid>
</ui:ContentDialog>

View file

@ -421,5 +421,14 @@ namespace FancyZonesEditor
{
_openedDialog = null;
}
private void EditDialogNumberBox_KeyDown(object sender, KeyEventArgs e)
{
// Making sure that pressing Enter when changing values in a NumberBox will not close the edit dialog.
if (e.Key == Key.Enter)
{
e.Handled = true;
}
}
}
}

View file

@ -250,7 +250,7 @@ namespace FancyZonesEditor.Properties {
}
/// <summary>
/// Looks up a localized string similar to Distance to highlight adjacent zones.
/// Looks up a localized string similar to Highlight distance.
/// </summary>
public static string Distance_adjacent_zones {
get {
@ -537,6 +537,15 @@ namespace FancyZonesEditor.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Number of zones.
/// </summary>
public static string Number_of_zones {
get {
return ResourceManager.GetString("Number_of_zones", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Number of zones.
/// </summary>
@ -546,6 +555,15 @@ namespace FancyZonesEditor.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to px.
/// </summary>
public static string Pixels {
get {
return ResourceManager.GetString("Pixels", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to None.
/// </summary>
@ -556,11 +574,20 @@ namespace FancyZonesEditor.Properties {
}
/// <summary>
/// Looks up a localized string similar to Select a key to quickly apply the layout (Win + Ctrl + Alt + key).
/// Looks up a localized string similar to Press Win + Ctrl + Alt + selected key to apply this layout.
/// </summary>
public static string QuickKey_Select {
public static string QuickKey_Description {
get {
return ResourceManager.GetString("QuickKey_Select", resourceCulture);
return ResourceManager.GetString("QuickKey_Description", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Layout shortcut.
/// </summary>
public static string QuickKey_Title {
get {
return ResourceManager.GetString("QuickKey_Title", resourceCulture);
}
}

View file

@ -145,7 +145,8 @@
<value>Custom layout creator</value>
</data>
<data name="Distance_adjacent_zones" xml:space="preserve">
<value>Distance to highlight adjacent zones</value>
<value>Highlight distance</value>
<comment>Distance of when an adjacent zone should light up when the window is close to it</comment>
</data>
<data name="Edit_Layout" xml:space="preserve">
<value>Edit layout</value>
@ -343,10 +344,20 @@
<value>Splitter:</value>
<comment>Title for concept: A segmenter visual for splitting one item into two. This would be the vertical line</comment>
</data>
<data name="QuickKey_Select" xml:space="preserve">
<value>Select a key to quickly apply the layout (Win + Ctrl + Alt + key)</value>
<data name="QuickKey_Description" xml:space="preserve">
<value>Press Win + Ctrl + Alt + selected key to apply this layout</value>
</data>
<data name="Quick_Key_None" xml:space="preserve">
<value>None</value>
</data>
<data name="Number_of_zones" xml:space="preserve">
<value>Number of zones</value>
</data>
<data name="Pixels" xml:space="preserve">
<value>px</value>
<comment>Abbreviation of pixels</comment>
</data>
<data name="QuickKey_Title" xml:space="preserve">
<value>Layout shortcut</value>
</data>
</root>

View file

@ -16,7 +16,7 @@
<Setter Property="VerticalContentAlignment" Value="Top" />
<Setter Property="FontFamily" Value="{DynamicResource ContentControlThemeFontFamily}" />
<Setter Property="FontSize" Value="{DynamicResource ControlContentThemeFontSize}" />
<Setter Property="MinWidth" Value="120" />
<Setter Property="MinWidth" Value="0" />
<Setter Property="FocusVisualStyle" Value="{DynamicResource {x:Static SystemParameters.FocusVisualStyleKey}}" />
<Setter Property="ui:FocusVisualHelper.UseSystemFocusVisuals" Value="{DynamicResource UseSystemFocusVisuals}" />
<Setter Property="ui:FocusVisualHelper.FocusVisualMargin" Value="0" />

View file

@ -334,11 +334,11 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Parsing_Zones_Settings_Malformed_Data" ItemType="0;.resx" PsrId="211" Leaf="true">
<Item ItemId=";Error_Parsing_Zones_Settings_Message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA['zones-settings.json' contains malformed data.]]></Val>
<Val><![CDATA[A layout that contained invalid data has been removed.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA["zones-settings.json" contiene datos con un formato incorrecto.]]></Val>
<Val><![CDATA[Se quitó un diseño que contenía datos que no son válidos.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
@ -352,15 +352,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Parsing_Zones_Settings_User_Choice" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Would you like to continue? Malformed data will be lost.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[¿Quiere continuar? Se perderán los datos con un formato incorrecto.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Persisting_Custom_Layout" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Error persisting custom layout]]></Val>

View file

@ -334,11 +334,11 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Parsing_Zones_Settings_Malformed_Data" ItemType="0;.resx" PsrId="211" Leaf="true">
<Item ItemId=";Error_Parsing_Zones_Settings_Message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA['zones-settings.json' contains malformed data.]]></Val>
<Val><![CDATA[A layout that contained invalid data has been removed.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[« zones-settings.json » contient des données malformées.]]></Val>
<Val><![CDATA[Une disposition qui contenait des données non valides a été supprimée.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
@ -352,15 +352,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Parsing_Zones_Settings_User_Choice" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Would you like to continue? Malformed data will be lost.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Voulez-vous continuer ? Les données malformées seront perdues.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Persisting_Custom_Layout" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Error persisting custom layout]]></Val>

View file

@ -334,11 +334,11 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Parsing_Zones_Settings_Malformed_Data" ItemType="0;.resx" PsrId="211" Leaf="true">
<Item ItemId=";Error_Parsing_Zones_Settings_Message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA['zones-settings.json' contains malformed data.]]></Val>
<Val><![CDATA[A layout that contained invalid data has been removed.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA['zones-settings.json' contém dados malformados.]]></Val>
<Val><![CDATA[Um layout que continha dados inválidos foi removido.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
@ -352,15 +352,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Parsing_Zones_Settings_User_Choice" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Would you like to continue? Malformed data will be lost.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Deseja continuar? Os dados malformados serão perdidos.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Persisting_Custom_Layout" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Error persisting custom layout]]></Val>

View file

@ -334,11 +334,11 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Parsing_Zones_Settings_Malformed_Data" ItemType="0;.resx" PsrId="211" Leaf="true">
<Item ItemId=";Error_Parsing_Zones_Settings_Message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA['zones-settings.json' contains malformed data.]]></Val>
<Val><![CDATA[A layout that contained invalid data has been removed.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA["zones-settings.json" contém dados malformados.]]></Val>
<Val><![CDATA[Foi removido um esquema que continha dados inválidos.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
@ -352,15 +352,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Parsing_Zones_Settings_User_Choice" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Would you like to continue? Malformed data will be lost.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Pretende continuar? Os dados malformados serão perdidos.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Persisting_Custom_Layout" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Error persisting custom layout]]></Val>

View file

@ -334,11 +334,11 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Parsing_Zones_Settings_Malformed_Data" ItemType="0;.resx" PsrId="211" Leaf="true">
<Item ItemId=";Error_Parsing_Zones_Settings_Message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA['zones-settings.json' contains malformed data.]]></Val>
<Val><![CDATA[A layout that contained invalid data has been removed.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA['zones-settings.json' hatalı biçimlendirilmiş veriler içeriyor.]]></Val>
<Val><![CDATA[Geçersiz veri içeren düzen kaldırıldı.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
@ -352,15 +352,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Parsing_Zones_Settings_User_Choice" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Would you like to continue? Malformed data will be lost.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Devam etmek istiyor musunuz? Hatalı biçimlendirilmiş veriler kaybolacak.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Error_Persisting_Custom_Layout" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Error persisting custom layout]]></Val>

View file

@ -12,6 +12,7 @@ namespace ZonedWindowProperties
const wchar_t MultiMonitorDeviceID[] = L"FancyZones#MultiMonitorDevice";
}
// in reality, this file needs to be kept in sync currently with src/settings-ui/Microsoft.PowerToys.Settings.UI.Library/FZConfigProperties.cs
struct Settings
{
enum struct OverlappingZonesAlgorithm : int
@ -45,7 +46,7 @@ struct Settings
std::wstring zoneHighlightColor = L"#008CFF";
int zoneHighlightOpacity = 50;
OverlappingZonesAlgorithm overlappingZonesAlgorithm = OverlappingZonesAlgorithm::Smallest;
PowerToysSettings::HotkeyObject editorHotkey = PowerToysSettings::HotkeyObject::from_settings(true, false, false, false, VK_OEM_3);
PowerToysSettings::HotkeyObject editorHotkey = PowerToysSettings::HotkeyObject::from_settings(true, false, false, true, VK_OEM_3);
std::wstring excludedApps = L"";
std::vector<std::wstring> excludedAppsArray;
};

View file

@ -1,12 +0,0 @@
// This class sets the visibility property of Advanced settings based on the OS Version
namespace ImageResizer.Models
{
public static class AdvancedSettings
{
public static bool UseNewSettings()
{
return interop.CommonManaged.ShouldNewSettingsBeUsed();
}
}
}

View file

@ -59,232 +59,7 @@ namespace ImageResizer.Properties {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to About.
/// </summary>
public static string Advanced_About {
get {
return ResourceManager.GetString("Advanced_About", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Create a new size.
/// </summary>
public static string Advanced_CreateSize {
get {
return ResourceManager.GetString("Advanced_CreateSize", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Delete.
/// </summary>
public static string Advanced_DeleteSize {
get {
return ResourceManager.GetString("Advanced_DeleteSize", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Encoding.
/// </summary>
public static string Advanced_Encoding {
get {
return ResourceManager.GetString("Advanced_Encoding", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Fallback encoder:.
/// </summary>
public static string Advanced_FallbackEncoder {
get {
return ResourceManager.GetString("Advanced_FallbackEncoder", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Fallback encoder.
/// </summary>
public static string Advanced_FallbackEncoder_Name {
get {
return ResourceManager.GetString("Advanced_FallbackEncoder_Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to File.
/// </summary>
public static string Advanced_File {
get {
return ResourceManager.GetString("Advanced_File", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Filename:.
/// </summary>
public static string Advanced_FileName {
get {
return ResourceManager.GetString("Advanced_FileName", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Filename.
/// </summary>
public static string Advanced_FileName_Name {
get {
return ResourceManager.GetString("Advanced_FileName_Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Original filename.
/// </summary>
public static string Advanced_FileNameToken1 {
get {
return ResourceManager.GetString("Advanced_FileNameToken1", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Size name.
/// </summary>
public static string Advanced_FileNameToken2 {
get {
return ResourceManager.GetString("Advanced_FileNameToken2", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Selected width.
/// </summary>
public static string Advanced_FileNameToken3 {
get {
return ResourceManager.GetString("Advanced_FileNameToken3", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Selected height.
/// </summary>
public static string Advanced_FileNameToken4 {
get {
return ResourceManager.GetString("Advanced_FileNameToken4", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Actual width (pixels).
/// </summary>
public static string Advanced_FileNameToken5 {
get {
return ResourceManager.GetString("Advanced_FileNameToken5", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Actual height (pixels).
/// </summary>
public static string Advanced_FileNameToken6 {
get {
return ResourceManager.GetString("Advanced_FileNameToken6", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The following parameters can be used..
/// </summary>
public static string Advanced_FileNameTokens {
get {
return ResourceManager.GetString("Advanced_FileNameTokens", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _JPEG quality level:.
/// </summary>
public static string Advanced_JpegQualityLevel {
get {
return ResourceManager.GetString("Advanced_JpegQualityLevel", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to JPEG quality level.
/// </summary>
public static string Advanced_JpegQualityLevel_Name {
get {
return ResourceManager.GetString("Advanced_JpegQualityLevel_Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Use original date modified.
/// </summary>
public static string Advanced_KeepDateModified {
get {
return ResourceManager.GetString("Advanced_KeepDateModified", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _PNG interlacing:.
/// </summary>
public static string Advanced_PngInterlaceOption {
get {
return ResourceManager.GetString("Advanced_PngInterlaceOption", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to PNG interlacing.
/// </summary>
public static string Advanced_PngInterlaceOption_Name {
get {
return ResourceManager.GetString("Advanced_PngInterlaceOption_Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Sizes.
/// </summary>
public static string Advanced_Sizes {
get {
return ResourceManager.GetString("Advanced_Sizes", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _TIFF compression:.
/// </summary>
public static string Advanced_TiffCompressOption {
get {
return ResourceManager.GetString("Advanced_TiffCompressOption", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to TIFF compression.
/// </summary>
public static string Advanced_TiffCompressOption_Name {
get {
return ResourceManager.GetString("Advanced_TiffCompressOption_Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Settings.
/// </summary>
public static string Advanced_Title {
get {
return ResourceManager.GetString("Advanced_Title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to All Files.
/// </summary>
@ -302,16 +77,7 @@ namespace ImageResizer.Properties {
return ResourceManager.GetString("Cancel", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to © 2020 Brice Lambson. All rights reserved..
/// </summary>
public static string Copyright {
get {
return ResourceManager.GetString("Copyright", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Height.
/// </summary>
@ -384,15 +150,6 @@ namespace ImageResizer.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Settings.
/// </summary>
public static string Input_ShowAdvanced {
get {
return ResourceManager.GetString("Input_ShowAdvanced", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Make pictures smaller but not larger.
/// </summary>
@ -726,69 +483,6 @@ namespace ImageResizer.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to CCITT3.
/// </summary>
public static string TiffCompressOption_Ccitt3 {
get {
return ResourceManager.GetString("TiffCompressOption_Ccitt3", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to CCITT4.
/// </summary>
public static string TiffCompressOption_Ccitt4 {
get {
return ResourceManager.GetString("TiffCompressOption_Ccitt4", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to (Default).
/// </summary>
public static string TiffCompressOption_Default {
get {
return ResourceManager.GetString("TiffCompressOption_Default", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to LZW.
/// </summary>
public static string TiffCompressOption_Lzw {
get {
return ResourceManager.GetString("TiffCompressOption_Lzw", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to None.
/// </summary>
public static string TiffCompressOption_None {
get {
return ResourceManager.GetString("TiffCompressOption_None", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to RLE.
/// </summary>
public static string TiffCompressOption_Rle {
get {
return ResourceManager.GetString("TiffCompressOption_Rle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to ZIP.
/// </summary>
public static string TiffCompressOption_Zip {
get {
return ResourceManager.GetString("TiffCompressOption_Zip", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Times Symbol.
/// </summary>

View file

@ -117,93 +117,12 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Advanced_About" xml:space="preserve">
<value>About</value>
</data>
<data name="Advanced_CreateSize" xml:space="preserve">
<value>Create a new size</value>
</data>
<data name="Advanced_DeleteSize" xml:space="preserve">
<value>Delete</value>
<comment>remove a file</comment>
</data>
<data name="Advanced_Encoding" xml:space="preserve">
<value>Encoding</value>
<comment>encoding a file to a different format</comment>
</data>
<data name="Advanced_FallbackEncoder" xml:space="preserve">
<value>_Fallback encoder:</value>
</data>
<data name="Advanced_FallbackEncoder_Name" xml:space="preserve">
<value>Fallback encoder</value>
</data>
<data name="Advanced_File" xml:space="preserve">
<value>File</value>
<comment>as in file name</comment>
</data>
<data name="Advanced_FileName" xml:space="preserve">
<value>_Filename:</value>
</data>
<data name="Advanced_FileNameToken1" xml:space="preserve">
<value>Original filename</value>
</data>
<data name="Advanced_FileNameToken2" xml:space="preserve">
<value>Size name</value>
</data>
<data name="Advanced_FileNameToken3" xml:space="preserve">
<value>Selected width</value>
</data>
<data name="Advanced_FileNameToken4" xml:space="preserve">
<value>Selected height</value>
</data>
<data name="Advanced_FileNameToken5" xml:space="preserve">
<value>Actual width (pixels)</value>
</data>
<data name="Advanced_FileNameToken6" xml:space="preserve">
<value>Actual height (pixels)</value>
</data>
<data name="Advanced_FileNameTokens" xml:space="preserve">
<value>The following parameters can be used.</value>
</data>
<data name="Advanced_FileName_Name" xml:space="preserve">
<value>Filename</value>
</data>
<data name="Advanced_JpegQualityLevel" xml:space="preserve">
<value>_JPEG quality level:</value>
</data>
<data name="Advanced_JpegQualityLevel_Name" xml:space="preserve">
<value>JPEG quality level</value>
</data>
<data name="Advanced_KeepDateModified" xml:space="preserve">
<value>_Use original date modified</value>
</data>
<data name="Advanced_PngInterlaceOption" xml:space="preserve">
<value>_PNG interlacing:</value>
</data>
<data name="Advanced_PngInterlaceOption_Name" xml:space="preserve">
<value>PNG interlacing</value>
</data>
<data name="Advanced_Sizes" xml:space="preserve">
<value>Sizes</value>
</data>
<data name="Advanced_TiffCompressOption" xml:space="preserve">
<value>_TIFF compression:</value>
</data>
<data name="Advanced_TiffCompressOption_Name" xml:space="preserve">
<value>TIFF compression</value>
</data>
<data name="Advanced_Title" xml:space="preserve">
<value>Settings</value>
</data>
<data name="AllFilesFilter" xml:space="preserve">
<value>All Files</value>
</data>
<data name="Cancel" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="Copyright" xml:space="preserve">
<value>© 2020 Brice Lambson. All rights reserved.</value>
</data>
<data name="Height" xml:space="preserve">
<value>Height</value>
</data>
@ -229,9 +148,6 @@
<data name="Input_Resize" xml:space="preserve">
<value>Resize</value>
</data>
<data name="Input_ShowAdvanced" xml:space="preserve">
<value>Settings</value>
</data>
<data name="Input_ShrinkOnly" xml:space="preserve">
<value>_Make pictures smaller but not larger</value>
</data>
@ -343,32 +259,6 @@
<data name="Small" xml:space="preserve">
<value>Small</value>
</data>
<data name="TiffCompressOption_Ccitt3" xml:space="preserve">
<value>CCITT3</value>
<comment>Do not loc</comment>
</data>
<data name="TiffCompressOption_Ccitt4" xml:space="preserve">
<value>CCITT4</value>
<comment>Do not loc</comment>
</data>
<data name="TiffCompressOption_Default" xml:space="preserve">
<value>(Default)</value>
</data>
<data name="TiffCompressOption_Lzw" xml:space="preserve">
<value>LZW</value>
<comment>Do not loc</comment>
</data>
<data name="TiffCompressOption_None" xml:space="preserve">
<value>None</value>
</data>
<data name="TiffCompressOption_Rle" xml:space="preserve">
<value>RLE</value>
<comment>Do not loc</comment>
</data>
<data name="TiffCompressOption_Zip" xml:space="preserve">
<value>ZIP</value>
<comment>Do not loc</comment>
</data>
<data name="Times_Symbol" xml:space="preserve">
<value>Times Symbol</value>
</data>

View file

@ -1,7 +1,6 @@
// Copyright (c) Brice Lambson
// The Brice Lambson licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information. Code forked from Brice Lambson's https://github.com/bricelam/ImageResizer/
// ShowAdvancedCommand = new RelayCommand(ShowAdvanced);
using System.Windows.Input;
using ImageResizer.Helpers;
@ -35,21 +34,14 @@ namespace ImageResizer.ViewModels
ResizeCommand = new RelayCommand(Resize);
CancelCommand = new RelayCommand(Cancel);
ShowAdvancedCommand = new RelayCommand(ShowAdvanced);
ShowAdvancedSettings = !AdvancedSettings.UseNewSettings();
}
public bool ShowAdvancedSettings { get; }
public Settings Settings { get; }
public ICommand ResizeCommand { get; }
public ICommand CancelCommand { get; }
public ICommand ShowAdvancedCommand { get; }
public void Resize()
{
Settings.Save();
@ -58,8 +50,5 @@ namespace ImageResizer.ViewModels
public void Cancel()
=> _mainView.Close();
public void ShowAdvanced()
=> _mainView.ShowAdvanced(new AdvancedViewModel(Settings));
}
}

View file

@ -1,24 +0,0 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
using System.Windows;
using System.Windows.Automation.Peers;
using System.Windows.Documents;
namespace ImageResizer.Views
{
public class AccessibleHyperlink : Hyperlink
{
public AutomationControlType ControlType { get; set; }
protected override AutomationPeer OnCreateAutomationPeer()
{
var peer = new CustomizableHyperlinkAutomationPeer(this);
peer.ControlType = ControlType;
return peer;
}
}
}

View file

@ -1,312 +0,0 @@
<Window x:Class="ImageResizer.Views.AdvancedWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ImageResizer.Views"
xmlns:m="clr-namespace:ImageResizer.Models"
xmlns:p="clr-namespace:ImageResizer.Properties"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:ui="http://schemas.modernwpf.com/2019"
ContentRendered="WindowContentRendered"
MinWidth="560"
MinHeight="340"
ui:WindowHelper.UseModernWindowStyle="True"
ui:TitleBar.IsIconVisible="True"
Background="{DynamicResource PrimaryBackgroundBrush}"
Name="_this"
ResizeMode="NoResize"
SizeToContent="WidthAndHeight"
Title="{x:Static p:Resources.Advanced_Title}"
WindowStyle="ToolWindow"
WindowStartupLocation="CenterScreen">
<Window.Resources>
<ObjectDataProvider x:Key="PngInterlaceOptionValues"
MethodName="GetValues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="PngInterlaceOption"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="TiffCompressOptionValues"
MethodName="GetValues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="TiffCompressOption"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<local:ContainerFormatConverter x:Key="ContainerFormatConverter"/>
</Window.Resources>
<Grid Margin="0">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TabControl Style="{StaticResource TabControlPivotStyle}">
<TabItem Header="{x:Static p:Resources.Advanced_Sizes}">
<StackPanel Margin="0,12,0,12">
<!-- TODO: Allow these to be drag-and-drop reordered (issue #15) -->
<ItemsControl Grid.IsSharedSizeScope="True" TabIndex="0" ItemsSource="{Binding Settings.Sizes}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="m:ResizeSize">
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="0"/>
<ColumnDefinition SharedSizeGroup="1"/>
<ColumnDefinition SharedSizeGroup="2"/>
<ColumnDefinition SharedSizeGroup="3"/>
<ColumnDefinition SharedSizeGroup="4"/>
<ColumnDefinition SharedSizeGroup="5"/>
<ColumnDefinition SharedSizeGroup="6"/>
</Grid.ColumnDefinitions>
<TextBox Width="96"
MaxWidth="96"
TextWrapping="Wrap"
AutomationProperties.Name="{Binding Name}"
Text="{Binding Name}"/>
<ComboBox Grid.Column="1"
Margin="8,0,0,0"
Width="90"
ItemsSource="{Binding Source={StaticResource ResizeFitValues}}"
AutomationProperties.Name="{x:Static p:Resources.Resize_Type}"
SelectedItem="{Binding Fit}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="{x:Type m:ResizeFit}">
<ContentPresenter Content="{Binding Converter={StaticResource EnumValueConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<TextBox Grid.Column="2"
Width="56"
MaxWidth="56"
TextWrapping="Wrap"
AutomationProperties.Name="{x:Static p:Resources.Width}"
Margin="8,0,0,0">
<TextBox.Text>
<Binding Converter="{StaticResource AutoDoubleConverter}"
Path="Width"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:AutoDoubleValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBlock Grid.Column="3"
Foreground="{DynamicResource PrimaryForegroundBrush}"
Name="Times_Symbol"
AutomationProperties.Name="{x:Static p:Resources.Times_Symbol}"
VerticalAlignment="Center"
Text="&#xE711;"
FontFamily="Segoe MDL2 Assets"
Width="25"
TextAlignment="Center"
Visibility="{Binding ShowHeight,Converter={StaticResource BoolValueConverter}}"/>
<TextBox Grid.Column="4"
Width="56"
MaxWidth="56"
TextWrapping="Wrap"
AutomationProperties.Name="{x:Static p:Resources.Height}"
Visibility="{Binding ShowHeight,Converter={StaticResource BoolValueConverter}}">
<TextBox.Text>
<Binding Converter="{StaticResource AutoDoubleConverter}"
Path="Height"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:AutoDoubleValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<ComboBox Grid.Column="5"
Margin="8,0,0,0"
MinWidth="120"
ItemsSource="{Binding Source={StaticResource ResizeUnitValues}}"
AutomationProperties.Name="{x:Static p:Resources.Unit}"
SelectedItem="{Binding Unit}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="{x:Type m:ResizeUnit}">
<ContentPresenter Content="{Binding Converter={StaticResource EnumValueConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Button Content="&#xE107;"
FontFamily="Segoe MDL2 Assets"
Background="Transparent"
Grid.Column="6"
Margin="8,0,0,0"
VerticalAlignment="Center"
AutomationProperties.Name="{x:Static p:Resources.Advanced_DeleteSize}"
ToolTip="{x:Static p:Resources.Advanced_DeleteSize}"
Command="{Binding DataContext.RemoveSizeCommand,ElementName=_this}"
CommandParameter="{Binding}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Margin="0,12,0,0"
Command="{Binding AddSizeCommand}"
Content="{x:Static p:Resources.Advanced_CreateSize}"/>
</StackPanel>
</TabItem>
<TabItem Header="{x:Static p:Resources.Advanced_Encoding}">
<Grid Margin="0,12,0,12" VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Content="{x:Static p:Resources.Advanced_FallbackEncoder}"
Padding="0,8,8,0"
Target="{Binding ElementName=_fallbackEncoderComboBox}"/>
<ComboBox Grid.Column="1"
HorizontalAlignment="Left"
MinWidth="148"
ItemsSource="{Binding Encoders}"
AutomationProperties.Name="{x:Static p:Resources.Advanced_FallbackEncoder_Name}"
Name="_fallbackEncoderComboBox"
SelectedItem="{Binding Settings.FallbackEncoder}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="{x:Type sys:Guid}">
<ContentPresenter Content="{Binding Converter={StaticResource ContainerFormatConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Label Grid.Row="1"
Margin="0,8,0,0"
Content="{x:Static p:Resources.Advanced_JpegQualityLevel}"
Padding="0,8,8,0"
Target="{Binding ElementName=_jpegQualityLevelTextBox}"/>
<TextBox Grid.Row="1"
Grid.Column="1"
Width="56"
MinWidth="148"
TextWrapping="Wrap"
AutomationProperties.Name="{x:Static p:Resources.Advanced_JpegQualityLevel_Name}"
Margin="0,8,0,0"
HorizontalAlignment="Left"
Name="_jpegQualityLevelTextBox"
Text="{Binding Settings.JpegQualityLevel,ValidatesOnExceptions=True,ValidatesOnDataErrors=True}"/>
<Label Grid.Row="2"
Margin="0,8,0,0"
Content="{x:Static p:Resources.Advanced_PngInterlaceOption}"
Padding="0,8,8,0"
Target="{Binding ElementName=_pngInterlaceComboBox}"/>
<ComboBox Grid.Row="2"
Grid.Column="1"
Margin="0,8,0,0"
MinWidth="148"
HorizontalAlignment="Left"
AutomationProperties.Name="{x:Static p:Resources.Advanced_PngInterlaceOption_Name}"
ItemsSource="{Binding Source={StaticResource PngInterlaceOptionValues}}"
Name="_pngInterlaceComboBox"
SelectedItem="{Binding Settings.PngInterlaceOption}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="{x:Type PngInterlaceOption}">
<ContentPresenter Content="{Binding Converter={StaticResource EnumValueConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Label Grid.Row="3"
Margin="0,8,0,0"
Content="{x:Static p:Resources.Advanced_TiffCompressOption}"
Padding="0,8,8,0"
Target="{Binding ElementName=_tiffCompressComboBox}"/>
<ComboBox Grid.Row="3"
Grid.Column="1"
MinWidth="148"
Margin="0,8,0,0"
HorizontalAlignment="Left"
AutomationProperties.Name="{x:Static p:Resources.Advanced_TiffCompressOption_Name}"
ItemsSource="{Binding Source={StaticResource TiffCompressOptionValues}}"
Name="_tiffCompressComboBox"
SelectedItem="{Binding Settings.TiffCompressOption}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="{x:Type TiffCompressOption}">
<ContentPresenter Content="{Binding Converter={StaticResource EnumValueConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</TabItem>
<TabItem Header="{x:Static p:Resources.Advanced_File}">
<StackPanel Margin="0,12,0,12">
<TextBlock Text="{x:Static p:Resources.Advanced_FileNameTokens}"/>
<TextBlock Margin="0,8,0,0">
<Run Text="%1 -"/>
<Run Text="{x:Static p:Resources.Advanced_FileNameToken1}"/>
<LineBreak/>
<Run>%2 -</Run>
<Run Text="{x:Static p:Resources.Advanced_FileNameToken2}"/>
<LineBreak/>
<Run>%3 -</Run>
<Run Text="{x:Static p:Resources.Advanced_FileNameToken3}"/>
<LineBreak/>
<Run>%4 -</Run>
<Run Text="{x:Static p:Resources.Advanced_FileNameToken4}"/>
<LineBreak/>
<Run>%5 -</Run>
<Run Text="{x:Static p:Resources.Advanced_FileNameToken5}"/>
<LineBreak/>
<Run>%6 -</Run>
<Run Text="{x:Static p:Resources.Advanced_FileNameToken6}"/>
</TextBlock>
<Grid Margin="0,8,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label HorizontalAlignment="Left"
x:Name="fileNameTextBoxLabel"
Content="{x:Static p:Resources.Advanced_FileName}"
Padding="0,4,4,0"
Target="{Binding ElementName=fileNameTextBox}"/>
<TextBox Grid.Column="1"
Height="23"
MinWidth="240"
TabIndex="0"
HorizontalAlignment="Left"
TextWrapping="Wrap"
Name="fileNameTextBox"
AutomationProperties.Name="{x:Static p:Resources.Advanced_FileName_Name}"
Text="{Binding Settings.FileName}"/>
</Grid>
<Separator Margin="0,12,0,0"/>
<CheckBox Margin="0,12,0,0"
Content="{x:Static p:Resources.Advanced_KeepDateModified}"
IsChecked="{Binding Settings.KeepDateModified}"/>
</StackPanel>
</TabItem>
</TabControl>
<Border Grid.Row="1"
Margin="0,24,0,0"
BorderBrush="{DynamicResource PrimaryBorderBrush}"
BorderThickness="0,1,0,0"
Background="{DynamicResource SecondaryBackgroundBrush}"
Padding="12">
<StackPanel
HorizontalAlignment="Right"
Orientation="Horizontal">
<Button MinWidth="76"
TabIndex="100"
Click="HandleAcceptClick"
Style="{StaticResource AccentButtonStyle}"
Content="{x:Static p:Resources.OK}"
AutomationProperties.Name="{x:Static p:Resources.OK_Tooltip}"
IsDefault="True"/>
<Button MinWidth="76"
Margin="8,0,0,0"
TabIndex="101"
Content="{x:Static p:Resources.Cancel}"
IsCancel="True"/>
</StackPanel>
</Border>
</Grid>
</Window>

View file

@ -1,35 +0,0 @@
// Copyright (c) Brice Lambson
// The Brice Lambson licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information. Code forked from Brice Lambson's https://github.com/bricelam/ImageResizer/
using System.Diagnostics;
using System.Windows;
using System.Windows.Navigation;
using ImageResizer.ViewModels;
namespace ImageResizer.Views
{
public partial class AdvancedWindow : Window
{
public AdvancedWindow(AdvancedViewModel viewModel)
{
DataContext = viewModel;
InitializeComponent();
}
private void HandleAcceptClick(object sender, RoutedEventArgs e)
=> DialogResult = true;
private void HandleRequestNavigate(object sender, RequestNavigateEventArgs e)
{
Process.Start(e.Uri.ToString());
e.Handled = true;
}
// Fix for black outline WPF bug when a window uses custom chrome. More info here https://stackoverflow.com/questions/29207331/wpf-window-with-custom-chrome-has-unwanted-outline-on-right-and-bottom
private void WindowContentRendered(object sender, System.EventArgs e)
{
InvalidateVisual();
}
}
}

View file

@ -1,22 +0,0 @@
// Copyright (c) Brice Lambson
// The Brice Lambson licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information. Code forked from Brice Lambson's https://github.com/bricelam/ImageResizer/
using System.Globalization;
using System.Windows.Controls;
namespace ImageResizer.Views
{
internal class AutoDoubleValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
var text = (string)value;
return new ValidationResult(
string.IsNullOrEmpty(text)
|| double.TryParse(text, NumberStyles.AllowThousands | NumberStyles.Float, cultureInfo, out var _),
null);
}
}
}

View file

@ -1,23 +0,0 @@
// Copyright (c) Brice Lambson
// The Brice Lambson licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information. Code forked from Brice Lambson's https://github.com/bricelam/ImageResizer/
using System;
using System.Globalization;
using System.Windows.Data;
using ImageResizer.ViewModels;
namespace ImageResizer.Views
{
[ValueConversion(typeof(Guid), typeof(string))]
public class ContainerFormatConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
=> AdvancedViewModel.EncoderMap.TryGetValue((Guid)value, out var result)
? result
: value?.ToString();
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> throw new NotImplementedException();
}
}

View file

@ -1,24 +0,0 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Windows.Automation.Peers;
using System.Windows.Documents;
namespace ImageResizer.Views
{
public class CustomizableHyperlinkAutomationPeer : HyperlinkAutomationPeer
{
public CustomizableHyperlinkAutomationPeer(Hyperlink owner)
: base(owner)
{
}
public AutomationControlType ControlType { get; set; }
protected override AutomationControlType GetAutomationControlTypeCore()
{
return ControlType;
}
}
}

View file

@ -1,7 +1,6 @@
// Copyright (c) Brice Lambson
// The Brice Lambson licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information. Code forked from Brice Lambson's https://github.com/bricelam/ImageResizer/
// void ShowAdvanced(AdvancedViewModel viewModel);
using System.Collections.Generic;
using ImageResizer.ViewModels;
@ -12,8 +11,6 @@ namespace ImageResizer.Views
{
void Close();
void ShowAdvanced(AdvancedViewModel viewModel);
IEnumerable<string> OpenPictureFiles();
}
}

View file

@ -17,7 +17,9 @@
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="DisabledWhenUnselectedTextBoxStyle" TargetType="TextBox" BasedOn="{StaticResource DefaultTextBoxStyle}">
<Style x:Key="DisabledWhenUnselectedTextBoxStyle"
TargetType="ui:NumberBox"
>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" Value="True">
<Setter Property="IsEnabled" Value="True"/>
@ -67,25 +69,49 @@
<ListBox.Resources>
<DataTemplate DataType="{x:Type m:ResizeSize}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" FontWeight="SemiBold" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
<TextBlock Text="(" Margin="4,0,0,0" Foreground="{DynamicResource SecondaryForegroundBrush}"/>
<TextBlock Text="{Binding Fit,Converter={StaticResource EnumValueConverter},ConverterParameter=ThirdPersonSingular}" Foreground="{DynamicResource SecondaryForegroundBrush}"/>
<Grid Margin="0,0,0,4">
<Grid.RowDefinitions>
<RowDefinition Height="20" />
<RowDefinition Height="24" />
</Grid.RowDefinitions>
<TextBlock Text="{Binding Name}"
FontWeight="SemiBold"
FontSize="16"
Margin="0,-2,0,0"
VerticalAlignment="Top"
Foreground="{DynamicResource PrimaryForegroundBrush}" />
<StackPanel Orientation="Horizontal"
Grid.Row="1"
VerticalAlignment="Top">
<TextBlock Text="{Binding Fit,Converter={StaticResource EnumValueConverter},ConverterParameter=ThirdPersonSingular}" Foreground="{DynamicResource SecondaryForegroundBrush}"/>
<TextBlock Text="{Binding Width,Converter={StaticResource AutoDoubleConverter},ConverterParameter=Auto}" Margin="4,0,0,0" Foreground="{DynamicResource SecondaryForegroundBrush}"/>
<TextBlock Text="&#xE711;" FontSize="11" FontFamily="Segoe MDL2 Assets" Visibility="{Binding ShowHeight,Converter={StaticResource BoolValueConverter}}" Margin="4,5,0,0" Foreground="{DynamicResource SecondaryForegroundBrush}"/>
<TextBlock Text="{Binding Height,Converter={StaticResource AutoDoubleConverter},ConverterParameter=Auto}" Visibility="{Binding ShowHeight,Converter={StaticResource BoolValueConverter}}" Margin="4,0,0,0" Foreground="{DynamicResource SecondaryForegroundBrush}"/>
<TextBlock Text="{Binding Unit,Converter={StaticResource EnumValueConverter},ConverterParameter=ToLower}" Margin="4,0,0,0" Foreground="{DynamicResource SecondaryForegroundBrush}"/>
<TextBlock Text=")" Foreground="{DynamicResource SecondaryForegroundBrush}"/>
</StackPanel>
<TextBlock Text="{Binding Unit,Converter={StaticResource EnumValueConverter},ConverterParameter=ToLower}"
Margin="4,0,0,0"
Foreground="{DynamicResource SecondaryForegroundBrush}" />
</StackPanel>
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type m:CustomSize}">
<StackPanel Orientation="Horizontal" Margin="0,-8,0,0">
<TextBlock VerticalAlignment="Center"
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="32" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock VerticalAlignment="Top"
Text="{Binding Name}"
FontSize="16"
Margin="0,-2,0,0"
Foreground="{DynamicResource PrimaryForegroundBrush}"
FontWeight="SemiBold"/>
<ComboBox Margin="8,0,0,0"
FontWeight="SemiBold" />
<StackPanel Orientation="Horizontal" Grid.Row="1" Margin="0,-8,0,0">
<ComboBox Margin="0,0,0,0"
ItemsSource="{Binding Source={StaticResource ResizeFitValues}}"
Style="{StaticResource DisabledWhenUnselectedComboBoxStyle}"
AutomationProperties.Name="{x:Static p:Resources.Resize_Type}"
@ -96,22 +122,19 @@
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<TextBox Width="56"
TextWrapping="Wrap"
Style="{StaticResource DisabledWhenUnselectedTextBoxStyle}"
AutomationProperties.Name="{x:Static p:Resources.Width}"
Margin="8,0,0,0">
<TextBox.Text>
<Binding Converter="{StaticResource AutoDoubleConverter}"
Path="Width"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:AutoDoubleValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBlock VerticalAlignment="Center"
<ui:NumberBox SpinButtonPlacementMode="Compact"
Minimum="1"
Width="102"
Style="{StaticResource DisabledWhenUnselectedTextBoxStyle}"
AutomationProperties.Name="{x:Static p:Resources.Width}"
Margin="8,0,0,0">
<ui:NumberBox.Value>
<Binding Path="Width"
UpdateSourceTrigger="PropertyChanged">
</Binding>
</ui:NumberBox.Value>
</ui:NumberBox>
<TextBlock VerticalAlignment="Center"
Text="&#xE711;"
FontFamily="Segoe MDL2 Assets"
Width="25"
@ -121,22 +144,19 @@
TextAlignment="Center"
Visibility="{Binding ShowHeight,Converter={StaticResource BoolValueConverter}}"/>
<TextBox Width="56"
Style="{StaticResource DisabledWhenUnselectedTextBoxStyle}"
TextWrapping="Wrap"
AutomationProperties.Name="{x:Static p:Resources.Height}"
Visibility="{Binding ShowHeight,Converter={StaticResource BoolValueConverter}}">
<TextBox.Text>
<Binding Converter="{StaticResource AutoDoubleConverter}"
Path="Height"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:AutoDoubleValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<ComboBox Margin="8,0,0,0"
<ui:NumberBox Style="{StaticResource DisabledWhenUnselectedTextBoxStyle}"
SpinButtonPlacementMode="Compact"
Minimum="1"
Width="102"
AutomationProperties.Name="{x:Static p:Resources.Height}"
Visibility="{Binding ShowHeight,Converter={StaticResource BoolValueConverter}}">
<ui:NumberBox.Value>
<Binding Path="Height"
UpdateSourceTrigger="PropertyChanged">
</Binding>
</ui:NumberBox.Value>
</ui:NumberBox>
<ComboBox Margin="8,0,0,0"
ItemsSource="{Binding Source={StaticResource ResizeUnitValues}}"
Style="{StaticResource DisabledWhenUnselectedComboBoxStyle}"
AutomationProperties.Name="{x:Static p:Resources.Unit}"
@ -148,6 +168,7 @@
</ComboBox.ItemTemplate>
</ComboBox>
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.Resources>
</ListBox>
@ -177,17 +198,6 @@
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button Content="&#xE115;"
FontFamily="Segoe MDL2 Assets"
Style="{StaticResource DefaultButtonStyle}"
FontSize="16"
Margin="-6,0,0,0"
AutomationProperties.Name="{x:Static p:Resources.Input_ShowAdvanced}"
ToolTip="{x:Static p:Resources.Input_ShowAdvanced}"
Background="Transparent"
Command="{Binding ShowAdvancedCommand}"
Visibility="{Binding ShowAdvancedSettings, Converter={StaticResource BoolValueConverter}}"/>
<Button Grid.Column="1"
Style="{StaticResource AccentButtonStyle}"
MinWidth="76"

View file

@ -39,8 +39,6 @@ namespace ImageResizer.Views
return openFileDialog.FileNames;
}
public void ShowAdvanced(AdvancedViewModel viewModel) => viewModel?.Close(new AdvancedWindow(viewModel).ShowDialog() == true);
void IMainView.Close()
=> Dispatcher.Invoke((Action)Close);
}

View file

@ -3,6 +3,7 @@
#include <winrt/base.h>
#include <common/utils/resources.h>
#include "keyboardmanager/dll/Generated Files/resource.h"
#include "common/interop/shared_constants.h"
namespace KeyboardManagerConstants
{
@ -40,7 +41,7 @@ namespace KeyboardManagerConstants
inline const std::wstring DefaultConfiguration = L"default";
// Name of the named mutex used for configuration file.
inline const std::wstring ConfigFileMutexName = L"PowerToys.KeyboardManager.ConfigMutex";
inline const std::wstring ConfigFileMutexName = CommonSharedConstants::KEYBOARD_MANAGER_CONFIG_FILE_MUTEX_NAME;
// Name of the dummy update file.
inline const std::wstring DummyUpdateFileName = L"settings-updated.json";

View file

@ -11,7 +11,6 @@
#include <common/utils/elevation.h>
#include <common/utils/process_path.h>
#include <common/utils/resources.h>
#include <common/utils/os-detect.h>
#include <common/utils/winapi_error.h>
#include <filesystem>
@ -185,89 +184,86 @@ public:
Logger::info("Launcher is enabling");
ResetEvent(m_hEvent);
ResetEvent(send_telemetry_event);
// Start PowerLauncher.exe only if the OS is 19H1 or higher
if (UseNewSettings())
unsigned long powertoys_pid = GetCurrentProcessId();
if (!is_process_elevated(false))
{
unsigned long powertoys_pid = GetCurrentProcessId();
Logger::trace("Starting PowerToys Run from not elevated process");
std::wstring executable_args;
executable_args += L" -powerToysPid ";
executable_args += std::to_wstring(powertoys_pid);
executable_args += L" --centralized-kb-hook";
if (!is_process_elevated(false))
SHELLEXECUTEINFOW sei{ sizeof(sei) };
sei.fMask = { SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI };
sei.lpFile = L"modules\\launcher\\PowerLauncher.exe";
sei.nShow = SW_SHOWNORMAL;
sei.lpParameters = executable_args.data();
if (ShellExecuteExW(&sei))
{
Logger::trace("Starting PowerToys Run from not elevated process");
std::wstring executable_args;
executable_args += L" -powerToysPid ";
executable_args += std::to_wstring(powertoys_pid);
executable_args += L" --centralized-kb-hook";
SHELLEXECUTEINFOW sei{ sizeof(sei) };
sei.fMask = { SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI };
sei.lpFile = L"modules\\launcher\\PowerLauncher.exe";
sei.nShow = SW_SHOWNORMAL;
sei.lpParameters = executable_args.data();
if (ShellExecuteExW(&sei))
{
m_enabled = true;
m_hProcess = sei.hProcess;
Logger::trace("Started PowerToys Run. Handle {}", m_hProcess);
}
else
{
Logger::error("Launcher failed to start");
}
m_enabled = true;
m_hProcess = sei.hProcess;
Logger::trace("Started PowerToys Run. Handle {}", m_hProcess);
}
else
{
Logger::trace("Starting PowerToys Run from elevated process");
std::wstring action_runner_path = get_module_folderpath();
Logger::error("Launcher failed to start");
}
}
else
{
Logger::trace("Starting PowerToys Run from elevated process");
std::wstring action_runner_path = get_module_folderpath();
std::wstring params;
params += L"-run-non-elevated ";
params += L"-target modules\\launcher\\PowerLauncher.exe ";
params += L"-pidFile ";
params += POWER_LAUNCHER_PID_SHARED_FILE;
params += L" -powerToysPid " + std::to_wstring(powertoys_pid) + L" ";
params += L"--centralized-kb-hook ";
std::wstring params;
params += L"-run-non-elevated ";
params += L"-target modules\\launcher\\PowerLauncher.exe ";
params += L"-pidFile ";
params += POWER_LAUNCHER_PID_SHARED_FILE;
params += L" -powerToysPid " + std::to_wstring(powertoys_pid) + L" ";
params += L"--centralized-kb-hook ";
action_runner_path += L"\\action_runner.exe";
// Set up the shared file from which to retrieve the PID of PowerLauncher
HANDLE hMapFile = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(DWORD), POWER_LAUNCHER_PID_SHARED_FILE);
if (!hMapFile)
action_runner_path += L"\\action_runner.exe";
// Set up the shared file from which to retrieve the PID of PowerLauncher
HANDLE hMapFile = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(DWORD), POWER_LAUNCHER_PID_SHARED_FILE);
if (!hMapFile)
{
auto err = get_last_error_message(GetLastError());
Logger::error(L"Failed to create FileMapping {}. {}", POWER_LAUNCHER_PID_SHARED_FILE, err.has_value() ? err.value() : L"");
return;
}
PDWORD pidBuffer = reinterpret_cast<PDWORD>(MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD)));
if (pidBuffer)
{
*pidBuffer = 0;
m_hProcess = NULL;
if (run_non_elevated(action_runner_path, params, pidBuffer))
{
auto err = get_last_error_message(GetLastError());
Logger::error(L"Failed to create FileMapping {}. {}", POWER_LAUNCHER_PID_SHARED_FILE, err.has_value() ? err.value() : L"");
return;
}
PDWORD pidBuffer = reinterpret_cast<PDWORD>(MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD)));
if (pidBuffer)
{
*pidBuffer = 0;
m_hProcess = NULL;
if (run_non_elevated(action_runner_path, params, pidBuffer))
Logger::trace("Started PowerToys Run Process. PID {}", *pidBuffer);
m_enabled = true;
const int maxRetries = 80;
for (int retry = 0; retry < maxRetries; ++retry)
{
Logger::trace("Started PowerToys Run Process. PID {}", *pidBuffer);
m_enabled = true;
const int maxRetries = 80;
for (int retry = 0; retry < maxRetries; ++retry)
Sleep(50);
DWORD pid = *pidBuffer;
if (pid)
{
Sleep(50);
DWORD pid = *pidBuffer;
if (pid)
{
m_hProcess = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, pid);
Logger::trace("Opened PowerToys Run Process. Handle {}", m_hProcess);
break;
}
m_hProcess = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, pid);
Logger::trace("Opened PowerToys Run Process. Handle {}", m_hProcess);
break;
}
}
else
{
Logger::error("Failed to start PowerToys Run");
}
}
CloseHandle(hMapFile);
else
{
Logger::error("Failed to start PowerToys Run");
}
}
CloseHandle(hMapFile);
}
}

View file

@ -29,7 +29,7 @@ namespace PowerLauncher
{
public static PublicAPIInstance API { get; private set; }
private const string Unique = "PowerLauncher_Unique_Application_Mutex";
private const string Unique = "PowerToys_PowerToysRun_InstanceMutex";
private static bool _disposed;
private PowerToysRunSettings _settings;
private MainViewModel _mainVM;

View file

@ -44,6 +44,11 @@ namespace PowerLauncher.Helper
/// </summary>
private const string ChannelNameSuffix = "SingeInstanceIPCChannel";
/// <summary>
/// Prefix to the names of mutexes which ensures they are unique in a Windows session.
/// </summary>
private const string LocalMutexPrefix = @"Local\";
/// <summary>
/// Gets or sets application mutex.
/// </summary>
@ -62,7 +67,8 @@ namespace PowerLauncher.Helper
string channelName = string.Concat(applicationIdentifier, Delimiter, ChannelNameSuffix);
// Create mutex based on unique application Id to check if this is the first instance of the application.
SingleInstanceMutex = new Mutex(true, applicationIdentifier, out bool firstInstance);
string mutexName = string.Concat(LocalMutexPrefix, uniqueName);
SingleInstanceMutex = new Mutex(true, mutexName, out bool firstInstance);
if (firstInstance)
{
_ = CreateRemoteService(channelName);

View file

@ -128,9 +128,9 @@ namespace PowerLauncher.Plugin
return;
}
pair.LoadPlugin(API);
pair.InitializePlugin(API);
if (!pair.IsPluginLoaded)
if (!pair.IsPluginInitialized)
{
failedPlugins.Enqueue(pair);
}
@ -159,7 +159,7 @@ namespace PowerLauncher.Plugin
throw new ArgumentNullException(nameof(pair));
}
if (!pair.IsPluginLoaded)
if (!pair.IsPluginInitialized)
{
return new List<Result>();
}
@ -186,6 +186,11 @@ namespace PowerLauncher.Plugin
}
});
if (milliseconds > 50)
{
Log.Warn($"PluginManager.QueryForPlugin {metadata.Name}. Query cost - {milliseconds} milliseconds", typeof(PluginManager));
}
metadata.QueryCount += 1;
metadata.AvgQueryTime = metadata.QueryCount == 1 ? milliseconds : (metadata.AvgQueryTime + milliseconds) / 2;

View file

@ -187,8 +187,8 @@ namespace PowerLauncher
return PluginManager.AllPlugins.Select(x => new PowerLauncherPluginSettings()
{
Id = x.Metadata.ID,
Name = x.Plugin.Name,
Description = x.Plugin.Description,
Name = x.Plugin == null ? x.Metadata.Name : x.Plugin.Name,
Description = x.Plugin?.Description,
Author = x.Metadata.Author,
Disabled = x.Metadata.Disabled,
IsGlobal = x.Metadata.IsGlobal,

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Moduly plug-in: {0} se nepovedlo načíst a zakáže se. Pokud potřebujete pomoc, obraťte se prosím na autora modulu plug-in.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Nepovedlo se inicializovat moduly plug-in]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Plug-Ins: {0}. Die Plug-Ins konnten nicht geladen werden und werden deaktiviert. Wenden Sie sich an den Plug-In-Entwickler.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Fehler beim Initialisieren von Plug-Ins]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Complementos: no se pudo cargar {0} y se deshabilitará. Póngase en contacto con el creador de los complementos para obtener ayuda.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[No se pudieron inicializar los complementos]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Les plug-ins : {0} n'ont pas pu être chargés et ont été désactivés, contactez le créateur des plug-ins pour obtenir de l'aide]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[L'initialisation des plug-ins a échoué]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>
@ -100,15 +118,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";about_activate_times" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[You have activated Wox {0} times]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Vous avez activé Wox {0} fois]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";deseralization_error_message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Settings will be reset to default and program will continue to function.]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[A(z) {0} beépülő modulokat nem sikerült betölteni és le lesznek tiltva. Kérjen segítséget a beépülő modul készítőjétől]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Nem sikerült inicializálni a beépülő modulokat]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Plug-in: {0}. Il caricamento non è riuscito e verrà disabilitato. Per richiedere assistenza, contattare l'autore del plug-in.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Non è stato possibile inizializzare i plug-in]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[プラグイン: {0} - 読み込みに失敗したため、無効になります。プラグインの作成者にお問い合わせください]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[プラグインの初期化失敗]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>
@ -100,15 +118,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";about_activate_times" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[You have activated Wox {0} times]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Wox を {0} 回アクティブ化しました]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";deseralization_error_message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Settings will be reset to default and program will continue to function.]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[플러그 인: {0} - 로드하지 못하여 사용할 수 없습니다. 도움말은 플러그 인 작성자에게 문의하세요.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[플러그 인을 초기화하지 못함]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>
@ -100,15 +118,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";about_activate_times" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[You have activated Wox {0} times]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Wox를 {0}번 활성화했습니다.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";deseralization_error_message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Settings will be reset to default and program will continue to function.]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Invoegtoepassingen: {0} - kunnen niet worden geladen en worden uitgeschakeld. Neem voor hulp contact op met de maker van de invoegtoepassingen]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Kan invoegtoepassingen niet initialiseren]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>
@ -100,15 +118,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";about_activate_times" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[You have activated Wox {0} times]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[U hebt Wox {0} keer geactiveerd]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";deseralization_error_message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Settings will be reset to default and program will continue to function.]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Wtyczki: {0} — nie można załadować i zostałyby wyłączone; skontaktuj się z twórcą wtyczek, aby uzyskać pomoc]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Nie można zainicjować wtyczek]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Plug-ins: {0} falha no carregamento e possibilidade de desabilitação. Entre em contato com o criador de plug-ins para obter ajuda]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Falha ao inicializar os plug-ins]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Plug-ins: {0} - falha ao carregar e seriam desativados. Contacte o criador dos plug-ins para obter ajuda]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Falha ao inicializar os plug-ins]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Не удалось загрузить подключаемые модули ({0}). Они будут отключены. Обратитесь за помощью к создателю подключаемых модулей.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Не удалось инициализировать подключаемые модули]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Plugin-program: {0} kunde inte läsas in och har inaktiverats. Kontakta skaparen av plugin-program om du vill ha hjälp]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Det gick inte att initiera plugin-program]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[{0} eklentileri yüklenemediğinden devre dışı bırakılacak. Yardım için lütfen eklenti oluşturucuya başvurun]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Eklentiler başlatılamadı]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>
@ -100,15 +118,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";about_activate_times" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[You have activated Wox {0} times]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Wox'u {0} kez etkinleştirdiniz]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";deseralization_error_message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Settings will be reset to default and program will continue to function.]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[插件: {0} - 未能加载且将被禁用,请与插件创建者联系以获取帮助]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[未能初始化插件]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>
@ -100,15 +118,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";about_activate_times" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[You have activated Wox {0} times]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[你已激活 Wox {0} 次]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";deseralization_error_message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Settings will be reset to default and program will continue to function.]]></Val>

View file

@ -55,6 +55,24 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Plugins: {0} - fail to load and would be disabled, please contact plugins creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[外掛程式: {0} - 無法載入且即將停用,請連絡外掛程式建立者以取得協助]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FailedToInitializePluginsTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Fail to initialize plugins]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[無法將外掛程式初始化]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Query" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Query]]></Val>
@ -100,15 +118,6 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";about_activate_times" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[You have activated Wox {0} times]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[您已啟用了 Wox {0} 次]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";deseralization_error_message" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Settings will be reset to default and program will continue to function.]]></Val>

View file

@ -23,40 +23,36 @@ namespace Wox.Plugin
public PluginPair(PluginMetadata metadata)
{
this.Metadata = metadata;
LoadPlugin();
}
public bool IsPluginLoaded { get; set; }
public bool IsPluginInitialized { get; set; }
public void LoadPlugin(IPublicAPI api)
public void InitializePlugin(IPublicAPI api)
{
if (Metadata.Disabled)
{
Log.Info($"Do not load {Metadata.Name} as it is disabled.", GetType());
Log.Info($"Do not initialize {Metadata.Name} as it is disabled.", GetType());
return;
}
if (IsPluginLoaded)
if (IsPluginInitialized)
{
Log.Info($"Plugin {Metadata.Name} is already loaded", GetType());
Log.Info($"{Metadata.Name} plugin is already initialized", GetType());
return;
}
var stopWatch = new Stopwatch();
stopWatch.Start();
if (!CreatePluginInstance())
{
return;
}
if (!InitPlugin(api))
{
return;
}
stopWatch.Stop();
IsPluginLoaded = true;
IsPluginInitialized = true;
Metadata.InitTime += stopWatch.ElapsedMilliseconds;
Log.Info($"Total load cost for <{Metadata.Name}> is <{Metadata.InitTime}ms>", GetType());
Log.Info($"Total initialize cost for <{Metadata.Name}> is <{Metadata.InitTime}ms>", GetType());
return;
}
@ -70,8 +66,8 @@ namespace Wox.Plugin
if (Metadata.Disabled && !setting.Disabled)
{
Metadata.Disabled = false;
LoadPlugin(api);
if (!IsPluginLoaded)
InitializePlugin(api);
if (!IsPluginInitialized)
{
var title = string.Format(CultureInfo.CurrentCulture, Resources.FailedToLoadPluginTitle, Metadata.Name);
api.ShowMsg(title, Resources.FailedToLoadPluginDescription, string.Empty, false);
@ -115,8 +111,23 @@ namespace Wox.Plugin
return hashcode;
}
private void LoadPlugin()
{
var stopWatch = new Stopwatch();
CreatePluginInstance();
stopWatch.Stop();
Metadata.InitTime += stopWatch.ElapsedMilliseconds;
Log.Info($"Load cost for <{Metadata.Name}> is <{Metadata.InitTime}ms>", GetType());
}
private bool CreatePluginInstance()
{
if (Plugin != null)
{
Log.Warn($"{Metadata.Name} plugin was already loaded", GetType());
return true;
}
try
{
_assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(Metadata.ExecuteFilePath);
@ -158,6 +169,12 @@ namespace Wox.Plugin
private bool InitPlugin(IPublicAPI api)
{
if (Plugin == null)
{
Log.Warn($"Can not initialize {Metadata.Name} plugin as it was not loaded", GetType());
return false;
}
try
{
Plugin.Init(new PluginInitContext

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Nepovedlo se zkopírovat cestu {0}. Aby se zachovala konzistence, cesta se odstraní.]]></Val>
<Val><![CDATA[Pokud potřebujete pomoc, obraťte se prosím na autora modulu plug-in.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Nepovedlo se odstranit složku {0}. Přejděte prosím na příslušné umístění a odstraňte ji ručně.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Nepovedlo se ověřit složky a soubory mezi {0} a {1}.]]></Val>
<Val><![CDATA[Nepovedlo se načíst modul plug-in {0}]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Fehler beim Kopieren des Pfads "{0}". Er wird nun aus Konsistenzgründen gelöscht.]]></Val>
<Val><![CDATA[Wenden Sie sich an den Plug-In-Entwickler.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Der Ordner "{0}" kann nicht gelöscht werden. Wechseln Sie zum Speicherort, und löschen Sie ihn manuell.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Die Ordner und Dateien zwischen "{0}" und "{1}" können nicht verifiziert werden.]]></Val>
<Val><![CDATA[Fehler beim Laden des Plug-Ins "{0}"]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Error al copiar la ruta de acceso {0}. Ahora se eliminará por coherencia.]]></Val>
<Val><![CDATA[Póngase en contacto con el creador del complemento para obtener ayuda.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[No se puede eliminar la carpeta {0}. Vaya a la ubicación y elimínela manualmente.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[No se pueden comprobar las carpetas y los archivos entre {0} y {1}.]]></Val>
<Val><![CDATA[No se pudo cargar el complemento {0}]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[La copie du chemin {0} a échoué, il est maintenant supprimé pour assurer la cohérence]]></Val>
<Val><![CDATA[Contactez le créateur du plug-in pour obtenir de l'aide]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Impossible de supprimer le dossier {0}, accédez à l'emplacement et supprimez-le manuellement]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Impossible de vérifier les dossiers et les fichiers entre {0} et {1}]]></Val>
<Val><![CDATA[Le chargement du plug-in {0} a échoué]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[A(z) {0} elérési út másolása sikertelen volt, a konzisztencia érdekében törlődik]]></Val>
<Val><![CDATA[Kérjen segítséget a beépülő modul készítőjétől]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Nem sikerült törölni a(z) {0} mappát, lépjen a helyhez, és törölje manuálisan]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Nem sikerült ellenőrizni a mappákat és a fájlokat a(z) {0} és {1} között]]></Val>
<Val><![CDATA[Nem sikerült betölteni a(z) {0} beépülő modult]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[La copia del percorso {0} non è riuscita. Per coerenza, verrà eliminato]]></Val>
<Val><![CDATA[Per richiedere assistenza, contattare l'autore del plug-in]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Non è possibile eliminare la cartella {0}. Passare al percorso ed eliminarla manualmente]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Non è possibile verificare i file e le cartelle tra {0} e {1}]]></Val>
<Val><![CDATA[Non è stato possibile caricare il plug-in {0}]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[パス {0} をコピーできませんでした。これは、整合性のために削除されます]]></Val>
<Val><![CDATA[プラグインの作成者にお問い合わせください]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[フォルダー {0} を削除できません。その場所に移動して、手動で削除してください]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[{0} と {1} の間のフォルダーとファイルを確認できません]]></Val>
<Val><![CDATA[{0} プラグインの読み込み失敗]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[경로 {0}을(를) 복사하지 못했습니다. 지금 일관성을 위해 삭제됩니다.]]></Val>
<Val><![CDATA[도움말은 플러그 인 작성자에게 문의하세요.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[폴더 {0}을(를) 삭제할 수 없습니다. 해당 위치로 이동하여 수동으로 삭제하세요.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[{0}~{1}의 폴더와 파일을 확인할 수 없음]]></Val>
<Val><![CDATA[{0} 플러그 인을 로드하지 못함]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Kan het pad {0} niet kopiëren. Het pad wordt nu verwijderd voor consistentie]]></Val>
<Val><![CDATA[Neem voor hulp contact op met de maker van de invoegtoepassingen]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Kan de map {0} niet verwijderen. Ga naar de locatie en om de map handmatig te verwijderen]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Kan geen mappen en bestanden controleren tussen {0} en {1}]]></Val>
<Val><![CDATA[Kan invoegtoepassing {0} niet laden]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Kopiowanie ścieżki {0} nie powiodło się, zostanie ona teraz usunięta w celu zapewnienia spójności]]></Val>
<Val><![CDATA[Skontaktuj się z autorem wtyczki, aby uzyskać pomoc]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Nie można usunąć folderu {0}, przejdź do lokalizacji i usuń go ręcznie.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Nie można zweryfikować folderów i plików między ścieżkami {0} i {1}]]></Val>
<Val><![CDATA[Nie można załadować wtyczki {0}]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Falha ao copiar o caminho {0}, ele será excluído para consistência]]></Val>
<Val><![CDATA[Entre em contato com o criador do plug-in para obter ajuda]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Não é possível excluir a pasta {0}, vá até o local e exclua-a manualmente]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Não é possível verificar pastas e arquivos entre {0} e {1}]]></Val>
<Val><![CDATA[Falha ao Carregar o Plug-in {0}]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[O caminho de cópia {0} falhou. Agora será eliminado por motivos de consistência]]></Val>
<Val><![CDATA[Contacte o criador do plug-in para obter ajuda]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Não é possível eliminar a pasta {0}. Aceda ao local e elimine-a manualmente]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Não é possível verificar pastas e ficheiros entre {0} e {1}]]></Val>
<Val><![CDATA[Falha ao Carregar Plug-in {0}]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Не удалось скопировать путь {0}, он будет удален для обеспечения согласованности.]]></Val>
<Val><![CDATA[Для получения помощи обратитесь к разработчику подключаемого модуля.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Не удается удалить папку {0}, перейдите в ее расположение и удалите ее вручную.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Не удается проверить папки и файлы между {0} и {1}.]]></Val>
<Val><![CDATA[Не удалось загрузить подключаемый модуль {0}]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Det gick inte att kopiera sökvägen {0}. Den kommer nu att tas bort av konsekvensskäl]]></Val>
<Val><![CDATA[Kontakta skaparen av plugin-program om du vill ha hjälp]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Det gick inte att ta bort mappen {0}. Gå till platsen och ta bort den manuellt]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Det gick inte att verifiera mappar och filer mellan {0} och {1}]]></Val>
<Val><![CDATA[Det gick inte att läsa in {0} plugin-program]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[{0} yolu kopyalanamadığından şimdi tutarlılık için silinecek]]></Val>
<Val><![CDATA[Yardım için lütfen eklenti oluşturucuya başvurun]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[{0} klasörü silinemiyor, lütfen konuma gidin ve kendiniz silin]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[{0} ile {1} arasındaki klasör ve dosyalar doğrulanamıyor]]></Val>
<Val><![CDATA[{0} Eklentisi yüklenemedi]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[无法复制路径 {0}。为了保持一致性,现在它将被删除]]></Val>
<Val><![CDATA[请与插件创建者联系以获取帮助]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[无法删除文件夹 {0}。请转到相应位置,然后手动删除它]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[无法验证 {0} 和 {1} 之间的文件夹和文件]]></Val>
<Val><![CDATA[未能加载 {0} 插件]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -10,29 +10,20 @@
<Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
<Item ItemId=";Strings" ItemType="0" PsrId="211" Leaf="false">
<Disp Icon="Str" Disp="true" LocTbl="false" />
<Item ItemId=";filesfolder_copy_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginDescription" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Copying path {0} has failed, it will now be deleted for consistency]]></Val>
<Val><![CDATA[Please contact plugin creator for help]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[複製路徑 {0} 已失敗。為保持一致性,將立即刪除]]></Val>
<Val><![CDATA[請連絡外掛程式建立者以取得協助]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_removefolder_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Item ItemId=";FailedToLoadPluginTitle" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Not able to delete folder {0}, please go to the location and manually delete it]]></Val>
<Val><![CDATA[Fail to Load {0} Plugin]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[無法刪除資料夾 {0},請前往該位置並手動將其刪除]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";filesfolder_verifybothfolderfilesequal_failed" ItemType="0;.resx" PsrId="211" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Unable to verify folders and files between {0} and {1}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[無法在 {0} 與 {1} 之間驗證資料夾和檔案]]></Val>
<Val><![CDATA[無法載入 {0} 外掛程式]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

View file

@ -48,7 +48,7 @@ namespace Wox.Test
var pluginPair = new PluginPair(metadata)
{
Plugin = pluginMock.Object,
IsPluginLoaded = true,
IsPluginInitialized = true,
};
// Act

View file

@ -159,6 +159,42 @@ HRESULT GetTransformedFileName(_Out_ PWSTR result, UINT cchMax, _In_ PCWSTR sour
{
hr = StringCchCopy(result, cchMax, source);
}
}
else if (flags & Capitalized)
{
if (!(flags & ExtensionOnly))
{
std::wstring stem = fs::path(source).stem().wstring();
std::wstring extension = fs::path(source).extension().wstring();
size_t stemLength = stem.length();
while (stemLength > 0 && (iswspace(stem[stemLength - 1]) || iswpunct(stem[stemLength - 1])))
{
stemLength--;
}
for (size_t i = 0; i < stemLength; i++)
{
if (!i || iswspace(stem[i - 1]) || iswpunct(stem[i - 1]))
{
if (iswspace(stem[i]) || iswpunct(stem[i]))
{
continue;
}
stem[i] = towupper(stem[i]);
}
else
{
stem[i] = towlower(stem[i]);
}
}
hr = StringCchPrintf(result, cchMax, L"%s%s", stem.c_str(), extension.c_str());
}
else
{
hr = StringCchCopy(result, cchMax, source);
}
}
else
{

View file

@ -14,7 +14,8 @@ enum PowerRenameFlags
ExtensionOnly = 0x100,
Uppercase = 0x200,
Lowercase = 0x400,
Titlecase = 0x800
Titlecase = 0x800,
Capitalized = 0x1000
};
enum PowerRenameFilters

View file

@ -945,7 +945,7 @@ DWORD WINAPI CPowerRenameManager::s_regexWorkerThread(_In_ void* pv)
// as nullptr so we clear the renamed column
// Except string transformation is selected.
if (newName == nullptr && (flags & Uppercase || flags & Lowercase || flags & Titlecase))
if (newName == nullptr && (flags & Uppercase || flags & Lowercase || flags & Titlecase || flags & Capitalized))
{
SHStrDup(sourceName, &newName);
}
@ -983,7 +983,7 @@ DWORD WINAPI CPowerRenameManager::s_regexWorkerThread(_In_ void* pv)
}
wchar_t transformedName[MAX_PATH] = { 0 };
if (newNameToUse != nullptr && (flags & Uppercase || flags & Lowercase || flags & Titlecase))
if (newNameToUse != nullptr && (flags & Uppercase || flags & Lowercase || flags & Titlecase || flags & Capitalized))
{
winrt::check_hresult(GetTransformedFileName(transformedName, ARRAYSIZE(transformedName), newNameToUse, flags));
newNameToUse = transformedName;

View file

@ -29,9 +29,9 @@
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
// XPOS YPOS WIDTH HEIGHT
IDD_MAIN DIALOGEX 0, 0, 364, 347
IDD_MAIN DIALOGEX 0, 0, 364, 359
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION ""
FONT 8, "MS Shell Dlg", 400, 0, 0x1
@ -44,22 +44,23 @@
CONTROL "",IDC_CHECK_ENUMITEMS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 21, 119, 150, 10
CONTROL "",IDC_CHECK_NAMEONLY, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 21, 131, 150, 10
CONTROL "",IDC_CHECK_EXTENSIONONLY, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 21, 143, 150, 10
CONTROL "",IDC_CHECK_EXCLUDEFOLDERS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 83, 150, 10
CONTROL "",IDC_CHECK_EXCLUDEFILES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 95, 150, 10
CONTROL "",IDC_CHECK_EXCLUDESUBFOLDERS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 107, 150, 10
CONTROL "",IDC_TRANSFORM_UPPERCASE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 119, 150, 10
CONTROL "",IDC_TRANSFORM_LOWERCASE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 131, 150, 10
CONTROL "",IDC_TRANSFORM_TITLECASE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 143, 150, 10
CONTROL "",IDC_LIST_PREVIEW,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP,22,190,308,116
DEFPUSHBUTTON "",ID_RENAME,178,325,50,14
PUSHBUTTON "",ID_ABOUT,234,325,50,14
PUSHBUTTON "",IDCANCEL,290,325,50,14
CONTROL "",IDC_CHECK_EXCLUDEFOLDERS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 21, 155, 150, 10
CONTROL "",IDC_CHECK_EXCLUDEFILES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 83, 150, 10
CONTROL "",IDC_CHECK_EXCLUDESUBFOLDERS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 95, 150, 10
CONTROL "",IDC_TRANSFORM_UPPERCASE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 107, 150, 10
CONTROL "",IDC_TRANSFORM_LOWERCASE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 119, 150, 10
CONTROL "",IDC_TRANSFORM_TITLECASE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 131, 150, 10
CONTROL "",IDC_TRANSFORM_CAPITALIZED, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 181, 143, 150, 10
CONTROL "",IDC_LIST_PREVIEW,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP,22,202,308,116
DEFPUSHBUTTON "",ID_RENAME,178,337,50,14
PUSHBUTTON "",ID_ABOUT,234,337,50,14
PUSHBUTTON "",IDCANCEL,290,337,50,14
RTEXT "",IDC_SEARCH_FOR,21,23,75,8
RTEXT "",IDC_REPLACE_WITH,21,40,75,8
LTEXT "",IDC_STATUS_MESSAGE_SELECTED, 11, 323, 137, 13
LTEXT "",IDC_STATUS_MESSAGE_RENAMING, 11, 333, 137, 13
GROUPBOX "",IDC_OPTIONSGROUP,11,68,329,94
GROUPBOX "",IDC_PREVIEWGROUP,11,175,329,142
LTEXT "",IDC_STATUS_MESSAGE_SELECTED, 11, 335, 137, 13
LTEXT "",IDC_STATUS_MESSAGE_RENAMING, 11, 345, 137, 13
GROUPBOX "",IDC_OPTIONSGROUP,11,68,329,106
GROUPBOX "",IDC_PREVIEWGROUP,11,187,329,142
GROUPBOX "",IDC_SEARCHREPLACEGROUP,11,7,329,55
END

View file

@ -39,7 +39,8 @@ FlagCheckboxMap g_flagCheckboxMap[] = {
{ ExtensionOnly, IDC_CHECK_EXTENSIONONLY },
{ Uppercase, IDC_TRANSFORM_UPPERCASE },
{ Lowercase, IDC_TRANSFORM_LOWERCASE },
{ Titlecase, IDC_TRANSFORM_TITLECASE }
{ Titlecase, IDC_TRANSFORM_TITLECASE },
{ Capitalized, IDC_TRANSFORM_CAPITALIZED }
};
struct RepositionMap
@ -708,6 +709,7 @@ void CPowerRenameUI::_InitDlgText()
UpdateDlgControl(m_hwnd, IDC_CHECK_NAMEONLY, IDS_ITEM_NAME_ONLY);
UpdateDlgControl(m_hwnd, IDC_CHECK_EXTENSIONONLY, IDS_ITEM_EXTENSION_ONLY);
UpdateDlgControl(m_hwnd, IDC_TRANSFORM_TITLECASE, IDS_MAKE_TITLECASE);
UpdateDlgControl(m_hwnd, IDC_TRANSFORM_CAPITALIZED, IDS_MAKE_CAPITALIZED);
UpdateDlgControl(m_hwnd, ID_RENAME, IDS_RENAME_BUTTON);
UpdateDlgControl(m_hwnd, ID_ABOUT, IDS_HELP_BUTTON);
UpdateDlgControl(m_hwnd, IDCANCEL, IDS_CANCEL_BUTTON);
@ -756,6 +758,7 @@ void CPowerRenameUI::_OnCommand(_In_ WPARAM wParam, _In_ LPARAM lParam)
case IDC_CHECK_NAMEONLY:
case IDC_TRANSFORM_UPPERCASE:
case IDC_TRANSFORM_LOWERCASE:
case IDC_TRANSFORM_CAPITALIZED:
case IDC_TRANSFORM_TITLECASE:
if (BN_CLICKED == HIWORD(wParam))
{
@ -981,6 +984,7 @@ void CPowerRenameUI::_ValidateFlagCheckbox(_In_ DWORD checkBoxId)
{
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_LOWERCASE), FALSE);
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_TITLECASE), FALSE);
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_CAPITALIZED), FALSE);
}
}
else if (checkBoxId == IDC_TRANSFORM_LOWERCASE)
@ -989,6 +993,7 @@ void CPowerRenameUI::_ValidateFlagCheckbox(_In_ DWORD checkBoxId)
{
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_UPPERCASE), FALSE);
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_TITLECASE), FALSE);
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_CAPITALIZED), FALSE);
}
}
else if (checkBoxId == IDC_TRANSFORM_TITLECASE)
@ -997,6 +1002,16 @@ void CPowerRenameUI::_ValidateFlagCheckbox(_In_ DWORD checkBoxId)
{
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_UPPERCASE), FALSE);
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_LOWERCASE), FALSE);
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_CAPITALIZED), FALSE);
}
}
else if (checkBoxId == IDC_TRANSFORM_CAPITALIZED)
{
if (Button_GetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_CAPITALIZED)) == BST_CHECKED)
{
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_UPPERCASE), FALSE);
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_LOWERCASE), FALSE);
Button_SetCheck(GetDlgItem(m_hwnd, IDC_TRANSFORM_TITLECASE), FALSE);
}
}
else if (checkBoxId == IDC_CHECK_NAMEONLY)

View file

@ -175,6 +175,9 @@ Please select from the options above to show items.</value>
<data name="Make_Titlecase" xml:space="preserve">
<value>Make Titlecase</value>
</data>
<data name="Make_Capitalized" xml:space="preserve">
<value>Make Capitalized</value>
</data>
<data name="Rename_Button" xml:space="preserve">
<value>&amp;Rename</value>
</data>

View file

@ -169,6 +169,18 @@
<Item ItemId=";Loading_Msg" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Please wait while the selected items are enumerated.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Počkejte prosím, než se provede výčet vybraných položek.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Make_Capitalized" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Make Capitalized]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Převést na velká písmena]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>

View file

@ -169,6 +169,18 @@
<Item ItemId=";Loading_Msg" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Please wait while the selected items are enumerated.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Warten Sie, während die ausgewählten Elemente aufgelistet werden.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Make_Capitalized" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Make Capitalized]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Großbuchstaben verwenden]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>

View file

@ -169,6 +169,18 @@
<Item ItemId=";Loading_Msg" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Please wait while the selected items are enumerated.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Espere mientras se enumeran los elementos seleccionados.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Make_Capitalized" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Make Capitalized]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Convertir en mayúsculas]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>

View file

@ -169,6 +169,18 @@
<Item ItemId=";Loading_Msg" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Please wait while the selected items are enumerated.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Veuillez patienter pendant l'énumération des éléments sélectionnés.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Make_Capitalized" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Make Capitalized]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Mettre en majuscules]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>

View file

@ -169,6 +169,18 @@
<Item ItemId=";Loading_Msg" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Please wait while the selected items are enumerated.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Várjon, amíg a rendszer számba veszi a kijelölt elemeket.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Make_Capitalized" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Make Capitalized]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Nagybetűssé tétel]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>

View file

@ -175,6 +175,15 @@
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Make_Capitalized" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Make Capitalized]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Converti in maiuscolo]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Make_Lowercase" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Make Lowercase]]></Val>

View file

@ -169,6 +169,18 @@
<Item ItemId=";Loading_Msg" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Please wait while the selected items are enumerated.]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[選択した項目を列挙しています。しばらくお待ちください。]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";Make_Capitalized" ItemType="0;.resx" PsrId="211" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Make Capitalized]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[大文字にする]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>

Some files were not shown because too many files have changed in this diff Show more