Improve wxAuiNotebook appearance when using some GTK themes.

Let wxAuiNotebook render the border itself, instead of doing it in dock art
class. This allows the notebook to do it correctly for the current theme.

Closes #14710.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72641 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-10-08 12:09:13 +00:00
parent 1bcef6701b
commit 9fa99f045e
6 changed files with 128 additions and 9 deletions

View File

@@ -56,6 +56,11 @@ public:
virtual void SetColour(const wxColour& colour) = 0; virtual void SetColour(const wxColour& colour) = 0;
virtual void SetActiveColour(const wxColour& colour) = 0; virtual void SetActiveColour(const wxColour& colour) = 0;
virtual void DrawBorder(
wxDC& dc,
wxWindow* wnd,
const wxRect& rect) = 0;
virtual void DrawBackground( virtual void DrawBackground(
wxDC& dc, wxDC& dc,
wxWindow* wnd, wxWindow* wnd,
@@ -95,6 +100,9 @@ public:
virtual int GetIndentSize() = 0; virtual int GetIndentSize() = 0;
virtual int GetBorderWidth(
wxWindow* wnd) = 0;
virtual int GetBestTabCtrlSize( virtual int GetBestTabCtrlSize(
wxWindow* wnd, wxWindow* wnd,
const wxAuiNotebookPageArray& pages, const wxAuiNotebookPageArray& pages,
@@ -121,6 +129,11 @@ public:
void SetColour(const wxColour& colour); void SetColour(const wxColour& colour);
void SetActiveColour(const wxColour& colour); void SetActiveColour(const wxColour& colour);
void DrawBorder(
wxDC& dc,
wxWindow* wnd,
const wxRect& rect);
void DrawBackground( void DrawBackground(
wxDC& dc, wxDC& dc,
wxWindow* wnd, wxWindow* wnd,
@@ -146,6 +159,9 @@ public:
int GetIndentSize(); int GetIndentSize();
int GetBorderWidth(
wxWindow* wnd);
wxSize GetTabSize( wxSize GetTabSize(
wxDC& dc, wxDC& dc,
wxWindow* wnd, wxWindow* wnd,
@@ -209,6 +225,11 @@ public:
void SetColour(const wxColour& colour); void SetColour(const wxColour& colour);
void SetActiveColour(const wxColour& colour); void SetActiveColour(const wxColour& colour);
void DrawBorder(
wxDC& dc,
wxWindow* wnd,
const wxRect& rect);
void DrawBackground( void DrawBackground(
wxDC& dc, wxDC& dc,
wxWindow* wnd, wxWindow* wnd,
@@ -234,6 +255,9 @@ public:
int GetIndentSize(); int GetIndentSize();
int GetBorderWidth(
wxWindow* wnd);
wxSize GetTabSize( wxSize GetTabSize(
wxDC& dc, wxDC& dc,
wxWindow* wnd, wxWindow* wnd,

View File

@@ -33,6 +33,7 @@ public:
wxAuiGtkTabArt(); wxAuiGtkTabArt();
virtual wxAuiTabArt* Clone(); virtual wxAuiTabArt* Clone();
virtual void DrawBorder(wxDC& dc, wxWindow* wnd, const wxRect& rect);
virtual void DrawBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect); virtual void DrawBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect);
virtual void DrawTab(wxDC& dc, virtual void DrawTab(wxDC& dc,
wxWindow* wnd, wxWindow* wnd,
@@ -46,6 +47,7 @@ public:
int button_state, int orientation, wxRect* out_rect); int button_state, int orientation, wxRect* out_rect);
int GetBestTabCtrlSize(wxWindow* wnd, const wxAuiNotebookPageArray& pages, int GetBestTabCtrlSize(wxWindow* wnd, const wxAuiNotebookPageArray& pages,
const wxSize& required_bmp_size); const wxSize& required_bmp_size);
int GetBorderWidth(wxWindow* wnd);
virtual wxSize GetTabSize(wxDC& dc, wxWindow* wnd, const wxString& caption, virtual wxSize GetTabSize(wxDC& dc, wxWindow* wnd, const wxString& caption,
const wxBitmap& bitmap, bool active, const wxBitmap& bitmap, bool active,
int close_button_state, int* x_extent); int close_button_state, int* x_extent);

View File

@@ -1543,7 +1543,10 @@ public:
for (i = 0; i < page_count; ++i) for (i = 0; i < page_count; ++i)
{ {
int height = m_rect.height - m_tabCtrlHeight; wxAuiNotebookPage& page = pages.Item(i);
int border_width = m_tabs->GetArtProvider()->GetBorderWidth(page.window);
int height = m_rect.height - m_tabCtrlHeight - border_width;
if ( height < 0 ) if ( height < 0 )
{ {
// avoid passing negative height to wxWindow::SetSize(), this // avoid passing negative height to wxWindow::SetSize(), this
@@ -1551,15 +1554,19 @@ public:
height = 0; height = 0;
} }
wxAuiNotebookPage& page = pages.Item(i);
if (m_tabs->GetFlags() & wxAUI_NB_BOTTOM) if (m_tabs->GetFlags() & wxAUI_NB_BOTTOM)
{ {
page.window->SetSize(m_rect.x, m_rect.y, m_rect.width, height); page.window->SetSize(m_rect.x + 2 * border_width,
m_rect.y + 2 * border_width,
m_rect.width - 4 * border_width,
height);
} }
else //TODO: if (GetFlags() & wxAUI_NB_TOP) else //TODO: if (GetFlags() & wxAUI_NB_TOP)
{ {
page.window->SetSize(m_rect.x, m_rect.y + m_tabCtrlHeight, page.window->SetSize(m_rect.x + 2 * border_width,
m_rect.width, height); m_rect.y + m_tabCtrlHeight,
m_rect.width - 4 * border_width,
height);
} }
// TODO: else if (GetFlags() & wxAUI_NB_LEFT){} // TODO: else if (GetFlags() & wxAUI_NB_LEFT){}
// TODO: else if (GetFlags() & wxAUI_NB_RIGHT){} // TODO: else if (GetFlags() & wxAUI_NB_RIGHT){}

View File

@@ -27,6 +27,8 @@
#include "wx/aui/framemanager.h" #include "wx/aui/framemanager.h"
#include "wx/aui/dockart.h" #include "wx/aui/dockart.h"
#include "wx/aui/auibook.h"
#include "wx/aui/tabart.h"
#ifndef WX_PRECOMP #ifndef WX_PRECOMP
#include "wx/settings.h" #include "wx/settings.h"
@@ -466,7 +468,7 @@ void wxAuiDefaultDockArt::DrawBackground(wxDC& dc, wxWindow *WXUNUSED(window), i
dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height); dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height);
} }
void wxAuiDefaultDockArt::DrawBorder(wxDC& dc, wxWindow *WXUNUSED(window), const wxRect& _rect, void wxAuiDefaultDockArt::DrawBorder(wxDC& dc, wxWindow* window, const wxRect& _rect,
wxAuiPaneInfo& pane) wxAuiPaneInfo& pane)
{ {
dc.SetPen(m_borderPen); dc.SetPen(m_borderPen);
@@ -492,10 +494,21 @@ void wxAuiDefaultDockArt::DrawBorder(wxDC& dc, wxWindow *WXUNUSED(window), const
} }
else else
{ {
for (i = 0; i < border_width; ++i) // notebooks draw the border themselves, so they can use native rendering (e.g. tabartgtk)
wxAuiTabArt* art = 0;
wxAuiNotebook* nb = wxDynamicCast(window, wxAuiNotebook);
if (nb)
art = nb->GetArtProvider();
if (art)
art->DrawBorder(dc, window, rect);
else
{ {
dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height); for (i = 0; i < border_width; ++i)
rect.Deflate(1); {
dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height);
rect.Deflate(1);
}
} }
} }
} }

View File

@@ -31,6 +31,8 @@
#include "wx/renderer.h" #include "wx/renderer.h"
#include "wx/aui/auibook.h" #include "wx/aui/auibook.h"
#include "wx/aui/framemanager.h"
#include "wx/aui/dockart.h"
#ifdef __WXMAC__ #ifdef __WXMAC__
#include "wx/osx/private.h" #include "wx/osx/private.h"
@@ -244,6 +246,18 @@ void wxAuiGenericTabArt::SetSizingInfo(const wxSize& tab_ctrl_size,
} }
void wxAuiGenericTabArt::DrawBorder(wxDC& dc, wxWindow* wnd, const wxRect& rect)
{
int i, border_width = GetBorderWidth(wnd);
wxRect theRect(rect);
for (i = 0; i < border_width; ++i)
{
dc.DrawRectangle(theRect.x, theRect.y, theRect.width, theRect.height);
theRect.Deflate(1);
}
}
void wxAuiGenericTabArt::DrawBackground(wxDC& dc, void wxAuiGenericTabArt::DrawBackground(wxDC& dc,
wxWindow* WXUNUSED(wnd), wxWindow* WXUNUSED(wnd),
const wxRect& rect) const wxRect& rect)
@@ -584,6 +598,18 @@ int wxAuiGenericTabArt::GetIndentSize()
return 5; return 5;
} }
int wxAuiGenericTabArt::GetBorderWidth(wxWindow* wnd)
{
wxAuiManager* mgr = wxAuiManager::GetManager(wnd);
if (mgr)
{
wxAuiDockArt* art = mgr->GetArtProvider();
if (art)
return art->GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE);
}
return 1;
}
wxSize wxAuiGenericTabArt::GetTabSize(wxDC& dc, wxSize wxAuiGenericTabArt::GetTabSize(wxDC& dc,
wxWindow* WXUNUSED(wnd), wxWindow* WXUNUSED(wnd),
const wxString& caption, const wxString& caption,
@@ -908,6 +934,18 @@ void wxAuiSimpleTabArt::SetActiveColour(const wxColour& colour)
m_selectedBkPen = wxPen(colour); m_selectedBkPen = wxPen(colour);
} }
void wxAuiSimpleTabArt::DrawBorder(wxDC& dc, wxWindow* wnd, const wxRect& rect)
{
int i, border_width = GetBorderWidth(wnd);
wxRect theRect(rect);
for (i = 0; i < border_width; ++i)
{
dc.DrawRectangle(theRect.x, theRect.y, theRect.width, theRect.height);
theRect.Deflate(1);
}
}
void wxAuiSimpleTabArt::DrawBackground(wxDC& dc, void wxAuiSimpleTabArt::DrawBackground(wxDC& dc,
wxWindow* WXUNUSED(wnd), wxWindow* WXUNUSED(wnd),
const wxRect& rect) const wxRect& rect)
@@ -1087,6 +1125,18 @@ int wxAuiSimpleTabArt::GetIndentSize()
return 0; return 0;
} }
int wxAuiSimpleTabArt::GetBorderWidth(wxWindow* wnd)
{
wxAuiManager* mgr = wxAuiManager::GetManager(wnd);
if (mgr)
{
wxAuiDockArt* art = mgr->GetArtProvider();
if (art)
return art->GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE);
}
return 1;
}
wxSize wxAuiSimpleTabArt::GetTabSize(wxDC& dc, wxSize wxAuiSimpleTabArt::GetTabSize(wxDC& dc,
wxWindow* WXUNUSED(wnd), wxWindow* WXUNUSED(wnd),
const wxString& caption, const wxString& caption,

View File

@@ -79,6 +79,23 @@ void wxAuiGtkTabArt::DrawBackground(wxDC& dc, wxWindow* WXUNUSED(wnd), const wxR
rect.x, rect.y, rect.width, rect.height); rect.x, rect.y, rect.width, rect.height);
} }
void wxAuiGtkTabArt::DrawBorder(wxDC& WXUNUSED(dc), wxWindow* wnd, const wxRect& rect)
{
int generic_border_width = wxAuiGenericTabArt::GetBorderWidth(wnd);
if (!wnd) return;
if (!wnd->m_wxwindow) return;
if (!gtk_widget_is_drawable(wnd->m_wxwindow)) return;
GtkStyle *style_notebook = gtk_widget_get_style(wxGTKPrivate::GetNotebookWidget());
gtk_paint_box(style_notebook, wnd->GTKGetDrawingWindow(), GTK_STATE_NORMAL, GTK_SHADOW_OUT,
NULL, wnd->m_wxwindow,
const_cast<char*>("notebook"),
rect.x + generic_border_width + 1, rect.y + generic_border_width + 1,
rect.width - (generic_border_width + 1), rect.height - (generic_border_width + 1));
}
void ButtonStateAndShadow(int button_state, GtkStateType &state, GtkShadowType &shadow) void ButtonStateAndShadow(int button_state, GtkStateType &state, GtkShadowType &shadow)
{ {
@@ -464,6 +481,12 @@ int wxAuiGtkTabArt::GetBestTabCtrlSize(wxWindow* wnd,
return tab_height; return tab_height;
} }
int wxAuiGtkTabArt::GetBorderWidth(wxWindow* wnd)
{
return wxAuiGenericTabArt::GetBorderWidth(wnd) + wxMax(GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder,
GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder);
}
wxSize wxAuiGtkTabArt::GetTabSize(wxDC& dc, wxSize wxAuiGtkTabArt::GetTabSize(wxDC& dc,
wxWindow* wnd, wxWindow* wnd,
const wxString& caption, const wxString& caption,