X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/54195d23c25f085dc05f4a376ac638a690d8f7fa..60435227b10297510316a88f67758fb6b6d93c10:/src/aui/tabartgtk.cpp diff --git a/src/aui/tabartgtk.cpp b/src/aui/tabartgtk.cpp index a7bc5e4551..1c86fbe9d0 100644 --- a/src/aui/tabartgtk.cpp +++ b/src/aui/tabartgtk.cpp @@ -4,7 +4,6 @@ // Author: Jens Lody and Teodor Petrov // Modified by: // Created: 2012-03-23 -// RCS-ID: $Id$ // Copyright: (c) 2012 Jens Lody // and Teodor Petrov // Licence: wxWindows licence @@ -50,11 +49,7 @@ static int s_CloseIconSize = 16; // default size } -wxAuiGtkTabArt::wxAuiGtkTabArt()//: -// m_Xthickness(0), -// m_Ythickness(0), -// m_TabHBorder(0), -// m_TabVBorder(0) +wxAuiGtkTabArt::wxAuiGtkTabArt() { } @@ -83,6 +78,23 @@ void wxAuiGtkTabArt::DrawBackground(wxDC& dc, wxWindow* WXUNUSED(wnd), const wxR 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("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) { @@ -178,7 +190,6 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p "focus-line-width", &focus_width, NULL); - int gap_x = 0, gap_width = 0; int tab_pos; if (m_flags &wxAUI_NB_BOTTOM) tab_pos = wxAUI_NB_BOTTOM; @@ -199,12 +210,11 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p if (page.active) tab_rect.height += 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; - // if no bitmap is set, we need a tiny correction - if (! page.bitmap.IsOk()) - tab_rect.height += 1; - int gap_height = 6 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; - int gap_y = tab_rect.y - gap_height; + int gap_rect_height = 10 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; + int gap_rect_x = 1, gap_start = 0, gap_width = 0; + int gap_rect_y = tab_rect.y - gap_rect_height; + int gap_rect_width = window_rect.width; switch (tab_pos) { @@ -212,15 +222,17 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p tab_rect.y -= 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; if (!page.active) tab_rect.y += 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; - gap_y = tab_rect.y + tab_rect.height; + gap_rect_y = tab_rect.y + tab_rect.height - GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder / 2; // fall through case wxAUI_NB_BOTTOM: - gap_x = tab_rect.x - GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder / 2; + gap_start = tab_rect.x - GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder / 2; gap_width = tab_rect.width; break; + // TODO: case wxAUI_NB_LEFT: break; + // TODO: case wxAUI_NB_RIGHT: break; } tab_rect.y += GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder / 2; - gap_y += GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder / 2; + gap_rect_y += GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder / 2; int padding = focus_width + GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; @@ -239,6 +251,15 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p wxGTKDCImpl *impldc = (wxGTKDCImpl*) dc.GetImpl(); GdkWindow* window = impldc->GetGDKWindow(); + // Before drawing the active tab itself, draw a box without border, because some themes + // have transparent gaps and a line would be visible at the bottom of the tab + if (page.active) + gtk_paint_box(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_NONE, + NULL, widget, + const_cast("notebook"), + gap_rect_x, gap_rect_y, + gap_rect_width, gap_rect_height); + if (tab_pos == wxAUI_NB_BOTTOM) { if (page.active) @@ -246,9 +267,9 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p gtk_paint_box_gap(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, widget, const_cast("notebook"), - window_rect.x, gap_y, - window_rect.width, gap_height, - GTK_POS_BOTTOM, gap_x , gap_width); + gap_rect_x, gap_rect_y, + gap_rect_width, gap_rect_height, + GTK_POS_BOTTOM, gap_start , gap_width); } gtk_paint_extension(style_notebook, window, page.active ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE, GTK_SHADOW_OUT, @@ -265,9 +286,9 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p gtk_paint_box_gap(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, widget, const_cast("notebook"), - window_rect.x, gap_y, - window_rect.width, gap_height, - GTK_POS_TOP, gap_x , gap_width); + gap_rect_x, gap_rect_y, + gap_rect_width, gap_rect_height, + GTK_POS_TOP, gap_start , gap_width); } gtk_paint_extension(style_notebook, window, page.active ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE, GTK_SHADOW_OUT, @@ -278,6 +299,15 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p GTK_POS_BOTTOM); } + // After drawing the inactive tab itself, draw a box with the same dimensions as the gap-box, + // otherwise we don't get a gap-box, if the active tab is invisible + if (!page.active) + gtk_paint_box(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, + NULL, widget, + const_cast("notebook"), + gap_rect_x, gap_rect_y, + gap_rect_width, gap_rect_height); + wxCoord textX = tab_rect.x + padding + style_notebook->xthickness; int bitmap_offset = 0; @@ -352,7 +382,8 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p *out_button_rect = DrawCloseButton(dc, widget, close_button_state, rect, wxRIGHT, &area); } - tab_rect.width = std::min(tab_rect.width, clip_width); + if ( clip_width < tab_rect.width ) + tab_rect.width = clip_width; *out_tab_rect = tab_rect; dc.DestroyClippingRegion(); @@ -450,6 +481,17 @@ int wxAuiGtkTabArt::GetBestTabCtrlSize(wxWindow* wnd, 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); +} + +int wxAuiGtkTabArt::GetAdditionalBorderSpace(wxWindow* wnd) +{ + return 2 * GetBorderWidth(wnd); +} + wxSize wxAuiGtkTabArt::GetTabSize(wxDC& dc, wxWindow* wnd, const wxString& caption,