implemented native GTK drawing for the splitter
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22311 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
62dc9cb4f1
commit
d16cf3cd54
@ -59,15 +59,16 @@ 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) ;
|
||||
virtual void DrawSplitterSash(wxWindow *win,
|
||||
wxDC& dc,
|
||||
const wxSize& size,
|
||||
wxCoord position);
|
||||
#endif // 0
|
||||
wxCoord position,
|
||||
wxOrientation orient);
|
||||
|
||||
virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win);
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
@ -82,6 +83,10 @@ wxRendererNative& wxRendererNative::Get()
|
||||
return s_rendererGTK;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// list/tree controls drawing
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void
|
||||
wxRendererGTK::DrawHeaderButton(wxWindow *win,
|
||||
wxDC& dc,
|
||||
@ -142,14 +147,38 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* WXUNUSED(win),
|
||||
|
||||
#endif // GTK 2.0
|
||||
|
||||
#if 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
|
||||
}
|
||||
|
||||
// draw a (vertical) sash
|
||||
void
|
||||
wxRendererGTK::DrawSplitterSash(wxWindow *win,
|
||||
wxDC& dc,
|
||||
const wxSize& size,
|
||||
wxCoord position)
|
||||
wxCoord position,
|
||||
wxOrientation orient)
|
||||
{
|
||||
if ( !win->m_wxwindow->window )
|
||||
{
|
||||
@ -157,29 +186,76 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win,
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_paint_vline
|
||||
// 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,
|
||||
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 // 0
|
||||
|
||||
|
@ -59,15 +59,16 @@ 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) ;
|
||||
virtual void DrawSplitterSash(wxWindow *win,
|
||||
wxDC& dc,
|
||||
const wxSize& size,
|
||||
wxCoord position);
|
||||
#endif // 0
|
||||
wxCoord position,
|
||||
wxOrientation orient);
|
||||
|
||||
virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win);
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
@ -82,6 +83,10 @@ wxRendererNative& wxRendererNative::Get()
|
||||
return s_rendererGTK;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// list/tree controls drawing
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void
|
||||
wxRendererGTK::DrawHeaderButton(wxWindow *win,
|
||||
wxDC& dc,
|
||||
@ -142,14 +147,38 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* WXUNUSED(win),
|
||||
|
||||
#endif // GTK 2.0
|
||||
|
||||
#if 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
|
||||
}
|
||||
|
||||
// draw a (vertical) sash
|
||||
void
|
||||
wxRendererGTK::DrawSplitterSash(wxWindow *win,
|
||||
wxDC& dc,
|
||||
const wxSize& size,
|
||||
wxCoord position)
|
||||
wxCoord position,
|
||||
wxOrientation orient)
|
||||
{
|
||||
if ( !win->m_wxwindow->window )
|
||||
{
|
||||
@ -157,29 +186,76 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win,
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_paint_vline
|
||||
// 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,
|
||||
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 // 0
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user