Add help button support to wxRibbonBar.

Optionally show standard "Help" question mark button in the ribbon top right
corner and generate the appropriate event for it.

Closes #14576.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72495 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-09-15 23:19:59 +00:00
parent 66815259f5
commit 42d7394119
13 changed files with 472 additions and 42 deletions

View File

@@ -21,6 +21,7 @@
#include "wx/font.h" #include "wx/font.h"
#include "wx/pen.h" #include "wx/pen.h"
#include "wx/bitmap.h" #include "wx/bitmap.h"
#include "wx/ribbon/bar.h"
class WXDLLIMPEXP_FWD_CORE wxDC; class WXDLLIMPEXP_FWD_CORE wxDC;
class WXDLLIMPEXP_FWD_CORE wxWindow; class WXDLLIMPEXP_FWD_CORE wxWindow;
@@ -306,7 +307,12 @@ public:
wxDC& dc, wxDC& dc,
wxRibbonBar* wnd, wxRibbonBar* wnd,
const wxRect& rect, const wxRect& rect,
bool upBitmap) = 0; wxRibbonDisplayMode mode) = 0;
virtual void DrawHelpButton(
wxDC& dc,
wxRibbonBar* wnd,
const wxRect& rect) = 0;
virtual void GetBarTabWidth( virtual void GetBarTabWidth(
wxDC& dc, wxDC& dc,
@@ -392,9 +398,9 @@ public:
bool is_last, bool is_last,
wxRect* dropdown_region) = 0; wxRect* dropdown_region) = 0;
virtual wxRect GetBarToggleButtonArea(wxDC& dc, virtual wxRect GetBarToggleButtonArea(const wxRect& rect)= 0;
const wxRibbonBar* wnd,
wxRect rect)= 0; virtual wxRect GetRibbonHelpButtonArea(const wxRect& rect) = 0;
}; };
class WXDLLIMPEXP_RIBBON wxRibbonMSWArtProvider : public wxRibbonArtProvider class WXDLLIMPEXP_RIBBON wxRibbonMSWArtProvider : public wxRibbonArtProvider
@@ -510,7 +516,11 @@ public:
wxDC& dc, wxDC& dc,
wxRibbonBar* wnd, wxRibbonBar* wnd,
const wxRect& rect, const wxRect& rect,
bool upBitmap); wxRibbonDisplayMode mode);
void DrawHelpButton(wxDC& dc,
wxRibbonBar* wnd,
const wxRect& rect);
void GetBarTabWidth( void GetBarTabWidth(
wxDC& dc, wxDC& dc,
@@ -591,9 +601,9 @@ public:
bool is_last, bool is_last,
wxRect* dropdown_region); wxRect* dropdown_region);
wxRect GetBarToggleButtonArea(wxDC& dc, wxRect GetBarToggleButtonArea(const wxRect& rect);
const wxRibbonBar* wnd,
wxRect rect); wxRect GetRibbonHelpButtonArea(const wxRect& rect);
protected: protected:
void ReallyDrawTabSeparator(wxWindow* wnd, const wxRect& rect, double visibility); void ReallyDrawTabSeparator(wxWindow* wnd, const wxRect& rect, double visibility);
@@ -632,6 +642,8 @@ protected:
wxBitmap m_panel_extension_bitmap[2]; wxBitmap m_panel_extension_bitmap[2];
wxBitmap m_ribbon_toggle_up_bitmap[2]; wxBitmap m_ribbon_toggle_up_bitmap[2];
wxBitmap m_ribbon_toggle_down_bitmap[2]; wxBitmap m_ribbon_toggle_down_bitmap[2];
wxBitmap m_ribbon_toggle_pin_bitmap[2];
wxBitmap m_ribbon_bar_help_button_bitmap[2];
wxColour m_primary_scheme_colour; wxColour m_primary_scheme_colour;
wxColour m_secondary_scheme_colour; wxColour m_secondary_scheme_colour;
@@ -745,6 +757,8 @@ protected:
int m_gallery_bitmap_padding_right_size; int m_gallery_bitmap_padding_right_size;
int m_gallery_bitmap_padding_top_size; int m_gallery_bitmap_padding_top_size;
int m_gallery_bitmap_padding_bottom_size; int m_gallery_bitmap_padding_bottom_size;
int m_toggle_button_offset;
int m_help_button_offset;
}; };
class WXDLLIMPEXP_RIBBON wxRibbonAUIArtProvider : public wxRibbonMSWArtProvider class WXDLLIMPEXP_RIBBON wxRibbonAUIArtProvider : public wxRibbonMSWArtProvider

View File

@@ -29,11 +29,13 @@ enum wxRibbonBarOption
wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS = 1 << 4, wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS = 1 << 4,
wxRIBBON_BAR_ALWAYS_SHOW_TABS = 1 << 5, wxRIBBON_BAR_ALWAYS_SHOW_TABS = 1 << 5,
wxRIBBON_BAR_SHOW_TOGGLE_BUTTON = 1 << 6, wxRIBBON_BAR_SHOW_TOGGLE_BUTTON = 1 << 6,
wxRIBBON_BAR_SHOW_HELP_BUTTON = 1 << 7,
wxRIBBON_BAR_DEFAULT_STYLE = wxRIBBON_BAR_FLOW_HORIZONTAL wxRIBBON_BAR_DEFAULT_STYLE = wxRIBBON_BAR_FLOW_HORIZONTAL
| wxRIBBON_BAR_SHOW_PAGE_LABELS | wxRIBBON_BAR_SHOW_PAGE_LABELS
| wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS
| wxRIBBON_BAR_SHOW_TOGGLE_BUTTON, | wxRIBBON_BAR_SHOW_TOGGLE_BUTTON
| wxRIBBON_BAR_SHOW_HELP_BUTTON,
wxRIBBON_BAR_FOLDBAR_STYLE = wxRIBBON_BAR_FLOW_VERTICAL wxRIBBON_BAR_FOLDBAR_STYLE = wxRIBBON_BAR_FLOW_VERTICAL
| wxRIBBON_BAR_SHOW_PAGE_ICONS | wxRIBBON_BAR_SHOW_PAGE_ICONS
@@ -41,6 +43,13 @@ enum wxRibbonBarOption
| wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS | wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS
}; };
enum wxRibbonDisplayMode
{
wxRIBBON_BAR_PINNED,
wxRIBBON_BAR_MINIMIZED,
wxRIBBON_BAR_EXPANDED
};
class WXDLLIMPEXP_RIBBON wxRibbonBarEvent : public wxNotifyEvent class WXDLLIMPEXP_RIBBON wxRibbonBarEvent : public wxNotifyEvent
{ {
public: public:
@@ -144,6 +153,9 @@ public:
// Implementation only. // Implementation only.
bool IsToggleButtonHovered() const { return m_toggle_button_hovered; } bool IsToggleButtonHovered() const { return m_toggle_button_hovered; }
bool IsHelpButtonHovered() const { return m_help_button_hovered; }
void HideIfExpanded();
protected: protected:
friend class wxRibbonPage; friend class wxRibbonPage;
@@ -151,7 +163,7 @@ protected:
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;
wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
wxRibbonPageTabInfo* HitTestTabs(wxPoint position, int* index = NULL); wxRibbonPageTabInfo* HitTestTabs(wxPoint position, int* index = NULL);
void HitTestToggleButton(wxPoint position); void HitTestRibbonButton(const wxRect& rect, const wxPoint& position, bool &hover_flag);
void CommonInit(long style); void CommonInit(long style);
void AddPage(wxRibbonPage *page); void AddPage(wxRibbonPage *page);
@@ -175,11 +187,13 @@ protected:
void OnMouseLeave(wxMouseEvent& evt); void OnMouseLeave(wxMouseEvent& evt);
void OnMouseDoubleClick(wxMouseEvent& evt); void OnMouseDoubleClick(wxMouseEvent& evt);
void DoMouseButtonCommon(wxMouseEvent& evt, wxEventType tab_event_type); void DoMouseButtonCommon(wxMouseEvent& evt, wxEventType tab_event_type);
void OnKillFocus(wxFocusEvent& evt);
wxRibbonPageTabInfoArray m_pages; wxRibbonPageTabInfoArray m_pages;
wxRect m_tab_scroll_left_button_rect; wxRect m_tab_scroll_left_button_rect;
wxRect m_tab_scroll_right_button_rect; wxRect m_tab_scroll_right_button_rect;
wxRect m_toggle_button_rect; wxRect m_toggle_button_rect;
wxRect m_help_button_rect;
long m_flags; long m_flags;
int m_tabs_total_width_ideal; int m_tabs_total_width_ideal;
int m_tabs_total_width_minimum; int m_tabs_total_width_minimum;
@@ -195,6 +209,9 @@ protected:
bool m_arePanelsShown; bool m_arePanelsShown;
bool m_bar_hovered; bool m_bar_hovered;
bool m_toggle_button_hovered; bool m_toggle_button_hovered;
bool m_help_button_hovered;
wxRibbonDisplayMode m_ribbon_state;
#ifndef SWIG #ifndef SWIG
DECLARE_CLASS(wxRibbonBar) DECLARE_CLASS(wxRibbonBar)
@@ -212,6 +229,7 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_D
wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, 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_TAB_LEFT_DCLICK, wxRibbonBarEvent);
wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TOGGLED, wxRibbonBarEvent); wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TOGGLED, wxRibbonBarEvent);
wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED, wxRibbonBarEvent);
typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&); typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
@@ -234,6 +252,8 @@ typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, winid, wxRibbonBarEventHandler(fn)) wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, winid, wxRibbonBarEventHandler(fn))
#define EVT_RIBBONBAR_TOGGLED(winid, fn) \ #define EVT_RIBBONBAR_TOGGLED(winid, fn) \
wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_TOGGLED, winid, wxRibbonBarEventHandler(fn)) wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_TOGGLED, winid, wxRibbonBarEventHandler(fn))
#define EVT_RIBBONBAR_HELP_CLICK(winid, fn) \
wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED, winid, wxRibbonBarEventHandler(fn))
#else #else
// wxpython/swig event work // wxpython/swig event work
@@ -245,6 +265,7 @@ typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
%constant wxEventType wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP; %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP;
%constant wxEventType wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK; %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK;
%constant wxEventType wxEVT_COMMAND_RIBBONBAR_TOGGLED; %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TOGGLED;
%constant wxEventType wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED;
%pythoncode { %pythoncode {
EVT_RIBBONBAR_PAGE_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGED, 1 ) EVT_RIBBONBAR_PAGE_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGED, 1 )
@@ -255,6 +276,7 @@ typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
EVT_RIBBONBAR_TAB_RIGHT_UP = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, 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_TAB_LEFT_DCLICK = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, 1 )
EVT_RIBBONBAR_TOGGLED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TOGGLED, 1 ) EVT_RIBBONBAR_TOGGLED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TOGGLED, 1 )
EVT_RIBBONBAR_HELP_CLICK = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED, 1 )
} }
#endif #endif

View File

@@ -61,6 +61,8 @@ public:
virtual void RemoveChild(wxWindowBase *child); virtual void RemoveChild(wxWindowBase *child);
void HideIfExpanded();
protected: protected:
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;
virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }

View File

@@ -84,6 +84,8 @@ public:
long GetFlags() { return m_flags; } long GetFlags() { return m_flags; }
void HideIfExpanded();
protected: protected:
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;
virtual wxSize GetPanelSizerBestSize() const; virtual wxSize GetPanelSizerBestSize() const;

View File

@@ -661,6 +661,47 @@ public:
wxRibbonButtonKind kind, wxRibbonButtonKind kind,
long state) = 0; long state) = 0;
/**
Draw toggle button on wxRibbonBar. This should draw a small toggle button
at top right corner of ribbon bar.
@param dc
The device context to draw onto.
@param wnd
The window which is being drawn onto, which is always the panel
whose background and chrome is being drawn. The panel label and
other panel attributes can be obtained by querying this.
@param rect
The rectangle within which to draw.
@param mode
The wxRibbonDisplayMode which should be applied to display button
@since 2.9.5
*/
virtual void DrawToggleButton(wxDC& dc,
wxRibbonBar* wnd,
const wxRect& rect,
wxRibbonDisplayMode mode) = 0;
/**
Draw help button on wxRibbonBar. This should draw a help button
at top right corner of ribbon bar.
@param dc
The device context to draw onto.
@param wnd
The window which is being drawn onto, which is always the panel
whose background and chrome is being drawn. The panel label and
other panel attributes can be obtained by querying this.
@param rect
The rectangle within which to draw.
@since 2.9.5
*/
virtual void DrawHelpButton(wxDC& dc,
wxRibbonBar* wnd,
const wxRect& rect) = 0;
/** /**
Calculate the ideal and minimum width (in pixels) of a tab in a ribbon Calculate the ideal and minimum width (in pixels) of a tab in a ribbon
bar. bar.
@@ -961,4 +1002,24 @@ public:
bool is_first, bool is_first,
bool is_last, bool is_last,
wxRect* dropdown_region) = 0; wxRect* dropdown_region) = 0;
/**
Calculate the position and size of the ribbon's toggle button.
@param rect
The ribbon bar rectangle from which calculate toggle button rectangle.
@since 2.9.5
*/
virtual wxRect GetBarToggleButtonArea(const wxRect& rect) = 0;
/**
Calculate the position and size of the ribbon's help button.
@param rect
The ribbon bar rectangle from which calculate help button rectangle.
@since 2.9.5
*/
virtual wxRect GetRibbonHelpButtonArea(const wxRect& rect) = 0;
}; };

View File

@@ -65,7 +65,7 @@ public:
@style{wxRIBBON_BAR_DEFAULT_STYLE} @style{wxRIBBON_BAR_DEFAULT_STYLE}
Defined as wxRIBBON_BAR_FLOW_HORIZONTAL | 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. wxRIBBON_BAR_SHOW_TOGGLE_BUTTON | wxRIBBON_BAR_SHOW_HELP_BUTTON.
@style{wxRIBBON_BAR_FOLDBAR_STYLE} @style{wxRIBBON_BAR_FOLDBAR_STYLE}
Defined as wxRIBBON_BAR_FLOW_VERTICAL | wxRIBBON_BAR_SHOW_PAGE_ICONS Defined as wxRIBBON_BAR_FLOW_VERTICAL | wxRIBBON_BAR_SHOW_PAGE_ICONS
| wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS | | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS |
@@ -87,6 +87,9 @@ public:
@style{wxRIBBON_BAR_SHOW_TOGGLE_BUTTON} @style{wxRIBBON_BAR_SHOW_TOGGLE_BUTTON}
Causes a toggle button to appear on the ribbon bar at top-right corner. Causes a toggle button to appear on the ribbon bar at top-right corner.
This style is new since wxWidgets 2.9.5. This style is new since wxWidgets 2.9.5.
@style{wxRIBBON_BAR_SHOW_HELP_BUTTON)
Causes a help button to appear on the ribbon bar at the top-right corner.
This style is new since wxWidgets 2.9.5.
@endStyleTable @endStyleTable
@@ -107,9 +110,12 @@ public:
Triggered when the right mouse button is released on a tab. Triggered when the right mouse button is released on a tab.
@event{EVT_RIBBONBAR_TAB_LEFT_DCLICK(id, func)} @event{EVT_RIBBONBAR_TAB_LEFT_DCLICK(id, func)}
Triggered when the left mouse button is double clicked on a tab. Triggered when the left mouse button is double clicked on a tab.
@event{EVT_RIBBONBAR_TOGGLE_BUTTON_CLICK(id, func)} @event{EVT_RIBBONBAR_TOGGLED(id, func)}
Triggered when the button triggering the ribbon bar is clicked. This Triggered when the button triggering the ribbon bar is clicked. This
event is new since wxWidgets 2.9.5. event is new since wxWidgets 2.9.5.
@event{EVT_RIBBONBAR_HELP_CLICK(id, func)}
Triggered when the help button is clicked. This even is new since
wxWidgets 2.9.5.
@endEventTable @endEventTable
@library{wxribbon} @library{wxribbon}

View File

@@ -135,6 +135,9 @@ public:
void OnShowPages(wxRibbonButtonBarEvent& evt); void OnShowPages(wxRibbonButtonBarEvent& evt);
void OnTogglePanels(wxCommandEvent& evt); void OnTogglePanels(wxCommandEvent& evt);
void OnRibbonBarToggled(wxRibbonBarEvent& evt); void OnRibbonBarToggled(wxRibbonBarEvent& evt);
void OnRibbonBarHelpClicked(wxRibbonBarEvent& evt);
void OnSizeEvent(wxSizeEvent& evt);
void OnExtButton(wxRibbonPanelEvent& evt); void OnExtButton(wxRibbonPanelEvent& evt);
@@ -236,6 +239,8 @@ EVT_RIBBONBUTTONBAR_CLICKED(ID_REMOVE_PAGE, MyFrame::OnRemovePage)
EVT_RIBBONBUTTONBAR_CLICKED(ID_HIDE_PAGES, MyFrame::OnHidePages) EVT_RIBBONBUTTONBAR_CLICKED(ID_HIDE_PAGES, MyFrame::OnHidePages)
EVT_RIBBONBUTTONBAR_CLICKED(ID_SHOW_PAGES, MyFrame::OnShowPages) EVT_RIBBONBUTTONBAR_CLICKED(ID_SHOW_PAGES, MyFrame::OnShowPages)
EVT_RIBBONBAR_TOGGLED(wxID_ANY, MyFrame::OnRibbonBarToggled) EVT_RIBBONBAR_TOGGLED(wxID_ANY, MyFrame::OnRibbonBarToggled)
EVT_RIBBONBAR_HELP_CLICK(wxID_ANY, MyFrame::OnRibbonBarHelpClicked)
EVT_SIZE(MyFrame::OnSizeEvent)
END_EVENT_TABLE() END_EVENT_TABLE()
#include "align_center.xpm" #include "align_center.xpm"
@@ -264,7 +269,12 @@ END_EVENT_TABLE()
MyFrame::MyFrame() MyFrame::MyFrame()
: wxFrame(NULL, wxID_ANY, wxT("wxRibbon Sample Application"), wxDefaultPosition, wxSize(800, 600), wxDEFAULT_FRAME_STYLE) : wxFrame(NULL, wxID_ANY, wxT("wxRibbon Sample Application"), wxDefaultPosition, wxSize(800, 600), wxDEFAULT_FRAME_STYLE)
{ {
m_ribbon = new wxRibbonBar(this); m_ribbon = new wxRibbonBar(this,-1,wxDefaultPosition, wxDefaultSize, wxRIBBON_BAR_FLOW_HORIZONTAL
| wxRIBBON_BAR_SHOW_PAGE_LABELS
| wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS
| wxRIBBON_BAR_SHOW_TOGGLE_BUTTON
| wxRIBBON_BAR_SHOW_HELP_BUTTON
);
{ {
wxRibbonPage* home = new wxRibbonPage(m_ribbon, wxID_ANY, wxT("Examples"), ribbon_xpm); wxRibbonPage* home = new wxRibbonPage(m_ribbon, wxID_ANY, wxT("Examples"), ribbon_xpm);
@@ -1017,3 +1027,19 @@ void MyFrame::OnRibbonBarToggled(wxRibbonBarEvent& WXUNUSED(evt))
? "expanded" ? "expanded"
: "collapsed")); : "collapsed"));
} }
void MyFrame::OnRibbonBarHelpClicked(wxRibbonBarEvent& WXUNUSED(evt))
{
AddText("Ribbon bar help clicked");
}
// This shows how to hide ribbon dynamically if there is not enough space.
void MyFrame::OnSizeEvent(wxSizeEvent& evt)
{
if ( evt.GetSize().GetWidth() < 200 )
m_ribbon->Hide();
else
m_ribbon->Show();
evt.Skip();
}

View File

@@ -19,7 +19,6 @@
#include "wx/ribbon/art.h" #include "wx/ribbon/art.h"
#include "wx/ribbon/art_internal.h" #include "wx/ribbon/art_internal.h"
#include "wx/ribbon/bar.h"
#include "wx/ribbon/buttonbar.h" #include "wx/ribbon/buttonbar.h"
#include "wx/ribbon/gallery.h" #include "wx/ribbon/gallery.h"
#include "wx/ribbon/toolbar.h" #include "wx/ribbon/toolbar.h"
@@ -122,6 +121,151 @@ static const char* const panel_toggle_up_xpm[] = {
"x x", "x x",
" ",}; " ",};
static const char* const ribbon_toggle_pin_xpm[] = {
"12 9 3 1",
" c None",
"x c #FF00FF",
". c #FF00FF",
" xx ",
" x.x xxx",
" x..xxx..x",
"xxxx.......x",
"x..........x",
"xxxx.......x",
" x..xxx..x",
" x.x xxx",
" xx "
};
static const char * const ribbon_help_button_xpm[] = {
"12 12 112 2",
" c #163B95",
". c none",
"X c #1B3F98",
"o c #1B4097",
"O c #1D4198",
"+ c #1E4298",
"@ c #1E439B",
"# c #1A419F",
"$ c #1E439D",
"% c #204398",
"& c #204399",
"* c #25479B",
"= c #25489A",
"- c #284A9D",
"; c #2A4C9D",
": c #30519E",
"> c #3B589A",
", c #3D599B",
"< c #1840A2",
"1 c #1E45A1",
"2 c #1E4AB4",
"3 c #2D4FA0",
"4 c #224AAC",
"5 c #254DAC",
"6 c #294FA9",
"7 c #2B52AE",
"8 c #3051A0",
"9 c #3354A0",
"0 c #3354A2",
"q c #3454A3",
"w c #3456A4",
"e c #3556A4",
"r c #3C5BA3",
"t c #395AA6",
"y c #3E5CA6",
"u c #3E5DA7",
"i c #3F5EA6",
"p c #2A51B0",
"a c #2E55B5",
"s c #2752BA",
"d c #3058B8",
"f c #3F61B2",
"g c #415FA7",
"h c #4562A7",
"j c #4864A7",
"k c #4D67A5",
"l c #4361A8",
"z c #4361A9",
"x c #4663A8",
"c c #4563AA",
"v c #4764AA",
"b c #4B68AE",
"n c #506AA8",
"m c #516DAD",
"M c #546EAC",
"N c #5F75AB",
"B c #5A72AC",
"V c #5C77B6",
"C c #6C7DA7",
"Z c #6077AD",
"A c #687DAF",
"S c #637BB4",
"D c #687FB7",
"F c #2D59C1",
"G c #2E5AC2",
"H c #2F5ECE",
"J c #3763CC",
"K c #4169CB",
"L c #7787AC",
"P c #7E8CAE",
"I c #7A8BB5",
"U c #7B8CB4",
"Y c #7C8FBD",
"T c #758FCA",
"R c #808CA8",
"E c #969DAF",
"W c #8291B4",
"Q c #8A95B0",
"! c #8B96B1",
"~ c #8F9AB3",
"^ c #8D98B5",
"/ c #8E9AB7",
"( c #8997B8",
") c #949EB9",
"_ c #99A1B4",
"` c #ADAFB7",
"' c #A5ABB8",
"] c #A6ABB8",
"[ c #AAAFBE",
"{ c #AFB2BE",
"} c #B0B1B6",
"| c #BAB8B6",
" . c #B4B5BC",
".. c #B6B9BF",
"X. c #BBB9B8",
"o. c #8C9DC3",
"O. c #8EA3D4",
"+. c #97AAD4",
"@. c #ACB5C9",
"#. c #B3B7C0",
"$. c #A1B1D5",
"%. c #BAC3D7",
"&. c #BEC6D6",
"*. c #D7D2C7",
"=. c #C2C8D6",
"-. c #D2D6DF",
";. c #E8E4DA",
":. c #CED5E4",
">. c #FFF9EC",
",. c #F3F4F5",
"<. c #F6F8FB",
"1. c None",
/* pixels */
"1.1.1.1.#./ W ~ } 1.1.1.",
"1.1.1.U r c b t h Q 1.1.",
"1.1.A 3 $.<.,.&.m w ^ 1.",
"1.( 0 z :.%.=.;.) e x ` ",
"1.n u v M * B *.R O @ P ",
"' i z l - 9 { | > $ # Z ",
"_ y l ; & [ X., 1 6 4 D ",
"] g 8 o : .C < 7 a s o.",
"1.k X % = I S 5 d G K ..",
"1.! . j >.-.p F H +.1.",
"1.1.L X + Y V 2 J O.1.1.",
"1.1.1.E N q f T @.1.1.1."
};
wxRibbonMSWArtProvider::wxRibbonMSWArtProvider(bool set_colour_scheme) wxRibbonMSWArtProvider::wxRibbonMSWArtProvider(bool set_colour_scheme)
{ {
m_flags = 0; m_flags = 0;
@@ -154,6 +298,8 @@ wxRibbonMSWArtProvider::wxRibbonMSWArtProvider(bool set_colour_scheme)
m_gallery_bitmap_padding_right_size = 4; m_gallery_bitmap_padding_right_size = 4;
m_gallery_bitmap_padding_top_size = 4; m_gallery_bitmap_padding_top_size = 4;
m_gallery_bitmap_padding_bottom_size = 4; m_gallery_bitmap_padding_bottom_size = 4;
m_toggle_button_offset = 22;
m_help_button_offset = 22;
} }
wxRibbonMSWArtProvider::~wxRibbonMSWArtProvider() wxRibbonMSWArtProvider::~wxRibbonMSWArtProvider()
@@ -343,6 +489,8 @@ void wxRibbonMSWArtProvider::CloneTo(wxRibbonMSWArtProvider* copy) const
copy->m_panel_extension_bitmap[i] = m_panel_extension_bitmap[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_up_bitmap[i] = m_ribbon_toggle_up_bitmap[i];
copy->m_ribbon_toggle_down_bitmap[i] = m_ribbon_toggle_down_bitmap[i]; copy->m_ribbon_toggle_down_bitmap[i] = m_ribbon_toggle_down_bitmap[i];
copy->m_ribbon_toggle_pin_bitmap[i] = m_ribbon_toggle_pin_bitmap[i];
copy->m_ribbon_bar_help_button_bitmap[i] = m_ribbon_bar_help_button_bitmap[i];
} }
copy->m_toolbar_drop_bitmap = m_toolbar_drop_bitmap; copy->m_toolbar_drop_bitmap = m_toolbar_drop_bitmap;
@@ -1023,11 +1171,15 @@ void wxRibbonMSWArtProvider::SetColour(int id, const wxColor& colour)
m_page_toggle_face_colour = colour; m_page_toggle_face_colour = colour;
m_ribbon_toggle_down_bitmap[0] = wxRibbonLoadPixmap(panel_toggle_down_xpm, 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); m_ribbon_toggle_up_bitmap[0] = wxRibbonLoadPixmap(panel_toggle_up_xpm, colour);
m_ribbon_toggle_pin_bitmap[0] = wxRibbonLoadPixmap(ribbon_toggle_pin_xpm, colour);
m_ribbon_bar_help_button_bitmap[0] = wxRibbonLoadPixmap(ribbon_help_button_xpm, colour);
break; break;
case wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR: case wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR:
m_page_toggle_hover_face_colour = colour; m_page_toggle_hover_face_colour = colour;
m_ribbon_toggle_down_bitmap[1] = wxRibbonLoadPixmap(panel_toggle_down_xpm, 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); m_ribbon_toggle_up_bitmap[1] = wxRibbonLoadPixmap(panel_toggle_up_xpm, colour);
m_ribbon_toggle_pin_bitmap[1] = wxRibbonLoadPixmap(ribbon_toggle_pin_xpm, colour);
m_ribbon_bar_help_button_bitmap[1] = wxRibbonLoadPixmap(ribbon_help_button_xpm, colour);
break; break;
default: default:
wxFAIL_MSG(wxT("Invalid Metric Ordinal")); wxFAIL_MSG(wxT("Invalid Metric Ordinal"));
@@ -2517,8 +2669,9 @@ void
wxRibbonMSWArtProvider::DrawToggleButton(wxDC& dc, wxRibbonMSWArtProvider::DrawToggleButton(wxDC& dc,
wxRibbonBar* wnd, wxRibbonBar* wnd,
const wxRect& rect, const wxRect& rect,
bool upBitmap) wxRibbonDisplayMode mode)
{ {
int bindex = 0;
DrawPartialPageBackground(dc, wnd, rect, false); DrawPartialPageBackground(dc, wnd, rect, false);
dc.DestroyClippingRegion(); dc.DestroyClippingRegion();
@@ -2528,19 +2681,44 @@ wxRibbonMSWArtProvider::DrawToggleButton(wxDC& dc,
{ {
dc.SetPen(m_ribbon_toggle_pen); dc.SetPen(m_ribbon_toggle_pen);
dc.SetBrush(m_ribbon_toggle_brush); dc.SetBrush(m_ribbon_toggle_brush);
dc.DrawRoundedRectangle(rect.GetX(), rect.GetY(), 12, 12, 1.0); dc.DrawRoundedRectangle(rect.GetX(), rect.GetY(), 20, 20, 1.0);
if(upBitmap) bindex = 1;
dc.DrawBitmap(m_ribbon_toggle_up_bitmap[1], rect.GetX()+2, rect.GetY()+2, true); }
else switch(mode)
dc.DrawBitmap(m_ribbon_toggle_down_bitmap[1], rect.GetX()+2, rect.GetY()+2, true); {
case wxRIBBON_BAR_PINNED:
dc.DrawBitmap(m_ribbon_toggle_up_bitmap[bindex], rect.GetX()+7, rect.GetY()+6, true);
break;
case wxRIBBON_BAR_MINIMIZED:
dc.DrawBitmap(m_ribbon_toggle_down_bitmap[bindex], rect.GetX()+7, rect.GetY()+6, true);
break;
case wxRIBBON_BAR_EXPANDED:
dc.DrawBitmap(m_ribbon_toggle_pin_bitmap[bindex], rect.GetX ()+4, rect.GetY ()+5, true);
break;
}
}
void wxRibbonMSWArtProvider::DrawHelpButton(wxDC& dc,
wxRibbonBar* wnd,
const wxRect& rect)
{
DrawPartialPageBackground(dc, wnd, rect, false);
dc.DestroyClippingRegion();
dc.SetClippingRegion(rect);
if ( wnd->IsHelpButtonHovered() )
{
dc.SetPen(m_ribbon_toggle_pen);
dc.SetBrush(m_ribbon_toggle_brush);
dc.DrawRoundedRectangle(rect.GetX(), rect.GetY(), 20, 20, 1.0);
dc.DrawBitmap(m_ribbon_bar_help_button_bitmap[1], rect.GetX ()+4, rect.GetY()+5, true);
} }
else else
{ {
if(upBitmap) dc.DrawBitmap(m_ribbon_bar_help_button_bitmap[0], rect.GetX ()+4, rect.GetY()+5, true);
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( void wxRibbonMSWArtProvider::GetBarTabWidth(
@@ -2998,12 +3176,21 @@ wxSize wxRibbonMSWArtProvider::GetToolSize(
} }
wxRect wxRect
wxRibbonMSWArtProvider::GetBarToggleButtonArea(wxDC& WXUNUSED(dc), wxRibbonMSWArtProvider::GetBarToggleButtonArea(const wxRect& rect)
const wxRibbonBar* WXUNUSED(wnd),
wxRect rect)
{ {
rect = wxRect(rect.GetWidth()-30, 6, 12, 12); wxRect rectOut = wxRect(rect.GetWidth()-m_toggle_button_offset, 2, 20, 20);
return rect; if ( (m_toggle_button_offset==22) && (m_help_button_offset==22) )
m_help_button_offset += 22;
return rectOut;
}
wxRect
wxRibbonMSWArtProvider::GetRibbonHelpButtonArea(const wxRect& rect)
{
wxRect rectOut = wxRect(rect.GetWidth()-m_help_button_offset, 2, 20, 20);
if ( (m_toggle_button_offset==22) && (m_help_button_offset==22) )
m_toggle_button_offset += 22;
return rectOut;
} }
#endif // wxUSE_RIBBON #endif // wxUSE_RIBBON

View File

@@ -41,6 +41,7 @@ wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_DOWN, wxRibbonBarEvent);
wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, wxRibbonBarEvent); wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, wxRibbonBarEvent);
wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, wxRibbonBarEvent); wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, wxRibbonBarEvent);
wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TOGGLED, wxRibbonBarEvent); wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TOGGLED, wxRibbonBarEvent);
wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED, wxRibbonBarEvent);
IMPLEMENT_CLASS(wxRibbonBar, wxRibbonControl) IMPLEMENT_CLASS(wxRibbonBar, wxRibbonControl)
IMPLEMENT_DYNAMIC_CLASS(wxRibbonBarEvent, wxNotifyEvent) IMPLEMENT_DYNAMIC_CLASS(wxRibbonBarEvent, wxNotifyEvent)
@@ -58,6 +59,7 @@ BEGIN_EVENT_TABLE(wxRibbonBar, wxRibbonControl)
EVT_RIGHT_UP(wxRibbonBar::OnMouseRightUp) EVT_RIGHT_UP(wxRibbonBar::OnMouseRightUp)
EVT_LEFT_DCLICK(wxRibbonBar::OnMouseDoubleClick) EVT_LEFT_DCLICK(wxRibbonBar::OnMouseDoubleClick)
EVT_SIZE(wxRibbonBar::OnSize) EVT_SIZE(wxRibbonBar::OnSize)
EVT_KILL_FOCUS(wxRibbonBar::OnKillFocus)
END_EVENT_TABLE() END_EVENT_TABLE()
void wxRibbonBar::AddPage(wxRibbonPage *page) void wxRibbonBar::AddPage(wxRibbonPage *page)
@@ -245,7 +247,10 @@ void wxRibbonBar::OnMouseMove(wxMouseEvent& evt)
{ {
RefreshTabBar(); RefreshTabBar();
} }
HitTestToggleButton(evt.GetPosition()); if ( m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON )
HitTestRibbonButton(m_toggle_button_rect, evt.GetPosition(), m_toggle_button_hovered);
if ( m_flags & wxRIBBON_BAR_SHOW_HELP_BUTTON )
HitTestRibbonButton(m_help_button_rect, evt.GetPosition(), m_help_button_hovered);
} }
void wxRibbonBar::OnMouseLeave(wxMouseEvent& WXUNUSED(evt)) void wxRibbonBar::OnMouseLeave(wxMouseEvent& WXUNUSED(evt))
@@ -279,6 +284,12 @@ void wxRibbonBar::OnMouseLeave(wxMouseEvent& WXUNUSED(evt))
m_toggle_button_hovered = false; m_toggle_button_hovered = false;
Refresh(false); Refresh(false);
} }
if ( m_help_button_hovered )
{
m_help_button_hovered = false;
m_bar_hovered = false;
Refresh(false);
}
} }
wxRibbonPage* wxRibbonBar::GetPage(int n) wxRibbonPage* wxRibbonBar::GetPage(int n)
@@ -513,13 +524,17 @@ void wxRibbonBar::RecalculateTabSizes()
} }
{ {
wxClientDC temp_dc(this); wxClientDC temp_dc(this);
int right_button_pos = GetClientSize().GetWidth() - m_tab_margin_right - m_tab_scroll_right_button_rect.GetWidth();
if ( right_button_pos < m_tab_margin_left )
right_button_pos = m_tab_margin_left;
m_tab_scroll_left_button_rect.SetWidth(m_art->GetScrollButtonMinimumSize(temp_dc, this, wxRIBBON_SCROLL_BTN_LEFT | wxRIBBON_SCROLL_BTN_NORMAL | wxRIBBON_SCROLL_BTN_FOR_TABS).GetWidth()); m_tab_scroll_left_button_rect.SetWidth(m_art->GetScrollButtonMinimumSize(temp_dc, this, wxRIBBON_SCROLL_BTN_LEFT | wxRIBBON_SCROLL_BTN_NORMAL | wxRIBBON_SCROLL_BTN_FOR_TABS).GetWidth());
m_tab_scroll_left_button_rect.SetHeight(m_tab_height); m_tab_scroll_left_button_rect.SetHeight(m_tab_height);
m_tab_scroll_left_button_rect.SetX(m_tab_margin_left); m_tab_scroll_left_button_rect.SetX(m_tab_margin_left);
m_tab_scroll_left_button_rect.SetY(0); m_tab_scroll_left_button_rect.SetY(0);
m_tab_scroll_right_button_rect.SetWidth(m_art->GetScrollButtonMinimumSize(temp_dc, this, wxRIBBON_SCROLL_BTN_RIGHT | wxRIBBON_SCROLL_BTN_NORMAL | wxRIBBON_SCROLL_BTN_FOR_TABS).GetWidth()); m_tab_scroll_right_button_rect.SetWidth(m_art->GetScrollButtonMinimumSize(temp_dc, this, wxRIBBON_SCROLL_BTN_RIGHT | wxRIBBON_SCROLL_BTN_NORMAL | wxRIBBON_SCROLL_BTN_FOR_TABS).GetWidth());
m_tab_scroll_right_button_rect.SetHeight(m_tab_height); m_tab_scroll_right_button_rect.SetHeight(m_tab_height);
m_tab_scroll_right_button_rect.SetX(GetClientSize().GetWidth() - m_tab_margin_right - m_tab_scroll_right_button_rect.GetWidth()); m_tab_scroll_right_button_rect.SetX(right_button_pos);
m_tab_scroll_right_button_rect.SetY(0); m_tab_scroll_right_button_rect.SetY(0);
} }
if(m_tab_scroll_amount == 0) if(m_tab_scroll_amount == 0)
@@ -729,6 +744,10 @@ void wxRibbonBar::CommonInit(long style)
m_tabs_total_width_minimum = 0; m_tabs_total_width_minimum = 0;
m_tab_margin_left = 50; m_tab_margin_left = 50;
m_tab_margin_right = 20; m_tab_margin_right = 20;
if ( m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON )
m_tab_margin_right += 20;
if ( m_flags & wxRIBBON_BAR_SHOW_HELP_BUTTON )
m_tab_margin_right += 20;
m_tab_height = 20; // initial guess m_tab_height = 20; // initial guess
m_tab_scroll_amount = 0; m_tab_scroll_amount = 0;
m_current_page = -1; m_current_page = -1;
@@ -746,6 +765,8 @@ void wxRibbonBar::CommonInit(long style)
m_toggle_button_hovered = false; m_toggle_button_hovered = false;
m_bar_hovered = false; m_bar_hovered = false;
m_ribbon_state = wxRIBBON_BAR_PINNED;
} }
void wxRibbonBar::SetArtProvider(wxRibbonArtProvider* art) void wxRibbonBar::SetArtProvider(wxRibbonArtProvider* art)
@@ -783,7 +804,10 @@ void wxRibbonBar::OnPaint(wxPaintEvent& WXUNUSED(evt))
DoEraseBackground(dc); DoEraseBackground(dc);
m_toggle_button_rect = m_art->GetBarToggleButtonArea(dc, this, GetSize()); if ( m_flags & wxRIBBON_BAR_SHOW_HELP_BUTTON )
m_help_button_rect = m_art->GetRibbonHelpButtonArea(GetSize());
if ( m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON )
m_toggle_button_rect = m_art->GetBarToggleButtonArea(GetSize());
size_t numtabs = m_pages.GetCount(); size_t numtabs = m_pages.GetCount();
double sep_visibility = 0.0; double sep_visibility = 0.0;
@@ -848,19 +872,25 @@ void wxRibbonBar::OnPaint(wxPaintEvent& WXUNUSED(evt))
} }
if(m_tab_scroll_buttons_shown) if(m_tab_scroll_buttons_shown)
{ {
dc.DestroyClippingRegion();
if(m_tab_scroll_left_button_rect.GetWidth() != 0) if(m_tab_scroll_left_button_rect.GetWidth() != 0)
{ {
dc.DestroyClippingRegion();
dc.SetClippingRegion(m_tab_scroll_left_button_rect);
m_art->DrawScrollButton(dc, this, m_tab_scroll_left_button_rect, wxRIBBON_SCROLL_BTN_LEFT | m_tab_scroll_left_button_state | wxRIBBON_SCROLL_BTN_FOR_TABS); m_art->DrawScrollButton(dc, this, m_tab_scroll_left_button_rect, wxRIBBON_SCROLL_BTN_LEFT | m_tab_scroll_left_button_state | wxRIBBON_SCROLL_BTN_FOR_TABS);
} }
if(m_tab_scroll_right_button_rect.GetWidth() != 0) if(m_tab_scroll_right_button_rect.GetWidth() != 0)
{ {
dc.DestroyClippingRegion();
dc.SetClippingRegion(m_tab_scroll_right_button_rect);
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); 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_HELP_BUTTON )
m_art->DrawHelpButton(dc, this, m_help_button_rect);
if ( m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON ) if ( m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON )
m_art->DrawToggleButton(dc, this, rect, ArePanelsShown()); m_art->DrawToggleButton(dc, this, m_toggle_button_rect, m_ribbon_state);
} }
void wxRibbonBar::OnEraseBackground(wxEraseEvent& WXUNUSED(evt)) void wxRibbonBar::OnEraseBackground(wxEraseEvent& WXUNUSED(evt))
@@ -931,6 +961,28 @@ wxRibbonPageTabInfo* wxRibbonBar::HitTestTabs(wxPoint position, int* index)
void wxRibbonBar::OnMouseLeftDown(wxMouseEvent& evt) void wxRibbonBar::OnMouseLeftDown(wxMouseEvent& evt)
{ {
wxRibbonPageTabInfo *tab = HitTestTabs(evt.GetPosition()); wxRibbonPageTabInfo *tab = HitTestTabs(evt.GetPosition());
SetFocus();
if ( tab )
{
if ( m_ribbon_state == wxRIBBON_BAR_MINIMIZED )
{
ShowPanels();
m_ribbon_state = wxRIBBON_BAR_EXPANDED;
}
else if ( (tab == &m_pages.Item(m_current_page)) && (m_ribbon_state == wxRIBBON_BAR_EXPANDED) )
{
HidePanels();
m_ribbon_state = wxRIBBON_BAR_MINIMIZED;
}
}
else
{
if ( m_ribbon_state == wxRIBBON_BAR_EXPANDED )
{
HidePanels();
m_ribbon_state = wxRIBBON_BAR_MINIMIZED;
}
}
if(tab && tab != &m_pages.Item(m_current_page)) if(tab && tab != &m_pages.Item(m_current_page))
{ {
wxRibbonBarEvent query(wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGING, GetId(), tab->page); wxRibbonBarEvent query(wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGING, GetId(), tab->page);
@@ -968,11 +1020,22 @@ void wxRibbonBar::OnMouseLeftDown(wxMouseEvent& evt)
{ {
if(m_toggle_button_rect.Contains(position)) if(m_toggle_button_rect.Contains(position))
{ {
ShowPanels(!ArePanelsShown()); bool pshown = ArePanelsShown();
ShowPanels(!pshown);
if ( pshown )
m_ribbon_state = wxRIBBON_BAR_MINIMIZED;
else
m_ribbon_state = wxRIBBON_BAR_PINNED;
wxRibbonBarEvent event(wxEVT_COMMAND_RIBBONBAR_TOGGLED, GetId()); wxRibbonBarEvent event(wxEVT_COMMAND_RIBBONBAR_TOGGLED, GetId());
event.SetEventObject(this); event.SetEventObject(this);
ProcessWindowEvent(event); ProcessWindowEvent(event);
} }
if ( m_help_button_rect.Contains(position) )
{
wxRibbonBarEvent event(wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED, GetId());
event.SetEventObject(this);
ProcessWindowEvent(event);
}
} }
} }
} }
@@ -1091,7 +1154,21 @@ void wxRibbonBar::OnMouseRightUp(wxMouseEvent& evt)
void wxRibbonBar::OnMouseDoubleClick(wxMouseEvent& evt) void wxRibbonBar::OnMouseDoubleClick(wxMouseEvent& evt)
{ {
DoMouseButtonCommon(evt, wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK); wxRibbonPageTabInfo *tab = HitTestTabs(evt.GetPosition());
SetFocus();
if ( tab && tab == &m_pages.Item(m_current_page) )
{
if ( m_ribbon_state == wxRIBBON_BAR_PINNED )
{
m_ribbon_state = wxRIBBON_BAR_MINIMIZED;
HidePanels();
}
else
{
m_ribbon_state = wxRIBBON_BAR_PINNED;
ShowPanels();
}
}
} }
void wxRibbonBar::DoMouseButtonCommon(wxMouseEvent& evt, wxEventType tab_event_type) void wxRibbonBar::DoMouseButtonCommon(wxMouseEvent& evt, wxEventType tab_event_type)
@@ -1158,7 +1235,7 @@ wxSize wxRibbonBar::DoGetBestSize() const
return best; return best;
} }
void wxRibbonBar::HitTestToggleButton(wxPoint position) void wxRibbonBar::HitTestRibbonButton(const wxRect& rect, const wxPoint& position, bool &hover_flag)
{ {
bool hovered = false, toggle_button_hovered = false; bool hovered = false, toggle_button_hovered = false;
if(position.x >= 0 && position.y >= 0) if(position.x >= 0 && position.y >= 0)
@@ -1171,16 +1248,34 @@ void wxRibbonBar::HitTestToggleButton(wxPoint position)
} }
if(hovered) if(hovered)
{ {
toggle_button_hovered = (m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON) && toggle_button_hovered = rect.Contains(position);
m_toggle_button_rect.Contains(position);
if(hovered != m_bar_hovered || toggle_button_hovered != m_toggle_button_hovered) if ( hovered != m_bar_hovered || toggle_button_hovered != hover_flag )
{ {
m_bar_hovered = hovered; m_bar_hovered = hovered;
m_toggle_button_hovered = toggle_button_hovered; hover_flag = toggle_button_hovered;
Refresh(false); Refresh(false);
} }
} }
} }
void wxRibbonBar::HideIfExpanded()
{
if ( m_ribbon_state == wxRIBBON_BAR_EXPANDED )
{
HidePanels();
m_ribbon_state = wxRIBBON_BAR_MINIMIZED;
}
else
{
ShowPanels();
m_ribbon_state = wxRIBBON_BAR_PINNED;
}
}
void wxRibbonBar::OnKillFocus(wxFocusEvent& WXUNUSED(evt))
{
HideIfExpanded();
}
#endif // wxUSE_RIBBON #endif // wxUSE_RIBBON

View File

@@ -17,6 +17,7 @@
#if wxUSE_RIBBON #if wxUSE_RIBBON
#include "wx/ribbon/panel.h"
#include "wx/ribbon/buttonbar.h" #include "wx/ribbon/buttonbar.h"
#include "wx/ribbon/art.h" #include "wx/ribbon/art.h"
#include "wx/dcbuffer.h" #include "wx/dcbuffer.h"
@@ -1100,6 +1101,8 @@ void wxRibbonButtonBar::OnMouseUp(wxMouseEvent& evt)
m_lock_active_state = true; m_lock_active_state = true;
ProcessWindowEvent(notification); ProcessWindowEvent(notification);
m_lock_active_state = false; m_lock_active_state = false;
wxStaticCast(m_parent, wxRibbonPanel)->HideIfExpanded();
} while(false); } while(false);
if(m_active_button) // may have been NULLed by event handler if(m_active_button) // may have been NULLed by event handler
{ {

View File

@@ -1091,4 +1091,9 @@ wxSize wxRibbonPage::DoGetBestSize() const
return best; return best;
} }
void wxRibbonPage::HideIfExpanded()
{
wxStaticCast(m_parent, wxRibbonBar)->HideIfExpanded();
}
#endif // wxUSE_RIBBON #endif // wxUSE_RIBBON

View File

@@ -1099,4 +1099,9 @@ wxRect wxRibbonPanel::GetExpandedPosition(wxRect panel,
return best; return best;
} }
void wxRibbonPanel::HideIfExpanded()
{
wxStaticCast(m_parent, wxRibbonPage)->HideIfExpanded();
}
#endif // wxUSE_RIBBON #endif // wxUSE_RIBBON

View File

@@ -1149,6 +1149,8 @@ void wxRibbonToolBar::OnMouseUp(wxMouseEvent& WXUNUSED(evt))
notification.SetEventObject(this); notification.SetEventObject(this);
notification.SetBar(this); notification.SetBar(this);
ProcessEvent(notification); ProcessEvent(notification);
wxStaticCast(m_parent, wxRibbonPanel)->HideIfExpanded();
} }
// Notice that m_active_tool could have been reset by the event handler // Notice that m_active_tool could have been reset by the event handler