summaryrefslogtreecommitdiff
path: root/vcl/source/control/menubtn.cxx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-11-02 17:26:03 +0000
committerCaolán McNamara <caolanm@redhat.com>2016-11-02 17:27:56 +0000
commit4b7435e31ac821d1738eda23a6688461efcbd311 (patch)
treed12844cfea09981a10858dfffd82e74518d18f8c /vcl/source/control/menubtn.cxx
parent4f6028ad7610d36379aba36470e47e701f8a87d5 (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/menubtn.cxx')
-rw-r--r--vcl/source/control/menubtn.cxx46
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 )