Compare commits

...

22 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
9bcc188949 Final verification complete
Co-authored-by: emako <24737061+emako@users.noreply.github.com>
2025-10-21 10:03:30 +00:00
copilot-swe-agent[bot]
44c1559d38 Fix Desktop file selection by using consistent IsCursorActivated check
Co-authored-by: emako <24737061+emako@users.noreply.github.com>
2025-10-21 10:01:51 +00:00
copilot-swe-agent[bot]
f4c87f83a0 Initial plan 2025-10-21 09:53:27 +00:00
ema
e0eb87bcc3 Add .slnx solution file
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-10-20 01:11:47 +08:00
ema
7146a2a220 Update changelog for 4.2.2 release
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-10-15 23:09:49 +08:00
ema
491f55b6a8 Update changelog for 4.2.1 release
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-10-15 01:18:57 +08:00
ema
d25b7b32de Fix theme error in some theme-changable plugin #1507 2025-10-15 00:03:56 +08:00
ema
a887ca3014 Refactor SvgImagePanel.MimeTypes to use base class methods 2025-10-14 23:52:11 +08:00
ema
5d3fd85238 Fix theme error in MediaInfoViewer plugin #1775 2025-10-14 23:28:08 +08:00
ema
bbc20e56b6 Update changelog for 4.2.0 release
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-10-11 17:33:14 +08:00
ema
6def05648a Document 3D model controls in README
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
Added instructions for rotating and panning 3D models using left and middle mouse buttons to the controls section of the README.
2025-10-10 18:05:03 +08:00
ema
6a6c411efb Refactor icon usage to use FontSymbols constants
Replaced hardcoded icon strings with FontSymbols constants in MoreMenu and converter classes for consistency and maintainability. Removed duplicate FontSymbols class from MidiPlayer and updated usages to reference QuickLook.Common.Controls.
2025-10-10 17:39:32 +08:00
ema
39ee2f6b00 Update Batch syntax highlighting colors
Adjusted colors for selection, caret, fold markers, markers, comments, labels, output, and keywords in the Batch.xshd file to improve readability and consistency with dark theme conventions.
2025-10-10 17:07:23 +08:00
ema
d2c80e1847 Rename Goovy.xshd to Groovy.xshd 2025-10-10 16:52:41 +08:00
ema
ab4e9cbd79 Add GPL license header to rapidxml.hpp
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
Added copyright and GPL license information to the top of QuickLook.Native32/rapidxml.hpp for compliance and clarity.
2025-10-10 00:40:31 +08:00
ema
1095d2be68 Add dark theme syntax definition for HTML viewer
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
Introduces zzz-After-JavaScript-HTML.xshd, an XML-based syntax highlighting definition for HTML files in dark mode. This file configures colors, rules, and spans for improved readability in the text viewer plugin.
2025-10-08 02:00:41 +08:00
ema
432b3b033a Add cross-plugin 'Reopen as' menu for SVG and HTML
Introduces 'Reopen as source code' and 'Reopen as image preview' options in the MoreMenu for SVG and HTML files, enabling users to switch between ImageViewer and TextViewer plugins. Updates translation files to support new menu items in multiple languages and refactors related plugin code for extensibility.
2025-10-08 01:55:58 +08:00
ema
f7c029f127 Support Reopen as HTML preview #1690 2025-10-08 01:24:23 +08:00
ema
3e4052ae77 Rename 'View Source Code' to 'Reopen as Source Code'
Updated the menu item and translations to use 'Reopen as source code' instead of 'View source code' across all supported languages for consistency and clarity.
2025-10-08 00:44:33 +08:00
ema
28f93256e4 Order plugins by priority and ensure uniqueness
Changed plugin priority in MediaInfoViewer to int.MinValue. Updated ViewerWindow.Actions to display more menu items from plugins in order of priority and to avoid duplicate plugins by grouping by plugin name.
2025-10-08 00:31:54 +08:00
copilot-swe-agent[bot]
2af849ed81 Add IMoreMenu support to HtmlViewer with View Source Code option
Co-Authored-By: emako <24737061+emako@users.noreply.github.com>
2025-10-08 00:11:58 +08:00
ema
78843d8098 Fix long path handling issue in HtmlViewer #1643 2025-10-07 23:54:15 +08:00
32 changed files with 743 additions and 120 deletions

View File

@@ -1,6 +1,41 @@
## 4.2.2
- Fix version display issue [#1776](https://github.com/QL-Win/QuickLook/issues/1776)
## 4.2.1
- Fix theme error in MediaInfoViewer plugin [#1775](https://github.com/QL-Win/QuickLook/issues/1775)
- Fix theme error in any theme-changable plugin [#1507](https://github.com/QL-Win/QuickLook/issues/1507)
## 4.2.0
- Add built-in MediaInfoViewer plugin
- Add built-in MediaInfoViewer plugin and support it in more menu
- Add 'Copy as path' option to more menu
- Add cross-plugin 'Reopen as' menu for SVG and HTML [#1690](https://github.com/QL-Win/QuickLook/issues/1690)
- Support Point Cloud Data (.pcd) for 3D spatial (Only PCD files with the PointXYZ format are supported, while Color and Intensity formats are not.)
- Support Mermaid diagram rendering in MarkdownViewer [#1730](https://github.com/QL-Win/QuickLook/issues/1730)
- Support .pdn in ThumbnailViewer [#1708](https://github.com/QL-Win/QuickLook/issues/1708)
- Improve CLI performance [#1706](https://github.com/QL-Win/QuickLook/issues/1706) [#1731](https://github.com/QL-Win/QuickLook/issues/1731)
- Set default background to transparent for SVG panel
- Improve UI/UX of font loading
- Add diff file syntax highlighting
- Add Swedish translation [#1755](https://github.com/QL-Win/QuickLook/issues/1755)
- Add .slnx extension to XML syntax highlighting
- Add support for Telegram Sticker (.tgs) files [#1762](https://github.com/QL-Win/QuickLook/issues/1762)
- Add .snupkg and .asar support to archive viewer
- Add .krc file support to TextViewer
- Add UseNativeProvider option [#1726](https://github.com/QL-Win/QuickLook/issues/1726)
- Fix image .jxr error reading from UseColorProfile
- Fix issue where font file stays locked [#77](https://github.com/QL-Win/QuickLook/issues/77)
- Fix font file unicode name is not supported
- Fix extracting cover art will not cause the title to be lost [#1759](https://github.com/QL-Win/QuickLook/issues/1759)
- Fix HelixViewer default height being too large
- Fix long path handling issue in HtmlViewer [#1643](https://github.com/QL-Win/QuickLook/issues/1643)
- Update Batch syntax highlighting colors
- Refactor tray icon to use TrayIconHost
- Refactor to make exe-installer no forked relaunching
- Remove unimportant UnobservedTaskException [#1691](https://github.com/QL-Win/QuickLook/issues/1691)
- Remove configuration `ModernMessageBox`
## 4.1.1

View File

@@ -169,7 +169,7 @@ void Shell32::getSelectedFromDesktop(PWCHAR buffer)
&pwba))))
return;
if (HelperMethods::IsCursorActivated(reinterpret_cast<HWND>(LongToHandle(phwnd))))
if (HelperMethods::IsCursorActivated(0))
return;
CComPtr<IServiceProvider> psp;

View File

@@ -1,3 +1,20 @@
// 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/>.
#ifndef RAPIDXML_HPP_INCLUDED
#define RAPIDXML_HPP_INCLUDED

View File

@@ -200,22 +200,4 @@ public class WebfontPanel : WebpagePanel
using var reader = new StreamReader(ReadStream(key), Encoding.UTF8);
return reader.ReadToEnd();
}
public static class MimeTypes
{
public const string Html = "text/html";
public const string JavaScript = "application/javascript";
public const string Css = "text/css";
public const string Binary = "application/octet-stream";
public static string GetContentType(string extension = null) => $"Content-Type: {GetMimeType(extension)}";
public static string GetMimeType(string extension = null) => extension?.ToLowerInvariant() switch
{
".js" => JavaScript, // Only handle known extensions from resources
".css" => Css,
".html" => Html,
_ => Binary,
};
}
}

View File

@@ -0,0 +1,42 @@
// 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.Commands;
using QuickLook.Common.Controls;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin.MoreMenu;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
namespace QuickLook.Plugin.HtmlViewer;
public partial class Plugin
{
public IEnumerable<IMenuItem> GetMenuItems()
{
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
// HTML <=> HTML TEXT
yield return new MoreMenuItem()
{
Icon = FontSymbols.Code,
Header = TranslationHelper.Get("MW_ReopenAsSourceCode", translationFile),
Command = new RelayCommand(() => PluginHelper.InvokePluginPreview("QuickLook.Plugin.TextViewer", _currentPath)),
};
}
}

View File

@@ -16,7 +16,9 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using QuickLook.Common.Plugin;
using QuickLook.Common.Plugin.MoreMenu;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows;
@@ -24,15 +26,18 @@ using System.Windows.Threading;
namespace QuickLook.Plugin.HtmlViewer;
public class Plugin : IViewer
public partial class Plugin : IViewer, IMoreMenu
{
private static readonly string[] _extensions = [".mht", ".mhtml", ".htm", ".html"];
private static readonly string[] _supportedProtocols = ["http", "https"];
private WebpagePanel _panel;
private string _currentPath;
public int Priority => 0;
public IEnumerable<IMenuItem> MenuItems => GetMenuItems();
public void Init()
{
}
@@ -53,11 +58,13 @@ public class Plugin : IViewer
public void View(string path, ContextObject context)
{
_panel = new WebpagePanel();
_currentPath = path;
context.ViewerContent = _panel;
context.Title = Path.IsPathRooted(path) ? Path.GetFileName(path) : path;
if (path.ToLower().EndsWith(".url"))
path = Helper.GetUrlPath(path);
_panel.FallbackPath = Path.GetDirectoryName(path); // Reserve opportunities for requesting exceeds MAX_PATH (260) limitation
_panel.NavigateToFile(path);
_panel.Dispatcher.Invoke(() => { context.IsBusy = false; }, DispatcherPriority.Loaded);
}

View File

@@ -85,4 +85,10 @@
</Compile>
</ItemGroup>
<ItemGroup>
<None Update="Translations.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -3,86 +3,114 @@
<Translations>
<ca>
<WEBVIEW2_NOT_AVAILABLE>Cal instal·lar Microsoft Edge WebView2 per veure aquest fitxer.&#10;Feu clic aquí per descarregar-lo.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Torna a obrir com a codi font</MW_ReopenAsSourceCode>
</ca>
<he>
<WEBVIEW2_NOT_AVAILABLE>צפייה בקובץ זה דורשת התקנת Microsoft Edge WebView2.&#10;לחץ כאן להורדה.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>פתח מחדש כקוד מקור</MW_ReopenAsSourceCode>
</he>
<hi>
<WEBVIEW2_NOT_AVAILABLE>इस फ़ाइल को देखने के लिए Microsoft Edge WebView2 इंस्टॉल होना आवश्यक है।&#10;डाउनलोड करने के लिए यहां क्लिक करें.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>सोर्स कोड के रूप में पुनः खोलें</MW_ReopenAsSourceCode>
</hi>
<hu-HU>
<WEBVIEW2_NOT_AVAILABLE>A fájl megtekintéséhez telepíteni kell a Microsoft Edge WebView2-t.&#10;Kattintson ide a letöltéshez.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Újranyitás forráskódként</MW_ReopenAsSourceCode>
</hu-HU>
<id-ID>
<WEBVIEW2_NOT_AVAILABLE>Melihat file ini memerlukan Microsoft Edge WebView2 terinstal.&#10;Klik di sini untuk mengunduhnya.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Buka ulang sebagai kode sumber</MW_ReopenAsSourceCode>
</id-ID>
<mr>
<WEBVIEW2_NOT_AVAILABLE>या फाइलचे दृश्य Microsoft Edge WebView2 स्थापित असणे आवश्यक आहे.&#10;डाउनलोडसाठी येथे क्लिक करा.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>स्रोत कोड म्हणून पुन्हा उघडा</MW_ReopenAsSourceCode>
</mr>
<nb-NO>
<WEBVIEW2_NOT_AVAILABLE>For å vise denne filen må Microsoft Edge WebView2 være installert.&#10;Klikk her for å laste ned.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Åpne på nytt som kildekode</MW_ReopenAsSourceCode>
</nb-NO>
<nl-NL>
<WEBVIEW2_NOT_AVAILABLE>Voor het bekijken van dit bestand moet Microsoft Edge WebView2 geïnstalleerd zijn.&#10;Klik hier om te downloaden.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Opnieuw openen als broncode</MW_ReopenAsSourceCode>
</nl-NL>
<pt-BR>
<WEBVIEW2_NOT_AVAILABLE>Para visualizar este arquivo, é necessário instalar o Microsoft Edge WebView2.&#10;Clique aqui para baixar.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Reabrir como código-fonte</MW_ReopenAsSourceCode>
</pt-BR>
<pt-PT>
<WEBVIEW2_NOT_AVAILABLE>Para visualizar este ficheiro, é necessário instalar o Microsoft Edge WebView2.&#10;Clique aqui para descarregar.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Reabrir como código-fonte</MW_ReopenAsSourceCode>
</pt-PT>
<ru-RU>
<WEBVIEW2_NOT_AVAILABLE>Для просмотра этого файла требуется установка Microsoft Edge WebView2.&#10;Нажмите здесь, чтобы скачать.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Открыть заново как исходный код</MW_ReopenAsSourceCode>
</ru-RU>
<sk>
<WEBVIEW2_NOT_AVAILABLE>Na zobrazenie tohto súboru je potrebné nainštalovať Microsoft Edge WebView2.&#10;Kliknite sem pre stiahnutie.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Znovu otvoriť ako zdrojový kód</MW_ReopenAsSourceCode>
</sk>
<tr-TR>
<WEBVIEW2_NOT_AVAILABLE>Bu dosyayı görüntülemek için Microsoft Edge WebView2'nin yüklü olması gerekir.&#10;İndirmek için buraya tıklayın.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Kaynak kod olarak yeniden aç</MW_ReopenAsSourceCode>
</tr-TR>
<vi>
<WEBVIEW2_NOT_AVAILABLE>Để xem tệp này, cần cài đặt Microsoft Edge WebView2.&#10;Nhấn vào đây để tải về.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Mở lại dưới dạng mã nguồn</MW_ReopenAsSourceCode>
</vi>
<en>
<WEBVIEW2_NOT_AVAILABLE>Viewing this file requires Microsoft Edge WebView2 to be installed.&#10;Click here to download it.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Reopen as source code</MW_ReopenAsSourceCode>
</en>
<ko>
<WEBVIEW2_NOT_AVAILABLE>이 파일을 보려면 Microsoft Edge WebView2를 설치해야 합니다.&#10;여기를 클릭하여 다운로드하세요.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>소스 코드로 다시 열기</MW_ReopenAsSourceCode>
</ko>
<de>
<WEBVIEW2_NOT_AVAILABLE>Für das Anzeigen dieses Dateityps wird MS Edge WebView2 benötigt.&#10;Hier klicken zum Downloaden.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Als Quellcode erneut öffnen</MW_ReopenAsSourceCode>
</de>
<fr>
<WEBVIEW2_NOT_AVAILABLE>Microsoft Edge WebView2 est requis pour afficher ce type de fichier.&#10;Cliquez ici pour le télécharger.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Rouvrir en tant que code source</MW_ReopenAsSourceCode>
</fr>
<ja>
<WEBVIEW2_NOT_AVAILABLE>このファイルを閲覧するには、Microsoft Edge WebView2 がインストールされている必要があります。&#10;ここをクリックしてダウンロードを開始する。</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>ソースコードとして再度開く</MW_ReopenAsSourceCode>
</ja>
<zh-CN>
<WEBVIEW2_NOT_AVAILABLE>查看此文件需要安装 Microsoft Edge WebView2。&#10;点击这里开始下载。</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>以源代码方式重新打开</MW_ReopenAsSourceCode>
</zh-CN>
<zh-TW>
<WEBVIEW2_NOT_AVAILABLE>查看此文件需要安裝 Microsoft Edge WebView2。&#10;點擊這裡開始下載。</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>以原始碼方式重新開啟</MW_ReopenAsSourceCode>
</zh-TW>
<es>
<WEBVIEW2_NOT_AVAILABLE>Es necesario tener instalado Microsoft Edge WebView2 para ver este fichero.&#10;Haga clic aquí para descargarlo.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Reabrir como código fuente</MW_ReopenAsSourceCode>
</es>
<it>
<WEBVIEW2_NOT_AVAILABLE>Visualizzare questo file richiede che Microsoft Edge WebView2 sia installato.&#10;Clicca qui per scaricarlo.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Riapri come codice sorgente</MW_ReopenAsSourceCode>
</it>
<ar>
<WEBVIEW2_NOT_AVAILABLE>مطلوب لعرض هذا الملف. انقر هنا لتحميله Microsoft Edge WebView2</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>إعادة الفتح كرمز مصدر</MW_ReopenAsSourceCode>
</ar>
<pl>
<WEBVIEW2_NOT_AVAILABLE>Wyświetlenie tego pliku wymaga zainstalowania Microsoft Edge WebView2.&#10;Kliknij tutaj, aby go pobrać.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Otwórz ponownie jako kod źródłowy</MW_ReopenAsSourceCode>
</pl>
<el>
<WEBVIEW2_NOT_AVAILABLE>Για την προβολή αυτού του αρχείου απαιτείται εγκατάσταση του Microsoft Edge WebView2.&#10;Κάντε κλικ εδώ για να το κατεβάσετε.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Επαναάνοιγμα ως πηγαίος κώδικας</MW_ReopenAsSourceCode>
</el>
<uk-UA>
<WEBVIEW2_NOT_AVAILABLE>Для перегляду цього файлу потрібно встановити Microsoft Edge WebView2.&#10;Натисніть тут, щоб завантажити його.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Відкрити знову як вихідний код</MW_ReopenAsSourceCode>
</uk-UA>
<sv>
<WEBVIEW2_NOT_AVAILABLE>För att visa denna fil krävs att Microsoft Edge WebView2 är installerat.&#10;Klicka här för att ladda ner det.</WEBVIEW2_NOT_AVAILABLE>
<MW_ReopenAsSourceCode>Öppna igen som källkod</MW_ReopenAsSourceCode>
</sv>
</Translations>

View File

@@ -191,28 +191,42 @@ public class WebpagePanel : UserControl
{
var requestedUri = new Uri(args.Request.Uri);
// Check if the request is for a local file
if (requestedUri.Scheme == "file" && !File.Exists(requestedUri.LocalPath))
if (requestedUri.Scheme == "file")
{
// Try loading from fallback directory
var fileName = Path.GetFileName(requestedUri.LocalPath);
var fileDirectoryName = Path.GetDirectoryName(requestedUri.LocalPath);
// Convert the primary path to fallback path
if (fileDirectoryName.StartsWith(_primaryPath))
// Check if the request is for a local file
if (!File.Exists(requestedUri.LocalPath))
{
var fallbackFilePath = Path.Combine(
_fallbackPath.Trim('/', '\\'), // Make it combinable
fileDirectoryName.Substring(_primaryPath.Length).Trim('/', '\\'), // Make it combinable
fileName
);
// Try loading from fallback directory
var fileName = Path.GetFileName(requestedUri.LocalPath);
var fileDirectoryName = Path.GetDirectoryName(requestedUri.LocalPath);
if (File.Exists(fallbackFilePath))
// Convert the primary path to fallback path
if (fileDirectoryName.StartsWith(_primaryPath))
{
// Serve the file from the fallback directory
var fileStream = new FileStream(fallbackFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
var fallbackFilePath = Path.Combine(
_fallbackPath.Trim('/', '\\'), // Make it combinable
fileDirectoryName.Substring(_primaryPath.Length).Trim('/', '\\'), // Make it combinable
fileName
);
if (File.Exists(fallbackFilePath))
{
// Serve the file from the fallback directory
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;
}
}
}
// Check if the request exceeds MAX_PATH (260) limitation
else if (requestedUri.LocalPath.Length >= 260)
{
if (File.Exists(requestedUri.LocalPath))
{
var fileStream = new FileStream(requestedUri.LocalPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
var response = _webView.CoreWebView2.Environment.CreateWebResourceResponse(
fileStream, 200, "OK", "Content-Type: application/octet-stream");
fileStream, 200, "OK", MimeTypes.GetContentType(Path.GetExtension(requestedUri.LocalPath)));
args.Response = response;
}
}
@@ -245,4 +259,78 @@ public class WebpagePanel : UserControl
return button;
}
public static class MimeTypes
{
public const string Html = "text/html";
public const string JavaScript = "application/javascript";
public const string Css = "text/css";
public const string Json = "application/json";
public const string Xml = "application/xml";
public const string Svg = "image/svg+xml";
public const string Png = "image/png";
public const string Jpeg = "image/jpeg";
public const string Gif = "image/gif";
public const string Webp = "image/webp";
public const string Ico = "image/x-icon";
public const string Avif = "image/avif";
public const string Woff = "font/woff";
public const string Woff2 = "font/woff2";
public const string Ttf = "font/ttf";
public const string Otf = "font/otf";
public const string Mp3 = "audio/mpeg";
public const string Mp4 = "video/mp4";
public const string Webm = "video/webm";
public const string Pdf = "application/pdf";
public const string Binary = "application/octet-stream";
public const string Text = "text/plain";
public static string GetContentType(string extension = null) => $"Content-Type: {GetMimeType(extension)}";
/// <summary>
/// Only handle known extensions from resources
/// </summary>
public static string GetMimeType(string extension = null) => extension?.ToLowerInvariant() switch
{
// Core web files
".html" or ".htm" => Html,
".js" => JavaScript,
".css" => Css,
".json" => Json,
".xml" => Xml,
// Images
".png" => Png,
".jpg" or ".jpeg" => Jpeg,
".gif" => Gif,
".webp" => Webp,
".svg" => Svg,
".ico" => Ico,
".avif" => Avif,
// Fonts
".woff" => Woff,
".woff2" => Woff2,
".ttf" => Ttf,
".otf" => Otf,
// Media
".mp3" => Mp3,
".mp4" => Mp4,
".webm" => Webm,
// Documents
".pdf" => Pdf,
".txt" => Text,
// Archives
".zip" => "application/zip",
".gz" => "application/gzip",
".rar" => "application/vnd.rar",
".7z" => "application/x-7z-compressed",
// Default
_ => Binary,
};
}
}

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 QuickLook.Common.Commands;
using QuickLook.Common.Controls;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin.MoreMenu;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
namespace QuickLook.Plugin.ImageViewer;
public partial class Plugin
{
public IEnumerable<IMenuItem> GetMenuItems()
{
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
string extension = Path.GetExtension(_currentPath).ToLower();
var reopen = extension switch
{
// SVG IMAGE <=> XML TEXT
".svg" => new MoreMenuItem()
{
Icon = FontSymbols.Code,
Header = TranslationHelper.Get("MW_ReopenAsSourceCode", translationFile),
Command = new RelayCommand(() => PluginHelper.InvokePluginPreview("QuickLook.Plugin.TextViewer", _currentPath)),
},
_ => null,
};
if (reopen is not null)
yield return reopen;
}
}

View File

@@ -17,6 +17,7 @@
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Common.Plugin.MoreMenu;
using QuickLook.Plugin.ImageViewer.AnimatedImage.Providers;
using QuickLook.Plugin.ImageViewer.Webview;
using System;
@@ -28,7 +29,7 @@ using System.Windows.Input;
namespace QuickLook.Plugin.ImageViewer;
public class Plugin : IViewer
public partial class Plugin : IViewer, IMoreMenu
{
private static readonly HashSet<string> WellKnownExtensions = new(
[
@@ -56,6 +57,7 @@ public class Plugin : IViewer
]);
private ImagePanel _ip;
private string _currentPath;
private MetaProvider _meta;
private IWebImagePanel _ipWeb;
@@ -63,6 +65,8 @@ public class Plugin : IViewer
public int Priority => 0;
public IEnumerable<IMenuItem> MenuItems => GetMenuItems();
public void Init()
{
// Option of UseColorProfile:
@@ -137,6 +141,8 @@ public class Plugin : IViewer
public void View(string path, ContextObject context)
{
_currentPath = path;
if (WebHandler.TryView(path, context, _metaWeb, out _ipWeb))
return;

View File

@@ -138,4 +138,10 @@
</Compile>
</ItemGroup>
<ItemGroup>
<None Update="Translations.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<Translations>
<ca>
<MW_ReopenAsSourceCode>Torna a obrir com a codi font</MW_ReopenAsSourceCode>
</ca>
<he>
<MW_ReopenAsSourceCode>פתח מחדש כקוד מקור</MW_ReopenAsSourceCode>
</he>
<hi>
<MW_ReopenAsSourceCode>सोर्स कोड के रूप में पुनः खोलें</MW_ReopenAsSourceCode>
</hi>
<hu-HU>
<MW_ReopenAsSourceCode>Újranyitás forráskódként</MW_ReopenAsSourceCode>
</hu-HU>
<id-ID>
<MW_ReopenAsSourceCode>Buka ulang sebagai kode sumber</MW_ReopenAsSourceCode>
</id-ID>
<mr>
<MW_ReopenAsSourceCode>स्रोत कोड म्हणून पुन्हा उघडा</MW_ReopenAsSourceCode>
</mr>
<nb-NO>
<MW_ReopenAsSourceCode>Åpne på nytt som kildekode</MW_ReopenAsSourceCode>
</nb-NO>
<nl-NL>
<MW_ReopenAsSourceCode>Opnieuw openen als broncode</MW_ReopenAsSourceCode>
</nl-NL>
<pt-BR>
<MW_ReopenAsSourceCode>Reabrir como código-fonte</MW_ReopenAsSourceCode>
</pt-BR>
<pt-PT>
<MW_ReopenAsSourceCode>Reabrir como código-fonte</MW_ReopenAsSourceCode>
</pt-PT>
<ru-RU>
<MW_ReopenAsSourceCode>Открыть заново как исходный код</MW_ReopenAsSourceCode>
</ru-RU>
<sk>
<MW_ReopenAsSourceCode>Znovu otvoriť ako zdrojový kód</MW_ReopenAsSourceCode>
</sk>
<tr-TR>
<MW_ReopenAsSourceCode>Kaynak kod olarak yeniden aç</MW_ReopenAsSourceCode>
</tr-TR>
<vi>
<MW_ReopenAsSourceCode>Mở lại dưới dạng mã nguồn</MW_ReopenAsSourceCode>
</vi>
<en>
<MW_ReopenAsSourceCode>Reopen as source code</MW_ReopenAsSourceCode>
</en>
<ko>
<MW_ReopenAsSourceCode>소스 코드로 다시 열기</MW_ReopenAsSourceCode>
</ko>
<de>
<MW_ReopenAsSourceCode>Als Quellcode erneut öffnen</MW_ReopenAsSourceCode>
</de>
<fr>
<MW_ReopenAsSourceCode>Rouvrir en tant que code source</MW_ReopenAsSourceCode>
</fr>
<ja>
<MW_ReopenAsSourceCode>ソースコードとして再度開く</MW_ReopenAsSourceCode>
</ja>
<zh-CN>
<MW_ReopenAsSourceCode>以源代码方式重新打开</MW_ReopenAsSourceCode>
</zh-CN>
<zh-TW>
<MW_ReopenAsSourceCode>以原始碼方式重新開啟</MW_ReopenAsSourceCode>
</zh-TW>
<es>
<MW_ReopenAsSourceCode>Reabrir como código fuente</MW_ReopenAsSourceCode>
</es>
<it>
<MW_ReopenAsSourceCode>Riapri come codice sorgente</MW_ReopenAsSourceCode>
</it>
<ar>
<MW_ReopenAsSourceCode>إعادة الفتح كرمز مصدر</MW_ReopenAsSourceCode>
</ar>
<pl>
<MW_ReopenAsSourceCode>Otwórz ponownie jako kod źródłowy</MW_ReopenAsSourceCode>
</pl>
<el>
<MW_ReopenAsSourceCode>Επαναάνοιγμα ως πηγαίος κώδικας</MW_ReopenAsSourceCode>
</el>
<uk-UA>
<MW_ReopenAsSourceCode>Відкрити знову як вихідний код</MW_ReopenAsSourceCode>
</uk-UA>
<sv>
<MW_ReopenAsSourceCode>Öppna igen som källkod</MW_ReopenAsSourceCode>
</sv>
</Translations>

View File

@@ -186,24 +186,13 @@ public class SvgImagePanel : WebpagePanel, IWebImagePanel
return reader.ReadToEnd();
}
public static class MimeTypes
public new static class MimeTypes
{
public const string Html = "text/html";
public const string JavaScript = "application/javascript";
public const string Json = "application/json";
public const string Css = "text/css";
public const string Binary = "application/octet-stream";
public static string GetContentTypeHeader(string extension = null)
=> $"Content-Type: {WebpagePanel.MimeTypes.GetMimeType(extension)}";
public static string GetContentTypeHeader(string extension = null) => $"Content-Type: {GetMimeType(extension)}";
public static string GetMimeType(string extension = null) => extension?.ToLowerInvariant() switch
{
".js" => JavaScript, // Only handle known extensions from resources
".json" => Json,
".css" => Css,
".html" => Html,
_ => Binary,
};
public static string GetMimeType(string extension = null)
=> WebpagePanel.MimeTypes.GetMimeType(extension);
}
}

View File

@@ -16,6 +16,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using QuickLook.Common.Commands;
using QuickLook.Common.Controls;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin.MoreMenu;
using System.Collections.Generic;
@@ -40,7 +41,7 @@ public partial class Plugin
yield return new MoreMenuItem()
{
Icon = "\xea69",
Icon = FontSymbols.Media,
Header = TranslationHelper.Get("MW_ShowMediaInfo", translationFile),
MenuItems = null,
Command = ShowWithMediaInfoCommand,

View File

@@ -24,6 +24,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace QuickLook.Plugin.MediaInfoViewer;
@@ -32,7 +33,7 @@ public partial class Plugin : IViewer, IMoreMenuExtended
{
private TextViewerPanel _tvp;
public int Priority => 0;
public int Priority => int.MinValue;
public IEnumerable<IMenuItem> MenuItems => GetMenuItems();
@@ -100,14 +101,15 @@ public partial class Plugin : IViewer, IMoreMenuExtended
if (isDark)
{
context.Theme = Themes.Dark;
tvp.Foreground = new BrushConverter().ConvertFromString("#FFEFEFEF") as SolidColorBrush;
tvp.Background = Brushes.Transparent;
tvp.SetResourceReference(TextBlock.ForegroundProperty, "WindowTextForeground");
}
else
{
context.Theme = Themes.Light;
tvp.Foreground = new BrushConverter().ConvertFromString("#BBFAFAFA") as SolidColorBrush;
tvp.Background = Brushes.Transparent;
tvp.Background = OSThemeHelper.AppsUseDarkTheme()
? new SolidColorBrush(Color.FromArgb(175, 255, 255, 255))
: Brushes.Transparent;
}
}
}

View File

@@ -0,0 +1,60 @@
// 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.Commands;
using QuickLook.Common.Controls;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin.MoreMenu;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
namespace QuickLook.Plugin.TextViewer;
public partial class Plugin
{
public IEnumerable<IMenuItem> GetMenuItems()
{
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
string extension = Path.GetExtension(_currentPath).ToLower();
var reopen = extension switch
{
// HTML <=> HTML TEXT
// \QuickLook\QuickLook.Plugin\QuickLook.Plugin.TextViewer\Syntax\Light\zzz-After-JavaScript-HTML.xshd
// .html;.htm;.xhtml;.shtml;.shtm;.xht;.hta
".html" or ".htm" or ".xhtml" or ".shtml" or ".shtm" or ".xht" or ".hta" => new MoreMenuItem()
{
Icon = FontSymbols.Globe,
Header = TranslationHelper.Get("MW_ReopenAsHtmlPreview", translationFile),
Command = new RelayCommand(() => PluginHelper.InvokePluginPreview("QuickLook.Plugin.HtmlViewer", _currentPath)),
},
// SVG IMAGE <=> XML TEXT
".svg" => new MoreMenuItem()
{
Icon = FontSymbols.Picture,
Header = TranslationHelper.Get("MW_ReopenAsImagePreview", translationFile),
Command = new RelayCommand(() => PluginHelper.InvokePluginPreview("QuickLook.Plugin.ImageViewer", _currentPath)),
},
_ => null,
};
if (reopen is not null)
yield return reopen;
}
}

View File

@@ -16,6 +16,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using QuickLook.Common.Plugin;
using QuickLook.Common.Plugin.MoreMenu;
using System;
using System.Collections.Generic;
using System.IO;
@@ -27,7 +28,7 @@ using System.Windows.Media;
namespace QuickLook.Plugin.TextViewer;
public class Plugin : IViewer
public partial class Plugin : IViewer, IMoreMenu
{
private static readonly HashSet<string> WellKnownExtensions = new(
[
@@ -35,9 +36,12 @@ public class Plugin : IViewer
]);
private TextViewerPanel _tvp;
private string _currentPath;
public int Priority => -5;
public IEnumerable<IMenuItem> MenuItems => GetMenuItems();
public void Init()
{
}
@@ -82,6 +86,7 @@ public class Plugin : IViewer
else
{
_tvp = new TextViewerPanel();
_currentPath = path;
_tvp.LoadFileAsync(path, context);
context.ViewerContent = _tvp;
}

View File

@@ -4,19 +4,19 @@
<Environment>
<Default color="White" bgcolor="#000000"/>
<Selection color="#000080" bgcolor="#C3C3FF"/>
<Selection color="#FFFFFF" bgcolor="#264F78"/>
<LineNumbers color="#A9A9A9" bgcolor="#000000"/>
<CaretMarker color="#A9A9A9"/>
<CaretMarker color="#FFFFFF"/>
<VRuler color="#808080"/>
<FoldLine color="#D3D3D3" bgcolor="#000000"/>
<FoldMarker color="#D3D3D3" bgcolor="#000000"/>
<SelectedFoldLine color="#D3D3D3" bgcolor="#000000"/>
<FoldLine color="#3C3C3C" bgcolor="#000000"/>
<FoldMarker color="#3C3C3C" bgcolor="#000000"/>
<SelectedFoldLine color="#3C3C3C" bgcolor="#000000"/>
<EOLMarkers color="#A9A9A9"/>
<SpaceMarkers color="#A9A9A9"/>
<TabMarkers color="#A9A9A9"/>
<InvalidLines color="#A9A9A9"/>
<EOLMarkers color="#404040"/>
<SpaceMarkers color="#404040"/>
<TabMarkers color="#404040"/>
<InvalidLines color="#404040"/>
</Environment>
<Properties>
@@ -30,23 +30,23 @@
<Delimiters>@+*\/=|'&lt;&gt;?;</Delimiters>
<Span name="LineComment1" stopateol="true" color="#00FF00" bold="false" italic="false">
<Span name="LineComment1" stopateol="true" color="#6A9955" bold="false" italic="false">
<Begin singleword="true">REM </Begin>
</Span>
<Span name="LineComment2" stopateol="true" color="#00FF00" bold="false" italic="false">
<Span name="LineComment2" stopateol="true" color="#6A9955" bold="false" italic="false">
<Begin startofline="true">::</Begin>
</Span>
<Span name="Label" stopateol="true" color="#FF0000" bgcolor="#FFFF80" bold="false" italic="false">
<Span name="Label" stopateol="true" color="#FF8800" bold="false" italic="false">
<Begin startofline="true">:</Begin>
</Span>
<Span name="Output" stopateol="true" color="White" bold="false" italic="false">
<Begin color="Blue">echo</Begin>
<Span name="Output" stopateol="true" color="#9CDCFE" bold="false" italic="false">
<Begin>echo</Begin>
</Span>
<KeyWords name="Keywords1" color="Blue" bold="false" italic="false">
<KeyWords name="Keywords1" color="#569CD6" bold="false" italic="false">
<Key word="aux"/>
<Key word="baud"/>
<Key word="break"/>
@@ -147,7 +147,7 @@
<Key word="xon"/>
</KeyWords>
<KeyWords name="Keywords2" color="#008080" bold="false" italic="false">
<KeyWords name="Keywords2" color="#4EC9B0" bold="false" italic="false">
<Key word="append"/>
<Key word="assoc"/>
<Key word="at"/>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<SyntaxDefinition name="XML" extensions=".xml;.xsl;.xslt;.xsd;.syn;.lang;.manifest;.config;.addin;.xshd;.wxs;.wxi;.wxl;.proj;.csproj;.vbproj;.resx;.user;.ilproj;.booproj;.build;.xfrm;.targets;.axaml;.xaml;.xpt;.xft;.map;.wsdl;.disco;.ascx;.atom;.bpmn;.cpt;.csl;.props;.dotsettings;.slnx">
<SyntaxDefinition name="XML" extensions=".xml;.xsl;.xslt;.xsd;.syn;.lang;.manifest;.config;.addin;.xshd;.wxs;.wxi;.wxl;.proj;.csproj;.vbproj;.resx;.user;.ilproj;.booproj;.build;.xfrm;.targets;.axaml;.xaml;.xpt;.xft;.map;.wsdl;.disco;.ascx;.atom;.bpmn;.cpt;.csl;.props;.dotsettings;.slnx;.svg">
<Environment>
<Default color="#D4D4D4" bgcolor="#1E1E1E"/>

View File

@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<SyntaxDefinition name="HTML" extensions=".html;.htm;.xhtml;.shtml;.shtm;.xht;.hta">
<Environment>
<Default color="#D4D4D4" bgcolor="#1E1E1E"/>
<Selection color="#FFFFFF" bgcolor="#264F78"/>
<LineNumbers color="#858585" bgcolor="#1E1E1E"/>
<CaretMarker color="#AEAFAD"/>
<VRuler color="#3E3E42"/>
<FoldLine color="#5F5F5F" bgcolor="#1E1E1E"/>
<FoldMarker color="#D4D4D4" bgcolor="#1E1E1E"/>
<SelectedFoldLine color="#D4D4D4" bgcolor="#1E1E1E"/>
<EOLMarkers color="#3E3E42"/>
<SpaceMarkers color="#3E3E42"/>
<TabMarkers color="#3E3E42"/>
<InvalidLines color="#3E3E42"/>
</Environment>
<Properties>
<Property name="BlockCommentBegin" value="&lt;!--"/>
<Property name="BlockCommentEnd" value="--&gt;"/>
</Properties>
<Digits name="Digits" color="#B5CEA8" bold="false" italic="false"/>
<RuleSets>
<RuleSet ignorecase="true">
<Delimiters></Delimiters>
<Span name="BlockComment" stopateol="false" color="#6A9955" bold="false" italic="false">
<Begin>&lt;!--</Begin>
<End>--&gt;</End>
</Span>
<Span name="ScriptTag" rule="JavaScriptSet" stopateol="false" color="#D4D4D4" bold="false" italic="false">
<Begin color="#569CD6">&lt;script&gt;</Begin>
<End color="#569CD6">&lt;/script&gt;</End>
</Span>
<Span name="HtmlTag" rule="HtmlTagSet" stopateol="false" color="#569CD6" bold="false" italic="false">
<Begin>&lt;</Begin>
<End>&gt;</End>
</Span>
<Span name="Entity" stopateol="true" color="#D4D4D4" bgcolor="#1E1E1E" bold="false" italic="true">
<Begin bgcolor="#1E1E1E">&amp;</Begin>
<End bgcolor="#1E1E1E">;</End>
</Span>
</RuleSet>
<RuleSet name="JavaScriptSet" reference="JavaScript"/>
<RuleSet name="HtmlTagSet" ignorecase="false">
<Delimiters>/=</Delimiters>
<Span name="String" stopateol="true" color="#CE9178" bold="false" italic="false">
<Begin>"</Begin>
<End>"</End>
</Span>
<Span name="Char" stopateol="true" color="#CE9178" bold="false" italic="false">
<Begin>'</Begin>
<End>'</End>
</Span>
<MarkPrevious color="#9CDCFE" bold="false" italic="false">=</MarkPrevious>
<KeyWords name="Slash" color="#569CD6" bold="false" italic="false">
<Key word="/"/>
</KeyWords>
<KeyWords name="Assignment" color="#D4D4D4" bold="false" italic="false">
<Key word="="/>
</KeyWords>
</RuleSet>
</RuleSets>
</SyntaxDefinition>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<SyntaxDefinition name="XML" extensions=".xml;.xsl;.xslt;.xsd;.syn;.lang;.manifest;.config;.addin;.xshd;.wxs;.wxi;.wxl;.proj;.csproj;.vbproj;.resx;.user;.ilproj;.booproj;.build;.xfrm;.targets;.axaml;.xaml;.xpt;.xft;.map;.wsdl;.disco;.ascx;.atom;.bpmn;.cpt;.csl;.props;.dotsettings;.slnx">
<SyntaxDefinition name="XML" extensions=".xml;.xsl;.xslt;.xsd;.syn;.lang;.manifest;.config;.addin;.xshd;.wxs;.wxi;.wxl;.proj;.csproj;.vbproj;.resx;.user;.ilproj;.booproj;.build;.xfrm;.targets;.axaml;.xaml;.xpt;.xft;.map;.wsdl;.disco;.ascx;.atom;.bpmn;.cpt;.csl;.props;.dotsettings;.slnx;.svg">
<Environment>
<Default color="Black" bgcolor="#FFFFFF"/>

View File

@@ -5,145 +5,196 @@
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>انسخ</Editor_Copy>
<Editor_SelectAll>حدد الكل</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>إعادة فتح كمعاينة HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>إعادة فتح كمعاينة صورة</MW_ReopenAsImagePreview>
</ar>
<ca>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Copia</Editor_Copy>
<Editor_SelectAll>Selecciona-ho tot</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Torna a obrir com a previsualització HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Torna a obrir com a previsualització d'imatge</MW_ReopenAsImagePreview>
</ca>
<de>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Kopieren</Editor_Copy>
<Editor_SelectAll>Alles markieren</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Als HTML-Vorschau erneut öffnen</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Als Bildvorschau erneut öffnen</MW_ReopenAsImagePreview>
</de>
<en>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Copy</Editor_Copy>
<Editor_SelectAll>Select All</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Reopen as HTML preview</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Reopen as image preview</MW_ReopenAsImagePreview>
</en>
<ar>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>انسخ</Editor_Copy>
<Editor_SelectAll>حدد الكل</Editor_SelectAll>
</ar>
<es>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Copiar</Editor_Copy>
<Editor_SelectAll>Seleccionar Todo</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Reabrir como vista previa HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Reabrir como vista previa de imagen</MW_ReopenAsImagePreview>
</es>
<fr>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Copie</Editor_Copy>
<Editor_SelectAll>Tout sélectionner</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Rouvrir en aperçu HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Rouvrir en aperçu d'image</MW_ReopenAsImagePreview>
</fr>
<it>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Copia</Editor_Copy>
<Editor_SelectAll>Seleziona tutto</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Riapri come anteprima HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Riapri come anteprima immagine</MW_ReopenAsImagePreview>
</it>
<ja-JP>
<Editor_FontFamily>Consolas,Meiryo UI,MS UI Gothic,MS Gothic</Editor_FontFamily>
<Editor_Copy>コピー</Editor_Copy>
<Editor_SelectAll>すべて選択</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>HTML プレビューとして再度開く</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>画像プレビューとして再度開く</MW_ReopenAsImagePreview>
</ja-JP>
<ko>
<Editor_FontFamily>Consolas,Malgun Gothic,Gulim</Editor_FontFamily>
<Editor_Copy>복사</Editor_Copy>
<Editor_SelectAll>모두 선택</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>HTML 미리보기로 다시 열기</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>이미지 미리보기로 다시 열기</MW_ReopenAsImagePreview>
</ko>
<nb-NO>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Kopier</Editor_Copy>
<Editor_SelectAll>Merk alt</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Åpne på nytt som HTML-forhåndsvisning</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Åpne på nytt som bilde-forhåndsvisning</MW_ReopenAsImagePreview>
</nb-NO>
<nl-NL>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Kopiëren</Editor_Copy>
<Editor_SelectAll>Alles selecteren</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Opnieuw openen als HTML-voorbeeld</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Opnieuw openen als afbeelding-voorbeeld</MW_ReopenAsImagePreview>
</nl-NL>
<pl>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Kopiuj</Editor_Copy>
<Editor_SelectAll>Zaznacz wszystko</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Otwórz ponownie jako podgląd HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Otwórz ponownie jako podgląd obrazu</MW_ReopenAsImagePreview>
</pl>
<pt-BR>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Copiar</Editor_Copy>
<Editor_SelectAll>Selecionar tudo</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Reabrir como visualização HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Reabrir como visualização de imagem</MW_ReopenAsImagePreview>
</pt-BR>
<pt-PT>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Copiar</Editor_Copy>
<Editor_SelectAll>Selecionar tudo</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Reabrir como pré-visualização HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Reabrir como pré-visualização de imagem</MW_ReopenAsImagePreview>
</pt-PT>
<ru-RU>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Копировать</Editor_Copy>
<Editor_SelectAll>Выделить всё</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Переоткрыть как предварительный просмотр HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Переоткрыть как предварительный просмотр изображения</MW_ReopenAsImagePreview>
</ru-RU>
<tr-TR>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Kopyala</Editor_Copy>
<Editor_SelectAll>Tümünü seç</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>HTML önizlemesi olarak yeniden aç</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Resim önizlemesi olarak yeniden aç</MW_ReopenAsImagePreview>
</tr-TR>
<uk-UA>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Копіювати</Editor_Copy>
<Editor_SelectAll>Виділити Все</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Перевідкрити як попередній перегляд HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Перевідкрити як попередній перегляд зображення</MW_ReopenAsImagePreview>
</uk-UA>
<vi>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Sao chép</Editor_Copy>
<Editor_SelectAll>Chọn tất cả</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Mở lại dưới dạng xem trước HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Mở lại dưới dạng xem trước hình ảnh</MW_ReopenAsImagePreview>
</vi>
<zh-CN>
<Editor_FontFamily>Consolas,Microsoft Yahei UI,Microsoft Yahei,SimSun</Editor_FontFamily>
<Editor_Copy>复制</Editor_Copy>
<Editor_SelectAll>全选</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>重新作为 HTML 预览打开</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>重新作为图像预览打开</MW_ReopenAsImagePreview>
</zh-CN>
<zh-TW>
<Editor_FontFamily>Consolas,Microsoft JhengHei UI,Microsoft JhengHei,MingLiU</Editor_FontFamily>
<Editor_Copy>複製</Editor_Copy>
<Editor_SelectAll>全選</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>重新作為 HTML 預覽開啟</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>重新作為圖像預覽開啟</MW_ReopenAsImagePreview>
</zh-TW>
<mr>
<Editor_FontFamily>Consolas,Mangal,Nirmala UI</Editor_FontFamily>
<Editor_Copy>प्रतिलिपी करा</Editor_Copy>
<Editor_SelectAll>सर्व निवडा</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>HTML पूर्वावलोकन म्हणून पुन्हा उघडा</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>प्रतिमा पूर्वावलोकन म्हणून पुन्हा उघडा</MW_ReopenAsImagePreview>
</mr>
<hi>
<Editor_FontFamily>Consolas,Mangal,Nirmala UI</Editor_FontFamily>
<Editor_Copy>कॉपी करें</Editor_Copy>
<Editor_SelectAll>सभी चुनें</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>HTML पूर्वावलोकन के रूप में फिर से खोलें</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>छवि पूर्वावलोकन के रूप में फिर से खोलें</MW_ReopenAsImagePreview>
</hi>
<he>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>העתק</Editor_Copy>
<Editor_SelectAll>בחר הכל</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>פתח מחדש כתצוגה מקדימה של HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>פתח מחדש כתצוגה מקדימה של תמונה</MW_ReopenAsImagePreview>
</he>
<hu-HU>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Másolás</Editor_Copy>
<Editor_SelectAll>Mindet kijelöl</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Újranyitás HTML előnézetként</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Újranyitás kép előnézetként</MW_ReopenAsImagePreview>
</hu-HU>
<id-ID>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Salin</Editor_Copy>
<Editor_SelectAll>Pilih Semua</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Buka ulang sebagai pratinjau HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Buka ulang sebagai pratinjau gambar</MW_ReopenAsImagePreview>
</id-ID>
<sk>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Kopírovať</Editor_Copy>
<Editor_SelectAll>Označiť všetko</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Znova otvoriť ako HTML náhľad</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Znova otvoriť ako náhľad obrázka</MW_ReopenAsImagePreview>
</sk>
<el>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Aντιγραφή</Editor_Copy>
<Editor_SelectAll>Επιλογή όλων</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Επανανοίξτε ως προεπισκόπηση HTML</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Επανανοίξτε ως προεπισκόπηση εικόνας</MW_ReopenAsImagePreview>
</el>
<sv>
<Editor_FontFamily>Consolas</Editor_FontFamily>
<Editor_Copy>Kopiera</Editor_Copy>
<Editor_SelectAll>Markera allt</Editor_SelectAll>
<MW_ReopenAsHtmlPreview>Öppna på nytt som HTML-förhandsgranskning</MW_ReopenAsHtmlPreview>
<MW_ReopenAsImagePreview>Öppna på nytt som bildförhandsgranskning</MW_ReopenAsImagePreview>
</sv>
</Translations>

View File

@@ -19,6 +19,7 @@ using Melanchall.DryWetMidi.Core;
using Melanchall.DryWetMidi.Interaction;
using Melanchall.DryWetMidi.Multimedia;
using QuickLook.Common.Annotations;
using QuickLook.Common.Controls;
using QuickLook.Common.Plugin;
using System;
using System.ComponentModel;
@@ -208,14 +209,4 @@ internal class MidiPlayer : IDisposable, INotifyPropertyChanged
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
/// <summary>
/// Segoe Fluent Icons
/// https://learn.microsoft.com/en-us/windows/apps/design/style/segoe-fluent-icons-font
/// </summary>
private sealed class FontSymbols
{
public const string Play = "\xe768";
public const string Pause = "\xe769";
}
}

View File

@@ -15,6 +15,7 @@
// 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.Controls;
using System;
using System.Globalization;
using System.Windows;
@@ -49,7 +50,7 @@ public sealed class TimeTickToShortStringConverter : DependencyObject, IValueCon
public sealed class VolumeToIconConverter : DependencyObject, IValueConverter
{
private static readonly string[] Volumes = ["\xE74F", "\xE993", "\xE994", "\xE995"];
private static readonly string[] Volumes = [FontSymbols.Mute, FontSymbols.Volume1, FontSymbols.Volume2, FontSymbols.Volume3];
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{

71
QuickLook.slnx Normal file
View File

@@ -0,0 +1,71 @@
<Solution>
<Configurations>
<Platform Name="Any CPU" />
<Platform Name="x64" />
</Configurations>
<Folder Name="/QuickLook.Native/">
<Project Path="QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj" Id="d31ee321-c2b0-4984-b749-736f7de509f1">
<Platform Project="Win32" />
</Project>
<Project Path="QuickLook.Native/QuickLook.Native64/QuickLook.Native64.vcxproj" Id="794e4dcf-f715-4836-9d30-abd296586d23" />
</Folder>
<Folder Name="/QuickLook.Plugin/">
<Project Path="QuickLook.Plugin/QuickLook.Plugin.AppViewer/QuickLook.Plugin.AppViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.ArchiveViewer/QuickLook.Plugin.ArchiveViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.CLSIDViewer/QuickLook.Plugin.CLSIDViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.CsvViewer/QuickLook.Plugin.CsvViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.ELFViewer/QuickLook.Plugin.ELFViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.FontViewer/QuickLook.Plugin.FontViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.HelixViewer/QuickLook.Plugin.HelixViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.HtmlViewer/QuickLook.Plugin.HtmlViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.ImageViewer/QuickLook.Plugin.ImageViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.MailViewer/QuickLook.Plugin.MailViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.MarkdownViewer/QuickLook.Plugin.MarkdownViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.MediaInfoViewer/QuickLook.Plugin.MediaInfoViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.OfficeViewer/QuickLook.Plugin.OfficeViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.PDFViewer/QuickLook.Plugin.PdfViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.PEViewer/QuickLook.Plugin.PEViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.PluginInstaller/QuickLook.Plugin.PluginInstaller.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.TextViewer/QuickLook.Plugin.TextViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.ThumbnailViewer/QuickLook.Plugin.ThumbnailViewer.csproj" />
<Project Path="QuickLook.Plugin/QuickLook.Plugin.VideoViewer/QuickLook.Plugin.VideoViewer.csproj" />
</Folder>
<Folder Name="/Solution Items/">
<File Path="GitVersion.cs" />
</Folder>
<Project Path="QuickLook.Common/QuickLook.Common.csproj">
<Platform Solution="*|x64" Project="x64" />
</Project>
<Project Path="QuickLook.Installer/QuickLook.Installer.wixproj" Id="f0214fc2-efbe-426c-842d-b42bc37d9525">
<BuildDependency Project="QuickLook.Common/QuickLook.Common.csproj" />
<BuildDependency Project="QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj" />
<BuildDependency Project="QuickLook.Native/QuickLook.Native64/QuickLook.Native64.vcxproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.AppViewer/QuickLook.Plugin.AppViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.ArchiveViewer/QuickLook.Plugin.ArchiveViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.CLSIDViewer/QuickLook.Plugin.CLSIDViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.CsvViewer/QuickLook.Plugin.CsvViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.ELFViewer/QuickLook.Plugin.ELFViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.FontViewer/QuickLook.Plugin.FontViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.HelixViewer/QuickLook.Plugin.HelixViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.HtmlViewer/QuickLook.Plugin.HtmlViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.ImageViewer/QuickLook.Plugin.ImageViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.MailViewer/QuickLook.Plugin.MailViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.MarkdownViewer/QuickLook.Plugin.MarkdownViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.MediaInfoViewer/QuickLook.Plugin.MediaInfoViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.OfficeViewer/QuickLook.Plugin.OfficeViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.PDFViewer/QuickLook.Plugin.PdfViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.PEViewer/QuickLook.Plugin.PEViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.PluginInstaller/QuickLook.Plugin.PluginInstaller.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.TextViewer/QuickLook.Plugin.TextViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.ThumbnailViewer/QuickLook.Plugin.ThumbnailViewer.csproj" />
<BuildDependency Project="QuickLook.Plugin/QuickLook.Plugin.VideoViewer/QuickLook.Plugin.VideoViewer.csproj" />
<BuildDependency Project="QuickLook/QuickLook.csproj" />
<Platform Project="x86" />
<Build />
</Project>
<Project Path="QuickLook/QuickLook.csproj">
<BuildDependency Project="QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj" />
<BuildDependency Project="QuickLook.Native/QuickLook.Native64/QuickLook.Native64.vcxproj" />
<Platform Solution="*|x64" Project="x64" />
</Project>
</Solution>

View File

@@ -201,27 +201,6 @@ public partial class ViewerWindow
return;
}
// Initial the more menu
ClearMoreMenuUnpin();
foreach (var plugin in PluginManager.GetInstance().LoadedPlugins)
{
if (plugin == Plugin)
{
if (Plugin is IMoreMenu moreMenu && moreMenu.MenuItems is not null)
{
InsertMoreMenu(moreMenu.MenuItems);
}
continue;
}
else
{
if (plugin is IMoreMenuExtended moreMenu && moreMenu.MenuItems is not null)
{
InsertMoreMenu(moreMenu.MenuItems);
}
}
}
SetOpenWithButtonAndPath();
// Revert UI changes
@@ -260,18 +239,41 @@ public partial class ViewerWindow
}
// Load plugin, do not block UI
Dispatcher.BeginInvoke(new Action(() =>
Dispatcher.BeginInvoke(() =>
{
try
{
Plugin.View(path, ContextObject);
// Initial the more menu
ClearMoreMenuUnpin();
foreach (var plugin in
PluginManager.GetInstance().LoadedPlugins
.GroupBy(x => x.ToString()).Select(g => g.First()) // DistinctBy plugin name
.OrderBy(p => p.Priority)) // OrderBy plugin priority
{
if (plugin.ToString() == Plugin.ToString())
{
if (Plugin is IMoreMenu moreMenu && moreMenu.MenuItems is not null)
{
InsertMoreMenu(moreMenu.MenuItems);
}
continue;
}
else
{
if (plugin is IMoreMenuExtended moreMenu && moreMenu.MenuItems is not null)
{
InsertMoreMenu(moreMenu.MenuItems);
}
}
}
}
catch (Exception e)
{
exceptionHandler(path, ExceptionDispatchInfo.Capture(e));
}
}),
DispatcherPriority.Input);
}, DispatcherPriority.Input);
}
private void ClearMoreMenuUnpin()

View File

@@ -23,6 +23,8 @@ using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Input;
using Wpf.Ui.Appearance;
using Wpf.Ui.Violeta.Appearance;
namespace QuickLook;
@@ -105,14 +107,24 @@ public partial class ViewerWindow : INotifyPropertyChanged
if (isDark)
{
CurrentTheme = Themes.Dark;
// Update theme for QuickLook controls
if (!Resources.MergedDictionaries.Contains(_darkDict))
Resources.MergedDictionaries.Add(_darkDict);
// Update theme for WPF-UI controls
ThemeManager.Apply(ApplicationTheme.Dark);
}
else
{
CurrentTheme = Themes.Light;
// Update theme for QuickLook controls
if (Resources.MergedDictionaries.Contains(_darkDict))
Resources.MergedDictionaries.Remove(_darkDict);
// Update theme for WPF-UI controls
ThemeManager.Apply(ApplicationTheme.Light);
}
}
}

View File

@@ -61,6 +61,8 @@ Get it from one of the following sources:
- <kbd>Mouse Wheel</kbd> Zoom in/out (images)
- <kbd>Ctrl</kbd>+<kbd>Mouse Wheel</kbd> Zoom in/out (PDFs)
- <kbd>Wheel</kbd> Increase/decrease volume
- <kbd>Left Mouse</kbd> Rotate (3D models)
- <kbd>Middle Mouse</kbd> Pan (3D models)
## Plugins

View File

@@ -0,0 +1 @@
.