Skip to content

Commit

Permalink
Remove related MenuType handling
Browse files Browse the repository at this point in the history
  • Loading branch information
HO-COOH committed Aug 19, 2024
1 parent 11309e4 commit 6032bc1
Show file tree
Hide file tree
Showing 15 changed files with 151 additions and 77 deletions.
18 changes: 18 additions & 0 deletions WinUI3Package/InvalidXamlMenuFlyoutTypeError.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*****************************************************************//**
* \file InvalidXamlMenuFlyoutTypeError.hpp
* \brief This class wraps up a typed exception for wrong MenuFlyout type used in xaml
*
* \author Peter
* \date August 2024
*********************************************************************/
#pragma once
#include <stdexcept>

class InvalidXamlMenuFlyoutTypeError : public std::invalid_argument
{
public:
InvalidXamlMenuFlyoutTypeError() :
invalid_argument{ "Invalid Xaml MenuFlyout type! Valid types are: Microsoft.UI.Xaml.Controls.MenuFlyout & WinUI3Package.PopupMenuFlyout" }
{
}
};
69 changes: 42 additions & 27 deletions WinUI3Package/PopupMenu.cpp
Original file line number Diff line number Diff line change
@@ -1,53 +1,76 @@
#include "pch.h"
#include "PopupMenu.h"
#include "TaskbarIconMessageWindow.h"

#include "MenuFlyoutItemBaseVisitor.hpp"

#if __has_include("winrt/Microsoft.UI.Xaml.Controls.h")
void PopupMenu::appendMenu(winrt::Windows::Foundation::Collections::IVector<winrt::Microsoft::UI::Xaml::Controls::MenuFlyoutItemBase> xamlMenu, HMENU menu)
void PopupMenu::appendMenu(winrt::Windows::Foundation::Collections::IVector<winrt::WinUI3Package::PopupMenuFlyoutItemBase> xamlMenu, HMENU menu)
{
ForEachMenuItem(xamlMenu,
[this, menu](winrt::Microsoft::UI::Xaml::Controls::MenuFlyoutItem const& item)
int index{};
for (auto item : xamlMenu)
{
switch (item.Type())
{
case winrt::WinUI3Package::PopupMenuFlyoutItemType::MenuFlyoutItem:
{
winrt::check_bool(AppendMenu(
menu,
NULL,
m_commands.size(),
item.Text().data()
index,
item.as<winrt::WinUI3Package::PopupMenuFlyoutItem>().Text().data()
));
m_commands.push_back({ item.Command(), item.CommandParameter() });
},
[this, menu](winrt::Microsoft::UI::Xaml::Controls::MenuFlyoutSeparator const& separator)
break;
}
case winrt::WinUI3Package::PopupMenuFlyoutItemType::MenuFlyoutSeparator:
{
winrt::check_bool(AppendMenu(
menu,
MF_SEPARATOR,
NULL,
NULL
));
},
[this, menu](winrt::Microsoft::UI::Xaml::Controls::MenuFlyoutSubItem const& subItem)
break;
}
case winrt::WinUI3Package::PopupMenuFlyoutItemType::SubMenu:
{
auto subItem = item.as<winrt::WinUI3Package::PopupMenuFlyoutSubItem>();
auto subMenu = CreatePopupMenu();
winrt::check_bool(AppendMenu(menu, MF_POPUP, reinterpret_cast<UINT_PTR>(subMenu), subItem.Text().data()));
winrt::check_bool(AppendMenu(
menu,
MF_POPUP,
reinterpret_cast<UINT_PTR>(subMenu),
subItem.Text().data()));
appendMenu(subItem.Items(), subMenu);
},

[this, menu](winrt::Microsoft::UI::Xaml::Controls::ToggleMenuFlyoutItem const& toggleItem)
break;
}
case winrt::WinUI3Package::PopupMenuFlyoutItemType::ToggleItem:
{
auto toggleItem = item.as<winrt::WinUI3Package::TogglePopupMenuFlyoutItem>();
winrt::check_bool(AppendMenu(
menu,
toggleItem.IsChecked() ? MF_CHECKED : MF_UNCHECKED,
m_commands.size(),
index,
toggleItem.Text().data()
));
m_commands.push_back({ toggleItem.Command(), toggleItem.CommandParameter() });
});
break;
}
case winrt::WinUI3Package::PopupMenuFlyoutItemType::RadioItem:
{
assert(false);
//not yet implemented
}
default:
assert(false);
break;
}
index++;
}
}

PopupMenu::PopupMenu(winrt::Microsoft::UI::Xaml::Controls::Primitives::FlyoutBase const& xamlMenuFlyout)
{
if (auto menuFlyout = xamlMenuFlyout.try_as<winrt::Microsoft::UI::Xaml::Controls::MenuFlyout>())
if (auto menuFlyout = xamlMenuFlyout.try_as<winrt::WinUI3Package::PopupMenuFlyout>())
appendMenu(menuFlyout.Items(), m_menu);
}
#endif
Expand All @@ -59,14 +82,6 @@ PopupMenu::~PopupMenu()

void PopupMenu::Show(POINT pt, HWND ownerHwnd)
{


/*test*/
//MENUITEMINFO info{ .cbSize = sizeof(info), .fMask = MIIM_DATA | MIIM_CHECKMARKS | MIIM_TYPE };
//winrt::check_bool(GetMenuItemInfo(m_menu, 1, true, &info));
//info.dwItemData = reinterpret_cast<ULONG_PTR>(L"Changed item");
//winrt::check_bool(SetMenuItemInfo(m_menu, 1, true, &info));

TrackPopupMenuEx(
m_menu,
TPM_LEFTALIGN,
Expand All @@ -80,5 +95,5 @@ void PopupMenu::Show(POINT pt, HWND ownerHwnd)

void PopupMenu::OnMenuClick(int index)
{
m_commands[index].first.Execute(m_commands[index].second);
//m_commands[index].first.Execute(m_commands[index].second);
}
9 changes: 3 additions & 6 deletions WinUI3Package/PopupMenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <winrt/Microsoft.UI.Xaml.Controls.Primitives.h>
#include <winrt/Microsoft.UI.Xaml.Input.h>
#endif

#include "MenuBase.h"
#include <vector>
#include <utility>
Expand All @@ -15,16 +16,12 @@ class PopupMenu : public MenuBase
{
HMENU m_menu = CreatePopupMenu();

#if __has_include("winrt/Microsoft.UI.Xaml.Controls.h")
public:
PopupMenu(winrt::Microsoft::UI::Xaml::Controls::Primitives::FlyoutBase const& xamlMenuFlyout);
std::vector<std::pair<winrt::Microsoft::UI::Xaml::Input::ICommand, winrt::Windows::Foundation::IInspectable>> m_commands;
private:
void appendMenu(
winrt::Windows::Foundation::Collections::IVector<winrt::Microsoft::UI::Xaml::Controls::MenuFlyoutItemBase> xamlMenu,
winrt::Windows::Foundation::Collections::IVector<winrt::WinUI3Package::PopupMenuFlyoutItemBase> xamlMenu,
HMENU menu);
#endif
public:
PopupMenu(winrt::Microsoft::UI::Xaml::Controls::Primitives::FlyoutBase const& xamlMenuFlyout);
~PopupMenu();

void Show(POINT pt, HWND ownerHwnd);
Expand Down
39 changes: 38 additions & 1 deletion WinUI3Package/PopupMenuFlyoutSubItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,42 @@

namespace winrt::WinUI3Package::implementation
{

winrt::Microsoft::UI::Xaml::DependencyProperty PopupMenuFlyoutSubItem::s_iconProperty =
winrt::Microsoft::UI::Xaml::DependencyProperty::Register(
L"Icon",
winrt::xaml_typename<winrt::Microsoft::UI::Xaml::Controls::IconElement>(),
winrt::xaml_typename<class_type>(),
nullptr
);
winrt::Microsoft::UI::Xaml::DependencyProperty PopupMenuFlyoutSubItem::s_textProperty =
winrt::Microsoft::UI::Xaml::DependencyProperty::Register(
L"Text",
winrt::xaml_typename<winrt::hstring>(),
winrt::xaml_typename<class_type>(),
nullptr
);
winrt::Microsoft::UI::Xaml::Controls::IconElement PopupMenuFlyoutSubItem::Icon()
{
return GetValue(IconProperty()).as<winrt::Microsoft::UI::Xaml::Controls::IconElement>();
}
void PopupMenuFlyoutSubItem::Icon(winrt::Microsoft::UI::Xaml::Controls::IconElement const& value)
{
SetValue(IconProperty(), value);
}
winrt::Microsoft::UI::Xaml::DependencyProperty PopupMenuFlyoutSubItem::IconProperty()
{
return s_iconProperty;
}
winrt::hstring PopupMenuFlyoutSubItem::Text()
{
return winrt::unbox_value<winrt::hstring>(GetValue(TextProperty()));
}
void PopupMenuFlyoutSubItem::Text(winrt::hstring const& value)
{
SetValue(TextProperty(), winrt::box_value(value));
}
winrt::Microsoft::UI::Xaml::DependencyProperty PopupMenuFlyoutSubItem::TextProperty()
{
return s_textProperty;
}
}
16 changes: 16 additions & 0 deletions WinUI3Package/PopupMenuFlyoutSubItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ namespace winrt::WinUI3Package::implementation
{
PopupMenuFlyoutSubItem() = default;

#pragma region Inheirted from PopupMenuFlyoutItemBase
constexpr winrt::WinUI3Package::PopupMenuFlyoutItemType Type() { return winrt::WinUI3Package::PopupMenuFlyoutItemType::SubMenu; }
#pragma endregion

winrt::Windows::Foundation::Collections::IVector<winrt::WinUI3Package::PopupMenuFlyoutItemBase> Items()
{
return nullptr;
Expand All @@ -17,6 +21,18 @@ namespace winrt::WinUI3Package::implementation
{

}

winrt::Microsoft::UI::Xaml::Controls::IconElement Icon();
void Icon(winrt::Microsoft::UI::Xaml::Controls::IconElement const& value);
static winrt::Microsoft::UI::Xaml::DependencyProperty IconProperty();

winrt::hstring Text();
void Text(winrt::hstring const& value);
static winrt::Microsoft::UI::Xaml::DependencyProperty TextProperty();

private:
static winrt::Microsoft::UI::Xaml::DependencyProperty s_iconProperty;
static winrt::Microsoft::UI::Xaml::DependencyProperty s_textProperty;
};
}

Expand Down
8 changes: 7 additions & 1 deletion WinUI3Package/PopupMenuFlyoutSubItem.idl
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,16 @@ namespace WinUI3Package
{
[bindable]
[default_interface]
runtimeclass PopupMenuFlyoutSubItem : Microsoft.UI.Xaml.Controls.Primitives.FlyoutBase
runtimeclass PopupMenuFlyoutSubItem : Microsoft.UI.Xaml.Controls.Primitives.FlyoutBase, WinUI3Package.PopupMenuFlyoutItemBase
{
PopupMenuFlyoutSubItem();

Microsoft.UI.Xaml.Controls.IconElement Icon;
static Microsoft.UI.Xaml.DependencyProperty IconProperty{ get; };

String Text;
static Microsoft.UI.Xaml.DependencyProperty TextProperty{ get; };

Windows.Foundation.Collections.IVector<WinUI3Package.PopupMenuFlyoutItemBase> Items;
}
}
22 changes: 1 addition & 21 deletions WinUI3Package/TaskbarIcon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,19 +84,7 @@ namespace winrt::WinUI3Package::implementation
if constexpr (!std::is_same_v<IconType, std::monostate>)
{
icon.Show();
switch (m_menuType)
{
case winrt::WinUI3Package::MenuType::Xaml:
icon.SetMenu<MenuFlyoutWrapper>(m_xamlMenuFlyout);
break;
case winrt::WinUI3Package::MenuType::Popup:
icon.SetMenu<PopupMenu>(m_xamlMenuFlyout);
break;
default:
assert(false);
break;
}

icon.SetMenu(m_xamlMenuFlyout);
icon.SetTheme(m_theme);
}
}, m_icon);
Expand All @@ -113,14 +101,6 @@ namespace winrt::WinUI3Package::implementation
}
}, m_icon);
}
winrt::WinUI3Package::MenuType TaskbarIcon::MenuType()
{
return m_menuType;
}
void TaskbarIcon::MenuType(winrt::WinUI3Package::MenuType value)
{
m_menuType = value;
}
winrt::event_token TaskbarIcon::LeftPressed(WinUI3Package::SignalDelegate const& handler)
{
return m_events.m_leftPressed.add(handler);
Expand Down
4 changes: 0 additions & 4 deletions WinUI3Package/TaskbarIcon.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,6 @@ namespace winrt::WinUI3Package::implementation
void Show();
void Remove();

winrt::WinUI3Package::MenuType MenuType();
void MenuType(winrt::WinUI3Package::MenuType value);

winrt::event_token LeftPressed(WinUI3Package::SignalDelegate const& handler);
winrt::event_token LeftDoublePressed(WinUI3Package::SignalDelegate const& handler);
winrt::event_token RightPressed(WinUI3Package::SignalDelegate const& handler);
Expand All @@ -76,7 +73,6 @@ namespace winrt::WinUI3Package::implementation
NormalTaskbarIcon& getNormalIcon();

winrt::Microsoft::UI::Xaml::Controls::Primitives::FlyoutBase m_xamlMenuFlyout{ nullptr };
winrt::WinUI3Package::MenuType m_menuType{ winrt::WinUI3Package::MenuType::Xaml };
TaskbarIconXamlEvents m_events;

std::variant<std::monostate, ThemeAdaptiveIcon, NormalTaskbarIcon> m_icon;
Expand Down
7 changes: 0 additions & 7 deletions WinUI3Package/TaskbarIcon.idl
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,6 @@ import "SettingsExpander.idl";

namespace WinUI3Package
{
enum MenuType
{
Xaml = 1,
Popup = 2
};

[bindable]
[default_interface]
[contentproperty("RightClickMenu")]
Expand Down Expand Up @@ -37,7 +31,6 @@ namespace WinUI3Package
/*Right click*/
Microsoft.UI.Xaml.Controls.Primitives.FlyoutBase RightClickMenu;
Microsoft.UI.Xaml.ElementTheme MenuTheme;
MenuType MenuType;

/*events*/
event WinUI3Package.SignalDelegate LeftPressed;
Expand Down
14 changes: 14 additions & 0 deletions WinUI3Package/TaskbarIconBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "GuidWrapper.h"
#include "TaskbarIconMessageWindow.h"
#include <windowsx.h>
#include "InvalidXamlMenuFlyoutTypeError.hpp"

PopupMenu& TaskbarIconBase::getPopupMenu()
{
Expand Down Expand Up @@ -32,6 +33,19 @@ void TaskbarIconBase::Remove()
m_iconData.Delete();
}

void TaskbarIconBase::SetMenu(winrt::Microsoft::UI::Xaml::Controls::Primitives::FlyoutBase const& xamlMenu)
{
if (m_menu.index() != 0)
return;

if (auto xamlMenuFlyout = xamlMenu.try_as<winrt::Microsoft::UI::Xaml::Controls::MenuFlyout>())
m_menu.emplace<MenuFlyoutWrapper>(xamlMenuFlyout).Theme(*m_theme);
else if (auto popupMenuFlyout = xamlMenu.try_as<winrt::WinUI3Package::PopupMenuFlyout>())
m_menu.emplace<PopupMenu>(popupMenuFlyout).Theme(*m_theme);
else
throw InvalidXamlMenuFlyoutTypeError{};
}

void TaskbarIconBase::SetEvents(TaskbarIconXamlEvents& events)
{
m_ptrXamlEvents = &events;
Expand Down
11 changes: 1 addition & 10 deletions WinUI3Package/TaskbarIconBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,7 @@ class TaskbarIconBase
void Show();
void Remove();

template<typename MenuType>
void SetMenu(winrt::Microsoft::UI::Xaml::Controls::Primitives::FlyoutBase const& xamlMenu)
{
if (m_menu.index() != 0)
return;

auto& menu = m_menu.emplace<MenuType>(xamlMenu);
if (m_theme)
menu.Theme(*m_theme);
}
void SetMenu(winrt::Microsoft::UI::Xaml::Controls::Primitives::FlyoutBase const& xamlMenu);

void SetEvents(TaskbarIconXamlEvents& events);

Expand Down
5 changes: 5 additions & 0 deletions WinUI3Package/TransparentMenuFlyoutHost.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,8 @@ void TransparentMenuFlyoutHost::Move(POINT p)
{
m_appWindow.MoveAndResize({ p.x, p.y, 1, 1 });
}

TransparentMenuFlyoutHost::~TransparentMenuFlyoutHost()
{
m_dummyWindow.Close();
}
2 changes: 2 additions & 0 deletions WinUI3Package/TransparentMenuFlyoutHost.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,6 @@ class TransparentMenuFlyoutHost

void Move(POINT p);
winrt::Microsoft::UI::Xaml::FrameworkElement GetFrame() { return m_dummyFrame; }

~TransparentMenuFlyoutHost();
};
1 change: 1 addition & 0 deletions WinUI3Package/WinUI3Package.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,7 @@
<ClInclude Include="include\WASDK headers\Microsoft.Graphics.Canvas.hpp" />
<ClInclude Include="include\WASDK headers\Microsoft.UI.hpp" />
<ClInclude Include="include\WASDK headers\Microsoft.Windows.Widgets.hpp" />
<ClInclude Include="InvalidXamlMenuFlyoutTypeError.hpp" />
<ClInclude Include="IsEqualStateTrigger.h">
<DependentUpon>IsEqualStateTrigger.idl</DependentUpon>
<SubType>Code</SubType>
Expand Down
Loading

0 comments on commit 6032bc1

Please sign in to comment.