1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/ribbon/art_aui.cpp
3 // Purpose: AUI style art provider for ribbon interface
4 // Author: Peter Cawley
8 // Copyright: (C) Peter Cawley
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
19 #include "wx/settings.h"
20 #include "wx/ribbon/art.h"
24 #include "wx/ribbon/art_internal.h"
25 #include "wx/ribbon/bar.h"
26 #include "wx/ribbon/buttonbar.h"
27 #include "wx/ribbon/gallery.h"
28 #include "wx/ribbon/toolbar.h"
34 #include "wx/msw/private.h"
35 #elif defined(__WXMAC__)
36 #include "wx/osx/private.h"
37 // only for kThemeBrushToolbarBackground
38 #include <Carbon/Carbon.h>
41 wxRibbonAUIArtProvider::wxRibbonAUIArtProvider()
42 : wxRibbonMSWArtProvider(false)
44 #if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON
45 wxColor base_colour
= wxColour( wxMacCreateCGColorFromHITheme(kThemeBrushToolbarBackground
));
47 wxColor base_colour
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
);
50 SetColourScheme(base_colour
,
51 wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT
),
52 wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT
));
54 m_tab_active_label_font
= m_tab_label_font
;
55 m_tab_active_label_font
.SetWeight(wxFONTWEIGHT_BOLD
);
57 m_page_border_left
= 1;
58 m_page_border_right
= 1;
59 m_page_border_top
= 1;
60 m_page_border_bottom
= 2;
61 m_tab_separation_size
= 0;
63 m_gallery_bitmap_padding_left_size
= 3;
64 m_gallery_bitmap_padding_right_size
= 3;
65 m_gallery_bitmap_padding_top_size
= 3;
66 m_gallery_bitmap_padding_bottom_size
= 3;
69 wxRibbonAUIArtProvider::~wxRibbonAUIArtProvider()
73 wxRibbonArtProvider
* wxRibbonAUIArtProvider::Clone() const
75 wxRibbonAUIArtProvider
*copy
= new wxRibbonAUIArtProvider();
78 copy
->m_tab_ctrl_background_colour
= m_tab_ctrl_background_colour
;
79 copy
->m_tab_ctrl_background_gradient_colour
= m_tab_ctrl_background_gradient_colour
;
80 copy
->m_panel_label_background_colour
= m_panel_label_background_colour
;
81 copy
->m_panel_label_background_gradient_colour
= m_panel_label_background_gradient_colour
;
82 copy
->m_panel_hover_label_background_colour
= m_panel_hover_label_background_colour
;
83 copy
->m_panel_hover_label_background_gradient_colour
= m_panel_hover_label_background_gradient_colour
;
85 copy
->m_background_brush
= m_background_brush
;
86 copy
->m_tab_active_top_background_brush
= m_tab_active_top_background_brush
;
87 copy
->m_tab_hover_background_brush
= m_tab_hover_background_brush
;
88 copy
->m_button_bar_hover_background_brush
= m_button_bar_hover_background_brush
;
89 copy
->m_button_bar_active_background_brush
= m_button_bar_active_background_brush
;
90 copy
->m_gallery_button_active_background_brush
= m_gallery_button_active_background_brush
;
91 copy
->m_gallery_button_hover_background_brush
= m_gallery_button_hover_background_brush
;
92 copy
->m_gallery_button_disabled_background_brush
= m_gallery_button_disabled_background_brush
;
94 copy
->m_toolbar_hover_borden_pen
= m_toolbar_hover_borden_pen
;
95 copy
->m_tool_hover_background_brush
= m_tool_hover_background_brush
;
96 copy
->m_tool_active_background_brush
= m_tool_active_background_brush
;
101 void wxRibbonAUIArtProvider::SetFont(int id
, const wxFont
& font
)
103 wxRibbonMSWArtProvider::SetFont(id
, font
);
104 if(id
== wxRIBBON_ART_TAB_LABEL_FONT
)
106 m_tab_active_label_font
= m_tab_label_font
;
107 m_tab_active_label_font
.SetWeight(wxFONTWEIGHT_BOLD
);
111 wxColour
wxRibbonAUIArtProvider::GetColour(int id
) const
115 case wxRIBBON_ART_PAGE_BACKGROUND_COLOUR
:
116 case wxRIBBON_ART_PAGE_BACKGROUND_GRADIENT_COLOUR
:
117 return m_background_brush
.GetColour();
118 case wxRIBBON_ART_TAB_CTRL_BACKGROUND_COLOUR
:
119 return m_tab_ctrl_background_colour
;
120 case wxRIBBON_ART_TAB_CTRL_BACKGROUND_GRADIENT_COLOUR
:
121 return m_tab_ctrl_background_gradient_colour
;
122 case wxRIBBON_ART_TAB_ACTIVE_BACKGROUND_TOP_COLOUR
:
123 case wxRIBBON_ART_TAB_ACTIVE_BACKGROUND_TOP_GRADIENT_COLOUR
:
124 return m_tab_active_top_background_brush
.GetColour();
125 case wxRIBBON_ART_TAB_HOVER_BACKGROUND_COLOUR
:
126 case wxRIBBON_ART_TAB_HOVER_BACKGROUND_GRADIENT_COLOUR
:
127 return m_tab_hover_background_brush
.GetColour();
128 case wxRIBBON_ART_PANEL_LABEL_BACKGROUND_COLOUR
:
129 return m_panel_label_background_colour
;
130 case wxRIBBON_ART_PANEL_LABEL_BACKGROUND_GRADIENT_COLOUR
:
131 return m_panel_label_background_gradient_colour
;
132 case wxRIBBON_ART_PANEL_HOVER_LABEL_BACKGROUND_COLOUR
:
133 return m_panel_hover_label_background_colour
;
134 case wxRIBBON_ART_PANEL_HOVER_LABEL_BACKGROUND_GRADIENT_COLOUR
:
135 return m_panel_hover_label_background_gradient_colour
;
136 case wxRIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_COLOUR
:
137 case wxRIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_GRADIENT_COLOUR
:
138 return m_button_bar_hover_background_brush
.GetColour();
139 case wxRIBBON_ART_GALLERY_BUTTON_HOVER_BACKGROUND_COLOUR
:
140 case wxRIBBON_ART_GALLERY_BUTTON_HOVER_BACKGROUND_GRADIENT_COLOUR
:
141 return m_gallery_button_hover_background_brush
.GetColour();
142 case wxRIBBON_ART_GALLERY_BUTTON_ACTIVE_BACKGROUND_COLOUR
:
143 case wxRIBBON_ART_GALLERY_BUTTON_ACTIVE_BACKGROUND_GRADIENT_COLOUR
:
144 return m_gallery_button_active_background_brush
.GetColour();
145 case wxRIBBON_ART_GALLERY_BUTTON_DISABLED_BACKGROUND_COLOUR
:
146 case wxRIBBON_ART_GALLERY_BUTTON_DISABLED_BACKGROUND_GRADIENT_COLOUR
:
147 return m_gallery_button_disabled_background_brush
.GetColour();
149 return wxRibbonMSWArtProvider::GetColour(id
);
153 void wxRibbonAUIArtProvider::SetColour(int id
, const wxColor
& colour
)
157 case wxRIBBON_ART_PAGE_BACKGROUND_COLOUR
:
158 case wxRIBBON_ART_PAGE_BACKGROUND_GRADIENT_COLOUR
:
159 m_background_brush
.SetColour(colour
);
161 case wxRIBBON_ART_TAB_CTRL_BACKGROUND_COLOUR
:
162 m_tab_ctrl_background_colour
= colour
;
164 case wxRIBBON_ART_TAB_CTRL_BACKGROUND_GRADIENT_COLOUR
:
165 m_tab_ctrl_background_gradient_colour
= colour
;
167 case wxRIBBON_ART_TAB_ACTIVE_BACKGROUND_TOP_COLOUR
:
168 case wxRIBBON_ART_TAB_ACTIVE_BACKGROUND_TOP_GRADIENT_COLOUR
:
169 m_tab_active_top_background_brush
.SetColour(colour
);
171 case wxRIBBON_ART_TAB_HOVER_BACKGROUND_COLOUR
:
172 case wxRIBBON_ART_TAB_HOVER_BACKGROUND_GRADIENT_COLOUR
:
173 m_tab_hover_background_brush
.SetColour(colour
);
175 case wxRIBBON_ART_PANEL_LABEL_BACKGROUND_COLOUR
:
176 m_panel_label_background_colour
= colour
;
178 case wxRIBBON_ART_PANEL_LABEL_BACKGROUND_GRADIENT_COLOUR
:
179 m_panel_label_background_gradient_colour
= colour
;
181 case wxRIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_COLOUR
:
182 case wxRIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_GRADIENT_COLOUR
:
183 m_button_bar_hover_background_brush
.SetColour(colour
);
185 case wxRIBBON_ART_GALLERY_BUTTON_HOVER_BACKGROUND_COLOUR
:
186 case wxRIBBON_ART_GALLERY_BUTTON_HOVER_BACKGROUND_GRADIENT_COLOUR
:
187 m_gallery_button_hover_background_brush
.SetColour(colour
);
189 case wxRIBBON_ART_GALLERY_BUTTON_ACTIVE_BACKGROUND_COLOUR
:
190 case wxRIBBON_ART_GALLERY_BUTTON_ACTIVE_BACKGROUND_GRADIENT_COLOUR
:
191 m_gallery_button_active_background_brush
.SetColour(colour
);
193 case wxRIBBON_ART_GALLERY_BUTTON_DISABLED_BACKGROUND_COLOUR
:
194 case wxRIBBON_ART_GALLERY_BUTTON_DISABLED_BACKGROUND_GRADIENT_COLOUR
:
195 m_gallery_button_disabled_background_brush
.SetColour(colour
);
198 wxRibbonMSWArtProvider::SetColour(id
, colour
);
203 void wxRibbonAUIArtProvider::SetColourScheme(
204 const wxColour
& primary
,
205 const wxColour
& secondary
,
206 const wxColour
& tertiary
)
208 wxRibbonHSLColour
primary_hsl(primary
);
209 wxRibbonHSLColour
secondary_hsl(secondary
);
210 wxRibbonHSLColour
tertiary_hsl(tertiary
);
212 // Map primary & secondary luminance from [0, 1] to [0.15, 0.85]
213 primary_hsl
.luminance
= cos(primary_hsl
.luminance
* M_PI
) * -0.35 + 0.5;
214 secondary_hsl
.luminance
= cos(secondary_hsl
.luminance
* M_PI
) * -0.35 + 0.5;
216 // TODO: Remove next line once this provider stops piggybacking MSW
217 wxRibbonMSWArtProvider::SetColourScheme(primary
, secondary
, tertiary
);
219 #define LikePrimary(luminance) \
220 wxRibbonShiftLuminance(primary_hsl, luminance ## f).ToRGB()
221 #define LikeSecondary(luminance) \
222 wxRibbonShiftLuminance(secondary_hsl, luminance ## f).ToRGB()
224 m_tab_ctrl_background_colour
= LikePrimary(0.9);
225 m_tab_ctrl_background_gradient_colour
= LikePrimary(1.7);
226 m_tab_border_pen
= LikePrimary(0.75);
227 m_tab_label_colour
= LikePrimary(0.1);
228 m_tab_hover_background_top_colour
= primary_hsl
.ToRGB();
229 m_tab_hover_background_top_gradient_colour
= LikePrimary(1.6);
230 m_tab_hover_background_brush
= m_tab_hover_background_top_colour
;
231 m_tab_active_background_colour
= m_tab_ctrl_background_gradient_colour
;
232 m_tab_active_background_gradient_colour
= primary_hsl
.ToRGB();
233 m_tab_active_top_background_brush
= m_tab_active_background_colour
;
234 m_panel_label_colour
= m_tab_label_colour
;
235 m_panel_minimised_label_colour
= m_panel_label_colour
;
236 m_panel_hover_label_colour
= tertiary_hsl
.ToRGB();
237 m_page_border_pen
= m_tab_border_pen
;
238 m_panel_border_pen
= m_tab_border_pen
;
239 m_background_brush
= primary_hsl
.ToRGB();
240 m_page_hover_background_colour
= LikePrimary(1.5);
241 m_page_hover_background_gradient_colour
= LikePrimary(0.9);
242 m_panel_label_background_colour
= LikePrimary(0.85);
243 m_panel_label_background_gradient_colour
= LikePrimary(0.97);
244 m_panel_hover_label_background_gradient_colour
= secondary_hsl
.ToRGB();
245 m_panel_hover_label_background_colour
= secondary_hsl
.Lighter(0.2f
).ToRGB();
246 m_button_bar_hover_border_pen
= secondary_hsl
.ToRGB();
247 m_button_bar_hover_background_brush
= LikeSecondary(1.7);
248 m_button_bar_active_background_brush
= LikeSecondary(1.4);
249 m_button_bar_label_colour
= m_tab_label_colour
;
250 m_gallery_border_pen
= m_tab_border_pen
;
251 m_gallery_item_border_pen
= m_button_bar_hover_border_pen
;
252 m_gallery_hover_background_brush
= LikePrimary(1.2);
253 m_gallery_button_background_colour
= m_page_hover_background_colour
;
254 m_gallery_button_background_gradient_colour
= m_page_hover_background_gradient_colour
;
255 m_gallery_button_hover_background_brush
= m_button_bar_hover_background_brush
;
256 m_gallery_button_active_background_brush
= m_button_bar_active_background_brush
;
257 m_gallery_button_disabled_background_brush
= primary_hsl
.Desaturated(0.15f
).ToRGB();
258 SetColour(wxRIBBON_ART_GALLERY_BUTTON_FACE_COLOUR
, LikePrimary(0.1));
259 SetColour(wxRIBBON_ART_GALLERY_BUTTON_DISABLED_FACE_COLOUR
, wxColour(128, 128, 128));
260 SetColour(wxRIBBON_ART_GALLERY_BUTTON_ACTIVE_FACE_COLOUR
, LikeSecondary(0.1));
261 SetColour(wxRIBBON_ART_GALLERY_BUTTON_HOVER_FACE_COLOUR
, LikeSecondary(0.1));
262 m_toolbar_border_pen
= m_tab_border_pen
;
263 SetColour(wxRIBBON_ART_TOOLBAR_FACE_COLOUR
, LikePrimary(0.1));
264 m_tool_background_colour
= m_page_hover_background_colour
;
265 m_tool_background_gradient_colour
= m_page_hover_background_gradient_colour
;
266 m_toolbar_hover_borden_pen
= m_button_bar_hover_border_pen
;
267 m_tool_hover_background_brush
= m_button_bar_hover_background_brush
;
268 m_tool_active_background_brush
= m_button_bar_active_background_brush
;
274 void wxRibbonAUIArtProvider::DrawTabCtrlBackground(
276 wxWindow
* WXUNUSED(wnd
),
279 wxRect
gradient_rect(rect
);
280 gradient_rect
.height
--;
281 dc
.GradientFillLinear(gradient_rect
, m_tab_ctrl_background_colour
,
282 m_tab_ctrl_background_gradient_colour
, wxSOUTH
);
283 dc
.SetPen(m_tab_border_pen
);
284 dc
.DrawLine(rect
.x
, rect
.GetBottom(), rect
.GetRight()+1, rect
.GetBottom());
287 int wxRibbonAUIArtProvider::GetTabCtrlHeight(
289 wxWindow
* WXUNUSED(wnd
),
290 const wxRibbonPageTabInfoArray
& pages
)
295 if(pages
.GetCount() <= 1 && (m_flags
& wxRIBBON_BAR_ALWAYS_SHOW_TABS
) == 0)
297 // To preserve space, a single tab need not be displayed. We still need
298 // one pixel of border though.
302 if(m_flags
& wxRIBBON_BAR_SHOW_PAGE_LABELS
)
304 dc
.SetFont(m_tab_active_label_font
);
305 text_height
= dc
.GetTextExtent(wxT("ABCDEFXj")).GetHeight();
307 if(m_flags
& wxRIBBON_BAR_SHOW_PAGE_ICONS
)
309 size_t numpages
= pages
.GetCount();
310 for(size_t i
= 0; i
< numpages
; ++i
)
312 const wxRibbonPageTabInfo
& info
= pages
.Item(i
);
313 if(info
.page
->GetIcon().IsOk())
315 icon_height
= wxMax(icon_height
, info
.page
->GetIcon().GetHeight());
320 return wxMax(text_height
, icon_height
) + 10;
323 void wxRibbonAUIArtProvider::DrawTab(wxDC
& dc
,
324 wxWindow
* WXUNUSED(wnd
),
325 const wxRibbonPageTabInfo
& tab
)
327 if(tab
.rect
.height
<= 1)
330 dc
.SetFont(m_tab_label_font
);
331 dc
.SetPen(*wxTRANSPARENT_PEN
);
332 if(tab
.active
|| tab
.hovered
)
336 dc
.SetFont(m_tab_active_label_font
);
337 dc
.SetBrush(m_background_brush
);
338 dc
.DrawRectangle(tab
.rect
.x
, tab
.rect
.y
+ tab
.rect
.height
- 1,
339 tab
.rect
.width
- 1, 1);
341 wxRect
grad_rect(tab
.rect
);
342 grad_rect
.height
-= 4;
343 grad_rect
.width
-= 1;
344 grad_rect
.height
/= 2;
345 grad_rect
.y
= grad_rect
.y
+ tab
.rect
.height
- grad_rect
.height
- 1;
346 dc
.SetBrush(m_tab_active_top_background_brush
);
347 dc
.DrawRectangle(tab
.rect
.x
, tab
.rect
.y
+ 3, tab
.rect
.width
- 1,
348 grad_rect
.y
- tab
.rect
.y
- 3);
349 dc
.GradientFillLinear(grad_rect
, m_tab_active_background_colour
,
350 m_tab_active_background_gradient_colour
, wxSOUTH
);
354 wxRect
btm_rect(tab
.rect
);
355 btm_rect
.height
-= 4;
357 btm_rect
.height
/= 2;
358 btm_rect
.y
= btm_rect
.y
+ tab
.rect
.height
- btm_rect
.height
- 1;
359 dc
.SetBrush(m_tab_hover_background_brush
);
360 dc
.DrawRectangle(btm_rect
.x
, btm_rect
.y
, btm_rect
.width
,
362 wxRect
grad_rect(tab
.rect
);
363 grad_rect
.width
-= 1;
365 grad_rect
.height
= btm_rect
.y
- grad_rect
.y
;
366 dc
.GradientFillLinear(grad_rect
, m_tab_hover_background_top_colour
,
367 m_tab_hover_background_top_gradient_colour
, wxSOUTH
);
370 wxPoint border_points
[5];
371 border_points
[0] = wxPoint(0, 3);
372 border_points
[1] = wxPoint(1, 2);
373 border_points
[2] = wxPoint(tab
.rect
.width
- 3, 2);
374 border_points
[3] = wxPoint(tab
.rect
.width
- 1, 4);
375 border_points
[4] = wxPoint(tab
.rect
.width
- 1, tab
.rect
.height
- 1);
377 dc
.SetPen(m_tab_border_pen
);
378 dc
.DrawLines(sizeof(border_points
)/sizeof(wxPoint
), border_points
, tab
.rect
.x
, tab
.rect
.y
);
381 dc
.GetClippingBox(old_clip
);
382 bool is_first_tab
= false;
383 wxRibbonBar
* bar
= wxDynamicCast(tab
.page
->GetParent(), wxRibbonBar
);
384 if(bar
&& bar
->GetPage(0) == tab
.page
)
388 if(m_flags
& wxRIBBON_BAR_SHOW_PAGE_ICONS
)
390 icon
= tab
.page
->GetIcon();
391 if((m_flags
& wxRIBBON_BAR_SHOW_PAGE_LABELS
) == 0)
393 int x
= tab
.rect
.x
+ (tab
.rect
.width
- icon
.GetWidth()) / 2;
394 dc
.DrawBitmap(icon
, x
, tab
.rect
.y
+ 1 + (tab
.rect
.height
- 1 -
395 icon
.GetHeight()) / 2, true);
398 if(m_flags
& wxRIBBON_BAR_SHOW_PAGE_LABELS
)
400 wxString label
= tab
.page
->GetLabel();
403 dc
.SetTextForeground(m_tab_label_colour
);
404 dc
.SetBackgroundMode(wxTRANSPARENT
);
408 offset
+= icon
.GetWidth() + 2;
411 dc
.GetTextExtent(label
, &text_width
, &text_height
);
412 int x
= (tab
.rect
.width
- 2 - text_width
- offset
) / 2;
417 int width
= tab
.rect
.width
- x
- 2;
418 x
+= tab
.rect
.x
+ offset
;
419 int y
= tab
.rect
.y
+ (tab
.rect
.height
- text_height
) / 2;
422 dc
.DrawBitmap(icon
, x
- offset
, tab
.rect
.y
+ (tab
.rect
.height
-
423 icon
.GetHeight()) / 2, true);
425 dc
.SetClippingRegion(x
, tab
.rect
.y
, width
, tab
.rect
.height
);
426 dc
.DrawText(label
, x
, y
);
430 // Draw the left hand edge of the tab only for the first tab (subsequent
431 // tabs use the right edge of the prior tab as their left edge). As this is
432 // outside the rectangle for the tab, only draw it if the leftmost part of
433 // the tab is within the clip rectangle (the clip region has to be cleared
434 // to draw outside the tab).
435 if(is_first_tab
&& old_clip
.x
<= tab
.rect
.x
436 && tab
.rect
.x
< old_clip
.x
+ old_clip
.width
)
438 dc
.DestroyClippingRegion();
439 dc
.DrawLine(tab
.rect
.x
- 1, tab
.rect
.y
+ 4, tab
.rect
.x
- 1,
440 tab
.rect
.y
+ tab
.rect
.height
- 1);
444 void wxRibbonAUIArtProvider::GetBarTabWidth(
446 wxWindow
* WXUNUSED(wnd
),
447 const wxString
& label
,
448 const wxBitmap
& bitmap
,
450 int* small_begin_need_separator
,
451 int* small_must_have_separator
,
456 if((m_flags
& wxRIBBON_BAR_SHOW_PAGE_LABELS
) && !label
.IsEmpty())
458 dc
.SetFont(m_tab_active_label_font
);
459 width
+= dc
.GetTextExtent(label
).GetWidth();
460 min
+= wxMin(30, width
); // enough for a few chars
463 // gap between label and bitmap
468 if((m_flags
& wxRIBBON_BAR_SHOW_PAGE_ICONS
) && bitmap
.IsOk())
470 width
+= bitmap
.GetWidth();
471 min
+= bitmap
.GetWidth();
478 if(small_begin_need_separator
!= NULL
)
480 *small_begin_need_separator
= min
;
482 if(small_must_have_separator
!= NULL
)
484 *small_must_have_separator
= min
;
492 void wxRibbonAUIArtProvider::DrawTabSeparator(
494 wxWindow
* WXUNUSED(wnd
),
495 const wxRect
& WXUNUSED(rect
),
496 double WXUNUSED(visibility
))
498 // No explicit separators between tabs
501 void wxRibbonAUIArtProvider::DrawPageBackground(
503 wxWindow
* WXUNUSED(wnd
),
506 dc
.SetPen(*wxTRANSPARENT_PEN
);
507 dc
.SetBrush(m_background_brush
);
508 dc
.DrawRectangle(rect
.x
+ 1, rect
.y
, rect
.width
- 2, rect
.height
- 1);
510 dc
.SetPen(m_page_border_pen
);
511 dc
.DrawLine(rect
.x
, rect
.y
, rect
.x
, rect
.y
+ rect
.height
);
512 dc
.DrawLine(rect
.GetRight(), rect
.y
, rect
.GetRight(), rect
.y
+rect
.height
);
513 dc
.DrawLine(rect
.x
, rect
.GetBottom(), rect
.GetRight()+1, rect
.GetBottom());
516 wxSize
wxRibbonAUIArtProvider::GetScrollButtonMinimumSize(
518 wxWindow
* WXUNUSED(wnd
),
519 long WXUNUSED(style
))
521 return wxSize(11, 11);
524 void wxRibbonAUIArtProvider::DrawScrollButton(
526 wxWindow
* WXUNUSED(wnd
),
530 wxRect
true_rect(rect
);
531 wxPoint arrow_points
[3];
533 if((style
& wxRIBBON_SCROLL_BTN_FOR_MASK
) == wxRIBBON_SCROLL_BTN_FOR_TABS
)
536 true_rect
.height
-= 2;
537 dc
.SetPen(m_tab_border_pen
);
541 dc
.SetPen(*wxTRANSPARENT_PEN
);
542 dc
.SetBrush(m_background_brush
);
543 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
544 dc
.SetPen(m_page_border_pen
);
547 switch(style
& wxRIBBON_SCROLL_BTN_DIRECTION_MASK
)
549 case wxRIBBON_SCROLL_BTN_LEFT
:
550 dc
.DrawLine(true_rect
.GetRight(), true_rect
.y
, true_rect
.GetRight(),
551 true_rect
.y
+ true_rect
.height
);
552 arrow_points
[0] = wxPoint(rect
.width
/ 2 - 2, rect
.height
/ 2);
553 arrow_points
[1] = arrow_points
[0] + wxPoint(5, -5);
554 arrow_points
[2] = arrow_points
[0] + wxPoint(5, 5);
556 case wxRIBBON_SCROLL_BTN_RIGHT
:
557 dc
.DrawLine(true_rect
.x
, true_rect
.y
, true_rect
.x
,
558 true_rect
.y
+ true_rect
.height
);
559 arrow_points
[0] = wxPoint(rect
.width
/ 2 + 3, rect
.height
/ 2);
560 arrow_points
[1] = arrow_points
[0] - wxPoint(5, -5);
561 arrow_points
[2] = arrow_points
[0] - wxPoint(5, 5);
563 case wxRIBBON_SCROLL_BTN_DOWN
:
564 dc
.DrawLine(true_rect
.x
, true_rect
.y
, true_rect
.x
+ true_rect
.width
,
566 arrow_points
[0] = wxPoint(rect
.width
/ 2, rect
.height
/ 2 + 3);
567 arrow_points
[1] = arrow_points
[0] - wxPoint( 5, 5);
568 arrow_points
[2] = arrow_points
[0] - wxPoint(-5, 5);
570 case wxRIBBON_SCROLL_BTN_UP
:
571 dc
.DrawLine(true_rect
.x
, true_rect
.GetBottom(),
572 true_rect
.x
+ true_rect
.width
, true_rect
.GetBottom());
573 arrow_points
[0] = wxPoint(rect
.width
/ 2, rect
.height
/ 2 - 2);
574 arrow_points
[1] = arrow_points
[0] + wxPoint( 5, 5);
575 arrow_points
[2] = arrow_points
[0] + wxPoint(-5, 5);
583 if(style
& wxRIBBON_SCROLL_BTN_ACTIVE
)
589 dc
.SetPen(*wxTRANSPARENT_PEN
);
590 wxBrush
B(m_tab_label_colour
);
592 dc
.DrawPolygon(sizeof(arrow_points
)/sizeof(wxPoint
), arrow_points
, x
, y
);
595 wxSize
wxRibbonAUIArtProvider::GetPanelSize(
597 const wxRibbonPanel
* wnd
,
599 wxPoint
* client_offset
)
601 dc
.SetFont(m_panel_label_font
);
602 wxSize label_size
= dc
.GetTextExtent(wnd
->GetLabel());
603 int label_height
= label_size
.GetHeight() + 5;
604 if(m_flags
& wxRIBBON_BAR_FLOW_VERTICAL
)
606 client_size
.IncBy(4, label_height
+ 6);
608 *client_offset
= wxPoint(2, label_height
+ 3);
612 client_size
.IncBy(6, label_height
+ 4);
614 *client_offset
= wxPoint(3, label_height
+ 2);
619 wxSize
wxRibbonAUIArtProvider::GetPanelClientSize(
621 const wxRibbonPanel
* wnd
,
623 wxPoint
* client_offset
)
625 dc
.SetFont(m_panel_label_font
);
626 wxSize label_size
= dc
.GetTextExtent(wnd
->GetLabel());
627 int label_height
= label_size
.GetHeight() + 5;
628 if(m_flags
& wxRIBBON_BAR_FLOW_VERTICAL
)
630 size
.DecBy(4, label_height
+ 6);
632 *client_offset
= wxPoint(2, label_height
+ 3);
636 size
.DecBy(6, label_height
+ 4);
638 *client_offset
= wxPoint(3, label_height
+ 2);
643 void wxRibbonAUIArtProvider::DrawPanelBackground(
648 dc
.SetPen(*wxTRANSPARENT_PEN
);
649 dc
.SetBrush(m_background_brush
);
650 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
652 wxRect
true_rect(rect
);
653 RemovePanelPadding(&true_rect
);
655 dc
.SetPen(m_panel_border_pen
);
656 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
657 dc
.DrawRectangle(true_rect
.x
, true_rect
.y
, true_rect
.width
, true_rect
.height
);
660 true_rect
.width
-= 2;
663 dc
.SetFont(m_panel_label_font
);
664 wxSize label_size
= dc
.GetTextExtent(wnd
->GetLabel());
665 int label_height
= label_size
.GetHeight() + 5;
666 wxRect
label_rect(true_rect
);
667 label_rect
.height
= label_height
- 1;
668 dc
.DrawLine(label_rect
.x
, label_rect
.y
+ label_rect
.height
,
669 label_rect
.x
+ label_rect
.width
, label_rect
.y
+ label_rect
.height
);
671 wxColour label_bg_colour
= m_panel_label_background_colour
;
672 wxColour label_bg_grad_colour
= m_panel_label_background_gradient_colour
;
675 label_bg_colour
= m_panel_hover_label_background_colour
;
676 label_bg_grad_colour
= m_panel_hover_label_background_gradient_colour
;
677 dc
.SetTextForeground(m_panel_hover_label_colour
);
681 dc
.SetTextForeground(m_panel_label_colour
);
683 dc
.GradientFillLinear(label_rect
,
685 label_bg_grad_colour
, label_bg_colour
, wxSOUTH
);
687 label_bg_colour
, label_bg_grad_colour
, wxSOUTH
);
689 dc
.SetFont(m_panel_label_font
);
690 dc
.DrawText(wnd
->GetLabel(), label_rect
.x
+ 3, label_rect
.y
+ 2);
694 wxRect
gradient_rect(true_rect
);
695 gradient_rect
.y
+= label_rect
.height
+ 1;
696 gradient_rect
.height
= true_rect
.height
- label_rect
.height
- 3;
698 wxColour colour
= m_page_hover_background_gradient_colour
;
699 wxColour gradient
= m_page_hover_background_colour
;
701 wxColour colour
= m_page_hover_background_colour
;
702 wxColour gradient
= m_page_hover_background_gradient_colour
;
704 dc
.GradientFillLinear(gradient_rect
, colour
, gradient
, wxSOUTH
);
708 void wxRibbonAUIArtProvider::DrawMinimisedPanel(
714 dc
.SetPen(*wxTRANSPARENT_PEN
);
715 dc
.SetBrush(m_background_brush
);
716 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
718 wxRect
true_rect(rect
);
719 RemovePanelPadding(&true_rect
);
721 dc
.SetPen(m_panel_border_pen
);
722 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
723 dc
.DrawRectangle(true_rect
.x
, true_rect
.y
, true_rect
.width
, true_rect
.height
);
724 true_rect
.Deflate(1);
726 if(wnd
->IsHovered() || wnd
->GetExpandedPanel())
728 wxColour colour
= m_page_hover_background_colour
;
729 wxColour gradient
= m_page_hover_background_gradient_colour
;
731 if(!wnd
->GetExpandedPanel())
733 if(wnd
->GetExpandedPanel())
736 wxColour temp
= colour
;
740 dc
.GradientFillLinear(true_rect
, colour
, gradient
, wxSOUTH
);
744 DrawMinimisedPanelCommon(dc
, wnd
, true_rect
, &preview
);
746 dc
.SetPen(m_panel_border_pen
);
747 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
748 dc
.DrawRectangle(preview
.x
, preview
.y
, preview
.width
, preview
.height
);
750 wxRect
preview_caption_rect(preview
);
751 preview_caption_rect
.height
= 7;
752 preview
.y
+= preview_caption_rect
.height
;
753 preview
.height
-= preview_caption_rect
.height
;
755 dc
.GradientFillLinear(preview_caption_rect
,
756 m_panel_hover_label_background_gradient_colour
,
757 m_panel_hover_label_background_colour
, wxSOUTH
);
758 dc
.GradientFillLinear(preview
,
759 m_page_hover_background_gradient_colour
,
760 m_page_hover_background_colour
, wxSOUTH
);
762 dc
.GradientFillLinear(preview_caption_rect
,
763 m_panel_hover_label_background_colour
,
764 m_panel_hover_label_background_gradient_colour
, wxSOUTH
);
765 dc
.GradientFillLinear(preview
,
766 m_page_hover_background_colour
,
767 m_page_hover_background_gradient_colour
, wxSOUTH
);
772 dc
.DrawBitmap(bitmap
, preview
.x
+ (preview
.width
- bitmap
.GetWidth()) / 2,
773 preview
.y
+ (preview
.height
- bitmap
.GetHeight()) / 2, true);
777 void wxRibbonAUIArtProvider::DrawPartialPanelBackground(wxDC
& dc
,
778 wxWindow
* wnd
, const wxRect
& rect
)
780 dc
.SetPen(*wxTRANSPARENT_PEN
);
781 dc
.SetBrush(m_background_brush
);
782 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
784 wxPoint
offset(wnd
->GetPosition());
785 wxWindow
* parent
= wnd
->GetParent();
786 wxRibbonPanel
* panel
= NULL
;
788 for(; parent
; parent
= parent
->GetParent())
790 panel
= wxDynamicCast(parent
, wxRibbonPanel
);
793 if(!panel
->IsHovered())
797 offset
+= parent
->GetPosition();
802 wxRect
background(panel
->GetSize());
803 RemovePanelPadding(&background
);
805 background
.width
-= 2;
806 dc
.SetFont(m_panel_label_font
);
807 int caption_height
= dc
.GetTextExtent(panel
->GetLabel()).GetHeight() + 7;
808 background
.y
+= caption_height
- 1;
809 background
.height
-= caption_height
;
811 wxRect
paint_rect(rect
);
812 paint_rect
.x
+= offset
.x
;
813 paint_rect
.y
+= offset
.y
;
815 wxColour bg_clr
, bg_grad_clr
;
817 bg_grad_clr
= m_page_hover_background_colour
;
818 bg_clr
= m_page_hover_background_gradient_colour
;
820 bg_clr
= m_page_hover_background_colour
;
821 bg_grad_clr
= m_page_hover_background_gradient_colour
;
824 paint_rect
.Intersect(background
);
825 if(!paint_rect
.IsEmpty())
827 wxColour
starting_colour(wxRibbonInterpolateColour(bg_clr
, bg_grad_clr
,
828 paint_rect
.y
, background
.y
, background
.y
+ background
.height
));
829 wxColour
ending_colour(wxRibbonInterpolateColour(bg_clr
, bg_grad_clr
,
830 paint_rect
.y
+ paint_rect
.height
, background
.y
,
831 background
.y
+ background
.height
));
832 paint_rect
.x
-= offset
.x
;
833 paint_rect
.y
-= offset
.y
;
834 dc
.GradientFillLinear(paint_rect
, starting_colour
, ending_colour
839 void wxRibbonAUIArtProvider::DrawGalleryBackground(
841 wxRibbonGallery
* wnd
,
844 DrawPartialPanelBackground(dc
, wnd
, rect
);
848 dc
.SetPen(*wxTRANSPARENT_PEN
);
849 dc
.SetBrush(m_gallery_hover_background_brush
);
850 if(m_flags
& wxRIBBON_BAR_FLOW_VERTICAL
)
852 dc
.DrawRectangle(rect
.x
+ 1, rect
.y
+ 1, rect
.width
- 2,
857 dc
.DrawRectangle(rect
.x
+ 1, rect
.y
+ 1, rect
.width
- 16,
862 dc
.SetPen(m_gallery_border_pen
);
863 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
864 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
866 DrawGalleryBackgroundCommon(dc
, wnd
, rect
);
869 void wxRibbonAUIArtProvider::DrawGalleryButton(wxDC
& dc
, wxRect rect
,
870 wxRibbonGalleryButtonState state
, wxBitmap
* bitmaps
)
872 int extra_height
= 0;
874 wxRect
reduced_rect(rect
);
875 reduced_rect
.Deflate(1);
876 if(m_flags
& wxRIBBON_BAR_FLOW_VERTICAL
)
878 reduced_rect
.width
++;
883 reduced_rect
.height
++;
890 case wxRIBBON_GALLERY_BUTTON_NORMAL
:
891 dc
.GradientFillLinear(reduced_rect
,
892 m_gallery_button_background_colour
,
893 m_gallery_button_background_gradient_colour
, wxSOUTH
);
894 btn_bitmap
= bitmaps
[0];
896 case wxRIBBON_GALLERY_BUTTON_HOVERED
:
897 dc
.SetPen(m_gallery_item_border_pen
);
898 dc
.SetBrush(m_gallery_button_hover_background_brush
);
899 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
+ extra_width
,
900 rect
.height
+ extra_height
);
901 btn_bitmap
= bitmaps
[1];
903 case wxRIBBON_GALLERY_BUTTON_ACTIVE
:
904 dc
.SetPen(m_gallery_item_border_pen
);
905 dc
.SetBrush(m_gallery_button_active_background_brush
);
906 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
+ extra_width
,
907 rect
.height
+ extra_height
);
908 btn_bitmap
= bitmaps
[2];
910 case wxRIBBON_GALLERY_BUTTON_DISABLED
:
911 dc
.SetPen(*wxTRANSPARENT_PEN
);
912 dc
.SetBrush(m_gallery_button_disabled_background_brush
);
913 dc
.DrawRectangle(reduced_rect
.x
, reduced_rect
.y
, reduced_rect
.width
,
914 reduced_rect
.height
);
915 btn_bitmap
= bitmaps
[3];
919 dc
.DrawBitmap(btn_bitmap
, reduced_rect
.x
+ reduced_rect
.width
/ 2 - 2,
920 (rect
.y
+ rect
.height
/ 2) - 2, true);
923 void wxRibbonAUIArtProvider::DrawGalleryItemBackground(
925 wxRibbonGallery
* wnd
,
927 wxRibbonGalleryItem
* item
)
929 if(wnd
->GetHoveredItem() != item
&& wnd
->GetActiveItem() != item
&&
930 wnd
->GetSelection() != item
)
933 dc
.SetPen(m_gallery_item_border_pen
);
934 if(wnd
->GetActiveItem() == item
|| wnd
->GetSelection() == item
)
935 dc
.SetBrush(m_gallery_button_active_background_brush
);
937 dc
.SetBrush(m_gallery_button_hover_background_brush
);
939 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
942 void wxRibbonAUIArtProvider::DrawButtonBarBackground(
947 DrawPartialPanelBackground(dc
, wnd
, rect
);
950 void wxRibbonAUIArtProvider::DrawButtonBarButton(
952 wxWindow
* WXUNUSED(wnd
),
954 wxRibbonButtonKind kind
,
956 const wxString
& label
,
957 const wxBitmap
& bitmap_large
,
958 const wxBitmap
& bitmap_small
)
960 if(state
& (wxRIBBON_BUTTONBAR_BUTTON_HOVER_MASK
961 | wxRIBBON_BUTTONBAR_BUTTON_ACTIVE_MASK
))
963 dc
.SetPen(m_button_bar_hover_border_pen
);
965 wxRect
bg_rect(rect
);
968 if(kind
== wxRIBBON_BUTTON_HYBRID
)
970 switch(state
& wxRIBBON_BUTTONBAR_BUTTON_SIZE_MASK
)
972 case wxRIBBON_BUTTONBAR_BUTTON_LARGE
:
974 int iYBorder
= rect
.y
+ bitmap_large
.GetHeight() + 4;
975 wxRect
partial_bg(rect
);
976 if(state
& wxRIBBON_BUTTONBAR_BUTTON_NORMAL_HOVERED
)
978 partial_bg
.SetBottom(iYBorder
- 1);
982 partial_bg
.height
-= (iYBorder
- partial_bg
.y
+ 1);
983 partial_bg
.y
= iYBorder
+ 1;
985 dc
.DrawLine(rect
.x
, iYBorder
, rect
.x
+ rect
.width
, iYBorder
);
986 bg_rect
.Intersect(partial_bg
);
989 case wxRIBBON_BUTTONBAR_BUTTON_MEDIUM
:
992 if(state
& wxRIBBON_BUTTONBAR_BUTTON_NORMAL_HOVERED
)
994 bg_rect
.width
-= iArrowWidth
;
995 dc
.DrawLine(bg_rect
.x
+ bg_rect
.width
,
996 rect
.y
, bg_rect
.x
+ bg_rect
.width
,
997 rect
.y
+ rect
.height
);
1002 bg_rect
.x
+= bg_rect
.width
- iArrowWidth
;
1003 bg_rect
.width
= iArrowWidth
;
1004 dc
.DrawLine(bg_rect
.x
- 1, rect
.y
,
1005 bg_rect
.x
- 1, rect
.y
+ rect
.height
);
1009 case wxRIBBON_BUTTONBAR_BUTTON_SMALL
:
1014 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
1015 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
1017 dc
.SetPen(*wxTRANSPARENT_PEN
);
1018 if(state
& wxRIBBON_BUTTONBAR_BUTTON_ACTIVE_MASK
)
1019 dc
.SetBrush(m_button_bar_active_background_brush
);
1021 dc
.SetBrush(m_button_bar_hover_background_brush
);
1022 dc
.DrawRectangle(bg_rect
.x
, bg_rect
.y
, bg_rect
.width
, bg_rect
.height
);
1025 dc
.SetFont(m_button_bar_label_font
);
1026 dc
.SetTextForeground(m_button_bar_label_colour
);
1027 DrawButtonBarButtonForeground(dc
, rect
, kind
, state
, label
, bitmap_large
,
1031 void wxRibbonAUIArtProvider::DrawToolBarBackground(
1036 DrawPartialPanelBackground(dc
, wnd
, rect
);
1039 void wxRibbonAUIArtProvider::DrawToolGroupBackground(
1041 wxWindow
* WXUNUSED(wnd
),
1044 dc
.SetPen(m_toolbar_border_pen
);
1045 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
1046 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
1047 wxRect
bg_rect(rect
);
1049 dc
.GradientFillLinear(bg_rect
, m_tool_background_colour
,
1050 m_tool_background_gradient_colour
, wxSOUTH
);
1053 void wxRibbonAUIArtProvider::DrawTool(
1055 wxWindow
* WXUNUSED(wnd
),
1057 const wxBitmap
& bitmap
,
1058 wxRibbonButtonKind kind
,
1061 wxRect
bg_rect(rect
);
1063 if((state
& wxRIBBON_TOOLBAR_TOOL_LAST
) == 0)
1065 bool is_custom_bg
= (state
& (wxRIBBON_TOOLBAR_TOOL_HOVER_MASK
|
1066 wxRIBBON_TOOLBAR_TOOL_ACTIVE_MASK
)) != 0;
1067 bool is_split_hybrid
= kind
== wxRIBBON_BUTTON_HYBRID
&& is_custom_bg
;
1072 dc
.SetPen(*wxTRANSPARENT_PEN
);
1073 dc
.SetBrush(m_tool_hover_background_brush
);
1074 dc
.DrawRectangle(bg_rect
.x
, bg_rect
.y
, bg_rect
.width
, bg_rect
.height
);
1075 if(state
& wxRIBBON_TOOLBAR_TOOL_ACTIVE_MASK
)
1077 wxRect
active_rect(bg_rect
);
1078 if(kind
== wxRIBBON_BUTTON_HYBRID
)
1080 active_rect
.width
-= 8;
1081 if(state
& wxRIBBON_TOOLBAR_TOOL_DROPDOWN_ACTIVE
)
1083 active_rect
.x
+= active_rect
.width
;
1084 active_rect
.width
= 8;
1087 dc
.SetBrush(m_tool_active_background_brush
);
1088 dc
.DrawRectangle(active_rect
.x
, active_rect
.y
, active_rect
.width
,
1089 active_rect
.height
);
1095 dc
.SetPen(m_toolbar_hover_borden_pen
);
1097 dc
.SetPen(m_toolbar_border_pen
);
1098 if((state
& wxRIBBON_TOOLBAR_TOOL_FIRST
) == 0)
1101 if(!dc
.GetPixel(rect
.x
, rect
.y
+ 1, &existing
) ||
1102 existing
!= m_toolbar_hover_borden_pen
.GetColour())
1104 dc
.DrawLine(rect
.x
, rect
.y
+ 1, rect
.x
, rect
.y
+ rect
.height
- 1);
1109 wxRect
border_rect(bg_rect
);
1110 border_rect
.Inflate(1);
1111 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
1112 dc
.DrawRectangle(border_rect
.x
, border_rect
.y
, border_rect
.width
,
1113 border_rect
.height
);
1117 int avail_width
= bg_rect
.GetWidth();
1118 if(kind
!= wxRIBBON_BUTTON_NORMAL
)
1123 dc
.DrawLine(rect
.x
+ avail_width
+ 1, rect
.y
,
1124 rect
.x
+ avail_width
+ 1, rect
.y
+ rect
.height
);
1126 dc
.DrawBitmap(m_toolbar_drop_bitmap
, bg_rect
.x
+ avail_width
+ 2,
1127 bg_rect
.y
+ (bg_rect
.height
/ 2) - 2, true);
1129 dc
.DrawBitmap(bitmap
, bg_rect
.x
+ (avail_width
- bitmap
.GetWidth()) / 2,
1130 bg_rect
.y
+ (bg_rect
.height
- bitmap
.GetHeight()) / 2, true);
1133 #endif // wxUSE_RIBBON