1
/* The GIMP -- an image manipulation program
2
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
5
* Copyright (C) 2001-2003 Michael Natterer <mitch@gimp.org>
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28
#include "libgimpcolor/gimpcolor.h"
29
#include "libgimpmath/gimpmath.h"
30
#include "libgimpwidgets/gimpwidgets.h"
32
#include "widgets-types.h"
34
#include "core/gimpcontainer.h"
35
#include "core/gimpdrawable-bucket-fill.h"
36
#include "core/gimplayer.h"
37
#include "core/gimplayermask.h"
38
#include "core/gimplayer-floating-sel.h"
39
#include "core/gimplist.h"
40
#include "core/gimpimage.h"
41
#include "core/gimpimage-undo.h"
42
#include "core/gimpitemundo.h"
43
#include "core/gimppattern.h"
45
#include "text/gimptextlayer.h"
47
#include "file/file-open.h"
48
#include "file/file-utils.h"
50
#include "gimpactiongroup.h"
51
#include "gimpcellrendererviewable.h"
52
#include "gimpcontainerview.h"
54
#include "gimphelp-ids.h"
55
#include "gimplayertreeview.h"
56
#include "gimpviewrenderer.h"
57
#include "gimpuimanager.h"
58
#include "gimpwidgets-constructors.h"
60
#include "gimp-intl.h"
63
static void gimp_layer_tree_view_class_init (GimpLayerTreeViewClass *klass);
64
static void gimp_layer_tree_view_init (GimpLayerTreeView *view);
66
static void gimp_layer_tree_view_view_iface_init (GimpContainerViewInterface *view_iface);
68
static GObject * gimp_layer_tree_view_constructor (GType type,
70
GObjectConstructParam *params);
71
static void gimp_layer_tree_view_finalize (GObject *object);
73
static void gimp_layer_tree_view_unrealize (GtkWidget *widget);
74
static void gimp_layer_tree_view_style_set (GtkWidget *widget,
75
GtkStyle *prev_style);
77
static void gimp_layer_tree_view_set_container (GimpContainerView *view,
78
GimpContainer *container);
79
static gpointer gimp_layer_tree_view_insert_item (GimpContainerView *view,
80
GimpViewable *viewable,
82
static gboolean gimp_layer_tree_view_select_item (GimpContainerView *view,
84
gpointer insert_data);
85
static void gimp_layer_tree_view_set_preview_size (GimpContainerView *view);
87
static gboolean gimp_layer_tree_view_drop_possible(GimpContainerTreeView *view,
89
GimpViewable *src_viewable,
90
GimpViewable *dest_viewable,
91
GtkTreeViewDropPosition drop_pos,
92
GtkTreeViewDropPosition *return_drop_pos,
93
GdkDragAction *return_drag_action);
94
static void gimp_layer_tree_view_drop_viewable (GimpContainerTreeView *view,
95
GimpViewable *src_viewable,
96
GimpViewable *dest_viewable,
97
GtkTreeViewDropPosition drop_pos);
98
static void gimp_layer_tree_view_drop_color (GimpContainerTreeView *view,
100
GimpViewable *dest_viewable,
101
GtkTreeViewDropPosition drop_pos);
102
static void gimp_layer_tree_view_drop_uri_list (GimpContainerTreeView *view,
104
GimpViewable *dest_viewable,
105
GtkTreeViewDropPosition drop_pos);
107
static void gimp_layer_tree_view_set_image (GimpItemTreeView *view,
109
static GimpItem * gimp_layer_tree_view_item_new (GimpImage *image);
111
static void gimp_layer_tree_view_floating_selection_changed
113
GimpLayerTreeView *view);
115
static void gimp_layer_tree_view_paint_mode_menu_callback
117
GimpLayerTreeView *view);
118
static void gimp_layer_tree_view_preserve_button_toggled
120
GimpLayerTreeView *view);
121
static void gimp_layer_tree_view_opacity_scale_changed
123
GimpLayerTreeView *view);
125
static void gimp_layer_tree_view_layer_signal_handler
127
GimpLayerTreeView *view);
128
static void gimp_layer_tree_view_update_options (GimpLayerTreeView *view,
130
static void gimp_layer_tree_view_update_menu (GimpLayerTreeView *view,
133
static void gimp_layer_tree_view_mask_update (GimpLayerTreeView *view,
136
static void gimp_layer_tree_view_mask_changed (GimpLayer *layer,
137
GimpLayerTreeView *view);
138
static void gimp_layer_tree_view_renderer_update(GimpViewRenderer *renderer,
139
GimpLayerTreeView *view);
141
static void gimp_layer_tree_view_update_borders (GimpLayerTreeView *view,
143
static void gimp_layer_tree_view_mask_callback (GimpLayerMask *mask,
144
GimpLayerTreeView *view);
145
static void gimp_layer_tree_view_layer_clicked (GimpCellRendererViewable *cell,
147
GdkModifierType state,
148
GimpLayerTreeView *view);
149
static void gimp_layer_tree_view_mask_clicked (GimpCellRendererViewable *cell,
151
GdkModifierType state,
152
GimpLayerTreeView *view);
154
static void gimp_layer_tree_view_alpha_update (GimpLayerTreeView *view,
157
static void gimp_layer_tree_view_alpha_changed (GimpLayer *layer,
158
GimpLayerTreeView *view);
161
static GimpDrawableTreeViewClass *parent_class = NULL;
162
static GimpContainerViewInterface *parent_view_iface = NULL;
166
gimp_layer_tree_view_get_type (void)
168
static GType view_type = 0;
172
static const GTypeInfo view_info =
174
sizeof (GimpLayerTreeViewClass),
175
NULL, /* base_init */
176
NULL, /* base_finalize */
177
(GClassInitFunc) gimp_layer_tree_view_class_init,
178
NULL, /* class_finalize */
179
NULL, /* class_data */
180
sizeof (GimpLayerTreeView),
182
(GInstanceInitFunc) gimp_layer_tree_view_init,
185
static const GInterfaceInfo view_iface_info =
187
(GInterfaceInitFunc) gimp_layer_tree_view_view_iface_init,
188
NULL, /* iface_finalize */
189
NULL /* iface_data */
192
view_type = g_type_register_static (GIMP_TYPE_DRAWABLE_TREE_VIEW,
196
g_type_add_interface_static (view_type, GIMP_TYPE_CONTAINER_VIEW,
204
gimp_layer_tree_view_class_init (GimpLayerTreeViewClass *klass)
206
GObjectClass *object_class;
207
GtkWidgetClass *widget_class;
208
GimpContainerTreeViewClass *tree_view_class;
209
GimpItemTreeViewClass *item_view_class;
211
object_class = G_OBJECT_CLASS (klass);
212
widget_class = GTK_WIDGET_CLASS (klass);
213
tree_view_class = GIMP_CONTAINER_TREE_VIEW_CLASS (klass);
214
item_view_class = GIMP_ITEM_TREE_VIEW_CLASS (klass);
216
parent_class = g_type_class_peek_parent (klass);
218
object_class->constructor = gimp_layer_tree_view_constructor;
219
object_class->finalize = gimp_layer_tree_view_finalize;
221
widget_class->unrealize = gimp_layer_tree_view_unrealize;
222
widget_class->style_set = gimp_layer_tree_view_style_set;
224
tree_view_class->drop_possible = gimp_layer_tree_view_drop_possible;
225
tree_view_class->drop_viewable = gimp_layer_tree_view_drop_viewable;
226
tree_view_class->drop_color = gimp_layer_tree_view_drop_color;
227
tree_view_class->drop_uri_list = gimp_layer_tree_view_drop_uri_list;
229
item_view_class->item_type = GIMP_TYPE_LAYER;
230
item_view_class->signal_name = "active-layer-changed";
232
item_view_class->set_image = gimp_layer_tree_view_set_image;
233
item_view_class->get_container = gimp_image_get_layers;
234
item_view_class->get_active_item = (GimpGetItemFunc) gimp_image_get_active_layer;
235
item_view_class->set_active_item = (GimpSetItemFunc) gimp_image_set_active_layer;
236
item_view_class->reorder_item = (GimpReorderItemFunc) gimp_image_position_layer;
237
item_view_class->add_item = (GimpAddItemFunc) gimp_image_add_layer;
238
item_view_class->remove_item = (GimpRemoveItemFunc) gimp_image_remove_layer;
239
item_view_class->new_item = gimp_layer_tree_view_item_new;
241
item_view_class->action_group = "layers";
242
item_view_class->activate_action = "layers-text-tool";
243
item_view_class->edit_action = "layers-edit-attributes";
244
item_view_class->new_action = "layers-new";
245
item_view_class->new_default_action = "layers-new-last-values";
246
item_view_class->raise_action = "layers-raise";
247
item_view_class->raise_top_action = "layers-raise-to-top";
248
item_view_class->lower_action = "layers-lower";
249
item_view_class->lower_bottom_action = "layers-lower-to-bottom";
250
item_view_class->duplicate_action = "layers-duplicate";
251
item_view_class->delete_action = "layers-delete";
252
item_view_class->reorder_desc = _("Reorder Layer");
256
gimp_layer_tree_view_init (GimpLayerTreeView *view)
258
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
262
GtkIconSize icon_size;
263
PangoAttribute *attr;
265
/* The following used to read:
267
* tree_view->model_columns[tree_view->n_model_columns++] = ...
269
* but combining the two lead to gcc miscompiling the function on ppc/ia64
270
* (model_column_mask and model_column_mask_visible would have the same
271
* value, probably due to bad instruction reordering). See bug #113144 for
274
view->model_column_mask = tree_view->n_model_columns;
275
tree_view->model_columns[tree_view->n_model_columns] = GIMP_TYPE_VIEW_RENDERER;
276
tree_view->n_model_columns++;
278
view->model_column_mask_visible = tree_view->n_model_columns;
279
tree_view->model_columns[tree_view->n_model_columns] = G_TYPE_BOOLEAN;
280
tree_view->n_model_columns++;
282
view->options_box = gtk_table_new (2, 3, FALSE);
283
gtk_table_set_col_spacings (GTK_TABLE (view->options_box), 2);
284
gtk_box_pack_start (GTK_BOX (view), view->options_box, FALSE, FALSE, 0);
285
gtk_box_reorder_child (GTK_BOX (view), view->options_box, 0);
286
gtk_widget_show (view->options_box);
288
hbox = gtk_hbox_new (FALSE, 6);
290
/* Paint mode menu */
292
view->paint_mode_menu =
293
gimp_paint_mode_menu_new (G_CALLBACK (gimp_layer_tree_view_paint_mode_menu_callback),
297
gtk_box_pack_start (GTK_BOX (hbox), view->paint_mode_menu, TRUE, TRUE, 0);
298
gtk_widget_show (view->paint_mode_menu);
300
gimp_help_set_help_data (view->paint_mode_menu, NULL,
301
GIMP_HELP_LAYER_DIALOG_PAINT_MODE_MENU);
303
/* Preserve transparency toggle */
305
view->preserve_trans_toggle = toggle = gtk_check_button_new ();
306
gtk_box_pack_end (GTK_BOX (hbox), toggle, FALSE, FALSE, 0);
307
gtk_widget_show (toggle);
309
g_signal_connect (toggle, "toggled",
310
G_CALLBACK (gimp_layer_tree_view_preserve_button_toggled),
313
gimp_help_set_help_data (toggle, _("Keep transparency"),
314
GIMP_HELP_LAYER_DIALOG_KEEP_TRANS_BUTTON);
316
gtk_widget_style_get (GTK_WIDGET (view),
317
"button_icon_size", &icon_size,
320
image = gtk_image_new_from_stock (GIMP_STOCK_TRANSPARENCY, icon_size);
321
gtk_container_add (GTK_CONTAINER (toggle), image);
322
gtk_widget_show (image);
324
gimp_table_attach_aligned (GTK_TABLE (view->options_box), 0, 0,
325
_("Mode:"), 0.0, 0.5,
330
view->opacity_adjustment =
331
GTK_ADJUSTMENT (gimp_scale_entry_new (GTK_TABLE (view->options_box), 0, 1,
332
_("Opacity:"), -1, -1,
333
100.0, 0.0, 100.0, 1.0, 10.0, 1,
336
GIMP_HELP_LAYER_DIALOG_OPACITY_SCALE));
338
g_signal_connect (view->opacity_adjustment, "value_changed",
339
G_CALLBACK (gimp_layer_tree_view_opacity_scale_changed),
342
gtk_widget_set_sensitive (view->options_box, FALSE);
344
view->italic_attrs = pango_attr_list_new ();
345
attr = pango_attr_style_new (PANGO_STYLE_ITALIC);
346
attr->start_index = 0;
347
attr->end_index = -1;
348
pango_attr_list_insert (view->italic_attrs, attr);
350
view->bold_attrs = pango_attr_list_new ();
351
attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
352
attr->start_index = 0;
353
attr->end_index = -1;
354
pango_attr_list_insert (view->bold_attrs, attr);
356
view->mode_changed_handler_id = 0;
357
view->opacity_changed_handler_id = 0;
358
view->preserve_trans_changed_handler_id = 0;
359
view->mask_changed_handler_id = 0;
363
gimp_layer_tree_view_view_iface_init (GimpContainerViewInterface *view_iface)
365
parent_view_iface = g_type_interface_peek_parent (view_iface);
367
view_iface->set_container = gimp_layer_tree_view_set_container;
368
view_iface->insert_item = gimp_layer_tree_view_insert_item;
369
view_iface->select_item = gimp_layer_tree_view_select_item;
370
view_iface->set_preview_size = gimp_layer_tree_view_set_preview_size;
374
gimp_layer_tree_view_constructor (GType type,
376
GObjectConstructParam *params)
378
GimpContainerTreeView *tree_view;
379
GimpLayerTreeView *layer_view;
382
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
384
tree_view = GIMP_CONTAINER_TREE_VIEW (object);
385
layer_view = GIMP_LAYER_TREE_VIEW (object);
387
layer_view->mask_cell = gimp_cell_renderer_viewable_new ();
388
gtk_tree_view_column_pack_start (tree_view->main_column,
389
layer_view->mask_cell,
391
gtk_tree_view_column_set_attributes (tree_view->main_column,
392
layer_view->mask_cell,
394
layer_view->model_column_mask,
396
layer_view->model_column_mask_visible,
399
tree_view->renderer_cells = g_list_prepend (tree_view->renderer_cells,
400
layer_view->mask_cell);
402
g_signal_connect (tree_view->renderer_cell, "clicked",
403
G_CALLBACK (gimp_layer_tree_view_layer_clicked),
405
g_signal_connect (layer_view->mask_cell, "clicked",
406
G_CALLBACK (gimp_layer_tree_view_mask_clicked),
409
gimp_dnd_uri_list_dest_add (GTK_WIDGET (tree_view->view),
411
gimp_dnd_color_dest_add (GTK_WIDGET (tree_view->view),
413
gimp_dnd_viewable_dest_add (GTK_WIDGET (tree_view->view), GIMP_TYPE_PATTERN,
416
/* hide basically useless edit button */
417
gtk_widget_hide (GIMP_ITEM_TREE_VIEW (layer_view)->edit_button);
419
layer_view->anchor_button =
420
gimp_editor_add_action_button (GIMP_EDITOR (layer_view), "layers",
421
"layers-anchor", NULL);
422
gimp_container_view_enable_dnd (GIMP_CONTAINER_VIEW (layer_view),
423
GTK_BUTTON (layer_view->anchor_button),
425
gtk_box_reorder_child (GTK_BOX (GIMP_EDITOR (layer_view)->button_box),
426
layer_view->anchor_button, 5);
433
gimp_layer_tree_view_finalize (GObject *object)
435
GimpLayerTreeView *layer_view = GIMP_LAYER_TREE_VIEW (object);
437
if (layer_view->italic_attrs)
439
pango_attr_list_unref (layer_view->italic_attrs);
440
layer_view->italic_attrs = NULL;
443
if (layer_view->bold_attrs)
445
pango_attr_list_unref (layer_view->bold_attrs);
446
layer_view->bold_attrs = NULL;
449
G_OBJECT_CLASS (parent_class)->finalize (object);
453
gimp_layer_tree_view_unrealize (GtkWidget *widget)
455
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (widget);
456
GimpLayerTreeView *layer_view = GIMP_LAYER_TREE_VIEW (widget);
460
for (iter_valid = gtk_tree_model_get_iter_first (tree_view->model, &iter);
462
iter_valid = gtk_tree_model_iter_next (tree_view->model, &iter))
464
GimpViewRenderer *renderer;
466
gtk_tree_model_get (tree_view->model, &iter,
467
layer_view->model_column_mask, &renderer,
472
gimp_view_renderer_unrealize (renderer);
473
g_object_unref (renderer);
477
GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
481
gimp_layer_tree_view_style_set (GtkWidget *widget,
482
GtkStyle *prev_style)
484
GimpLayerTreeView *layer_view = GIMP_LAYER_TREE_VIEW (widget);
485
gint content_spacing;
488
gtk_widget_style_get (widget,
489
"content_spacing", &content_spacing,
490
"button_spacing", &button_spacing,
493
gtk_table_set_col_spacings (GTK_TABLE (layer_view->options_box),
495
gtk_table_set_row_spacings (GTK_TABLE (layer_view->options_box),
498
if (GTK_WIDGET_CLASS (parent_class)->style_set)
499
GTK_WIDGET_CLASS (parent_class)->style_set (widget, prev_style);
503
/* GimpContainerView methods */
506
gimp_layer_tree_view_set_container (GimpContainerView *view,
507
GimpContainer *container)
509
GimpLayerTreeView *layer_view = GIMP_LAYER_TREE_VIEW (view);
510
GimpContainer *old_container;
512
old_container = gimp_container_view_get_container (view);
516
gimp_container_remove_handler (old_container,
517
layer_view->mode_changed_handler_id);
518
gimp_container_remove_handler (old_container,
519
layer_view->opacity_changed_handler_id);
520
gimp_container_remove_handler (old_container,
521
layer_view->preserve_trans_changed_handler_id);
522
gimp_container_remove_handler (old_container,
523
layer_view->mask_changed_handler_id);
524
gimp_container_remove_handler (old_container,
525
layer_view->alpha_changed_handler_id);
528
parent_view_iface->set_container (view, container);
532
layer_view->mode_changed_handler_id =
533
gimp_container_add_handler (container, "mode_changed",
534
G_CALLBACK (gimp_layer_tree_view_layer_signal_handler),
536
layer_view->opacity_changed_handler_id =
537
gimp_container_add_handler (container, "opacity_changed",
538
G_CALLBACK (gimp_layer_tree_view_layer_signal_handler),
540
layer_view->preserve_trans_changed_handler_id =
541
gimp_container_add_handler (container, "preserve_trans_changed",
542
G_CALLBACK (gimp_layer_tree_view_layer_signal_handler),
544
layer_view->mask_changed_handler_id =
545
gimp_container_add_handler (container, "mask_changed",
546
G_CALLBACK (gimp_layer_tree_view_mask_changed),
548
layer_view->alpha_changed_handler_id =
549
gimp_container_add_handler (container, "alpha_changed",
550
G_CALLBACK (gimp_layer_tree_view_alpha_changed),
556
gimp_layer_tree_view_insert_item (GimpContainerView *view,
557
GimpViewable *viewable,
560
GimpLayerTreeView *layer_view = GIMP_LAYER_TREE_VIEW (view);
564
iter = parent_view_iface->insert_item (view, viewable, index);
566
layer = GIMP_LAYER (viewable);
568
if (! gimp_drawable_has_alpha (GIMP_DRAWABLE (layer)))
569
gimp_layer_tree_view_alpha_update (layer_view, iter, layer);
571
gimp_layer_tree_view_mask_update (layer_view, iter, layer);
577
gimp_layer_tree_view_select_item (GimpContainerView *view,
579
gpointer insert_data)
581
GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (view);
582
GimpLayerTreeView *layer_view = GIMP_LAYER_TREE_VIEW (view);
583
gboolean options_sensitive = FALSE;
586
success = parent_view_iface->select_item (view, item, insert_data);
592
gimp_layer_tree_view_update_borders (layer_view,
593
(GtkTreeIter *) insert_data);
594
gimp_layer_tree_view_update_options (layer_view, GIMP_LAYER (item));
595
gimp_layer_tree_view_update_menu (layer_view, GIMP_LAYER (item));
598
options_sensitive = TRUE;
600
if (! success || gimp_layer_is_floating_sel (GIMP_LAYER (item)))
602
gtk_widget_set_sensitive (item_view->edit_button, FALSE);
606
gtk_widget_set_sensitive (layer_view->options_box, options_sensitive);
612
gimp_layer_tree_view_set_preview_size (GimpContainerView *view)
614
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
615
GimpLayerTreeView *layer_view = GIMP_LAYER_TREE_VIEW (view);
621
preview_size = gimp_container_view_get_preview_size (view, &border_width);
623
for (iter_valid = gtk_tree_model_get_iter_first (tree_view->model, &iter);
625
iter_valid = gtk_tree_model_iter_next (tree_view->model, &iter))
627
GimpViewRenderer *renderer;
629
gtk_tree_model_get (tree_view->model, &iter,
630
layer_view->model_column_mask, &renderer,
635
gimp_view_renderer_set_size (renderer, preview_size, border_width);
636
g_object_unref (renderer);
640
parent_view_iface->set_preview_size (view);
644
/* GimpContainerTreeView methods */
647
gimp_layer_tree_view_drop_possible (GimpContainerTreeView *tree_view,
648
GimpDndType src_type,
649
GimpViewable *src_viewable,
650
GimpViewable *dest_viewable,
651
GtkTreeViewDropPosition drop_pos,
652
GtkTreeViewDropPosition *return_drop_pos,
653
GdkDragAction *return_drag_action)
655
if (src_type == GIMP_DND_TYPE_URI_LIST ||
656
src_type == GIMP_DND_TYPE_TEXT_PLAIN ||
657
src_type == GIMP_DND_TYPE_NETSCAPE_URL ||
658
GIMP_IS_LAYER (src_viewable))
660
GimpLayer *dest_layer = GIMP_LAYER (dest_viewable);
661
GimpImage *dest_image = gimp_item_get_image (GIMP_ITEM (dest_layer));
663
if (gimp_image_floating_sel (dest_image))
666
if (! gimp_drawable_has_alpha (GIMP_DRAWABLE (dest_layer)) &&
667
drop_pos == GTK_TREE_VIEW_DROP_AFTER)
670
if (GIMP_IS_LAYER (src_viewable))
672
GimpLayer *src_layer = GIMP_LAYER (src_viewable);
673
GimpImage *src_image = gimp_item_get_image (GIMP_ITEM (src_layer));
675
if (src_image == dest_image &&
676
! gimp_drawable_has_alpha (GIMP_DRAWABLE (src_layer)))
681
if (GIMP_CONTAINER_TREE_VIEW_CLASS (parent_class)->drop_possible (tree_view,
689
if (return_drop_pos &&
690
(src_type == GIMP_DND_TYPE_COLOR ||
691
src_type == GIMP_DND_TYPE_PATTERN))
693
if (drop_pos == GTK_TREE_VIEW_DROP_BEFORE)
694
*return_drop_pos = GTK_TREE_VIEW_DROP_INTO_OR_BEFORE;
696
*return_drop_pos = GTK_TREE_VIEW_DROP_INTO_OR_AFTER;
706
gimp_layer_tree_view_drop_viewable (GimpContainerTreeView *view,
707
GimpViewable *src_viewable,
708
GimpViewable *dest_viewable,
709
GtkTreeViewDropPosition drop_pos)
711
if (GIMP_IS_PATTERN (src_viewable))
713
gimp_drawable_bucket_fill_full (GIMP_DRAWABLE (dest_viewable),
714
GIMP_PATTERN_BUCKET_FILL,
715
GIMP_NORMAL_MODE, GIMP_OPACITY_OPAQUE,
716
FALSE, /* no seed fill */
717
FALSE, 0.0, FALSE, /* fill params */
718
0.0, 0.0, /* ignored */
719
NULL, GIMP_PATTERN (src_viewable));
720
gimp_image_flush (GIMP_ITEM_TREE_VIEW (view)->gimage);
724
GIMP_CONTAINER_TREE_VIEW_CLASS (parent_class)->drop_viewable (view,
731
gimp_layer_tree_view_drop_color (GimpContainerTreeView *view,
732
const GimpRGB *color,
733
GimpViewable *dest_viewable,
734
GtkTreeViewDropPosition drop_pos)
736
if (gimp_drawable_is_text_layer (GIMP_DRAWABLE (dest_viewable)))
738
gimp_text_layer_set (GIMP_TEXT_LAYER (dest_viewable), NULL,
744
gimp_drawable_bucket_fill_full (GIMP_DRAWABLE (dest_viewable),
746
GIMP_NORMAL_MODE, GIMP_OPACITY_OPAQUE,
747
FALSE, /* no seed fill */
748
FALSE, 0.0, FALSE, /* fill params */
749
0.0, 0.0, /* ignored */
753
gimp_image_flush (GIMP_ITEM_TREE_VIEW (view)->gimage);
757
gimp_layer_tree_view_drop_uri_list (GimpContainerTreeView *view,
759
GimpViewable *dest_viewable,
760
GtkTreeViewDropPosition drop_pos)
762
GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (view);
763
GimpImage *gimage = item_view->gimage;
767
index = gimp_image_get_layer_index (gimage, GIMP_LAYER (dest_viewable));
769
if (drop_pos == GTK_TREE_VIEW_DROP_AFTER)
772
for (list = uri_list; list; list = g_list_next (list))
774
const gchar *uri = list->data;
775
GimpLayer *new_layer;
776
GimpPDBStatusType status;
777
GError *error = NULL;
779
new_layer = file_open_layer (gimage->gimp, item_view->context, NULL,
780
gimage, uri, &status, &error);
784
GimpItem *new_item = GIMP_ITEM (new_layer);
788
width = gimp_image_get_width (gimage);
789
height = gimp_image_get_height (gimage);
791
gimp_item_offsets (new_item, &off_x, &off_y);
793
off_x = (width - gimp_item_width (new_item)) / 2 - off_x;
794
off_y = (height - gimp_item_height (new_item)) / 2 - off_y;
796
gimp_item_translate (new_item, off_x, off_y, FALSE);
798
gimp_image_add_layer (gimage, new_layer, index++);
800
else if (status != GIMP_PDB_CANCEL)
802
gchar *filename = file_utils_uri_to_utf8_filename (uri);
804
g_message (_("Opening '%s' failed:\n\n%s"),
805
filename, error->message);
807
g_clear_error (&error);
812
gimp_image_flush (gimage);
816
/* GimpItemTreeView methods */
819
gimp_layer_tree_view_set_image (GimpItemTreeView *view,
823
g_signal_handlers_disconnect_by_func (view->gimage,
824
gimp_layer_tree_view_floating_selection_changed,
827
GIMP_ITEM_TREE_VIEW_CLASS (parent_class)->set_image (view, gimage);
830
g_signal_connect (view->gimage,
831
"floating_selection_changed",
832
G_CALLBACK (gimp_layer_tree_view_floating_selection_changed),
837
gimp_layer_tree_view_item_new (GimpImage *image)
839
GimpLayer *new_layer;
841
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_EDIT_PASTE,
844
new_layer = gimp_layer_new (image,
845
gimp_image_get_width (image),
846
gimp_image_get_height (image),
847
gimp_image_base_type_with_alpha (image),
848
_("Empty Layer"), 1.0, GIMP_NORMAL_MODE);
850
gimp_image_add_layer (image, new_layer, -1);
852
gimp_image_undo_group_end (image);
854
return GIMP_ITEM (new_layer);
861
gimp_layer_tree_view_floating_selection_changed (GimpImage *gimage,
862
GimpLayerTreeView *layer_view)
864
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (layer_view);
865
GimpContainerView *view = GIMP_CONTAINER_VIEW (layer_view);
866
GimpLayer *floating_sel;
869
floating_sel = gimp_image_floating_sel (gimage);
873
iter = gimp_container_view_lookup (view, (GimpViewable *) floating_sel);
876
gtk_list_store_set (GTK_LIST_STORE (tree_view->model), iter,
877
tree_view->model_column_name_attributes,
878
layer_view->italic_attrs,
885
for (list = GIMP_LIST (gimage->layers)->list;
887
list = g_list_next (list))
889
GimpDrawable *drawable = list->data;
891
if (gimp_drawable_has_alpha (drawable))
893
iter = gimp_container_view_lookup (view,
894
(GimpViewable *) drawable);
897
gtk_list_store_set (GTK_LIST_STORE (tree_view->model), iter,
898
tree_view->model_column_name_attributes,
907
/* Paint Mode, Opacity and Preserve trans. callbacks */
910
g_signal_handlers_block_by_func (layer, \
911
gimp_layer_tree_view_layer_signal_handler, view)
914
g_signal_handlers_unblock_by_func (layer, \
915
gimp_layer_tree_view_layer_signal_handler, view)
919
gimp_layer_tree_view_paint_mode_menu_callback (GtkWidget *widget,
920
GimpLayerTreeView *view)
925
gimage = GIMP_ITEM_TREE_VIEW (view)->gimage;
927
layer = (GimpLayer *)
928
GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (gimage);
932
GimpLayerModeEffects mode =
933
GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget),
936
if (gimp_layer_get_mode (layer) != mode)
939
gboolean push_undo = TRUE;
941
/* compress layer mode undos */
942
undo = gimp_image_undo_can_compress (gimage, GIMP_TYPE_ITEM_UNDO,
943
GIMP_UNDO_LAYER_MODE);
945
if (undo && GIMP_ITEM_UNDO (undo)->item == GIMP_ITEM (layer))
949
gimp_layer_set_mode (layer, mode, push_undo);
952
gimp_image_flush (gimage);
955
gimp_undo_refresh_preview (undo);
961
gimp_layer_tree_view_preserve_button_toggled (GtkWidget *widget,
962
GimpLayerTreeView *view)
967
gimage = GIMP_ITEM_TREE_VIEW (view)->gimage;
969
layer = (GimpLayer *)
970
GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (gimage);
974
gboolean preserve_trans;
976
preserve_trans = GTK_TOGGLE_BUTTON (widget)->active;
978
if (gimp_layer_get_preserve_trans (layer) != preserve_trans)
981
gboolean push_undo = TRUE;
983
/* compress opacity undos */
984
undo = gimp_image_undo_can_compress (gimage, GIMP_TYPE_ITEM_UNDO,
985
GIMP_UNDO_LAYER_PRESERVE_TRANS);
987
if (undo && GIMP_ITEM_UNDO (undo)->item == GIMP_ITEM (layer))
991
gimp_layer_set_preserve_trans (layer, preserve_trans, push_undo);
994
gimp_image_flush (gimage);
1000
gimp_layer_tree_view_opacity_scale_changed (GtkAdjustment *adjustment,
1001
GimpLayerTreeView *view)
1006
gimage = GIMP_ITEM_TREE_VIEW (view)->gimage;
1008
layer = (GimpLayer *)
1009
GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (gimage);
1013
gdouble opacity = adjustment->value / 100.0;
1015
if (gimp_layer_get_opacity (layer) != opacity)
1018
gboolean push_undo = TRUE;
1020
/* compress opacity undos */
1021
undo = gimp_image_undo_can_compress (gimage, GIMP_TYPE_ITEM_UNDO,
1022
GIMP_UNDO_LAYER_OPACITY);
1024
if (undo && GIMP_ITEM_UNDO (undo)->item == GIMP_ITEM (layer))
1028
gimp_layer_set_opacity (layer, opacity, push_undo);
1031
gimp_image_flush (gimage);
1034
gimp_undo_refresh_preview (undo);
1044
gimp_layer_tree_view_layer_signal_handler (GimpLayer *layer,
1045
GimpLayerTreeView *view)
1047
GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (view);
1048
GimpLayer *active_layer;
1050
active_layer = (GimpLayer *)
1051
GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (item_view->gimage);
1053
if (active_layer == layer)
1054
gimp_layer_tree_view_update_options (view, layer);
1058
#define BLOCK(object,function) \
1059
g_signal_handlers_block_by_func ((object), (function), view)
1061
#define UNBLOCK(object,function) \
1062
g_signal_handlers_unblock_by_func ((object), (function), view)
1065
gimp_layer_tree_view_update_options (GimpLayerTreeView *view,
1068
gimp_paint_mode_menu_set_history (GTK_OPTION_MENU (view->paint_mode_menu),
1071
if (layer->preserve_trans !=
1072
GTK_TOGGLE_BUTTON (view->preserve_trans_toggle)->active)
1074
BLOCK (view->preserve_trans_toggle,
1075
gimp_layer_tree_view_preserve_button_toggled);
1077
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (view->preserve_trans_toggle),
1078
layer->preserve_trans);
1080
UNBLOCK (view->preserve_trans_toggle,
1081
gimp_layer_tree_view_preserve_button_toggled);
1084
if (layer->opacity * 100.0 != view->opacity_adjustment->value)
1086
BLOCK (view->opacity_adjustment,
1087
gimp_layer_tree_view_opacity_scale_changed);
1089
gtk_adjustment_set_value (view->opacity_adjustment,
1090
layer->opacity * 100.0);
1092
UNBLOCK (view->opacity_adjustment,
1093
gimp_layer_tree_view_opacity_scale_changed);
1102
gimp_layer_tree_view_update_menu (GimpLayerTreeView *layer_view,
1105
GimpUIManager *ui_manager = GIMP_EDITOR (layer_view)->ui_manager;
1106
GimpActionGroup *group;
1107
GimpLayerMask *mask;
1109
group = gimp_ui_manager_get_action_group (ui_manager, "layers");
1111
mask = gimp_layer_get_mask (layer);
1113
gimp_action_group_set_action_active (group, "layers-mask-show",
1115
gimp_layer_mask_get_show (mask));
1116
gimp_action_group_set_action_active (group, "layers-mask-disable",
1118
! gimp_layer_mask_get_apply (mask));
1119
gimp_action_group_set_action_active (group, "layers-mask-edit",
1121
gimp_layer_mask_get_edit (mask));
1125
/* Layer Mask callbacks */
1128
gimp_layer_tree_view_mask_update (GimpLayerTreeView *layer_view,
1132
GimpContainerView *view = GIMP_CONTAINER_VIEW (layer_view);
1133
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (layer_view);
1134
GimpLayerMask *mask;
1135
GimpViewRenderer *renderer = NULL;
1136
gboolean mask_visible = FALSE;
1138
mask = gimp_layer_get_mask (layer);
1146
preview_size = gimp_container_view_get_preview_size (view, &border_width);
1148
mask_visible = TRUE;
1150
renderer = gimp_view_renderer_new (G_TYPE_FROM_INSTANCE (mask),
1151
preview_size, border_width,
1153
gimp_view_renderer_set_viewable (renderer, GIMP_VIEWABLE (mask));
1155
g_signal_connect (renderer, "update",
1156
G_CALLBACK (gimp_layer_tree_view_renderer_update),
1159
closure = g_cclosure_new (G_CALLBACK (gimp_layer_tree_view_mask_callback),
1161
g_object_watch_closure (G_OBJECT (renderer), closure);
1162
g_signal_connect_closure (mask, "apply_changed", closure, FALSE);
1163
g_signal_connect_closure (mask, "edit_changed", closure, FALSE);
1164
g_signal_connect_closure (mask, "show_changed", closure, FALSE);
1167
gtk_list_store_set (GTK_LIST_STORE (tree_view->model), iter,
1168
layer_view->model_column_mask, renderer,
1169
layer_view->model_column_mask_visible, mask_visible,
1174
gimp_layer_tree_view_update_borders (layer_view, iter);
1175
gimp_view_renderer_remove_idle (renderer);
1176
g_object_unref (renderer);
1181
gimp_layer_tree_view_mask_changed (GimpLayer *layer,
1182
GimpLayerTreeView *layer_view)
1184
GimpContainerView *view = GIMP_CONTAINER_VIEW (layer_view);
1187
iter = gimp_container_view_lookup (view, GIMP_VIEWABLE (layer));
1190
gimp_layer_tree_view_mask_update (layer_view, iter, layer);
1194
gimp_layer_tree_view_renderer_update (GimpViewRenderer *renderer,
1195
GimpLayerTreeView *layer_view)
1197
GimpContainerView *view = GIMP_CONTAINER_VIEW (layer_view);
1198
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (layer_view);
1199
GimpLayerMask *mask;
1202
mask = GIMP_LAYER_MASK (renderer->viewable);
1204
iter = gimp_container_view_lookup (view, (GimpViewable *)
1205
gimp_layer_mask_get_layer (mask));
1211
path = gtk_tree_model_get_path (tree_view->model, iter);
1213
gtk_tree_model_row_changed (tree_view->model, path, iter);
1215
gtk_tree_path_free (path);
1220
gimp_layer_tree_view_update_borders (GimpLayerTreeView *layer_view,
1223
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (layer_view);
1224
GimpViewRenderer *layer_renderer;
1225
GimpViewRenderer *mask_renderer;
1226
GimpLayerMask *mask = NULL;
1227
GimpViewBorderType layer_type = GIMP_VIEW_BORDER_BLACK;
1229
gtk_tree_model_get (tree_view->model, iter,
1230
tree_view->model_column_renderer, &layer_renderer,
1231
layer_view->model_column_mask, &mask_renderer,
1235
mask = GIMP_LAYER_MASK (mask_renderer->viewable);
1237
if (! mask || (mask && ! gimp_layer_mask_get_edit (mask)))
1238
layer_type = GIMP_VIEW_BORDER_WHITE;
1240
gimp_view_renderer_set_border_type (layer_renderer, layer_type);
1244
GimpViewBorderType mask_color = GIMP_VIEW_BORDER_BLACK;
1246
if (gimp_layer_mask_get_show (mask))
1248
mask_color = GIMP_VIEW_BORDER_GREEN;
1250
else if (! gimp_layer_mask_get_apply (mask))
1252
mask_color = GIMP_VIEW_BORDER_RED;
1254
else if (gimp_layer_mask_get_edit (mask))
1256
mask_color = GIMP_VIEW_BORDER_WHITE;
1259
gimp_view_renderer_set_border_type (mask_renderer, mask_color);
1263
g_object_unref (layer_renderer);
1266
g_object_unref (mask_renderer);
1270
gimp_layer_tree_view_mask_callback (GimpLayerMask *mask,
1271
GimpLayerTreeView *layer_view)
1273
GimpContainerView *view = GIMP_CONTAINER_VIEW (layer_view);
1276
iter = gimp_container_view_lookup (view, (GimpViewable *)
1277
gimp_layer_mask_get_layer (mask));
1279
gimp_layer_tree_view_update_borders (layer_view, iter);
1283
gimp_layer_tree_view_layer_clicked (GimpCellRendererViewable *cell,
1284
const gchar *path_str,
1285
GdkModifierType state,
1286
GimpLayerTreeView *layer_view)
1288
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (layer_view);
1292
path = gtk_tree_path_new_from_string (path_str);
1294
if (gtk_tree_model_get_iter (tree_view->model, &iter, path))
1296
GimpViewRenderer *renderer;
1297
GimpUIManager *ui_manager;
1298
GimpActionGroup *group;
1300
ui_manager = GIMP_EDITOR (tree_view)->ui_manager;
1301
group = gimp_ui_manager_get_action_group (ui_manager, "layers");
1303
gtk_tree_model_get (tree_view->model, &iter,
1304
layer_view->model_column_mask, &renderer,
1309
GimpLayerMask *mask = GIMP_LAYER_MASK (renderer->viewable);
1311
if (gimp_layer_mask_get_edit (mask))
1312
gimp_action_group_set_action_active (group,
1313
"layers-mask-edit", FALSE);
1314
g_object_unref (renderer);
1318
gtk_tree_path_free (path);
1322
gimp_layer_tree_view_mask_clicked (GimpCellRendererViewable *cell,
1323
const gchar *path_str,
1324
GdkModifierType state,
1325
GimpLayerTreeView *layer_view)
1327
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (layer_view);
1331
path = gtk_tree_path_new_from_string (path_str);
1333
if (gtk_tree_model_get_iter (tree_view->model, &iter, path))
1335
GimpViewRenderer *renderer;
1336
GimpUIManager *ui_manager;
1337
GimpActionGroup *group;
1339
ui_manager = GIMP_EDITOR (tree_view)->ui_manager;
1340
group = gimp_ui_manager_get_action_group (ui_manager, "layers");
1342
gtk_tree_model_get (tree_view->model, &iter,
1343
layer_view->model_column_mask, &renderer,
1348
GimpLayerMask *mask = GIMP_LAYER_MASK (renderer->viewable);
1350
if (state & GDK_MOD1_MASK)
1351
gimp_action_group_set_action_active (group, "layers-mask-show",
1352
! gimp_layer_mask_get_show (mask));
1353
else if (state & GDK_CONTROL_MASK)
1354
gimp_action_group_set_action_active (group, "layers-mask-disable",
1355
gimp_layer_mask_get_apply (mask));
1356
else if (! gimp_layer_mask_get_edit (mask))
1357
gimp_action_group_set_action_active (group,
1358
"layers-mask-edit", TRUE);
1360
g_object_unref (renderer);
1364
gtk_tree_path_free (path);
1368
/* GimpDrawable alpha callbacks */
1371
gimp_layer_tree_view_alpha_update (GimpLayerTreeView *view,
1375
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
1377
gtk_list_store_set (GTK_LIST_STORE (tree_view->model), iter,
1378
tree_view->model_column_name_attributes,
1379
gimp_drawable_has_alpha (GIMP_DRAWABLE (layer)) ?
1380
NULL : view->bold_attrs,
1385
gimp_layer_tree_view_alpha_changed (GimpLayer *layer,
1386
GimpLayerTreeView *layer_view)
1388
GimpContainerView *view = GIMP_CONTAINER_VIEW (layer_view);
1391
iter = gimp_container_view_lookup (view, (GimpViewable *) layer);
1395
GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (view);
1397
gimp_layer_tree_view_alpha_update (layer_view, iter, layer);
1399
/* update button states */
1400
if (gimp_image_get_active_layer (item_view->gimage) == layer)
1401
gimp_container_view_select_item (GIMP_CONTAINER_VIEW (view),
1402
GIMP_VIEWABLE (layer));