: wxToolBarToolBase(tbar, control, label)
{
m_item = NULL;
- // Hold a reference to keep control alive until DoInsertTool() is
- // called, or if RemoveTool() is called (see DoDeleteTool)
- g_object_ref(control->m_widget);
- // release reference when gtk_widget_destroy() is called on control
- g_signal_connect(
- control->m_widget, "destroy", G_CALLBACK(g_object_unref), NULL);
}
void SetImage();
}
}
-//-----------------------------------------------------------------------------
-// InsertChild callback for wxToolBar
-//-----------------------------------------------------------------------------
-
-static void wxInsertChildInToolBar( wxWindow* WXUNUSED(parent),
- wxWindow* /* child */)
+void wxToolBar::AddChildGTK(wxWindowGTK* child)
{
- // Child widget will be inserted into GtkToolbar by DoInsertTool()
+ GtkWidget* align = gtk_alignment_new(0.5, 0.5, 0, 0);
+ gtk_widget_show(align);
+ gtk_container_add(GTK_CONTAINER(align), child->m_widget);
+ GtkToolItem* item = gtk_tool_item_new();
+ gtk_container_add(GTK_CONTAINER(item), align);
+ // position will be corrected in DoInsertTool if necessary
+ gtk_toolbar_insert(GTK_TOOLBAR(GTK_BIN(m_widget)->child), item, -1);
}
// ----------------------------------------------------------------------------
long style,
const wxString& name )
{
- m_insertCallback = wxInsertChildInToolBar;
-
if ( !PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
{
m_widget = gtk_event_box_new();
ConnectWidget( m_widget );
}
+ g_object_ref(m_widget);
gtk_container_add(GTK_CONTAINER(m_widget), GTK_WIDGET(m_toolbar));
gtk_widget_show(GTK_WIDGET(m_toolbar));
if (tool->GetKind() == wxITEM_DROPDOWN)
tool->CreateDropDown();
+ gtk_toolbar_insert(m_toolbar, tool->m_item, int(pos));
break;
case wxTOOL_STYLE_SEPARATOR:
tool->m_item = gtk_separator_tool_item_new();
+ gtk_toolbar_insert(m_toolbar, tool->m_item, int(pos));
break;
case wxTOOL_STYLE_CONTROL:
- GtkWidget * const align = gtk_alignment_new(0.5, 0.5, 0, 0);
- gtk_widget_show(align);
wxWindow* control = tool->GetControl();
- gtk_container_add(GTK_CONTAINER(align), control->m_widget);
- tool->m_item = gtk_tool_item_new();
- gtk_container_add(GTK_CONTAINER(tool->m_item), align);
+ if (control->m_widget->parent == NULL)
+ AddChildGTK(control);
+ tool->m_item = GTK_TOOL_ITEM(control->m_widget->parent->parent);
+ if (gtk_toolbar_get_item_index(m_toolbar, tool->m_item) != int(pos))
+ {
+ g_object_ref(tool->m_item);
+ gtk_container_remove(
+ GTK_CONTAINER(m_toolbar), GTK_WIDGET(tool->m_item));
+ gtk_toolbar_insert(m_toolbar, tool->m_item, int(pos));
+ g_object_unref(tool->m_item);
+ }
// Inserted items "slide" into place using an animated effect that
// causes multiple size events on the item. Must set size request
// to keep item size from getting permanently set too small by the
break;
}
gtk_widget_show(GTK_WIDGET(tool->m_item));
- gtk_toolbar_insert(m_toolbar, tool->m_item, int(pos));
InvalidateBestSize();