mirror of
https://github.com/QL-Win/QuickLook.git
synced 2025-09-03 03:06:44 +00:00
Compare commits
12 Commits
copilot/fi
...
3ae4eeb26d
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3ae4eeb26d | ||
![]() |
da0033b52a | ||
![]() |
2e941f468e | ||
![]() |
fbfd2484df | ||
![]() |
e342cd0851 | ||
![]() |
d90993817d | ||
![]() |
5cedcff912 | ||
![]() |
9fe37520d3 | ||
![]() |
67b5dbf310 | ||
![]() |
efe47ff43b | ||
![]() |
417876edd2 | ||
![]() |
03b1ca557f |
@@ -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,
|
||||
|
@@ -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
|
||||
}
|
||||
|
@@ -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; }
|
||||
|
||||
|
@@ -17,6 +17,7 @@
|
||||
|
||||
using LibAPNG;
|
||||
using QuickLook.Common.ExtensionMethods;
|
||||
using QuickLook.Common.Helpers;
|
||||
using QuickLook.Common.Plugin;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -30,20 +31,28 @@ using System.Windows.Media.Imaging;
|
||||
|
||||
namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers;
|
||||
|
||||
/// <summary>
|
||||
/// This provider is only for Animated PNG.
|
||||
/// The others will fall back to another provider.
|
||||
/// </summary>
|
||||
internal class APngProvider : AnimationProvider
|
||||
{
|
||||
private readonly Frame _baseFrame;
|
||||
private readonly List<FrameInfo> _frames;
|
||||
private readonly List<BitmapSource> _renderedFrames;
|
||||
private int _lastEffectivePreviousPreviousFrameIndex;
|
||||
private NativeProvider _nativeImageProvider;
|
||||
private AnimationProvider _fallbackImageProvider;
|
||||
|
||||
public APngProvider(Uri path, MetaProvider meta, ContextObject contextObject) : base(path, meta, contextObject)
|
||||
{
|
||||
if (!IsAnimatedPng(path.LocalPath))
|
||||
{
|
||||
_nativeImageProvider = new NativeProvider(path, meta, contextObject);
|
||||
Animator = _nativeImageProvider.Animator;
|
||||
var useNativeProvider = SettingHelper.Get("UseNativeProvider", true, "QuickLook.Plugin.ImageViewer");
|
||||
|
||||
_fallbackImageProvider = useNativeProvider ?
|
||||
new NativeProvider(path, meta, contextObject) :
|
||||
new ImageMagickProvider(path, meta, contextObject);
|
||||
Animator = _fallbackImageProvider.Animator;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -71,8 +80,8 @@ internal class APngProvider : AnimationProvider
|
||||
|
||||
public override Task<BitmapSource> GetThumbnail(Size renderSize)
|
||||
{
|
||||
if (_nativeImageProvider != null)
|
||||
return _nativeImageProvider.GetThumbnail(renderSize);
|
||||
if (_fallbackImageProvider != null)
|
||||
return _fallbackImageProvider.GetThumbnail(renderSize);
|
||||
|
||||
return new Task<BitmapSource>(() =>
|
||||
{
|
||||
@@ -85,8 +94,8 @@ internal class APngProvider : AnimationProvider
|
||||
|
||||
public override Task<BitmapSource> GetRenderedFrame(int index)
|
||||
{
|
||||
if (_nativeImageProvider != null)
|
||||
return _nativeImageProvider.GetRenderedFrame(index);
|
||||
if (_fallbackImageProvider != null)
|
||||
return _fallbackImageProvider.GetRenderedFrame(index);
|
||||
|
||||
if (_renderedFrames[index] != null)
|
||||
return new Task<BitmapSource>(() => _renderedFrames[index]);
|
||||
@@ -102,10 +111,10 @@ internal class APngProvider : AnimationProvider
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
if (_nativeImageProvider != null)
|
||||
if (_fallbackImageProvider != null)
|
||||
{
|
||||
_nativeImageProvider.Dispose();
|
||||
_nativeImageProvider = null;
|
||||
_fallbackImageProvider.Dispose();
|
||||
_fallbackImageProvider = null;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -214,7 +223,7 @@ internal class APngProvider : AnimationProvider
|
||||
return false;
|
||||
}
|
||||
|
||||
uint ToUInt32BE(byte[] data)
|
||||
static uint ToUInt32BE(byte[] data)
|
||||
{
|
||||
Array.Reverse(data);
|
||||
return BitConverter.ToUInt32(data, 0);
|
||||
|
@@ -40,11 +40,6 @@ internal class NativeProvider : AnimationProvider
|
||||
public override Task<BitmapSource> GetThumbnail(Size renderSize)
|
||||
{
|
||||
var fullSize = Meta.GetSize();
|
||||
|
||||
//var decodeWidth = (int) Math.Round(fullSize.Width *
|
||||
// Math.Min(renderSize.Width / 2 / fullSize.Width,
|
||||
// renderSize.Height / 2 / fullSize.Height));
|
||||
//var decodeHeight = (int) Math.Round(fullSize.Height / fullSize.Width * decodeWidth);
|
||||
var decodeWidth =
|
||||
(int)Math.Round(Math.Min(Meta.GetSize().Width, Math.Max(1d, Math.Floor(renderSize.Width))));
|
||||
var decodeHeight =
|
||||
|
@@ -65,8 +65,16 @@ public class Plugin : IViewer
|
||||
|
||||
public void Init()
|
||||
{
|
||||
// Option of UseColorProfile:
|
||||
// Default is False (disable color profile conversion)
|
||||
// Note that enabling this feature will slow down image previewing, especially on large images.
|
||||
var useColorProfile = SettingHelper.Get("UseColorProfile", false, "QuickLook.Plugin.ImageViewer");
|
||||
|
||||
// Option of UseNativeProvider:
|
||||
// Default is True (disable precise colors and choose faster response)
|
||||
// Note that disabling this feature may slightly slow down image previewing but you can get precise colors.
|
||||
var useNativeProvider = SettingHelper.Get("UseNativeProvider", true, "QuickLook.Plugin.ImageViewer");
|
||||
|
||||
AnimatedImage.AnimatedImage.Providers.Add(
|
||||
new KeyValuePair<string[], Type>(
|
||||
useColorProfile ? [".apng"] : [".apng", ".png"],
|
||||
@@ -76,11 +84,10 @@ public class Plugin : IViewer
|
||||
typeof(GifProvider)));
|
||||
AnimatedImage.AnimatedImage.Providers.Add(
|
||||
new KeyValuePair<string[], Type>(
|
||||
useColorProfile ? [] : [".bmp", ".jpg", ".jpeg", ".jfif", ".tif", ".tiff"],
|
||||
useColorProfile ? [] : (useNativeProvider ? [".bmp", ".jpg", ".jpeg", ".jfif", ".tif", ".tiff"] : []),
|
||||
typeof(NativeProvider)));
|
||||
AnimatedImage.AnimatedImage.Providers.Add(
|
||||
new KeyValuePair<string[], Type>(
|
||||
useColorProfile ? [] : [".jxr"],
|
||||
new KeyValuePair<string[], Type>([".jxr"],
|
||||
typeof(WmpProvider)));
|
||||
AnimatedImage.AnimatedImage.Providers.Add(
|
||||
new KeyValuePair<string[], Type>([".icns"],
|
||||
|
2314
QuickLook.Plugin/QuickLook.Plugin.MarkdownViewer/Resources/js/mermaid.min.js
vendored
Normal file
2314
QuickLook.Plugin/QuickLook.Plugin.MarkdownViewer/Resources/js/mermaid.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -19,6 +19,7 @@
|
||||
<script src="highlight.js/highlight.min.js"></script>
|
||||
|
||||
<script src="js/markdownItAnchor.umd.js"></script>
|
||||
<script src="js/mermaid.min.js"></script>
|
||||
</head>
|
||||
<body class="markdown-body">
|
||||
<link rel="stylesheet" href="css/github-markdown.css" />
|
||||
@@ -172,6 +173,33 @@
|
||||
padding-right: calc(1em - 2px);
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
/* Mermaid diagram styles */
|
||||
.mermaid {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.mermaid svg {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.mermaid-placeholder {
|
||||
border: 2px dashed var(--borderColor-default);
|
||||
background: var(--bgColor-muted);
|
||||
color: var(--fgColor-muted);
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.mermaid-placeholder pre {
|
||||
background: var(--bgColor-default);
|
||||
border: 1px solid var(--borderColor-default);
|
||||
color: var(--fgColor-default);
|
||||
}
|
||||
</style>
|
||||
|
||||
<textarea id="text-input" style="display: none">{{content}}</textarea>
|
||||
@@ -188,6 +216,9 @@
|
||||
typographer: false,
|
||||
quotes: "“”‘’",
|
||||
highlight: function (str, lang) {
|
||||
if (lang === 'mermaid') {
|
||||
return '<div class="mermaid">' + str + '</div>';
|
||||
}
|
||||
if (lang && hljs.getLanguage(lang)) {
|
||||
try {
|
||||
return (
|
||||
@@ -218,6 +249,62 @@
|
||||
document.getElementById("text-input").value
|
||||
);
|
||||
|
||||
// Initialize Mermaid after markdown rendering
|
||||
if (window.mermaid) {
|
||||
// Determine theme based on system preference
|
||||
const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
|
||||
mermaid.initialize({
|
||||
startOnLoad: false,
|
||||
theme: isDarkMode ? 'dark' : 'default',
|
||||
securityLevel: 'loose', // Allow HTML in diagrams for enhanced features
|
||||
fontFamily: 'Segoe UI, Helvetica, Arial, sans-serif',
|
||||
themeVariables: {
|
||||
primaryColor: isDarkMode ? '#58a6ff' : '#0969da',
|
||||
primaryTextColor: isDarkMode ? '#f0f6fc' : '#24292f',
|
||||
primaryBorderColor: isDarkMode ? '#30363d' : '#d0d7de',
|
||||
lineColor: isDarkMode ? '#484f58' : '#656d76',
|
||||
sectionBkgColor: isDarkMode ? '#21262d' : '#f6f8fa',
|
||||
altSectionBkgColor: isDarkMode ? '#161b22' : '#ffffff',
|
||||
gridColor: isDarkMode ? '#21262d' : '#f6f8fa',
|
||||
cScale0: isDarkMode ? '#58a6ff' : '#0969da',
|
||||
cScale1: isDarkMode ? '#a5f3fc' : '#54aeff',
|
||||
cScale2: isDarkMode ? '#ff7b72' : '#d1242f'
|
||||
}
|
||||
});
|
||||
|
||||
// Render Mermaid diagrams with error handling
|
||||
setTimeout(() => {
|
||||
try {
|
||||
mermaid.init(undefined, document.querySelectorAll('.mermaid'));
|
||||
} catch (error) {
|
||||
console.warn('Mermaid rendering error:', error);
|
||||
}
|
||||
}, 100);
|
||||
|
||||
// Listen for theme changes and re-render diagrams
|
||||
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
|
||||
if (window.mermaid) {
|
||||
const newTheme = e.matches ? 'dark' : 'default';
|
||||
mermaid.initialize({
|
||||
startOnLoad: false,
|
||||
theme: newTheme,
|
||||
securityLevel: 'loose',
|
||||
fontFamily: 'Segoe UI, Helvetica, Arial, sans-serif'
|
||||
});
|
||||
|
||||
// Re-render all Mermaid diagrams
|
||||
setTimeout(() => {
|
||||
try {
|
||||
mermaid.init(undefined, document.querySelectorAll('.mermaid'));
|
||||
} catch (error) {
|
||||
console.warn('Mermaid re-rendering error:', error);
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* codes below are adopted from https://codepen.io/jtojnar/full/Juiop */
|
||||
var ToC = `<nav role='navigation' class='table-of-contents'>
|
||||
<h2>Contents</h2>
|
||||
|
@@ -15,16 +15,9 @@
|
||||
// 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.Diagnostics;
|
||||
using QuickLook.Plugin.ThumbnailViewer.Providors;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using System.Windows.Media.Imaging;
|
||||
|
||||
namespace QuickLook.Plugin.ThumbnailViewer;
|
||||
|
||||
@@ -32,131 +25,33 @@ internal static class Handler
|
||||
{
|
||||
public static void Prepare(string path, ContextObject context)
|
||||
{
|
||||
try
|
||||
(Path.GetExtension(path).ToLower() switch
|
||||
{
|
||||
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)
|
||||
{
|
||||
try
|
||||
return (Path.GetExtension(path).ToLower() switch
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@@ -34,6 +34,7 @@ public class Plugin : IViewer
|
||||
".cdr", // CorelDraw
|
||||
".fig", // Figma
|
||||
".kra", // Krita
|
||||
".pdn", // Paint.NET
|
||||
".pip", ".pix", // Pixso
|
||||
".sketch", // Sketch
|
||||
".xd", // AdobeXD
|
||||
|
@@ -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);
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -0,0 +1,73 @@
|
||||
// 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 System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace QuickLook.Plugin.ThumbnailViewer.Providors;
|
||||
|
||||
internal class PdnProvider : AbstractProvidor
|
||||
{
|
||||
public override Stream ViewImage(string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
using TextReader reader = new StreamReader(path, Encoding.UTF8);
|
||||
string line = reader.ReadLine();
|
||||
|
||||
if (!line.StartsWith("PDN"))
|
||||
return null;
|
||||
|
||||
int indexOfStart = line.IndexOf("<");
|
||||
int indexOfEnd = line.LastIndexOf(">");
|
||||
|
||||
if (indexOfStart < 0 || indexOfEnd < 0)
|
||||
return null;
|
||||
|
||||
string xml = line.Substring(indexOfStart, indexOfEnd - indexOfStart + 1);
|
||||
|
||||
// <pdnImage>
|
||||
// <custom>
|
||||
// <thumb png="..." />
|
||||
// </custom>
|
||||
// </pdnImage>
|
||||
XDocument doc = XDocument.Parse(xml);
|
||||
var pngBase64 = doc.Root
|
||||
?.Element("custom")
|
||||
?.Element("thumb")
|
||||
?.Attribute("png")
|
||||
?.Value;
|
||||
|
||||
if (pngBase64 != null)
|
||||
{
|
||||
byte[] imageBytes = Convert.FromBase64String(pngBase64);
|
||||
MemoryStream ms = new(imageBytes);
|
||||
return ms;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
ProcessHelper.WriteLog(e.ToString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -210,9 +210,7 @@ public partial class App : Application
|
||||
}
|
||||
};
|
||||
|
||||
// Initialize MessageBox patching
|
||||
bool modernMessageBox = SettingHelper.Get("ModernMessageBox", true, "QuickLook");
|
||||
if (modernMessageBox) MessageBoxPatcher.Initialize();
|
||||
base.OnStartup(e);
|
||||
|
||||
// Set initial theme based on system settings
|
||||
ThemeManager.Apply(OSThemeHelper.AppsUseDarkTheme() ? ApplicationTheme.Dark : ApplicationTheme.Light);
|
||||
@@ -220,17 +218,16 @@ 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
|
||||
bool modernMessageBox = SettingHelper.Get("ModernMessageBox", true, "QuickLook");
|
||||
if (modernMessageBox) 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 +322,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;
|
||||
}
|
||||
|
1
QuickLook/GlobalUsing.cs
Normal file
1
QuickLook/GlobalUsing.cs
Normal file
@@ -0,0 +1 @@
|
||||
global using MessageBox = Wpf.Ui.Violeta.Controls.MessageBox;
|
@@ -418,9 +418,9 @@
|
||||
<MW_BrowseFolder>Przeglądaj {0}</MW_BrowseFolder>
|
||||
<MW_StayTop>Przypnij do ekranu</MW_StayTop>
|
||||
<MW_PreventClosing>Zablokuj zamykanie</MW_PreventClosing>
|
||||
<MW_BrowseFolder>Przeglądaj {0}</MW_BrowseFolder>
|
||||
<MW_Open>Otwórz {0}</MW_Open>
|
||||
<MW_OpenWith>Otwórz w {0}</MW_OpenWith>
|
||||
<MW_OpenWithMenu>Otwórz za pomocą...</MW_OpenWithMenu>
|
||||
<MW_Run>Uruchom {0}</MW_Run>
|
||||
<MW_Share>Udostępnij</MW_Share>
|
||||
<MW_Reload>Przeładuj</MW_Reload>
|
||||
@@ -441,6 +441,7 @@
|
||||
<InfoPanel_File>{0} plik</InfoPanel_File>
|
||||
<InfoPanel_Files>{0} plików</InfoPanel_Files>
|
||||
<InfoPanel_FolderAndFile>({0} i {1})</InfoPanel_FolderAndFile>
|
||||
<InfoPanel_CantPreventClosing>Anulowanie dla funkcji blokady zamykania okna nie jest wspierane</InfoPanel_CantPreventClosing>
|
||||
</pl>
|
||||
<pt-BR>
|
||||
<UI_FontFamily>Segoe UI</UI_FontFamily>
|
||||
|
Reference in New Issue
Block a user