Add expand/collapse button to wxRibbonBar.

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
This commit is contained in:
Vadim Zeitlin 2012-07-30 17:53:36 +00:00
parent 73ed2b2b12
commit 7c70331e28
7 changed files with 217 additions and 6 deletions

View 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:

View 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;

View 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

View 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}

View 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"));
}

View 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

View 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