include/vcl/menubtn.hxx | 7 +++++- vcl/source/control/menubtn.cxx | 46 ++++++++++++++++++++++++++++------------- 2 files changed, 38 insertions(+), 15 deletions(-)
New commits: commit 4b7435e31ac821d1738eda23a6688461efcbd311 Author: Caolán McNamara <caol...@redhat.com> Date: Wed Nov 2 17:26:03 2016 +0000 let menu button launch arbitrary floating windows and not just menus, this is like how the gtk equivalent can launch popovers Change-Id: I53ae96aab0c51d75405dba15ab8080d7315471e3 diff --git a/include/vcl/menubtn.hxx b/include/vcl/menubtn.hxx index e6b7015..5bff050 100644 --- a/include/vcl/menubtn.hxx +++ b/include/vcl/menubtn.hxx @@ -23,6 +23,7 @@ #include <vcl/button.hxx> #include <vcl/dllapi.h> +class FloatingWindow; class Timer; class PopupMenu; class VclBuilder; @@ -35,6 +36,7 @@ private: Timer* mpMenuTimer; VclPtr<PopupMenu> mpMenu; + VclPtr<FloatingWindow> mpFloatingWindow; sal_uInt16 mnCurItemId; bool mbDelayMenu; Link<MenuButton*,void> maActivateHdl; @@ -70,9 +72,12 @@ public: //before being shown void SetDelayMenu(bool bDelay) { mbDelayMenu = bDelay; } - void SetPopupMenu( PopupMenu* pNewMenu ); + void SetPopupMenu(PopupMenu* pNewMenu); PopupMenu* GetPopupMenu() const { return mpMenu; } + void SetPopover(FloatingWindow* pFloatingWindow); + FloatingWindow* GetPopover() const { return mpFloatingWindow; } + sal_uInt16 GetCurItemId() const { return mnCurItemId; } OString GetCurItemIdent() const; diff --git a/vcl/source/control/menubtn.cxx b/vcl/source/control/menubtn.cxx index b3a0167..6b62d84 100644 --- a/vcl/source/control/menubtn.cxx +++ b/vcl/source/control/menubtn.cxx @@ -20,6 +20,7 @@ #include <tools/rc.h> #include <vcl/decoview.hxx> #include <vcl/event.hxx> +#include <vcl/floatwin.hxx> #include <vcl/menu.hxx> #include <vcl/timer.hxx> #include <vcl/menubtn.hxx> @@ -39,20 +40,29 @@ void MenuButton::ExecuteMenu() { Activate(); - if ( mpMenu ) + if (!mpMenu && !mpFloatingWindow) + return; + + Size aSize = GetSizePixel(); + SetPressed( true ); + EndSelection(); + if (mpMenu) { - Point aPos( 0, 1 ); - Size aSize = GetSizePixel(); - Rectangle aRect( aPos, aSize ); - SetPressed( true ); - EndSelection(); - mnCurItemId = mpMenu->Execute( this, aRect, PopupMenuFlags::ExecuteDown ); - SetPressed( false ); - if ( mnCurItemId ) - { - Select(); - mnCurItemId = 0; - } + Point aPos(0, 1); + Rectangle aRect(aPos, aSize ); + mnCurItemId = mpMenu->Execute(this, aRect, PopupMenuFlags::ExecuteDown); + } + else + { + Point aPos(GetParent()->OutputToScreenPixel(GetPosPixel())); + Rectangle aRect(aPos, aSize ); + mpFloatingWindow->StartPopupMode(aRect, FloatWinPopupFlags::Down | FloatWinPopupFlags::GrabFocus); + } + SetPressed(false); + if (mnCurItemId) + { + Select(); + mnCurItemId = 0; } } @@ -152,7 +162,7 @@ void MenuButton::Select() maSelectHdl.Call( this ); } -void MenuButton::SetPopupMenu( PopupMenu* pNewMenu ) +void MenuButton::SetPopupMenu(PopupMenu* pNewMenu) { if (pNewMenu == mpMenu) return; @@ -160,6 +170,14 @@ void MenuButton::SetPopupMenu( PopupMenu* pNewMenu ) mpMenu = pNewMenu; } +void MenuButton::SetPopover(FloatingWindow* pFloatingWindow) +{ + if (pFloatingWindow == mpFloatingWindow) + return; + + mpFloatingWindow = pFloatingWindow; +} + //class MenuToggleButton ---------------------------------------------------- MenuToggleButton::MenuToggleButton( vcl::Window* pParent, WinBits nWinBits )
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits