[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