X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3dd570e5724a9c83d77a83c4612f5a7efe7463dc..3ef37e7f4ec5f0688a4fb47e530ca2d30a6bb3ed:/src/gtk/renderer.cpp diff --git a/src/gtk/renderer.cpp b/src/gtk/renderer.cpp index d9b057e693..949fe5da1a 100644 --- a/src/gtk/renderer.cpp +++ b/src/gtk/renderer.cpp @@ -38,6 +38,12 @@ #include "wx/settings.h" #endif // GTK 2.0 +#ifdef __WXGTK20__ + #define WXUNUSED_IN_GTK1(arg) arg +#else + #define WXUNUSED_IN_GTK1(arg) +#endif + // ---------------------------------------------------------------------------- // wxRendererGTK: our wxRendererNative implementation // ---------------------------------------------------------------------------- @@ -59,6 +65,18 @@ public: int flags = 0); #endif // GTK 2.0 + virtual void DrawSplitterBorder(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position, + wxOrientation orient, + int flags = 0); + + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); }; // ============================================================================ @@ -66,13 +84,17 @@ public: // ============================================================================ /* static */ -wxRendererNative& wxRendererNative::Get() +wxRendererNative& wxRendererNative::GetDefault() { static wxRendererGTK s_rendererGTK; return s_rendererGTK; } +// ---------------------------------------------------------------------------- +// list/tree controls drawing +// ---------------------------------------------------------------------------- + void wxRendererGTK::DrawHeaderButton(wxWindow *win, wxDC& dc, @@ -133,4 +155,153 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* WXUNUSED(win), #endif // GTK 2.0 +// ---------------------------------------------------------------------------- +// splitter sash drawing +// ---------------------------------------------------------------------------- + +// all this should probably be read from the current theme settings somehow? +#ifdef __WXGTK20__ + // the full sash size + static const wxCoord SASH_FULL_SIZE = 5; +#else // GTK+ 1.x + // the full sash width (should be even) + static const wxCoord SASH_SIZE = 10; + + // margin around the sash + static const wxCoord SASH_MARGIN = 5; + + // the full sash size + static const wxCoord SASH_FULL_SIZE = SASH_SIZE + SASH_MARGIN; +#endif // GTK+ 2.x/1.x + +wxSplitterRenderParams +wxRendererGTK::GetSplitterParams(const wxWindow * WXUNUSED(win)) +{ + // we don't draw any border, hence 0 for the second field + return wxSplitterRenderParams + ( + SASH_FULL_SIZE, + 0, +#ifdef __WXGTK20__ + true // hot sensitive +#else // GTK+ 1.x + false // not +#endif // GTK+ 2.x/1.x + ); +} + +void +wxRendererGTK::DrawSplitterBorder(wxWindow * WXUNUSED(win), + wxDC& WXUNUSED(dc), + const wxRect& WXUNUSED(rect), + int WXUNUSED(flags)) +{ + // nothing to do +} + +void +wxRendererGTK::DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position, + wxOrientation orient, + int WXUNUSED_IN_GTK1(flags)) +{ + if ( !win->m_wxwindow->window ) + { + // VZ: this happens on startup -- why? + return; + } + + // are we drawing vertical or horizontal splitter? + const bool isVert = orient == wxVERTICAL; + + GdkRectangle rect; + if ( isVert ) + { + rect.x = position; + rect.y = 0; + rect.width = SASH_FULL_SIZE; + rect.height = size.y; + } + else // horz + { + rect.x = 0; + rect.y = position; + rect.height = SASH_FULL_SIZE; + rect.width = size.x; + } + +#ifdef __WXGTK20__ + gtk_paint_handle + ( + win->m_wxwindow->style, + GTK_PIZZA(win->m_wxwindow)->bin_window, + flags & wxCONTROL_CURRENT ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL, + GTK_SHADOW_NONE, + NULL /* no clipping */, + win->m_wxwindow, + "paned", + rect.x, + rect.y, + rect.width, + rect.height, + isVert ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL + ); +#else // GTK+ 1.x + // 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? + 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 *, + gchar *, + 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 + ); +#endif // GTK+ 2.x/1.x +}