Merge native MSW appearance for AUI toolbars

Closes https://github.com/wxWidgets/wxWidgets/pull/200
This commit is contained in:
Vadim Zeitlin
2016-02-13 12:31:49 +01:00
19 changed files with 758 additions and 39 deletions

View File

@@ -124,7 +124,7 @@ const wxColour DISABLED_TEXT_COLOR(DISABLED_TEXT_GREY_HUE,
DISABLED_TEXT_GREY_HUE,
DISABLED_TEXT_GREY_HUE);
wxAuiDefaultToolBarArt::wxAuiDefaultToolBarArt()
wxAuiGenericToolBarArt::wxAuiGenericToolBarArt()
{
m_baseColour = GetBaseColor();
@@ -160,48 +160,48 @@ wxAuiDefaultToolBarArt::wxAuiDefaultToolBarArt()
m_font = *wxNORMAL_FONT;
}
wxAuiDefaultToolBarArt::~wxAuiDefaultToolBarArt()
wxAuiGenericToolBarArt::~wxAuiGenericToolBarArt()
{
m_font = *wxNORMAL_FONT;
}
wxAuiToolBarArt* wxAuiDefaultToolBarArt::Clone()
wxAuiToolBarArt* wxAuiGenericToolBarArt::Clone()
{
return static_cast<wxAuiToolBarArt*>(new wxAuiDefaultToolBarArt);
return static_cast<wxAuiToolBarArt*>(new wxAuiGenericToolBarArt);
}
void wxAuiDefaultToolBarArt::SetFlags(unsigned int flags)
void wxAuiGenericToolBarArt::SetFlags(unsigned int flags)
{
m_flags = flags;
}
void wxAuiDefaultToolBarArt::SetFont(const wxFont& font)
void wxAuiGenericToolBarArt::SetFont(const wxFont& font)
{
m_font = font;
}
void wxAuiDefaultToolBarArt::SetTextOrientation(int orientation)
void wxAuiGenericToolBarArt::SetTextOrientation(int orientation)
{
m_textOrientation = orientation;
}
unsigned int wxAuiDefaultToolBarArt::GetFlags()
unsigned int wxAuiGenericToolBarArt::GetFlags()
{
return m_flags;
}
wxFont wxAuiDefaultToolBarArt::GetFont()
wxFont wxAuiGenericToolBarArt::GetFont()
{
return m_font;
}
int wxAuiDefaultToolBarArt::GetTextOrientation()
int wxAuiGenericToolBarArt::GetTextOrientation()
{
return m_textOrientation;
}
void wxAuiDefaultToolBarArt::DrawBackground(
void wxAuiGenericToolBarArt::DrawBackground(
wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxRect& _rect)
@@ -213,7 +213,7 @@ void wxAuiDefaultToolBarArt::DrawBackground(
dc.GradientFillLinear(rect, startColour, endColour, wxSOUTH);
}
void wxAuiDefaultToolBarArt::DrawPlainBackground(wxDC& dc,
void wxAuiGenericToolBarArt::DrawPlainBackground(wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxRect& _rect)
{
@@ -226,7 +226,7 @@ void wxAuiDefaultToolBarArt::DrawPlainBackground(wxDC& dc,
rect.GetWidth() + 2, rect.GetHeight() + 1);
}
void wxAuiDefaultToolBarArt::DrawLabel(
void wxAuiGenericToolBarArt::DrawLabel(
wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxAuiToolBarItem& item,
@@ -253,7 +253,7 @@ void wxAuiDefaultToolBarArt::DrawLabel(
}
void wxAuiDefaultToolBarArt::DrawButton(
void wxAuiGenericToolBarArt::DrawButton(
wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxAuiToolBarItem& item,
@@ -354,7 +354,7 @@ void wxAuiDefaultToolBarArt::DrawButton(
}
void wxAuiDefaultToolBarArt::DrawDropDownButton(
void wxAuiGenericToolBarArt::DrawDropDownButton(
wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxAuiToolBarItem& item,
@@ -480,7 +480,7 @@ void wxAuiDefaultToolBarArt::DrawDropDownButton(
}
}
void wxAuiDefaultToolBarArt::DrawControlLabel(
void wxAuiGenericToolBarArt::DrawControlLabel(
wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxAuiToolBarItem& item,
@@ -522,7 +522,7 @@ void wxAuiDefaultToolBarArt::DrawControlLabel(
}
}
wxSize wxAuiDefaultToolBarArt::GetLabelSize(
wxSize wxAuiGenericToolBarArt::GetLabelSize(
wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxAuiToolBarItem& item)
@@ -545,7 +545,7 @@ wxSize wxAuiDefaultToolBarArt::GetLabelSize(
return wxSize(width, height);
}
wxSize wxAuiDefaultToolBarArt::GetToolSize(
wxSize wxAuiGenericToolBarArt::GetToolSize(
wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxAuiToolBarItem& item)
@@ -594,7 +594,7 @@ wxSize wxAuiDefaultToolBarArt::GetToolSize(
return wxSize(width, height);
}
void wxAuiDefaultToolBarArt::DrawSeparator(
void wxAuiGenericToolBarArt::DrawSeparator(
wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxRect& _rect)
@@ -627,7 +627,7 @@ void wxAuiDefaultToolBarArt::DrawSeparator(
dc.GradientFillLinear(rect, startColour, endColour, horizontal ? wxSOUTH : wxEAST);
}
void wxAuiDefaultToolBarArt::DrawGripper(wxDC& dc,
void wxAuiGenericToolBarArt::DrawGripper(wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxRect& rect)
{
@@ -666,7 +666,7 @@ void wxAuiDefaultToolBarArt::DrawGripper(wxDC& dc,
}
void wxAuiDefaultToolBarArt::DrawOverflowButton(wxDC& dc,
void wxAuiGenericToolBarArt::DrawOverflowButton(wxDC& dc,
wxWindow* /*wnd*/,
const wxRect& rect,
int state)
@@ -699,7 +699,7 @@ void wxAuiDefaultToolBarArt::DrawOverflowButton(wxDC& dc,
dc.DrawBitmap(m_overflowBmp, x, y, true);
}
int wxAuiDefaultToolBarArt::GetElementSize(int element_id)
int wxAuiGenericToolBarArt::GetElementSize(int element_id)
{
switch (element_id)
{
@@ -710,7 +710,7 @@ int wxAuiDefaultToolBarArt::GetElementSize(int element_id)
}
}
void wxAuiDefaultToolBarArt::SetElementSize(int element_id, int size)
void wxAuiGenericToolBarArt::SetElementSize(int element_id, int size)
{
switch (element_id)
{
@@ -720,7 +720,7 @@ void wxAuiDefaultToolBarArt::SetElementSize(int element_id, int size)
}
}
int wxAuiDefaultToolBarArt::ShowDropDown(wxWindow* wnd,
int wxAuiGenericToolBarArt::ShowDropDown(wxWindow* wnd,
const wxAuiToolBarItemArray& items)
{
wxMenu menuPopup;

514
src/aui/barartmsw.cpp Normal file
View File

@@ -0,0 +1,514 @@
/////////////////////////////////////////////////////////////////////////////
// Name: src/aui/barartmsw.cpp
// Purpose: Implementation of wxAuiMSWToolBarArt
// Author: Tobias Taschner
// Created: 2015-09-22
// Copyright: (c) 2015 wxWidgets development team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/bitmap.h"
#include "wx/dcclient.h"
#include "wx/app.h"
#include "wx/dc.h"
#endif
#include "wx/aui/auibar.h"
#include "wx/aui/framemanager.h"
#include "wx/msw/uxtheme.h"
#include "wx/msw/private.h"
#if wxUSE_AUI
#define RP_GRIPPER 1
#define RP_GRIPPERVERT 2
#define RP_BAND 3
#define RP_CHEVRON 4
#define RP_CHEVRONVERT 5
#define RP_BACKGROUND 6
#define RP_SPLITTER 7
#define RP_SPLITTERVERT 8
#define CHEVS_NORMAL 1
#define CHEVS_HOT 2
#define CHEVS_PRESSED 3
#define TP_BUTTON 1
#define TP_DROPDOWNBUTTON 2
#define TP_SPLITBUTTON 3
#define TP_SPLITBUTTONDROPDOWN 4
#define TP_SEPARATOR 5
#define TP_SEPARATORVERT 6
#define TP_DROPDOWNBUTTONGLYPH 7
#define TS_NORMAL 1
#define TS_HOT 2
#define TS_PRESSED 3
#define TS_DISABLED 4
#define TS_CHECKED 5
#define TS_HOTCHECKED 6
#define TS_NEARHOT 7
#define TS_OTHERSIDEHOT 8
wxAuiMSWToolBarArt::wxAuiMSWToolBarArt()
{
wxUxThemeEngine* te = wxUxThemeEngine::GetIfActive();
if ( te && te->IsAppThemed() )
{
m_themed = true;
// Determine sizes from theme
wxWindow* window = static_cast<wxApp*>(wxApp::GetInstance())->GetTopWindow();
wxUxThemeHandle hTheme(window, L"Rebar");
SIZE overflowSize;
te->GetThemePartSize(hTheme, NULL, RP_CHEVRON, 0,
NULL, TS_TRUE, &overflowSize);
m_overflowSize = overflowSize.cx;
SIZE gripperSize;
te->GetThemePartSize(hTheme, NULL, RP_GRIPPER, 0,
NULL, TS_TRUE, &gripperSize);
m_gripperSize = gripperSize.cx;
wxUxThemeHandle hThemeToolbar(window, L"Toolbar");
SIZE seperatorSize;
te->GetThemePartSize(hThemeToolbar, NULL, TP_SEPARATOR, 0,
NULL, TS_TRUE, &seperatorSize);
m_separatorSize = seperatorSize.cx;
SIZE buttonSize;
te->GetThemePartSize(hThemeToolbar, NULL, TP_BUTTON, 0,
NULL, TS_TRUE, &buttonSize);
m_buttonSize.Set(buttonSize.cx, buttonSize.cy);
}
else
m_themed = false;
}
wxAuiToolBarArt* wxAuiMSWToolBarArt::Clone()
{
return new wxAuiMSWToolBarArt;
}
void wxAuiMSWToolBarArt::DrawBackground(
wxDC& dc,
wxWindow* wnd,
const wxRect& rect)
{
if ( m_themed )
{
RECT r;
wxCopyRectToRECT(rect, r);
wxUxThemeHandle hTheme(wnd, L"Rebar");
wxUxThemeEngine::Get()->DrawThemeBackground(
hTheme,
GetHdcOf(dc.GetTempHDC()),
RP_BACKGROUND,
0,
&r,
NULL);
}
else
wxAuiGenericToolBarArt::DrawBackground(dc, wnd, rect);
}
void wxAuiMSWToolBarArt::DrawLabel(
wxDC& dc,
wxWindow* wnd,
const wxAuiToolBarItem& item,
const wxRect& rect)
{
wxAuiGenericToolBarArt::DrawLabel(dc, wnd, item, rect);
}
static const unsigned char
DISABLED_TEXT_GREY_HUE = wxColour::AlphaBlend(0, 255, 0.4);
const wxColour DISABLED_TEXT_COLOR(DISABLED_TEXT_GREY_HUE,
DISABLED_TEXT_GREY_HUE,
DISABLED_TEXT_GREY_HUE);
void wxAuiMSWToolBarArt::DrawButton(
wxDC& dc,
wxWindow* wnd,
const wxAuiToolBarItem& item,
const wxRect& rect)
{
if ( m_themed )
{
RECT r;
wxCopyRectToRECT(rect, r);
wxUxThemeHandle hTheme(wnd, L"Toolbar");
wxUxThemeEngine* te = wxUxThemeEngine::Get();
int btnState;
if ( item.GetState() & wxAUI_BUTTON_STATE_DISABLED )
btnState = TS_DISABLED;
else if ( item.GetState() & wxAUI_BUTTON_STATE_PRESSED )
btnState = TS_PRESSED;
else if ( item.GetState() & wxAUI_BUTTON_STATE_HOVER &&
item.GetState() & wxAUI_BUTTON_STATE_CHECKED )
btnState = TS_HOTCHECKED;
else if ( item.GetState() & wxAUI_BUTTON_STATE_CHECKED )
btnState = TS_CHECKED;
else if ( item.GetState() & wxAUI_BUTTON_STATE_HOVER )
btnState = TS_HOT;
else
btnState = TS_NORMAL;
te->DrawThemeBackground(
hTheme,
GetHdcOf(dc.GetTempHDC()),
TP_BUTTON,
btnState,
&r,
NULL);
int textWidth = 0, textHeight = 0;
if ( m_flags & wxAUI_TB_TEXT )
{
dc.SetFont(m_font);
int tx, ty;
dc.GetTextExtent(wxT("ABCDHgj"), &tx, &textHeight);
textWidth = 0;
dc.GetTextExtent(item.GetLabel(), &textWidth, &ty);
}
int bmpX = 0, bmpY = 0;
int textX = 0, textY = 0;
if ( m_textOrientation == wxAUI_TBTOOL_TEXT_BOTTOM )
{
bmpX = rect.x +
(rect.width / 2) -
(item.GetBitmap().GetWidth() / 2);
bmpY = rect.y +
((rect.height - textHeight) / 2) -
(item.GetBitmap().GetHeight() / 2);
textX = rect.x + (rect.width / 2) - (textWidth / 2) + 1;
textY = rect.y + rect.height - textHeight - 1;
}
else if ( m_textOrientation == wxAUI_TBTOOL_TEXT_RIGHT )
{
bmpX = rect.x + 3;
bmpY = rect.y +
(rect.height / 2) -
(item.GetBitmap().GetHeight() / 2);
textX = bmpX + 3 + item.GetBitmap().GetWidth();
textY = rect.y +
(rect.height / 2) -
(textHeight / 2);
}
wxBitmap bmp;
if ( item.GetState() & wxAUI_BUTTON_STATE_DISABLED )
bmp = item.GetDisabledBitmap();
else
bmp = item.GetBitmap();
if ( bmp.IsOk() )
dc.DrawBitmap(bmp, bmpX, bmpY, true);
// set the item's text color based on if it is disabled
dc.SetTextForeground(*wxBLACK);
if ( item.GetState() & wxAUI_BUTTON_STATE_DISABLED )
dc.SetTextForeground(DISABLED_TEXT_COLOR);
if ( (m_flags & wxAUI_TB_TEXT) && !item.GetLabel().empty() )
{
dc.DrawText(item.GetLabel(), textX, textY);
}
}
else
wxAuiGenericToolBarArt::DrawButton(dc, wnd, item, rect);
}
void wxAuiMSWToolBarArt::DrawDropDownButton(
wxDC& dc,
wxWindow* wnd,
const wxAuiToolBarItem& item,
const wxRect& rect)
{
if ( m_themed )
{
wxUxThemeHandle hTheme(wnd, L"Toolbar");
wxUxThemeEngine* const te = wxUxThemeEngine::Get();
int dropDownWidth = 14;
int textWidth = 0, textHeight = 0, textX = 0, textY = 0;
int bmpX = 0, bmpY = 0, dropBmpX = 0, dropBmpY = 0;
wxRect buttonRect = wxRect(rect.x,
rect.y,
rect.width - dropDownWidth,
rect.height);
wxRect dropDownRect = wxRect(rect.x + rect.width - dropDownWidth - 1,
rect.y,
dropDownWidth + 1,
rect.height);
if ( m_flags & wxAUI_TB_TEXT )
{
dc.SetFont(m_font);
int tx, ty;
if ( m_flags & wxAUI_TB_TEXT )
{
dc.GetTextExtent(wxT("ABCDHgj"), &tx, &textHeight);
textWidth = 0;
}
dc.GetTextExtent(item.GetLabel(), &textWidth, &ty);
}
RECT btnR;
wxCopyRectToRECT(buttonRect, btnR);
RECT dropDownR;
wxCopyRectToRECT(dropDownRect, dropDownR);
int btnState;
if ( item.GetState() & wxAUI_BUTTON_STATE_DISABLED )
btnState = TS_DISABLED;
else if ( item.GetState() & wxAUI_BUTTON_STATE_PRESSED )
btnState = TS_PRESSED;
else if ( item.GetState() & wxAUI_BUTTON_STATE_HOVER )
btnState = TS_HOT;
else
btnState = TS_NORMAL;
te->DrawThemeBackground(
hTheme,
GetHdcOf(dc.GetTempHDC()),
TP_SPLITBUTTON,
btnState,
&btnR,
NULL);
te->DrawThemeBackground(
hTheme,
GetHdcOf(dc.GetTempHDC()),
TP_SPLITBUTTONDROPDOWN,
btnState,
&dropDownR,
NULL);
dropBmpX = dropDownRect.x +
(dropDownRect.width / 2) -
(m_buttonDropDownBmp.GetWidth() / 2);
dropBmpY = dropDownRect.y +
(dropDownRect.height / 2) -
(m_buttonDropDownBmp.GetHeight() / 2);
if ( m_textOrientation == wxAUI_TBTOOL_TEXT_BOTTOM )
{
bmpX = buttonRect.x +
(buttonRect.width / 2) -
(item.GetBitmap().GetWidth() / 2);
bmpY = buttonRect.y +
((buttonRect.height - textHeight) / 2) -
(item.GetBitmap().GetHeight() / 2);
textX = rect.x + (rect.width / 2) - (textWidth / 2) + 1;
textY = rect.y + rect.height - textHeight - 1;
}
else if ( m_textOrientation == wxAUI_TBTOOL_TEXT_RIGHT )
{
bmpX = rect.x + 3;
bmpY = rect.y +
(rect.height / 2) -
(item.GetBitmap().GetHeight() / 2);
textX = bmpX + 3 + item.GetBitmap().GetWidth();
textY = rect.y +
(rect.height / 2) -
(textHeight / 2);
}
wxBitmap bmp;
if ( item.GetState() & wxAUI_BUTTON_STATE_DISABLED )
{
bmp = item.GetDisabledBitmap();
}
else
{
bmp = item.GetBitmap();
}
if ( !bmp.IsOk() )
return;
dc.DrawBitmap(bmp, bmpX, bmpY, true);
// set the item's text color based on if it is disabled
dc.SetTextForeground(*wxBLACK);
if ( item.GetState() & wxAUI_BUTTON_STATE_DISABLED )
dc.SetTextForeground(DISABLED_TEXT_COLOR);
if ( (m_flags & wxAUI_TB_TEXT) && !item.GetLabel().empty() )
{
dc.DrawText(item.GetLabel(), textX, textY);
}
}
else
wxAuiGenericToolBarArt::DrawDropDownButton(dc, wnd, item, rect);
}
void wxAuiMSWToolBarArt::DrawControlLabel(
wxDC& dc,
wxWindow* wnd,
const wxAuiToolBarItem& item,
const wxRect& rect)
{
wxAuiGenericToolBarArt::DrawControlLabel(dc, wnd, item, rect);
}
void wxAuiMSWToolBarArt::DrawSeparator(
wxDC& dc,
wxWindow* wnd,
const wxRect& rect)
{
if ( m_themed )
{
RECT r;
wxCopyRectToRECT(rect, r);
wxUxThemeHandle hTheme(wnd, L"Toolbar");
wxUxThemeEngine::Get()->DrawThemeBackground(
hTheme,
GetHdcOf(dc.GetTempHDC()),
(m_flags & wxAUI_TB_VERTICAL) ? TP_SEPARATORVERT : TP_SEPARATOR,
0,
&r,
NULL);
}
else
wxAuiGenericToolBarArt::DrawSeparator(dc, wnd, rect);
}
void wxAuiMSWToolBarArt::DrawGripper(
wxDC& dc,
wxWindow* wnd,
const wxRect& rect)
{
if ( m_themed )
{
RECT r;
wxCopyRectToRECT(rect, r);
wxUxThemeHandle hTheme(wnd, L"Rebar");
wxUxThemeEngine::Get()->DrawThemeBackground(
hTheme,
GetHdcOf(dc.GetTempHDC()),
(m_flags & wxAUI_TB_VERTICAL) ? RP_GRIPPERVERT : RP_GRIPPER,
0,
&r,
NULL);
}
else
wxAuiGenericToolBarArt::DrawGripper(dc, wnd, rect);
}
void wxAuiMSWToolBarArt::DrawOverflowButton(
wxDC& dc,
wxWindow* wnd,
const wxRect& rect,
int state)
{
if ( m_themed )
{
RECT r;
wxCopyRectToRECT(rect, r);
wxUxThemeHandle hTheme(wnd, L"Rebar");
int chevState;
if ( state & wxAUI_BUTTON_STATE_PRESSED )
chevState = CHEVS_PRESSED;
else if ( state & wxAUI_BUTTON_STATE_HOVER )
chevState = CHEVS_HOT;
else
chevState = CHEVS_NORMAL;
wxUxThemeEngine::Get()->DrawThemeBackground(
hTheme,
GetHdcOf(dc.GetTempHDC()),
(m_flags & wxAUI_TB_VERTICAL) ? RP_CHEVRONVERT : RP_CHEVRON,
chevState,
&r,
NULL);
}
else
wxAuiGenericToolBarArt::DrawOverflowButton(dc, wnd, rect, state);
}
wxSize wxAuiMSWToolBarArt::GetLabelSize(
wxDC& dc,
wxWindow* wnd,
const wxAuiToolBarItem& item)
{
return wxAuiGenericToolBarArt::GetLabelSize(dc, wnd, item);
}
wxSize wxAuiMSWToolBarArt::GetToolSize(
wxDC& dc,
wxWindow* wnd,
const wxAuiToolBarItem& item)
{
if ( m_themed )
{
if ( !item.GetBitmap().IsOk() && !(m_flags & wxAUI_TB_TEXT) )
return m_buttonSize;
wxSize size = wxAuiGenericToolBarArt::GetToolSize(dc, wnd, item);
size.IncBy(3); // Add some padding for native theme
return size;
}
else
return wxAuiGenericToolBarArt::GetToolSize(dc, wnd, item);
}
int wxAuiMSWToolBarArt::GetElementSize(int element)
{
return wxAuiGenericToolBarArt::GetElementSize(element);
}
void wxAuiMSWToolBarArt::SetElementSize(int elementId, int size)
{
wxAuiGenericToolBarArt::SetElementSize(elementId, size);
}
int wxAuiMSWToolBarArt::ShowDropDown(wxWindow* wnd,
const wxAuiToolBarItemArray& items)
{
return wxAuiGenericToolBarArt::ShowDropDown(wnd, items);
}
#endif // wxUSE_AUI