]> git.saurik.com Git - wxWidgets.git/commitdiff
Add expand/collapse button to wxRibbonBar.
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 30 Jul 2012 17:53:36 +0000 (17:53 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 30 Jul 2012 17:53:36 +0000 (17:53 +0000)
This allows the user to toggle the ribbon bar visibility.

Closes #14530.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72261 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/ribbon/art.h
include/wx/ribbon/bar.h
interface/wx/ribbon/bar.h
samples/ribbon/ribbondemo.cpp
src/ribbon/art_msw.cpp
src/ribbon/bar.cpp

index 3c52f5d3fbc4028340dd8719fafa657cc83c25ca..8d14d1b2689ba8e717beabf704256794f3dfbc47 100644 (file)
@@ -534,6 +534,7 @@ All:
 All (GUI):
 
 - Add possibility to hide and show again wxRibbonBar pages (wxBen).
+- Add expand/collapse button to wxRibbonBar (rakeshthp).
 - Fix item data access in wxDataViewListCtrl (Kry).
 
 wxGTK:
index e2f9177b98f8978c56711c1bb80f5fcd75061ab1..5d40437594763d11b5c5ac7d9c342d9733aba17a 100644 (file)
@@ -103,6 +103,10 @@ enum wxRibbonArtSetting
     wxRIBBON_ART_PANEL_ACTIVE_BACKGROUND_GRADIENT_COLOUR,
     wxRIBBON_ART_PANEL_BUTTON_FACE_COLOUR,
     wxRIBBON_ART_PANEL_BUTTON_HOVER_FACE_COLOUR,
+
+    wxRIBBON_ART_PAGE_TOGGLE_FACE_COLOUR,
+    wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR,
+
     wxRIBBON_ART_PAGE_BORDER_COLOUR,
     wxRIBBON_ART_PAGE_BACKGROUND_TOP_COLOUR,
     wxRIBBON_ART_PAGE_BACKGROUND_TOP_GRADIENT_COLOUR,
@@ -185,6 +189,7 @@ enum wxRibbonGalleryButtonState
     wxRIBBON_GALLERY_BUTTON_DISABLED
 };
 
+class wxRibbonBar;
 class wxRibbonPage;
 class wxRibbonPanel;
 class wxRibbonGallery;
@@ -297,6 +302,12 @@ public:
                         wxRibbonButtonKind kind,
                         long state) = 0;
 
+    virtual void DrawToggleButton(
+                        wxDC& dc,
+                        wxRibbonBar* wnd,
+                        const wxRect& rect,
+                        bool upBitmap) = 0;
+
     virtual void GetBarTabWidth(
                         wxDC& dc,
                         wxWindow* wnd,
@@ -380,6 +391,10 @@ public:
                         bool is_first,
                         bool is_last,
                         wxRect* dropdown_region) = 0;
+
+    virtual wxRect GetBarToggleButtonArea(wxDC& dc,
+                                          const wxRibbonBar* wnd,
+                                          wxRect rect)= 0;
 };
 
 class WXDLLIMPEXP_RIBBON wxRibbonMSWArtProvider : public wxRibbonArtProvider
@@ -491,6 +506,12 @@ public:
                 wxRibbonButtonKind kind,
                 long state);
 
+    void DrawToggleButton(
+                        wxDC& dc,
+                        wxRibbonBar* wnd,
+                        const wxRect& rect,
+                        bool upBitmap);
+
     void GetBarTabWidth(
                         wxDC& dc,
                         wxWindow* wnd,
@@ -570,6 +591,10 @@ public:
                         bool is_last,
                         wxRect* dropdown_region);
 
+    wxRect GetBarToggleButtonArea(wxDC& dc,
+                                  const wxRibbonBar* wnd,
+                                  wxRect rect);
+
 protected:
     void ReallyDrawTabSeparator(wxWindow* wnd, const wxRect& rect, double visibility);
     void DrawPartialPageBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect,
@@ -605,6 +630,8 @@ protected:
     wxBitmap m_gallery_extension_bitmap[4];
     wxBitmap m_toolbar_drop_bitmap;
     wxBitmap m_panel_extension_bitmap[2];
+    wxBitmap m_ribbon_toggle_up_bitmap[2];
+    wxBitmap m_ribbon_toggle_down_bitmap[2];
 
     wxColour m_primary_scheme_colour;
     wxColour m_secondary_scheme_colour;
@@ -629,6 +656,8 @@ protected:
     wxColour m_panel_active_background_top_gradient_colour;
     wxColour m_panel_button_face_colour;
     wxColour m_panel_button_hover_face_colour;
+    wxColour m_page_toggle_face_colour;
+    wxColour m_page_toggle_hover_face_colour;
     wxColour m_page_background_colour;
     wxColour m_page_background_gradient_colour;
     wxColour m_page_background_top_colour;
@@ -681,6 +710,7 @@ protected:
     wxBrush m_gallery_button_hover_background_top_brush;
     wxBrush m_gallery_button_active_background_top_brush;
     wxBrush m_gallery_button_disabled_background_top_brush;
+    wxBrush m_ribbon_toggle_brush;
 
     wxFont m_tab_label_font;
     wxFont m_panel_label_font;
@@ -698,6 +728,7 @@ protected:
     wxPen m_gallery_border_pen;
     wxPen m_gallery_item_border_pen;
     wxPen m_toolbar_border_pen;
+    wxPen m_ribbon_toggle_pen;
 
     double m_cached_tab_separator_visibility;
     long m_flags;
index d5a97cbe26f1239f06577049a1a8668849097823..4836578ccc4ed0f7e0eeaf4e32d9c6e8fbe6290e 100644 (file)
@@ -28,10 +28,12 @@ enum wxRibbonBarOption
     wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS = 1 << 3,
     wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS = 1 << 4,
     wxRIBBON_BAR_ALWAYS_SHOW_TABS = 1 << 5,
+    wxRIBBON_BAR_SHOW_TOGGLE_BUTTON = 1 << 6,
 
     wxRIBBON_BAR_DEFAULT_STYLE =  wxRIBBON_BAR_FLOW_HORIZONTAL
                                 | wxRIBBON_BAR_SHOW_PAGE_LABELS
-                                | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS,
+                                | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS
+                                | wxRIBBON_BAR_SHOW_TOGGLE_BUTTON,
 
     wxRIBBON_BAR_FOLDBAR_STYLE =  wxRIBBON_BAR_FLOW_VERTICAL
                                 | wxRIBBON_BAR_SHOW_PAGE_ICONS
@@ -135,12 +137,16 @@ public:
     long GetWindowStyleFlag() const;
     virtual bool Realize();
 
+    // Implementation only.
+    bool IsToggleButtonHovered() const { return m_toggle_button_hovered; }
+
 protected:
     friend class wxRibbonPage;
 
     virtual wxSize DoGetBestSize() const;
     wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
     wxRibbonPageTabInfo* HitTestTabs(wxPoint position, int* index = NULL);
+    void HitTestToggleButton(wxPoint position);
 
     void CommonInit(long style);
     void AddPage(wxRibbonPage *page);
@@ -168,6 +174,7 @@ protected:
     wxRibbonPageTabInfoArray m_pages;
     wxRect m_tab_scroll_left_button_rect;
     wxRect m_tab_scroll_right_button_rect;
+    wxRect m_toggle_button_rect;
     long m_flags;
     int m_tabs_total_width_ideal;
     int m_tabs_total_width_minimum;
@@ -181,6 +188,8 @@ protected:
     int m_tab_scroll_right_button_state;
     bool m_tab_scroll_buttons_shown;
     bool m_arePanelsShown;
+    bool m_bar_hovered;
+    bool m_toggle_button_hovered;
 
 #ifndef SWIG
     DECLARE_CLASS(wxRibbonBar)
@@ -197,6 +206,7 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TAB_MIDDLE_
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_DOWN, wxRibbonBarEvent);
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, wxRibbonBarEvent);
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, wxRibbonBarEvent);
+wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TOGGLED, wxRibbonBarEvent);
 
 typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
 
@@ -217,6 +227,8 @@ typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
     wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, winid, wxRibbonBarEventHandler(fn))
 #define EVT_RIBBONBAR_TAB_LEFT_DCLICK(winid, fn) \
     wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, winid, wxRibbonBarEventHandler(fn))
+#define EVT_RIBBONBAR_TOGGLED(winid, fn) \
+    wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_TOGGLED, winid, wxRibbonBarEventHandler(fn))
 #else
 
 // wxpython/swig event work
@@ -227,6 +239,7 @@ typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
 %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_DOWN;
 %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP;
 %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK;
+%constant wxEventType wxEVT_COMMAND_RIBBONBAR_TOGGLED;
 
 %pythoncode {
     EVT_RIBBONBAR_PAGE_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGED, 1 )
@@ -236,6 +249,7 @@ typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
     EVT_RIBBONBAR_TAB_RIGHT_DOWN = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_DOWN, 1 )
     EVT_RIBBONBAR_TAB_RIGHT_UP = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, 1 )
     EVT_RIBBONBAR_TAB_LEFT_DCLICK = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, 1 )
+    EVT_RIBBONBAR_TOGGLED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TOGGLED, 1 )
 }
 #endif
 
index 93274decc2b71cbbbb4099bf2e70c04f684b97d7..32eb4da06bd8a3ee76bdcbc2b4cdb2370e0ee31c 100644 (file)
@@ -64,7 +64,8 @@ public:
     @beginStyleTable
     @style{wxRIBBON_BAR_DEFAULT_STYLE}
         Defined as wxRIBBON_BAR_FLOW_HORIZONTAL |
-        wxRIBBON_BAR_SHOW_PAGE_LABELS | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS
+        wxRIBBON_BAR_SHOW_PAGE_LABELS | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS |
+        wxRIBBON_BAR_SHOW_TOGGLE_BUTTON.
     @style{wxRIBBON_BAR_FOLDBAR_STYLE}
         Defined as wxRIBBON_BAR_FLOW_VERTICAL | wxRIBBON_BAR_SHOW_PAGE_ICONS
         | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS |
@@ -83,6 +84,9 @@ public:
     @style{wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS}
         Causes minimise buttons to be shown on panels (where the panel has
         such a button).
+    @style{wxRIBBON_BAR_SHOW_TOGGLE_BUTTON}
+        Causes a toggle button to appear on the ribbon bar at top-right corner.
+        This style is new since wxWidgets 2.9.5.
     @endStyleTable
 
 
@@ -103,6 +107,9 @@ public:
         Triggered when the right mouse button is released on a tab.
     @event{EVT_RIBBONBAR_TAB_LEFT_DCLICK(id, func)}
         Triggered when the left mouse button is double clicked on a tab.
+    @event{EVT_RIBBONBAR_TOGGLE_BUTTON_CLICK(id, func)}
+        Triggered when the button triggering the ribbon bar is clicked. This
+        event is new since wxWidgets 2.9.5.
     @endEventTable
 
     @library{wxribbon}
index 4473602d2f388591b41c50110904e174587c5e97..cd6077a34ba7b612558a054b6d094f52892f1514 100644 (file)
@@ -134,6 +134,7 @@ public:
     void OnHidePages(wxRibbonButtonBarEvent& evt);
     void OnShowPages(wxRibbonButtonBarEvent& evt);
     void OnTogglePanels(wxCommandEvent& evt);
+    void OnRibbonBarToggled(wxRibbonBarEvent& evt);
 
     void OnExtButton(wxRibbonPanelEvent& evt);
 
@@ -234,6 +235,7 @@ EVT_RIBBONPANEL_EXTBUTTON_ACTIVATED(wxID_ANY, MyFrame::OnExtButton)
 EVT_RIBBONBUTTONBAR_CLICKED(ID_REMOVE_PAGE, MyFrame::OnRemovePage)
 EVT_RIBBONBUTTONBAR_CLICKED(ID_HIDE_PAGES, MyFrame::OnHidePages)
 EVT_RIBBONBUTTONBAR_CLICKED(ID_SHOW_PAGES, MyFrame::OnShowPages)
+EVT_RIBBONBAR_TOGGLED(wxID_ANY, MyFrame::OnRibbonBarToggled)
 END_EVENT_TABLE()
 
 #include "align_center.xpm"
@@ -262,10 +264,7 @@ END_EVENT_TABLE()
 MyFrame::MyFrame()
     : wxFrame(NULL, wxID_ANY, wxT("wxRibbon Sample Application"), wxDefaultPosition, wxSize(800, 600), wxDEFAULT_FRAME_STYLE)
 {
-    m_ribbon = new wxRibbonBar(this, wxID_ANY,
-                               wxDefaultPosition, wxDefaultSize,
-                               wxRIBBON_BAR_DEFAULT_STYLE |
-                               wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS);
+    m_ribbon = new wxRibbonBar(this);
 
     {
         wxRibbonPage* home = new wxRibbonPage(m_ribbon, wxID_ANY, wxT("Examples"), ribbon_xpm);
@@ -1008,3 +1007,11 @@ void MyFrame::OnShowPages(wxRibbonButtonBarEvent& WXUNUSED(evt))
     m_ribbon->ShowPage(3);
     m_ribbon->Realize();
 }
+
+void MyFrame::OnRibbonBarToggled(wxRibbonBarEvent& WXUNUSED(evt))
+{
+    AddText(wxString::Format("Ribbon bar %s.",
+                             m_ribbon->ArePanelsShown()
+                                ? "expanded"
+                                : "collapsed"));
+}
index 2785dc9d3d9fb8a2b5672916b7b64ea3385fc7e5..eb530dcef377d9d2803ba3c9f52e6f4a7aed1ad6 100644 (file)
@@ -94,6 +94,34 @@ static const char* const panel_extension_xpm[] = {
   "x   xxx",
   "   xxxx"};
 
+static const char* const panel_toggle_down_xpm[] = {
+  "7 9 2 1",
+  "  c None",
+  "x c #FF00FF",
+  "       ",
+  "x     x",
+  "xx   xx",
+  " xx xx ",
+  "x xxx x",
+  "xx x xx",
+  " xx xx ",
+  "  xxx  ",
+  "   x   ",};
+
+static const char* const panel_toggle_up_xpm[] = {
+  "7 9 2 1",
+  "  c None",
+  "x c #FF00FF",
+  "   x   ",
+  "  xxx  ",
+  " xx xx ",
+  "xx x xx",
+  "x xxx x",
+  " xx xx ",
+  "xx   xx",
+  "x     x",
+  "       ",};
+
 wxRibbonMSWArtProvider::wxRibbonMSWArtProvider(bool set_colour_scheme)
 {
     m_flags = 0;
@@ -233,6 +261,11 @@ void wxRibbonMSWArtProvider::SetColourScheme(
     SetColour(wxRIBBON_ART_PANEL_BUTTON_FACE_COLOUR, LikePrimary(1.4, -0.21, -0.23));
     SetColour(wxRIBBON_ART_PANEL_BUTTON_HOVER_FACE_COLOUR, LikePrimary(1.5, -0.24, -0.29));
 
+    m_ribbon_toggle_brush = LikeSecondary(-0.9, 0.16, -0.07);
+    m_ribbon_toggle_pen = LikeSecondary(-3.9, -0.16, -0.14);
+    SetColour(wxRIBBON_ART_PAGE_TOGGLE_FACE_COLOUR, LikePrimary(1.7, -0.20, -0.15));
+    SetColour(wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR, LikePrimary(1.8, -0.23, -0.21));
+
     m_gallery_button_disabled_background_colour = LikePrimary(-2.8, -0.46, 0.09);
     m_gallery_button_disabled_background_top_brush = LikePrimary(-2.8, -0.36, 0.15);
     m_gallery_hover_background_brush = LikePrimary(-0.8, 0.05, 0.15);
@@ -308,6 +341,8 @@ void wxRibbonMSWArtProvider::CloneTo(wxRibbonMSWArtProvider* copy) const
     for(i = 0; i < 2; ++i)
     {
         copy->m_panel_extension_bitmap[i] = m_panel_extension_bitmap[i];
+        copy->m_ribbon_toggle_up_bitmap[i] = m_ribbon_toggle_up_bitmap[i];
+        copy->m_ribbon_toggle_down_bitmap[i] = m_ribbon_toggle_down_bitmap[i];
     }
     copy->m_toolbar_drop_bitmap = m_toolbar_drop_bitmap;
 
@@ -315,6 +350,9 @@ void wxRibbonMSWArtProvider::CloneTo(wxRibbonMSWArtProvider* copy) const
     copy->m_secondary_scheme_colour = m_secondary_scheme_colour;
     copy->m_tertiary_scheme_colour = m_tertiary_scheme_colour;
 
+    copy->m_page_toggle_face_colour = m_page_toggle_face_colour;
+    copy->m_page_toggle_hover_face_colour = m_page_toggle_hover_face_colour;
+
     copy->m_button_bar_label_colour = m_button_bar_label_colour;
     copy->m_tab_label_colour = m_tab_label_colour;
     copy->m_tab_separator_colour = m_tab_separator_colour;
@@ -372,6 +410,7 @@ void wxRibbonMSWArtProvider::CloneTo(wxRibbonMSWArtProvider* copy) const
     copy->m_gallery_button_hover_background_top_brush = m_gallery_button_hover_background_top_brush;
     copy->m_gallery_button_active_background_top_brush = m_gallery_button_active_background_top_brush;
     copy->m_gallery_button_disabled_background_top_brush = m_gallery_button_disabled_background_top_brush;
+    copy->m_ribbon_toggle_brush = m_ribbon_toggle_brush;
 
     copy->m_tab_label_font = m_tab_label_font;
     copy->m_button_bar_label_font = m_button_bar_label_font;
@@ -389,6 +428,7 @@ void wxRibbonMSWArtProvider::CloneTo(wxRibbonMSWArtProvider* copy) const
     copy->m_button_bar_active_border_pen = m_button_bar_active_border_pen;
     copy->m_gallery_item_border_pen = m_gallery_item_border_pen;
     copy->m_toolbar_border_pen = m_toolbar_border_pen;
+    copy->m_ribbon_toggle_pen = m_ribbon_toggle_pen;
 
     copy->m_flags = m_flags;
     copy->m_tab_separation_size = m_tab_separation_size;
@@ -705,6 +745,10 @@ wxColour wxRibbonMSWArtProvider::GetColour(int id) const
             return m_toolbar_border_pen.GetColour();
         case wxRIBBON_ART_TOOLBAR_FACE_COLOUR:
             return m_tool_face_colour;
+        case wxRIBBON_ART_PAGE_TOGGLE_FACE_COLOUR:
+            return m_page_toggle_face_colour;
+        case wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR:
+            return m_page_toggle_hover_face_colour;
         default:
             wxFAIL_MSG(wxT("Invalid Metric Ordinal"));
             break;
@@ -975,6 +1019,16 @@ void wxRibbonMSWArtProvider::SetColour(int id, const wxColor& colour)
             m_tool_face_colour = colour;
             m_toolbar_drop_bitmap = wxRibbonLoadPixmap(gallery_down_xpm, colour);
             break;
+        case wxRIBBON_ART_PAGE_TOGGLE_FACE_COLOUR:
+            m_page_toggle_face_colour = colour;
+            m_ribbon_toggle_down_bitmap[0] = wxRibbonLoadPixmap(panel_toggle_down_xpm, colour);
+            m_ribbon_toggle_up_bitmap[0] = wxRibbonLoadPixmap(panel_toggle_up_xpm, colour);
+            break;
+        case wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR:
+            m_page_toggle_hover_face_colour = colour;
+            m_ribbon_toggle_down_bitmap[1] = wxRibbonLoadPixmap(panel_toggle_down_xpm, colour);
+            m_ribbon_toggle_up_bitmap[1] = wxRibbonLoadPixmap(panel_toggle_up_xpm, colour);
+            break;
         default:
             wxFAIL_MSG(wxT("Invalid Metric Ordinal"));
             break;
@@ -2424,6 +2478,36 @@ void wxRibbonMSWArtProvider::DrawTool(
         bg_rect.y + (bg_rect.height - bitmap.GetHeight()) / 2, true);
 }
 
+void
+wxRibbonMSWArtProvider::DrawToggleButton(wxDC& dc,
+                                         wxRibbonBar* wnd,
+                                         const wxRect& rect,
+                                         bool upBitmap)
+{
+    DrawPartialPageBackground(dc, wnd, rect, false);
+
+    dc.DestroyClippingRegion();
+    dc.SetClippingRegion(rect);
+
+    if(wnd->IsToggleButtonHovered())
+    {
+        dc.SetPen(m_ribbon_toggle_pen);
+        dc.SetBrush(m_ribbon_toggle_brush);
+        dc.DrawRoundedRectangle(rect.GetX(), rect.GetY(), 12, 12, 1.0);
+        if(upBitmap)
+            dc.DrawBitmap(m_ribbon_toggle_up_bitmap[1], rect.GetX()+2, rect.GetY()+2, true);
+        else
+            dc.DrawBitmap(m_ribbon_toggle_down_bitmap[1], rect.GetX()+2, rect.GetY()+2, true);
+    }
+    else
+    {
+        if(upBitmap)
+            dc.DrawBitmap(m_ribbon_toggle_up_bitmap[0], rect.GetX()+2, rect.GetY()+2, true);
+        else
+            dc.DrawBitmap(m_ribbon_toggle_down_bitmap[0], rect.GetX()+2, rect.GetY()+2, true);
+    }
+}
+
 void wxRibbonMSWArtProvider::GetBarTabWidth(
                         wxDC& dc,
                         wxWindow* WXUNUSED(wnd),
@@ -2878,4 +2962,13 @@ wxSize wxRibbonMSWArtProvider::GetToolSize(
     return size;
 }
 
+wxRect
+wxRibbonMSWArtProvider::GetBarToggleButtonArea(wxDC& WXUNUSED(dc),
+                                               const wxRibbonBar* WXUNUSED(wnd),
+                                               wxRect rect)
+{
+    rect = wxRect(rect.GetWidth()-30, 6, 12, 12);
+    return rect;
+}
+
 #endif // wxUSE_RIBBON
index 1e2acc9e2de3d14c44abfa3c5b204f40b15e9075..57d8cda87d8fb793b441532c5555339e1666ffb7 100644 (file)
@@ -40,6 +40,7 @@ wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_MIDDLE_UP, wxRibbonBarEvent);
 wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_DOWN, wxRibbonBarEvent);
 wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, wxRibbonBarEvent);
 wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, wxRibbonBarEvent);
+wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TOGGLED, wxRibbonBarEvent);
 
 IMPLEMENT_CLASS(wxRibbonBar, wxRibbonControl)
 IMPLEMENT_DYNAMIC_CLASS(wxRibbonBarEvent, wxNotifyEvent)
@@ -243,6 +244,7 @@ void wxRibbonBar::OnMouseMove(wxMouseEvent& evt)
     {
         RefreshTabBar();
     }
+    HitTestToggleButton(evt.GetPosition());
 }
 
 void wxRibbonBar::OnMouseLeave(wxMouseEvent& WXUNUSED(evt))
@@ -270,6 +272,12 @@ void wxRibbonBar::OnMouseLeave(wxMouseEvent& WXUNUSED(evt))
     {
         RefreshTabBar();
     }
+    if(m_toggle_button_hovered)
+    {
+        m_bar_hovered = false;
+        m_toggle_button_hovered = false;
+        Refresh(false);
+    }
 }
 
 wxRibbonPage* wxRibbonBar::GetPage(int n)
@@ -720,6 +728,9 @@ void wxRibbonBar::CommonInit(long style)
         SetArtProvider(new wxRibbonDefaultArtProvider);
     }
     SetBackgroundStyle(wxBG_STYLE_CUSTOM);
+
+    m_toggle_button_hovered = false;
+    m_bar_hovered = false;
 }
 
 void wxRibbonBar::SetArtProvider(wxRibbonArtProvider* art)
@@ -757,6 +768,8 @@ void wxRibbonBar::OnPaint(wxPaintEvent& WXUNUSED(evt))
 
     DoEraseBackground(dc);
 
+    m_toggle_button_rect = m_art->GetBarToggleButtonArea(dc, this, GetSize());
+
     size_t numtabs = m_pages.GetCount();
     double sep_visibility = 0.0;
     bool draw_sep = false;
@@ -830,6 +843,9 @@ void wxRibbonBar::OnPaint(wxPaintEvent& WXUNUSED(evt))
             m_art->DrawScrollButton(dc, this, m_tab_scroll_right_button_rect, wxRIBBON_SCROLL_BTN_RIGHT | m_tab_scroll_right_button_state | wxRIBBON_SCROLL_BTN_FOR_TABS);
         }
     }
+    wxRect rect(GetClientSize().GetWidth() - 30, 6, 12, 12);
+    if ( m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON  )
+        m_art->DrawToggleButton(dc, this, rect, ArePanelsShown());
 }
 
 void wxRibbonBar::OnEraseBackground(wxEraseEvent& WXUNUSED(evt))
@@ -927,6 +943,23 @@ void wxRibbonBar::OnMouseLeftDown(wxMouseEvent& evt)
             RefreshTabBar();
         }
     }
+
+    wxPoint position = evt.GetPosition();
+
+    if(position.x >= 0 && position.y >= 0)
+    {
+        wxSize size = GetSize();
+        if(position.x < size.GetWidth() && position.y < size.GetHeight())
+        {
+            if(m_toggle_button_rect.Contains(position))
+            {
+                ShowPanels(!ArePanelsShown());
+                wxRibbonBarEvent event(wxEVT_COMMAND_RIBBONBAR_TOGGLED, GetId());
+                event.SetEventObject(this);
+                ProcessWindowEvent(event);
+            }
+        }
+    }
 }
 
 void wxRibbonBar::OnMouseLeftUp(wxMouseEvent& WXUNUSED(evt))
@@ -1110,4 +1143,29 @@ wxSize wxRibbonBar::DoGetBestSize() const
     return best;
 }
 
+void wxRibbonBar::HitTestToggleButton(wxPoint position)
+{
+    bool hovered = false, toggle_button_hovered = false;
+    if(position.x >= 0 && position.y >= 0)
+    {
+        wxSize size = GetSize();
+        if(position.x < size.GetWidth() && position.y < size.GetHeight())
+        {
+            hovered = true;
+        }
+    }
+    if(hovered)
+    {
+        toggle_button_hovered = (m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON) &&
+                                    m_toggle_button_rect.Contains(position);
+
+        if(hovered != m_bar_hovered || toggle_button_hovered != m_toggle_button_hovered)
+        {
+            m_bar_hovered = hovered;
+            m_toggle_button_hovered = toggle_button_hovered;
+            Refresh(false);
+        }
+    }
+}
+
 #endif // wxUSE_RIBBON