diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-11-02 17:26:03 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-11-02 17:27:56 +0000 |
commit | 4b7435e31ac821d1738eda23a6688461efcbd311 (patch) | |
tree | d12844cfea09981a10858dfffd82e74518d18f8c /vcl/source/control | |
parent | 4f6028ad7610d36379aba36470e47e701f8a87d5 (diff) |
let menu button launch arbitrary floating windows
and not just menus, this is like how the gtk equivalent can launch popovers
Change-Id: I53ae96aab0c51d75405dba15ab8080d7315471e3
Diffstat (limited to 'vcl/source/control')
-rw-r--r-- | vcl/source/control/menubtn.cxx | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/vcl/source/control/menubtn.cxx b/vcl/source/control/menubtn.cxx index b3a01670b245..6b62d8480ed9 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 ) |