diff options
Diffstat (limited to 'lib/egg')
-rwxr-xr-x | lib/egg/egg-editable-toolbar.c | 110 | ||||
-rwxr-xr-x | lib/egg/egg-editable-toolbar.h | 3 |
2 files changed, 96 insertions, 17 deletions
diff --git a/lib/egg/egg-editable-toolbar.c b/lib/egg/egg-editable-toolbar.c index 8e76a57e2..bb42190e3 100755 --- a/lib/egg/egg-editable-toolbar.c +++ b/lib/egg/egg-editable-toolbar.c @@ -24,6 +24,7 @@ #include <gtk/gtkwindow.h> #include <gtk/gtkmain.h> #include <gtk/gtkdnd.h> +#include <gtk/gtkhbox.h> #include <gtk/gtkimage.h> #include <gtk/gtkimagemenuitem.h> #include <gtk/gtkmenu.h> @@ -74,6 +75,7 @@ struct EggEditableToolbarPrivate gboolean edit_mode; GtkWidget *selected_toolbar; GtkWidget *dragged_item; + GtkWidget *fixed; }; GType @@ -110,7 +112,7 @@ get_toolbar_position (EggEditableToolbar *etoolbar, GtkWidget *toolbar) int result; l = gtk_container_get_children (GTK_CONTAINER (etoolbar)); - result = g_list_index (l, toolbar); + result = g_list_index (l, toolbar->parent); g_list_free (l); return result; @@ -130,8 +132,8 @@ get_n_toolbars (EggEditableToolbar *etoolbar) } static GtkWidget * -get_toolbar_nth (EggEditableToolbar *etoolbar, - int position) +get_dock_nth (EggEditableToolbar *etoolbar, + int position) { GList *l; GtkWidget *result; @@ -143,6 +145,23 @@ get_toolbar_nth (EggEditableToolbar *etoolbar, return result; } +static GtkWidget * +get_toolbar_nth (EggEditableToolbar *etoolbar, + int position) +{ + GList *l; + GtkWidget *dock; + GtkWidget *result; + + dock = get_dock_nth (etoolbar, position); + + l = gtk_container_get_children (GTK_CONTAINER (dock)); + result = GTK_WIDGET (l->data); + g_list_free (l); + + return result; +} + static GtkAction * find_action (EggEditableToolbar *t, const char *name) @@ -545,12 +564,17 @@ toolbar_drag_leave_cb (GtkToolbar *toolbar, } static GtkWidget * -create_toolbar (EggEditableToolbar *t) +create_dock (EggEditableToolbar *t) { - GtkWidget *toolbar; + GtkWidget *toolbar, *hbox; + + hbox = gtk_hbox_new (0, FALSE); toolbar = gtk_toolbar_new (); gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar), TRUE); + gtk_widget_show (toolbar); + + gtk_box_pack_start (GTK_BOX (hbox), toolbar, TRUE, TRUE, 0); gtk_widget_show (toolbar); gtk_drag_dest_set (toolbar, 0, @@ -569,7 +593,7 @@ create_toolbar (EggEditableToolbar *t) g_signal_connect (toolbar, "popup_context_menu", G_CALLBACK (popup_toolbar_context_menu_cb), t); - return toolbar; + return hbox; } static void @@ -594,17 +618,37 @@ toolbar_changed_cb (EggToolbarsModel *model, } static void +update_fixed (EggEditableToolbar *t) +{ + GtkWidget *fixed, *dock; + + g_return_if_fail (IS_EGG_EDITABLE_TOOLBAR (t)); + + fixed = t->priv->fixed; + dock = get_dock_nth (t, 0); + + if (dock && fixed && fixed->parent == NULL) + { + gtk_box_pack_end (GTK_BOX (dock), fixed, FALSE, TRUE, 0); + } +} + +static void toolbar_added_cb (EggToolbarsModel *model, int position, EggEditableToolbar *t) { - GtkWidget *toolbar; + GtkWidget *dock; + + dock = create_dock (t); + + gtk_widget_set_size_request (dock, -1, MIN_TOOLBAR_HEIGHT); - toolbar = create_toolbar (t); - gtk_widget_set_size_request (toolbar, -1, MIN_TOOLBAR_HEIGHT); - gtk_box_pack_start (GTK_BOX (t), toolbar, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (t), dock, TRUE, TRUE, 0); - gtk_box_reorder_child (GTK_BOX (t), toolbar, position); + gtk_box_reorder_child (GTK_BOX (t), dock, position); + + update_fixed (t); } static void @@ -615,7 +659,9 @@ toolbar_removed_cb (EggToolbarsModel *model, GtkWidget *toolbar; toolbar = get_toolbar_nth (t, position); - gtk_widget_destroy (toolbar); + gtk_widget_destroy (toolbar->parent); + + update_fixed (t); } static void @@ -683,11 +729,12 @@ egg_editable_toolbar_construct (EggEditableToolbar *t) for (i = 0; i < n_toolbars; i++) { - GtkWidget *toolbar; + GtkWidget *toolbar, *dock; EggTbModelFlags flags; - toolbar = create_toolbar (t); - gtk_box_pack_start (GTK_BOX (t), toolbar, FALSE, FALSE, 0); + dock = create_dock (t); + gtk_box_pack_start (GTK_BOX (t), dock, TRUE, TRUE, 0); + toolbar = get_toolbar_nth (t, i); flags = egg_toolbars_model_get_flags (model, i); if (flags & EGG_TB_MODEL_ICONS_ONLY) @@ -710,6 +757,8 @@ egg_editable_toolbar_construct (EggEditableToolbar *t) gtk_widget_set_size_request (toolbar, -1, MIN_TOOLBAR_HEIGHT); } } + + update_fixed (t); } static void @@ -836,6 +885,7 @@ egg_editable_toolbar_init (EggEditableToolbar *t) t->priv->merge = NULL; t->priv->edit_mode = FALSE; + t->priv->fixed = NULL; } static void @@ -846,6 +896,11 @@ egg_editable_toolbar_finalize (GObject *object) g_return_if_fail (object != NULL); g_return_if_fail (IS_EGG_EDITABLE_TOOLBAR (object)); + if (t->priv->fixed) + { + g_object_unref (t->priv->fixed); + } + g_free (t->priv); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -933,7 +988,7 @@ egg_editable_toolbar_show (EggEditableToolbar *etoolbar, toolbar_name = egg_toolbars_model_toolbar_nth (model, i); if (strcmp (toolbar_name, name) == 0) { - gtk_widget_show (get_toolbar_nth (etoolbar, i)); + gtk_widget_show (get_dock_nth (etoolbar, i)); } } } @@ -955,12 +1010,33 @@ egg_editable_toolbar_hide (EggEditableToolbar *etoolbar, toolbar_name = egg_toolbars_model_toolbar_nth (model, i); if (strcmp (toolbar_name, name) == 0) { - gtk_widget_hide (get_toolbar_nth (etoolbar, i)); + gtk_widget_hide (get_dock_nth (etoolbar, i)); } } } void +egg_editable_toolbar_set_fixed (EggEditableToolbar *etoolbar, + GtkWidget *fixed) +{ + GtkWidget *toolbar; + GtkToolItem *item; + + toolbar = gtk_toolbar_new (); + gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar), FALSE); + gtk_widget_show (toolbar); + + item = gtk_tool_item_new (); + gtk_widget_show (GTK_WIDGET (item)); + gtk_container_add (GTK_CONTAINER (item), fixed); + + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, 0); + etoolbar->priv->fixed = g_object_ref (toolbar); + + update_fixed (etoolbar); +} + +void egg_editable_toolbar_set_drag_dest (EggEditableToolbar *etoolbar, const GtkTargetEntry *targets, gint n_targets, diff --git a/lib/egg/egg-editable-toolbar.h b/lib/egg/egg-editable-toolbar.h index 577d6ab93..e361b83c5 100755 --- a/lib/egg/egg-editable-toolbar.h +++ b/lib/egg/egg-editable-toolbar.h @@ -67,6 +67,9 @@ void egg_editable_toolbar_set_drag_dest (EggEditableToolbar *etoolbar, const GtkTargetEntry *targets, gint n_targets, const char *toolbar_name); +void egg_editable_toolbar_set_fixed (EggEditableToolbar *etoolbar, + GtkWidget *fixed); + /* Private Functions */ |