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.
This commit is contained in:
Michael Natterer 2009-07-18 16:59:43 +02:00
parent 99ce3bd8b2
commit 0d81ce9717
3 changed files with 140 additions and 30 deletions

View file

@ -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);
}
}

View file

@ -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 (renderer)
if (state & GDK_MOD1_MASK)
{
GimpLayerMask *mask = GIMP_LAYER_MASK (renderer->viewable);
const gchar *action = "layers-alpha-selection-replace";
if (gimp_layer_mask_get_edit (mask))
gimp_action_group_set_action_active (group,
"layers-mask-edit", FALSE);
g_object_unref (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
{
GimpViewRenderer *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);
}
}
}

View file

@ -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,