[Libreoffice-commits] core.git: include/vcl vcl/source
Caolán McNamara
caolanm at redhat.com
Wed Nov 2 17:28:28 UTC 2016
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 <caolanm at 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 )
More information about the Libreoffice-commits
mailing list