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:
@@ -59,15 +59,16 @@ public:
|
|||||||
int flags = 0);
|
int flags = 0);
|
||||||
#endif // GTK 2.0
|
#endif // GTK 2.0
|
||||||
|
|
||||||
// draw a (vertical) sash
|
virtual void DrawSplitterBorder(wxWindow *win,
|
||||||
//
|
wxDC& dc,
|
||||||
// VZ: doesn't work -- nothing is shown on screen, why?
|
const wxRect& rect) ;
|
||||||
#if 0
|
|
||||||
virtual void DrawSplitterSash(wxWindow *win,
|
virtual void DrawSplitterSash(wxWindow *win,
|
||||||
wxDC& dc,
|
wxDC& dc,
|
||||||
const wxSize& size,
|
const wxSize& size,
|
||||||
wxCoord position);
|
wxCoord position,
|
||||||
#endif // 0
|
wxOrientation orient);
|
||||||
|
|
||||||
|
virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win);
|
||||||
};
|
};
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -82,6 +83,10 @@ wxRendererNative& wxRendererNative::Get()
|
|||||||
return s_rendererGTK;
|
return s_rendererGTK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// list/tree controls drawing
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
wxRendererGTK::DrawHeaderButton(wxWindow *win,
|
wxRendererGTK::DrawHeaderButton(wxWindow *win,
|
||||||
wxDC& dc,
|
wxDC& dc,
|
||||||
@@ -142,14 +147,38 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* WXUNUSED(win),
|
|||||||
|
|
||||||
#endif // GTK 2.0
|
#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
|
void
|
||||||
wxRendererGTK::DrawSplitterSash(wxWindow *win,
|
wxRendererGTK::DrawSplitterSash(wxWindow *win,
|
||||||
wxDC& dc,
|
wxDC& dc,
|
||||||
const wxSize& size,
|
const wxSize& size,
|
||||||
wxCoord position)
|
wxCoord position,
|
||||||
|
wxOrientation orient)
|
||||||
{
|
{
|
||||||
if ( !win->m_wxwindow->window )
|
if ( !win->m_wxwindow->window )
|
||||||
{
|
{
|
||||||
@@ -157,29 +186,76 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win,
|
|||||||
return;
|
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->style,
|
||||||
win->m_wxwindow->window,
|
GTK_PIZZA(win->m_wxwindow)->bin_window,
|
||||||
GTK_STATE_NORMAL,
|
GTK_STATE_NORMAL,
|
||||||
(GdkRectangle *)NULL,
|
GTK_SHADOW_NONE,
|
||||||
|
&rect,
|
||||||
win->m_wxwindow,
|
win->m_wxwindow,
|
||||||
(char *)"vpaned", // const_cast
|
(char *)"base", // const_cast
|
||||||
0, size.y, position + 3
|
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
|
gtk_paint_box
|
||||||
(
|
(
|
||||||
win->m_wxwindow->style,
|
win->m_wxwindow->style,
|
||||||
win->m_wxwindow->window,
|
GTK_PIZZA(win->m_wxwindow)->bin_window,
|
||||||
GTK_STATE_NORMAL,
|
GTK_STATE_NORMAL,
|
||||||
GTK_SHADOW_OUT,
|
GTK_SHADOW_OUT,
|
||||||
(GdkRectangle*) NULL,
|
(GdkRectangle*) NULL,
|
||||||
win->m_wxwindow,
|
win->m_wxwindow,
|
||||||
(char *)"paned", // const_cast
|
(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);
|
int flags = 0);
|
||||||
#endif // GTK 2.0
|
#endif // GTK 2.0
|
||||||
|
|
||||||
// draw a (vertical) sash
|
virtual void DrawSplitterBorder(wxWindow *win,
|
||||||
//
|
wxDC& dc,
|
||||||
// VZ: doesn't work -- nothing is shown on screen, why?
|
const wxRect& rect) ;
|
||||||
#if 0
|
|
||||||
virtual void DrawSplitterSash(wxWindow *win,
|
virtual void DrawSplitterSash(wxWindow *win,
|
||||||
wxDC& dc,
|
wxDC& dc,
|
||||||
const wxSize& size,
|
const wxSize& size,
|
||||||
wxCoord position);
|
wxCoord position,
|
||||||
#endif // 0
|
wxOrientation orient);
|
||||||
|
|
||||||
|
virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win);
|
||||||
};
|
};
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -82,6 +83,10 @@ wxRendererNative& wxRendererNative::Get()
|
|||||||
return s_rendererGTK;
|
return s_rendererGTK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// list/tree controls drawing
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
wxRendererGTK::DrawHeaderButton(wxWindow *win,
|
wxRendererGTK::DrawHeaderButton(wxWindow *win,
|
||||||
wxDC& dc,
|
wxDC& dc,
|
||||||
@@ -142,14 +147,38 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* WXUNUSED(win),
|
|||||||
|
|
||||||
#endif // GTK 2.0
|
#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
|
void
|
||||||
wxRendererGTK::DrawSplitterSash(wxWindow *win,
|
wxRendererGTK::DrawSplitterSash(wxWindow *win,
|
||||||
wxDC& dc,
|
wxDC& dc,
|
||||||
const wxSize& size,
|
const wxSize& size,
|
||||||
wxCoord position)
|
wxCoord position,
|
||||||
|
wxOrientation orient)
|
||||||
{
|
{
|
||||||
if ( !win->m_wxwindow->window )
|
if ( !win->m_wxwindow->window )
|
||||||
{
|
{
|
||||||
@@ -157,29 +186,76 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win,
|
|||||||
return;
|
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->style,
|
||||||
win->m_wxwindow->window,
|
GTK_PIZZA(win->m_wxwindow)->bin_window,
|
||||||
GTK_STATE_NORMAL,
|
GTK_STATE_NORMAL,
|
||||||
(GdkRectangle *)NULL,
|
GTK_SHADOW_NONE,
|
||||||
|
&rect,
|
||||||
win->m_wxwindow,
|
win->m_wxwindow,
|
||||||
(char *)"vpaned", // const_cast
|
(char *)"base", // const_cast
|
||||||
0, size.y, position + 3
|
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
|
gtk_paint_box
|
||||||
(
|
(
|
||||||
win->m_wxwindow->style,
|
win->m_wxwindow->style,
|
||||||
win->m_wxwindow->window,
|
GTK_PIZZA(win->m_wxwindow)->bin_window,
|
||||||
GTK_STATE_NORMAL,
|
GTK_STATE_NORMAL,
|
||||||
GTK_SHADOW_OUT,
|
GTK_SHADOW_OUT,
|
||||||
(GdkRectangle*) NULL,
|
(GdkRectangle*) NULL,
|
||||||
win->m_wxwindow,
|
win->m_wxwindow,
|
||||||
(char *)"paned", // const_cast
|
(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
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user