X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0a7ee6e0f400f0d10b158bc0396be22f59d6ad8f..d07f2e19181bc5caf29eb2338ce513be6fa42405:/src/ribbon/art_msw.cpp diff --git a/src/ribbon/art_msw.cpp b/src/ribbon/art_msw.cpp index 3dc95656ef..9318b309c2 100644 --- a/src/ribbon/art_msw.cpp +++ b/src/ribbon/art_msw.cpp @@ -94,10 +94,42 @@ static const char* const panel_extension_xpm[] = { "x xxx", " xxxx"}; +static const char* const panel_toggle_down_xpm[] = { + "7 9 2 1", + " c None", + "x c #FF00FF", + " ", + "x x", + "xx xx", + " xx xx ", + "x xxx x", + "xx x xx", + " xx xx ", + " xxx ", + " x ",}; + +static const char* const panel_toggle_up_xpm[] = { + "7 9 2 1", + " c None", + "x c #FF00FF", + " x ", + " xxx ", + " xx xx ", + "xx x xx", + "x xxx x", + " xx xx ", + "xx xx", + "x x", + " ",}; + wxRibbonMSWArtProvider::wxRibbonMSWArtProvider(bool set_colour_scheme) { m_flags = 0; +#if defined( __WXMAC__ ) + m_tab_label_font = *wxSMALL_FONT; +#else m_tab_label_font = *wxNORMAL_FONT; +#endif m_button_bar_label_font = m_tab_label_font; m_panel_label_font = m_tab_label_font; @@ -229,6 +261,11 @@ void wxRibbonMSWArtProvider::SetColourScheme( SetColour(wxRIBBON_ART_PANEL_BUTTON_FACE_COLOUR, LikePrimary(1.4, -0.21, -0.23)); SetColour(wxRIBBON_ART_PANEL_BUTTON_HOVER_FACE_COLOUR, LikePrimary(1.5, -0.24, -0.29)); + m_ribbon_toggle_brush = LikeSecondary(-0.9, 0.16, -0.07); + m_ribbon_toggle_pen = LikeSecondary(-3.9, -0.16, -0.14); + SetColour(wxRIBBON_ART_PAGE_TOGGLE_FACE_COLOUR, LikePrimary(1.7, -0.20, -0.15)); + SetColour(wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR, LikePrimary(1.8, -0.23, -0.21)); + m_gallery_button_disabled_background_colour = LikePrimary(-2.8, -0.46, 0.09); m_gallery_button_disabled_background_top_brush = LikePrimary(-2.8, -0.36, 0.15); m_gallery_hover_background_brush = LikePrimary(-0.8, 0.05, 0.15); @@ -294,15 +331,18 @@ wxRibbonArtProvider* wxRibbonMSWArtProvider::Clone() const void wxRibbonMSWArtProvider::CloneTo(wxRibbonMSWArtProvider* copy) const { - for(int i = 0; i < 4; ++i) + int i; + for(i = 0; i < 4; ++i) { copy->m_gallery_up_bitmap[i] = m_gallery_up_bitmap[i]; copy->m_gallery_down_bitmap[i] = m_gallery_down_bitmap[i]; copy->m_gallery_extension_bitmap[i] = m_gallery_extension_bitmap[i]; } - for(int i = 0; i < 2; ++i) + 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; @@ -310,6 +350,9 @@ void wxRibbonMSWArtProvider::CloneTo(wxRibbonMSWArtProvider* copy) const copy->m_secondary_scheme_colour = m_secondary_scheme_colour; copy->m_tertiary_scheme_colour = m_tertiary_scheme_colour; + copy->m_page_toggle_face_colour = m_page_toggle_face_colour; + copy->m_page_toggle_hover_face_colour = m_page_toggle_hover_face_colour; + copy->m_button_bar_label_colour = m_button_bar_label_colour; copy->m_tab_label_colour = m_tab_label_colour; copy->m_tab_separator_colour = m_tab_separator_colour; @@ -367,6 +410,7 @@ void wxRibbonMSWArtProvider::CloneTo(wxRibbonMSWArtProvider* copy) const copy->m_gallery_button_hover_background_top_brush = m_gallery_button_hover_background_top_brush; copy->m_gallery_button_active_background_top_brush = m_gallery_button_active_background_top_brush; copy->m_gallery_button_disabled_background_top_brush = m_gallery_button_disabled_background_top_brush; + copy->m_ribbon_toggle_brush = m_ribbon_toggle_brush; copy->m_tab_label_font = m_tab_label_font; copy->m_button_bar_label_font = m_button_bar_label_font; @@ -384,6 +428,7 @@ void wxRibbonMSWArtProvider::CloneTo(wxRibbonMSWArtProvider* copy) const copy->m_button_bar_active_border_pen = m_button_bar_active_border_pen; copy->m_gallery_item_border_pen = m_gallery_item_border_pen; copy->m_toolbar_border_pen = m_toolbar_border_pen; + copy->m_ribbon_toggle_pen = m_ribbon_toggle_pen; copy->m_flags = m_flags; copy->m_tab_separation_size = m_tab_separation_size; @@ -700,6 +745,10 @@ wxColour wxRibbonMSWArtProvider::GetColour(int id) const return m_toolbar_border_pen.GetColour(); case wxRIBBON_ART_TOOLBAR_FACE_COLOUR: return m_tool_face_colour; + case wxRIBBON_ART_PAGE_TOGGLE_FACE_COLOUR: + return m_page_toggle_face_colour; + case wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR: + return m_page_toggle_hover_face_colour; default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break; @@ -970,6 +1019,16 @@ void wxRibbonMSWArtProvider::SetColour(int id, const wxColor& colour) m_tool_face_colour = colour; m_toolbar_drop_bitmap = wxRibbonLoadPixmap(gallery_down_xpm, colour); break; + case wxRIBBON_ART_PAGE_TOGGLE_FACE_COLOUR: + m_page_toggle_face_colour = colour; + m_ribbon_toggle_down_bitmap[0] = wxRibbonLoadPixmap(panel_toggle_down_xpm, colour); + m_ribbon_toggle_up_bitmap[0] = wxRibbonLoadPixmap(panel_toggle_up_xpm, colour); + break; + case wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR: + m_page_toggle_hover_face_colour = colour; + m_ribbon_toggle_down_bitmap[1] = wxRibbonLoadPixmap(panel_toggle_down_xpm, colour); + m_ribbon_toggle_up_bitmap[1] = wxRibbonLoadPixmap(panel_toggle_up_xpm, colour); + break; default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break; @@ -1004,7 +1063,7 @@ void wxRibbonMSWArtProvider::DrawTab( if(tab.rect.height <= 2) return; - if(tab.active || tab.hovered) + if(tab.active || tab.hovered || tab.highlight) { if(tab.active) { @@ -1039,6 +1098,41 @@ void wxRibbonMSWArtProvider::DrawTab( dc.GradientFillLinear(background, m_tab_hover_background_colour, m_tab_hover_background_gradient_colour, wxSOUTH); } + else if(tab.highlight) + { + wxRect background(tab.rect); + + background.x += 2; + background.y += 2; + background.width -= 4; + background.height -= 3; + int h = background.height; + background.height /= 2; + + //For highlight pages we show a colour between the active page and for a hovered page: + wxColour top_colour1((m_tab_active_background_colour.Red() + m_tab_hover_background_top_colour.Red())/2, + (m_tab_active_background_colour.Green() + m_tab_hover_background_top_colour.Green())/2, + (m_tab_active_background_colour.Blue() + m_tab_hover_background_top_colour.Blue())/2); + + wxColour bottom_colour1((m_tab_active_background_gradient_colour.Red() + m_tab_hover_background_top_gradient_colour.Red())/2, + (m_tab_active_background_gradient_colour.Green() + m_tab_hover_background_top_gradient_colour.Green())/2, + (m_tab_active_background_gradient_colour.Blue() + m_tab_hover_background_top_gradient_colour.Blue())/2); + + dc.GradientFillLinear(background, top_colour1, bottom_colour1, wxSOUTH); + + background.y += background.height; + background.height = h - background.height; + + wxColour top_colour2((m_tab_active_background_colour.Red() + m_tab_hover_background_colour.Red())/2, + (m_tab_active_background_colour.Green() + m_tab_hover_background_colour.Green())/2, + (m_tab_active_background_colour.Blue() + m_tab_hover_background_colour.Blue())/2); + + wxColour bottom_colour2((m_tab_active_background_gradient_colour.Red() + m_tab_hover_background_gradient_colour.Red())/2, + (m_tab_active_background_gradient_colour.Green() + m_tab_hover_background_gradient_colour.Green())/2, + (m_tab_active_background_gradient_colour.Blue() + m_tab_hover_background_gradient_colour.Blue())/2); + + dc.GradientFillLinear(background, top_colour2, bottom_colour2, wxSOUTH); + } wxPoint border_points[6]; border_points[0] = wxPoint(1, tab.rect.height - 2); @@ -1187,10 +1281,10 @@ void wxRibbonMSWArtProvider::DrawPartialPageBackground(wxDC& dc, { wxRect background; // Expanded panels need a background - the expanded panel at - // best size may have a greater Y dimension higher than when + // 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). + // Expanded panels use a wxFrame as parent (not a wxRibbonPage). if(wnd->GetSizer() && wnd->GetParent() != page) { @@ -2419,6 +2513,36 @@ void wxRibbonMSWArtProvider::DrawTool( bg_rect.y + (bg_rect.height - bitmap.GetHeight()) / 2, true); } +void +wxRibbonMSWArtProvider::DrawToggleButton(wxDC& dc, + wxRibbonBar* wnd, + const wxRect& rect, + bool upBitmap) +{ + DrawPartialPageBackground(dc, wnd, rect, false); + + dc.DestroyClippingRegion(); + dc.SetClippingRegion(rect); + + if(wnd->IsToggleButtonHovered()) + { + dc.SetPen(m_ribbon_toggle_pen); + dc.SetBrush(m_ribbon_toggle_brush); + dc.DrawRoundedRectangle(rect.GetX(), rect.GetY(), 12, 12, 1.0); + if(upBitmap) + dc.DrawBitmap(m_ribbon_toggle_up_bitmap[1], rect.GetX()+2, rect.GetY()+2, true); + else + dc.DrawBitmap(m_ribbon_toggle_down_bitmap[1], rect.GetX()+2, rect.GetY()+2, true); + } + else + { + if(upBitmap) + dc.DrawBitmap(m_ribbon_toggle_up_bitmap[0], rect.GetX()+2, rect.GetY()+2, true); + else + dc.DrawBitmap(m_ribbon_toggle_down_bitmap[0], rect.GetX()+2, rect.GetY()+2, true); + } +} + void wxRibbonMSWArtProvider::GetBarTabWidth( wxDC& dc, wxWindow* WXUNUSED(wnd), @@ -2765,7 +2889,7 @@ bool wxRibbonMSWArtProvider::GetButtonBarButtonSize( if(wxRibbonCanLabelBreakAtPosition(label, i)) { int width = wxMax( - dc.GetTextExtent(label.Mid(0, i - 1)).GetWidth(), + dc.GetTextExtent(label.Left(i)).GetWidth(), dc.GetTextExtent(label.Mid(i + 1)).GetWidth() + last_line_extra_width); if(width < best_width) { @@ -2873,4 +2997,13 @@ wxSize wxRibbonMSWArtProvider::GetToolSize( return size; } +wxRect +wxRibbonMSWArtProvider::GetBarToggleButtonArea(wxDC& WXUNUSED(dc), + const wxRibbonBar* WXUNUSED(wnd), + wxRect rect) +{ + rect = wxRect(rect.GetWidth()-30, 6, 12, 12); + return rect; +} + #endif // wxUSE_RIBBON