diff options
Diffstat (limited to 'lib/widgets/ephy-editable-toolbar.c')
-rwxr-xr-x | lib/widgets/ephy-editable-toolbar.c | 92 |
1 files changed, 85 insertions, 7 deletions
diff --git a/lib/widgets/ephy-editable-toolbar.c b/lib/widgets/ephy-editable-toolbar.c index eddb39bd9..9861f4bf4 100755 --- a/lib/widgets/ephy-editable-toolbar.c +++ b/lib/widgets/ephy-editable-toolbar.c @@ -258,8 +258,22 @@ drag_data_delete_cb (GtkWidget *widget, g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); node = (EphyToolbarsItem *)g_object_get_data (G_OBJECT (widget), "item_data"); - g_return_if_fail (node != NULL); - ephy_toolbars_group_remove_item (etoolbar->priv->group, node); + if (node) + { + ephy_toolbars_group_remove_item (etoolbar->priv->group, node); + } + else + { + EphyToolbarsToolbar *toolbar; + GtkWidget *child = GTK_BIN (widget)->child; + + g_return_if_fail (child != NULL); + toolbar = (EphyToolbarsToolbar *)g_object_get_data + (G_OBJECT (child), "toolbar_data"); + g_return_if_fail (toolbar != NULL); + + ephy_toolbars_group_remove_toolbar (etoolbar->priv->group, toolbar); + } etoolbar->priv->toolbars_dirty = TRUE; queue_ui_update (etoolbar); @@ -279,7 +293,7 @@ drag_data_get_cb (GtkWidget *widget, g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); action = EGG_ACTION (g_object_get_data (G_OBJECT (widget), "egg-action")); - target = action->name; + target = action ? action->name : "Toolbar"; LOG ("Drag data get %s", action->name); @@ -352,6 +366,49 @@ disconnect_item_drag_source (EphyToolbarsItem *item, EphyEditableToolbar *etoolb } static void +connect_toolbar_drag_source (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar) +{ + GtkWidget *widget; + + g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); + g_return_if_fail (toolbar != NULL); + + widget = get_item_widget (etoolbar, toolbar); + + if (!g_object_get_data (G_OBJECT (widget), "drag_source_set")) + { + g_object_set_data (G_OBJECT (widget), "drag_source_set", + GINT_TO_POINTER (TRUE)); + g_signal_connect (widget->parent, "drag_data_get", + G_CALLBACK (drag_data_get_cb), + etoolbar); + g_signal_connect (widget->parent, "drag_data_delete", + G_CALLBACK (drag_data_delete_cb), + etoolbar); + } +} + +static void +disconnect_toolbar_drag_source (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar) +{ + GtkWidget *widget; + + g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); + g_return_if_fail (toolbar != NULL); + + widget = get_item_widget (etoolbar, toolbar); + + if (g_object_get_data (G_OBJECT (widget), "drag_source_set")) + { + g_object_set_data (G_OBJECT (widget), "drag_source_set", + GINT_TO_POINTER (FALSE)); + g_signal_handlers_disconnect_by_func (widget->parent, + G_CALLBACK (drag_data_delete_cb), + etoolbar); + } +} + +static void setup_toolbar (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar) { GtkWidget *widget; @@ -470,6 +527,9 @@ do_merge (EphyEditableToolbar *t) ephy_toolbars_group_foreach_item (t->priv->group, (EphyToolbarsGroupForeachItemFunc) connect_item_drag_source, t); + ephy_toolbars_group_foreach_toolbar (t->priv->group, + (EphyToolbarsGroupForeachToolbarFunc) + connect_toolbar_drag_source, t); } ephy_toolbars_group_foreach_toolbar (t->priv->group, @@ -733,6 +793,10 @@ editor_close_cb (GtkWidget *button, EphyEditableToolbar *etoolbar) (EphyToolbarsGroupForeachItemFunc) disconnect_item_drag_source, etoolbar); + ephy_toolbars_group_foreach_toolbar (etoolbar->priv->group, + (EphyToolbarsGroupForeachToolbarFunc) + disconnect_toolbar_drag_source, + etoolbar); hide_editor (etoolbar); } @@ -975,19 +1039,29 @@ button_press_cb (GtkWidget *w, EphyEditableToolbar *etoolbar) { GtkWidget *widget; - GtkWidget *toolitem; + GtkWidget *drag_widget; + GtkWidget *child; g_return_val_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar), FALSE); widget = gtk_get_event_widget (event); - toolitem = gtk_widget_get_ancestor (widget, EGG_TYPE_TOOL_ITEM); + child = GTK_BIN (widget)->child; + + if (EGG_IS_TOOLBAR (child)) + { + drag_widget = widget; + } + else + { + drag_widget = gtk_widget_get_ancestor (widget, EGG_TYPE_TOOL_ITEM); + } - if (toolitem == NULL) return FALSE; + if (drag_widget == NULL) return FALSE; switch (event->type) { case GDK_BUTTON_PRESS: - gtk_drag_begin (toolitem, + gtk_drag_begin (drag_widget, gtk_target_list_new (source_drag_types, 1), GDK_ACTION_MOVE, 1, event); return TRUE; @@ -1038,6 +1112,10 @@ ephy_editable_toolbar_edit (EphyEditableToolbar *etoolbar) ephy_toolbars_group_foreach_item (etoolbar->priv->group, (EphyToolbarsGroupForeachItemFunc) connect_item_drag_source, etoolbar); + ephy_toolbars_group_foreach_toolbar (etoolbar->priv->group, + (EphyToolbarsGroupForeachToolbarFunc) + connect_toolbar_drag_source, + etoolbar); ephy_toolbars_group_foreach_item (etoolbar->priv->group, (EphyToolbarsGroupForeachItemFunc) set_action_sensitive, etoolbar); |