X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9c7f49f569dcabe360a3a51a94eff77225b39d69..27d0dcd033be9b1356a36d582f3d3665a53e11e4:/src/gtk/renderer.cpp diff --git a/src/gtk/renderer.cpp b/src/gtk/renderer.cpp index 77eee2e2fb..dea620908f 100644 --- a/src/gtk/renderer.cpp +++ b/src/gtk/renderer.cpp @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////// // Name: gtk/renderer.cpp -// Purpose: implementation of wxRendererBase for wxGTK +// Purpose: implementation of wxRendererNative for wxGTK // Author: Vadim Zeitlin // Modified by: // Created: 20.07.2003 @@ -30,13 +30,19 @@ #include #include "wx/gtk/win_gtk.h" +#include "wx/window.h" +#include "wx/dc.h" #include "wx/renderer.h" +#ifdef __WXGTK20__ + #include "wx/settings.h" +#endif // GTK 2.0 + // ---------------------------------------------------------------------------- -// wxRendererGTK: our wxRendererBase implementation +// wxRendererGTK: our wxRendererNative implementation // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxRendererGTK : public wxDelegateRendererBase +class WXDLLEXPORT wxRendererGTK : public wxDelegateRendererNative { public: // draw the header control button (used by wxListCtrl) @@ -53,6 +59,16 @@ public: int flags = 0); #endif // GTK 2.0 + virtual void DrawSplitterBorder(wxWindow *win, + wxDC& dc, + const wxRect& rect) ; + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position, + wxOrientation orient); + + virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win); }; // ============================================================================ @@ -60,13 +76,17 @@ public: // ============================================================================ /* static */ -wxRendererNative& wxRendererGTK::Get() +wxRendererNative& wxRendererNative::GetDefault() { static wxRendererGTK s_rendererGTK; return s_rendererGTK; } +// ---------------------------------------------------------------------------- +// list/tree controls drawing +// ---------------------------------------------------------------------------- + void wxRendererGTK::DrawHeaderButton(wxWindow *win, wxDC& dc, @@ -79,9 +99,10 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win, GTK_PIZZA(win->m_wxwindow)->bin_window, flags & wxCONTROL_DISABLED ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL, GTK_SHADOW_OUT, - (GdkRectangle*) NULL, m_wxwindow, + (GdkRectangle*) NULL, + win->m_wxwindow, (char *)"button", // const_cast - dc.XLOG2DEV(rect.x) - 1, rect.y - 1, rect.width + 2, rect.h + 2 + dc.XLOG2DEV(rect.x) - 1, rect.y - 1, rect.width + 2, rect.height + 2 ); } @@ -91,9 +112,11 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win, // // TODO: isn't there a GTK function to draw it? void -wxRendererGTK::DrawTreeItemButton(wxDC& dc, const wxRect& rect, int flags) +wxRendererGTK::DrawTreeItemButton(wxWindow* WXUNUSED(win), + wxDC& dc, const wxRect& rect, int flags) { - dc.SetBrush(*m_hilightBrush); + dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT), + wxSOLID)); dc.SetPen(*wxBLACK_PEN); wxPoint button[3]; @@ -124,4 +147,120 @@ wxRendererGTK::DrawTreeItemButton(wxDC& dc, const wxRect& rect, int flags) #endif // GTK 2.0 +// ---------------------------------------------------------------------------- +// splitter sash drawing +// ---------------------------------------------------------------------------- + +// the full sash width (should be even) +static const wxCoord SASH_SIZE = 10; + +// margin around the sash +static const wxCoord SASH_MARGIN = 5; + +wxPoint +wxRendererGTK::GetSplitterSashAndBorder(const wxWindow * WXUNUSED(win)) +{ + // we don't draw any border, hence 0 for the second field, but we must + // leave some margin around the sash + return wxPoint(SASH_SIZE + SASH_MARGIN, 0); +} + +void +wxRendererGTK::DrawSplitterBorder(wxWindow * WXUNUSED(win), + wxDC& WXUNUSED(dc), + const wxRect& WXUNUSED(rect)) +{ + // nothing to do +} + +void +wxRendererGTK::DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position, + wxOrientation orient) +{ + if ( !win->m_wxwindow->window ) + { + // VZ: this happens on startup -- why? + return; + } + + // are we drawing vertical or horizontal splitter? + const bool isVert = orient == wxVERTICAL; + + // we must erase everything first, otherwise the garbage from the old sash + // is left when dragging it + // + // TODO: is this the right way to draw themed background? + GdkRectangle rect; + if ( isVert ) + { + rect.x = position; + rect.y = 0; + rect.width = SASH_SIZE + SASH_MARGIN; + rect.height = size.y; + } + else // horz + { + rect.x = 0; + rect.y = position; + rect.height = SASH_SIZE + SASH_MARGIN; + rect.width = size.x; + } + + gtk_paint_flat_box + ( + win->m_wxwindow->style, + GTK_PIZZA(win->m_wxwindow)->bin_window, + GTK_STATE_NORMAL, + GTK_SHADOW_NONE, + &rect, + win->m_wxwindow, + (char *)"base", // const_cast + 0, 0, -1, -1 + ); + + + // leave some margin before sash itself + position += SASH_MARGIN / 2; + + // and finally draw it using GTK paint functions + typedef void (*GtkPaintLineFunc)(GtkStyle *, GdkWindow *, + GtkStateType, + GdkRectangle *, GtkWidget *, +#ifdef __WXGTK20__ + const gchar *, +#else + gchar *, +#endif + gint, gint, gint); + + GtkPaintLineFunc func = isVert ? gtk_paint_vline : gtk_paint_hline; + + (*func) + ( + win->m_wxwindow->style, + GTK_PIZZA(win->m_wxwindow)->bin_window, + GTK_STATE_NORMAL, + NULL, + win->m_wxwindow, + (char *)"paned", // const_cast + 0, isVert ? size.y : size.x, position + SASH_SIZE / 2 - 1 + ); + + gtk_paint_box + ( + win->m_wxwindow->style, + GTK_PIZZA(win->m_wxwindow)->bin_window, + GTK_STATE_NORMAL, + GTK_SHADOW_OUT, + (GdkRectangle*) NULL, + win->m_wxwindow, + (char *)"paned", // const_cast + isVert ? position : size.x - 2*SASH_SIZE, + isVert ? size.y - 2*SASH_SIZE : position, + SASH_SIZE, SASH_SIZE + ); +}