Compare commits

...

251 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
4742908983 Add power management event handling to prevent sleep/wake crashes
Co-authored-by: emako <24737061+emako@users.noreply.github.com>
2025-07-23 13:48:34 +00:00
copilot-swe-agent[bot]
ccbe1c297a Initial plan 2025-07-23 13:40:25 +00:00
VenusGirl❤
a4d118e11f Update Korean (#1710)
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-23 15:07:39 +08:00
ema
79b002c0b3 Unified changelog style
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-20 23:00:53 +08:00
ema
b26575581a Update changelog for 4.1.1 release 2025-07-20 22:55:20 +08:00
ema
8c95a42a64 Refactor tray icon to use TrayIconHost 2025-07-20 21:54:32 +08:00
ema
55a069046f Refactor HelixViewer extend format support
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-12 03:47:49 +08:00
ema
0714574374 Improve file extension checks in CanHandle methods 2025-07-12 03:39:37 +08:00
ema
10ce29e836 Refactor JSON detection to use Regex field
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-10 07:38:21 +08:00
ema
8d66dfac54 Add hosts file syntax highlighting 2025-07-10 07:33:57 +08:00
ema
d06abf461e Enable Dockerfile detection 2025-07-10 07:10:48 +08:00
ema
4c4375612e Add configuration syntax highlighting
File extension: .conf;.config;.cfg
2025-07-10 07:01:15 +08:00
ema
8dcb09cf84 Add syntax highlighting for .env files 2025-07-10 06:46:54 +08:00
ema
b27ff01eff Add syntax highlighting for .gitattributes files 2025-07-10 06:29:42 +08:00
ema
befdb17718 Remove unused settings from GitIgnore 2025-07-10 06:26:57 +08:00
ema
d60b10a8cf Refactor thumbnail extraction 2025-07-10 06:16:10 +08:00
ema
2ee54695e7 Set RichTextBox background to transparent 2025-07-10 05:37:58 +08:00
ema
4a72e1ed8e Optimize file name comparison in detectors 2025-07-10 04:11:00 +08:00
ema
0bb6e622f6 Refactor confused format detection method names
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-09 04:27:50 +08:00
ema
345b061a8d Add dark mode CMake syntax highlighting 2025-07-09 04:20:18 +08:00
ema
67dc0ce10d Add CMake syntax highlighting and format detection 2025-07-09 04:16:19 +08:00
ema
631fd91219 Prepare hosts format detector 2025-07-09 03:55:45 +08:00
ema
cf6dd5cdf3 Prepare Dockerfile format detector 2025-07-09 03:50:50 +08:00
ema
7a11127b09 Prepare CMakeLists.txt format detector 2025-07-09 03:47:10 +08:00
ema
e035153642 Add .editorconfig to INI syntax highlighting 2025-07-09 03:37:55 +08:00
ema
78b695a170 Improve fallback logic for highlighting themes 2025-07-09 03:34:14 +08:00
ema
ed4169d6fe Add light mode Makefile syntax highlighting 2025-07-09 03:29:16 +08:00
ema
0a79d59c79 Add MakefileDetector for text viewer 2025-07-09 03:24:42 +08:00
ema
d6cc984267 Optimize JSONDetector with Span 2025-07-09 03:03:56 +08:00
ema
484acddba3 Add reStructuredText syntax highlighting
Just a simple highlighting solution for `.rst` files
2025-07-09 00:12:52 +08:00
ema
18634f15be Add Markdown syntax highlighting
Add from https://github.com/cuiliang/AvalonEditHighlightingThemes
2025-07-09 00:04:44 +08:00
ema
5869cc6670 Add FBX model support using AssimpNet #1479 2025-07-08 23:46:37 +08:00
ema
09a3cc3ea5 Add dark mode and unify naming for .sln syntax 2025-07-08 23:18:55 +08:00
ema
f9586be3ec Add Sketch file support to ThumbnailViewer plugin 2025-07-08 22:57:02 +08:00
ema
a6c077fbbb Add Pixso (.pip, .pix) support to ThumbnailViewer
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-08 22:28:08 +08:00
ema
c47d9f3c9b Move resource dictionary initialization 2025-07-08 22:04:34 +08:00
ema
06d9ed2a85 Add Protobuf syntax highlighting
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-08 04:44:35 +08:00
ema
37ed56ff34 Keep svga.proto 2025-07-08 04:17:07 +08:00
ema
87e04dca9d Improve the rendering effect of the Model 2025-07-08 04:06:05 +08:00
ema
3fd444102d Revert Add Sandbox detection 2025-07-08 03:42:39 +08:00
ema
b5773fc721 Add built-in HelixViewer for 3d models
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-05 13:26:51 +08:00
ema
32ce27e447 Add MathJax inline math support to Markdown #1640
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-05 11:58:41 +08:00
ema
95f1c5bca2 Remove System.Text.Json dependency 2025-07-05 11:30:22 +08:00
ema
f6ca3a62e2 Add support for svgaplayerweb in SVGA viewer 2025-07-05 11:24:02 +08:00
ema
efba55b8d5 Implement SVGA MetaProvider 2025-07-05 10:21:15 +08:00
ema
4c3bf23e67 Use lottie-web and svga instead of npmjs 2025-07-05 09:50:54 +08:00
ema
007b960019 Rename SvgViewer.init to render and update usage 2025-07-05 09:33:46 +08:00
ema
a14b22d762 Update comments for LottieViewer and clarify usage 2025-07-05 09:28:12 +08:00
ema
3fce8b4f53 Add Lottie Files animation preview support 2025-07-05 09:25:22 +08:00
ema
5e459e35e5 Add comment clarifying SVGA version support 2025-07-05 06:55:48 +08:00
ema
b3570d1215 Handle .svga files separately in image viewer 2025-07-05 06:55:38 +08:00
ema
eecb56db14 Add SVGA animation preview support 2025-07-05 06:46:52 +08:00
ema
3858e142e2 Fix packaging target to run only in Release builds 2025-07-05 05:08:31 +08:00
ema
d7f482511f Update package versions in plugin projects 2025-07-05 05:07:26 +08:00
ema
9cca8c3c0b Add GPL license header to Helper.cs 2025-07-05 05:03:05 +08:00
ema
22e8838ce3 Add support for .kra and .cdr previews #1662 2025-07-05 04:58:24 +08:00
ema
63f516b504 Add Figma & XMind support to ThumbnailViewer #1662 2025-07-05 04:39:18 +08:00
ema
08587186c2 Fix ImagePanel button layout 2025-07-05 04:28:32 +08:00
ema
f99a786510 Add built-in ThumbnailViewer plugin 2025-07-05 04:22:25 +08:00
ema
3de93386cc Add NSIS syntax highlighting
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-05 03:31:33 +08:00
ema
b42b7ce4e8 Add syntax highlighting for SubRip Subtitle (.srt) files 2025-07-05 03:20:56 +08:00
ema
89571b1431 Add Swift dark mode syntax highlighting 2025-07-05 03:00:55 +08:00
ema
a7e26519ed Add Dart dark mode syntax highlighting 2025-07-05 02:59:08 +08:00
ema
c1e6362440 Add Erlang dark mode syntax highlighting 2025-07-05 02:57:12 +08:00
ema
25f7df52bd Add Kotlin dark mode syntax highlighting 2025-07-05 02:56:16 +08:00
ema
04247db107 Add Lisp dark mode syntax highlighting 2025-07-05 02:53:24 +08:00
ema
7456cbc3a5 Add Objective-C dark mode highlighting 2025-07-05 02:52:17 +08:00
ema
99caca2dfd Add dark mode Pascal syntax highlighting 2025-07-05 02:50:21 +08:00
ema
dc2d722f0a Add dark mode PHP syntax highlighting 2025-07-05 02:47:22 +08:00
ema
267b37c526 Improve QuickLook initialization speed 2025-07-05 02:46:00 +08:00
ema
913474f7ad Add dark mode R syntax highlighting 2025-07-05 02:41:58 +08:00
ema
c979ed0254 Add dark mode Ruby syntax highlighting 2025-07-05 02:40:08 +08:00
ema
71904ebac5 Add dark mode SQL syntax highlighting 2025-07-05 02:37:45 +08:00
ema
a8746dd3ef Add dark mode Rust syntax highlighting 2025-07-05 02:37:01 +08:00
ema
93be5681d3 Add dark mode Java syntax highlighting 2025-07-05 02:32:18 +08:00
ema
2fd3a15071 Add dark mode C++ syntax highlighting 2025-07-05 02:26:57 +08:00
ema
6e9d86457c Add dark mode C syntax highlighting 2025-07-05 02:24:12 +08:00
ema
1df89d69a9 Add dark mode syntax highlighting for Registry 2025-07-05 02:13:09 +08:00
ema
8850f52f3a Add simple QML syntax highlighting #1002 2025-07-05 02:10:10 +08:00
ema
cb4aa2e9d9 Add PowerShell syntax highlighting for dark mode 2025-07-05 01:52:09 +08:00
ema
db3af0580d Add .gitignore syntax highlighting 2025-07-05 01:44:44 +08:00
ema
469f955208 Add .dotsettings to XML syntax highlighting 2025-07-05 01:40:04 +08:00
ema
ea077af8a2 Add .gitmodules to INI syntax highlighting 2025-07-05 01:39:42 +08:00
ema
33030780ff Create CHANGELOG.md
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-04 04:18:11 +08:00
ema
9319ca7213 Bump WPF-UI.Violeta package to version 4.0.3
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-04 01:50:15 +08:00
ema
b1a2387203 Add dark mode Lua syntax highlighting
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-01 05:04:51 +08:00
ema
12a6b35c6c Remove boolean value type from ASS highlighting 2025-07-01 04:46:39 +08:00
ema
1f13aa6678 Fix PDF thumbnail rendering crash #1531 2025-07-01 04:30:08 +08:00
ema
72c8e567cd Increase SVG viewer max zoom level to 100x 2025-07-01 03:40:30 +08:00
ema
fe13f5d45e Remove cursor style changes during SVG panning 2025-07-01 03:38:34 +08:00
ema
e76c882d49 Prevent dragdrop and context menu in SVG viewer 2025-07-01 03:36:10 +08:00
ema
667815e360 Conditionally include Svg.Skia and SVG provider 2025-07-01 03:27:22 +08:00
ema
13bcc4b1d4 Set custom WebView2 user data folder for SVG panel 2025-07-01 03:23:47 +08:00
ema
fa61b1e68f Code Cleanup 2025-07-01 03:18:48 +08:00
ema
2750cb75dd Fix exception from SVG WebView2 2025-07-01 03:10:33 +08:00
ema
f1237aa86f Add JSDoc comments and clarify SvgViewer usage 2025-07-01 02:23:38 +08:00
ema
2a94fa155d Enhance SVG viewer with pan feature 2025-07-01 02:11:31 +08:00
ema
682801a8bb Refactor SVG viewer to use inline SVG
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-01 01:57:36 +08:00
ema
f9b075dfa3 Add pan and zoom support to SVG image viewer
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-30 07:32:46 +08:00
ema
0a8039d962 Render SVG as base64 image and improve scaling 2025-06-30 07:22:03 +08:00
ema
0dc8c03446 Fix image viewer content assignment and cursor check 2025-06-30 06:48:32 +08:00
ema
9cef4d9830 Officially enable SVG web viewer 2025-06-30 06:38:52 +08:00
ema
e9306329ee Add double-click to reset zoom in SVG viewer 2025-06-30 06:07:09 +08:00
ema
7ca7d2783e Beautify the background color of Svg Web2 2025-06-30 06:00:29 +08:00
ema
98dd96283d Add SVG support using WebView2 in ImageViewer
It's still an experimental function
2025-06-30 05:45:21 +08:00
ema
21071a62d1 Update package dependencies 2025-06-30 02:02:53 +08:00
ema
a65a453390 Support JXR image but SDR only #1680 2025-06-30 01:49:43 +08:00
ema
856f7f137c Add light mode highlighting for SubStation Alpha 2025-06-30 01:23:07 +08:00
ema
3878dd0049 Add dark mode highlighting for SubStation Alpha 2025-06-30 01:10:04 +08:00
ema
9a04232e84 Add .toml extension to INI syntax highlighting
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-29 21:38:53 +08:00
ema
ff25bedcae Add .vsix support to archive viewer
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-29 10:40:31 +08:00
ema
7ca15b5e1e Add dark mode highlighting for VB.NET and VBScript 2025-06-29 10:21:32 +08:00
ema
b2a7b22f20 Add TypeScript dark mode highlighting 2025-06-29 10:14:13 +08:00
ema
ae7633e1e7 Add dark mode syntax highlighting for INI files 2025-06-29 10:11:11 +08:00
ema
ebb90d5586 Add dark mode F# highlighting 2025-06-29 10:07:25 +08:00
ema
ac7a08cbf3 Add YAML syntax highlighting 2025-06-29 09:56:18 +08:00
ema
e16a89f979 Refactor properties highlighting for consistency and clarity 2025-06-29 09:04:25 +08:00
ema
9a17d5fa0f Skip empty lines in properties highlighting 2025-06-29 06:49:22 +08:00
ema
caf301f3f5 Refactor property key highlighting logic
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-29 06:36:05 +08:00
ema
9d42da53c0 Support .fx with HLSL 2025-06-29 05:34:47 +08:00
ema
1632b207db Fix .apk extension handling 2025-06-29 05:34:20 +08:00
ema
3ec576968e Update package and remove binding redirect 2025-06-29 05:17:56 +08:00
ema
84222e3188 Add dark mode syntax highlighting for Go
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-28 01:00:49 +08:00
ema
6b7fc303e0 Add dark mode CSS syntax highlighting 2025-06-28 00:55:23 +08:00
ema
e113030dce Skip primary for comment lines in properties files
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-27 22:49:28 +08:00
ema
12046220c1 Add support for Android App Bundle (.aab) files
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-27 07:30:10 +08:00
ema
6943ed5cb4 Read ABIs from QuickLook.ApkReader 2.1.0 2025-06-27 07:20:55 +08:00
ema
4ff7cd53c4 Add Alt+Z shortcut to toggle word wrap #1487
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
Introduced a keyboard shortcut (Alt+Z) to toggle the WordWrap property in the TextViewerPanel for improved usability.
2025-06-27 07:03:11 +08:00
ema
a7c89d7e69 Add keyboard shortcuts for text direction #1612
Implemented Ctrl+LShift and Ctrl+RShift shortcuts to switch text flow direction between LTR and RTL in TextViewerPanel
2025-06-27 06:56:43 +08:00
ema
32e45da1d6 Use verbatim string literals for MediaInfo path 2025-06-27 03:34:27 +08:00
ema
6ad73eddea Add option IsSupportRTL to control the RTL #1612 2025-06-27 03:33:35 +08:00
ema
a796cdbdf0 Support RTL for .txt file #1612 2025-06-27 03:28:08 +08:00
ema
1db667e32f Add .vpy extension to Python syntax highlighting 2025-06-27 03:15:11 +08:00
ema
d858840183 Enable window dragging in video viewer panel #425 2025-06-27 02:38:17 +08:00
ema
aef35d748e Fix apk icon can not be found from resource id 2025-06-27 02:12:49 +08:00
ema
2bf6387b8f Support X11 and more JPEG2000 image formats
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
In addition, Magick Image File Format (.miff) is supported now
2025-06-25 02:44:14 +08:00
ema
b96619c244 Fix Android API level mapping name 2025-06-25 02:22:29 +08:00
ema
3fff4c1b2b Add Android API level mapping and improve APK info 2025-06-25 02:17:12 +08:00
ema
f3c08d5b76 Display supported ABIs in APK info panel 2025-06-25 01:58:32 +08:00
ema
1c1f6d55e7 No web font resource extraction
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
Fix WebView2 resources not being released in FontViewer
2025-06-24 02:05:04 +08:00
ema
2c330a0136 Chore of disable nullable in MarkdownViewer 2025-06-24 01:45:52 +08:00
ema
83ae611af1 No markdown resource extraction #1661 #1670 2025-06-24 01:33:07 +08:00
ema
741d9967d1 Support highlighting .uts
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-23 16:38:35 +08:00
ema
01f92b0b3a Revise the hint of UCEERR_RENDERTHREADFAILURE
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-23 10:44:20 +08:00
ema
c959e649a0 Try catch DMG exception
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-23 02:35:02 +08:00
ema
869a134587 Support highlighting .nvue 2025-06-23 02:10:40 +08:00
ema
75841d241f Support highlighting .vue 2025-06-23 02:07:49 +08:00
ema
273b2fc893 Support dark mode JavaScript 2025-06-23 01:54:45 +08:00
ema
e5b45a7c01 Support dark mode Python #1675 2025-06-23 01:46:33 +08:00
ema
4d3d216d78 Support dark mode Log
https://github.com/Dirkster99/AvalonEditHighlightingThemes/blob/master/source/HL/Resources/Themes/VS2019_Dark.xshtd
2025-06-23 01:43:30 +08:00
ema
879ec689a9 Support highlighting .dos 2025-06-23 01:41:31 +08:00
ema
a4d2aea98d Support light mode Log
https://github.com/Dirkster99/AvalonEditHighlightingThemes/blob/master/source/HL/Resources/Light/Log.xshd
2025-06-23 01:39:23 +08:00
ema
68b0a928b6 Support light mode Lyric 2025-06-23 01:26:09 +08:00
ema
8d9c1e3f6e Add Sandbox detection 2025-06-23 00:58:28 +08:00
ema
b3ed13f16a Initial custom highlighting via reflection 2025-06-22 23:53:01 +08:00
ema
e86716fc54 Support .properties 2025-06-22 23:31:59 +08:00
ema
cf0c8529a0 Support dark mode TXT #1675 2025-06-22 21:53:49 +08:00
ema
ce5adc6801 Support dark mode XML 2025-06-22 21:36:11 +08:00
ema
44ba8b1436 Support dark mode HLSL 2025-06-22 21:29:17 +08:00
ema
0168318f39 Improve PDF magic detection 2025-06-22 21:12:35 +08:00
ema
f0d55455e4 Add built-in ELF viewer plugin
Support for binary ELF, UImage, Mach-O files
2025-06-22 20:47:29 +08:00
ema
17091056de Use english as default resource culture
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
74ae24cf44
2025-06-22 04:40:56 +08:00
ema
a60fafdd38 Support .rpm 2025-06-22 04:12:46 +08:00
ema
54031a166a Update issue template
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-20 19:38:40 +08:00
ema
efc83b0669 Use format detector feature for TextViewer
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-19 17:03:20 +08:00
ema
a580926059 Add more file extensions for XML
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-19 11:08:26 +08:00
ema
21af7ad7ff Prepare support .rpm
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-18 00:54:30 +08:00
ema
01faaa7ce0 Support .AppImage 2025-06-17 23:35:15 +08:00
ema
533e097a0c Fix spell
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-16 09:57:03 +08:00
ema
c9fa5ff43b Support .dmg
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-15 07:04:00 +08:00
ema
679b00fe71 Revert the DataGrid style of CSV #1664
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-14 16:28:24 +08:00
ema
04c7ed931f New option CheckPreviewHandler
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-14 12:54:54 +08:00
ema
781f270824 Fix unsupported ColorContexts in Windows #1671 2025-06-14 12:15:13 +08:00
ema
5aa0cf06a8 New option ProcessRenderMode
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-12 16:24:10 +08:00
ema
7eabaff36a Resort the codes of office extensions 2025-06-12 15:34:26 +08:00
ema
f897ce46ea Show office exception instead of crash 2025-06-12 15:31:28 +08:00
ema
e2e5885fd5 Automatically fix Office preview handler registry
This function requires QuickLook to run with administrator privileges and preview the corresponding Office file once
2025-06-12 15:25:18 +08:00
ema
9a3591e6f6 Safely check office preview handler
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-11 18:12:31 +08:00
ema
5fd2d8a88a Merge OfficeViewer-Native plugin #1662
Repo URL: https://github.com/QL-Win/QuickLook.Plugin.OfficeViewer-Native
2025-06-11 17:58:07 +08:00
ema
4fd8c14b98 Supplement AutoReload features
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-10 11:40:20 +08:00
ema
1b3d2e518d Merge pull request #1666 from JSuttHoops/jsutt
Add Reload + Customization
2025-06-10 10:45:35 +08:00
ema
c686c373ba Fix generic theme resources #1652
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-09 11:44:03 +08:00
JSuttHoops
555b801fe6 Merge pull request #1 from JSuttHoops/codex/add-reload-button-with-preserved-window-properties
Summary

Introduced a new “Reload” button in the viewer window toolbar for quickly refreshing the current preview without closing the window

Added the “MW_Reload” string to the translations so the Reload button text can be localized

Implemented a ReloadPreview method in ViewWindowManager to refresh the plugin content in-place

Hooked the Reload button and added optional file monitoring for auto-reload in ViewerWindow code-behind

Allowed custom window background colors via the WindowBackgroundColor setting
2025-06-07 19:12:40 -05:00
JSuttHoops
2624989a75 Add reload feature and customizable background 2025-06-07 19:12:14 -05:00
ema
220ab789a5 Remove x86 from sln
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-07 00:47:02 +08:00
ema
9f20a6d646 Remove appx from sln 2025-06-07 00:34:23 +08:00
ema
a9d4fb1a9b Add appx debug project 2025-06-06 23:54:31 +08:00
ema
500a78f7ec Merge pull request #1663 from King3R/translation-german
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
Update existing and add missing German translation
2025-06-06 18:07:16 +08:00
King3R
c1e4f32bb3 Update QuickLook/Translations.config 2025-06-06 10:01:32 +02:00
King3R
bbed9223ef Update QuickLook.Plugin.PEViewer/Translations.config 2025-06-06 09:32:18 +02:00
King3R
d190980e12 Update QuickLook.Plugin.PDFViewer/Translations.config 2025-06-06 09:30:51 +02:00
King3R
7b8e89d09e Update QuickLook.Plugin.FontViewer/Translations.config 2025-06-06 09:27:30 +02:00
King3R
e7d3250d2b Update QuickLook.Plugin.AppViewer/Translations.config 2025-06-06 09:24:26 +02:00
ema
a64aeada91 Show deb architecture
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-05 14:57:33 +08:00
ema
b31de49da1 Not support deb with LZMA algorithm 2025-06-05 14:46:19 +08:00
ema
576cb5814d Fix deb reader gz error 2025-06-05 12:02:16 +08:00
ema
5bc7fecdcf Improve App/PE titlebar UI/UX
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-04 17:37:22 +08:00
ema
743079c5bf Update wgt logo 2025-06-04 17:30:35 +08:00
ema
3153f7b279 Revert the exception handling for Show() 2025-06-04 16:59:20 +08:00
ema
efe28423e9 Support .deb 2025-06-04 16:42:38 +08:00
ema
3bd1239457 Restruct AppViewer codes 2025-06-04 15:13:43 +08:00
ema
59124967d2 Attempt to fix the crash #1648
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
This is an experimental fix, the idea is to remove the tree to prevent the DUCE command
2025-06-04 13:53:49 +08:00
ema
376ed30dc5 Improve GroupBox UI/UX 2025-06-04 10:45:41 +08:00
ema
2b38b2c946 Use IsVisible instead of Visibility
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-03 14:54:38 +08:00
ema
05e9f43ba4 Remove the WoW64HookHelper from sln 2025-06-03 14:40:20 +08:00
ema
e5b04ed07a Update PackageReference 2025-06-03 14:39:51 +08:00
ema
cc1e126101 Support .hap and .hap.1
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-03 07:55:06 +08:00
ema
22a5d69ac8 Remove the WoW64HookHelper from release #1634
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
Use https://github.com/QL-Win/QuickLook.Plugin.WoW64HookHelper instead
2025-06-02 18:59:17 +08:00
ema
8b6ab6b037 Fix old version volume exception #1653
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-02 13:17:41 +08:00
ema
d18b33a18e Speed up the apk reader
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-01 14:07:57 +08:00
ema
1a83848c2c Use app fallback logo 2025-06-01 13:32:33 +08:00
ema
fdb602b9ed Support .ipa 2025-06-01 12:37:02 +08:00
ema
00829ec21b Support .apk and .apk.1
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-31 17:30:35 +08:00
ema
53d76cb0f8 Support .wgt and .wgtu 2025-05-31 13:10:34 +08:00
ema
8a5d640572 Support .appx and .msix 2025-05-31 12:16:31 +08:00
ema
833222507b Update font pangram
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-05-29 18:48:24 +08:00
ema
2fb23a94bf Fix CaptionTextButtonStyle not static anymore
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-29 18:00:23 +08:00
ema
ef55a3eaff Update due to MS Store policy change
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
Due to the updated Microsoft Store policy, certain keywords were cleaned.
2025-05-26 22:35:24 +08:00
ema
05c967e582 Manually resolve the assembly fails #1618 2025-05-26 15:49:24 +08:00
ema
645edf2439 Optimize highlight name fetching
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-05-26 09:48:22 +08:00
ema
6deadf9d73 Fix highlighting name
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-26 05:42:27 +08:00
ema
b81b2f9ef8 Improve startup speed #1521
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-25 03:45:17 +08:00
ema
eed0c53e9c Code Cleanup 2025-05-25 03:45:07 +08:00
ema
51a46155d7 Fix unsupported CLSID was not shown 2025-05-25 01:59:31 +08:00
ema
2e8fd2bae7 Code Cleanup 2025-05-25 01:32:38 +08:00
ema
05a2a819b7 Add branding images
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-24 15:05:20 +08:00
ema
86e7803cd7 New AppViewer plugin for .msi 2025-05-24 15:03:54 +08:00
ema
77c332d825 Fix share button was not visible in win11
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-24 13:20:51 +08:00
ema
d20eb71f2b Remove MSI from PEViewer
Actually MSI does not belong to the PE format
2025-05-24 09:21:56 +08:00
ema
1ce2fc2f89 Fix Scripts\pack-all.ps1 2025-05-24 06:00:47 +08:00
ema
c2acdaa182 Avoid audio cover null exception in xaml
Can slightly increase the opening speed of audio file
2025-05-24 05:41:38 +08:00
ema
eff9d795f0 Fix long path issue #1643
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-24 03:51:18 +08:00
ema
27c2257feb Show Repository Trending
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-23 17:25:36 +08:00
ema
9803f5d6a8 Use PureSharpCompress instead of SharpCompress
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-23 03:18:51 +08:00
ema
00ef7d1e01 Improve PE parsing with extended buffer size 2025-05-23 03:03:36 +08:00
ema
06e7dbaae7 Code Cleanup 2025-05-23 02:39:26 +08:00
ema
34f69cc4f4 Add community group link 2025-05-22 11:16:18 +08:00
ema
74e8394b07 Update PackageReference 2025-05-21 11:06:05 +08:00
ema
0370876a3f Support .pcx image #1638 2025-05-20 22:39:27 +08:00
ema
dd322ac7e9 Update exception catcher 2025-05-18 01:40:20 +08:00
ema
6e8c0ce593 Update README.md #1622 2025-05-15 01:56:15 +08:00
ema
75c45f96c2 Fix DPI jump on window close in net462 #1626 2025-05-15 01:33:41 +08:00
ema
f7b22fb600 Avoid flickering #1628 2025-05-14 03:33:45 +08:00
ema
4170dc7a16 Rollback SharpCompress before clear dependencies 2025-05-14 02:41:10 +08:00
ema
47f4106b5d Update README.md #1622 2025-05-14 02:37:21 +08:00
ema
b28fcbb398 Update the build scripts 2025-05-14 02:18:01 +08:00
ema
97f8232767 Fix DpiAwareness for PerMonitor #1626 2025-05-13 22:07:39 +08:00
ema
8fa4f6cc5b Update PackageReferences 2025-05-13 17:36:22 +08:00
ema
ebcb223ef0 Update Title Immediately 2025-05-13 17:24:42 +08:00
ema
90b23cd1f8 Hide PEViewer Title just like InfoPanel 2025-05-13 17:16:10 +08:00
ema
beca7d06ca Fix flickering #1628 2025-05-13 11:52:23 +08:00
409 changed files with 38303 additions and 2083 deletions

View File

@@ -23,7 +23,7 @@ A clear and concise description of what you expected to happen.
**Desktop (please complete the following information):**
- OS Version: [e.g. Windows 10 1803]
- QuickLook Version: [e.g. 0.3.3 from Windows Store]
- QuickLook Version: [e.g. 4.0.2 from Microsoft Store or from MSI installer]
**Screenshots and Exception Log**
If applicable, add screenshots and logs to help explain your problem. The log file is located in [one of several locations](https://github.com/QL-Win/QuickLook/wiki/Differences-Between-Distributions#user-data-location).

7
.gitignore vendored
View File

@@ -290,8 +290,11 @@ __pycache__/
/QuickLook.Installer/C_QuickLookComponents.wxs
/Build/*
!/Build/Assets
!/Build/AppxManifest.*
!/Build/AppxManifest.xml
!/Build/assetslayout.resfiles
!/Build/priconfig.xml
!/Build/micasetup.json
!/Build/micasetup.cmd
!/Build/openssl-sign.cnf
!/Build/sideload.crt
!/Build/sideload.key
!/Build/sideload.pfx

View File

@@ -1,53 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10">
<Identity Name="21090PaddyXu.QuickLook" Version="0.0.0.0"
Publisher='E=xupaddy@gmail.com, CN="Open Source Developer, Pengfei Xu", O=Open Source Developer, C=FI' />
<Properties>
<DisplayName>QuickLook</DisplayName>
<PublisherDisplayName>Paddy Xu</PublisherDisplayName>
<Description>Bring macOS &#8220;Quick Look&#8221; feature to Windows</Description>
<Logo>Assets\storelogo.png</Logo>
</Properties>
<Resources>
<Resource Language="en-us" />
<Resource uap:Scale="100" />
<Resource uap:Scale="125" />
<Resource uap:Scale="150" />
<Resource uap:Scale="200" />
<Resource uap:Scale="400" />
</Resources>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14316.0" MaxVersionTested="10.0.15063.0" />
</Dependencies>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
<Applications>
<Application Id="Main" Executable="Package\QuickLook.exe" EntryPoint="Windows.FullTrustApplication">
<Extensions>
<desktop:Extension Category="windows.startupTask" Executable="Package\QuickLook.exe"
EntryPoint="Windows.FullTrustApplication">
<desktop:StartupTask TaskId="QuickLookTask" Enabled="true" DisplayName="QuickLook" />
</desktop:Extension>
</Extensions>
<uap:VisualElements DisplayName="QuickLook"
Description="Bring macOS &#8220;Quick Look&#8221; feature to Windows"
BackgroundColor="transparent"
Square150x150Logo="Assets\Square150x150Logo.png"
Square44x44Logo="Assets\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"
Square310x310Logo="Assets\LargeTile.png"
Square71x71Logo="Assets\SmallTile.png">
<uap:ShowNameOnTiles>
<uap:ShowOn Tile="square150x150Logo" />
<uap:ShowOn Tile="wide310x150Logo" />
<uap:ShowOn Tile="square310x310Logo" />
</uap:ShowNameOnTiles>
</uap:DefaultTile>
</uap:VisualElements>
</Application>
</Applications>
</Package>

View File

@@ -3,10 +3,15 @@
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10">
<!-- Invalid package identity name: QL-Win.QuickLook (expected: 21090PaddyXu.QuickLook) -->
<!-- Invalid package family name: QL-Win.QuickLook_wgqddy12gm212 (expected: 21090PaddyXu.QuickLook_egxr34yet59cg) -->
<!-- Invalid package publisher name: CN=F4F538EC-55CB-41B8-9531-25CC140D0339 (expected: CN=CE36AF3D-FF94-43EB-9908-7EC8FD1D29FB) -->
<Identity Name="21090PaddyXu.QuickLook" Version="0.0.0.0" Publisher="CN=CE36AF3D-FF94-43EB-9908-7EC8FD1D29FB" />
<Properties>
<DisplayName>QuickLook</DisplayName>
<PublisherDisplayName>Paddy Xu</PublisherDisplayName>
<!-- We can not set the name to QL-Win, see the following error message -->
<!-- Package acceptance validation error: The PublisherDisplayName element in the app manifest of QuickLook-4.0.1.0.appx is QL-Win, which doesn't match your publisher display name: emako. -->
<PublisherDisplayName>emako</PublisherDisplayName>
<Description>Bring macOS &#8220;Quick Look&#8221; feature to Windows</Description>
<Logo>Assets\storelogo.png</Logo>
</Properties>
@@ -19,7 +24,7 @@
<Resource uap:Scale="400" />
</Resources>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14316.0" MaxVersionTested="10.0.15063.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14316.0" MaxVersionTested="10.0.26100.0" />
</Dependencies>
<Capabilities>
<rescap:Capability Name="runFullTrust" />

BIN
Build/Assets/Branding/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 KiB

BIN
Build/Assets/Branding/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
Build/Assets/Branding/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 970 KiB

BIN
Build/Assets/Branding/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
Build/Assets/Branding/5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

BIN
Build/Assets/Branding/6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

BIN
Build/Assets/Branding/7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

View File

@@ -1,4 +0,0 @@
cd /d %~dp0
@REM 7z a Package.7z .\Package\* -t7z -mx=5 -mf=BCJ2 -r -y
makemica micasetup.json
@pause

13
Build/openssl-sign.cnf Normal file
View File

@@ -0,0 +1,13 @@
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
x509_extensions = v3_req
[dn]
CN = CE36AF3D-FF94-43EB-9908-7EC8FD1D29FB
[v3_req]
keyUsage = critical, digitalSignature
extendedKeyUsage = codeSigning

20
Build/sideload.crt Normal file
View File

@@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDMjCCAhqgAwIBAgIUBIWdItfat0Fw6npbHI2W7HE/0KYwDQYJKoZIhvcNAQEL
BQAwLzEtMCsGA1UEAwwkQ0UzNkFGM0QtRkY5NC00M0VCLTk5MDgtN0VDOEZEMUQy
OUZCMB4XDTI1MDUxMzE3NDgzNVoXDTI4MDUxMjE3NDgzNVowLzEtMCsGA1UEAwwk
Q0UzNkFGM0QtRkY5NC00M0VCLTk5MDgtN0VDOEZEMUQyOUZCMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnAtbhjH01YmWv1U98kMj3epdpuZLE04pGXOR
xfdBb1zX8Q75hy5SmIaHrsow7fTXfHsUzuJEmanllMbJGUpi46fLsb8Ijd4uQgXO
wSDfIXrm34Buzpk6EKwEWmRMyORmfPwy0A+XdTHydDhEXndy1eGPJ1ZZnldVI8Ho
ZF2MW35QBZDjlWZh3RppWNMksvlngrOX4PFfJ+DtOQUvNswbpyqVATMFBk9kShGM
XHuieibzDlzxGNKSn3tDvutLBW5hm7iLqEuAeM7dwSac4C+N5FKWnXJndkN3k8AN
nD0MHlErN1dLoJQqvAaCarZr8RSPhdanVOylMGkt97NLYZrLTQIDAQABo0YwRDAO
BgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwHQYDVR0OBBYEFJEL
e4QaWs4H2djQ6nnnc/30sZ/nMA0GCSqGSIb3DQEBCwUAA4IBAQBYBXkl/vEsGUHI
qogCfb/DxFlsm059sxHAIhaNjuoTlgwzgj6KSPbKsfnYVMHZFqkg4AaTuRs9iqTL
TStM14OjG95gn+7fJ4zxqquEEytk9yb2xj9ZpLAvzZzUrw5qo1lmM7yPRso38l62
9g1G1/MVP6pO03QWKzvSV+IlU3DIP3M2r74G8dexL5/Cut1LkOc/tn2ZYt3Ij95e
RM2vqxzK2pw6IAVG3wdNGAyN9K8BATRuAXFV6RXkeEBHFNV3wpyq4W+H6hpsrMJM
rMZUUqLa8BTUQAsZ1jmL+dRmj2rESeOaOO9jPks4J4c8+v8aJQBmZhvxRyjyMtdL
pWHSCCgm
-----END CERTIFICATE-----

28
Build/sideload.key Normal file
View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCcC1uGMfTViZa/
VT3yQyPd6l2m5ksTTikZc5HF90FvXNfxDvmHLlKYhoeuyjDt9Nd8exTO4kSZqeWU
xskZSmLjp8uxvwiN3i5CBc7BIN8heubfgG7OmToQrARaZEzI5GZ8/DLQD5d1MfJ0
OERed3LV4Y8nVlmeV1UjwehkXYxbflAFkOOVZmHdGmlY0ySy+WeCs5fg8V8n4O05
BS82zBunKpUBMwUGT2RKEYxce6J6JvMOXPEY0pKfe0O+60sFbmGbuIuoS4B4zt3B
JpzgL43kUpadcmd2Q3eTwA2cPQweUSs3V0uglCq8BoJqtmvxFI+F1qdU7KUwaS33
s0thmstNAgMBAAECggEABS51XWPhmt5E5K6Pw4XKNkS207jC68MFJ1oIkE0bsvcf
boWORe2vrW6OKSt/627dYZNJXMNI/tyUNIKooSUwr8QzGysE6DJlUSjrNXYszT+i
VJqUU1o614c2unT+fbnj01OhMPp2OjHXOK0OTCAQQ/IySYlFqYssgbxJxgdl2+XX
rDiSk5PvZ0Z8PUuG7EvNbRAnUmIQDVTd81My0kPk4M0w8Rg2p0sIN5klIDxTzC98
5iUvS+53xch4f8jJOr8s7J/56R+tnIoqfVkIDI3Q4CUhq3s0DAC7GP4vpoynGXn0
pLzHvOttFbqgcHkS2zrVOXKwl4Zym4p+kMCub6BCmwKBgQDcGzCvrMon4fIJrymG
lmGZMeN8acjD0MKDT8JPgHkwXTz61AbOC2EGoOpWNqrYGOCv6xSMPiub1un6Y5X2
KIuAJm+bY+py0Ed+EzZjrFkQpGt6xQ3FY2aFvA5uS3esgcF+OtcUrXEEq0dK9bZ6
HB9P90QuND72bvfx9wjLon0dvwKBgQC1fcRbLpqA2lSGglcRoioA/okMPyMk7jH3
n3IHjnpjsBu1FPrWH8Tqtop4vrEVS1cxM7P7FXWwWPqUH/2XbCk1R3T9ZD+i1kHi
qvSqp4L0dfTk6ibZpywGXRnpQzT5kKJTrSSx9L7Ni00HcvCI1+p4XNdJZm7jNDSy
dGSPg1ox8wKBgB6TaF//ENYZfRX7TzlzCnvNglx2FX2eMmcrXULOBgfB7AasDYXx
7riNAgCX94OtcQj/DwusV0J+yGIQE3TujPJwZHChoJ/ybvwEjzmpZ3X4YTXcydzx
wfwx848+zJEaNVbjtZ0Zuul7IZw4JfEwluj04HPKrjRtleP2/THMkLThAoGBAJYh
BwB2OJBGCo2J3ARWJHDWHP/oamXuM58mYekmTs+PqhvM0wG1HesaPMlM1KdMvz+Q
CV21jrjlocJOBDPx4NSV24yQFKPaoH2j9OgF0SnvOTjzCFgbFSveb8SpN3UJ031s
SGJ8lijpBjsXNSm9kdMm2V96QFfpo33LEjQ077NJAoGARnnvnenmfwlu/5Oq2Ojs
WWzOxXTpiGXLnbUNUvQMvqXxGygCGoA18vVveLr6eKfojM8iKtGF91S9NsUkBEkd
VKOFnc9OQ5dtoBkN6XZBUCmJCzQZS20A3jq9oionsJlIWOgb/X3L1cS2SZ3ocgKS
lCCN2IGaKiGJCPJprpFW7fg=
-----END PRIVATE KEY-----

BIN
Build/sideload.pfx Normal file

Binary file not shown.

112
CHANGELOG.md Normal file
View File

@@ -0,0 +1,112 @@
## 4.1.1
- Add built-in ThumbnailViewer plugin [#1662](https://github.com/QL-Win/QuickLook/issues/1662)
- Add built-in HelixViewer for 3d models [#1662](https://github.com/QL-Win/QuickLook/issues/1662)
- Add FBX model support using AssimpNet [#1479](https://github.com/QL-Win/QuickLook/issues/1479)
- Add `SVGA` and `Lottie Files` animation preview support
- Add MathJax inline math support to Markdown [#1640](https://github.com/QL-Win/QuickLook/issues/1640)
- Add `SubRip Subtitle (.srt) files`, `Protobuf`, `NSIS`, `.gitmodules`, `.dotsettings`, `.gitignore`, `.gitattributes`, `Markdown`, `reStructuredText`, `simple QML syntax`, `.env`, `Configuration (.conf;.config;.cfg)` highlighting [#1002](https://github.com/QL-Win/QuickLook/issues/1002)
- Add dark mode highlighting for `PowerShell`, `Registry`, `C`, `C++`, `Java`, `Rust`, `SQL`, `Ruby`, `R`, `PHP`, `Pascal`, `Objective-C`, `Lisp`, `Kotlin`, `Erlang`, `Dart`, `Swift`, `VisualSolution`, `CMake`
- Add `MakefileDetector`, `CMakeListsDetector for CMakeLists.txt`, `DockerfileDetector`, `HostsDetector for hosts` for text viewer
- Improve QuickLook initialization speed
- Optimize JSONDetector with Span
- Set RichTextBox background to transparent
- Revert Add Sandbox detection from 4.1.0 which will call crash
## 4.1.0
- Add built-in AppViewer plugin for `.msi`, `.appx`, `.msix`, `.wgt`, `.wgtu`, `.apk`, `.ipa`, `.hap`, `.deb`, `.dmg`, `.appimage`, `.rpm`, `.aab`
- Add built-in ELF viewer plugin for ELF-type files
- Add reload feature by JSuttHoops but you should enable `AutoReload` option firstly
- New option ProcessRenderMode
- Use format detector feature for TextViewer, only `JSON` / `XML` available now
- Add support more highlighting for `HLSL`, `XML`, `TXT`, `Properties`, `Lyric`, `Log`, `Python`, `JavaScript`, `Vue`, `CSS`, `Go`, `YAML`, `F#`, `INI`, `TypeScript`, `VB`, `SubStation Alpha` and `Lua`
- No markdown resource extraction [#1661](https://github.com/QL-Win/QuickLook/issues/1661) [#1670](https://github.com/QL-Win/QuickLook/issues/1670)
- Support X11 and more JPEG2000 image formats
- Support JXR image but SDR only [#1680](https://github.com/QL-Win/QuickLook/issues/1680)
- Enable window dragging in video viewer panel [#425](https://github.com/QL-Win/QuickLook/issues/425)
- Add SVG support using WebView2 in ImageViewer
- Support RTL for .txt file [#1612](https://github.com/QL-Win/QuickLook/issues/1612)
- Add `Alt+Z` shortcut to toggle word wrap [#1487](https://github.com/QL-Win/QuickLook/issues/1487)
- Improve startup speed [#1521](https://github.com/QL-Win/QuickLook/issues/1521)
- Improve PDF magic detection
- Improve GroupBox UI/UX
- Attempt to fix the crash [#1648](https://github.com/QL-Win/QuickLook/issues/1648) `This is an experimental fix, the idea is to remove the tree to prevent the DUCE command`
- Update font pangram for FontViewer
- Update de translations by King3R
- Manually resolve the assembly fails [#1618](https://github.com/QL-Win/QuickLook/issues/1618)
- Merge OfficeViewer-Native plugin [#1662](https://github.com/QL-Win/QuickLook/issues/1662)
- New option CheckPreviewHandler for OfficeViewer-Native
- Add Sandbox detection
- Revert the DataGrid style of CSV [#1664](https://github.com/QL-Win/QuickLook/issues/1664)
- Remove the WoW64HookHelper from release [#1634](https://github.com/QL-Win/QuickLook/issues/1634)
- Fix share button was not visible in win11
- Fix generic theme resources [#1652](https://github.com/QL-Win/QuickLook/issues/1652)
- Fix old version volume exception [#1653](https://github.com/QL-Win/QuickLook/issues/1653)
- Fix CaptionTextButtonStyle not static anymore
- Fix unsupported ColorContexts in Windows [#1671](https://github.com/QL-Win/QuickLook/issues/1671)
- ~~Fix long path issue [#1643](https://github.com/QL-Win/QuickLook/issues/1643)~~
## 4.0.2
- Support .pcx image [#1638](https://github.com/QL-Win/QuickLook/issues/1638)
- Improve PE parsing with extended buffer size
- Fix flickering [#1628](https://github.com/QL-Win/QuickLook/issues/1628)
- Fix DpiAwareness for PerMonitor [#1626](https://github.com/QL-Win/QuickLook/issues/1626)
- Hide PEViewer Title just like InfoPanel
- Avoid audio cover null exception in xaml
## 4.0.1
- Support more Markdown file extensions [#1562](https://github.com/QL-Win/QuickLook/issues/1562), [#1601](https://github.com/QL-Win/QuickLook/issues/1601)
- Support CLI options [#1620](https://github.com/QL-Win/QuickLook/issues/1620)
- Update pt-BR translations in Translations.config
- Delay initialization of MarkdownViewer
- Make .exe installer use MSI path by default [#1596](https://github.com/QL-Win/QuickLook/issues/1596)
- Fix style issues in the Search Panel [#1592](https://github.com/QL-Win/QuickLook/issues/1592)
- Fix volume control not working [#1578](https://github.com/QL-Win/QuickLook/issues/1578)
- Fix exception when checking for updates [#1577](https://github.com/QL-Win/QuickLook/issues/1577)
## 4.0.0
- Add built-in PE viewer plugin
- Add built-in font viewer plugin
- Update translations
- Update dependent packages
- Add support for Multi Commander
- Add support for both Everything v1.4 and v1.5(a)
- Add "Open Data Folder" and dark mode support to tray menu
- Add "Restart QuickLook" option to tray menu [#1448](https://github.com/QL-Win/QuickLook/issues/1448)
- Implement modern message box UI
- Replace icons with Segoe Fluent Icons
- Detect and auto-fix Windows blocking issues [#1495](https://github.com/QL-Win/QuickLook/issues/1495)
- Adjust tray menu position
- Use MicaSetup to create EXE installer
- Fix plugin installer description length limit
- Prevent crash when WMI fails [#1379](https://github.com/QL-Win/QuickLook/issues/1379)
- Show toast when "Prevent Closing" cannot be cancelled [#1368](https://github.com/QL-Win/QuickLook/issues/1368)
- Add support for multi-layer GIMP .xcf files [#1224](https://github.com/QL-Win/QuickLook/issues/1224) for ImageViewer
- Fix .xcf file extension check [#1229](https://github.com/QL-Win/QuickLook/issues/1229) for ImageViewer
- Fix HEIC preview rendering [#1470](https://github.com/QL-Win/QuickLook/issues/1470) for ImageViewer
- Add support for .qoi, .icns, .dds, .svgz, .psb, .cur, and .ani formats for ImageViewer
- Improve animated WebP support (x64 only) [#1024](https://github.com/QL-Win/QuickLook/issues/1024) [#1324](https://github.com/QL-Win/QuickLook/issues/1324) for ImageViewer
- Improve GIF decoding performance [#993](https://github.com/QL-Win/QuickLook/issues/993) for ImageViewer
- Add copy button to image viewer [#1399](https://github.com/QL-Win/QuickLook/issues/1399) for ImageViewer
- Fix SVG rendering error [#1430](https://github.com/QL-Win/QuickLook/issues/1430) for ImageViewer
- Add double-encoding detection [#471](https://github.com/QL-Win/QuickLook/issues/471) [#600](https://github.com/QL-Win/QuickLook/issues/600) for TextViewer
- Improve dark mode rendering for TextViewer
- Catch exceptions from XSHD loader for TextViewer
- Add syntax highlighting for shell scripts [#668](https://github.com/QL-Win/QuickLook/issues/668) for TextViewer
- Add dark mode support for C# syntax highlighting for TextViewer
- Improve support for comic archive formats [#1276](https://github.com/QL-Win/QuickLook/issues/1276) for ArchiveViewer
- Redesign file list with Fluent UI for ArchiveViewer
- Change default background color to blue for CsvViewer
- Fix issue with non-UTF8 CSV encoding for CsvViewer
- Improve rendering and stability for MarkdownViewer
- Add support for password-protected PDFs [#155](https://github.com/QL-Win/QuickLook/issues/155) for PDFViewer
- Enable auto-resizing of the viewer window for PDFViewer
- Fix audio cover parsing error for multiple embedded images for VideoViewer
- Add lyric (.lrc) support for audio files [#1506](https://github.com/QL-Win/QuickLook/issues/1506) for VideoViewer
- Add support for .mid audio format [#931](https://github.com/QL-Win/QuickLook/issues/931) for VideoViewer
- Fix time label overflow in long videos for VideoViewer

7
QuickLook.Appx/.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
.vs/*
[Bb]in/
[Oo]bj/
AppPackages/*
BundleArtifacts/*
*.user
*.cache

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 951 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">
<Identity
Name="CE36AF3D-FF94-43EB-9908-7EC8FD1D29FB"
Publisher="CN=CE36AF3D-FF94-43EB-9908-7EC8FD1D29FB"
Version="4.0.2.0" />
<Properties>
<DisplayName>QuickLook</DisplayName>
<PublisherDisplayName>ema</PublisherDisplayName>
<Logo>Images\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName="QuickLook"
Description="Bring macOS “Quick Look” feature to Windows"
BackgroundColor="transparent"
Square150x150Logo="Images\Square150x150Logo.png"
Square44x44Logo="Images\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" Square71x71Logo="Images\SmallTile.png" Square310x310Logo="Images\LargeTile.png"/>
<uap:SplashScreen Image="Images\SplashScreen.png" />
<uap:LockScreen BadgeLogo="Images\BadgeLogo.png" Notification="badgeAndTileText"/>
<uap:InitialRotationPreference>
<uap:Rotation Preference="landscape"/></uap:InitialRotationPreference>
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>

View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '15.0'">
<VisualStudioVersion>15.0</VisualStudioVersion>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup>
<WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath>
</PropertyGroup>
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" />
<PropertyGroup>
<ProjectGuid>0b2465a9-2dc4-41c6-9fd5-af357969b85c</ProjectGuid>
<TargetPlatformVersion>10.0.26100.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.18362.0</TargetPlatformMinVersion>
<DefaultLanguage>en-US</DefaultLanguage>
<AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
<NoWarn>$(NoWarn);NU1702</NoWarn>
<PackageCertificateThumbprint>2C4426FFCBF7BB78EA1856105CCAAC44F7D91F04</PackageCertificateThumbprint>
<GenerateAppInstallerFile>False</GenerateAppInstallerFile>
<AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>
<AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision>
<GenerateTestArtifacts>True</GenerateTestArtifacts>
<AppxBundlePlatforms>x64</AppxBundlePlatforms>
<HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>
<AppxSymbolPackageEnabled>True</AppxSymbolPackageEnabled>
<EntryPointProjectUniqueName>..\QuickLook\QuickLook.csproj</EntryPointProjectUniqueName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<AppxBundle>Always</AppxBundle>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<AppxBundle>Always</AppxBundle>
</PropertyGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
</ItemGroup>
<ItemGroup>
<Content Include="Images\Wide310x150Logo.scale-400.png" />
<Content Include="Images\BadgeLogo.scale-100.png" />
<Content Include="Images\BadgeLogo.scale-125.png" />
<Content Include="Images\BadgeLogo.scale-150.png" />
<Content Include="Images\BadgeLogo.scale-200.png" />
<Content Include="Images\BadgeLogo.scale-400.png" />
<Content Include="Images\LargeTile.scale-100.png" />
<Content Include="Images\LargeTile.scale-125.png" />
<Content Include="Images\LargeTile.scale-150.png" />
<Content Include="Images\LargeTile.scale-200.png" />
<Content Include="Images\LargeTile.scale-400.png" />
<Content Include="Images\SmallTile.scale-100.png" />
<Content Include="Images\SmallTile.scale-125.png" />
<Content Include="Images\SmallTile.scale-150.png" />
<Content Include="Images\SmallTile.scale-200.png" />
<Content Include="Images\SmallTile.scale-400.png" />
<Content Include="Images\SplashScreen.scale-100.png" />
<Content Include="Images\SplashScreen.scale-125.png" />
<Content Include="Images\SplashScreen.scale-150.png" />
<Content Include="Images\SplashScreen.scale-200.png" />
<Content Include="Images\SplashScreen.scale-400.png" />
<Content Include="Images\Square150x150Logo.scale-100.png" />
<Content Include="Images\Square150x150Logo.scale-125.png" />
<Content Include="Images\Square150x150Logo.scale-150.png" />
<Content Include="Images\Square150x150Logo.scale-200.png" />
<Content Include="Images\Square150x150Logo.scale-400.png" />
<Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-16.png" />
<Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-24.png" />
<Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-256.png" />
<Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-32.png" />
<Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-48.png" />
<Content Include="Images\Square44x44Logo.altform-unplated_targetsize-16.png" />
<Content Include="Images\Square44x44Logo.altform-unplated_targetsize-256.png" />
<Content Include="Images\Square44x44Logo.altform-unplated_targetsize-32.png" />
<Content Include="Images\Square44x44Logo.altform-unplated_targetsize-48.png" />
<Content Include="Images\Square44x44Logo.scale-100.png" />
<Content Include="Images\Square44x44Logo.scale-125.png" />
<Content Include="Images\Square44x44Logo.scale-150.png" />
<Content Include="Images\Square44x44Logo.scale-200.png" />
<Content Include="Images\Square44x44Logo.scale-400.png" />
<Content Include="Images\Square44x44Logo.targetsize-16.png" />
<Content Include="Images\Square44x44Logo.targetsize-24.png" />
<Content Include="Images\Square44x44Logo.targetsize-24_altform-unplated.png" />
<Content Include="Images\Square44x44Logo.targetsize-256.png" />
<Content Include="Images\Square44x44Logo.targetsize-32.png" />
<Content Include="Images\Square44x44Logo.targetsize-48.png" />
<Content Include="Images\StoreLogo.scale-100.png" />
<Content Include="Images\StoreLogo.scale-125.png" />
<Content Include="Images\StoreLogo.scale-150.png" />
<Content Include="Images\StoreLogo.scale-200.png" />
<Content Include="Images\StoreLogo.scale-400.png" />
<Content Include="Images\Wide310x150Logo.scale-100.png" />
<Content Include="Images\Wide310x150Logo.scale-125.png" />
<Content Include="Images\Wide310x150Logo.scale-150.png" />
<Content Include="Images\Wide310x150Logo.scale-200.png" />
<None Include="sideload.pfx" />
</ItemGroup>
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" />
<ItemGroup>
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.1" PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\QuickLook\QuickLook.csproj" />
</ItemGroup>
</Project>

View File

@@ -50,6 +50,8 @@ void HelperMethods::ObtainFirstItem(CComPtr<IDataObject> dao, PWCHAR buffer)
medium.tymed = TYMED_HGLOBAL;
// Try CF_HDROP first
// If the file path is too long, the call might fail but CFSTR_SHELLIDLIST will do it
// https://github.com/QL-Win/QuickLook/issues/1643
if (SUCCEEDED(dao->GetData(&formatetc, &medium)))
{
HDROP hDrop = HDROP(medium.hGlobal);
@@ -73,7 +75,7 @@ void HelperMethods::ObtainFirstItem(CComPtr<IDataObject> dao, PWCHAR buffer)
static const CLIPFORMAT cfShellIDList = (CLIPFORMAT)RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
formatetc.cfFormat = cfShellIDList;
if (SUCCEEDED(dao->GetData(&formatetc, &medium)))
if (SUCCEEDED(dao->GetData(&formatetc, &medium)))
{
CIDA* pida = (CIDA*)GlobalLock(medium.hGlobal);
if (!pida)
@@ -98,7 +100,7 @@ void HelperMethods::ObtainFirstItem(CComPtr<IDataObject> dao, PWCHAR buffer)
PWSTR pszPath = nullptr;
if (SUCCEEDED(shellItem->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &pszPath)))
{
StringCchCopyW(buffer, MAX_PATH, pszPath); // returns e.g., ::{645FF040-5081-101B-9F08-00AA002F954E}
StringCchCopyW(buffer, MAX_PATH_EX, pszPath); // returns e.g., ::{645FF040-5081-101B-9F08-00AA002F954E}
CoTaskMemFree(pszPath);
}
}

View File

@@ -0,0 +1,274 @@
<UserControl x:Class="QuickLook.Plugin.AppViewer.InfoPanels.ApkInfoPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:QuickLook.Plugin.AppViewer"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontSize="14"
UseLayoutRounding="True"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="GroupBox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="image"
Grid.Row="1"
Grid.Column="0"
Width="120"
Height="120"
Margin="8"
VerticalAlignment="Top"
Opacity="0"
RenderOptions.BitmapScalingMode="HighQuality"
SnapsToDevicePixels="True"
Stretch="Fill"
UseLayoutRounding="True">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Source, ElementName=image}" Value="{x:Null}">
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation BeginTime="0:0:0"
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.05" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<Grid Grid.Row="1" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="* " />
</Grid.RowDefinitions>
<Grid Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
MaxHeight="60"
Padding="3"
FontSize="19"
FontWeight="SemiBold"
LineHeight="25"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap">
<TextBlock.Inlines>
<Run x:Name="filename" Text="FilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilename.ext" />
</TextBlock.Inlines>
</TextBlock>
</Grid>
<!-- Application Name -->
<TextBlock x:Name="applicationNameTitle"
Grid.Row="3"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Application Name" />
<TextBlock x:Name="applicationName"
Grid.Row="3"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version Name -->
<TextBlock x:Name="versionNameTitle"
Grid.Row="4"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version Name" />
<TextBlock x:Name="versionName"
Grid.Row="4"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version Code -->
<TextBlock x:Name="versionCodeTitle"
Grid.Row="5"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version Code" />
<TextBlock x:Name="versionCode"
Grid.Row="5"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Package Name -->
<TextBlock x:Name="packageNameTitle"
Grid.Row="6"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Package Name" />
<TextBlock x:Name="packageName"
Grid.Row="6"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- ABIs -->
<TextBlock x:Name="abisTitle"
Grid.Row="7"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="ABIs" />
<TextBlock x:Name="abis"
Grid.Row="7"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- MinSdkVersion -->
<TextBlock x:Name="minSdkVersionTitle"
Grid.Row="8"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="MinSdkVersion" />
<TextBlock x:Name="minSdkVersion"
Grid.Row="8"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- TargetSdkVersion -->
<TextBlock x:Name="targetSdkVersionTitle"
Grid.Row="9"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="TargetSdkVersion" />
<TextBlock x:Name="targetSdkVersion"
Grid.Row="9"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Total Size -->
<TextBlock x:Name="totalSizeTitle"
Grid.Row="10"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Total Size" />
<TextBlock x:Name="totalSize"
Grid.Row="10"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Calculating size..." />
<!-- Last Modified -->
<TextBlock x:Name="modDateTitle"
Grid.Row="11"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Last Modified" />
<TextBlock x:Name="modDate"
Grid.Row="11"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis" />
<!-- Permissions -->
<GroupBox x:Name="permissionsGroupBox"
Grid.Row="12"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="3,3,16,16"
Padding="3"
Background="{DynamicResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{DynamicResource CardStrokeColorDefaultBrush}"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Header="Capabilities">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ScrollViewer.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
</ScrollViewer.Resources>
<ItemsControl x:Name="permissions">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Margin="8,3,16,3"
IsReadOnly="True"
Text="{Binding ., Mode=OneTime}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,117 @@
// 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.ExtensionMethods;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Plugin.AppViewer.PackageParsers.Apk;
using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.AppViewer.InfoPanels;
public partial class ApkInfoPanel : UserControl, IAppInfoPanel
{
private readonly ContextObject _context;
public ApkInfoPanel(ContextObject context)
{
_context = context;
DataContext = this;
InitializeComponent();
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
applicationNameTitle.Text = TranslationHelper.Get("APP_NAME", translationFile);
versionNameTitle.Text = TranslationHelper.Get("APP_VERSION_NAME", translationFile);
versionCodeTitle.Text = TranslationHelper.Get("APP_VERSION_CODE", translationFile);
packageNameTitle.Text = TranslationHelper.Get("PACKAGE_NAME", translationFile);
abisTitle.Text = TranslationHelper.Get("ABI", translationFile);
minSdkVersionTitle.Text = TranslationHelper.Get("APP_MIN_SDK_VERSION", translationFile);
targetSdkVersionTitle.Text = TranslationHelper.Get("APP_TARGET_SDK_VERSION", translationFile);
totalSizeTitle.Text = TranslationHelper.Get("TOTAL_SIZE", translationFile);
modDateTitle.Text = TranslationHelper.Get("LAST_MODIFIED", translationFile);
permissionsGroupBox.Header = TranslationHelper.Get("PERMISSIONS", translationFile);
}
public void DisplayInfo(string path)
{
var name = Path.GetFileName(path);
filename.Text = string.IsNullOrEmpty(name) ? path : name;
_ = Task.Run(() =>
{
if (File.Exists(path))
{
var size = new FileInfo(path).Length;
IApkInfo info = Path.GetExtension(Plugin.ConfirmPath(path)).ToLower() switch
{
".apk" => ApkParser.Parse(path),
".aab" => AabParser.Parse(path),
_ => throw new NotSupportedException("Extension is not supported."),
};
var last = File.GetLastWriteTime(path);
Dispatcher.Invoke(() =>
{
applicationName.Text = info.Label;
versionName.Text = info.VersionName;
versionCode.Text = info.VersionCode;
abis.Text = string.Join(", ", info.ABIs ?? []);
packageName.Text = info.PackageName;
minSdkVersion.Text = info.MinSdkVersion;
targetSdkVersion.Text = info.TargetSdkVersion;
totalSize.Text = size.ToPrettySize(2);
modDate.Text = last.ToString(CultureInfo.CurrentCulture);
permissions.ItemsSource = info.Permissions;
if (info.HasIcon)
{
try
{
using var stream = new MemoryStream(info.Logo);
var icon = new BitmapImage();
icon.BeginInit();
icon.CacheOption = BitmapCacheOption.OnLoad;
icon.StreamSource = stream;
icon.EndInit();
icon.Freeze();
image.Source = icon;
}
catch (Exception e)
{
Debug.WriteLine(e);
image.Source = new BitmapImage(new Uri("pack://application:,,,/QuickLook.Plugin.AppViewer;component/Resources/android.png"));
}
}
else
{
image.Source = new BitmapImage(new Uri("pack://application:,,,/QuickLook.Plugin.AppViewer;component/Resources/android.png"));
}
_context.IsBusy = false;
});
}
});
}
}

View File

@@ -0,0 +1,241 @@
<UserControl x:Class="QuickLook.Plugin.AppViewer.InfoPanels.AppImageInfoPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:QuickLook.Plugin.AppViewer"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontSize="14"
UseLayoutRounding="True"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="GroupBox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="image"
Grid.Row="1"
Grid.Column="0"
Width="120"
Height="120"
Margin="8"
VerticalAlignment="Top"
Opacity="0"
RenderOptions.BitmapScalingMode="HighQuality"
SnapsToDevicePixels="True"
Stretch="Fill"
UseLayoutRounding="True">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Source, ElementName=image}" Value="{x:Null}">
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation BeginTime="0:0:0"
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.05" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<Grid Grid.Row="1" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
MaxHeight="60"
Padding="3"
FontSize="19"
FontWeight="SemiBold"
LineHeight="25"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap">
<TextBlock.Inlines>
<Run x:Name="filename" Text="FilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilename.ext" />
</TextBlock.Inlines>
</TextBlock>
</Grid>
<!-- Application Name -->
<TextBlock x:Name="applicationNameTitle"
Grid.Row="3"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Application Name" />
<TextBlock x:Name="applicationName"
Grid.Row="3"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version -->
<TextBlock x:Name="versionTitle"
Grid.Row="4"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version" />
<TextBlock x:Name="version"
Grid.Row="4"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Architecture -->
<TextBlock x:Name="architectureTitle"
Grid.Row="5"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Architecture" />
<TextBlock x:Name="architectureName"
Grid.Row="5"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Type -->
<TextBlock x:Name="typeTitle"
Grid.Row="6"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Type" />
<TextBlock x:Name="type"
Grid.Row="6"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Terminal -->
<TextBlock x:Name="terminalTitle"
Grid.Row="7"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Terminal" />
<TextBlock x:Name="terminal"
Grid.Row="7"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Total Size -->
<TextBlock x:Name="totalSizeTitle"
Grid.Row="8"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Total Size" />
<TextBlock x:Name="totalSize"
Grid.Row="8"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Calculating size..." />
<!-- Last Modified -->
<TextBlock x:Name="modDateTitle"
Grid.Row="9"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Last Modified" />
<TextBlock x:Name="modDate"
Grid.Row="9"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis" />
<!-- Environment -->
<GroupBox x:Name="environmentGroupBox"
Grid.Row="10"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="3,3,16,16"
Padding="3"
Background="{DynamicResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{DynamicResource CardStrokeColorDefaultBrush}"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Header="Environment"
Visibility="Collapsed">
<ScrollViewer VerticalScrollBarVisibility="Auto" Visibility="Collapsed">
<ScrollViewer.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
</ScrollViewer.Resources>
<ItemsControl x:Name="permissions">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Margin="8,3,16,3"
IsReadOnly="True"
Text="{Binding ., Mode=OneTime}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,92 @@
// 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.ExtensionMethods;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Plugin.AppViewer.PackageParsers.AppImage;
using System;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.AppViewer.InfoPanels;
public partial class AppImageInfoPanel : UserControl, IAppInfoPanel
{
private readonly ContextObject _context;
public AppImageInfoPanel(ContextObject context)
{
_context = context;
DataContext = this;
InitializeComponent();
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
applicationNameTitle.Text = TranslationHelper.Get("APP_NAME", translationFile);
versionTitle.Text = TranslationHelper.Get("APP_VERSION", translationFile);
architectureTitle.Text = TranslationHelper.Get("ARCHITECTURE", translationFile);
typeTitle.Text = TranslationHelper.Get("TYPE", translationFile);
terminalTitle.Text = TranslationHelper.Get("TERMINAL", translationFile);
totalSizeTitle.Text = TranslationHelper.Get("TOTAL_SIZE", translationFile);
modDateTitle.Text = TranslationHelper.Get("LAST_MODIFIED", translationFile);
environmentGroupBox.Header = TranslationHelper.Get("ENVIRONMENT", translationFile);
}
public void DisplayInfo(string path)
{
var name = Path.GetFileName(path);
filename.Text = string.IsNullOrEmpty(name) ? path : name;
_ = Task.Run(() =>
{
if (File.Exists(path))
{
var size = new FileInfo(path).Length;
AppImageInfo appInfo = AppImageParser.Parse(path);
var last = File.GetLastWriteTime(path);
Dispatcher.Invoke(() =>
{
applicationName.Text = appInfo.Name;
version.Text = appInfo.Version;
architectureName.Text = appInfo.Arch;
type.Text = appInfo.Type;
terminal.Text = appInfo.Terminal;
totalSize.Text = size.ToPrettySize(2);
modDate.Text = last.ToString(CultureInfo.CurrentCulture);
permissions.ItemsSource = appInfo.Env;
if (appInfo.HasIcon)
{
image.Source = appInfo.Logo.ToBitmapSource();
}
else
{
image.Source = new BitmapImage(new Uri("pack://application:,,,/QuickLook.Plugin.AppViewer;component/Resources/linux.png"));
}
_context.IsBusy = false;
});
}
});
}
}

View File

@@ -0,0 +1,205 @@
<UserControl x:Class="QuickLook.Plugin.AppViewer.InfoPanels.AppxInfoPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:QuickLook.Plugin.AppViewer"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontSize="14"
UseLayoutRounding="True"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="GroupBox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="image"
Grid.Row="1"
Grid.Column="0"
Width="128"
Height="128"
VerticalAlignment="Top"
Opacity="0"
RenderOptions.BitmapScalingMode="HighQuality"
SnapsToDevicePixels="True"
Stretch="Fill"
UseLayoutRounding="True">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Source, ElementName=image}" Value="{x:Null}">
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation BeginTime="0:0:0"
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.05" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<Grid Grid.Row="1" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="* " />
</Grid.RowDefinitions>
<Grid Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
MaxHeight="60"
Padding="3"
FontSize="19"
FontWeight="SemiBold"
LineHeight="25"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap">
<TextBlock.Inlines>
<Run x:Name="filename" Text="FilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilename.ext" />
</TextBlock.Inlines>
</TextBlock>
</Grid>
<!-- Product Name -->
<TextBlock x:Name="productNameTitle"
Grid.Row="3"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Product Name" />
<TextBlock x:Name="productName"
Grid.Row="3"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Product Version -->
<TextBlock x:Name="productVersionTitle"
Grid.Row="4"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Product Version" />
<TextBlock x:Name="productVersion"
Grid.Row="4"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Publisher -->
<TextBlock x:Name="publisherTitle"
Grid.Row="5"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Publisher" />
<TextBlock x:Name="publisher"
Grid.Row="5"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Total Size -->
<TextBlock x:Name="totalSizeTitle"
Grid.Row="6"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Total Size" />
<TextBlock x:Name="totalSize"
Grid.Row="6"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Calculating size..." />
<!-- Last Modified -->
<TextBlock x:Name="modDateTitle"
Grid.Row="7"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Last Modified" />
<TextBlock x:Name="modDate"
Grid.Row="7"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis" />
<!-- Capabilities -->
<GroupBox x:Name="capabilitiesGroupBox"
Grid.Row="8"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="3,3,16,16"
Padding="3"
Background="{DynamicResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{DynamicResource CardStrokeColorDefaultBrush}"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Header="Capabilities">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ScrollViewer.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
</ScrollViewer.Resources>
<ItemsControl x:Name="capabilities">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Margin="8,3,16,3"
IsReadOnly="True"
Text="{Binding ., Mode=OneTime}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,94 @@
// 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.ExtensionMethods;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Plugin.AppViewer.PackageParsers.Appx;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.AppViewer.InfoPanels;
public partial class AppxInfoPanel : UserControl, IAppInfoPanel
{
private readonly ContextObject _context;
public AppxInfoPanel(ContextObject context)
{
_context = context;
DataContext = this;
InitializeComponent();
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
productNameTitle.Text = TranslationHelper.Get("PRODUCT_NAME", translationFile);
productVersionTitle.Text = TranslationHelper.Get("PRODUCT_VERSION", translationFile);
publisherTitle.Text = TranslationHelper.Get("PUBLISHER", translationFile);
totalSizeTitle.Text = TranslationHelper.Get("TOTAL_SIZE", translationFile);
modDateTitle.Text = TranslationHelper.Get("LAST_MODIFIED", translationFile);
capabilitiesGroupBox.Header = TranslationHelper.Get("CAPABILITIES", translationFile);
}
public void DisplayInfo(string path)
{
var name = Path.GetFileName(path);
filename.Text = string.IsNullOrEmpty(name) ? path : name;
_ = Task.Run(() =>
{
if (File.Exists(path))
{
var size = new FileInfo(path).Length;
AppxInfo appxInfo = AppxParser.Parse(path);
var last = File.GetLastWriteTime(path);
Dispatcher.Invoke(() =>
{
productName.Text = appxInfo.ProductName;
productVersion.Text = appxInfo.ProductVersion;
publisher.Text = appxInfo.Publisher;
totalSize.Text = size.ToPrettySize(2);
modDate.Text = last.ToString(CultureInfo.CurrentCulture);
capabilities.ItemsSource = appxInfo.Capabilities;
using var icon = appxInfo.Logo;
image.Source = icon?.ToBitmapSource() ?? GetWindowsThumbnail(path);
_context.IsBusy = false;
});
}
});
static BitmapSource GetWindowsThumbnail(string path)
{
var scale = DisplayDeviceHelper.GetCurrentScaleFactor();
using var icon =
WindowsThumbnailProvider.GetThumbnail(path,
(int)(128 * scale.Horizontal),
(int)(128 * scale.Vertical),
ThumbnailOptions.ScaleUp);
var source = icon?.ToBitmapSource();
return source;
}
}
}

View File

@@ -0,0 +1,197 @@
<UserControl x:Class="QuickLook.Plugin.AppViewer.InfoPanels.DebInfoPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:QuickLook.Plugin.AppViewer"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontSize="14"
UseLayoutRounding="True"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="GroupBox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="image"
Grid.Row="1"
Grid.Column="0"
Width="120"
Height="120"
Margin="8"
VerticalAlignment="Top"
Source="/QuickLook.Plugin.AppViewer;component/Resources/debian.png"
Stretch="Fill" />
<Grid Grid.Row="1" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="* " />
</Grid.RowDefinitions>
<Grid Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
MaxHeight="60"
Padding="3"
FontSize="19"
FontWeight="SemiBold"
LineHeight="25"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap">
<TextBlock.Inlines>
<Run x:Name="filename" Text="FilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilename.ext" />
</TextBlock.Inlines>
</TextBlock>
</Grid>
<!-- Package Name -->
<TextBlock x:Name="packageNameTitle"
Grid.Row="3"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Package Name" />
<TextBlock x:Name="packageName"
Grid.Row="3"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version Name -->
<TextBlock x:Name="versionNameTitle"
Grid.Row="4"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version Name" />
<TextBlock x:Name="versionName"
Grid.Row="4"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Architecture -->
<TextBlock x:Name="architectureTitle"
Grid.Row="5"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Architecture" />
<TextBlock x:Name="architecture"
Grid.Row="5"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Maintainer -->
<TextBlock x:Name="maintainerTitle"
Grid.Row="6"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Maintainer" />
<TextBlock x:Name="maintainer"
Grid.Row="6"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Total Size -->
<TextBlock x:Name="totalSizeTitle"
Grid.Row="7"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Total Size" />
<TextBlock x:Name="totalSize"
Grid.Row="7"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Calculating size..." />
<!-- Last Modified -->
<TextBlock x:Name="modDateTitle"
Grid.Row="8"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Last Modified" />
<TextBlock x:Name="modDate"
Grid.Row="8"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis" />
<!-- Description -->
<GroupBox x:Name="descriptionGroupBox"
Grid.Row="9"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="3,3,16,16"
Padding="3"
Background="{DynamicResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{DynamicResource CardStrokeColorDefaultBrush}"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Header="Description">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ScrollViewer.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
</ScrollViewer.Resources>
<TextBox x:Name="description"
Margin="8,3,16,3"
AcceptsReturn="True"
IsReadOnly="True"
TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto" />
</ScrollViewer>
</GroupBox>
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,79 @@
// 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.ExtensionMethods;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Plugin.AppViewer.PackageParsers.Deb;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace QuickLook.Plugin.AppViewer.InfoPanels;
public partial class DebInfoPanel : UserControl, IAppInfoPanel
{
private readonly ContextObject _context;
public DebInfoPanel(ContextObject context)
{
_context = context;
DataContext = this;
InitializeComponent();
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
packageNameTitle.Text = TranslationHelper.Get("PACKAGE_NAME", translationFile);
versionNameTitle.Text = TranslationHelper.Get("APP_VERSION_NAME", translationFile);
architectureTitle.Text = TranslationHelper.Get("ARCHITECTURE", translationFile);
maintainerTitle.Text = TranslationHelper.Get("MAINTAINER", translationFile);
totalSizeTitle.Text = TranslationHelper.Get("TOTAL_SIZE", translationFile);
modDateTitle.Text = TranslationHelper.Get("LAST_MODIFIED", translationFile);
descriptionGroupBox.Header = TranslationHelper.Get("DESCRIPTION", translationFile);
}
public void DisplayInfo(string path)
{
var name = Path.GetFileName(path);
filename.Text = string.IsNullOrEmpty(name) ? path : name;
_ = Task.Run(() =>
{
if (File.Exists(path))
{
var size = new FileInfo(path).Length;
DebInfo debInfo = DebParser.Parse(path);
var last = File.GetLastWriteTime(path);
Dispatcher.Invoke(() =>
{
packageName.Text = debInfo.Package;
versionName.Text = debInfo.Version;
architecture.Text = debInfo.Architecture;
maintainer.Text = debInfo.Maintainer;
totalSize.Text = size.ToPrettySize(2);
modDate.Text = last.ToString(CultureInfo.CurrentCulture);
description.Text = debInfo.Description;
_context.IsBusy = false;
});
}
});
}
}

View File

@@ -0,0 +1,274 @@
<UserControl x:Class="QuickLook.Plugin.AppViewer.InfoPanels.DmgInfoPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:QuickLook.Plugin.AppViewer"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontSize="14"
UseLayoutRounding="True"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="GroupBox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="image"
Grid.Row="1"
Grid.Column="0"
Width="120"
Height="120"
Margin="8"
VerticalAlignment="Top"
Opacity="0"
RenderOptions.BitmapScalingMode="HighQuality"
SnapsToDevicePixels="True"
Stretch="Fill"
UseLayoutRounding="True">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Source, ElementName=image}" Value="{x:Null}">
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation BeginTime="0:0:0"
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.05" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<Grid Grid.Row="1" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
MaxHeight="60"
Padding="3"
FontSize="19"
FontWeight="SemiBold"
LineHeight="25"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap">
<TextBlock.Inlines>
<Run x:Name="filename" Text="FilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilename.ext" />
</TextBlock.Inlines>
</TextBlock>
</Grid>
<!-- Application Name -->
<TextBlock x:Name="applicationNameTitle"
Grid.Row="3"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Application Name" />
<TextBlock x:Name="applicationName"
Grid.Row="3"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version Name -->
<TextBlock x:Name="versionNameTitle"
Grid.Row="4"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version Name" />
<TextBlock x:Name="versionName"
Grid.Row="4"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version Code -->
<TextBlock x:Name="versionCodeTitle"
Grid.Row="5"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version Code" />
<TextBlock x:Name="versionCode"
Grid.Row="5"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Package Name -->
<TextBlock x:Name="packageNameTitle"
Grid.Row="6"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Package Name" />
<TextBlock x:Name="packageName"
Grid.Row="6"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Device Family -->
<TextBlock x:Name="deviceFamilyTitle"
Grid.Row="7"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Device Family" />
<TextBlock x:Name="deviceFamily"
Grid.Row="7"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- MinimumOSVersion -->
<TextBlock x:Name="minimumOSVersionTitle"
Grid.Row="8"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="MinimumOSVersion" />
<TextBlock x:Name="minimumOSVersion"
Grid.Row="8"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- PlatformVersion -->
<TextBlock x:Name="platformVersionTitle"
Grid.Row="9"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="PlatformVersion" />
<TextBlock x:Name="platformVersion"
Grid.Row="9"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Total Size -->
<TextBlock x:Name="totalSizeTitle"
Grid.Row="10"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Total Size" />
<TextBlock x:Name="totalSize"
Grid.Row="10"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Calculating size..." />
<!-- Last Modified -->
<TextBlock x:Name="modDateTitle"
Grid.Row="11"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Last Modified" />
<TextBlock x:Name="modDate"
Grid.Row="11"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis" />
<!-- Permissions -->
<GroupBox x:Name="permissionsGroupBox"
Grid.Row="12"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="3,3,16,16"
Padding="3"
Background="{DynamicResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{DynamicResource CardStrokeColorDefaultBrush}"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Header="Capabilities">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ScrollViewer.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
</ScrollViewer.Resources>
<ItemsControl x:Name="permissions">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Margin="8,3,16,3"
IsReadOnly="True"
Text="{Binding ., Mode=OneTime}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,96 @@
// 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.ExtensionMethods;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Plugin.AppViewer.PackageParsers.Dmg;
using System;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.AppViewer.InfoPanels;
public partial class DmgInfoPanel : UserControl, IAppInfoPanel
{
private readonly ContextObject _context;
public DmgInfoPanel(ContextObject context)
{
_context = context;
DataContext = this;
InitializeComponent();
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
applicationNameTitle.Text = TranslationHelper.Get("APP_NAME", translationFile);
versionNameTitle.Text = TranslationHelper.Get("APP_VERSION_NAME", translationFile);
versionCodeTitle.Text = TranslationHelper.Get("APP_VERSION_CODE", translationFile);
packageNameTitle.Text = TranslationHelper.Get("PACKAGE_NAME", translationFile);
minimumOSVersionTitle.Text = TranslationHelper.Get("APP_MIN_OS_VERSION", translationFile);
deviceFamilyTitle.Text = TranslationHelper.Get("DEVICE_FAMILY", translationFile);
platformVersionTitle.Text = TranslationHelper.Get("APP_TARGET_OS_VERSION", translationFile);
totalSizeTitle.Text = TranslationHelper.Get("TOTAL_SIZE", translationFile);
modDateTitle.Text = TranslationHelper.Get("LAST_MODIFIED", translationFile);
permissionsGroupBox.Header = TranslationHelper.Get("PERMISSIONS", translationFile);
}
public void DisplayInfo(string path)
{
var name = Path.GetFileName(path);
filename.Text = string.IsNullOrEmpty(name) ? path : name;
_ = Task.Run(() =>
{
if (File.Exists(path))
{
var size = new FileInfo(path).Length;
DmgInfo dmgInfo = DmgParser.Parse(path);
var last = File.GetLastWriteTime(path);
Dispatcher.Invoke(() =>
{
applicationName.Text = dmgInfo.DisplayName;
versionName.Text = dmgInfo.VersionName;
versionCode.Text = dmgInfo.VersionCode;
packageName.Text = dmgInfo.Identifier;
minimumOSVersion.Text = dmgInfo.MinimumOSVersion;
platformVersion.Text = dmgInfo.PlatformVersion;
deviceFamily.Text = dmgInfo.SupportedPlatforms;
totalSize.Text = size.ToPrettySize(2);
modDate.Text = last.ToString(CultureInfo.CurrentCulture);
permissions.ItemsSource = dmgInfo.Permissions;
if (dmgInfo.HasIcon)
{
image.Source = dmgInfo.Logo.ToBitmapSource();
}
else
{
image.Source = new BitmapImage(new Uri("pack://application:,,,/QuickLook.Plugin.AppViewer;component/Resources/ios.png"));
}
_context.IsBusy = false;
});
}
});
}
}

View File

@@ -0,0 +1,36 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type GroupBox}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Border.CornerRadius" Value="4" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupBox}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ContentPresenter Grid.Row="0"
VerticalAlignment="Top"
ContentSource="Header"
RecognizesAccessKey="True"
TextBlock.Foreground="{TemplateBinding Foreground}" />
<Border Grid.Row="1"
Margin="0,3,0,0"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding Border.CornerRadius}">
<ContentPresenter Margin="{TemplateBinding Padding}"
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,323 @@
<UserControl x:Class="QuickLook.Plugin.AppViewer.InfoPanels.HapInfoPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:QuickLook.Plugin.AppViewer"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontSize="14"
UseLayoutRounding="True"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="GroupBox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid Grid.Row="1" Grid.Column="0">
<Image x:Name="background"
Width="120"
Height="120"
Margin="8"
VerticalAlignment="Top"
Opacity="0"
RenderOptions.BitmapScalingMode="HighQuality"
SnapsToDevicePixels="True"
Stretch="Fill"
UseLayoutRounding="True">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Source, ElementName=background}" Value="{x:Null}">
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation BeginTime="0:0:0"
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.05" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<Image x:Name="foreground"
Width="120"
Height="120"
Margin="8"
VerticalAlignment="Top"
Opacity="0"
RenderOptions.BitmapScalingMode="HighQuality"
SnapsToDevicePixels="True"
Stretch="Fill"
UseLayoutRounding="True">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Source, ElementName=foreground}" Value="{x:Null}">
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation BeginTime="0:0:0"
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.05" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Grid>
<Grid Grid.Row="1" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
MaxHeight="60"
Padding="3"
FontSize="19"
FontWeight="SemiBold"
LineHeight="25"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap">
<TextBlock.Inlines>
<Run x:Name="filename" Text="FilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilename.ext" />
</TextBlock.Inlines>
</TextBlock>
</Grid>
<!-- Application Name -->
<TextBlock x:Name="applicationNameTitle"
Grid.Row="3"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Application Name"
Visibility="Collapsed" />
<TextBlock x:Name="applicationName"
Grid.Row="3"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap"
Visibility="Collapsed" />
<!-- Bundle Name -->
<TextBlock x:Name="bundleNameTitle"
Grid.Row="4"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Bundle Name" />
<TextBlock x:Name="bundleName"
Grid.Row="4"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version Name -->
<TextBlock x:Name="versionNameTitle"
Grid.Row="5"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version Name" />
<TextBlock x:Name="versionName"
Grid.Row="5"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version Code -->
<TextBlock x:Name="versionCodeTitle"
Grid.Row="6"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version Code" />
<TextBlock x:Name="versionCode"
Grid.Row="6"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Device Types -->
<TextBlock x:Name="deviceTypesTitle"
Grid.Row="7"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Device Types" />
<TextBlock x:Name="deviceTypes"
Grid.Row="7"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- CompileSdkVersion -->
<TextBlock x:Name="compileSdkVersionTitle"
Grid.Row="8"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="CompileSdkVersion" />
<TextBlock x:Name="compileSdkVersion"
Grid.Row="8"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- MinAPIVersion -->
<TextBlock x:Name="minimumAPIVersionTitle"
Grid.Row="9"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="MinimumAPIVersion" />
<TextBlock x:Name="minimumAPIVersion"
Grid.Row="9"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- TargetAPIVersion -->
<TextBlock x:Name="targetAPIVersionTitle"
Grid.Row="10"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="TargetAPIVersion" />
<TextBlock x:Name="targetAPIVersion"
Grid.Row="10"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Total Size -->
<TextBlock x:Name="totalSizeTitle"
Grid.Row="11"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Total Size" />
<TextBlock x:Name="totalSize"
Grid.Row="11"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Calculating size..." />
<!-- Last Modified -->
<TextBlock x:Name="modDateTitle"
Grid.Row="12"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Last Modified" />
<TextBlock x:Name="modDate"
Grid.Row="12"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis" />
<!-- Permissions -->
<GroupBox x:Name="permissionsGroupBox"
Grid.Row="13"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="3,3,16,16"
Padding="3"
Background="{DynamicResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{DynamicResource CardStrokeColorDefaultBrush}"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Header="Capabilities">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ScrollViewer.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
</ScrollViewer.Resources>
<ItemsControl x:Name="permissions">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Margin="8,3,16,3"
IsReadOnly="True"
Text="{Binding ., Mode=OneTime}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,132 @@
// 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.ExtensionMethods;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Plugin.AppViewer.PackageParsers.Hap;
using System;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.AppViewer.InfoPanels;
public partial class HapInfoPanel : UserControl, IAppInfoPanel
{
private readonly ContextObject _context;
public HapInfoPanel(ContextObject context)
{
_context = context;
DataContext = this;
InitializeComponent();
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
applicationNameTitle.Text = TranslationHelper.Get("APP_NAME", translationFile);
versionNameTitle.Text = TranslationHelper.Get("APP_VERSION_NAME", translationFile);
versionCodeTitle.Text = TranslationHelper.Get("APP_VERSION_CODE", translationFile);
bundleNameTitle.Text = TranslationHelper.Get("BUNDLE_NAME", translationFile);
minimumAPIVersionTitle.Text = TranslationHelper.Get("APP_MIN_API_VERSION", translationFile);
targetAPIVersionTitle.Text = TranslationHelper.Get("APP_TARGET_API_VERSION", translationFile);
compileSdkVersionTitle.Text = TranslationHelper.Get("COMPILE_SDK_VERSION", translationFile);
totalSizeTitle.Text = TranslationHelper.Get("TOTAL_SIZE", translationFile);
modDateTitle.Text = TranslationHelper.Get("LAST_MODIFIED", translationFile);
permissionsGroupBox.Header = TranslationHelper.Get("PERMISSIONS", translationFile);
}
public void DisplayInfo(string path)
{
var name = Path.GetFileName(path);
filename.Text = string.IsNullOrEmpty(name) ? path : name;
_ = Task.Run(() =>
{
if (File.Exists(path))
{
var size = new FileInfo(path).Length;
HapInfo hapInfo = HapParser.Parse(path);
var last = File.GetLastWriteTime(path);
Dispatcher.Invoke(() =>
{
applicationName.Text = hapInfo.Label;
versionName.Text = hapInfo.VersionName;
versionCode.Text = hapInfo.VersionCode;
bundleName.Text = hapInfo.BundleName;
deviceTypes.Text = string.Join(", ", hapInfo.DeviceTypes);
minimumAPIVersion.Text = hapInfo.MinAPIVersion;
targetAPIVersion.Text = hapInfo.TargetAPIVersion;
compileSdkVersion.Text = $"{hapInfo.CompileSdkType} {hapInfo.CompileSdkVersion}";
totalSize.Text = size.ToPrettySize(2);
modDate.Text = last.ToString(CultureInfo.CurrentCulture);
permissions.ItemsSource = hapInfo.RequestPermissions;
if (hapInfo.HasIcon)
{
if (hapInfo.Logo?.Length > 0)
{
using var stream = new MemoryStream(hapInfo.Logo);
var icon = new BitmapImage();
icon.BeginInit();
icon.CacheOption = BitmapCacheOption.OnLoad;
icon.StreamSource = stream;
icon.EndInit();
icon.Freeze();
background.Source = null;
foreground.Source = icon;
}
else if (hapInfo.HasLayeredIcon)
{
{
using var stream = new MemoryStream(hapInfo.AppIconBackground);
var icon = new BitmapImage();
icon.BeginInit();
icon.CacheOption = BitmapCacheOption.OnLoad;
icon.StreamSource = stream;
icon.EndInit();
icon.Freeze();
background.Source = icon;
}
{
using var stream = new MemoryStream(hapInfo.AppIconForeground);
var icon = new BitmapImage();
icon.BeginInit();
icon.CacheOption = BitmapCacheOption.OnLoad;
icon.StreamSource = stream;
icon.EndInit();
icon.Freeze();
foreground.Source = icon;
}
}
}
else
{
background.Source = null;
foreground.Source = new BitmapImage(new Uri("pack://application:,,,/QuickLook.Plugin.AppViewer;component/Resources/harmonyos.png"));
}
_context.IsBusy = false;
});
}
});
}
}

View File

@@ -0,0 +1,25 @@
// 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/>.
namespace QuickLook.Plugin.AppViewer.InfoPanels;
public interface IAppInfoPanel
{
public void DisplayInfo(string path);
public object Tag { get; set; }
}

View File

@@ -0,0 +1,274 @@
<UserControl x:Class="QuickLook.Plugin.AppViewer.InfoPanels.IpaInfoPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:QuickLook.Plugin.AppViewer"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontSize="14"
UseLayoutRounding="True"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="GroupBox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="image"
Grid.Row="1"
Grid.Column="0"
Width="120"
Height="120"
Margin="8"
VerticalAlignment="Top"
Opacity="0"
RenderOptions.BitmapScalingMode="HighQuality"
SnapsToDevicePixels="True"
Stretch="Fill"
UseLayoutRounding="True">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Source, ElementName=image}" Value="{x:Null}">
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation BeginTime="0:0:0"
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.05" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<Grid Grid.Row="1" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
MaxHeight="60"
Padding="3"
FontSize="19"
FontWeight="SemiBold"
LineHeight="25"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap">
<TextBlock.Inlines>
<Run x:Name="filename" Text="FilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilename.ext" />
</TextBlock.Inlines>
</TextBlock>
</Grid>
<!-- Application Name -->
<TextBlock x:Name="applicationNameTitle"
Grid.Row="3"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Application Name" />
<TextBlock x:Name="applicationName"
Grid.Row="3"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version Name -->
<TextBlock x:Name="versionNameTitle"
Grid.Row="4"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version Name" />
<TextBlock x:Name="versionName"
Grid.Row="4"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version Code -->
<TextBlock x:Name="versionCodeTitle"
Grid.Row="5"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version Code" />
<TextBlock x:Name="versionCode"
Grid.Row="5"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Package Name -->
<TextBlock x:Name="packageNameTitle"
Grid.Row="6"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Package Name" />
<TextBlock x:Name="packageName"
Grid.Row="6"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Device Family -->
<TextBlock x:Name="deviceFamilyTitle"
Grid.Row="7"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Device Family" />
<TextBlock x:Name="deviceFamily"
Grid.Row="7"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- MinimumOSVersion -->
<TextBlock x:Name="minimumOSVersionTitle"
Grid.Row="8"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="MinimumOSVersion" />
<TextBlock x:Name="minimumOSVersion"
Grid.Row="8"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- PlatformVersion -->
<TextBlock x:Name="platformVersionTitle"
Grid.Row="9"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="PlatformVersion" />
<TextBlock x:Name="platformVersion"
Grid.Row="9"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Total Size -->
<TextBlock x:Name="totalSizeTitle"
Grid.Row="10"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Total Size" />
<TextBlock x:Name="totalSize"
Grid.Row="10"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Calculating size..." />
<!-- Last Modified -->
<TextBlock x:Name="modDateTitle"
Grid.Row="11"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Last Modified" />
<TextBlock x:Name="modDate"
Grid.Row="11"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis" />
<!-- Permissions -->
<GroupBox x:Name="permissionsGroupBox"
Grid.Row="12"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="3,3,16,16"
Padding="3"
Background="{DynamicResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{DynamicResource CardStrokeColorDefaultBrush}"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Header="Capabilities">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ScrollViewer.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
</ScrollViewer.Resources>
<ItemsControl x:Name="permissions">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Margin="8,3,16,3"
IsReadOnly="True"
Text="{Binding ., Mode=OneTime}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,103 @@
// 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.ExtensionMethods;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Plugin.AppViewer.PackageParsers.Ipa;
using System;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.AppViewer.InfoPanels;
public partial class IpaInfoPanel : UserControl, IAppInfoPanel
{
private readonly ContextObject _context;
public IpaInfoPanel(ContextObject context)
{
_context = context;
DataContext = this;
InitializeComponent();
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
applicationNameTitle.Text = TranslationHelper.Get("APP_NAME", translationFile);
versionNameTitle.Text = TranslationHelper.Get("APP_VERSION_NAME", translationFile);
versionCodeTitle.Text = TranslationHelper.Get("APP_VERSION_CODE", translationFile);
packageNameTitle.Text = TranslationHelper.Get("PACKAGE_NAME", translationFile);
deviceFamilyTitle.Text = TranslationHelper.Get("DEVICE_FAMILY", translationFile);
minimumOSVersionTitle.Text = TranslationHelper.Get("APP_MIN_OS_VERSION", translationFile);
platformVersionTitle.Text = TranslationHelper.Get("APP_TARGET_OS_VERSION", translationFile);
totalSizeTitle.Text = TranslationHelper.Get("TOTAL_SIZE", translationFile);
modDateTitle.Text = TranslationHelper.Get("LAST_MODIFIED", translationFile);
permissionsGroupBox.Header = TranslationHelper.Get("PERMISSIONS", translationFile);
}
public void DisplayInfo(string path)
{
var name = Path.GetFileName(path);
filename.Text = string.IsNullOrEmpty(name) ? path : name;
_ = Task.Run(() =>
{
if (File.Exists(path))
{
var size = new FileInfo(path).Length;
IpaInfo ipaInfo = IpaParser.Parse(path);
var last = File.GetLastWriteTime(path);
Dispatcher.Invoke(() =>
{
applicationName.Text = ipaInfo.DisplayName;
versionName.Text = ipaInfo.VersionName;
versionCode.Text = ipaInfo.VersionCode;
packageName.Text = ipaInfo.Identifier;
deviceFamily.Text = ipaInfo.DeviceFamily;
minimumOSVersion.Text = ipaInfo.MinimumOSVersion;
platformVersion.Text = ipaInfo.PlatformVersion;
totalSize.Text = size.ToPrettySize(2);
modDate.Text = last.ToString(CultureInfo.CurrentCulture);
permissions.ItemsSource = ipaInfo.Permissions;
if (ipaInfo.HasIcon)
{
using var stream = new MemoryStream(ipaInfo.Logo);
var icon = new BitmapImage();
icon.BeginInit();
icon.CacheOption = BitmapCacheOption.OnLoad;
icon.StreamSource = stream;
icon.EndInit();
icon.Freeze();
image.Source = icon;
}
else
{
image.Source = new BitmapImage(new Uri("pack://application:,,,/QuickLook.Plugin.AppViewer;component/Resources/ios.png"));
}
_context.IsBusy = false;
});
}
});
}
}

View File

@@ -0,0 +1,167 @@
<UserControl x:Class="QuickLook.Plugin.AppViewer.InfoPanels.MsiInfoPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:QuickLook.Plugin.AppViewer"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Height="230"
FontSize="14"
UseLayoutRounding="True"
mc:Ignorable="d">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="image"
Grid.Row="1"
Grid.Column="0"
Width="128"
Height="128"
Margin="0,-20,0,0"
Opacity="0"
RenderOptions.BitmapScalingMode="HighQuality"
SnapsToDevicePixels="True"
Stretch="Fill"
UseLayoutRounding="True">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Source, ElementName=image}" Value="{x:Null}">
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation BeginTime="0:0:0"
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.05" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<Grid Grid.Row="1" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
MaxHeight="60"
Padding="3"
FontSize="19"
FontWeight="SemiBold"
LineHeight="25"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap">
<TextBlock.Inlines>
<Run x:Name="filename" Text="FilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilename.ext" />
</TextBlock.Inlines>
</TextBlock>
</Grid>
<!-- Product Name -->
<TextBlock x:Name="productNameTitle"
Grid.Row="3"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Product Name" />
<TextBlock x:Name="productName"
Grid.Row="3"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Product Version -->
<TextBlock x:Name="productVersionTitle"
Grid.Row="4"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Product Version" />
<TextBlock x:Name="productVersion"
Grid.Row="4"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Manufacturer -->
<TextBlock x:Name="manufacturerTitle"
Grid.Row="5"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Manufacturer" />
<TextBlock x:Name="manufacturer"
Grid.Row="5"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Total Size -->
<TextBlock x:Name="totalSizeTitle"
Grid.Row="6"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Total Size" />
<TextBlock x:Name="totalSize"
Grid.Row="6"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Calculating size..." />
<!-- Last Modified -->
<TextBlock x:Name="modDateTitle"
Grid.Row="7"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Last Modified" />
<TextBlock x:Name="modDate"
Grid.Row="7"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis" />
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,91 @@
// 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.ExtensionMethods;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Plugin.AppViewer.PackageParsers.Msi;
using System;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace QuickLook.Plugin.AppViewer.InfoPanels;
public partial class MsiInfoPanel : UserControl, IAppInfoPanel
{
private readonly ContextObject _context;
public MsiInfoPanel(ContextObject context)
{
_context = context;
InitializeComponent();
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
productNameTitle.Text = TranslationHelper.Get("PRODUCT_NAME", translationFile);
productVersionTitle.Text = TranslationHelper.Get("PRODUCT_VERSION", translationFile);
manufacturerTitle.Text = TranslationHelper.Get("MANUFACTURER", translationFile);
totalSizeTitle.Text = TranslationHelper.Get("TOTAL_SIZE", translationFile);
modDateTitle.Text = TranslationHelper.Get("LAST_MODIFIED", translationFile);
}
public void DisplayInfo(string path)
{
_ = Task.Run(() =>
{
var scale = DisplayDeviceHelper.GetCurrentScaleFactor();
var icon =
WindowsThumbnailProvider.GetThumbnail(path,
(int)(128 * scale.Horizontal),
(int)(128 * scale.Vertical),
ThumbnailOptions.ScaleUp);
var source = icon?.ToBitmapSource();
icon?.Dispose();
Dispatcher.BeginInvoke(new Action(() => image.Source = source));
});
var name = Path.GetFileName(path);
filename.Text = string.IsNullOrEmpty(name) ? path : name;
_ = Task.Run(() =>
{
if (File.Exists(path))
{
var size = new FileInfo(path).Length;
MsiInfo msiInfo = MsiParser.Parse(path);
var last = File.GetLastWriteTime(path);
Dispatcher.Invoke(() =>
{
productName.Text = msiInfo.ProductName;
productVersion.Text = msiInfo.ProductVersion;
manufacturer.Text = msiInfo.Manufacturer;
totalSize.Text = size.ToPrettySize(2);
modDate.Text = last.ToString(CultureInfo.CurrentCulture);
_context.IsBusy = false;
});
}
});
}
}

View File

@@ -0,0 +1,266 @@
<UserControl x:Class="QuickLook.Plugin.AppViewer.InfoPanels.RpmInfoPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:QuickLook.Plugin.AppViewer"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontSize="14"
UseLayoutRounding="True"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="GroupBox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border x:Name="imageBk"
Grid.Row="1"
Grid.Column="0"
Width="124"
Height="124"
VerticalAlignment="Top"
CornerRadius="8">
<Image x:Name="image"
Width="120"
Height="120"
Opacity="0"
RenderOptions.BitmapScalingMode="HighQuality"
SnapsToDevicePixels="True"
Stretch="Fill"
UseLayoutRounding="True">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Source, ElementName=image}" Value="{x:Null}">
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation BeginTime="0:0:0"
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.05" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Border>
<Grid Grid.Row="1" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
MaxHeight="60"
Padding="3"
FontSize="19"
FontWeight="SemiBold"
LineHeight="25"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap">
<TextBlock.Inlines>
<Run x:Name="filename" Text="FilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilename.ext" />
</TextBlock.Inlines>
</TextBlock>
</Grid>
<!-- Application Name -->
<TextBlock x:Name="applicationNameTitle"
Grid.Row="3"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Application Name" />
<TextBlock x:Name="applicationName"
Grid.Row="3"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version -->
<TextBlock x:Name="versionTitle"
Grid.Row="4"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version" />
<TextBlock x:Name="version"
Grid.Row="4"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Architecture -->
<TextBlock x:Name="architectureTitle"
Grid.Row="5"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Architecture" />
<TextBlock x:Name="architectureName"
Grid.Row="5"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Vendor -->
<TextBlock x:Name="vendorTitle"
Grid.Row="6"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Vendor" />
<TextBlock x:Name="vendor"
Grid.Row="6"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Type -->
<TextBlock x:Name="typeTitle"
Grid.Row="7"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Type"
Visibility="Collapsed" />
<TextBlock x:Name="type"
Grid.Row="7"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap"
Visibility="Collapsed" />
<!-- Terminal -->
<TextBlock x:Name="terminalTitle"
Grid.Row="8"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Terminal"
Visibility="Collapsed" />
<TextBlock x:Name="terminal"
Grid.Row="8"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap"
Visibility="Collapsed" />
<!-- Total Size -->
<TextBlock x:Name="totalSizeTitle"
Grid.Row="9"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Total Size" />
<TextBlock x:Name="totalSize"
Grid.Row="9"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Calculating size..." />
<!-- Last Modified -->
<TextBlock x:Name="modDateTitle"
Grid.Row="10"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Last Modified" />
<TextBlock x:Name="modDate"
Grid.Row="10"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis" />
<!-- Environment -->
<GroupBox x:Name="environmentGroupBox"
Grid.Row="11"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="3,3,16,16"
Padding="3"
Background="{DynamicResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{DynamicResource CardStrokeColorDefaultBrush}"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Header="Environment"
Visibility="Collapsed">
<ScrollViewer VerticalScrollBarVisibility="Auto" Visibility="Collapsed">
<ScrollViewer.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
</ScrollViewer.Resources>
<ItemsControl x:Name="permissions">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Margin="8,3,16,3"
IsReadOnly="True"
Text="{Binding ., Mode=OneTime}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,96 @@
// 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.ExtensionMethods;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Plugin.AppViewer.PackageParsers.Rpm;
using System;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace QuickLook.Plugin.AppViewer.InfoPanels;
public partial class RpmInfoPanel : UserControl, IAppInfoPanel
{
private readonly ContextObject _context;
public RpmInfoPanel(ContextObject context)
{
_context = context;
DataContext = this;
InitializeComponent();
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
applicationNameTitle.Text = TranslationHelper.Get("APP_NAME", translationFile);
versionTitle.Text = TranslationHelper.Get("APP_VERSION", translationFile);
architectureTitle.Text = TranslationHelper.Get("ARCHITECTURE", translationFile);
vendorTitle.Text = TranslationHelper.Get("VENDOR", translationFile);
typeTitle.Text = TranslationHelper.Get("TYPE", translationFile);
terminalTitle.Text = TranslationHelper.Get("TERMINAL", translationFile);
totalSizeTitle.Text = TranslationHelper.Get("TOTAL_SIZE", translationFile);
modDateTitle.Text = TranslationHelper.Get("LAST_MODIFIED", translationFile);
environmentGroupBox.Header = TranslationHelper.Get("ENVIRONMENT", translationFile);
}
public void DisplayInfo(string path)
{
var name = Path.GetFileName(path);
filename.Text = string.IsNullOrEmpty(name) ? path : name;
_ = Task.Run(() =>
{
if (File.Exists(path))
{
var size = new FileInfo(path).Length;
RpmInfo rpmInfo = RpmParser.Parse(path);
var last = File.GetLastWriteTime(path);
Dispatcher.Invoke(() =>
{
applicationName.Text = rpmInfo.Name;
version.Text = rpmInfo.Version;
architectureName.Text = rpmInfo.Arch; // Not impl
vendor.Text = rpmInfo.Vendor;
type.Text = rpmInfo.Type; // Not impl
terminal.Text = rpmInfo.Terminal; // Not impl
totalSize.Text = size.ToPrettySize(2);
modDate.Text = last.ToString(CultureInfo.CurrentCulture);
permissions.ItemsSource = rpmInfo.Env; // Not impl
if (rpmInfo.HasIcon) // Not impl
{
image.Source = rpmInfo.Logo.ToBitmapSource();
}
else
{
imageBk.Background = new SolidColorBrush(OSThemeHelper.AppsUseDarkTheme() ? Colors.LightGray : Colors.White);
image.Source = new BitmapImage(new Uri("pack://application:,,,/QuickLook.Plugin.AppViewer;component/Resources/rpm.png"));
}
_context.IsBusy = false;
});
}
});
}
}

View File

@@ -0,0 +1,183 @@
<UserControl x:Class="QuickLook.Plugin.AppViewer.InfoPanels.WgtInfoPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:QuickLook.Plugin.AppViewer"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontSize="14"
UseLayoutRounding="True"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="GroupBox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="image"
Grid.Row="1"
Grid.Column="0"
Width="120"
Height="120"
Margin="8"
VerticalAlignment="Top"
Source="/QuickLook.Plugin.AppViewer;component/Resources/uni.png"
Stretch="Fill" />
<Grid Grid.Row="1" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="* " />
</Grid.RowDefinitions>
<Grid Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
MaxHeight="60"
Padding="3"
FontSize="19"
FontWeight="SemiBold"
LineHeight="25"
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap">
<TextBlock.Inlines>
<Run x:Name="filename" Text="FilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilenameFilename.ext" />
</TextBlock.Inlines>
</TextBlock>
</Grid>
<!-- Application Name -->
<TextBlock x:Name="applicationNameTitle"
Grid.Row="3"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Application Name" />
<TextBlock x:Name="applicationName"
Grid.Row="3"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version Name -->
<TextBlock x:Name="versionNameTitle"
Grid.Row="4"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version Name" />
<TextBlock x:Name="versionName"
Grid.Row="4"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Version Code -->
<TextBlock x:Name="versionCodeTitle"
Grid.Row="5"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Version Code" />
<TextBlock x:Name="versionCode"
Grid.Row="5"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis"
TextWrapping="Wrap" />
<!-- Total Size -->
<TextBlock x:Name="totalSizeTitle"
Grid.Row="6"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Total Size" />
<TextBlock x:Name="totalSize"
Grid.Row="6"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Calculating size..." />
<!-- Last Modified -->
<TextBlock x:Name="modDateTitle"
Grid.Row="7"
Grid.Column="1"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Last Modified" />
<TextBlock x:Name="modDate"
Grid.Row="7"
Grid.Column="2"
Margin="8,0,0,0"
Padding="3"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Text="Searching..."
TextTrimming="CharacterEllipsis" />
<!-- Permissions -->
<GroupBox x:Name="permissionsGroupBox"
Grid.Row="8"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="3,3,16,16"
Padding="3"
Background="{DynamicResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{DynamicResource CardStrokeColorDefaultBrush}"
Foreground="{DynamicResource WindowTextForegroundAlternative}"
Header="Capabilities">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ScrollViewer.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
</ScrollViewer.Resources>
<ItemsControl x:Name="permissions">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Margin="8,3,16,3"
IsReadOnly="True"
Text="{Binding ., Mode=OneTime}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,77 @@
// 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.ExtensionMethods;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
using QuickLook.Plugin.AppViewer.PackageParsers.Wgt;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace QuickLook.Plugin.AppViewer.InfoPanels;
public partial class WgtInfoPanel : UserControl, IAppInfoPanel
{
private readonly ContextObject _context;
public WgtInfoPanel(ContextObject context)
{
_context = context;
DataContext = this;
InitializeComponent();
string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config");
applicationNameTitle.Text = TranslationHelper.Get("APP_NAME", translationFile);
versionNameTitle.Text = TranslationHelper.Get("APP_VERSION_NAME", translationFile);
versionCodeTitle.Text = TranslationHelper.Get("APP_VERSION_CODE", translationFile);
totalSizeTitle.Text = TranslationHelper.Get("TOTAL_SIZE", translationFile);
modDateTitle.Text = TranslationHelper.Get("LAST_MODIFIED", translationFile);
permissionsGroupBox.Header = TranslationHelper.Get("PERMISSIONS", translationFile);
}
public void DisplayInfo(string path)
{
var name = Path.GetFileName(path);
filename.Text = string.IsNullOrEmpty(name) ? path : name;
_ = Task.Run(() =>
{
if (File.Exists(path))
{
var size = new FileInfo(path).Length;
WgtInfo wgtInfo = WgtParser.Parse(path);
var last = File.GetLastWriteTime(path);
Dispatcher.Invoke(() =>
{
applicationName.Text = wgtInfo.AppNameLocale ?? wgtInfo.AppName;
versionName.Text = wgtInfo.AppVersionName;
versionCode.Text = wgtInfo.AppVersionCode;
totalSize.Text = size.ToPrettySize(2);
modDate.Text = last.ToString(CultureInfo.CurrentCulture);
permissions.ItemsSource = wgtInfo.Permissions;
_context.IsBusy = false;
});
}
});
}
}

View File

@@ -0,0 +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/>.
namespace QuickLook.Plugin.AppViewer.PackageParsers.Apk;
public class AabInfo : ApkInfo;

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