remove text field from page data, add much more useful image widget pointer, lots of code simplification and cleanup
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55132 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -41,16 +41,10 @@
|
|||||||
class wxGtkNotebookPage: public wxObject
|
class wxGtkNotebookPage: public wxObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxGtkNotebookPage()
|
GtkWidget* m_box;
|
||||||
{
|
GtkWidget* m_label;
|
||||||
m_image = -1;
|
GtkWidget* m_image;
|
||||||
m_box = NULL;
|
int m_imageIndex;
|
||||||
}
|
|
||||||
|
|
||||||
wxString m_text;
|
|
||||||
int m_image;
|
|
||||||
GtkLabel *m_label;
|
|
||||||
GtkWidget *m_box; // in which the label and image are packed
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -140,8 +134,6 @@ END_EVENT_TABLE()
|
|||||||
void wxNotebook::Init()
|
void wxNotebook::Init()
|
||||||
{
|
{
|
||||||
m_padding = 0;
|
m_padding = 0;
|
||||||
|
|
||||||
m_imageList = (wxImageList *) NULL;
|
|
||||||
m_oldSelection = -1;
|
m_oldSelection = -1;
|
||||||
m_themeEnabled = true;
|
m_themeEnabled = true;
|
||||||
}
|
}
|
||||||
@@ -218,40 +210,27 @@ int wxNotebook::GetSelection() const
|
|||||||
|
|
||||||
wxString wxNotebook::GetPageText( size_t page ) const
|
wxString wxNotebook::GetPageText( size_t page ) const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( m_widget != NULL, wxEmptyString, wxT("invalid notebook") );
|
wxCHECK_MSG(page < GetPageCount(), wxEmptyString, "invalid notebook index");
|
||||||
|
|
||||||
wxGtkNotebookPage* nb_page = GetNotebookPage(page);
|
GtkLabel* label = GTK_LABEL(GetNotebookPage(page)->m_label);
|
||||||
if (nb_page)
|
return wxGTK_CONV_BACK(gtk_label_get_text(label));
|
||||||
return nb_page->m_text;
|
|
||||||
else
|
|
||||||
return wxEmptyString;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxNotebook::GetPageImage( size_t page ) const
|
int wxNotebook::GetPageImage( size_t page ) const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid notebook") );
|
wxCHECK_MSG(page < GetPageCount(), -1, "invalid notebook index");
|
||||||
|
|
||||||
wxGtkNotebookPage* nb_page = GetNotebookPage(page);
|
return GetNotebookPage(page)->m_imageIndex;
|
||||||
if (nb_page)
|
|
||||||
return nb_page->m_image;
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxGtkNotebookPage* wxNotebook::GetNotebookPage( int page ) const
|
wxGtkNotebookPage* wxNotebook::GetNotebookPage( int page ) const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( m_widget != NULL, (wxGtkNotebookPage*) NULL, wxT("invalid notebook") );
|
|
||||||
|
|
||||||
wxCHECK_MSG( page < (int)m_pagesData.GetCount(), (wxGtkNotebookPage*) NULL, wxT("invalid notebook index") );
|
|
||||||
|
|
||||||
return m_pagesData.Item(page)->GetData();
|
return m_pagesData.Item(page)->GetData();
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxNotebook::DoSetSelection( size_t page, int flags )
|
int wxNotebook::DoSetSelection( size_t page, int flags )
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid notebook") );
|
wxCHECK_MSG(page < GetPageCount(), -1, "invalid notebook index");
|
||||||
|
|
||||||
wxCHECK_MSG( page < m_pagesData.GetCount(), -1, wxT("invalid notebook index") );
|
|
||||||
|
|
||||||
int selOld = GetSelection();
|
int selOld = GetSelection();
|
||||||
|
|
||||||
@@ -276,94 +255,44 @@ int wxNotebook::DoSetSelection( size_t page, int flags )
|
|||||||
|
|
||||||
bool wxNotebook::SetPageText( size_t page, const wxString &text )
|
bool wxNotebook::SetPageText( size_t page, const wxString &text )
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( m_widget != NULL, false, wxT("invalid notebook") );
|
wxCHECK_MSG(page < GetPageCount(), false, "invalid notebook index");
|
||||||
|
|
||||||
wxGtkNotebookPage* nb_page = GetNotebookPage(page);
|
GtkLabel* label = GTK_LABEL(GetNotebookPage(page)->m_label);
|
||||||
|
gtk_label_set_text(label, wxGTK_CONV(text));
|
||||||
wxCHECK_MSG( nb_page, false, wxT("SetPageText: invalid page index") );
|
|
||||||
|
|
||||||
nb_page->m_text = text;
|
|
||||||
|
|
||||||
gtk_label_set_text( nb_page->m_label, wxGTK_CONV( nb_page->m_text ) );
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxNotebook::SetPageImage( size_t page, int image )
|
bool wxNotebook::SetPageImage( size_t page, int image )
|
||||||
{
|
{
|
||||||
/* HvdH 28-12-98: now it works, but it's a bit of a kludge */
|
wxCHECK_MSG(page < GetPageCount(), false, "invalid notebook index");
|
||||||
|
|
||||||
wxGtkNotebookPage* nb_page = GetNotebookPage(page);
|
wxGtkNotebookPage* pageData = GetNotebookPage(page);
|
||||||
|
if (image >= 0)
|
||||||
if (!nb_page) return false;
|
|
||||||
|
|
||||||
/* Optimization posibility: return immediately if image unchanged.
|
|
||||||
* Not enabled because it may break existing (stupid) code that
|
|
||||||
* manipulates the imagelist to cycle images */
|
|
||||||
|
|
||||||
/* if (image == nb_page->m_image) return true; */
|
|
||||||
|
|
||||||
/* For different cases:
|
|
||||||
1) no image -> no image
|
|
||||||
2) image -> no image
|
|
||||||
3) no image -> image
|
|
||||||
4) image -> image */
|
|
||||||
|
|
||||||
if (image == -1 && nb_page->m_image == -1)
|
|
||||||
return true; /* Case 1): Nothing to do. */
|
|
||||||
|
|
||||||
GtkWidget *pixmapwid = (GtkWidget*) NULL;
|
|
||||||
|
|
||||||
if (nb_page->m_image != -1)
|
|
||||||
{
|
{
|
||||||
/* Case 2) or 4). There is already an image in the gtkhbox. Let's find it */
|
wxCHECK_MSG(m_imageList, false, "invalid notebook imagelist");
|
||||||
|
const wxBitmap* bitmap = m_imageList->GetBitmapPtr(image);
|
||||||
GList *child = gtk_container_get_children(GTK_CONTAINER(nb_page->m_box));
|
if (bitmap == NULL)
|
||||||
while (child)
|
return false;
|
||||||
|
if (pageData->m_image)
|
||||||
{
|
{
|
||||||
if (GTK_IS_IMAGE(child->data))
|
gtk_image_set_from_pixbuf(
|
||||||
{
|
GTK_IMAGE(pageData->m_image), bitmap->GetPixbuf());
|
||||||
pixmapwid = GTK_WIDGET(child->data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
child = child->next;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
/* We should have the pixmap widget now */
|
|
||||||
wxASSERT(pixmapwid != NULL);
|
|
||||||
|
|
||||||
if (image == -1)
|
|
||||||
{
|
{
|
||||||
/* If there's no new widget, just remove the old from the box */
|
pageData->m_image = gtk_image_new_from_pixbuf(bitmap->GetPixbuf());
|
||||||
gtk_container_remove(GTK_CONTAINER(nb_page->m_box), pixmapwid);
|
gtk_widget_show(pageData->m_image);
|
||||||
nb_page->m_image = -1;
|
gtk_box_pack_start(GTK_BOX(pageData->m_box),
|
||||||
|
pageData->m_image, false, false, m_padding);
|
||||||
return true; /* Case 2) */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (pageData->m_image)
|
||||||
/* Only cases 3) and 4) left */
|
|
||||||
wxASSERT( m_imageList != NULL ); /* Just in case */
|
|
||||||
|
|
||||||
/* Construct the new pixmap */
|
|
||||||
const wxBitmap *bmp = m_imageList->GetBitmapPtr(image);
|
|
||||||
|
|
||||||
if (pixmapwid == NULL)
|
|
||||||
{
|
{
|
||||||
/* Case 3) No old pixmap. Create a new one and prepend it to the hbox */
|
gtk_widget_destroy(pageData->m_image);
|
||||||
pixmapwid = gtk_image_new_from_pixbuf(bmp->GetPixbuf());
|
pageData->m_image = NULL;
|
||||||
|
|
||||||
/* CHECKME: Are these pack flags okay? */
|
|
||||||
gtk_box_pack_start(GTK_BOX(nb_page->m_box), pixmapwid, FALSE, FALSE, m_padding);
|
|
||||||
gtk_widget_show(pixmapwid);
|
|
||||||
}
|
}
|
||||||
else
|
pageData->m_imageIndex = image;
|
||||||
{
|
|
||||||
/* Case 4) Simply replace the pixmap */
|
|
||||||
gtk_image_set_from_pixbuf((GtkImage*)pixmapwid, bmp->GetPixbuf());
|
|
||||||
}
|
|
||||||
|
|
||||||
nb_page->m_image = image;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -379,24 +308,16 @@ void wxNotebook::SetPadding( const wxSize &padding )
|
|||||||
|
|
||||||
m_padding = padding.GetWidth();
|
m_padding = padding.GetWidth();
|
||||||
|
|
||||||
int i;
|
for (size_t i = GetPageCount(); i--;)
|
||||||
for (i=0; i<int(GetPageCount()); i++)
|
|
||||||
{
|
{
|
||||||
wxGtkNotebookPage* nb_page = GetNotebookPage(i);
|
wxGtkNotebookPage* pageData = GetNotebookPage(i);
|
||||||
wxASSERT(nb_page != NULL);
|
if (pageData->m_image)
|
||||||
|
|
||||||
if (nb_page->m_image != -1)
|
|
||||||
{
|
{
|
||||||
// gtk_box_set_child_packing sets padding on BOTH sides
|
gtk_box_set_child_packing(GTK_BOX(pageData->m_box),
|
||||||
// icon provides left padding, label provides center and right
|
pageData->m_image, false, false, m_padding, GTK_PACK_START);
|
||||||
int image = nb_page->m_image;
|
|
||||||
SetPageImage(i,-1);
|
|
||||||
SetPageImage(i,image);
|
|
||||||
}
|
}
|
||||||
wxASSERT(nb_page->m_label);
|
gtk_box_set_child_packing(GTK_BOX(pageData->m_box),
|
||||||
gtk_box_set_child_packing(GTK_BOX(nb_page->m_box),
|
pageData->m_label, false, false, m_padding, GTK_PACK_END);
|
||||||
GTK_WIDGET(nb_page->m_label),
|
|
||||||
FALSE, FALSE, m_padding, GTK_PACK_END);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,14 +328,9 @@ void wxNotebook::SetTabSize(const wxSize& WXUNUSED(sz))
|
|||||||
|
|
||||||
bool wxNotebook::DeleteAllPages()
|
bool wxNotebook::DeleteAllPages()
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( m_widget != NULL, false, wxT("invalid notebook") );
|
for (size_t i = GetPageCount(); i--;)
|
||||||
|
DeletePage(i);
|
||||||
|
|
||||||
while (m_pagesData.GetCount() > 0)
|
|
||||||
DeletePage( m_pagesData.GetCount()-1 );
|
|
||||||
|
|
||||||
wxASSERT_MSG( GetPageCount() == 0, _T("all pages must have been deleted") );
|
|
||||||
|
|
||||||
InvalidateBestSize();
|
|
||||||
return wxNotebookBase::DeleteAllPages();
|
return wxNotebookBase::DeleteAllPages();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -473,54 +389,52 @@ bool wxNotebook::InsertPage( size_t position,
|
|||||||
|
|
||||||
GtkNotebook *notebook = GTK_NOTEBOOK(m_widget);
|
GtkNotebook *notebook = GTK_NOTEBOOK(m_widget);
|
||||||
|
|
||||||
wxGtkNotebookPage *nb_page = new wxGtkNotebookPage();
|
wxGtkNotebookPage* pageData = new wxGtkNotebookPage;
|
||||||
|
|
||||||
if ( position == GetPageCount() )
|
|
||||||
m_pagesData.Append( nb_page );
|
|
||||||
else
|
|
||||||
m_pagesData.Insert( position, nb_page );
|
|
||||||
|
|
||||||
m_pages.Insert(win, position);
|
m_pages.Insert(win, position);
|
||||||
|
m_pagesData.Insert(position, pageData);
|
||||||
|
|
||||||
// set the label image and text
|
// set the label image and text
|
||||||
// this must be done before adding the page, as GetPageText
|
// this must be done before adding the page, as GetPageText
|
||||||
// and GetPageImage will otherwise return wrong values in
|
// and GetPageImage will otherwise return wrong values in
|
||||||
// the page-changed event that results from inserting the
|
// the page-changed event that results from inserting the
|
||||||
// first page.
|
// first page.
|
||||||
nb_page->m_image = imageId;
|
pageData->m_imageIndex = imageId;
|
||||||
nb_page->m_text = wxStripMenuCodes(text);
|
|
||||||
|
|
||||||
nb_page->m_box = gtk_hbox_new( FALSE, 1 );
|
pageData->m_box = gtk_hbox_new(false, 1);
|
||||||
gtk_container_set_border_width((GtkContainer*)nb_page->m_box, 2);
|
gtk_container_set_border_width(GTK_CONTAINER(pageData->m_box), 2);
|
||||||
|
|
||||||
gtk_notebook_insert_page(notebook, win->m_widget, nb_page->m_box, position);
|
|
||||||
|
|
||||||
|
pageData->m_image = NULL;
|
||||||
if (imageId != -1)
|
if (imageId != -1)
|
||||||
{
|
{
|
||||||
wxASSERT( m_imageList != NULL );
|
if (m_imageList)
|
||||||
|
{
|
||||||
const wxBitmap *bmp = m_imageList->GetBitmapPtr(imageId);
|
const wxBitmap* bitmap = m_imageList->GetBitmapPtr(imageId);
|
||||||
GtkWidget* pixmapwid = gtk_image_new_from_pixbuf(bmp->GetPixbuf());
|
pageData->m_image = gtk_image_new_from_pixbuf(bitmap->GetPixbuf());
|
||||||
gtk_box_pack_start(GTK_BOX(nb_page->m_box), pixmapwid, FALSE, FALSE, m_padding);
|
gtk_box_pack_start(GTK_BOX(pageData->m_box),
|
||||||
gtk_widget_show(pixmapwid);
|
pageData->m_image, false, false, m_padding);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
wxFAIL_MSG("invalid notebook imagelist");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set the label text */
|
/* set the label text */
|
||||||
nb_page->m_label = GTK_LABEL( gtk_label_new(wxGTK_CONV(nb_page->m_text)) );
|
pageData->m_label = gtk_label_new(wxGTK_CONV(wxStripMenuCodes(text)));
|
||||||
gtk_box_pack_end( GTK_BOX(nb_page->m_box), GTK_WIDGET(nb_page->m_label), FALSE, FALSE, m_padding );
|
gtk_box_pack_end(GTK_BOX(pageData->m_box),
|
||||||
|
pageData->m_label, false, false, m_padding);
|
||||||
|
|
||||||
|
gtk_widget_show_all(pageData->m_box);
|
||||||
|
gtk_notebook_insert_page(notebook, win->m_widget, pageData->m_box, position);
|
||||||
|
|
||||||
/* apply current style */
|
/* apply current style */
|
||||||
GtkRcStyle *style = CreateWidgetStyle();
|
GtkRcStyle *style = CreateWidgetStyle();
|
||||||
if ( style )
|
if ( style )
|
||||||
{
|
{
|
||||||
gtk_widget_modify_style(GTK_WIDGET(nb_page->m_label), style);
|
gtk_widget_modify_style(pageData->m_label, style);
|
||||||
gtk_rc_style_unref(style);
|
gtk_rc_style_unref(style);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* show the label */
|
if (select && GetPageCount() > 1)
|
||||||
gtk_widget_show( GTK_WIDGET(nb_page->m_label) );
|
|
||||||
|
|
||||||
if (select && (m_pagesData.GetCount() > 1))
|
|
||||||
{
|
{
|
||||||
SetSelection( position );
|
SetSelection( position );
|
||||||
}
|
}
|
||||||
@@ -557,8 +471,8 @@ int wxNotebook::HitTest(const wxPoint& pt, long *flags) const
|
|||||||
|
|
||||||
for ( ; i < count; i++ )
|
for ( ; i < count; i++ )
|
||||||
{
|
{
|
||||||
wxGtkNotebookPage* nb_page = GetNotebookPage(i);
|
wxGtkNotebookPage* pageData = GetNotebookPage(i);
|
||||||
GtkWidget *box = nb_page->m_box;
|
GtkWidget* box = pageData->m_box;
|
||||||
|
|
||||||
const gint border = gtk_container_get_border_width(GTK_CONTAINER(box));
|
const gint border = gtk_container_get_border_width(GTK_CONTAINER(box));
|
||||||
|
|
||||||
@@ -567,26 +481,11 @@ int wxNotebook::HitTest(const wxPoint& pt, long *flags) const
|
|||||||
// ok, we're inside this tab -- now find out where, if needed
|
// ok, we're inside this tab -- now find out where, if needed
|
||||||
if ( flags )
|
if ( flags )
|
||||||
{
|
{
|
||||||
GtkWidget *pixmap = NULL;
|
if (pageData->m_image && IsPointInsideWidget(pt, pageData->m_image, x, y))
|
||||||
|
|
||||||
GList *children = gtk_container_get_children(GTK_CONTAINER(box));
|
|
||||||
for ( GList *child = children; child; child = child->next )
|
|
||||||
{
|
|
||||||
if (GTK_IS_IMAGE(child->data))
|
|
||||||
{
|
|
||||||
pixmap = GTK_WIDGET(child->data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( children )
|
|
||||||
g_list_free(children);
|
|
||||||
|
|
||||||
if ( pixmap && IsPointInsideWidget(pt, pixmap, x, y) )
|
|
||||||
{
|
{
|
||||||
*flags = wxBK_HITTEST_ONICON;
|
*flags = wxBK_HITTEST_ONICON;
|
||||||
}
|
}
|
||||||
else if ( IsPointInsideWidget(pt, GTK_WIDGET(nb_page->m_label), x, y) )
|
else if (IsPointInsideWidget(pt, pageData->m_label, x, y))
|
||||||
{
|
{
|
||||||
*flags = wxBK_HITTEST_ONLABEL;
|
*flags = wxBK_HITTEST_ONLABEL;
|
||||||
}
|
}
|
||||||
@@ -648,9 +547,8 @@ bool wxNotebook::DoPhase( int WXUNUSED(nPhase) )
|
|||||||
void wxNotebook::DoApplyWidgetStyle(GtkRcStyle *style)
|
void wxNotebook::DoApplyWidgetStyle(GtkRcStyle *style)
|
||||||
{
|
{
|
||||||
gtk_widget_modify_style(m_widget, style);
|
gtk_widget_modify_style(m_widget, style);
|
||||||
size_t cnt = m_pagesData.GetCount();
|
for (size_t i = GetPageCount(); i--;)
|
||||||
for (size_t i = 0; i < cnt; i++)
|
gtk_widget_modify_style(GetNotebookPage(i)->m_label, style);
|
||||||
gtk_widget_modify_style(GTK_WIDGET(GetNotebookPage(i)->m_label), style);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GdkWindow *wxNotebook::GTKGetWindow(wxArrayGdkWindows& windows) const
|
GdkWindow *wxNotebook::GTKGetWindow(wxArrayGdkWindows& windows) const
|
||||||
|
Reference in New Issue
Block a user