49
COLUMN_NAME_ATTRIBUTES,
54
static void gimp_container_tree_view_view_iface_init (GimpContainerViewInterface *iface);
56
static GObject *gimp_container_tree_view_constructor (GType type,
58
GObjectConstructParam *params);
60
static void gimp_container_tree_view_finalize (GObject *object);
61
static void gimp_container_tree_view_unmap (GtkWidget *widget);
62
static gboolean gimp_container_tree_view_popup_menu (GtkWidget *widget);
64
static void gimp_container_tree_view_set_container (GimpContainerView *view,
65
GimpContainer *container);
66
static void gimp_container_tree_view_set_context (GimpContainerView *view,
67
GimpContext *context);
68
static gpointer gimp_container_tree_view_insert_item (GimpContainerView *view,
69
GimpViewable *viewable,
71
static void gimp_container_tree_view_remove_item (GimpContainerView *view,
72
GimpViewable *viewable,
73
gpointer insert_data);
74
static void gimp_container_tree_view_reorder_item (GimpContainerView *view,
75
GimpViewable *viewable,
77
gpointer insert_data);
78
static void gimp_container_tree_view_rename_item (GimpContainerView *view,
79
GimpViewable *viewable,
80
gpointer insert_data);
81
static gboolean gimp_container_tree_view_select_item (GimpContainerView *view,
82
GimpViewable *viewable,
83
gpointer insert_data);
84
static void gimp_container_tree_view_clear_items (GimpContainerView *view);
85
static void gimp_container_tree_view_set_view_size (GimpContainerView *view);
87
static void gimp_container_tree_view_name_canceled (GtkCellRendererText *cell,
88
GimpContainerTreeView *tree_view);
90
static void gimp_container_tree_view_selection_changed (GtkTreeSelection *sel,
91
GimpContainerTreeView *tree_view);
92
static gboolean gimp_container_tree_view_button_press (GtkWidget *widget,
93
GdkEventButton *bevent,
94
GimpContainerTreeView *tree_view);
95
static gboolean gimp_container_tree_view_tooltip (GtkWidget *widget,
98
gboolean keyboard_tip,
100
GimpContainerTreeView *tree_view);
101
static void gimp_container_tree_view_renderer_update (GimpViewRenderer *renderer,
102
GimpContainerTreeView *tree_view);
104
static GimpViewable * gimp_container_tree_view_drag_viewable (GtkWidget *widget,
105
GimpContext **context,
107
static GdkPixbuf * gimp_container_tree_view_drag_pixbuf (GtkWidget *widget,
56
static void gimp_container_tree_view_view_iface_init (GimpContainerViewInterface *iface);
58
static void gimp_container_tree_view_constructed (GObject *object);
59
static void gimp_container_tree_view_finalize (GObject *object);
61
static void gimp_container_tree_view_unmap (GtkWidget *widget);
62
static gboolean gimp_container_tree_view_popup_menu (GtkWidget *widget);
64
static void gimp_container_tree_view_set_container (GimpContainerView *view,
65
GimpContainer *container);
66
static void gimp_container_tree_view_set_context (GimpContainerView *view,
67
GimpContext *context);
68
static void gimp_container_tree_view_set_selection_mode(GimpContainerView *view,
69
GtkSelectionMode mode);
71
static gpointer gimp_container_tree_view_insert_item (GimpContainerView *view,
72
GimpViewable *viewable,
73
gpointer parent_insert_data,
75
static void gimp_container_tree_view_remove_item (GimpContainerView *view,
76
GimpViewable *viewable,
77
gpointer insert_data);
78
static void gimp_container_tree_view_reorder_item (GimpContainerView *view,
79
GimpViewable *viewable,
81
gpointer insert_data);
82
static void gimp_container_tree_view_rename_item (GimpContainerView *view,
83
GimpViewable *viewable,
84
gpointer insert_data);
85
static gboolean gimp_container_tree_view_select_item (GimpContainerView *view,
86
GimpViewable *viewable,
87
gpointer insert_data);
88
static void gimp_container_tree_view_clear_items (GimpContainerView *view);
89
static void gimp_container_tree_view_set_view_size (GimpContainerView *view);
91
static void gimp_container_tree_view_real_edit_name (GimpContainerTreeView *tree_view);
93
static void gimp_container_tree_view_name_started (GtkCellRendererText *cell,
94
GtkCellEditable *editable,
95
const gchar *path_str,
96
GimpContainerTreeView *tree_view);
97
static void gimp_container_tree_view_name_canceled (GtkCellRendererText *cell,
98
GimpContainerTreeView *tree_view);
100
static void gimp_container_tree_view_selection_changed (GtkTreeSelection *sel,
101
GimpContainerTreeView *tree_view);
102
static gboolean gimp_container_tree_view_button_press (GtkWidget *widget,
103
GdkEventButton *bevent,
104
GimpContainerTreeView *tree_view);
105
static gboolean gimp_container_tree_view_tooltip (GtkWidget *widget,
108
gboolean keyboard_tip,
110
GimpContainerTreeView *tree_view);
111
static GimpViewable *gimp_container_tree_view_drag_viewable (GtkWidget *widget,
112
GimpContext **context,
114
static GdkPixbuf *gimp_container_tree_view_drag_pixbuf (GtkWidget *widget,
117
static gboolean gimp_container_tree_view_get_selected_single (GimpContainerTreeView *tree_view,
119
static gint gimp_container_tree_view_get_selected (GimpContainerView *view,
121
static void gimp_container_tree_view_row_expanded (GtkTreeView *tree_view,
124
GimpContainerTreeView *view);
125
static void gimp_container_tree_view_expand_rows (GtkTreeModel *model,
127
GtkTreeIter *parent);
111
130
G_DEFINE_TYPE_WITH_CODE (GimpContainerTreeView, gimp_container_tree_view,
118
137
static GimpContainerViewInterface *parent_view_iface = NULL;
139
static guint tree_view_signals[LAST_SIGNAL] = { 0 };
122
143
gimp_container_tree_view_class_init (GimpContainerTreeViewClass *klass)
124
145
GObjectClass *object_class = G_OBJECT_CLASS (klass);
125
146
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
147
GtkBindingSet *binding_set;
127
object_class->constructor = gimp_container_tree_view_constructor;
149
object_class->constructed = gimp_container_tree_view_constructed;
128
150
object_class->finalize = gimp_container_tree_view_finalize;
130
152
widget_class->unmap = gimp_container_tree_view_unmap;
131
153
widget_class->popup_menu = gimp_container_tree_view_popup_menu;
155
klass->edit_name = gimp_container_tree_view_real_edit_name;
133
156
klass->drop_possible = gimp_container_tree_view_real_drop_possible;
134
157
klass->drop_viewable = gimp_container_tree_view_real_drop_viewable;
135
158
klass->drop_color = NULL;
145
184
parent_view_iface = g_type_interface_peek_parent (iface);
147
iface->set_container = gimp_container_tree_view_set_container;
148
iface->set_context = gimp_container_tree_view_set_context;
149
iface->insert_item = gimp_container_tree_view_insert_item;
150
iface->remove_item = gimp_container_tree_view_remove_item;
151
iface->reorder_item = gimp_container_tree_view_reorder_item;
152
iface->rename_item = gimp_container_tree_view_rename_item;
153
iface->select_item = gimp_container_tree_view_select_item;
154
iface->clear_items = gimp_container_tree_view_clear_items;
155
iface->set_view_size = gimp_container_tree_view_set_view_size;
186
if (! parent_view_iface)
187
parent_view_iface = g_type_default_interface_peek (GIMP_TYPE_CONTAINER_VIEW);
189
iface->set_container = gimp_container_tree_view_set_container;
190
iface->set_context = gimp_container_tree_view_set_context;
191
iface->set_selection_mode = gimp_container_tree_view_set_selection_mode;
192
iface->insert_item = gimp_container_tree_view_insert_item;
193
iface->remove_item = gimp_container_tree_view_remove_item;
194
iface->reorder_item = gimp_container_tree_view_reorder_item;
195
iface->rename_item = gimp_container_tree_view_rename_item;
196
iface->select_item = gimp_container_tree_view_select_item;
197
iface->clear_items = gimp_container_tree_view_clear_items;
198
iface->set_view_size = gimp_container_tree_view_set_view_size;
199
iface->get_selected = gimp_container_tree_view_get_selected;
157
201
iface->insert_data_free = (GDestroyNotify) gtk_tree_iter_free;
163
207
GimpContainerBox *box = GIMP_CONTAINER_BOX (tree_view);
165
tree_view->n_model_columns = NUM_COLUMNS;
167
tree_view->model_columns[COLUMN_RENDERER] = GIMP_TYPE_VIEW_RENDERER;
168
tree_view->model_columns[COLUMN_NAME] = G_TYPE_STRING;
169
tree_view->model_columns[COLUMN_NAME_ATTRIBUTES] = PANGO_TYPE_ATTR_LIST;
171
tree_view->model_column_renderer = COLUMN_RENDERER;
172
tree_view->model_column_name = COLUMN_NAME;
173
tree_view->model_column_name_attributes = COLUMN_NAME_ATTRIBUTES;
209
tree_view->priv = G_TYPE_INSTANCE_GET_PRIVATE (tree_view,
210
GIMP_TYPE_CONTAINER_TREE_VIEW,
211
GimpContainerTreeViewPriv);
213
gimp_container_tree_store_columns_init (tree_view->model_columns,
214
&tree_view->n_model_columns);
175
216
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (box->scrolled_win),
178
219
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
182
gimp_container_tree_view_constructor (GType type,
184
GObjectConstructParam *params)
223
gimp_container_tree_view_constructed (GObject *object)
186
GimpContainerTreeView *tree_view;
187
GimpContainerView *view;
188
GimpContainerBox *box;
192
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
194
tree_view = GIMP_CONTAINER_TREE_VIEW (object);
195
view = GIMP_CONTAINER_VIEW (object);
196
box = GIMP_CONTAINER_BOX (object);
198
list = gtk_list_store_newv (tree_view->n_model_columns,
199
tree_view->model_columns);
200
tree_view->model = GTK_TREE_MODEL (list);
225
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (object);
226
GimpContainerView *view = GIMP_CONTAINER_VIEW (object);
227
GimpContainerBox *box = GIMP_CONTAINER_BOX (object);
229
if (G_OBJECT_CLASS (parent_class)->constructed)
230
G_OBJECT_CLASS (parent_class)->constructed (object);
232
tree_view->model = gimp_container_tree_store_new (view,
233
tree_view->n_model_columns,
234
tree_view->model_columns);
202
236
tree_view->view = g_object_new (GTK_TYPE_TREE_VIEW,
204
"search-column", COLUMN_NAME,
237
"model", tree_view->model,
238
"search-column", GIMP_CONTAINER_TREE_STORE_COLUMN_NAME,
205
239
"enable-search", FALSE,
206
240
"headers-visible", FALSE,
207
241
"has-tooltip", TRUE,
242
"show-expanders", GIMP_CONTAINER_VIEW_GET_INTERFACE (view)->model_is_tree,
209
g_object_unref (list);
244
g_object_unref (tree_view->model);
211
246
gtk_container_add (GTK_CONTAINER (box->scrolled_win),
212
247
GTK_WIDGET (tree_view->view));
225
263
gtk_tree_view_column_set_attributes (tree_view->main_column,
226
264
tree_view->renderer_cell,
227
"renderer", COLUMN_RENDERER,
265
"renderer", GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER,
230
tree_view->name_cell = gtk_cell_renderer_text_new ();
231
g_object_set (tree_view->name_cell, "xalign", 0.0, NULL);
268
tree_view->priv->name_cell = gtk_cell_renderer_text_new ();
269
g_object_set (tree_view->priv->name_cell, "xalign", 0.0, NULL);
232
270
gtk_tree_view_column_pack_end (tree_view->main_column,
233
tree_view->name_cell,
271
tree_view->priv->name_cell,
236
274
gtk_tree_view_column_set_attributes (tree_view->main_column,
237
tree_view->name_cell,
239
"attributes", COLUMN_NAME_ATTRIBUTES,
275
tree_view->priv->name_cell,
276
"text", GIMP_CONTAINER_TREE_STORE_COLUMN_NAME,
277
"attributes", GIMP_CONTAINER_TREE_STORE_COLUMN_NAME_ATTRIBUTES,
278
"sensitive", GIMP_CONTAINER_TREE_STORE_COLUMN_NAME_SENSITIVE,
242
g_signal_connect (tree_view->name_cell, "editing-canceled",
281
g_signal_connect (tree_view->priv->name_cell, "editing-started",
282
G_CALLBACK (gimp_container_tree_view_name_started),
284
g_signal_connect (tree_view->priv->name_cell, "editing-canceled",
243
285
G_CALLBACK (gimp_container_tree_view_name_canceled),
246
tree_view->renderer_cells = g_list_prepend (tree_view->renderer_cells,
288
gimp_container_tree_view_add_renderer_cell (tree_view,
247
289
tree_view->renderer_cell);
249
tree_view->selection = gtk_tree_view_get_selection (tree_view->view);
291
tree_view->priv->selection = gtk_tree_view_get_selection (tree_view->view);
251
g_signal_connect (tree_view->selection, "changed",
293
g_signal_connect (tree_view->priv->selection, "changed",
252
294
G_CALLBACK (gimp_container_tree_view_selection_changed),
278
318
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (object);
280
if (tree_view->toggle_cells)
282
g_list_free (tree_view->toggle_cells);
283
tree_view->toggle_cells = NULL;
286
if (tree_view->renderer_cells)
288
g_list_free (tree_view->renderer_cells);
289
tree_view->renderer_cells = NULL;
292
if (tree_view->editable_cells)
294
g_list_free (tree_view->editable_cells);
295
tree_view->editable_cells = NULL;
320
if (tree_view->priv->toggle_cells)
322
g_list_free (tree_view->priv->toggle_cells);
323
tree_view->priv->toggle_cells = NULL;
326
if (tree_view->priv->renderer_cells)
328
g_list_free (tree_view->priv->renderer_cells);
329
tree_view->priv->renderer_cells = NULL;
332
if (tree_view->priv->editable_cells)
334
g_list_free (tree_view->priv->editable_cells);
335
tree_view->priv->editable_cells = NULL;
298
338
G_OBJECT_CLASS (parent_class)->finalize (object);
321
361
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (data);
322
362
GtkWidget *widget = GTK_WIDGET (tree_view->view);
363
GtkAllocation allocation;
323
364
GtkTreeIter selected_iter;
325
gdk_window_get_origin (widget->window, x, y);
327
if (GTK_WIDGET_NO_WINDOW (widget))
366
gtk_widget_get_allocation (widget, &allocation);
368
gdk_window_get_origin (gtk_widget_get_window (widget), x, y);
370
if (! gtk_widget_get_has_window (widget))
329
*x += widget->allocation.x;
330
*y += widget->allocation.y;
333
if (gtk_tree_selection_get_selected (tree_view->selection, NULL,
376
if (gimp_container_tree_view_get_selected_single (tree_view, &selected_iter))
336
378
GtkTreePath *path;
337
379
GdkRectangle cell_rect;
446
gimp_container_tree_view_set_main_column_title (GimpContainerTreeView *tree_view,
449
g_return_if_fail (GIMP_IS_CONTAINER_TREE_VIEW (tree_view));
451
gtk_tree_view_column_set_title (tree_view->main_column,
456
gimp_container_tree_view_add_toggle_cell (GimpContainerTreeView *tree_view,
457
GtkCellRenderer *cell)
459
g_return_if_fail (GIMP_IS_CONTAINER_TREE_VIEW (tree_view));
460
g_return_if_fail (GIMP_IS_CELL_RENDERER_TOGGLE (cell));
462
tree_view->priv->toggle_cells = g_list_prepend (tree_view->priv->toggle_cells,
467
gimp_container_tree_view_add_renderer_cell (GimpContainerTreeView *tree_view,
468
GtkCellRenderer *cell)
470
g_return_if_fail (GIMP_IS_CONTAINER_TREE_VIEW (tree_view));
471
g_return_if_fail (GIMP_IS_CELL_RENDERER_VIEWABLE (cell));
473
tree_view->priv->renderer_cells = g_list_prepend (tree_view->priv->renderer_cells,
476
gimp_container_tree_store_add_renderer_cell (GIMP_CONTAINER_TREE_STORE (tree_view->model),
481
gimp_container_tree_view_set_dnd_drop_to_empty (GimpContainerTreeView *tree_view,
482
gboolean dnd_drop_to_empty)
484
g_return_if_fail (GIMP_IS_CONTAINER_TREE_VIEW (tree_view));
486
tree_view->priv->dnd_drop_to_empty = dnd_drop_to_empty;
404
490
gimp_container_tree_view_connect_name_edited (GimpContainerTreeView *tree_view,
405
491
GCallback callback,
408
494
g_return_if_fail (GIMP_IS_CONTAINER_TREE_VIEW (tree_view));
409
495
g_return_if_fail (callback != NULL);
411
g_object_set (tree_view->name_cell,
497
g_object_set (tree_view->priv->name_cell,
412
498
"mode", GTK_CELL_RENDERER_MODE_EDITABLE,
413
499
"editable", TRUE,
416
if (! g_list_find (tree_view->editable_cells, tree_view->name_cell))
417
tree_view->editable_cells = g_list_prepend (tree_view->editable_cells,
418
tree_view->name_cell);
502
if (! g_list_find (tree_view->priv->editable_cells, tree_view->priv->name_cell))
503
tree_view->priv->editable_cells = g_list_prepend (tree_view->priv->editable_cells,
504
tree_view->priv->name_cell);
420
g_signal_connect (tree_view->name_cell, "edited",
506
g_signal_connect (tree_view->priv->name_cell, "edited",
426
gimp_container_tree_view_set (GimpContainerTreeView *tree_view,
428
GimpViewable *viewable)
430
GimpContainerView *view = GIMP_CONTAINER_VIEW (tree_view);
431
GimpViewRenderer *renderer;
436
view_size = gimp_container_view_get_view_size (view, &border_width);
438
renderer = gimp_view_renderer_new (gimp_container_view_get_context (view),
439
G_TYPE_FROM_INSTANCE (viewable),
440
view_size, border_width,
442
gimp_view_renderer_set_viewable (renderer, viewable);
443
gimp_view_renderer_remove_idle (renderer);
445
g_signal_connect (renderer, "update",
446
G_CALLBACK (gimp_container_tree_view_renderer_update),
449
name = gimp_viewable_get_description (viewable, NULL);
451
gtk_list_store_set (GTK_LIST_STORE (tree_view->model), iter,
452
COLUMN_RENDERER, renderer,
457
g_object_unref (renderer);
460
512
/* GimpContainerView methods */
491
546
if (gimp_dnd_drag_source_set_by_type (GTK_WIDGET (tree_view->view),
492
547
GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
493
container->children_type,
548
gimp_container_get_children_type (container),
494
549
GDK_ACTION_COPY))
496
551
gimp_dnd_viewable_source_add (GTK_WIDGET (tree_view->view),
497
container->children_type,
552
gimp_container_get_children_type (container),
498
553
gimp_container_tree_view_drag_viewable,
501
if (GIMP_VIEWABLE_CLASS (g_type_class_peek (container->children_type))->get_size)
556
if (GIMP_VIEWABLE_CLASS (g_type_class_peek (gimp_container_get_children_type (container)))->get_size)
502
557
gimp_dnd_pixbuf_source_add (GTK_WIDGET (tree_view->view),
503
558
gimp_container_tree_view_drag_pixbuf,
524
595
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
597
if (tree_view->model)
598
gimp_container_tree_store_set_context (GIMP_CONTAINER_TREE_STORE (tree_view->model),
526
601
parent_view_iface->set_context (view, context);
528
if (tree_view->model)
533
for (iter_valid = gtk_tree_model_get_iter_first (tree_view->model, &iter);
535
iter_valid = gtk_tree_model_iter_next (tree_view->model, &iter))
537
GimpViewRenderer *renderer;
539
gtk_tree_model_get (tree_view->model, &iter,
540
COLUMN_RENDERER, &renderer,
543
gimp_view_renderer_set_context (renderer, context);
544
g_object_unref (renderer);
605
gimp_container_tree_view_set_selection_mode (GimpContainerView *view,
606
GtkSelectionMode mode)
608
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
610
gtk_tree_selection_set_mode (tree_view->priv->selection, mode);
612
parent_view_iface->set_selection_mode (view, mode);
550
616
gimp_container_tree_view_insert_item (GimpContainerView *view,
551
617
GimpViewable *viewable,
618
gpointer parent_insert_data,
554
621
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
558
gtk_list_store_append (GTK_LIST_STORE (tree_view->model), &iter);
560
gtk_list_store_insert (GTK_LIST_STORE (tree_view->model), &iter, index);
562
gimp_container_tree_view_set (tree_view, &iter, viewable);
564
return gtk_tree_iter_copy (&iter);
624
iter = gimp_container_tree_store_insert_item (GIMP_CONTAINER_TREE_STORE (tree_view->model),
572
636
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
573
637
GtkTreeIter *iter = (GtkTreeIter *) insert_data;
639
gimp_container_tree_store_remove_item (GIMP_CONTAINER_TREE_STORE (tree_view->model),
577
gtk_list_store_remove (GTK_LIST_STORE (tree_view->model), iter);
579
gtk_tree_view_columns_autosize (tree_view->view);
581
/* If the store is empty after this remove, clear out renderers
582
* from all cells so they don't keep refing the viewables
585
if (! gtk_tree_model_iter_n_children (tree_view->model, NULL))
589
for (list = tree_view->renderer_cells; list; list = list->next)
590
g_object_set (list->data, "renderer", NULL, NULL);
644
gtk_tree_view_columns_autosize (tree_view->view);
601
653
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
602
654
GtkTreeIter *iter = (GtkTreeIter *) insert_data;
655
gboolean selected = FALSE;
606
GimpContainer *container;
608
GtkTreeIter selected_iter;
611
container = gimp_container_view_get_container (view);
613
selected = gtk_tree_selection_get_selected (tree_view->selection,
614
NULL, &selected_iter);
659
GtkTreeIter selected_iter;
661
selected = gimp_container_tree_view_get_selected_single (tree_view,
618
666
GimpViewRenderer *renderer;
620
668
gtk_tree_model_get (tree_view->model, &selected_iter,
621
COLUMN_RENDERER, &renderer,
669
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
624
672
if (renderer->viewable != viewable)
627
675
g_object_unref (renderer);
630
if (new_index == -1 || new_index == container->num_children - 1)
632
gtk_list_store_move_before (GTK_LIST_STORE (tree_view->model),
635
else if (new_index == 0)
637
gtk_list_store_move_after (GTK_LIST_STORE (tree_view->model),
642
GtkTreeIter place_iter;
645
path = gtk_tree_model_get_path (tree_view->model, iter);
646
old_index = gtk_tree_path_get_indices (path)[0];
647
gtk_tree_path_free (path);
649
if (new_index != old_index)
651
path = gtk_tree_path_new_from_indices (new_index, -1);
652
gtk_tree_model_get_iter (tree_view->model, &place_iter, path);
653
gtk_tree_path_free (path);
655
if (new_index > old_index)
656
gtk_list_store_move_after (GTK_LIST_STORE (tree_view->model),
659
gtk_list_store_move_before (GTK_LIST_STORE (tree_view->model),
665
gimp_container_view_select_item (view, viewable);
679
gimp_container_tree_store_reorder_item (GIMP_CONTAINER_TREE_STORE (tree_view->model),
685
gimp_container_view_select_item (view, viewable);
701
707
gpointer insert_data)
703
709
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
704
GtkTreeIter *iter = (GtkTreeIter *) insert_data;
711
if (viewable && insert_data)
708
713
GtkTreePath *path;
714
GtkTreePath *parent_path;
715
GtkTreeIter *iter = (GtkTreeIter *) insert_data;
710
717
path = gtk_tree_model_get_path (tree_view->model, iter);
712
g_signal_handlers_block_by_func (tree_view->selection,
719
parent_path = gtk_tree_path_copy (path);
721
if (gtk_tree_path_up (parent_path))
722
gtk_tree_view_expand_to_path (tree_view->view, parent_path);
724
gtk_tree_path_free (parent_path);
726
g_signal_handlers_block_by_func (tree_view->priv->selection,
713
727
gimp_container_tree_view_selection_changed,
716
730
gtk_tree_view_set_cursor (tree_view->view, path, NULL, FALSE);
718
g_signal_handlers_unblock_by_func (tree_view->selection,
732
g_signal_handlers_unblock_by_func (tree_view->priv->selection,
719
733
gimp_container_tree_view_selection_changed,
765
770
view_size = gimp_container_view_get_view_size (view, &border_width);
767
772
if (tree_view->model)
772
for (iter_valid = gtk_tree_model_get_iter_first (tree_view->model, &iter);
774
iter_valid = gtk_tree_model_iter_next (tree_view->model, &iter))
776
GimpViewRenderer *renderer;
778
gtk_tree_model_get (tree_view->model, &iter,
779
COLUMN_RENDERER, &renderer,
782
gimp_view_renderer_set_size (renderer, view_size, border_width);
783
g_object_unref (renderer);
773
gimp_container_tree_store_set_view_size (GIMP_CONTAINER_TREE_STORE (tree_view->model));
787
775
tree_widget = GTK_WIDGET (tree_view->view);
789
777
if (! tree_widget)
792
for (list = tree_view->toggle_cells; list; list = g_list_next (list))
780
for (list = tree_view->priv->toggle_cells; list; list = g_list_next (list))
795
783
GtkIconSize icon_size;
809
/* GimpContainerTreeView methods */
812
gimp_container_tree_view_real_edit_name (GimpContainerTreeView *tree_view)
814
GtkTreeIter selected_iter;
816
if (g_list_find (tree_view->priv->editable_cells,
817
tree_view->priv->name_cell) &&
818
gimp_container_tree_view_get_selected_single (tree_view,
823
path = gtk_tree_model_get_path (tree_view->model, &selected_iter);
825
gtk_tree_view_set_cursor_on_cell (tree_view->view, path,
826
tree_view->main_column,
827
tree_view->priv->name_cell,
830
gtk_tree_path_free (path);
838
gimp_container_tree_view_name_started (GtkCellRendererText *cell,
839
GtkCellEditable *editable,
840
const gchar *path_str,
841
GimpContainerTreeView *tree_view)
846
path = gtk_tree_path_new_from_string (path_str);
848
if (gtk_tree_model_get_iter (tree_view->model, &iter, path))
850
GimpViewRenderer *renderer;
851
const gchar *real_name;
853
gtk_tree_model_get (tree_view->model, &iter,
854
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
857
real_name = gimp_object_get_name (renderer->viewable);
859
g_object_unref (renderer);
861
gtk_entry_set_text (GTK_ENTRY (editable), real_name);
864
gtk_tree_path_free (path);
824
868
gimp_container_tree_view_name_canceled (GtkCellRendererText *cell,
825
869
GimpContainerTreeView *tree_view)
827
871
GtkTreeIter iter;
829
if (gtk_tree_selection_get_selected (tree_view->selection, NULL, &iter))
873
if (gimp_container_tree_view_get_selected_single (tree_view, &iter))
831
875
GimpViewRenderer *renderer;
834
878
gtk_tree_model_get (tree_view->model, &iter,
835
tree_view->model_column_renderer, &renderer,
879
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
838
882
name = gimp_viewable_get_description (renderer->viewable, NULL);
840
gtk_list_store_set (GTK_LIST_STORE (tree_view->model), &iter,
841
tree_view->model_column_name, name,
884
gtk_tree_store_set (GTK_TREE_STORE (tree_view->model), &iter,
885
GIMP_CONTAINER_TREE_STORE_COLUMN_NAME, name,
850
894
gimp_container_tree_view_selection_changed (GtkTreeSelection *selection,
851
895
GimpContainerTreeView *tree_view)
855
if (gtk_tree_selection_get_selected (selection, NULL, &iter))
857
GimpViewRenderer *renderer;
859
gtk_tree_model_get (tree_view->model, &iter,
860
COLUMN_RENDERER, &renderer,
863
gimp_container_view_item_selected (GIMP_CONTAINER_VIEW (tree_view),
865
g_object_unref (renderer);
897
GimpContainerView *view = GIMP_CONTAINER_VIEW (tree_view);
900
gimp_container_tree_view_get_selected (view, &items);
901
gimp_container_view_multi_selected (view, items);
869
905
static GtkCellRenderer *
929
968
GtkCellRenderer *edit_cell = NULL;
930
969
GdkRectangle column_area;
931
970
GtkTreeIter iter;
971
gboolean handled = TRUE;
972
gboolean multisel_mode;
974
multisel_mode = (gtk_tree_selection_get_mode (tree_view->priv->selection)
975
== GTK_SELECTION_MULTIPLE);
933
977
gtk_tree_model_get_iter (tree_view->model, &iter, path);
935
979
gtk_tree_model_get (tree_view->model, &iter,
936
COLUMN_RENDERER, &renderer,
980
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
939
tree_view->dnd_renderer = renderer;
983
tree_view->priv->dnd_renderer = renderer;
941
gtk_tree_view_get_background_area (tree_view->view, path,
942
column, &column_area);
985
gtk_tree_view_get_cell_area (tree_view->view, path,
986
column, &column_area);
944
988
gtk_tree_view_column_cell_set_cell_data (column,
945
989
tree_view->model,
993
if (bevent->button == 1 &&
994
gtk_tree_model_iter_has_child (tree_view->model, &iter) &&
995
column == gtk_tree_view_get_expander_column (tree_view->view))
999
cells = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
1001
if (! gimp_container_tree_view_find_click_cell (widget,
1003
column, &column_area,
1004
bevent->x, bevent->y))
1006
/* we didn't click on any cell, but we clicked on empty
1007
* space in the expander column of a row that has
1008
* children; let GtkTreeView process the button press
1009
* to maybe handle a click on an expander.
1011
g_list_free (cells);
1012
gtk_tree_path_free (path);
1013
g_object_unref (renderer);
1018
g_list_free (cells);
949
1021
toggled_cell = (GimpCellRendererToggle *)
950
1022
gimp_container_tree_view_find_click_cell (widget,
951
tree_view->toggle_cells,
1023
tree_view->priv->toggle_cells,
952
1024
column, &column_area,
953
1025
bevent->x, bevent->y);
955
1027
if (! toggled_cell)
956
1028
clicked_cell = (GimpCellRendererViewable *)
957
1029
gimp_container_tree_view_find_click_cell (widget,
958
tree_view->renderer_cells,
1030
tree_view->priv->renderer_cells,
959
1031
column, &column_area,
960
1032
bevent->x, bevent->y);
962
1034
if (! toggled_cell && ! clicked_cell)
964
1036
gimp_container_tree_view_find_click_cell (widget,
965
tree_view->editable_cells,
1037
tree_view->priv->editable_cells,
966
1038
column, &column_area,
967
1039
bevent->x, bevent->y);
969
1041
g_object_ref (tree_view);
971
switch (bevent->button)
1043
if (gdk_event_triggers_context_menu ((GdkEvent *) bevent))
1045
if (gimp_container_view_item_selected (container_view,
1046
renderer->viewable))
1048
if (gimp_container_view_get_container (container_view))
1049
gimp_container_view_item_context (container_view,
1050
renderer->viewable);
1053
else if (bevent->button == 1)
974
1055
if (bevent->type == GDK_BUTTON_PRESS)
976
gboolean success = TRUE;
978
1057
/* don't select item if a toggle was clicked */
979
1058
if (! toggled_cell)
980
success = gimp_container_view_item_selected (container_view,
1060
gchar *path_str = gtk_tree_path_to_string (path);
1066
gimp_cell_renderer_viewable_pre_clicked (clicked_cell,
1074
/* let parent do the work */
1079
gimp_container_view_item_selected (container_view,
1080
renderer->viewable);
983
1087
/* a callback invoked by selecting the item may have
984
1088
* destroyed us, so check if the container is still there
1028
if (edit_cell == tree_view->name_cell)
1030
const gchar *real_name;
1033
gimp_object_get_name (GIMP_OBJECT (renderer->viewable));
1035
gtk_list_store_set (GTK_LIST_STORE (tree_view->model),
1037
tree_view->model_column_name,
1042
1132
gtk_tree_view_set_cursor_on_cell (tree_view->view, path,
1043
1133
column, edit_cell, TRUE);
1045
else if (! toggled_cell) /* ignore double click on toggles */
1135
else if (! toggled_cell &&
1136
! (bevent->state & gimp_get_all_modifiers_mask ()))
1138
/* Only activate if we're not in a toggled cell
1139
* and no modifier keys are pressed
1047
1141
gimp_container_view_item_activated (container_view,
1048
1142
renderer->viewable);
1147
else if (bevent->button == 2)
1055
1149
if (bevent->type == GDK_BUTTON_PRESS)
1057
1151
if (clicked_cell)
1264
gimp_container_tree_view_get_selected_single (GimpContainerTreeView *tree_view,
1267
GtkTreeSelection *selection;
1269
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view->view));
1271
if (gtk_tree_selection_count_selected_rows (selection) == 1)
1273
GList *selected_rows;
1275
selected_rows = gtk_tree_selection_get_selected_rows (selection, NULL);
1277
gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_view->model), iter,
1278
(GtkTreePath *) selected_rows->data);
1280
g_list_free_full (selected_rows, (GDestroyNotify) gtk_tree_path_free);
1291
gimp_container_tree_view_get_selected (GimpContainerView *view,
1294
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
1295
GtkTreeSelection *selection;
1296
gint selected_count;
1297
GList *selected_rows;
1300
GimpViewRenderer *renderer;
1302
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view->view));
1303
selected_count = gtk_tree_selection_count_selected_rows (selection);
1307
/* just provide selected count */
1308
return selected_count;
1311
selected_rows = gtk_tree_selection_get_selected_rows (selection, NULL);
1314
for (current_row = selected_rows;
1316
current_row = g_list_next (current_row))
1318
gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_view->model), &iter,
1319
(GtkTreePath *) current_row->data);
1321
gtk_tree_model_get (tree_view->model, &iter,
1322
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
1325
if (renderer->viewable)
1326
*items = g_list_prepend (*items, renderer->viewable);
1328
g_object_unref (renderer);
1331
g_list_free_full (selected_rows, (GDestroyNotify) gtk_tree_path_free);
1333
*items = g_list_reverse (*items);
1335
return selected_count;
1339
gimp_container_tree_view_row_expanded (GtkTreeView *tree_view,
1342
GimpContainerTreeView *view)
1344
GimpViewRenderer *renderer;
1346
gtk_tree_model_get (view->model, iter,
1347
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
1351
gboolean expanded = gtk_tree_view_row_expanded (tree_view, path);
1353
gimp_viewable_set_expanded (renderer->viewable,
1357
g_signal_handlers_block_by_func (tree_view,
1358
gimp_container_tree_view_row_expanded,
1361
gimp_container_tree_view_expand_rows (view->model, tree_view, iter);
1363
g_signal_handlers_unblock_by_func (tree_view,
1364
gimp_container_tree_view_row_expanded,
1368
g_object_unref (renderer);
1373
gimp_container_tree_view_expand_rows (GtkTreeModel *model,
1375
GtkTreeIter *parent)
1379
if (gtk_tree_model_iter_children (model, &iter, parent))
1381
if (gtk_tree_model_iter_has_child (model, &iter))
1383
GimpViewRenderer *renderer;
1385
gtk_tree_model_get (model, &iter,
1386
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
1390
GtkTreePath *path = gtk_tree_model_get_path (model, &iter);
1392
if (gimp_viewable_get_expanded (renderer->viewable))
1393
gtk_tree_view_expand_row (view, path, FALSE);
1395
gtk_tree_view_collapse_row (view, path);
1397
gtk_tree_path_free (path);
1398
g_object_unref (renderer);
1401
gimp_container_tree_view_expand_rows (model, view, &iter);
1403
while (gtk_tree_model_iter_next (model, &iter));