mirror of
https://github.com/microsoft/PowerToys.git
synced 2024-12-23 16:37:58 +08:00
83ce8a2197
* Added project template for common library * Added reference to stylecop.json * Fixed xml documetation file path for common project * Added reference to stylecop.json * Added COM interface interpolations to C# * Changed namespace to Common * Added xml doc to com interfaces * Removed AnyCPU configuration from solution file * Added Preview Hander and form User Control Implementation * Fix stylecop warnings * Added test control and handler * Added Xaml description for preview handler * Added Xml documenatation * Updated the control to form * Added registration and unregistration logic for the handler * Moved the files in separate folder and fix PR comments * updated the name of previewhandler class to base class * Added the DoPreview to PreviewHandlerControl Interface * Modified the Dopreview and Unload as virtual method * Uncommented the DocumentText to help bug repro * HTML Parsing Extension for preview pane markdown renderer (#1108) * Added Extension for html post processing * Added unit test poroject for preview pane * Added pipline test and base test function * Added Tests for extension * Added tests for url slashes * Added tests for url and figure caption * Markdown preview pane (#1128) * Added Extension for html post processing * Added unit test poroject for preview pane * Added pipline test and base test function * Added Tests for extension * Added handler and control for markdown * Tests added * Locally working version for markdown * Working image relative url's in markdown * Added CSS to preview display * Updates CSS for code block * Removed html file write comment in markdown control * Updated assembly version and web browser control test * Add Svg preview handler (#1129) * Added a new project for Svg preview handler * Added initial implementation of Svg Preview Handler * Fixed output path * Added Unit Test Project * Added StreamWrapper and Update Svg Control * Updated Svg Handler Guid * Removed migration backup folder * Removed Fluent Assertions NuGet * Added Comments for StreamWrapper * Removed the manual GC collect * Added unit tests for Svg preview Handler * Updated the xml doc for stream wrapper * User/lamotile/add_powerpreviewsettings (#1075) * Added powersettings to PowerToys Settings UI * added settings library * updated settings-web * updated project oncfiguration * updated project onfiguration * updated project .sln file * removed .etl file and added it to git-ignore * separated the PowerPreviewModule into split classes .cpp and .h * moved PowerPreviewModule implemnetations to .cpp file * fixed StringTable formatter * fixed spacing in resource.h * added m_ to member varibales * initiliaze m_isPreviewEnabled in the base class * removed duplication of objects by using pass by refference and std::move * made the getters const * updated naming convention * Split test calsses * Add const string * Replaced move with const string * Made attributes private * Made attributes private * removed unused constructor * Update resource.h formatted resource.h * Adding unit tests for preview handler common (#1156) * Changed the name of the Common library to PreviewHandlerCommon * Added unit tests project for PreviewHandlerCommon * Updated ComInterop accessor type * Added unit tests for PreviewHandlerbase * Added tests for file and stream based handler * Added unit tests for StreamWrapper * Added form handler unit tests * Added Unit tests for FormHandlerControl * Added file header * Add Powerpreview project * Add spacing in sln file * swapped string refferences (#1199) * added registry methods and enable/disable preview handlers (#1230) * added registry methods and enable/disable preview handlers * formatted .rc file. * formatted resource file * formatted .rc file. * formatted settings.cpp * formatted settings.h * formatted SVGPreviewSettingsClassTest.cpp * Formatted MarkDownPreviewSettingsClassTest.cpp * using wide strings * formatted settings.h * FileExplorerPreviewSettingsTest.cpp formatting * fixed typo and formatting * closing Registry and fixing typos * formmarted code using ctrl+k+d * fixed naming * fixed typo * changed if/else reverse order * Markdown preview pane (#1220) * Added rich text bar for information display * Added infobar * Added tests for extension and markdown control * Added xml docstring for markdown preview handler control * Updated assembly file for markdown preview pane * Updated removal of script tag without modifying CSS * Added info bar text string to resource file. * Removed error with infobar display on first rendering * Updated assembly version * Remove script and image element from Svg (#1231) * Added implementation to remove script and image tag * Added Unit tests for SvgPreviewHandlerHelper * Updated Unit tests for SvgPreviewControl * Moved the hardcoded string to resource file * Changed the LocalMachine to CurrentUser for preview handler registration * Added unit tests for multiple blocked elements tags * User/lamotile/update settings objects (#1263) * added registry methods and enable/disable preview handlers * formatted .rc file. * formatted resource file * formatted .rc file. * formatted settings.cpp * formatted settings.h * formatted SVGPreviewSettingsClassTest.cpp * Formatted MarkDownPreviewSettingsClassTest.cpp * using wide strings * formatted settings.h * FileExplorerPreviewSettingsTest.cpp formatting * fixed typo and formatting * closing Registry and fixing typos * formmarted code using ctrl+k+d * fixed naming * fixed typo * changed if/else reverse order * updated setiings_objects.cpp * removed changes on files that are not part of this PR * removed const ref on primative types * updated pass by ref semantic and removed pas by reff on primative types * fixed spaces in the commas * fixed spaces in brackets * Preview pane telemetry (#1299) * Added telemetry base class and markdown telemetry class * Updated docstring for telemetry event. * Added telemetry to markdown for error * Added try catch for markdown preview handler and display error bar * Updated markdown telemetry to make event names global variable * Updated parameter name to camel casing and telemetry event name naming. * Corrected assembbly version for svg renderer * Markdown Image files display (#1303) * Added telemetry base class and markdown telemetry class * Updated docstring for telemetry event. * Added telemetry to markdown for error * Added try catch for markdown preview handler and display error bar * Updated markdown telemetry to make event names global variable * Updated Markdown preview to display without vertical scrollbar and removed xml doc to html agility pack. * Updated parameter name to camel casing and telemetry event name naming. * Corrected assembbly version for svg renderer * Removed duplicate function * Add telemetry for Svg preview handler (#1314) * Added telemetry events for Svg Preview Handler * Added unit test in case preview handler throws * Updated the Error event name * Remove the not required return statement * User/lamotile/add read me (#1332) * add readme * moved images * re-added images' * Fixed gramma * Update figure number refference * improve preview handler intergration (#1319) * improve preview handler intergration * Fixed typo * updated typo * updated enable() function * updated is enabled() * re-updated is enabled() * added this-> key word * (0.16) - Install preview handler with msix (#1339) * Removed the registration logic from preview handlers * Updated the output path * Added logic to shim the activation of .net assembly * Updated manifest file * Fix the allowedsilenttakeover filed in manifest * Updated the appxmanifest file * Added AllowSilentDefaultTakeOver in manifest * Fix returned error code by DllGetClassObject * Moved the CLSID to a common header file * Added info about where CLSID needs to be updated * Added a .reg file for the Keys added in registry.dat * Added comments for DllGetClassObject * Svg Preview Handler block external component (#1368) * Removed the registration logic from preview handlers * Updated the output path * Added logic to shim the activation of .net assembly * Updated manifest file * Fix the allowedsilenttakeover filed in manifest * Updated the appxmanifest file * Added AllowSilentDefaultTakeOver in manifest * Fix returned error code by DllGetClassObject * Moved the CLSID to a common header file * Added info about where CLSID needs to be updated * Added a .reg file for the Keys added in registry.dat * Added comments for DllGetClassObject * Extended WebBrowserSite for setting flags in DISPID_AMBIENT_DLCONTROL * Added XML Documenatation * Removed the logic for deleting image and script element from Svg * Updated Unit Tests * Updated typecast of uint * Forwarded calls to Type.InvokeMember * Resolve PR Comments * Adding MSI Installation for Preview Handler (#1436) * Updated wxs for including dll and registry keys for preview handlers * Changed the casing for registry key * Resolve PR Comments * Added comments for File element * Call GC on preview unloading (#1456) * Call GC collect on preview unloading * Added github issue link * Update Web browser control for Markdown Previewer (#1464) * Updated Webbrowser control * Updated Unit tests * Disabled Navigation for Svg Previewer * Fix power preview unit tests (#1508) * Decoupled registry interaction logic * Updated File explorer settings * Updated unit tests for PowerPreview Settings * Added Asserrtion for Scope of registry key * Updated the registry value to match with installation registry value * Sync master settings.cpp * Merge settings changes from PreviewHandlers * Remove newline changes added into in example_powertoy\trace.cpp * Chaned .net framework to 4.7.2 * Updated Csproj files to auto generate Assembly.info files * Updated msi installer to use version variable for preview handlers assembly * Removed the signing of Assembly and updated wxs to not include PublicKeyToken * Updated the Path in Packaginglayout.xml to modules from Gac and the registry hive binary * Regenerated updated JS and html file * Resolve PR Comments * Readded the wprp file Co-authored-by: Divyansh <divyan@microsoft.com> Co-authored-by: Divyansh <somm14divi@gmail.com> Co-authored-by: Lavius Motileng <58791731+laviusmotileng-ms@users.noreply.github.com>
175 lines
5.5 KiB
Markdown
175 lines
5.5 KiB
Markdown
<center>
|
|
|
|
<img width="200" src="../../../doc/images/Logo.jpg">
|
|
|
|
# PowerPreview
|
|
> Adding Custom Preview Handlers to Windows File Explorer Preview Pane.
|
|
|
|
[**Overview**](#overview) ·
|
|
[**Developing**](#Developing) ·
|
|
[**MSIX Integration**](#Install-With-MSIX) ·
|
|
[**Contributing »**](#Contributing)
|
|
</center>
|
|
|
|
## Overview
|
|
|
|
Preview handlers are called when an item is selected to show a lightweight, rich, read-only preview of the file's contents in the view's reading pane. This is done without launching the file's associated application. Figure 1 shows an example of a preview handler that preview a .md file type. Please follow this [documentation](https://docs.microsoft.com/en-us/archive/msdn-magazine/2007/january/windows-vista-and-office-writing-your-own-preview-handlers) to start developing a preview handler, when done, continue with this documentation to learn how to integrate a preview handler into PowerToys.
|
|
|
|
<center>
|
|
|
|
<figure>
|
|
<img src="../../../doc/images/preview_pane/markdown.gif" alt="Mark Down Preview Handler Demo" >
|
|
<figcaption>Figure 1 : Mark Down Preview Handler Demo</figcaption>
|
|
</figure>
|
|
|
|
</center>
|
|
|
|
## Developing
|
|
|
|
We have already done most of the development work in the [PreviewHandlerCommon](./common/cominterop/IPreviewHandler.cs) common project. To add a preview for the file type of .xyz:
|
|
|
|
- Add a new .NET project in the preview pane folder.
|
|
- Add a reference to the `PreviewHandlerCommon` common project.
|
|
- Create your preview handler class and extend the FileBasedPreviewHandler class. See an example below:
|
|
|
|
```csharp
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using Common;
|
|
|
|
namespace XYZPreviewHandler
|
|
{
|
|
/// <summary>
|
|
/// Implementation of preview handler for .xyz files.
|
|
/// GUID = CLSID / CLASS ID.
|
|
/// </summary>
|
|
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx")]
|
|
[ClassInterface(ClassInterfaceType.None)]
|
|
[ComVisible(true)]
|
|
public class XYZPreviewHandler : FileBasedPreviewHandler
|
|
{
|
|
private XYZPreviewHandlerControl xyzPreviewHandlerControl;
|
|
|
|
/// Call your rendering method here.
|
|
public override void DoPreview()
|
|
{
|
|
this.xyzPreviewHandlerControl.DoPreview(this.FilePath);
|
|
}
|
|
|
|
protected override IPreviewHandlerControl CreatePreviewHandlerControl()
|
|
{
|
|
this.xyzPreviewHandlerControl = new xyzPreviewHandlerControl();
|
|
return this.xyzPreviewHandlerControl;
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Create a separate Preview Handler Control class and extend the `FormHandlerControl` Class.
|
|
|
|
```csharp
|
|
using Common;
|
|
|
|
namespace XYZPreviewHandler
|
|
{
|
|
public class XYZPreviewHandlerControl : FormHandlerControl
|
|
{
|
|
public XYZPreviewHandlerControl()
|
|
{
|
|
// ... do your initializations here.
|
|
}
|
|
|
|
public override void DoPreview<T>(T dataSource)
|
|
{
|
|
// ... add your preview rendering code here.
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
|
|
#### Integrate the Preview Handler into PowerToys Settings:
|
|
|
|
Navigate to the [powerpreview](../previewpane/powerpreview/powerpreview.h) project and edit the `powerpreview.h` file. Add the following Settings Object instance to `m_previewHandlers` settings objects array in the constructor initialization:
|
|
|
|
```cpp
|
|
// XYZ Preview Handler Settings Object.
|
|
FileExplorerPreviewSettings(
|
|
false,
|
|
L"<--YOUR_TOGGLE_CONTROL_ID-->",
|
|
L"<--A description of your preview handler-->",
|
|
L"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx", // your preview handler CLSID.
|
|
L"<--A display name for your preview handler-->")
|
|
```
|
|
|
|
## Install With MSIX
|
|
|
|
<---To Do--->
|
|
```xml
|
|
|
|
```
|
|
|
|
## Managing Preview Handlers
|
|
|
|
After successful integration, your preview handler should appear in the PowerToys settings UI under the `File Explorer Preview` Tab as shown in Figure 2 below. In here you should be able to enable and disable your preview handler.
|
|
|
|
<center>
|
|
|
|
<figure>
|
|
<img src="../../../doc/images/preview_pane/settings-ui.png" alt="Settings UI - File Explorer Preview Tab" >
|
|
<figcaption>Figure 2 : Settings UI - File Explorer Preview Tab</figcaption>
|
|
</figure>
|
|
|
|
</center>
|
|
|
|
In the general settings of the Settings UI, you should be able to disable and enable all the preview handlers all at once. See Figure 3.
|
|
|
|
<center>
|
|
|
|
<figure>
|
|
<img src="../../../doc/images/preview_pane/general-settings.png" alt="Settings UI - General Settings Tab" >
|
|
<figcaption>Figure 3 : Settings UI - General Settings Tab</figcaption>
|
|
</figure>
|
|
|
|
</center>
|
|
|
|
## Contributing
|
|
|
|
### Coding Guidance
|
|
|
|
#### Working With Strings
|
|
|
|
**YOU SHOULD NOT** have hardcoded strings in your C++ code. Instead, use the following guidelines to add strings to your code. Add the ID of your string to the resource file. XXX must be a unique int in the list (mostly the int ID of the last string id plus one):
|
|
|
|
- `resource.h`:
|
|
|
|
```cpp
|
|
#define IDS_PREVPANE_XYZ_SETTINGS_DISPLAYNAME XXX
|
|
```
|
|
|
|
- `powerpreview.rc` under strings table:
|
|
|
|
```cpp
|
|
IDS_PREVPANE_XYZ_SETTINGS_DISPLAYNAME L"XYZ Preview Handler"
|
|
```
|
|
|
|
- Use the `GET_RESOURCE_STRING(UINT resource_id)` method to consume strings in your code.
|
|
```cpp
|
|
#include <common.h>
|
|
|
|
extern "C" IMAGE_DOS_HEADER __ImageBase;
|
|
|
|
std::wstring GET_RESOURCE_STRING(IDS_PREVPANE_XYZ_SETTINGS_DISPLAYNAME)
|
|
```
|
|
|
|
#### More On Coding Guidance
|
|
Please review these brief docs below relating to our coding standards etc.
|
|
|
|
> 👉 If you find something missing from these docs, feel free to contribute to any of our documentation files anywhere in the repository (or make some new ones\!)
|
|
|
|
|
|
|
|
* [Coding Style](../../../doc/devdocs/style.md)
|
|
* [Code Organization](../../../doc/devdocs/readme.md)
|
|
|