[gimp] Add a "lock content" toggle that needs some more refinement hacking
- From: Michael Natterer <mitch src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] Add a "lock content" toggle that needs some more refinement hacking
- Date: Thu, 20 Aug 2009 11:12:45 +0000 (UTC)
commit 86ad1ff70e6f6a2908d3e79781410902076fc9fa
Author: Michael Natterer <mitch gimp org>
Date: Wed Aug 19 21:29:34 2009 +0200
Add a "lock content" toggle that needs some more refinement hacking
app/widgets/gimpitemtreeview.c | 140 ++++++++++++++++++++++++++++++++++++++-
1 files changed, 136 insertions(+), 4 deletions(-)
---
diff --git a/app/widgets/gimpitemtreeview.c b/app/widgets/gimpitemtreeview.c
index 2cffc1b..0f08204 100644
--- a/app/widgets/gimpitemtreeview.c
+++ b/app/widgets/gimpitemtreeview.c
@@ -71,6 +71,8 @@ struct _GimpItemTreeViewPriv
GtkSizeGroup *options_group;
GtkWidget *lock_box;
+ GtkWidget *lock_content_toggle;
+
GtkWidget *edit_button;
GtkWidget *new_button;
GtkWidget *raise_button;
@@ -85,6 +87,7 @@ struct _GimpItemTreeViewPriv
GimpTreeHandler *visible_changed_handler;
GimpTreeHandler *linked_changed_handler;
+ GimpTreeHandler *lock_content_changed_handler;
};
@@ -154,10 +157,12 @@ static void gimp_item_tree_view_name_edited (GtkCellRendererText *cell,
const gchar *new_name,
GimpItemTreeView *view);
-static void gimp_item_tree_view_visible_changed (GimpItem *item,
- GimpItemTreeView *view);
-static void gimp_item_tree_view_linked_changed (GimpItem *item,
- GimpItemTreeView *view);
+static void gimp_item_tree_view_visible_changed (GimpItem *item,
+ GimpItemTreeView *view);
+static void gimp_item_tree_view_linked_changed (GimpItem *item,
+ GimpItemTreeView *view);
+static void gimp_item_tree_view_lock_content_changed (GimpItem *item,
+ GimpItemTreeView *view);
static void gimp_item_tree_view_eye_clicked (GtkCellRendererToggle *toggle,
gchar *path,
@@ -167,6 +172,12 @@ static void gimp_item_tree_view_chain_clicked (GtkCellRendererToggle *togg
gchar *path,
GdkModifierType state,
GimpItemTreeView *view);
+static void gimp_item_tree_view_lock_content_toggled
+ (GtkWidget *widget,
+ GimpItemTreeView *view);
+
+static void gimp_item_tree_view_update_options (GimpItemTreeView *view,
+ GimpItem *item);
/* utility function to avoid code duplication */
static void gimp_item_tree_view_toggle_clicked (GtkCellRendererToggle *toggle,
@@ -270,6 +281,9 @@ static void
gimp_item_tree_view_init (GimpItemTreeView *view)
{
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
+ GtkWidget *hbox;
+ GtkWidget *image;
+ GtkIconSize icon_size;
view->priv = G_TYPE_INSTANCE_GET_PRIVATE (view,
GIMP_TYPE_ITEM_TREE_VIEW,
@@ -295,6 +309,32 @@ gimp_item_tree_view_init (GimpItemTreeView *view)
gimp_container_tree_view_set_dnd_drop_to_empty (tree_view, TRUE);
view->priv->image = NULL;
+
+
+ /* Lock content toggle */
+
+ hbox = gimp_item_tree_view_get_lock_box (view);
+
+ view->priv->lock_content_toggle = gtk_check_button_new ();
+ gtk_box_pack_start (GTK_BOX (hbox), view->priv->lock_content_toggle,
+ FALSE, FALSE, 0);
+ gtk_widget_show (view->priv->lock_content_toggle);
+
+ g_signal_connect (view->priv->lock_content_toggle, "toggled",
+ G_CALLBACK (gimp_item_tree_view_lock_content_toggled),
+ view);
+
+ gimp_help_set_help_data (view->priv->lock_content_toggle,
+ _("Lock pixels"),
+ NULL /* GIMP_HELP_LAYER_DIALOG_LOCK_ALPHA_BUTTON */);
+
+ gtk_widget_style_get (GTK_WIDGET (view),
+ "button-icon-size", &icon_size,
+ NULL);
+
+ image = gtk_image_new_from_stock (GIMP_STOCK_TOOL_PAINTBRUSH, icon_size);
+ gtk_container_add (GTK_CONTAINER (view->priv->lock_content_toggle), image);
+ gtk_widget_show (image);
}
static GObject *
@@ -731,6 +771,9 @@ gimp_item_tree_view_set_container (GimpContainerView *view,
gimp_tree_handler_disconnect (item_view->priv->linked_changed_handler);
item_view->priv->linked_changed_handler = NULL;
+
+ gimp_tree_handler_disconnect (item_view->priv->lock_content_changed_handler);
+ item_view->priv->lock_content_changed_handler = NULL;
}
parent_view_iface->set_container (view, container);
@@ -746,6 +789,11 @@ gimp_item_tree_view_set_container (GimpContainerView *view,
gimp_tree_handler_connect (container, "linked-changed",
G_CALLBACK (gimp_item_tree_view_linked_changed),
view);
+
+ item_view->priv->lock_content_changed_handler =
+ gimp_tree_handler_connect (container, "lock-alpha-changed",
+ G_CALLBACK (gimp_item_tree_view_lock_content_changed),
+ view);
}
}
@@ -837,6 +885,8 @@ gimp_item_tree_view_select_item (GimpContainerView *view,
}
options_sensitive = TRUE;
+
+ gimp_item_tree_view_update_options (tree_view, GIMP_ITEM (item));
}
gimp_ui_manager_update (GIMP_EDITOR (tree_view)->ui_manager, tree_view);
@@ -1157,6 +1207,88 @@ gimp_item_tree_view_chain_clicked (GtkCellRendererToggle *toggle,
}
+/* "Lock Content" callbacks */
+
+static void
+gimp_item_tree_view_lock_content_changed (GimpItem *item,
+ GimpItemTreeView *view)
+{
+ GimpImage *image = view->priv->image;
+ GimpItem *active_item;
+
+ active_item = GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (image);
+
+ if (active_item == item)
+ gimp_item_tree_view_update_options (view, item);
+}
+
+static void
+gimp_item_tree_view_lock_content_toggled (GtkWidget *widget,
+ GimpItemTreeView *view)
+{
+ GimpImage *image = view->priv->image;
+ GimpItem *item;
+
+ item = GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (image);
+
+ if (item)
+ {
+ gboolean lock_content;
+
+ lock_content = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+
+ if (gimp_item_get_lock_content (item) != lock_content)
+ {
+#if 0
+ GimpUndo *undo;
+#endif
+ gboolean push_undo = TRUE;
+
+#if 0
+ /* compress lock content undos */
+ undo = gimp_image_undo_can_compress (image, GIMP_TYPE_ITEM_UNDO,
+ GIMP_UNDO_ITEM_LOCK_CONTENT);
+
+ if (undo && GIMP_ITEM_UNDO (undo)->item == item)
+ push_undo = FALSE;
+#endif
+
+ g_signal_handlers_block_by_func (item,
+ gimp_item_tree_view_lock_content_changed,
+ view);
+
+ gimp_item_set_lock_content (item, lock_content, push_undo);
+
+ g_signal_handlers_unblock_by_func (item,
+ gimp_item_tree_view_lock_content_changed,
+ view);
+
+ gimp_image_flush (image);
+ }
+ }
+}
+
+static void
+gimp_item_tree_view_update_options (GimpItemTreeView *view,
+ GimpItem *item)
+{
+ if (gimp_item_get_lock_content (item) !=
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (view->priv->lock_content_toggle)))
+ {
+ g_signal_handlers_block_by_func (view->priv->lock_content_toggle,
+ gimp_item_tree_view_lock_content_toggled,
+ view);
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (view->priv->lock_content_toggle),
+ gimp_item_get_lock_content (item));
+
+ g_signal_handlers_unblock_by_func (view->priv->lock_content_toggle,
+ gimp_item_tree_view_lock_content_toggled,
+ view);
+ }
+}
+
+
/* Utility functions used from eye_clicked and chain_clicked.
* Would make sense to do this in a generic fashion using
* properties, but for now it's better than duplicating the code.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]