Compare commits

..

17 Commits

Author SHA1 Message Date
ema
21a3dd3d4b Fix the same previous issue in other plugins
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-08-15 02:17:50 +08:00
ema
ebb48366a0 Fix font file unicode name is not supported 2025-08-15 02:09:38 +08:00
ema
e12bb2201b Fix issue where font file stays locked #77 2025-08-15 02:01:59 +08:00
ema
14a5bea926 Code Cleanup
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-08-09 00:38:43 +08:00
ema
3dbc9fc763 Remove unimportant UnobservedTaskException #1691
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-08-06 00:19:47 +08:00
ema
139cb873f2 Revert SVG default background to transparent
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-08-05 01:19:42 +08:00
ema
fd1004e6d3 Set default background color for SVG panel 2025-08-05 01:11:37 +08:00
ema
b0dceffa94 Add Exporter class for MediaInfo integration 2025-08-05 00:58:48 +08:00
ema
2246c5a361 Fix style changed from MediaInfoViewer 2025-08-05 00:53:21 +08:00
ema
5a5cce93b4 Add built-in plugin MediaInfoViewer
1. Merged from forked repo https://github.com/emako/QuickLook/tree/master/QuickLook.Plugin/QuickLook.Plugin.MediaInfoViewer
2. Use TextBox instead of AvalonEdit and prepare for new feature
2025-08-05 00:43:47 +08:00
ema
8d7df24798 Remove configuration ModernMessageBox
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-08-04 21:17:25 +08:00
ema
3ae4eeb26d Improve CLI performance
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-08-04 00:17:07 +08:00
ema
da0033b52a Improve CLI performance #1706 #1731 2025-08-03 22:20:35 +08:00
ema
2e941f468e Make exe-installer no forked relaunching
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
Since MicaSetup v2.4.0
2025-08-03 02:39:19 +08:00
ema
fbfd2484df Refactor thumbnail handlers into provider classes 2025-08-02 23:58:55 +08:00
ema
e342cd0851 Refactor AnimationProvider to use primary constructor 2025-08-02 23:58:23 +08:00
ema
d90993817d Refactor DependencyProperty registration 2025-08-02 21:58:08 +08:00
46 changed files with 993 additions and 354 deletions

View File

@@ -36,6 +36,7 @@
"IsRefreshExplorer": true,
"IsInstallCertificate": false,
"IsEnableUninstallDelayUntilReboot": true,
"IsUseTempPathFork": false,
"IsEnvironmentVariable": false,
"OverlayInstallRemoveExt": "exe,dll,pdb,config,winmd,txt,bat,ax,manifest,xshd",
"UnpackingPassword": null,

View File

@@ -61,8 +61,8 @@ public class AppImageReader
public AppImageReader(string path)
{
using FileStream fs = File.OpenRead(path);
Open(fs);
using var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
Open(fileStream);
}
private void Open(Stream stream)

View File

@@ -29,7 +29,7 @@ internal static class WgtParser
{
public static WgtInfo Parse(string path)
{
using var fileStream = File.OpenRead(path);
using var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
using var zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Read);
var manifestEntry = zipArchive.GetEntry("manifest.json");

View File

@@ -45,7 +45,7 @@ public class ArchiveFileEntry : IComparable<ArchiveFileEntry>
public DateTime ModifiedDate { get; set; }
/// <summary>
/// Returns the maximum depth of all siblings
/// Returns the maximum depth of all siblings
/// </summary>
public int Level
{
@@ -75,7 +75,7 @@ public class ArchiveFileEntry : IComparable<ArchiveFileEntry>
}
/// <summary>
/// Returns the number of nodes in the longest path to a leaf
/// Returns the number of nodes in the longest path to a leaf
/// </summary>
private int GetDepth()
{

View File

@@ -134,14 +134,14 @@ public partial class ArchiveInfoPanel : UserControl, IDisposable, INotifyPropert
private void LoadItemsFromArchive(string path)
{
using var stream = File.OpenRead(path);
using var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
// ReaderFactory is slow... so limit its usage
string[] useReader = [".tar.gz", ".tgz", ".tar.bz2", ".tar.lz", ".tar.xz"];
if (useReader.Any(path.ToLower().EndsWith))
{
var reader = ReaderFactory.Open(stream, new ChardetReaderOptions());
var reader = ReaderFactory.Open(fileStream, new ChardetReaderOptions());
_type = reader.ArchiveType.ToString();
@@ -149,13 +149,13 @@ public partial class ArchiveInfoPanel : UserControl, IDisposable, INotifyPropert
{
if (_disposed)
return;
LoadPercent = 100d * stream.Position / stream.Length;
LoadPercent = 100d * fileStream.Position / fileStream.Length;
ProcessByLevel(reader.Entry);
}
}
else
{
var archive = ArchiveFactory.Open(stream, new ChardetReaderOptions());
var archive = ArchiveFactory.Open(fileStream, new ChardetReaderOptions());
_type = archive.Type.ToString();
@@ -163,7 +163,7 @@ public partial class ArchiveInfoPanel : UserControl, IDisposable, INotifyPropert
{
if (_disposed)
return;
LoadPercent = 100d * stream.Position / stream.Length;
LoadPercent = 100d * fileStream.Position / fileStream.Length;
ProcessByLevel(entry);
}
}

View File

@@ -28,9 +28,9 @@ using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.ArchiveViewer;
/// <summary>
/// Internals are mostly from here:
/// http://www.codeproject.com/Articles/2532/Obtaining-and-managing-file-and-folder-icons-using
/// Caches all results.
/// Internals are mostly from here:
/// http://www.codeproject.com/Articles/2532/Obtaining-and-managing-file-and-folder-icons-using
/// Caches all results.
/// </summary>
public static class IconManager
{
@@ -48,7 +48,7 @@ public static class IconManager
}
/// <summary>
/// Get the icon of a directory
/// Get the icon of a directory
/// </summary>
/// <param name="large">16x16 or 32x32 icon</param>
/// <returns>an icon</returns>
@@ -68,7 +68,7 @@ public static class IconManager
}
/// <summary>
/// Get an icon for a given filename
/// Get an icon for a given filename
/// </summary>
/// <param name="fileName">any filename</param>
/// <param name="large">16x16 or 32x32 icon</param>
@@ -89,7 +89,7 @@ public static class IconManager
}
/// <summary>
/// http://stackoverflow.com/a/6580799/1943849
/// http://stackoverflow.com/a/6580799/1943849
/// </summary>
private static ImageSource ToImageSource(this Icon icon)
{
@@ -101,31 +101,31 @@ public static class IconManager
}
/// <summary>
/// Provides static methods to read system icons for both folders and files.
/// Provides static methods to read system icons for both folders and files.
/// </summary>
/// <example>
/// <code>IconReader.GetFileIcon("c:\\general.xls");</code>
/// <code>IconReader.GetFileIcon("c:\\general.xls");</code>
/// </example>
private static class IconReader
{
/// <summary>
/// Options to specify the size of icons to return.
/// Options to specify the size of icons to return.
/// </summary>
public enum IconSize
{
/// <summary>
/// Specify large icon - 32 pixels by 32 pixels.
/// Specify large icon - 32 pixels by 32 pixels.
/// </summary>
Large = 0,
/// <summary>
/// Specify small icon - 16 pixels by 16 pixels.
/// Specify small icon - 16 pixels by 16 pixels.
/// </summary>
Small = 1
}
/// <summary>
/// Returns the icon of a folder.
/// Returns the icon of a folder.
/// </summary>
/// <param name="size">Large or small</param>
/// <param name="linkOverlay">Whether to include the link icon</param>
@@ -152,7 +152,7 @@ public static class IconManager
}
/// <summary>
/// Returns an icon for a given file - indicated by the name parameter.
/// Returns an icon for a given file - indicated by the name parameter.
/// </summary>
/// <param name="name">Pathname for file.</param>
/// <param name="size">Large or small</param>
@@ -181,8 +181,8 @@ public static class IconManager
}
/// <summary>
/// Wraps necessary Shell32.dll structures and functions required to retrieve Icon Handles using SHGetFileInfo. Code
/// courtesy of MSDN Cold Rooster Consulting case study.
/// Wraps necessary Shell32.dll structures and functions required to retrieve Icon Handles using SHGetFileInfo. Code
/// courtesy of MSDN Cold Rooster Consulting case study.
/// </summary>
private static class Shell32
{
@@ -221,13 +221,13 @@ public static class IconManager
}
/// <summary>
/// Wraps necessary functions imported from User32.dll. Code courtesy of MSDN Cold Rooster Consulting example.
/// Wraps necessary functions imported from User32.dll. Code courtesy of MSDN Cold Rooster Consulting example.
/// </summary>
private static class User32
{
/// <summary>
/// Provides access to function required to delete handle. This method is used internally
/// and is not required to be called separately.
/// Provides access to function required to delete handle. This method is used internally
/// and is not required to be called separately.
/// </summary>
/// <param name="hIcon">Pointer to icon handle.</param>
/// <returns>N/A</returns>

View File

@@ -40,12 +40,19 @@ internal unsafe static class FreeTypeApi
error = FT_New_Face(lib, (byte*)Marshal.StringToHGlobalAnsi(path), IntPtr.Zero, &face);
if (error == FT_Error.FT_Err_Ok)
try
{
var familyName = Marshal.PtrToStringAnsi((nint)face->family_name);
return familyName;
if (error == FT_Error.FT_Err_Ok)
{
var familyName = Marshal.PtrToStringAnsi((nint)face->family_name);
return familyName;
}
}
finally
{
FT_Done_Face(face);
FT_Done_FreeType(lib);
}
return null;
}
}

View File

@@ -149,11 +149,11 @@ public class WebfontPanel : WebpagePanel
}
else
{
var localPath = _fallbackPath + requestedUri.AbsolutePath.Replace('/', '\\');
var localPath = _fallbackPath + Uri.UnescapeDataString(requestedUri.AbsolutePath).Replace('/', '\\');
if (File.Exists(localPath))
{
var fileStream = File.OpenRead(localPath);
var fileStream = new FileStream(localPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
var response = _webView.CoreWebView2.Environment.CreateWebResourceResponse(
fileStream, 200, "OK", MimeTypes.GetContentType());
args.Response = response;

View File

@@ -210,7 +210,7 @@ public class WebpagePanel : UserControl
if (File.Exists(fallbackFilePath))
{
// Serve the file from the fallback directory
var fileStream = File.OpenRead(fallbackFilePath);
var fileStream = new FileStream(fallbackFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
var response = _webView.CoreWebView2.Environment.CreateWebResourceResponse(
fileStream, 200, "OK", "Content-Type: application/octet-stream");
args.Response = response;

View File

@@ -59,21 +59,19 @@ public class AnimatedImage : Image, IDisposable
return provider;
}
#region DependencyProperty
public static readonly DependencyProperty AnimationFrameIndexProperty =
DependencyProperty.Register("AnimationFrameIndex", typeof(int), typeof(AnimatedImage),
DependencyProperty.Register(nameof(AnimationFrameIndex), typeof(int), typeof(AnimatedImage),
new UIPropertyMetadata(-1, AnimationFrameIndexChanged));
public static readonly DependencyProperty AnimationUriProperty =
DependencyProperty.Register("AnimationUri", typeof(Uri), typeof(AnimatedImage),
DependencyProperty.Register(nameof(AnimationUri), typeof(Uri), typeof(AnimatedImage),
new UIPropertyMetadata(null, AnimationUriChanged));
public static readonly DependencyProperty MetaProperty =
DependencyProperty.Register("Meta", typeof(MetaProvider), typeof(AnimatedImage));
DependencyProperty.Register(nameof(Meta), typeof(MetaProvider), typeof(AnimatedImage));
public static readonly DependencyProperty ContextObjectProperty =
DependencyProperty.Register("ContextObject", typeof(ContextObject), typeof(AnimatedImage));
DependencyProperty.Register(nameof(ContextObject), typeof(ContextObject), typeof(AnimatedImage));
public int AnimationFrameIndex
{
@@ -104,9 +102,6 @@ public class AnimatedImage : Image, IDisposable
if (obj is not AnimatedImage instance)
return;
//var thumbnail = instance.Meta?.GetThumbnail(true);
//instance.Source = thumbnail;
instance._animation = InitAnimationProvider((Uri)ev.NewValue, instance.Meta, instance.ContextObject);
ShowThumbnailAndStartAnimation(instance);
}
@@ -161,6 +156,4 @@ public class AnimatedImage : Image, IDisposable
}));
task.Start();
}
#endregion DependencyProperty
}

View File

@@ -24,20 +24,13 @@ using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.ImageViewer.AnimatedImage;
internal abstract class AnimationProvider : IDisposable
internal abstract class AnimationProvider(Uri path, MetaProvider meta, ContextObject contextObject) : IDisposable
{
protected AnimationProvider(Uri path, MetaProvider meta, ContextObject contextObject)
{
Path = path;
Meta = meta;
ContextObject = contextObject;
}
public Uri Path { get; } = path;
public Uri Path { get; }
public MetaProvider Meta { get; } = meta;
public MetaProvider Meta { get; }
public ContextObject ContextObject { get; }
public ContextObject ContextObject { get; } = contextObject;
public Int32AnimationUsingKeyFrames Animator { get; protected set; }

View File

@@ -103,9 +103,7 @@ public partial class ImagePanel : UserControl, INotifyPropertyChanged, IDisposab
ContextObject = context;
Meta = meta;
var s = meta.GetSize();
//_minZoomFactor = Math.Min(200d / s.Height, 400d / s.Width);
//_maxZoomFactor = Math.Min(9000d / s.Height, 9000d / s.Width);
_ = meta.GetSize();
ShowMeta();
Theme = ContextObject.Theme;

View File

@@ -27,7 +27,7 @@ internal static class LottieExtractor
{
public static string GetJsonContent(string path)
{
using var fileStream = File.OpenRead(path);
using var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
using var zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Read);
var manifestEntry = zipArchive.GetEntry("manifest.json");

View File

@@ -22,6 +22,7 @@ using QuickLook.Plugin.HtmlViewer;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
@@ -67,6 +68,7 @@ public class SvgImagePanel : WebpagePanel, IWebImagePanel
{
UserDataFolder = Path.Combine(SettingHelper.LocalDataPath, @"WebView2_Data\"),
},
DefaultBackgroundColor = Color.Transparent,
};
_webView.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted;
Content = _webView;
@@ -128,11 +130,11 @@ public class SvgImagePanel : WebpagePanel, IWebImagePanel
}
else
{
var localPath = _fallbackPath + requestedUri.AbsolutePath.Replace('/', '\\');
var localPath = _fallbackPath + Uri.UnescapeDataString(requestedUri.AbsolutePath).Replace('/', '\\');
if (File.Exists(localPath))
{
var fileStream = File.OpenRead(localPath);
var fileStream = new FileStream(localPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
var response = _webView.CoreWebView2.Environment.CreateWebResourceResponse(
fileStream, 200, "OK", MimeTypes.GetContentTypeHeader());
args.Response = response;
@@ -147,7 +149,7 @@ public class SvgImagePanel : WebpagePanel, IWebImagePanel
{
if (File.Exists(localPath))
{
var fileStream = File.OpenRead(localPath);
var fileStream = new FileStream(localPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
var response = _webView.CoreWebView2.Environment.CreateWebResourceResponse(
fileStream, 200, "OK",
$"""

View File

@@ -124,11 +124,11 @@ public class MarkdownPanel : WebpagePanel
}
else
{
var localPath = _fallbackPath + requestedUri.AbsolutePath.Replace('/', '\\');
var localPath = _fallbackPath + Uri.UnescapeDataString(requestedUri.AbsolutePath).Replace('/', '\\');
if (File.Exists(localPath))
{
var fileStream = File.OpenRead(localPath);
var fileStream = new FileStream(localPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
var response = _webView.CoreWebView2.Environment.CreateWebResourceResponse(
fileStream, 200, "OK", MimeTypes.GetContentType());
args.Response = response;

View File

@@ -0,0 +1,16 @@
using MediaInfoLib;
using System.ComponentModel.Composition;
namespace QuickLook.Plugin.MediaInfoViewer;
[Export]
public static class Exporter
{
public static MediaInfo Open(string path)
{
MediaInfo lib = new MediaInfo()
.WithOpen(path);
return lib;
}
}

View File

@@ -0,0 +1,109 @@
// 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 MediaInfoLib;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using System;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Media;
namespace QuickLook.Plugin.MediaInfoViewer;
public class Plugin : IViewer
{
private TextViewerPanel _tvp;
public int Priority => 0;
public void Init()
{
}
public bool CanHandle(string path)
{
// We only handle files with specific caller
return false;
}
public void Prepare(string path, ContextObject context)
{
context.PreferredSize = new Size { Width = 800, Height = 600 };
}
public void View(string path, ContextObject context)
{
using MediaInfo lib = new MediaInfo()
.WithOpen(path);
_tvp = new TextViewerPanel(lib.Inform(), context);
AssignHighlightingManager(_tvp, context);
_tvp.Tag = context;
_tvp.Drop += OnDrop;
context.ViewerContent = _tvp;
context.Title = $"{Path.GetFileName(path)}";
context.IsBusy = false;
}
private void OnDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
if (e.Data.GetData(DataFormats.FileDrop) is string[] files
&& files.FirstOrDefault() is string path)
{
if (_tvp!.Tag is ContextObject context)
{
context.Title = $"{Path.GetFileName(path)}";
}
using MediaInfo lib = new MediaInfo()
.WithOpen(path);
_tvp!.Text = lib.Inform();
}
}
}
public void Cleanup()
{
GC.SuppressFinalize(this);
_tvp = null!;
}
private void AssignHighlightingManager(TextViewerPanel tvp, ContextObject context)
{
var isDark = OSThemeHelper.AppsUseDarkTheme();
if (isDark)
{
context.Theme = Themes.Dark;
tvp.Foreground = new BrushConverter().ConvertFromString("#FFEFEFEF") as SolidColorBrush;
tvp.Background = Brushes.Transparent;
}
else
{
context.Theme = Themes.Light;
tvp.Foreground = new BrushConverter().ConvertFromString("#BBFAFAFA") as SolidColorBrush;
tvp.Background = Brushes.Transparent;
}
}
}

View File

@@ -0,0 +1,50 @@
// 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 System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("QuickLook.Plugin.MediaInfoViewer")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("pooi.moe")]
[assembly: AssemblyProduct("QuickLook.Plugin.MediaInfoViewer")]
[assembly: AssemblyCopyright("Copyright © 2017-2025 QL-Win Contributors")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("b0054a16-472e-44ac-ba40-349303e524ff")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]

View File

@@ -0,0 +1,84 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net462</TargetFramework>
<RootNamespace>QuickLook.Plugin.MediaInfoViewer</RootNamespace>
<AssemblyName>QuickLook.Plugin.MediaInfoViewer</AssemblyName>
<FileAlignment>512</FileAlignment>
<SignAssembly>false</SignAssembly>
<UseWPF>true</UseWPF>
<LangVersion>latest</LangVersion>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<ProjectGuid>{B0054A16-472E-44AC-BA40-349303E524FF}</ProjectGuid>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\Build\Debug\QuickLook.Plugin\QuickLook.Plugin.MediaInfoViewer\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\Build\Release\QuickLook.Plugin\QuickLook.Plugin.MediaInfoViewer\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<OutputPath>..\..\Build\Debug\QuickLook.Plugin\QuickLook.Plugin.MediaInfoViewer\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>..\..\Build\Release\QuickLook.Plugin\QuickLook.Plugin.MediaInfoViewer\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\QuickLook.Common\QuickLook.Common.csproj">
<Project>{85FDD6BA-871D-46C8-BD64-F6BB0CB5EA95}</Project>
<Name>QuickLook.Common</Name>
<Private>False</Private>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\GitVersion.cs">
<Link>Properties\GitVersion.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<Reference Include="System.ComponentModel.Composition" />
<PackageReference Include="MediaInfoDLL" Version="25.7.0" />
</ItemGroup>
<Target Name="ReduceReleasePackaging" AfterTargets="Build">
<!-- MediaInfoDLL will copy the MediaInfo.dll file according to the architecture, we do not use this usage so delete it manually -->
<Delete Files="$(OutputPath)\MediaInfo.dll" Condition="Exists('$(OutputPath)\MediaInfo.dll')" />
</Target>
<ItemGroup>
<None Update="Translations.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,100 @@
// 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 QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace QuickLook.Plugin.MediaInfoViewer;
public class TextViewerPanel : TextBox
{
public TextViewerPanel(string text, ContextObject context)
{
_ = context;
TextWrapping = TextWrapping.Wrap;
VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
Margin = new Thickness(8d, 0d, 0d, 0d);
BorderThickness = new Thickness(0d);
FontSize = 14d;
IsReadOnly = true;
IsManipulationEnabled = true;
ContextMenu = new ContextMenu();
ContextMenu.Items.Add(new MenuItem
{
Header = TranslationHelper.Get("Editor_Copy", domain: "QuickLook.Plugin.TextViewer"),
Command = ApplicationCommands.Copy,
});
ContextMenu.Items.Add(new MenuItem
{
Header = TranslationHelper.Get("Editor_SelectAll",
domain: "QuickLook.Plugin.TextViewer"),
Command = ApplicationCommands.SelectAll,
});
ManipulationInertiaStarting += Viewer_ManipulationInertiaStarting;
ManipulationStarting += Viewer_ManipulationStarting;
ManipulationDelta += Viewer_ManipulationDelta;
PreviewMouseWheel += Viewer_MouseWheel;
FontFamily = new FontFamily("Consolas, " + TranslationHelper.Get("Editor_FontFamily",
domain: "QuickLook.Plugin.TextViewer"));
LoadTextAsync(text);
}
private void Viewer_ManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e)
{
e.TranslationBehavior = new InertiaTranslationBehavior
{
InitialVelocity = e.InitialVelocities.LinearVelocity,
DesiredDeceleration = 10d * 96d / (1000d * 1000d)
};
}
private void Viewer_MouseWheel(object sender, MouseWheelEventArgs e)
{
e.Handled = true;
ScrollToVerticalOffset(VerticalOffset - e.Delta);
}
private void Viewer_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
e.Handled = true;
var delta = e.DeltaManipulation;
ScrollToVerticalOffset(VerticalOffset - delta.Translation.Y);
}
private void Viewer_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
{
e.Mode = ManipulationModes.Translate;
}
private void LoadTextAsync(string text)
{
Text = text;
}
}

View File

@@ -69,9 +69,9 @@ public class Plugin : IViewer
if (path.EndsWith(".rtf", StringComparison.OrdinalIgnoreCase))
{
var rtfBox = new RichTextBox();
using FileStream fs = File.OpenRead(path);
using var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
rtfBox.Background = new SolidColorBrush(Colors.Transparent);
rtfBox.Selection.Load(fs, DataFormats.Rtf);
rtfBox.Selection.Load(fileStream, DataFormats.Rtf);
rtfBox.IsReadOnly = true;
rtfBox.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
rtfBox.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;

View File

@@ -187,8 +187,8 @@ public class HighlightingThemeManager
{
Debug.WriteLine(file);
var ext = Path.GetFileNameWithoutExtension(file);
using Stream s = File.OpenRead(Path.GetFullPath(file));
using var reader = new XmlTextReader(s);
using var fileStream = new FileStream(Path.GetFullPath(file), FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
using var reader = new XmlTextReader(fileStream);
var xshd = HighlightingLoader.LoadXshd(reader);
var highlightingDefinition = HighlightingLoader.Load(xshd, hlm);
if (xshd.Extensions.Count > 0)

View File

@@ -15,165 +15,43 @@
// 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 PureSharpCompress.Archives.Zip;
using PureSharpCompress.Common;
using PureSharpCompress.Readers;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using QuickLook.Plugin.ThumbnailViewer.Providors;
using System.IO;
using System.Windows;
using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.ThumbnailViewer;
internal static class Handler
{
// List<Pair<formats, type>>
public static List<KeyValuePair<string[], Type>> Providers = [];
public static void Prepare(string path, ContextObject context)
{
// Temporary codes
if (path.EndsWith(".pdn", StringComparison.OrdinalIgnoreCase))
(Path.GetExtension(path).ToLower() switch
{
new PdnProvider().Prepare(path, context);
return;
}
try
{
using Stream imageData = ViewImage(path);
BitmapImage bitmap = imageData.ReadAsBitmapImage();
context.SetPreferredSizeFit(new Size(bitmap.PixelWidth, bitmap.PixelHeight), 0.8d);
}
catch (Exception ex)
{
Debug.WriteLine($"Error reading thumbnail from {path}: {ex.Message}");
context.PreferredSize = new Size { Width = 800, Height = 600 };
}
".cdr" => new CdrProvider(),
".fig" => new FigProvidor(),
".kra" => new KraProvidor(),
".pdn" => new PdnProvider(),
".pip" or ".pix" => new PixProvidor(),
".sketch" => new SketchProvidor(),
".xd" => new XdProvidor(),
".xmind" => new XmindProvidor(),
_ => (AbstractProvidor)null,
})?.Prepare(path, context);
}
public static Stream ViewImage(string path)
{
// Temporary codes
if (path.EndsWith(".pdn", StringComparison.OrdinalIgnoreCase))
return (Path.GetExtension(path).ToLower() switch
{
return new PdnProvider().ViewImage(path);
}
try
{
using ZipArchive archive = ZipArchive.Open(path, new());
using IReader reader = archive.ExtractAllEntries();
if (path.EndsWith(".xd", StringComparison.OrdinalIgnoreCase))
{
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.Equals("preview.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
else if (reader.Entry.Key!.Equals("thumbnail.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
else if (path.EndsWith(".fig", StringComparison.OrdinalIgnoreCase))
{
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.Equals("thumbnail.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
else if (path.EndsWith(".pip", StringComparison.OrdinalIgnoreCase) || path.EndsWith(".pix", StringComparison.OrdinalIgnoreCase))
{
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.EndsWith(".thumb.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
else if (path.EndsWith(".sketch", StringComparison.OrdinalIgnoreCase))
{
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.EndsWith("previews/preview.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
else if (path.EndsWith(".xmind", StringComparison.OrdinalIgnoreCase))
{
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.Equals("Thumbnails/thumbnail.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
else if (path.EndsWith(".kra", StringComparison.OrdinalIgnoreCase))
{
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.Contains("mergedimage"))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
else if (path.EndsWith(".cdr", StringComparison.OrdinalIgnoreCase))
{
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.Equals("previews/thumbnail.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error reading thumbnail from {path}: {ex.Message}");
ProcessHelper.WriteLog(ex.ToString());
}
return null;
".cdr" => new CdrProvider(),
".fig" => new FigProvidor(),
".kra" => new KraProvidor(),
".pdn" => new PdnProvider(),
".pip" or ".pix" => new PixProvidor(),
".sketch" => new SketchProvidor(),
".xd" => new XdProvidor(),
".xmind" => new XmindProvidor(),
_ => (AbstractProvidor)null,
})?.ViewImage(path);
}
}

View File

@@ -47,8 +47,6 @@ public class Plugin : IViewer
public void Init()
{
Handler.Providers.Add(new KeyValuePair<string[], Type>(
[".pdn"], typeof(PdnProvider)));
}
public bool CanHandle(string path)

View File

@@ -0,0 +1,45 @@
// 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 QuickLook.Common.Plugin;
using System;
using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.ThumbnailViewer.Providors;
internal abstract class AbstractProvidor
{
public virtual void Prepare(string path, ContextObject context)
{
try
{
using Stream imageData = ViewImage(path);
BitmapImage bitmap = imageData.ReadAsBitmapImage();
context.SetPreferredSizeFit(new Size(bitmap.PixelWidth, bitmap.PixelHeight), 0.8d);
}
catch (Exception ex)
{
Debug.WriteLine($"Error reading thumbnail from {path}: {ex.Message}");
context.PreferredSize = new Size { Width = 800, Height = 600 };
}
}
public abstract Stream ViewImage(string path);
}

View File

@@ -0,0 +1,56 @@
// 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 PureSharpCompress.Archives.Zip;
using PureSharpCompress.Common;
using PureSharpCompress.Readers;
using QuickLook.Common.Helpers;
using System;
using System.Diagnostics;
using System.IO;
namespace QuickLook.Plugin.ThumbnailViewer.Providors;
internal class CdrProvider : AbstractProvidor
{
public override Stream ViewImage(string path)
{
try
{
using ZipArchive archive = ZipArchive.Open(path, new());
using IReader reader = archive.ExtractAllEntries();
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.Equals("previews/thumbnail.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error reading thumbnail from {path}: {ex.Message}");
ProcessHelper.WriteLog(ex.ToString());
}
return null;
}
}

View File

@@ -0,0 +1,56 @@
// 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 PureSharpCompress.Archives.Zip;
using PureSharpCompress.Common;
using PureSharpCompress.Readers;
using QuickLook.Common.Helpers;
using System;
using System.Diagnostics;
using System.IO;
namespace QuickLook.Plugin.ThumbnailViewer.Providors;
internal class FigProvidor : AbstractProvidor
{
public override Stream ViewImage(string path)
{
try
{
using ZipArchive archive = ZipArchive.Open(path, new());
using IReader reader = archive.ExtractAllEntries();
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.Equals("thumbnail.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error reading thumbnail from {path}: {ex.Message}");
ProcessHelper.WriteLog(ex.ToString());
}
return null;
}
}

View File

@@ -0,0 +1,56 @@
// 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 PureSharpCompress.Archives.Zip;
using PureSharpCompress.Common;
using PureSharpCompress.Readers;
using QuickLook.Common.Helpers;
using System;
using System.Diagnostics;
using System.IO;
namespace QuickLook.Plugin.ThumbnailViewer.Providors;
internal class KraProvidor : AbstractProvidor
{
public override Stream ViewImage(string path)
{
try
{
using ZipArchive archive = ZipArchive.Open(path, new());
using IReader reader = archive.ExtractAllEntries();
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.Contains("mergedimage"))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error reading thumbnail from {path}: {ex.Message}");
ProcessHelper.WriteLog(ex.ToString());
}
return null;
}
}

View File

@@ -16,36 +16,16 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Plugin.ImageViewer;
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Xml.Linq;
namespace QuickLook.Plugin.ThumbnailViewer;
namespace QuickLook.Plugin.ThumbnailViewer.Providors;
internal class PdnProvider
internal class PdnProvider : AbstractProvidor
{
public void Prepare(string path, ContextObject context)
{
try
{
using Stream imageData = ViewImage(path);
BitmapImage bitmap = imageData.ReadAsBitmapImage();
context.SetPreferredSizeFit(new Size(bitmap.PixelWidth, bitmap.PixelHeight), 0.8d);
}
catch (Exception ex)
{
Debug.WriteLine($"Error reading thumbnail from {path}: {ex.Message}");
context.PreferredSize = new Size { Width = 800, Height = 600 };
}
}
public Stream ViewImage(string path)
public override Stream ViewImage(string path)
{
try
{

View File

@@ -0,0 +1,56 @@
// 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 PureSharpCompress.Archives.Zip;
using PureSharpCompress.Common;
using PureSharpCompress.Readers;
using QuickLook.Common.Helpers;
using System;
using System.Diagnostics;
using System.IO;
namespace QuickLook.Plugin.ThumbnailViewer.Providors;
internal class PixProvidor : AbstractProvidor
{
public override Stream ViewImage(string path)
{
try
{
using ZipArchive archive = ZipArchive.Open(path, new());
using IReader reader = archive.ExtractAllEntries();
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.EndsWith(".thumb.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error reading thumbnail from {path}: {ex.Message}");
ProcessHelper.WriteLog(ex.ToString());
}
return null;
}
}

View File

@@ -0,0 +1,56 @@
// 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 PureSharpCompress.Archives.Zip;
using PureSharpCompress.Common;
using PureSharpCompress.Readers;
using QuickLook.Common.Helpers;
using System;
using System.Diagnostics;
using System.IO;
namespace QuickLook.Plugin.ThumbnailViewer.Providors;
internal class SketchProvidor : AbstractProvidor
{
public override Stream ViewImage(string path)
{
try
{
using ZipArchive archive = ZipArchive.Open(path, new());
using IReader reader = archive.ExtractAllEntries();
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.EndsWith("previews/preview.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error reading thumbnail from {path}: {ex.Message}");
ProcessHelper.WriteLog(ex.ToString());
}
return null;
}
}

View File

@@ -0,0 +1,63 @@
// 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 PureSharpCompress.Archives.Zip;
using PureSharpCompress.Common;
using PureSharpCompress.Readers;
using QuickLook.Common.Helpers;
using System;
using System.Diagnostics;
using System.IO;
namespace QuickLook.Plugin.ThumbnailViewer.Providors;
internal class XdProvidor : AbstractProvidor
{
public override Stream ViewImage(string path)
{
try
{
using ZipArchive archive = ZipArchive.Open(path, new());
using IReader reader = archive.ExtractAllEntries();
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.Equals("preview.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
else if (reader.Entry.Key!.Equals("thumbnail.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error reading thumbnail from {path}: {ex.Message}");
ProcessHelper.WriteLog(ex.ToString());
}
return null;
}
}

View File

@@ -0,0 +1,56 @@
// 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 PureSharpCompress.Archives.Zip;
using PureSharpCompress.Common;
using PureSharpCompress.Readers;
using QuickLook.Common.Helpers;
using System;
using System.Diagnostics;
using System.IO;
namespace QuickLook.Plugin.ThumbnailViewer.Providors;
internal class XmindProvidor : AbstractProvidor
{
public override Stream ViewImage(string path)
{
try
{
using ZipArchive archive = ZipArchive.Open(path, new());
using IReader reader = archive.ExtractAllEntries();
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key!.Equals("Thumbnails/thumbnail.png", StringComparison.OrdinalIgnoreCase))
{
MemoryStream ms = new();
using EntryStream stream = reader.OpenEntryStream();
stream.CopyTo(ms);
return ms;
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error reading thumbnail from {path}: {ex.Message}");
ProcessHelper.WriteLog(ex.ToString());
}
return null;
}
}

View File

@@ -41,7 +41,7 @@
<PackageReference Include="MediaInfo.Wrapper" Version="21.9.3">
<Aliases>MediaInfoWrapper</Aliases>
</PackageReference>
<PackageReference Include="MediaInfoDLL" Version="25.4.0">
<PackageReference Include="MediaInfoDLL" Version="25.7.0">
<Aliases>MediaInfoDLL</Aliases>
</PackageReference>
<Reference Include="WindowsBase" />
@@ -187,17 +187,17 @@
<DestinationFolder>$(OutDir)\LAVFilters-x86\</DestinationFolder>
<Link>LAVFilters-x86\swscale-lav-8.dll</Link>
</Content>
<Content Include="$(NuGetPackageRoot)\MediaInfoDLL\25.4.0\lib\netstandard2.0\x64\MediaInfo.dll">
<Content Include="$(NuGetPackageRoot)\MediaInfoDLL\25.7.0\lib\netstandard2.0\x64\MediaInfo.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<DestinationFolder>$(OutDir)MediaInfo-x64\</DestinationFolder>
<Link>MediaInfo-x64\MediaInfo.dll</Link>
</Content>
<Content Include="$(NuGetPackageRoot)\MediaInfoDLL\25.4.0\lib\netstandard2.0\x86\MediaInfo.dll">
<Content Include="$(NuGetPackageRoot)\MediaInfoDLL\25.7.0\lib\netstandard2.0\x86\MediaInfo.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<DestinationFolder>$(OutDir)MediaInfo-x86\</DestinationFolder>
<Link>MediaInfo-x86\MediaInfo.dll</Link>
</Content>
<!--<Content Include="$(NuGetPackageRoot)\MediaInfoDLL\25.4.0\lib\netstandard2.0\arm64\MediaInfo.dll">
<!--<Content Include="$(NuGetPackageRoot)\MediaInfoDLL\25.7.0\lib\netstandard2.0\arm64\MediaInfo.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<DestinationFolder>$(OutDir)MediaInfo-ARM64\</DestinationFolder>
<Link>MediaInfo-ARM64\MediaInfo.dll</Link>

View File

@@ -8,16 +8,16 @@ using System.Xml.Serialization;
namespace RegFileParser;
/// <summary>
/// The main reg file parsing class.
/// Reads the given reg file and stores the content as
/// a Dictionary of registry keys and values as a Dictionary of registry values <see cref="RegValueObject" />
/// The main reg file parsing class.
/// Reads the given reg file and stores the content as
/// a Dictionary of registry keys and values as a Dictionary of registry values <see cref="RegValueObject" />
/// </summary>
public class RegFileObject
{
#region Public Properties
/// <summary>
/// Gets the dictionary containing all entries
/// Gets the dictionary containing all entries
/// </summary>
public Dictionary<string, Dictionary<string, RegValueObject>> RegValues => regvalues;
@@ -26,12 +26,12 @@ public class RegFileObject
#region Private Fields
/// <summary>
/// Raw content of the reg file
/// Raw content of the reg file
/// </summary>
private string content;
/// <summary>
/// the dictionary containing parsed registry values
/// the dictionary containing parsed registry values
/// </summary>
private readonly Dictionary<string, Dictionary<string, RegValueObject>> regvalues;
@@ -61,7 +61,7 @@ public class RegFileObject
#region Private Methods
/// <summary>
/// Imports the reg file
/// Imports the reg file
/// </summary>
public void Read(string path)
{
@@ -70,7 +70,7 @@ public class RegFileObject
}
/// <summary>
/// Imports the reg file
/// Imports the reg file
/// </summary>
public void Read(byte[] bytes)
{
@@ -109,7 +109,7 @@ public class RegFileObject
}
/// <summary>
/// Parses the reg file for reg keys and reg values
/// Parses the reg file for reg keys and reg values
/// </summary>
/// <returns>A Dictionary with reg keys as Dictionary keys and a Dictionary of (valuename, valuedata)</returns>
private Dictionary<string, Dictionary<string, string>> ParseFile()
@@ -141,7 +141,7 @@ public class RegFileObject
}
/// <summary>
/// Creates a flat Dictionary using given searcn pattern
/// Creates a flat Dictionary using given searcn pattern
/// </summary>
/// <param name="content">The content string to be parsed</param>
/// <returns>A Dictionary with retrieved keys and remaining content</returns>
@@ -202,7 +202,7 @@ public class RegFileObject
}
/// <summary>
/// Creates a flat Dictionary using given searcn pattern
/// Creates a flat Dictionary using given searcn pattern
/// </summary>
/// <param name="content">The content string to be parsed</param>
/// <returns>A Dictionary with retrieved keys and remaining content</returns>
@@ -254,7 +254,7 @@ public class RegFileObject
}
/// <summary>
/// Removes the leading and ending characters from the given string
/// Removes the leading and ending characters from the given string
/// </summary>
/// <param name="sLine">given string</param>
/// <returns>edited string</returns>
@@ -268,7 +268,7 @@ public class RegFileObject
}
/// <summary>
/// Removes the leading and ending parenthesis from the given string
/// Removes the leading and ending parenthesis from the given string
/// </summary>
/// <param name="sLine">given string</param>
/// <returns>edited string</returns>
@@ -294,7 +294,7 @@ public class RegValueObject
private string value;
/// <summary>
/// Parameterless constructor
/// Parameterless constructor
/// </summary>
public RegValueObject()
{
@@ -307,7 +307,7 @@ public class RegValueObject
}
/// <summary>
/// Overloaded constructor
/// Overloaded constructor
/// </summary>
/// <param name="propertyString">A line from the [Registry] section of the *.sig signature file</param>
public RegValueObject(string regKeyName, string regValueName, string regValueData, string encoding)
@@ -326,7 +326,7 @@ public class RegValueObject
#region Public Methods
/// <summary>
/// Overriden Method
/// Overriden Method
/// </summary>
/// <returns>An entry for the [Registry] section of the *.sig signature file</returns>
public override string ToString()
@@ -339,7 +339,7 @@ public class RegValueObject
#region Public Properties
/// <summary>
/// Regsitry value name
/// Regsitry value name
/// </summary>
[XmlElement("entry", typeof(string))]
public string Entry
@@ -349,7 +349,7 @@ public class RegValueObject
}
/// <summary>
/// Registry value parent key
/// Registry value parent key
/// </summary>
[XmlElement("key", typeof(string))]
public string ParentKey
@@ -364,7 +364,7 @@ public class RegValueObject
}
/// <summary>
/// Registry value root hive
/// Registry value root hive
/// </summary>
[XmlElement("root", typeof(string))]
public string Root
@@ -374,7 +374,7 @@ public class RegValueObject
}
/// <summary>
/// Registry value type
/// Registry value type
/// </summary>
[XmlElement("type", typeof(string))]
public string Type
@@ -384,7 +384,7 @@ public class RegValueObject
}
/// <summary>
/// Registry value data
/// Registry value data
/// </summary>
[XmlElement("value", typeof(string))]
public string Value
@@ -447,7 +447,7 @@ public class RegValueObject
}
/// <summary>
/// Retrieves the reg value type, parsing the prefix of the value
/// Retrieves the reg value type, parsing the prefix of the value
/// </summary>
/// <param name="sTextLine">Registry value row string</param>
/// <returns>Value</returns>
@@ -546,7 +546,7 @@ public class RegValueObject
}
/// <summary>
/// Removes the leading and ending characters from the given string
/// Removes the leading and ending characters from the given string
/// </summary>
/// <param name="sline">given string</param>
/// <returns>edited string</returns>
@@ -560,7 +560,7 @@ public class RegValueObject
}
/// <summary>
/// Removes the leading and ending parenthesis from the given string
/// Removes the leading and ending parenthesis from the given string
/// </summary>
/// <param name="sline">given string</param>
/// <returns>edited string</returns>
@@ -573,7 +573,7 @@ public class RegValueObject
}
/// <summary>
/// Removes the ending backslashes from the given string
/// Removes the ending backslashes from the given string
/// </summary>
/// <param name="sline">given string</param>
/// <returns>edited string</returns>
@@ -585,7 +585,7 @@ public class RegValueObject
}
/// <summary>
/// Converts the byte arrays (saved as array of string) into string
/// Converts the byte arrays (saved as array of string) into string
/// </summary>
/// <param name="stringArray">Array of string</param>
/// <returns>String value</returns>

View File

@@ -56,6 +56,7 @@ Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "QuickLook.Installer", "Quic
{63C00175-0FF3-42C7-8621-2F1959F26064} = {63C00175-0FF3-42C7-8621-2F1959F26064}
{B4F7C88D-C79D-49E7-A1FB-FB69CF72585F} = {B4F7C88D-C79D-49E7-A1FB-FB69CF72585F}
{311E6E78-3A5B-4E51-802A-5755BD5F9F97} = {311E6E78-3A5B-4E51-802A-5755BD5F9F97}
{B0054A16-472E-44AC-BA40-349303E524FF} = {B0054A16-472E-44AC-BA40-349303E524FF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "QuickLook.Native64", "QuickLook.Native\QuickLook.Native64\QuickLook.Native64.vcxproj", "{794E4DCF-F715-4836-9D30-ABD296586D23}"
@@ -86,6 +87,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuickLook.Plugin.ThumbnailV
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuickLook.Plugin.HelixViewer", "QuickLook.Plugin\QuickLook.Plugin.HelixViewer\QuickLook.Plugin.HelixViewer.csproj", "{311E6E78-3A5B-4E51-802A-5755BD5F9F97}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuickLook.Plugin.MediaInfoViewer", "QuickLook.Plugin\QuickLook.Plugin.MediaInfoViewer\QuickLook.Plugin.MediaInfoViewer.csproj", "{B0054A16-472E-44AC-BA40-349303E524FF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -278,6 +281,14 @@ Global
{311E6E78-3A5B-4E51-802A-5755BD5F9F97}.Release|Any CPU.Build.0 = Release|Any CPU
{311E6E78-3A5B-4E51-802A-5755BD5F9F97}.Release|x64.ActiveCfg = Release|Any CPU
{311E6E78-3A5B-4E51-802A-5755BD5F9F97}.Release|x64.Build.0 = Release|Any CPU
{B0054A16-472E-44AC-BA40-349303E524FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B0054A16-472E-44AC-BA40-349303E524FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B0054A16-472E-44AC-BA40-349303E524FF}.Debug|x64.ActiveCfg = Debug|Any CPU
{B0054A16-472E-44AC-BA40-349303E524FF}.Debug|x64.Build.0 = Debug|Any CPU
{B0054A16-472E-44AC-BA40-349303E524FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B0054A16-472E-44AC-BA40-349303E524FF}.Release|Any CPU.Build.0 = Release|Any CPU
{B0054A16-472E-44AC-BA40-349303E524FF}.Release|x64.ActiveCfg = Release|Any CPU
{B0054A16-472E-44AC-BA40-349303E524FF}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -303,6 +314,7 @@ Global
{63C00175-0FF3-42C7-8621-2F1959F26064} = {06EFDBE0-6408-4B37-BCF2-0CF9EBEA2E93}
{B4F7C88D-C79D-49E7-A1FB-FB69CF72585F} = {06EFDBE0-6408-4B37-BCF2-0CF9EBEA2E93}
{311E6E78-3A5B-4E51-802A-5755BD5F9F97} = {06EFDBE0-6408-4B37-BCF2-0CF9EBEA2E93}
{B0054A16-472E-44AC-BA40-349303E524FF} = {06EFDBE0-6408-4B37-BCF2-0CF9EBEA2E93}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D3761C32-8C5F-498A-892B-3B0882994B62}

View File

@@ -117,22 +117,8 @@ public partial class App : Application
// Exception handling events which are not caught in the Task thread
TaskScheduler.UnobservedTaskException += (_, e) =>
{
try
{
ProcessHelper.WriteLog(e.Exception.ToString());
Current?.Dispatcher?.BeginInvoke(() =>
{
Wpf.Ui.Violeta.Controls.ExceptionReport.Show(e.Exception);
});
}
catch (Exception ex)
{
ProcessHelper.WriteLog(ex.ToString());
}
finally
{
e.SetObserved();
}
ProcessHelper.WriteLog(e.Exception.ToString());
e.SetObserved();
};
// Exception handling events which are not caught in UI thread
@@ -210,9 +196,9 @@ public partial class App : Application
}
};
// Initialize MessageBox patching
bool modernMessageBox = SettingHelper.Get("ModernMessageBox", true, "QuickLook");
if (modernMessageBox) MessageBoxPatcher.Initialize();
// We should improve the performance of the CLI application
// Therefore, the time-consuming initialization code can't be placed before `OnStartup`
base.OnStartup(e);
// Set initial theme based on system settings
ThemeManager.Apply(OSThemeHelper.AppsUseDarkTheme() ? ApplicationTheme.Dark : ApplicationTheme.Light);
@@ -220,17 +206,15 @@ public partial class App : Application
ThemeManager.Apply(OSThemeHelper.AppsUseDarkTheme() ? ApplicationTheme.Dark : ApplicationTheme.Light);
UxTheme.ApplyPreferredAppMode();
// Initialize TrayIcon
_ = TrayIconManager.GetInstance();
base.OnStartup(e);
// Initialize MessageBox patching
MessageBoxPatcher.Initialize();
}
private void Application_Startup(object sender, StartupEventArgs e)
{
if (!EnsureOSVersion()
|| !EnsureFirstInstance(e.Args)
|| !EnsureFolderWritable(SettingHelper.LocalDataPath))
|| !EnsureFirstInstance(e.Args)
|| !EnsureFolderWritable(SettingHelper.LocalDataPath))
{
_cleanExit = false;
Shutdown();
@@ -325,8 +309,10 @@ public partial class App : Application
}
// Second instance: duplicate
else
{
MessageBox.Show(TranslationHelper.Get("APP_SECOND_TEXT"), TranslationHelper.Get("APP_SECOND"),
MessageBoxButton.OK, MessageBoxImage.Information);
}
return false;
}

View File

@@ -81,8 +81,7 @@ public class BackgroundVisualHost : FrameworkElement
private readonly CreateContentFunction _createContent;
private readonly Action _invalidateMeasure;
private readonly AutoResetEvent _sync =
new AutoResetEvent(false);
private readonly AutoResetEvent _sync = new(false);
public ThreadedVisualHelper(
CreateContentFunction createContent,
@@ -125,17 +124,11 @@ public class BackgroundVisualHost : FrameworkElement
}
}
#region Private Fields
public ThreadedVisualHelper ThreadedHelper;
private HostVisual _hostVisual;
#endregion Private Fields
#region IsContentShowingProperty
/// <summary>
/// Identifies the IsContentShowing dependency property.
/// Identifies the IsContentShowing dependency property.
/// </summary>
public static readonly DependencyProperty IsContentShowingProperty = DependencyProperty.Register(
"IsContentShowing",
@@ -144,7 +137,7 @@ public class BackgroundVisualHost : FrameworkElement
new FrameworkPropertyMetadata(false, OnIsContentShowingChanged));
/// <summary>
/// Gets or sets if the content is being displayed.
/// Gets or sets if the content is being displayed.
/// </summary>
public bool IsContentShowing
{
@@ -163,12 +156,8 @@ public class BackgroundVisualHost : FrameworkElement
bvh.HideContentHelper();
}
#endregion IsContentShowingProperty
#region CreateContent Property
/// <summary>
/// Identifies the CreateContent dependency property.
/// Identifies the CreateContent dependency property.
/// </summary>
public static readonly DependencyProperty CreateContentProperty = DependencyProperty.Register(
"CreateContent",
@@ -177,7 +166,7 @@ public class BackgroundVisualHost : FrameworkElement
new FrameworkPropertyMetadata(OnCreateContentChanged));
/// <summary>
/// Gets or sets the function used to create the visual to display in a background thread.
/// Gets or sets the function used to create the visual to display in a background thread.
/// </summary>
public CreateContentFunction CreateContent
{
@@ -196,6 +185,4 @@ public class BackgroundVisualHost : FrameworkElement
bvh.CreateContentHelper();
}
}
#endregion CreateContent Property
}

View File

@@ -135,7 +135,7 @@ public class BusyDecorator : Decorator, IDisposable
#region IsBusyIndicatorShowing Property
/// <summary>
/// Identifies the IsBusyIndicatorShowing dependency property.
/// Identifies the IsBusyIndicatorShowing dependency property.
/// </summary>
public static readonly DependencyProperty IsBusyIndicatorShowingProperty = DependencyProperty.Register(
"IsBusyIndicatorShowing",
@@ -146,7 +146,7 @@ public class BusyDecorator : Decorator, IDisposable
OnIsBusyIndicatorShowingChanged));
/// <summary>
/// Gets or sets if the BusyIndicator is being shown.
/// Gets or sets if the BusyIndicator is being shown.
/// </summary>
public bool IsBusyIndicatorShowing
{
@@ -178,7 +178,7 @@ public class BusyDecorator : Decorator, IDisposable
#region BusyStyle
/// <summary>
/// Identifies the <see cref="BusyStyle" /> property.
/// Identifies the <see cref="BusyStyle" /> property.
/// </summary>
public static readonly DependencyProperty BusyStyleProperty =
DependencyProperty.Register(
@@ -188,7 +188,7 @@ public class BusyDecorator : Decorator, IDisposable
new FrameworkPropertyMetadata(OnBusyStyleChanged));
/// <summary>
/// Gets or sets the Style to apply to the Control that is displayed as the busy indication.
/// Gets or sets the Style to apply to the Control that is displayed as the busy indication.
/// </summary>
public Style BusyStyle
{
@@ -208,7 +208,7 @@ public class BusyDecorator : Decorator, IDisposable
#region BusyHorizontalAlignment
/// <summary>
/// Identifies the <see cref="BusyHorizontalAlignment" /> property.
/// Identifies the <see cref="BusyHorizontalAlignment" /> property.
/// </summary>
public static readonly DependencyProperty BusyHorizontalAlignmentProperty = DependencyProperty.Register(
"BusyHorizontalAlignment",
@@ -217,7 +217,7 @@ public class BusyDecorator : Decorator, IDisposable
new FrameworkPropertyMetadata(HorizontalAlignment.Center));
/// <summary>
/// Gets or sets the HorizontalAlignment to use to layout the control that contains the busy indicator control.
/// Gets or sets the HorizontalAlignment to use to layout the control that contains the busy indicator control.
/// </summary>
public HorizontalAlignment BusyHorizontalAlignment
{
@@ -230,7 +230,7 @@ public class BusyDecorator : Decorator, IDisposable
#region BusyVerticalAlignment
/// <summary>
/// Identifies the <see cref="BusyVerticalAlignment" /> property.
/// Identifies the <see cref="BusyVerticalAlignment" /> property.
/// </summary>
public static readonly DependencyProperty BusyVerticalAlignmentProperty = DependencyProperty.Register(
"BusyVerticalAlignment",
@@ -239,7 +239,7 @@ public class BusyDecorator : Decorator, IDisposable
new FrameworkPropertyMetadata(VerticalAlignment.Center));
/// <summary>
/// Gets or sets the the VerticalAlignment to use to layout the control that contains the busy indicator.
/// Gets or sets the the VerticalAlignment to use to layout the control that contains the busy indicator.
/// </summary>
public VerticalAlignment BusyVerticalAlignment
{

View File

@@ -24,17 +24,17 @@ using System.Windows.Media.Animation;
namespace QuickLook.Controls.BusyDecorator;
/// <summary>
/// Control extensions
/// Control extensions
/// </summary>
internal static class ControlExtensions
{
/// <summary>
/// The key used for storing the spinner Storyboard.
/// The key used for storing the spinner Storyboard.
/// </summary>
private static readonly string SpinnerStoryBoardName = $"{typeof(FrameworkElement).Name}Spinner";
/// <summary>
/// Start the spinning animation
/// Start the spinning animation
/// </summary>
/// <typeparam name="T">FrameworkElement and ISpinable</typeparam>
/// <param name="control">Control to apply the rotation </param>
@@ -78,7 +78,7 @@ internal static class ControlExtensions
}
/// <summary>
/// Stop the spinning animation
/// Stop the spinning animation
/// </summary>
/// <typeparam name="T">FrameworkElement and ISpinable</typeparam>
/// <param name="control">Control to stop the rotation.</param>

View File

@@ -18,17 +18,17 @@
namespace QuickLook.Controls.BusyDecorator;
/// <summary>
/// Represents a spinable control
/// Represents a spinable control
/// </summary>
internal interface ISpinable
{
/// <summary>
/// Gets or sets the current spin (angle) animation of the icon.
/// Gets or sets the current spin (angle) animation of the icon.
/// </summary>
public bool Spin { get; set; }
/// <summary>
/// Gets or sets the duration of the spinning animation (in seconds). This will stop and start the spin animation.
/// Gets or sets the duration of the spinning animation (in seconds). This will stop and start the spin animation.
/// </summary>
public double SpinDuration { get; set; }
}

View File

@@ -25,7 +25,7 @@ internal class SpinIcon : TextBlock, ISpinable
#region public bool Spin
/// <summary>
/// Identifies the Spin dependency property.
/// Identifies the Spin dependency property.
/// </summary>
public static DependencyProperty SpinProperty =
DependencyProperty.Register("Spin", typeof(bool), typeof(SpinIcon),
@@ -44,7 +44,7 @@ internal class SpinIcon : TextBlock, ISpinable
}
/// <summary>
/// Gets or sets the current spin (angle) animation of the icon.
/// Gets or sets the current spin (angle) animation of the icon.
/// </summary>
public bool Spin
{
@@ -58,7 +58,7 @@ internal class SpinIcon : TextBlock, ISpinable
#region public double SpinDuration
/// <summary>
/// Identifies the SpinDuration dependency property.
/// Identifies the SpinDuration dependency property.
/// </summary>
public static DependencyProperty SpinDurationProperty =
DependencyProperty.Register("SpinDuration", typeof(double), typeof(SpinIcon),
@@ -76,7 +76,7 @@ internal class SpinIcon : TextBlock, ISpinable
}
/// <summary>
/// Gets or sets the duration of the spinning animation (in seconds). This will stop and start the spin animation.
/// Gets or sets the duration of the spinning animation (in seconds). This will stop and start the spin animation.
/// </summary>
public double SpinDuration
{

View File

@@ -43,7 +43,7 @@ public partial class GlassLayer : UserControl
#region public Visual BlurredElement
/// <summary>
/// Identifies the BlurredElement dependency property.
/// Identifies the BlurredElement dependency property.
/// </summary>
public static DependencyProperty BlurredElementProperty =
DependencyProperty.Register("BlurredElement", typeof(Visual), typeof(GlassLayer), null);
@@ -62,7 +62,7 @@ public partial class GlassLayer : UserControl
#region public SolidColorBrush OverlayColor
/// <summary>
/// Identifies the OverlayColor dependency property.
/// Identifies the OverlayColor dependency property.
/// </summary>
public static DependencyProperty OverlayColorProperty =
DependencyProperty.Register("OverlayColor", typeof(SolidColorBrush), typeof(GlassLayer),
@@ -82,7 +82,7 @@ public partial class GlassLayer : UserControl
#region public Visibility ColorOverlayVisibility
/// <summary>
/// Identifies the ColorOverlayVisibilityProperty dependency property.
/// Identifies the ColorOverlayVisibilityProperty dependency property.
/// </summary>
public static DependencyProperty ColorOverlayVisibilityProperty =
DependencyProperty.Register("ColorOverlayVisibility", typeof(Visibility), typeof(GlassLayer),
@@ -100,7 +100,7 @@ public partial class GlassLayer : UserControl
#region public Visibility NoiseVisibility
/// <summary>
/// Identifies the NoiseVisibility dependency property.
/// Identifies the NoiseVisibility dependency property.
/// </summary>
public static DependencyProperty NoiseVisibilityProperty =
DependencyProperty.Register("NoiseVisibility", typeof(Visibility), typeof(GlassLayer),
@@ -120,7 +120,7 @@ public partial class GlassLayer : UserControl
#region public Visibility GlassVisibility
/// <summary>
/// Identifies the GlassVisibility dependency property.
/// Identifies the GlassVisibility dependency property.
/// </summary>
public static DependencyProperty GlassVisibilityProperty =
DependencyProperty.Register("GlassVisibility", typeof(Visibility), typeof(GlassLayer),

1
QuickLook/GlobalUsing.cs Normal file
View File

@@ -0,0 +1 @@
global using MessageBox = Wpf.Ui.Violeta.Controls.MessageBox;

View File

@@ -33,8 +33,8 @@ internal enum SLGP_FLAGS
SLGP_UNCPRIORITY = 0x2,
/// <summary>
/// Retrieves the raw path name. A raw path is something that might not exist and may include environment
/// variables that need to be expanded
/// Retrieves the raw path name. A raw path is something that might not exist and may include environment
/// variables that need to be expanded
/// </summary>
SLGP_RAWPATH = 0x4
}
@@ -62,13 +62,13 @@ internal struct WIN32_FIND_DATAW
internal enum SLR_FLAGS
{
/// <summary>
/// Do not display a dialog box if the link cannot be resolved. When SLR_NO_UI is set,
/// the high-order word of fFlags can be set to a time-out value that specifies the
/// maximum amount of time to be spent resolving the link. The function returns if the
/// link cannot be resolved within the time-out duration. If the high-order word is set
/// to zero, the time-out duration will be set to the default value of 3,000 milliseconds
/// (3 seconds). To specify a value, set the high word of fFlags to the desired time-out
/// duration, in milliseconds.
/// Do not display a dialog box if the link cannot be resolved. When SLR_NO_UI is set,
/// the high-order word of fFlags can be set to a time-out value that specifies the
/// maximum amount of time to be spent resolving the link. The function returns if the
/// link cannot be resolved within the time-out duration. If the high-order word is set
/// to zero, the time-out duration will be set to the default value of 3,000 milliseconds
/// (3 seconds). To specify a value, set the high word of fFlags to the desired time-out
/// duration, in milliseconds.
/// </summary>
SLR_NO_UI = 0x1,
@@ -76,9 +76,9 @@ internal enum SLR_FLAGS
SLR_ANY_MATCH = 0x2,
/// <summary>
/// If the link object has changed, update its path and list of identifiers.
/// If SLR_UPDATE is set, you do not need to call IPersistFile::IsDirty to determine
/// whether or not the link object has changed.
/// If the link object has changed, update its path and list of identifiers.
/// If SLR_UPDATE is set, you do not need to call IPersistFile::IsDirty to determine
/// whether or not the link object has changed.
/// </summary>
SLR_UPDATE = 0x4,
@@ -92,10 +92,10 @@ internal enum SLR_FLAGS
SLR_NOTRACK = 0x20,
/// <summary>
/// Disable distributed link tracking. By default, distributed link tracking tracks
/// removable media across multiple devices based on the volume name. It also uses the
/// Universal Naming Convention (UNC) path to track remote file systems whose drive letter
/// has changed. Setting SLR_NOLINKINFO disables both types of tracking.
/// Disable distributed link tracking. By default, distributed link tracking tracks
/// removable media across multiple devices based on the volume name. It also uses the
/// Universal Naming Convention (UNC) path to track remote file systems whose drive letter
/// has changed. Setting SLR_NOLINKINFO disables both types of tracking.
/// </summary>
SLR_NOLINKINFO = 0x40,