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:
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,
wxRIBBON_GALLERY_BUTTON_DISABLED
};
+class wxRibbonBar;
class wxRibbonPage;
class wxRibbonPanel;
class wxRibbonGallery;
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,
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
wxRibbonButtonKind kind,
long state);
+ void DrawToggleButton(
+ wxDC& dc,
+ wxRibbonBar* wnd,
+ const wxRect& rect,
+ bool upBitmap);
+
void GetBarTabWidth(
wxDC& dc,
wxWindow* wnd,
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,
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;
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;
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;
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;
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
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);
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;
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)
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&);
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
%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 )
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
@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 |
@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
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}
void OnHidePages(wxRibbonButtonBarEvent& evt);
void OnShowPages(wxRibbonButtonBarEvent& evt);
void OnTogglePanels(wxCommandEvent& evt);
+ void OnRibbonBarToggled(wxRibbonBarEvent& evt);
void OnExtButton(wxRibbonPanelEvent& evt);
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"
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);
m_ribbon->ShowPage(3);
m_ribbon->Realize();
}
+
+void MyFrame::OnRibbonBarToggled(wxRibbonBarEvent& WXUNUSED(evt))
+{
+ AddText(wxString::Format("Ribbon bar %s.",
+ m_ribbon->ArePanelsShown()
+ ? "expanded"
+ : "collapsed"));
+}
"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;
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);
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;
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;
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;
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;
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;
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;
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),
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
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)
{
RefreshTabBar();
}
+ HitTestToggleButton(evt.GetPosition());
}
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)
SetArtProvider(new wxRibbonDefaultArtProvider);
}
SetBackgroundStyle(wxBG_STYLE_CUSTOM);
+
+ m_toggle_button_hovered = false;
+ m_bar_hovered = false;
}
void wxRibbonBar::SetArtProvider(wxRibbonArtProvider* art)
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;
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))
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))
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