147
145
GimpUndoType undo_type);
150
static guint view_signals[LAST_SIGNAL] = { 0 };
152
static GimpContainerTreeViewClass *parent_class = NULL;
148
G_DEFINE_TYPE_WITH_CODE (GimpItemTreeView, gimp_item_tree_view,
149
GIMP_TYPE_CONTAINER_TREE_VIEW,
150
G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONTAINER_VIEW,
151
gimp_item_tree_view_view_iface_init)
152
G_IMPLEMENT_INTERFACE (GIMP_TYPE_DOCKED,
153
gimp_item_tree_view_docked_iface_init))
155
#define parent_class gimp_item_tree_view_parent_class
153
157
static GimpContainerViewInterface *parent_view_iface = NULL;
157
gimp_item_tree_view_get_type (void)
159
static GType type = 0;
163
static const GTypeInfo view_info =
165
sizeof (GimpItemTreeViewClass),
166
NULL, /* base_init */
167
NULL, /* base_finalize */
168
(GClassInitFunc) gimp_item_tree_view_class_init,
169
NULL, /* class_finalize */
170
NULL, /* class_data */
171
sizeof (GimpItemTreeView),
173
(GInstanceInitFunc) gimp_item_tree_view_init,
176
static const GInterfaceInfo view_iface_info =
178
(GInterfaceInitFunc) gimp_item_tree_view_view_iface_init,
179
NULL, /* iface_finalize */
180
NULL /* iface_data */
182
static const GInterfaceInfo docked_iface_info =
184
(GInterfaceInitFunc) gimp_item_tree_view_docked_iface_init,
185
NULL, /* iface_finalize */
186
NULL /* iface_data */
189
type = g_type_register_static (GIMP_TYPE_CONTAINER_TREE_VIEW,
191
&view_info, G_TYPE_FLAG_ABSTRACT);
193
g_type_add_interface_static (type, GIMP_TYPE_CONTAINER_VIEW,
195
g_type_add_interface_static (type, GIMP_TYPE_DOCKED,
159
static guint view_signals[LAST_SIGNAL] = { 0 };
203
163
gimp_item_tree_view_class_init (GimpItemTreeViewClass *klass)
206
166
GtkObjectClass *gtk_object_class;
207
167
GimpContainerTreeViewClass *tree_view_class;
209
object_class = G_OBJECT_CLASS (klass);
210
gtk_object_class = GTK_OBJECT_CLASS (klass);
211
tree_view_class = GIMP_CONTAINER_TREE_VIEW_CLASS (klass);
213
parent_class = g_type_class_peek_parent (klass);
169
object_class = G_OBJECT_CLASS (klass);
170
gtk_object_class = GTK_OBJECT_CLASS (klass);
171
tree_view_class = GIMP_CONTAINER_TREE_VIEW_CLASS (klass);
215
173
view_signals[SET_IMAGE] =
216
g_signal_new ("set_image",
217
G_TYPE_FROM_CLASS (klass),
219
G_STRUCT_OFFSET (GimpItemTreeViewClass, set_image),
221
gimp_marshal_VOID__OBJECT,
174
g_signal_new ("set-image",
175
G_TYPE_FROM_CLASS (klass),
177
G_STRUCT_OFFSET (GimpItemTreeViewClass, set_image),
179
gimp_marshal_VOID__OBJECT,
225
183
object_class->constructor = gimp_item_tree_view_constructor;
259
gimp_item_tree_view_init (GimpItemTreeView *view,
260
GimpItemTreeViewClass *view_class)
217
gimp_item_tree_view_view_iface_init (GimpContainerViewInterface *iface)
219
parent_view_iface = g_type_interface_peek_parent (iface);
221
iface->set_container = gimp_item_tree_view_set_container;
222
iface->set_context = gimp_item_tree_view_set_context;
223
iface->insert_item = gimp_item_tree_view_insert_item;
224
iface->select_item = gimp_item_tree_view_select_item;
225
iface->activate_item = gimp_item_tree_view_activate_item;
226
iface->context_item = gimp_item_tree_view_context_item;
230
gimp_item_tree_view_docked_iface_init (GimpDockedInterface *iface)
232
iface->get_preview = NULL;
236
gimp_item_tree_view_init (GimpItemTreeView *view)
262
238
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
278
254
tree_view->model_columns[tree_view->n_model_columns] = G_TYPE_BOOLEAN;
279
255
tree_view->n_model_columns++;
281
view->context = NULL;
257
tree_view->dnd_drop_to_empty = TRUE;
284
261
view->visible_changed_handler_id = 0;
285
262
view->linked_changed_handler_id = 0;
289
gimp_item_tree_view_view_iface_init (GimpContainerViewInterface *view_iface)
291
parent_view_iface = g_type_interface_peek_parent (view_iface);
293
view_iface->set_container = gimp_item_tree_view_set_container;
294
view_iface->insert_item = gimp_item_tree_view_insert_item;
295
view_iface->select_item = gimp_item_tree_view_select_item;
296
view_iface->activate_item = gimp_item_tree_view_activate_item;
297
view_iface->context_item = gimp_item_tree_view_context_item;
301
gimp_item_tree_view_docked_iface_init (GimpDockedInterface *docked_iface)
303
docked_iface->get_preview = NULL;
304
docked_iface->set_context = gimp_item_tree_view_set_context;
308
gimp_item_tree_view_set_context (GimpDocked *docked,
309
GimpContext *context)
311
GimpItemTreeView *view = GIMP_ITEM_TREE_VIEW (docked);
312
GimpImage *gimage = NULL;
316
g_signal_handlers_disconnect_by_func (view->context,
317
gimp_item_tree_view_set_image,
321
view->context = context;
325
g_signal_connect_swapped (context, "image_changed",
326
G_CALLBACK (gimp_item_tree_view_set_image),
329
gimage = gimp_context_get_image (context);
332
gimp_item_tree_view_set_image (view, gimage);
336
266
gimp_item_tree_view_constructor (GType type,
442
372
gimp_editor_add_action_button (editor, item_view_class->action_group,
443
373
item_view_class->duplicate_action, NULL);
444
374
gimp_container_view_enable_dnd (GIMP_CONTAINER_VIEW (item_view),
445
GTK_BUTTON (item_view->duplicate_button),
446
item_view_class->item_type);
375
GTK_BUTTON (item_view->duplicate_button),
376
item_view_class->item_type);
448
378
item_view->delete_button =
449
379
gimp_editor_add_action_button (editor, item_view_class->action_group,
450
380
item_view_class->delete_action, NULL);
451
381
gimp_container_view_enable_dnd (GIMP_CONTAINER_VIEW (item_view),
452
GTK_BUTTON (item_view->delete_button),
453
item_view_class->item_type);
382
GTK_BUTTON (item_view->delete_button),
383
item_view_class->item_type);
478
408
GimpItemTreeView *item_view;
480
410
g_return_val_if_fail (g_type_is_a (view_type, GIMP_TYPE_ITEM_TREE_VIEW), NULL);
481
g_return_val_if_fail (preview_size > 0 &&
482
preview_size <= GIMP_VIEWABLE_MAX_PREVIEW_SIZE, NULL);
483
g_return_val_if_fail (preview_border_width >= 0 &&
484
preview_border_width <= GIMP_VIEW_MAX_BORDER_WIDTH,
411
g_return_val_if_fail (view_size > 0 &&
412
view_size <= GIMP_VIEWABLE_MAX_PREVIEW_SIZE, NULL);
413
g_return_val_if_fail (view_border_width >= 0 &&
414
view_border_width <= GIMP_VIEW_MAX_BORDER_WIDTH,
486
g_return_val_if_fail (gimage == NULL || GIMP_IS_IMAGE (gimage), NULL);
416
g_return_val_if_fail (image == NULL || GIMP_IS_IMAGE (image), NULL);
487
417
g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL);
488
418
g_return_val_if_fail (menu_identifier != NULL, NULL);
489
419
g_return_val_if_fail (ui_path != NULL, NULL);
495
425
"ui-path", ui_path,
498
gimp_container_view_set_preview_size (GIMP_CONTAINER_VIEW (item_view),
499
preview_size, preview_border_width);
428
gimp_container_view_set_view_size (GIMP_CONTAINER_VIEW (item_view),
429
view_size, view_border_width);
501
gimp_item_tree_view_set_image (item_view, gimage);
431
gimp_item_tree_view_set_image (item_view, image);
503
433
return GTK_WIDGET (item_view);
507
437
gimp_item_tree_view_set_image (GimpItemTreeView *view,
510
440
g_return_if_fail (GIMP_IS_ITEM_TREE_VIEW (view));
511
g_return_if_fail (gimage == NULL || GIMP_IS_IMAGE (gimage));
441
g_return_if_fail (image == NULL || GIMP_IS_IMAGE (image));
513
g_signal_emit (view, view_signals[SET_IMAGE], 0, gimage);
443
g_signal_emit (view, view_signals[SET_IMAGE], 0, image);
515
445
gimp_ui_manager_update (GIMP_EDITOR (view)->ui_manager, view);
449
gimp_item_tree_view_get_image (GimpItemTreeView *view)
451
g_return_val_if_fail (GIMP_IS_ITEM_TREE_VIEW (view), NULL);
519
457
gimp_item_tree_view_real_set_image (GimpItemTreeView *view,
522
if (view->gimage == gimage)
460
if (view->image == image)
527
g_signal_handlers_disconnect_by_func (view->gimage,
528
gimp_item_tree_view_item_changed,
530
g_signal_handlers_disconnect_by_func (view->gimage,
531
gimp_item_tree_view_size_changed,
465
g_signal_handlers_disconnect_by_func (view->image,
466
gimp_item_tree_view_item_changed,
468
g_signal_handlers_disconnect_by_func (view->image,
469
gimp_item_tree_view_size_changed,
534
472
gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), NULL);
536
g_signal_handlers_disconnect_by_func (view->gimage,
474
g_signal_handlers_disconnect_by_func (view->image,
537
475
gimp_item_tree_view_image_flush,
541
view->gimage = gimage;
545
483
GimpContainer *container;
548
GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_container (view->gimage);
486
GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_container (view->image);
550
488
gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), container);
552
g_signal_connect (view->gimage,
490
g_signal_connect (view->image,
553
491
GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->signal_name,
554
G_CALLBACK (gimp_item_tree_view_item_changed),
556
g_signal_connect (view->gimage, "size_changed",
557
G_CALLBACK (gimp_item_tree_view_size_changed),
492
G_CALLBACK (gimp_item_tree_view_item_changed),
494
g_signal_connect (view->image, "size-changed",
495
G_CALLBACK (gimp_item_tree_view_size_changed),
560
g_signal_connect (view->gimage, "flush",
498
g_signal_connect (view->image, "flush",
561
499
G_CALLBACK (gimp_item_tree_view_image_flush),
564
gimp_item_tree_view_item_changed (view->gimage, view);
502
gimp_item_tree_view_item_changed (view->image, view);
569
gimp_item_tree_view_image_flush (GimpImage *gimage,
507
gimp_item_tree_view_image_flush (GimpImage *image,
570
508
GimpItemTreeView *view)
572
510
gimp_ui_manager_update (GIMP_EDITOR (view)->ui_manager, view);
602
540
item_view->visible_changed_handler_id =
603
gimp_container_add_handler (container, "visibility_changed",
604
G_CALLBACK (gimp_item_tree_view_visible_changed),
541
gimp_container_add_handler (container, "visibility-changed",
542
G_CALLBACK (gimp_item_tree_view_visible_changed),
606
544
item_view->linked_changed_handler_id =
607
gimp_container_add_handler (container, "linked_changed",
608
G_CALLBACK (gimp_item_tree_view_linked_changed),
545
gimp_container_add_handler (container, "linked-changed",
546
G_CALLBACK (gimp_item_tree_view_linked_changed),
552
gimp_item_tree_view_set_context (GimpContainerView *view,
553
GimpContext *context)
555
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
556
GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (view);
557
GimpImage *image = NULL;
558
GimpContext *old_context;
560
old_context = gimp_container_view_get_context (view);
564
g_signal_handlers_disconnect_by_func (old_context,
565
gimp_item_tree_view_set_image,
569
parent_view_iface->set_context (view, context);
573
if (! tree_view->dnd_gimp)
574
tree_view->dnd_gimp = context->gimp;
576
g_signal_connect_swapped (context, "image-changed",
577
G_CALLBACK (gimp_item_tree_view_set_image),
580
image = gimp_context_get_image (context);
583
gimp_item_tree_view_set_image (item_view, image);
740
709
GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (tree_view);
741
710
GimpItemTreeViewClass *item_view_class;
742
711
GimpContainer *container;
712
gint dest_index = -1;
746
714
container = gimp_container_view_get_container (container_view);
748
src_index = gimp_container_get_child_index (container,
749
GIMP_OBJECT (src_viewable));
750
dest_index = gimp_container_get_child_index (container,
751
GIMP_OBJECT (dest_viewable));
717
dest_index = gimp_container_get_child_index (container,
718
GIMP_OBJECT (dest_viewable));
753
720
item_view_class = GIMP_ITEM_TREE_VIEW_GET_CLASS (item_view);
755
if (item_view->gimage != gimp_item_get_image (GIMP_ITEM (src_viewable)))
722
if (item_view->image != gimp_item_get_image (GIMP_ITEM (src_viewable)) ||
723
! g_type_is_a (G_TYPE_FROM_INSTANCE (src_viewable),
724
item_view_class->item_type))
726
GType item_type = item_view_class->item_type;
757
727
GimpItem *new_item;
759
if (drop_pos == GTK_TREE_VIEW_DROP_AFTER)
729
if (g_type_is_a (G_TYPE_FROM_INSTANCE (src_viewable), item_type))
730
item_type = G_TYPE_FROM_INSTANCE (src_viewable);
732
if (dest_viewable && drop_pos == GTK_TREE_VIEW_DROP_AFTER)
762
735
new_item = gimp_item_convert (GIMP_ITEM (src_viewable),
764
G_TYPE_FROM_INSTANCE (src_viewable),
736
item_view->image, item_type, TRUE);
767
item_view_class->add_item (item_view->gimage, new_item, dest_index);
738
item_view_class->add_item (item_view->image, new_item, dest_index);
740
else if (dest_viewable)
744
src_index = gimp_container_get_child_index (container,
745
GIMP_OBJECT (src_viewable));
771
747
if (drop_pos == GTK_TREE_VIEW_DROP_AFTER && src_index > dest_index)
823
801
/* GimpImage callbacks */
826
gimp_item_tree_view_item_changed (GimpImage *gimage,
804
gimp_item_tree_view_item_changed (GimpImage *image,
827
805
GimpItemTreeView *view)
831
item = GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (view->gimage);
809
item = GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (view->image);
833
811
gimp_container_view_select_item (GIMP_CONTAINER_VIEW (view),
834
812
(GimpViewable *) item);
838
gimp_item_tree_view_size_changed (GimpImage *gimage,
816
gimp_item_tree_view_size_changed (GimpImage *image,
839
817
GimpItemTreeView *tree_view)
841
819
GimpContainerView *view = GIMP_CONTAINER_VIEW (tree_view);
843
821
gint border_width;
845
preview_size = gimp_container_view_get_preview_size (view, &border_width);
823
view_size = gimp_container_view_get_view_size (view, &border_width);
847
gimp_container_view_set_preview_size (view, preview_size, border_width);
825
gimp_container_view_set_view_size (view, view_size, border_width);
1086
1065
(gpointer) view_class->item_type);
1089
pusher (gimage, NULL, item);
1068
pusher (image, NULL, item);
1091
1070
for (list = on; list; list = g_list_next (list))
1092
pusher (gimage, NULL, list->data);
1071
pusher (image, NULL, list->data);
1094
1073
for (list = off; list; list = g_list_next (list))
1095
pusher (gimage, NULL, list->data);
1074
pusher (image, NULL, list->data);
1097
gimp_image_undo_group_end (gimage);
1076
gimp_image_undo_group_end (image);
1101
gimp_undo_refresh_preview (undo);
1080
gimp_undo_refresh_preview (undo, context);