Skip to content

Commit

Permalink
Remove scratch work
Browse files Browse the repository at this point in the history
  • Loading branch information
zadjii-msft committed Jul 22, 2022
1 parent c0b4840 commit 7268e96
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 249 deletions.
203 changes: 16 additions & 187 deletions scratch/ScratchIslandApp/SampleApp/MyPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,10 @@

#include "pch.h"
#include "MyPage.h"
#include "MySettings.h"
#include <LibraryResources.h>
#include "MyPage.g.cpp"
#include "..\..\..\src\cascadia\UnitTests_Control\MockControlSettings.h"
#include "..\..\..\src\types\inc\utils.hpp"
#include <Shlobj.h>
#include <Shlobj_core.h>
#include <wincodec.h>
#include <Windows.Graphics.Imaging.Interop.h>
#include "MySettings.h"

using namespace std::chrono_literals;
using namespace winrt::Microsoft::Terminal;

Expand All @@ -22,9 +17,6 @@ namespace winrt
using IInspectable = Windows::Foundation::IInspectable;
}

using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Windows::Storage::Streams;

namespace winrt::SampleApp::implementation
{
MyPage::MyPage()
Expand All @@ -34,187 +26,24 @@ namespace winrt::SampleApp::implementation

void MyPage::Create()
{
}
#pragma region BitmapIconSource
template<typename TIconSource>
struct BitmapIconSource
{
};

template<>
struct BitmapIconSource<winrt::Microsoft::UI::Xaml::Controls::IconSource>
{
using type = winrt::Microsoft::UI::Xaml::Controls::BitmapIconSource;
};

template<>
struct BitmapIconSource<winrt::Windows::UI::Xaml::Controls::IconSource>
{
using type = winrt::Windows::UI::Xaml::Controls::BitmapIconSource;
};
#pragma endregion

winrt::Windows::UI::Xaml::Controls::IconSource _getColoredBitmapIcon(const winrt::hstring& path)
{
if (!path.empty())
{
try
{
winrt::Windows::Foundation::Uri iconUri{ path };
winrt::Windows::UI::Xaml::Controls::BitmapIconSource iconSource{};
// Make sure to set this to false, so we keep the RGB data of the
// image. Otherwise, the icon will be white for all the
// non-transparent pixels in the image.
iconSource.ShowAsMonochrome(false);
iconSource.UriSource(iconUri);
return iconSource;
}
CATCH_LOG();
}

return nullptr;
}
winrt::Windows::UI::Xaml::Controls::IconSource IconSourceWUX(hstring path)
{
return _getColoredBitmapIcon(path);
}
auto settings = winrt::make_self<implementation::MySettings>();

winrt::Windows::Graphics::Imaging::SoftwareBitmap MyConvertToSoftwareBitmap(HICON hicon,
winrt::Windows::Graphics::Imaging::BitmapPixelFormat pixelFormat,
winrt::Windows::Graphics::Imaging::BitmapAlphaMode alphaMode,
IWICImagingFactory* imagingFactory)
{
// Load the icon into an IWICBitmap
wil::com_ptr<IWICBitmap> iconBitmap;
THROW_IF_FAILED(imagingFactory->CreateBitmapFromHICON(hicon, iconBitmap.put()));
auto connectionSettings{ TerminalConnection::ConptyConnection::CreateSettings(L"cmd.exe /k echo This TermControl is hosted in-proc...",
winrt::hstring{},
L"",
nullptr,
32,
80,
winrt::guid()) };

// Put the IWICBitmap into a SoftwareBitmap. This may fail if WICBitmap's format is not supported by
// SoftwareBitmap. CreateBitmapFromHICON always creates RGBA8 so we're ok.
auto softwareBitmap = winrt::capture<winrt::Windows::Graphics::Imaging::SoftwareBitmap>(
winrt::create_instance<ISoftwareBitmapNativeFactory>(CLSID_SoftwareBitmapNativeFactory),
&ISoftwareBitmapNativeFactory::CreateFromWICBitmap,
iconBitmap.get(),
false);

// Convert the pixel format and alpha mode if necessary
if (softwareBitmap.BitmapPixelFormat() != pixelFormat || softwareBitmap.BitmapAlphaMode() != alphaMode)
{
softwareBitmap = winrt::Windows::Graphics::Imaging::SoftwareBitmap::Convert(softwareBitmap, pixelFormat, alphaMode);
}

return softwareBitmap;
}

winrt::Windows::Graphics::Imaging::SoftwareBitmap MyGetBitmapFromIconFileAsync(const winrt::hstring& iconPath,
int32_t iconIndex,
uint32_t iconSize)
{
wil::unique_hicon hicon;
LOG_IF_FAILED(SHDefExtractIcon(iconPath.c_str(), iconIndex, 0, &hicon, nullptr, iconSize));
// "Microsoft.Terminal.TerminalConnection.ConptyConnection"
winrt::hstring myClass{ winrt::name_of<TerminalConnection::ConptyConnection>() };
TerminalConnection::ConnectionInformation connectInfo{ myClass, connectionSettings };

if (!hicon)
{
return nullptr;
}
TerminalConnection::ITerminalConnection conn{ TerminalConnection::ConnectionInformation::CreateConnection(connectInfo) };
Control::TermControl control{ *settings, *settings, conn };

wil::com_ptr<IWICImagingFactory> wicImagingFactory;
THROW_IF_FAILED(CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&wicImagingFactory)));

return MyConvertToSoftwareBitmap(hicon.get(), BitmapPixelFormat::Bgra8, BitmapAlphaMode::Premultiplied, wicImagingFactory.get());
}

winrt::fire_and_forget MyPage::CreateClicked(const IInspectable& sender,
const WUX::Input::TappedRoutedEventArgs& eventArgs)
{
// Try:
// * c:\Windows\System32\SHELL32.dll, 210
// * c:\Windows\System32\notepad.exe, 0
// * C:\Program Files\PowerShell\6-preview\pwsh.exe, 0 (this doesn't exist for me)
// * C:\Program Files\PowerShell\7\pwsh.exe, 0
auto text{ GuidInput().Text() };
auto index{ static_cast<int>(IconIndex().Value()) };

co_await winrt::resume_background();
auto swBitmap{ MyGetBitmapFromIconFileAsync(text, index, 32) };
if (swBitmap == nullptr)
{
co_return;
}
co_await winrt::resume_foreground(Dispatcher());
winrt::Windows::UI::Xaml::Media::Imaging::SoftwareBitmapSource bitmapSource{};
co_await bitmapSource.SetBitmapAsync(swBitmap);
co_await winrt::resume_foreground(Dispatcher());

winrt::Microsoft::UI::Xaml::Controls::ImageIconSource imageIconSource{};
imageIconSource.ImageSource(bitmapSource);
winrt::Microsoft::UI::Xaml::Controls::ImageIcon icon{};
icon.Source(bitmapSource);
icon.Width(32);
icon.Height(32);
InProcContent().Children().Append(icon);

//winrt::Windows::UI::Xaml::Controls::IconSourceElement ise;
//auto casted = imageIconSource.try_as<winrt::Windows::UI::Xaml::Controls::IconSource>();
//ise.IconSource(casted);
//icon.Width(32);
//icon.Height(32);
//InProcContent().Children().Append(icon);

/*NOT this
// WUX::Controls::MenuFlyout menu;
WUX::Controls::MenuFlyoutItem foo;
// auto toWux = icon.try_as<WUX::Controls::IconElement>();
WUX::Controls::IconSourceElement wuxIconSourceElem;
wuxIconSourceElem.IconSource(imageIconSource);
foo.Icon(wuxIconSourceElem); // toWux
foo.Text(text);
MyMenu().Items().Append(foo);
*/

// WUX::Controls::MenuFlyout menu;
// WUX::Controls::MenuFlyoutItem foo;
// auto toWux = icon.try_as<WUX::Controls::IconElement>();
// wuxIconSourceElem.IconSource(imageIconSource);
// foo.Icon(toWux); // toWux
// foo.Text(text);
// MyMenu().Items().Append(foo);

// const auto iconSource{ IconSourceWUX(text) };
// WUX::Controls::IconSourceElement iconElement;
// iconElement.IconSource(imageIconSource);

/////////////////// Try #4
winrt::Microsoft::UI::Xaml::Controls::ImageIcon icon2{};
icon2.Source(bitmapSource);
icon2.Width(32);
icon2.Height(32);
WUX::Controls::MenuFlyoutItem foo;
foo.Icon(icon2);
foo.Text(text);
MyMenu().Items().Append(foo);
}

void MyPage::CloseClicked(const IInspectable& /*sender*/,
const WUX::Input::TappedRoutedEventArgs& /*eventArgs*/)
{
auto text{ GuidInput().Text() };
auto bitmapSource = IconSourceWUX(text);
// winrt::Microsoft::UI::Xaml::Controls::ImageIconSource imageIconSource{};
// imageIconSource.ImageSource(bitmapSource);
winrt::Windows::UI::Xaml::Controls::IconSourceElement icon{};
icon.IconSource(bitmapSource);
icon.Width(32);
icon.Height(32);
InProcContent().Children().Append(icon);
}

void MyPage::KillClicked(const IInspectable& /*sender*/,
const WUX::Input::TappedRoutedEventArgs& /*eventArgs*/)
{
InProcContent().Children().Append(control);
}

// Method Description:
Expand Down
9 changes: 1 addition & 8 deletions scratch/ScratchIslandApp/SampleApp/MyPage.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,11 @@ namespace winrt::SampleApp::implementation
MyPage();

void Create();
hstring Title();

winrt::fire_and_forget CreateClicked(const IInspectable& sender, const Windows::UI::Xaml::Input::TappedRoutedEventArgs& eventArgs);
void CloseClicked(const IInspectable& sender, const Windows::UI::Xaml::Input::TappedRoutedEventArgs& eventArgs);
void KillClicked(const IInspectable& sender, const Windows::UI::Xaml::Input::TappedRoutedEventArgs& eventArgs);
hstring Title();

private:
friend struct MyPageT<MyPage>; // for Xaml to bind events

wil::unique_process_information piContentProcess;

winrt::fire_and_forget _writeToLog(std::wstring_view str);
};
}

Expand Down
62 changes: 14 additions & 48 deletions scratch/ScratchIslandApp/SampleApp/MyPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,31 +22,10 @@
<StackPanel Orientation="Horizontal">
<TextBox x:Name="GuidInput"
Width="400"
Margin="8"
PlaceholderText="path here"
Text="C:\Program Files\PowerShell\7\pwsh.exe" />
<mux:NumberBox x:Name="IconIndex"
Margin="8" />
<Button x:Name="CreateOutOfProcControl"
Margin="8"
Tapped="CreateClicked">
Load HICON
PlaceholderText="{}{guid here}" />
<Button Grid.Row="0">
Create
</Button>
<Button x:Name="Close"
Margin="8"
Tapped="CloseClicked">
Load as image
</Button>
<SplitButton x:Name="Demo"
Margin="8">
Lookie here
<SplitButton.Flyout>
<MenuFlyout x:Name="MyMenu">
<MenuFlyoutItem>first</MenuFlyoutItem>
</MenuFlyout>
</SplitButton.Flyout>
</SplitButton>


</StackPanel>

Expand All @@ -60,34 +39,21 @@
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

<StackPanel x:Name="InProcContent"
Grid.Column="0"
Padding="16"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="#ff0000"
Orientation="Vertical" />

<Grid Grid.Column="1"
<Grid x:Name="InProcContent"
Grid.Column="0"
Padding="16"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
VerticalAlignment="Stretch"
Background="#ff0000" />

<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid x:Name="OutOfProcContent"
Grid.Column="1"
Padding="16"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="#0000ff" />

<StackPanel x:Name="Log"
Grid.Row="0"
Orientation="Vertical" />

<Grid x:Name="OutOfProcContent"
Grid.Row="1"
Padding="16"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="#0000ff" />
</Grid>

</Grid>

Expand Down
4 changes: 0 additions & 4 deletions scratch/ScratchIslandApp/SampleApp/pch.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,6 @@
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Foundation.Metadata.h>
#include <winrt/Windows.Graphics.Display.h>
#include <winrt/Windows.Graphics.Imaging.h>
// #include <winrt/Windows.Graphics.Imaging.Interop.h>
#include <winrt/windows.ui.core.h>
#include <winrt/Windows.ui.input.h>
#include <winrt/Windows.UI.Text.h>
Expand All @@ -43,12 +41,10 @@
#include <winrt/Windows.UI.Xaml.Data.h>
#include <winrt/Windows.ui.xaml.media.h>
#include <winrt/Windows.UI.Xaml.Media.Animation.h>
#include <winrt/Windows.UI.Xaml.Media.Imaging.h>
#include <winrt/Windows.ui.xaml.input.h>
#include <winrt/Windows.UI.Xaml.Hosting.h>
#include "winrt/Windows.UI.Xaml.Markup.h"
#include "winrt/Windows.UI.ViewManagement.h"
#include "winrt/Windows.Storage.Streams.h"

#include <winrt/Microsoft.Toolkit.Win32.UI.XamlHost.h>
#include <winrt/Microsoft.UI.Xaml.Controls.h>
Expand Down
4 changes: 2 additions & 2 deletions scratch/ScratchIslandApp/WindowExe/SampleIslandWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ void SampleIslandWindow::MakeWindow() noexcept
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
1024,
860,
CW_USEDEFAULT,
CW_USEDEFAULT,
nullptr,
nullptr,
wc.hInstance,
Expand Down

0 comments on commit 7268e96

Please sign in to comment.