Compare commits

..

6 Commits

Author SHA1 Message Date
ema
a491ed9970 Add 'Copy as path' option to More menu
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-09-08 03:53:16 +08:00
ema
c748f6d7e4 Update NuGet package versions in project files
This commit updates various NuGet package references to newer versions across multiple QuickLook plugin and main project .csproj files. These updates include dependencies such as WixToolset.Dtf.WindowsInstaller, UTF.Unknown, FreeTypeSharp, Microsoft.Web.WebView2, Magick.NET-Q8-AnyCPU, Google.Protobuf, MsgReader, HelixToolkit, bblanchon.PDFiumV8.Win32, Melanchall.DryWetMidi, WPF-UI.Violeta, and Lib.Harmony, ensuring the projects use the latest compatible releases.
2025-09-08 02:42:09 +08:00
ema
e0a2204e56 Add diff file syntax highlighting 2025-09-08 02:16:55 +08:00
ema
d6274ac331 Prepare new feature for MoreMenu 2025-09-08 01:49:36 +08:00
ema
07debda5e4 feat: improve UI/UX of font loading 2025-09-08 01:14:01 +08:00
ema
cddf767c6c refactor: simplify tray menu ctor calling 2025-09-07 23:55:24 +08:00
26 changed files with 492 additions and 49 deletions

View File

@@ -72,7 +72,7 @@
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<PackageReference Include="WixToolset.Dtf.WindowsInstaller" Version="6.0.1" />
<PackageReference Include="WixToolset.Dtf.WindowsInstaller" Version="6.0.2" />
<PackageReference Include="SharpZipLib" Version="1.4.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="PureSharpCompress" Version="0.40.0" />

View File

@@ -53,7 +53,7 @@
<ItemGroup>
<PackageReference Include="PureSharpCompress" Version="0.40.0" />
<PackageReference Include="UTF.Unknown" Version="2.5.1" />
<PackageReference Include="UTF.Unknown" Version="2.6.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -53,7 +53,7 @@
<ItemGroup>
<PackageReference Include="CsvHelper" Version="33.1.0" />
<PackageReference Include="UTF.Unknown" Version="2.5.1" />
<PackageReference Include="UTF.Unknown" Version="2.6.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -0,0 +1,26 @@
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace QuickLook.Plugin.FontViewer;
public class ObservableFileStream(string path, FileMode mode, FileAccess access, FileShare share) : FileStream(path, mode, access, share)
{
public bool IsEndOfStream { get; protected set; } = false;
public override int Read(byte[] array, int offset, int count)
{
int result = base.Read(array, offset, count);
if (result == 0)
IsEndOfStream = true;
return result;
}
public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
int result = await base.ReadAsync(buffer, offset, count, cancellationToken);
if (result == 0)
IsEndOfStream = true;
return result;
}
}

View File

@@ -19,6 +19,7 @@ using QuickLook.Common.Plugin;
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace QuickLook.Plugin.FontViewer;
@@ -52,7 +53,12 @@ public class Plugin : IViewer
context.ViewerContent = _panel;
context.Title = Path.GetFileName(path);
context.IsBusy = false;
_ = Task.Run(() =>
{
_ = _panel.WaitForFontSent();
context.IsBusy = false;
});
}
public void Cleanup()

View File

@@ -71,9 +71,9 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="FreeTypeSharp" Version="3.0.0" />
<PackageReference Include="FreeTypeSharp" Version="3.0.1" />
<PackageReference Include="QuickLook.Typography.OpenFont" Version="1.0.1" />
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3351.48">
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3405.78">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>

View File

@@ -26,6 +26,7 @@ using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
namespace QuickLook.Plugin.FontViewer;
@@ -34,6 +35,7 @@ public class WebfontPanel : WebpagePanel
protected const string _resourcePrefix = "QuickLook.Plugin.FontViewer.Resources.";
protected internal static readonly Dictionary<string, byte[]> _resources = [];
protected byte[] _homePage;
protected ObservableFileStream _fontStream = null;
static WebfontPanel()
{
@@ -153,10 +155,11 @@ public class WebfontPanel : WebpagePanel
if (File.Exists(localPath))
{
var fileStream = new FileStream(localPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
var fileStream = new ObservableFileStream(localPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
var response = _webView.CoreWebView2.Environment.CreateWebResourceResponse(
fileStream, 200, "OK", MimeTypes.GetContentType());
args.Response = response;
_fontStream = fileStream; // Only the font request will set this
}
}
}
@@ -168,6 +171,19 @@ public class WebfontPanel : WebpagePanel
}
}
public bool WaitForFontSent()
{
bool timeout = SpinWait.SpinUntil(
() => _fontStream is not null && _fontStream.IsEndOfStream,
TimeSpan.FromSeconds(1.5d) // The prediction is MAX 100MB
);
// Only when the `IsEndOfStream` is true
// Delay 15ms per MB for webview2 to render the font
if (timeout) Thread.Sleep(15 * (int)(_fontStream.Position / 1_048_576));
return timeout;
}
public static bool ContainsKey(string key)
{
return _resources.ContainsKey(key);

View File

@@ -52,8 +52,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="HelixToolkit" Version="2.27.0" />
<PackageReference Include="HelixToolkit.Wpf" Version="2.27.0" />
<PackageReference Include="HelixToolkit" Version="2.27.3" />
<PackageReference Include="HelixToolkit.Wpf" Version="2.27.3" />
<PackageReference Include="AssimpNet" Version="5.0.0-beta1" />
<PackageReference Include="PcdSharp" Version="1.0.1" />
</ItemGroup>

View File

@@ -61,7 +61,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3351.48">
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3405.78">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>

View File

@@ -59,13 +59,13 @@
<PackageReference Include="QuickLook.ImageGlass.WebP" Version="1.4.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Magick.NET-Q8-AnyCPU" Version="14.7.0">
<PackageReference Include="Magick.NET-Q8-AnyCPU" Version="14.8.2">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3351.48">
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3405.78">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Google.Protobuf" Version="3.31.1">
<PackageReference Include="Google.Protobuf" Version="3.32.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="System.Memory" Version="4.6.3">

View File

@@ -55,7 +55,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MsgReader" Version="6.0.1" />
<PackageReference Include="MsgReader" Version="6.0.4" />
</ItemGroup>
<ItemGroup>

View File

@@ -59,9 +59,9 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="UTF.Unknown" Version="2.5.1" />
<PackageReference Include="UTF.Unknown" Version="2.6.0" />
<Reference Include="WindowsBase" />
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3351.48">
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3405.78">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>

View File

@@ -34,7 +34,6 @@ public class Plugin : IViewer
".xls", ".xlsx", ".xlsm", ".xlsb", ".ods",
".ppt", ".pptx", ".odp",
".vsd", ".vsdx",
".ofd",
];
private PreviewPanel _panel;

View File

@@ -64,7 +64,7 @@
<ItemGroup>
<PackageReference Include="PdfiumViewer.Updated" Version="2.14.5" />
<PackageReference Include="bblanchon.PDFiumV8.Win32" Version="140.0.7269" />
<PackageReference Include="bblanchon.PDFiumV8.Win32" Version="141.0.7388" />
<Reference Include="WindowsBase" />
</ItemGroup>

View File

@@ -60,7 +60,7 @@
<ItemGroup>
<PackageReference Include="AvalonEdit" Version="6.3.1.120" />
<PackageReference Include="UTF.Unknown" Version="2.5.1" />
<PackageReference Include="UTF.Unknown" Version="2.6.0" />
<Reference Include="WindowsBase" />
<Reference Include="System.ComponentModel.Composition" />
<PackageReference Include="System.Memory" Version="4.6.3" />

View File

@@ -0,0 +1,124 @@
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Highlighting;
using ICSharpCode.AvalonEdit.Rendering;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace QuickLook.Plugin.TextViewer.Themes.HighlightingDefinitions.Dark;
public class DiffHighlightingDefinition : DarkHighlightingDefinition
{
public override string Name => "Diff";
public override string Extension => ".diff";
public override HighlightingRuleSet MainRuleSet => new()
{
Rules =
{
// Diff header (diff --git, index, etc.)
new HighlightingRule
{
Regex = new Regex(@"^(diff --git|index|---|\+\+\+)", RegexOptions.Compiled),
Color = GetNamedColor("Header")
},
// File mode and other metadata
new HighlightingRule
{
Regex = new Regex(@"^(new file mode|deleted file mode|old mode|new mode|similarity index|dissimilarity index|rename from|rename to|copy from|copy to)", RegexOptions.Compiled),
Color = GetNamedColor("Metadata")
},
// Hunk headers (@@ ... @@)
new HighlightingRule
{
Regex = new Regex(@"^@@.*@@$", RegexOptions.Compiled),
Color = GetNamedColor("HunkHeader")
},
// Added lines (+)
new HighlightingRule
{
Regex = new Regex(@"^\+.*$", RegexOptions.Compiled),
Color = GetNamedColor("Added")
},
// Removed lines (-)
new HighlightingRule
{
Regex = new Regex(@"^-.*$", RegexOptions.Compiled),
Color = GetNamedColor("Removed")
},
// Context lines (unchanged)
new HighlightingRule
{
Regex = new Regex(@"^ .*", RegexOptions.Compiled),
Color = GetNamedColor("Context")
}
}
};
public override HighlightingColor GetNamedColor(string name)
{
return name switch
{
"Header" => new HighlightingColor
{
Name = "Header",
Foreground = new SimpleHighlightingBrush("#569CD6".ToColor()), // Blue for headers
},
"Metadata" => new HighlightingColor
{
Name = "Metadata",
Foreground = new SimpleHighlightingBrush("#808080".ToColor()), // Gray for metadata
},
"HunkHeader" => new HighlightingColor
{
Name = "HunkHeader",
Foreground = new SimpleHighlightingBrush("#C586C0".ToColor()), // Purple for hunk headers
},
"Added" => new HighlightingColor
{
Name = "Added",
Foreground = new SimpleHighlightingBrush("#6A9949".ToColor()), // Green for added lines
},
"Removed" => new HighlightingColor
{
Name = "Removed",
Foreground = new SimpleHighlightingBrush("#F44747".ToColor()), // Red for removed lines
},
"Context" => new HighlightingColor
{
Name = "Context",
Foreground = new SimpleHighlightingBrush("#D4D4D4".ToColor()), // Light gray for context
},
_ => null,
};
}
public override IEnumerable<HighlightingColor> NamedHighlightingColors =>
[
GetNamedColor("Header"),
GetNamedColor("Metadata"),
GetNamedColor("HunkHeader"),
GetNamedColor("Added"),
GetNamedColor("Removed"),
GetNamedColor("Context"),
];
public override DocumentColorizingTransformer[] LineTransformers { get; } = [];
}

View File

@@ -0,0 +1,124 @@
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Highlighting;
using ICSharpCode.AvalonEdit.Rendering;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace QuickLook.Plugin.TextViewer.Themes.HighlightingDefinitions.Light;
public class DiffHighlightingDefinition : LightHighlightingDefinition
{
public override string Name => "Diff";
public override string Extension => ".diff";
public override HighlightingRuleSet MainRuleSet => new()
{
Rules =
{
// Diff header (diff --git, index, etc.)
new HighlightingRule
{
Regex = new Regex(@"^(diff --git|index|---|\+\+\+)", RegexOptions.Compiled),
Color = GetNamedColor("Header")
},
// File mode and other metadata
new HighlightingRule
{
Regex = new Regex(@"^(new file mode|deleted file mode|old mode|new mode|similarity index|dissimilarity index|rename from|rename to|copy from|copy to)", RegexOptions.Compiled),
Color = GetNamedColor("Metadata")
},
// Hunk headers (@@ ... @@)
new HighlightingRule
{
Regex = new Regex(@"^@@.*@@$", RegexOptions.Compiled),
Color = GetNamedColor("HunkHeader")
},
// Added lines (+)
new HighlightingRule
{
Regex = new Regex(@"^\+.*$", RegexOptions.Compiled),
Color = GetNamedColor("Added")
},
// Removed lines (-)
new HighlightingRule
{
Regex = new Regex(@"^-.*$", RegexOptions.Compiled),
Color = GetNamedColor("Removed")
},
// Context lines (unchanged)
new HighlightingRule
{
Regex = new Regex(@"^ .*", RegexOptions.Compiled),
Color = GetNamedColor("Context")
}
}
};
public override HighlightingColor GetNamedColor(string name)
{
return name switch
{
"Header" => new HighlightingColor
{
Name = "Header",
Foreground = new SimpleHighlightingBrush("#2563EB".ToColor()), // Blue for headers
},
"Metadata" => new HighlightingColor
{
Name = "Metadata",
Foreground = new SimpleHighlightingBrush("#6B7280".ToColor()), // Gray for metadata
},
"HunkHeader" => new HighlightingColor
{
Name = "HunkHeader",
Foreground = new SimpleHighlightingBrush("#7C3AED".ToColor()), // Purple for hunk headers
},
"Added" => new HighlightingColor
{
Name = "Added",
Foreground = new SimpleHighlightingBrush("#15803D".ToColor()), // Green for added lines
},
"Removed" => new HighlightingColor
{
Name = "Removed",
Foreground = new SimpleHighlightingBrush("#DC2626".ToColor()), // Red for removed lines
},
"Context" => new HighlightingColor
{
Name = "Context",
Foreground = new SimpleHighlightingBrush("#374151".ToColor()), // Gray for context
},
_ => null,
};
}
public override IEnumerable<HighlightingColor> NamedHighlightingColors =>
[
GetNamedColor("Header"),
GetNamedColor("Metadata"),
GetNamedColor("HunkHeader"),
GetNamedColor("Added"),
GetNamedColor("Removed"),
GetNamedColor("Context"),
];
public override DocumentColorizingTransformer[] LineTransformers { get; } = [];
}

View File

@@ -48,8 +48,8 @@
<Reference Include="DirectShowLib-2005, Version=2.1.0.26626, Culture=neutral, PublicKeyToken=67e7b740cdfc2d3f, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<PackageReference Include="UTF.Unknown" Version="2.5.1" />
<PackageReference Include="Melanchall.DryWetMidi" Version="8.0.1" />
<PackageReference Include="UTF.Unknown" Version="2.6.0" />
<PackageReference Include="Melanchall.DryWetMidi" Version="8.0.2" />
</ItemGroup>
<ItemGroup>

View File

@@ -0,0 +1,88 @@
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using Microsoft.Xaml.Behaviors;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
namespace QuickLook.Controls;
public sealed class LeftContextMenuBehavior : Behavior<FrameworkElement>
{
public Point? PlacementOffset { get; set; } = null;
public PlacementMode Placement { get; set; } = PlacementMode.Bottom;
public double? PlacementOffsetX
{
get => PlacementOffset?.X;
set => PlacementOffset = value != null ? new(value ?? 0d, PlacementOffset?.Y ?? 0d) : null;
}
public double? PlacementOffsetY
{
get => PlacementOffset?.Y;
set => PlacementOffset = value != null ? new(PlacementOffset?.X ?? 0d, value ?? 0d) : null;
}
public LeftContextMenuBehavior()
{
}
protected override void OnAttached()
{
base.OnAttached();
Register(AssociatedObject, PlacementOffset, Placement);
}
protected override void OnDetaching()
{
base.OnDetaching();
Unregister(AssociatedObject);
}
public static void Register(FrameworkElement frameworkElement, Point? placementOffset = null, PlacementMode placement = PlacementMode.Bottom)
{
if (frameworkElement?.ContextMenu == null)
{
return;
}
frameworkElement.PreviewMouseRightButtonUp += (_, e) => e.Handled = true;
frameworkElement.MouseRightButtonUp += (_, e) => e.Handled = true;
frameworkElement.PreviewMouseLeftButtonDown += (_, _) =>
{
ContextMenu contextMenu = frameworkElement.ContextMenu;
if (contextMenu != null)
{
if (contextMenu.PlacementTarget != frameworkElement)
{
contextMenu.PlacementTarget = frameworkElement;
contextMenu.PlacementRectangle = new Rect(placementOffset ?? new Point(), new Size(frameworkElement.ActualWidth, frameworkElement.ActualHeight));
contextMenu.Placement = placement;
contextMenu.StaysOpen = false;
}
contextMenu.IsOpen = !contextMenu.IsOpen;
}
};
}
public static void Unregister(FrameworkElement frameworkElement)
{
_ = frameworkElement;
}
}

View File

@@ -102,10 +102,10 @@
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.135">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="WPF-UI.Violeta" Version="4.0.3.2">
<PackageReference Include="WPF-UI.Violeta" Version="4.0.3.6">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Lib.Harmony" Version="2.3.6">
<PackageReference Include="Lib.Harmony" Version="2.4.1">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="UnblockZoneIdentifier" Version="1.0.0">

View File

@@ -182,6 +182,7 @@
<MW_Run>{0} ausführen</MW_Run>
<MW_Share>Freigeben</MW_Share>
<MW_Reload>Neu laden</MW_Reload>
<MW_More>Mehr</MW_More>
<Icon_RunAtStartup>Beim Systemstart &amp;ausführen</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>Nach &amp;Updates suchen</Icon_CheckUpdate>
@@ -216,6 +217,7 @@
<MW_Run>Run {0}</MW_Run>
<MW_Share>Share</MW_Share>
<MW_Reload>Reload</MW_Reload>
<MW_More>More</MW_More>
<Icon_RunAtStartup>Run at &amp;Startup</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>Check for &amp;Updates...</Icon_CheckUpdate>
@@ -234,6 +236,8 @@
<InfoPanel_Files>{0} files</InfoPanel_Files>
<InfoPanel_FolderAndFile>({0} and {1})</InfoPanel_FolderAndFile>
<InfoPanel_CantPreventClosing>Cancellation of "Prevent Closing" is not supported</InfoPanel_CantPreventClosing>
<InfoPanelMoreItem_CopyAsPath>Copy as path</InfoPanelMoreItem_CopyAsPath>
<InfoPanelMoreItem_CopySucc>Copy successfully</InfoPanelMoreItem_CopySucc>
</en>
<es>
<UI_FontFamily>Segoe UI</UI_FontFamily>
@@ -250,6 +254,7 @@
<MW_Run>Iniciar {0}</MW_Run>
<MW_Share>Compartir</MW_Share>
<MW_Reload>Recargar</MW_Reload>
<MW_More>Más</MW_More>
<Icon_RunAtStartup>Iniciar con el &amp;sistema</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>Buscar &amp;Actualizaciones...</Icon_CheckUpdate>
@@ -279,6 +284,7 @@
<MW_OpenWith>Ouvrir avec {0}</MW_OpenWith>
<MW_Run>Exécuter {0}</MW_Run>
<MW_Reload>Recharger</MW_Reload>
<MW_More>Plus</MW_More>
<Icon_RunAtStartup>Exécuter au &amp;démarrage</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>Vérifier s'il existe des &amp;mises à jour...</Icon_CheckUpdate>
@@ -308,6 +314,7 @@
<MW_OpenWith>Apri con {0}</MW_OpenWith>
<MW_Run>Esegui {0}</MW_Run>
<MW_Reload>Ricarica</MW_Reload>
<MW_More>Altro</MW_More>
<Icon_RunAtStartup>Esegui all'&amp;Avvio</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>Verifica &amp;Aggiornamenti...</Icon_CheckUpdate>
@@ -340,6 +347,7 @@
<MW_Run>{0} を起動</MW_Run>
<MW_Share>シェア</MW_Share>
<MW_Reload>再読み込み</MW_Reload>
<MW_More>その他</MW_More>
<Icon_RunAtStartup>スタートアップ時に起動</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>更新を確認する... (&amp;U)</Icon_CheckUpdate>
@@ -424,6 +432,7 @@
<MW_Run>Uruchom {0}</MW_Run>
<MW_Share>Udostępnij</MW_Share>
<MW_Reload>Przeładuj</MW_Reload>
<MW_More>Więcej</MW_More>
<Icon_RunAtStartup>Uruchamiaj automatycznie z systemem</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>Sprawdź &amp;aktualizacje...</Icon_CheckUpdate>
@@ -458,6 +467,7 @@
<MW_Run>Executar {0}</MW_Run>
<MW_Share>Compartilhar</MW_Share>
<MW_Reload>Recarregar</MW_Reload>
<MW_More>Mais</MW_More>
<Icon_RunAtStartup>Executar na &amp;Inicialização</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>Procurar por &amp;Atualizações...</Icon_CheckUpdate>
@@ -515,6 +525,7 @@
<MW_PreventClosing>Закрепить</MW_PreventClosing>
<MW_Share>Поделиться</MW_Share>
<MW_Reload>Перезагрузить</MW_Reload>
<MW_More>Еще</MW_More>
<Icon_RunAtStartup>Автозапуск</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>Проверить &amp;обновления…</Icon_CheckUpdate>
@@ -575,6 +586,7 @@
<MW_Run>Запустити {0}</MW_Run>
<MW_Share>Поширити</MW_Share>
<MW_Reload>Перезавантажити</MW_Reload>
<MW_More>Більше</MW_More>
<Icon_RunAtStartup>Запускати під час &amp;старту</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>Перевірити наявність &amp;оновлення…</Icon_CheckUpdate>
@@ -634,6 +646,7 @@
<MW_Run>运行 {0}</MW_Run>
<MW_Share>分享</MW_Share>
<MW_Reload>重新加载</MW_Reload>
<MW_More>更多</MW_More>
<Icon_RunAtStartup>启动时自动运行 (&amp;S)</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>检查更新... (&amp;U)</Icon_CheckUpdate>
@@ -668,6 +681,7 @@
<MW_Run>執行 {0}</MW_Run>
<MW_Share>分享</MW_Share>
<MW_Reload>重新載入</MW_Reload>
<MW_More>更多</MW_More>
<Icon_RunAtStartup>系統啟動時自動執行 (&amp;S)</Icon_RunAtStartup>
<Icon_ToolTip>QuickLook v{0}</Icon_ToolTip>
<Icon_CheckUpdate>檢查更新... (&amp;U)</Icon_CheckUpdate>

View File

@@ -35,19 +35,7 @@ internal partial class TrayIconManager : IDisposable
private readonly TrayIconHost _icon;
private readonly TrayMenuItem _itemAutorun =
new()
{
Header = TranslationHelper.Get("Icon_RunAtStartup"),
Command = new RelayCommand(() =>
{
if (AutoStartupHelper.IsAutorun())
AutoStartupHelper.RemoveAutorunShortcut();
else
AutoStartupHelper.CreateAutorunShortcut();
}),
IsEnabled = !App.IsUWP,
};
private readonly TrayMenuItem _itemAutorun = null!;
private TrayIconManager()
{
@@ -79,7 +67,18 @@ internal partial class TrayIconManager : IDisposable
Header = TranslationHelper.Get("Icon_OpenDataFolder"),
Command = new RelayCommand(() => Process.Start("explorer.exe", SettingHelper.LocalDataPath)),
},
_itemAutorun,
_itemAutorun = new TrayMenuItem()
{
Header = TranslationHelper.Get("Icon_RunAtStartup"),
Command = new RelayCommand(() =>
{
if (AutoStartupHelper.IsAutorun())
AutoStartupHelper.RemoveAutorunShortcut();
else
AutoStartupHelper.CreateAutorunShortcut();
}),
IsEnabled = !App.IsUWP,
},
new TrayMenuItem()
{
Header = TranslationHelper.Get("Icon_Restart"),
@@ -94,7 +93,10 @@ internal partial class TrayIconManager : IDisposable
IsVisible = SettingHelper.Get("ShowTrayIcon", true)
};
_icon.RightDown += (sender, e) => { _itemAutorun.IsChecked = AutoStartupHelper.IsAutorun(); };
_icon.RightDown += (_, _) =>
{
_itemAutorun.IsChecked = AutoStartupHelper.IsAutorun();
};
}
public void Dispose()

View File

@@ -22,12 +22,13 @@ using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Input;
namespace QuickLook;
public partial class ViewerWindow : INotifyPropertyChanged
{
private readonly ResourceDictionary _darkDict = new ResourceDictionary
private readonly ResourceDictionary _darkDict = new()
{
Source = new Uri("pack://application:,,,/QuickLook.Common;component/Styles/MainWindowStyles.Dark.xaml")
};
@@ -50,6 +51,8 @@ public partial class ViewerWindow : INotifyPropertyChanged
public ContextObject ContextObject { get; private set; }
public Themes CurrentTheme { get; private set; }
public ICommand CloseCommand { get; private set; }
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]

View File

@@ -6,7 +6,10 @@
xmlns:converters="clr-namespace:QuickLook.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:glassLayer="clr-namespace:QuickLook.Controls.GlassLayer"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
xmlns:vio="http://schemas.lepo.co/wpfui/2022/xaml/violeta"
x:Name="mainWindow"
Title="QuickLook"
MinWidth="400"
@@ -122,15 +125,32 @@
DockPanel.Dock="Right"
Style="{StaticResource CaptionButtonStyle}"
ToolTip="Reload" />
<!--<Button x:Name="buttonOpen" DockPanel.Dock="Right"
Style="{StaticResource CaptionTextButtonStyle}"
Visibility="{Binding ActualWidth, ElementName=windowCaptionContainer, Converter={StaticResource WidthToVisibilityCollapsedConverter}}">
<Button.Content>
<TextBlock x:Name="buttonOpenText" VerticalAlignment="Center">
Open with <Bold>AppName</Bold>
</TextBlock>
</Button.Content>
</Button>-->
<Button x:Name="buttonMore"
Content="&#xE712;"
DockPanel.Dock="Right"
Style="{StaticResource CaptionButtonStyle}"
ToolTip="More">
<Button.ContextMenu>
<ContextMenu FontSize="12">
<MenuItem x:Name="moreItemCopyAsPath">
<MenuItem.Icon>
<ui:FontIcon FontFamily="{DynamicResource SymbolThemeFontFamily}" Glyph="{x:Static ui:FontSymbols.Copy}" />
</MenuItem.Icon>
</MenuItem>
<Separator Visibility="Collapsed" />
<MenuItem x:Name="moreItemOpenSettings"
Header="Settings"
Visibility="Collapsed">
<MenuItem.Icon>
<ui:FontIcon FontFamily="{DynamicResource SymbolThemeFontFamily}" Glyph="{x:Static ui:FontSymbols.Settings}" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</Button.ContextMenu>
<i:Interaction.Behaviors>
<controls:LeftContextMenuBehavior />
</i:Interaction.Behaviors>
</Button>
<Button x:Name="buttonTop"
DockPanel.Dock="Left"
Tag="Auto"

View File

@@ -20,6 +20,7 @@ using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Helpers;
using System;
using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Windows.Input;
@@ -110,12 +111,32 @@ public partial class ViewerWindow : Window
buttonReload.Visibility = SettingHelper.Get("ShowReload", false) ? Visibility.Visible : Visibility.Collapsed;
moreItemCopyAsPath.Click += (_, _) =>
{
try
{
Clipboard.SetText(_path);
Toast.Success(TranslationHelper.Get("InfoPanelMoreItem_CopySucc"));
}
catch (Exception e)
{
Debug.WriteLine(e);
}
};
moreItemOpenSettings.Click += (_, _) =>
{
Toast.Warning("Coming soon...");
};
// Set UI translations
buttonTop.ToolTip = TranslationHelper.Get("MW_StayTop");
buttonPin.ToolTip = TranslationHelper.Get("MW_PreventClosing");
buttonOpenWith.ToolTip = TranslationHelper.Get("MW_OpenWithMenu");
buttonShare.ToolTip = TranslationHelper.Get("MW_Share");
buttonReload.ToolTip = TranslationHelper.Get("MW_Reload", failsafe: "Reload");
buttonMore.ToolTip = TranslationHelper.Get("MW_More", failsafe: "More");
moreItemCopyAsPath.Header = TranslationHelper.Get("InfoPanelMoreItem_CopyAsPath");
}
public new void Close()