Further attempts at getting the header buttons right

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58299 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2009-01-22 14:09:32 +00:00
parent 09e72468cf
commit b047e876e0
4 changed files with 42 additions and 26 deletions

View File

@@ -122,6 +122,7 @@ GtkWidget *GetCheckButtonWidget();
GtkWidget *GetComboBoxWidget(); GtkWidget *GetComboBoxWidget();
GtkWidget *GetEntryWidget(); GtkWidget *GetEntryWidget();
GtkWidget *GetHeaderButtonWidgetFirst(); GtkWidget *GetHeaderButtonWidgetFirst();
GtkWidget *GetHeaderButtonWidgetLast();
GtkWidget *GetHeaderButtonWidget(); GtkWidget *GetHeaderButtonWidget();
GtkWidget *GetRadioButtonWidget(); GtkWidget *GetRadioButtonWidget();
GtkWidget *GetSplitterWidget(); GtkWidget *GetSplitterWidget();

View File

@@ -133,11 +133,14 @@ void wxHeaderCtrl::DoScrollHorz(int dx)
wxSize wxHeaderCtrl::DoGetBestSize() const wxSize wxHeaderCtrl::DoGetBestSize() const
{ {
wxWindow *win = GetParent();
int height = wxRendererNative::Get().GetHeaderButtonHeight( win );
// the vertical size is rather arbitrary but it looks better if we leave // the vertical size is rather arbitrary but it looks better if we leave
// some space around the text // some space around the text
const wxSize size(IsEmpty() ? wxHeaderCtrlBase::DoGetBestSize().x const wxSize size(IsEmpty() ? wxHeaderCtrlBase::DoGetBestSize().x
: GetColEnd(GetColumnCount() - 1), : GetColEnd(GetColumnCount() - 1),
(7*GetCharHeight())/4); height ); // (7*GetCharHeight())/4);
CacheBestSize(size); CacheBestSize(size);
return size; return size;
} }
@@ -493,6 +496,11 @@ void wxHeaderCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
int w, h; int w, h;
GetClientSize(&w, &h); GetClientSize(&w, &h);
#ifdef __WXGTK__
int vw;
GetVirtualSize(&vw, NULL);
#endif
wxAutoBufferedPaintDC dc(this); wxAutoBufferedPaintDC dc(this);
dc.SetBackground(GetBackgroundColour()); dc.SetBackground(GetBackgroundColour());
@@ -510,7 +518,7 @@ void wxHeaderCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
if ( col.IsHidden() ) if ( col.IsHidden() )
continue; continue;
const int colWidth = col.GetWidth(); int colWidth = col.GetWidth();
wxHeaderSortIconType sortArrow; wxHeaderSortIconType sortArrow;
if ( col.IsSortKey() ) if ( col.IsSortKey() )
@@ -534,11 +542,22 @@ void wxHeaderCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
state = wxCONTROL_DISABLED; state = wxCONTROL_DISABLED;
} }
if (i == 0)
state |= wxCONTROL_SPECIAL;
wxHeaderButtonParams params; wxHeaderButtonParams params;
params.m_labelText = col.GetTitle(); params.m_labelText = col.GetTitle();
params.m_labelBitmap = col.GetBitmap(); params.m_labelBitmap = col.GetBitmap();
params.m_labelAlignment = col.GetAlignment(); params.m_labelAlignment = col.GetAlignment();
#ifdef __WXGTK__
if (i == count-1)
{
colWidth = wxMax( colWidth, vw - xpos );
state |= wxCONTROL_EXPANDED;
}
#endif
wxRendererNative::Get().DrawHeaderButton wxRendererNative::Get().DrawHeaderButton
( (
this, this,

View File

@@ -117,11 +117,8 @@ static GtkWidget *s_first_button = NULL;
static GtkWidget *s_other_button = NULL; static GtkWidget *s_other_button = NULL;
static GtkWidget *s_last_button = NULL; static GtkWidget *s_last_button = NULL;
GtkWidget *GetHeaderButtonWidgetFirst() static void CreateHeaderButtona()
{ {
if ( !s_first_button )
{
// Get the dummy tree widget, give it a column, and then use the // Get the dummy tree widget, give it a column, and then use the
// widget in the column header for the rendering code. // widget in the column header for the rendering code.
GtkWidget* treewidget = GetTreeWidget(); GtkWidget* treewidget = GetTreeWidget();
@@ -137,31 +134,28 @@ GtkWidget *GetHeaderButtonWidgetFirst()
column = gtk_tree_view_column_new(); column = gtk_tree_view_column_new();
gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column); gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column);
s_last_button = column->button; s_last_button = column->button;
} }
GtkWidget *GetHeaderButtonWidgetFirst()
{
if (!s_first_button)
CreateHeaderButtons();
return s_first_button; return s_first_button;
} }
GtkWidget *GetHeaderButtonWidgetLast()
{
if (!s_last_button)
CreateHeaderButtons();
return s_last_button;
}
GtkWidget *GetHeaderButtonWidget() GtkWidget *GetHeaderButtonWidget()
{ {
if ( !s_other_button ) if (!s_other_button)
{ CreateHeaderButtons();
// Get the dummy tree widget, give it a column, and then use the
// widget in the column header for the rendering code.
GtkWidget* treewidget = GetTreeWidget();
GtkTreeViewColumn *column = gtk_tree_view_column_new();
gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column);
s_first_button = column->button;
column = gtk_tree_view_column_new();
gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column);
s_other_button = column->button;
column = gtk_tree_view_column_new();
gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column);
s_last_button = column->button;
}
return s_other_button; return s_other_button;
} }

View File

@@ -173,6 +173,8 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win,
GtkWidget *button = wxGTKPrivate::GetHeaderButtonWidget(); GtkWidget *button = wxGTKPrivate::GetHeaderButtonWidget();
if (flags & wxCONTROL_SPECIAL) if (flags & wxCONTROL_SPECIAL)
button = wxGTKPrivate::GetHeaderButtonWidgetFirst(); button = wxGTKPrivate::GetHeaderButtonWidgetFirst();
if (flags & wxCONTROL_EXPANDED)
button = wxGTKPrivate::GetHeaderButtonWidgetLast();
GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc);
wxASSERT_MSG( gdk_window, wxASSERT_MSG( gdk_window,