#pragma hdrstop
#endif
-#include "wx/ribbon/art.h"
-
#if wxUSE_RIBBON
+#include "wx/ribbon/art.h"
#include "wx/ribbon/art_internal.h"
#include "wx/ribbon/bar.h"
#include "wx/ribbon/buttonbar.h"
#include "wx/ribbon/toolbar.h"
#ifndef WX_PRECOMP
+#include "wx/dcmemory.h"
#endif
#ifdef __WXMSW__
wxRibbonMSWArtProvider::wxRibbonMSWArtProvider(bool set_colour_scheme)
{
m_flags = 0;
- m_tab_label_font = wxFont(8, wxDEFAULT, wxNORMAL, wxNORMAL, FALSE);
+ m_tab_label_font = *wxNORMAL_FONT;
m_button_bar_label_font = m_tab_label_font;
m_panel_label_font = m_tab_label_font;
// tertiary not used for anything
// Map primary saturation from [0, 1] to [.25, .75]
- primary_hsl.saturation = cos(primary_hsl.saturation * M_PI) * -0.25 + 0.5;
+ bool primary_is_gray = false;
+ static const double gray_saturation_threshold = 0.01;
+ if(primary_hsl.saturation <= gray_saturation_threshold)
+ primary_is_gray = true;
+ else
+ {
+ primary_hsl.saturation = cos(primary_hsl.saturation * M_PI)
+ * -0.25 + 0.5;
+ }
// Map primary luminance from [0, 1] to [.23, .83]
primary_hsl.luminance = cos(primary_hsl.luminance * M_PI) * -0.3 + 0.53;
// Map secondary saturation from [0, 1] to [0.16, 0.84]
- secondary_hsl.saturation = cos(secondary_hsl.saturation * M_PI) * -0.34 + 0.5;
+ bool secondary_is_gray = false;
+ if(secondary_hsl.saturation <= gray_saturation_threshold)
+ secondary_is_gray = true;
+ else
+ {
+ secondary_hsl.saturation = cos(secondary_hsl.saturation * M_PI)
+ * -0.34 + 0.5;
+ }
// Map secondary luminance from [0, 1] to [0.1, 0.9]
secondary_hsl.luminance = cos(secondary_hsl.luminance * M_PI) * -0.4 + 0.5;
#define LikePrimary(h, s, l) \
- primary_hsl.ShiftHue(h ## f).Saturated(s ## f).Lighter(l ## f).ToRGB()
+ primary_hsl.ShiftHue(h ## f).Saturated(primary_is_gray ? 0 : s ## f) \
+ .Lighter(l ## f).ToRGB()
#define LikeSecondary(h, s, l) \
- secondary_hsl.ShiftHue(h ## f).Saturated(s ## f).Lighter(l ## f).ToRGB()
+ secondary_hsl.ShiftHue(h ## f).Saturated(secondary_is_gray ? 0 : s ## f) \
+ .Lighter(l ## f).ToRGB()
m_page_border_pen = LikePrimary(1.4, 0.00, -0.08);
m_tab_ctrl_background_brush = LikePrimary(1.0, 0.39, 0.07);
m_tab_hover_background_colour = LikePrimary(1.3, 0.15, 0.10);
m_tab_hover_background_top_colour = LikePrimary(1.4, 0.36, 0.08);
- m_tab_border_pen = LikePrimary(1.4, 0.03, -0.05);
+ m_tab_border_pen = LikePrimary(1.4, 0.03, -0.05);
m_tab_separator_gradient_colour = LikePrimary(1.7, -0.15, -0.18);
- m_tab_hover_background_top_gradient_colour = LikePrimary(1.8, 0.34, 0.13);
+ m_tab_hover_background_top_gradient_colour = LikePrimary(1.8, 0.34, 0.13);
m_tab_label_colour = LikePrimary(4.3, 0.13, -0.49);
m_tab_hover_background_gradient_colour = LikeSecondary(-1.5, -0.34, 0.01);
m_panel_minimised_label_colour = m_tab_label_colour;
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_button_disabled_background_top_brush = LikePrimary(-2.8, -0.36, 0.15);
m_gallery_hover_background_brush = LikePrimary(-0.8, 0.05, 0.15);
m_gallery_border_pen = LikePrimary(0.7, -0.02, 0.03);
m_gallery_button_background_top_brush = LikePrimary(0.8, 0.34, 0.13);
m_gallery_button_active_background_colour = LikeSecondary(-9.9, 0.03, -0.22);
m_gallery_button_active_background_gradient_colour = LikeSecondary(-9.5, 0.14, -0.11);
m_gallery_button_active_background_top_brush = LikeSecondary(-9.0, 0.15, -0.08);
-
+
m_button_bar_label_colour = m_tab_label_colour;
m_button_bar_hover_border_pen = LikeSecondary(-6.2, -0.47, -0.14);
m_button_bar_hover_background_gradient_colour = LikeSecondary(-0.6, 0.16, 0.04);
copy->m_button_bar_active_background_top_colour = m_button_bar_active_background_top_colour;
copy->m_button_bar_active_background_top_gradient_colour = m_button_bar_active_background_top_gradient_colour;
copy->m_gallery_button_background_colour = m_gallery_button_background_colour;
- copy->m_gallery_button_background_gradient_colour = m_gallery_button_background_gradient_colour;
+ copy->m_gallery_button_background_gradient_colour = m_gallery_button_background_gradient_colour;
copy->m_gallery_button_hover_background_colour = m_gallery_button_hover_background_colour;
copy->m_gallery_button_hover_background_gradient_colour = m_gallery_button_hover_background_gradient_colour;
copy->m_gallery_button_active_background_colour = m_gallery_button_active_background_colour;
if(m_flags & wxRIBBON_BAR_SHOW_PAGE_ICONS)
{
wxBitmap icon = tab.page->GetIcon();
+ if(icon.IsOk())
+ {
int x = tab.rect.x + 4;
if((m_flags & wxRIBBON_BAR_SHOW_PAGE_LABELS) == 0)
x = tab.rect.x + (tab.rect.width - icon.GetWidth()) / 2;
dc.DrawBitmap(icon, x, tab.rect.y + 1 + (tab.rect.height - 1 -
icon.GetHeight()) / 2, true);
+ }
}
if(m_flags & wxRIBBON_BAR_SHOW_PAGE_LABELS)
{
}
void wxRibbonMSWArtProvider::DrawPartialPageBackground(wxDC& dc,
- wxWindow* WXUNUSED(wnd), const wxRect& rect, wxRibbonPage* page,
+ wxWindow* wnd, const wxRect& rect, wxRibbonPage* page,
wxPoint offset, bool hovered)
{
- wxRect background(page->GetSize());
- page->AdjustRectToIncludeScrollButtons(&background);
- background.height -= 2;
+ wxRect background;
+ // Expanded panels need a background - the expanded panel at
+ // best size may have a greater Y dimension higher than when
+ // on the bar if it has a sizer. AUI art provider does not need this
+ // because it paints the panel without reference to its parent's size.
+ // Expanded panels use a wxFrame as parent (not a wxRibbonPage).
+
+ if(wnd->GetSizer() && wnd->GetParent() != page)
+ {
+ background = wnd->GetParent()->GetSize();
+ offset = wxPoint(0,0);
+ }
+ else
+ {
+ background = page->GetSize();
+ page->AdjustRectToIncludeScrollButtons(&background);
+ background.height -= 2;
+ }
// Page background isn't dependant upon the width of the page
// (at least not the part of it intended to be painted by this
// function). Set to wider than the page itself for when externally
client_rect.width -= 2;
client_rect.y++;
client_rect.height = (rect.y + rect.height / 5) - client_rect.x;
- dc.GradientFillLinear(client_rect,
+ dc.GradientFillLinear(client_rect,
m_panel_active_background_top_colour,
m_panel_active_background_top_gradient_colour, wxSOUTH);
client_rect.y += client_rect.height;
client_rect.height = (true_rect.y + true_rect.height) - client_rect.y;
- dc.GradientFillLinear(client_rect,
+ dc.GradientFillLinear(client_rect,
m_panel_active_background_colour,
m_panel_active_background_gradient_colour, wxSOUTH);
}
dc.SetTextForeground(m_panel_minimised_label_colour);
dc.DrawText(wnd->GetLabel(), xpos, ypos);
-
+
wxPoint arrow_points[3];
if(m_flags & wxRIBBON_BAR_FLOW_VERTICAL)
wxPoint offset(wnd->GetPosition());
wxRibbonPage* page = NULL;
wxWindow* parent = wnd->GetParent();
- wxRibbonPanel* panel = NULL;
+ wxRibbonPanel* panel = wxDynamicCast(wnd, wxRibbonPanel);
bool hovered = false;
- panel = wxDynamicCast(wnd, wxRibbonPanel);
if(panel != NULL)
{
hovered = allow_hovered && panel->IsHovered();
const wxBitmap& bitmap_large,
const wxBitmap& bitmap_small)
{
+ if(kind == wxRIBBON_BUTTON_TOGGLE)
+ {
+ kind = wxRIBBON_BUTTON_NORMAL;
+ if(state & wxRIBBON_BUTTONBAR_BUTTON_TOGGLED)
+ state ^= wxRIBBON_BUTTONBAR_BUTTON_ACTIVE_MASK;
+ }
+
if(state & (wxRIBBON_BUTTONBAR_BUTTON_HOVER_MASK |
wxRIBBON_BUTTONBAR_BUTTON_ACTIVE_MASK))
{
dc.DrawText(label_bottom, iX, ypos);
if(arrow_width != 0)
{
- DrawDropdownArrow(dc,
+ DrawDropdownArrow(dc,
iX + 2 +label_w - arrow_width,
ypos + label_h / 2 + 1,
m_button_bar_label_colour);
wxRibbonButtonKind kind,
long state)
{
+ if(kind == wxRIBBON_BUTTON_TOGGLE)
+ {
+ if(state & wxRIBBON_TOOLBAR_TOOL_TOGGLED)
+ state ^= wxRIBBON_TOOLBAR_TOOL_ACTIVE_MASK;
+ }
+
wxRect bg_rect(rect);
bg_rect.Deflate(1);
if((state & wxRIBBON_TOOLBAR_TOOL_LAST) == 0)
dc.SetBrush(B);
dc.DrawRectangle(nonrect.x, nonrect.y, nonrect.width, nonrect.height);
}
-
+
// Border
dc.SetPen(m_toolbar_border_pen);
if(state & wxRIBBON_TOOLBAR_TOOL_FIRST)
dc.DrawPoint(rect.x + 1, rect.y + rect.height - 2);
}
else
- dc.DrawLine(rect.x, rect.y + 1, rect.x, rect.y + rect.height - 1);
+ dc.DrawLine(rect.x, rect.y + 1, rect.x, rect.y + rect.height - 1);
if(state & wxRIBBON_TOOLBAR_TOOL_LAST)
{
// Foreground
int avail_width = bg_rect.GetWidth();
- if(kind != wxRIBBON_BUTTON_NORMAL)
+ if(kind & wxRIBBON_BUTTON_DROPDOWN)
{
avail_width -= 8;
if(is_split_hybrid)
{
- dc.DrawLine(rect.x + avail_width + 1, rect.y,
+ dc.DrawLine(rect.x + avail_width + 1, rect.y,
rect.x + avail_width + 1, rect.y + rect.height);
}
dc.DrawBitmap(m_toolbar_drop_bitmap, bg_rect.x + avail_width + 2,
else
*client_offset = wxPoint(3, 2);
}
+ if (size.x < 0) size.x = 0;
+ if (size.y < 0) size.y = 0;
return size;
}
scroll_down.y = scroll_up.y;
scroll_down.height = scroll_up.height;
scroll_down.x = scroll_up.x + scroll_up.width;
- scroll_down.width = scroll_up.width;
+ scroll_down.width = scroll_up.width;
extension.y = scroll_down.y;
extension.height = scroll_down.height;
extension.x = scroll_down.x + scroll_down.width;
scroll_down.x = scroll_up.x;
scroll_down.width = scroll_up.width;
scroll_down.y = scroll_up.y + scroll_up.height;
- scroll_down.height = scroll_up.height;
+ scroll_down.height = scroll_up.height;
extension.x = scroll_down.x;
extension.width = scroll_down.width;
extension.y = scroll_down.y + scroll_down.height;
size.DecBy(16, 1);
size.DecBy( 2, 1);
}
-
+
if(client_offset != NULL)
*client_offset = wxPoint(2, 1);
if(scroll_up_button != NULL)
switch(kind)
{
case wxRIBBON_BUTTON_NORMAL:
+ case wxRIBBON_BUTTON_TOGGLE:
*normal_region = wxRect(*button_size);
*dropdown_region = wxRect(0, 0, 0, 0);
break;
dropdown_region->SetX(dropdown_region->GetX() + text_size);
// no break
case wxRIBBON_BUTTON_NORMAL:
+ case wxRIBBON_BUTTON_TOGGLE:
normal_region->SetWidth(normal_region->GetWidth() + text_size);
break;
}
wxCoord label_height;
wxCoord best_width;
dc.GetTextExtent(label, &best_width, &label_height);
- int best_num_lines = 1;
int last_line_extra_width = 0;
- if(kind != wxRIBBON_BUTTON_NORMAL)
+ if(kind != wxRIBBON_BUTTON_NORMAL && kind != wxRIBBON_BUTTON_TOGGLE)
{
last_line_extra_width += 8;
- best_num_lines = 2; // label on top line, button below
}
size_t i;
for(i = 0; i < label.Len(); ++i)
if(width < best_width)
{
best_width = width;
- best_num_lines = 2;
}
}
}
dropdown_region->height = icon_size.GetHeight() - normal_region->height;
break;
case wxRIBBON_BUTTON_NORMAL:
+ case wxRIBBON_BUTTON_TOGGLE:
*normal_region = wxRect(icon_size);
break;
}
size.IncBy(7, 6);
if(is_last)
size.IncBy(1, 0);
- if(kind != wxRIBBON_BUTTON_NORMAL)
+ if(kind & wxRIBBON_BUTTON_DROPDOWN)
{
size.IncBy(8, 0);
if(dropdown_region)