X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/95155e752c80e957bc2df39c44dce2853f7ce1f2..b77b87881bae2e6306366d79e7fe160334b3d4a2:/src/gtk/renderer.cpp diff --git a/src/gtk/renderer.cpp b/src/gtk/renderer.cpp index 2c16c49654..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,15 +65,18 @@ public: int flags = 0); #endif // GTK 2.0 - // draw a (vertical) sash - // - // VZ: doesn't work -- nothing is shown on screen, why? -#if 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); -#endif // 0 + wxCoord position, + wxOrientation orient, + int flags = 0); + + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); }; // ============================================================================ @@ -75,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, @@ -142,14 +155,57 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* WXUNUSED(win), #endif // GTK 2.0 -#if 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 +} -// draw a (vertical) sash void wxRendererGTK::DrawSplitterSash(wxWindow *win, wxDC& dc, const wxSize& size, - wxCoord position) + wxCoord position, + wxOrientation orient, + int WXUNUSED_IN_GTK1(flags)) { if ( !win->m_wxwindow->window ) { @@ -157,29 +213,95 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win, return; } - gtk_paint_vline + // 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, - win->m_wxwindow->window, + GTK_PIZZA(win->m_wxwindow)->bin_window, GTK_STATE_NORMAL, - (GdkRectangle *)NULL, + GTK_SHADOW_NONE, + &rect, win->m_wxwindow, - (char *)"vpaned", // const_cast - 0, size.y, position + 3 + (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, - win->m_wxwindow->window, + GTK_PIZZA(win->m_wxwindow)->bin_window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, - (GdkRectangle *)NULL, + (GdkRectangle*) NULL, win->m_wxwindow, (char *)"paned", // const_cast - position, 5, 10, 10 + isVert ? position : size.x - 2*SASH_SIZE, + isVert ? size.y - 2*SASH_SIZE : position, + SASH_SIZE, SASH_SIZE ); +#endif // GTK+ 2.x/1.x } -#endif // 0 -