[gimp] Bug 446171 – select content by click on layer icon



commit 0d81ce97177c10c8aee1f6b1d4addb1f5429eb2a
Author: Michael Natterer <mitch gimp org>
Date:   Sat Jul 18 16:59:43 2009 +0200

    Bug 446171 â?? select content by click on layer icon
    
    * app/widgets/gimplayertreeview.c (gimp_layer_tree_view_layer_clicked):
      when ALT is pressed, select the layer's alpha. SHIFT and CONTROL work
      as usual to add, subtract and intersect.
    
    * app/widgets/gimpchanneltreeview.c
    * app/widgets/gimpvectorstreeview.c: add "clicked" handlers here too
      and do the same select-on-alt-click thing.

 app/widgets/gimpchanneltreeview.c |   46 ++++++++++++++++++++++++
 app/widgets/gimplayertreeview.c   |   51 +++++++++++++++++++-------
 app/widgets/gimpvectorstreeview.c |   71 +++++++++++++++++++++++++++++--------
 3 files changed, 139 insertions(+), 29 deletions(-)
---
diff --git a/app/widgets/gimpchanneltreeview.c b/app/widgets/gimpchanneltreeview.c
index c0c3385..89abfc5 100644
--- a/app/widgets/gimpchanneltreeview.c
+++ b/app/widgets/gimpchanneltreeview.c
@@ -36,12 +36,14 @@
 #include "core/gimplayer.h"
 #include "core/gimplayermask.h"
 
+#include "gimpactiongroup.h"
 #include "gimpchanneltreeview.h"
 #include "gimpcomponenteditor.h"
 #include "gimpcontainerview.h"
 #include "gimpdnd.h"
 #include "gimpdocked.h"
 #include "gimphelp-ids.h"
+#include "gimpuimanager.h"
 #include "gimpwidgets-utils.h"
 
 #include "gimp-intl.h"
@@ -77,6 +79,11 @@ static void   gimp_channel_tree_view_set_context      (GimpContainerView *view,
                                                        GimpContext       *context);
 static void   gimp_channel_tree_view_set_view_size    (GimpContainerView *view);
 
+static void   gimp_channel_tree_view_channel_clicked  (GimpCellRendererViewable *cell,
+                                                       const gchar              *path_str,
+                                                       GdkModifierType           state,
+                                                       GimpContainerTreeView    *tree_view);
+
 
 G_DEFINE_TYPE_WITH_CODE (GimpChannelTreeView, gimp_channel_tree_view,
                          GIMP_TYPE_DRAWABLE_TREE_VIEW,
@@ -165,6 +172,10 @@ gimp_channel_tree_view_constructor (GType                  type,
   view      = GIMP_CHANNEL_TREE_VIEW (object);
   tree_view = GIMP_CONTAINER_TREE_VIEW (object);
 
+  g_signal_connect (tree_view->renderer_cell, "clicked",
+                    G_CALLBACK (gimp_channel_tree_view_channel_clicked),
+                    view);
+
   gimp_dnd_viewable_dest_add  (GTK_WIDGET (tree_view->view), GIMP_TYPE_LAYER,
                                NULL, tree_view);
   gimp_dnd_viewable_dest_add  (GTK_WIDGET (tree_view->view), GIMP_TYPE_LAYER_MASK,
@@ -374,3 +385,38 @@ gimp_channel_tree_view_set_view_size (GimpContainerView *view)
     gimp_component_editor_set_view_size (GIMP_COMPONENT_EDITOR (channel_view->priv->component_editor),
                                          view_size);
 }
+
+
+/*  signal handlers  */
+
+static void
+gimp_channel_tree_view_channel_clicked (GimpCellRendererViewable *cell,
+                                        const gchar              *path_str,
+                                        GdkModifierType           state,
+                                        GimpContainerTreeView    *tree_view)
+{
+  if (state & GDK_MOD1_MASK)
+    {
+      GimpUIManager   *ui_manager = GIMP_EDITOR (tree_view)->ui_manager;
+      GimpActionGroup *group;
+      const gchar     *action = "channels-selection-replace";
+
+      group = gimp_ui_manager_get_action_group (ui_manager, "channels");
+
+      if ((state & GDK_SHIFT_MASK) && (state & GDK_CONTROL_MASK))
+        {
+          action = "channels-selection-intersect";
+        }
+      else if (state & GDK_SHIFT_MASK)
+        {
+          action = "channels-selection-add";
+        }
+      else if (state & GDK_CONTROL_MASK)
+        {
+          action = "channels-selection-subtract";
+        }
+
+      gimp_action_group_activate_action (group, action);
+    }
+}
+
diff --git a/app/widgets/gimplayertreeview.c b/app/widgets/gimplayertreeview.c
index 451d740..ac21a53 100644
--- a/app/widgets/gimplayertreeview.c
+++ b/app/widgets/gimplayertreeview.c
@@ -1319,25 +1319,48 @@ gimp_layer_tree_view_layer_clicked (GimpCellRendererViewable *cell,
 
   if (gtk_tree_model_get_iter (tree_view->model, &iter, path))
     {
-      GimpViewRenderer *renderer;
-      GimpUIManager    *ui_manager;
-      GimpActionGroup  *group;
+      GimpUIManager   *ui_manager = GIMP_EDITOR (tree_view)->ui_manager;
+      GimpActionGroup *group;
 
-      ui_manager = GIMP_EDITOR (tree_view)->ui_manager;
-      group      = gimp_ui_manager_get_action_group (ui_manager, "layers");
+      group = gimp_ui_manager_get_action_group (ui_manager, "layers");
 
-      gtk_tree_model_get (tree_view->model, &iter,
-                          layer_view->priv->model_column_mask, &renderer,
-                          -1);
+      if (state & GDK_MOD1_MASK)
+        {
+          const gchar *action = "layers-alpha-selection-replace";
 
-      if (renderer)
+          if ((state & GDK_SHIFT_MASK) && (state & GDK_CONTROL_MASK))
+            {
+              action = "layers-alpha-selection-intersect";
+            }
+          else if (state & GDK_SHIFT_MASK)
+            {
+              action = "layers-alpha-selection-add";
+            }
+          else if (state & GDK_CONTROL_MASK)
+            {
+              action = "layers-alpha-selection-subtract";
+            }
+
+          gimp_action_group_activate_action (group, action);
+        }
+      else
         {
-          GimpLayerMask *mask = GIMP_LAYER_MASK (renderer->viewable);
+          GimpViewRenderer *renderer;
 
-          if (gimp_layer_mask_get_edit (mask))
-            gimp_action_group_set_action_active (group,
-                                                 "layers-mask-edit", FALSE);
-          g_object_unref (renderer);
+          gtk_tree_model_get (tree_view->model, &iter,
+                              layer_view->priv->model_column_mask, &renderer,
+                              -1);
+
+          if (renderer)
+            {
+              GimpLayerMask *mask = GIMP_LAYER_MASK (renderer->viewable);
+
+              if (gimp_layer_mask_get_edit (mask))
+                gimp_action_group_set_action_active (group,
+                                                     "layers-mask-edit", FALSE);
+
+              g_object_unref (renderer);
+            }
         }
     }
 
diff --git a/app/widgets/gimpvectorstreeview.c b/app/widgets/gimpvectorstreeview.c
index ce933bb..b240a6e 100644
--- a/app/widgets/gimpvectorstreeview.c
+++ b/app/widgets/gimpvectorstreeview.c
@@ -38,9 +38,11 @@
 #include "vectors/gimpvectors-export.h"
 #include "vectors/gimpvectors-import.h"
 
+#include "gimpactiongroup.h"
 #include "gimpcontainerview.h"
-#include "gimpvectorstreeview.h"
 #include "gimpdnd.h"
+#include "gimpuimanager.h"
+#include "gimpvectorstreeview.h"
 #include "gimpwidgets-utils.h"
 
 #include "gimp-intl.h"
@@ -48,20 +50,24 @@
 
 static void    gimp_vectors_tree_view_view_iface_init (GimpContainerViewInterface *iface);
 
-static GObject * gimp_vectors_tree_view_constructor   (GType                  type,
-                                                       guint                  n_params,
-                                                       GObjectConstructParam *params);
-static void      gimp_vectors_tree_view_set_container (GimpContainerView     *view,
-                                                       GimpContainer         *container);
-static void      gimp_vectors_tree_view_drop_svg      (GimpContainerTreeView *tree_view,
-                                                       const gchar           *svg_data,
-                                                       gsize                  svg_data_len,
-                                                       GimpViewable          *dest_viewable,
-                                                       GtkTreeViewDropPosition  drop_pos);
-static GimpItem * gimp_vectors_tree_view_item_new     (GimpImage             *image);
-static guchar  * gimp_vectors_tree_view_drag_svg      (GtkWidget             *widget,
-                                                       gsize                 *svg_data_len,
-                                                       gpointer               data);
+static GObject * gimp_vectors_tree_view_constructor   (GType                     type,
+                                                       guint                     n_params,
+                                                       GObjectConstructParam    *params);
+static void      gimp_vectors_tree_view_set_container (GimpContainerView        *view,
+                                                       GimpContainer            *container);
+static void      gimp_vectors_tree_view_drop_svg      (GimpContainerTreeView    *tree_view,
+                                                       const gchar              *svg_data,
+                                                       gsize                     svg_data_len,
+                                                       GimpViewable             *dest_viewable,
+                                                       GtkTreeViewDropPosition   drop_pos);
+static GimpItem * gimp_vectors_tree_view_item_new     (GimpImage                *image);
+static void   gimp_vectors_tree_view_vectors_clicked  (GimpCellRendererViewable *cell,
+                                                       const gchar              *path_str,
+                                                       GdkModifierType           state,
+                                                       GimpContainerTreeView    *tree_view);
+static guchar  * gimp_vectors_tree_view_drag_svg      (GtkWidget                *widget,
+                                                       gsize                    *svg_data_len,
+                                                       gpointer                  data);
 
 
 G_DEFINE_TYPE_WITH_CODE (GimpVectorsTreeView, gimp_vectors_tree_view,
@@ -139,6 +145,10 @@ gimp_vectors_tree_view_constructor (GType                  type,
   tree_view = GIMP_CONTAINER_TREE_VIEW (object);
   view      = GIMP_VECTORS_TREE_VIEW (object);
 
+  g_signal_connect (tree_view->renderer_cell, "clicked",
+                    G_CALLBACK (gimp_vectors_tree_view_vectors_clicked),
+                    view);
+
   /*  hide basically useless edit button  */
   gtk_widget_hide (gimp_item_tree_view_get_edit_button (GIMP_ITEM_TREE_VIEW (view)));
 
@@ -258,6 +268,37 @@ gimp_vectors_tree_view_item_new (GimpImage *image)
   return GIMP_ITEM (new_vectors);
 }
 
+static void
+gimp_vectors_tree_view_vectors_clicked (GimpCellRendererViewable *cell,
+                                        const gchar              *path_str,
+                                        GdkModifierType           state,
+                                        GimpContainerTreeView    *tree_view)
+{
+  if (state & GDK_MOD1_MASK)
+    {
+      GimpUIManager   *ui_manager = GIMP_EDITOR (tree_view)->ui_manager;
+      GimpActionGroup *group;
+      const gchar     *action = "vectors-selection-replace";
+
+      group = gimp_ui_manager_get_action_group (ui_manager, "vectors");
+
+      if ((state & GDK_SHIFT_MASK) && (state & GDK_CONTROL_MASK))
+        {
+          action = "vectors-selection-intersect";
+        }
+      else if (state & GDK_SHIFT_MASK)
+        {
+          action = "vectors-selection-add";
+        }
+      else if (state & GDK_CONTROL_MASK)
+        {
+          action = "vectors-selection-subtract";
+        }
+
+      gimp_action_group_activate_action (group, action);
+    }
+}
+
 static guchar *
 gimp_vectors_tree_view_drag_svg (GtkWidget *widget,
                                  gsize     *svg_data_len,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]