/*! * \brief Create a new diagram data object only containing the selected objects * \memberof _DiagramData */ DiagramData * diagram_data_clone_selected (DiagramData *data) { DiagramData *clone; Layer *dest_layer; GList *sorted; clone = g_object_new (DIA_TYPE_DIAGRAM_DATA, NULL); clone->extents = data->extents; clone->bg_color = data->bg_color; clone->paper = data->paper; /* so ugly */ clone->paper.name = g_strdup (data->paper.name); clone->is_compressed = data->is_compressed; /* the selection - if any - can only be on the active layer */ dest_layer = g_ptr_array_index(clone->layers, 0); g_free (dest_layer->name); dest_layer->name = layer_get_name (data->active_layer); sorted = data_get_sorted_selected (data); dest_layer->objects = object_copy_list (sorted); g_list_free (sorted); dest_layer->visible = data->active_layer->visible; dest_layer->connectable = data->active_layer->connectable; data_update_extents (clone); return clone; }
/*! * \brief Create a copy of the whole diagram data * * This is kind of a deep copy, everything not immutable gets duplicated. * Still this is supposed to be relatively fast, because the most expensive * objects have immutuable properties, namely the pixbufs in DiaImage are * only referenced. * * \memberof _DiagramData */ DiagramData * diagram_data_clone (DiagramData *data) { DiagramData *clone; guint i; clone = g_object_new (DIA_TYPE_DIAGRAM_DATA, NULL); clone->extents = data->extents; clone->bg_color = data->bg_color; clone->paper = data->paper; /* so ugly */ clone->paper.name = g_strdup (data->paper.name); clone->is_compressed = data->is_compressed; layer_destroy(g_ptr_array_index(clone->layers, 0)); g_ptr_array_remove(clone->layers, clone->active_layer); for (i=0; i < data->layers->len; ++i) { Layer *src_layer = g_ptr_array_index(data->layers, i); Layer *dest_layer = new_layer (layer_get_name (src_layer), clone); /* copy layer, init the active one */ dest_layer->extents = src_layer->extents; dest_layer->objects = object_copy_list (src_layer->objects); dest_layer->visible = src_layer->visible; dest_layer->connectable = src_layer->connectable; g_ptr_array_add (clone->layers, dest_layer); if (src_layer == data->active_layer) clone->active_layer = dest_layer; /* the rest should be initialized by construction */ } return clone; }
static gint cmp_layer (GtkTreeIter *a, GtkTreeIter *b) { Layer *pa = NODE_LAYER(a), *pb = NODE_LAYER(b); gchar *na, *nb; gint ret; if (pa == pb) return 0; na = layer_get_name (pa); nb = layer_get_name (pb); if (!na || !nb) return (na > nb) ? -1 : 1; ret = strcmp (na, nb); g_free (na); g_free (nb); return ret; }
static void _dtm_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value) { switch (column) { case DIAGRAM_COLUMN : g_value_init (value, G_TYPE_OBJECT); g_value_set_object (value, NODE_DIAGRAM(iter)); break; case LAYER_COLUMN : g_value_init (value, G_TYPE_POINTER); g_value_set_pointer (value, NODE_LAYER(iter)); break; case OBJECT_COLUMN : g_value_init (value, G_TYPE_POINTER); g_value_set_pointer (value, NODE_OBJECT(iter)); break; case NAME_COLUMN : g_value_init (value, G_TYPE_STRING); /* deduce the requested name from the iter */ if (NODE_OBJECT(iter)) g_value_set_string (value, object_get_displayname (NODE_OBJECT (iter))); else if (NODE_LAYER(iter)) g_value_set_string (value, layer_get_name (NODE_LAYER (iter))); else if (NODE_DIAGRAM(iter)) g_value_set_string (value, diagram_get_name (DIA_DIAGRAM(NODE_DIAGRAM(iter)))); else /* warn on it? */ g_value_set_string (value, NULL); break; default : g_assert_not_reached (); } }
static gboolean _dtv_query_tooltip (GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip) { int bin_x, bin_y; GtkTreePath *path = NULL; GtkTreeViewColumn *column; GtkTreeIter iter; GtkTreeModel *model; GdkRectangle cell_area; GString *markup; gboolean had_info = FALSE; gtk_tree_view_convert_widget_to_bin_window_coords ( GTK_TREE_VIEW (widget), x, y, &bin_x, &bin_y); if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), bin_x, bin_y, &path, &column, NULL, NULL)) { model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); if (gtk_tree_model_get_iter (model, &iter, path)) { /* show some useful information */ Diagram *diagram; Layer *layer; DiaObject *object; gtk_tree_model_get (model, &iter, DIAGRAM_COLUMN, &diagram, -1); gtk_tree_model_get (model, &iter, LAYER_COLUMN, &layer, -1); gtk_tree_model_get (model, &iter, OBJECT_COLUMN, &object, -1); markup = g_string_new (NULL); if (diagram) { gchar *em = g_markup_printf_escaped ("<b>%s</b>: %s\n", _("Diagram"), diagram->filename); g_string_append (markup, em); g_free (em); } if (layer) { gchar *name = layer_get_name (layer); gchar *em = g_markup_printf_escaped ("<b>%s</b>: %s\n", _("Layer"), name); g_string_append (markup, em); g_free (em); g_free (name); } else if (diagram) { int layers = data_layer_count (DIA_DIAGRAM_DATA (diagram)); g_string_append_printf (markup, g_dngettext (GETTEXT_PACKAGE, "%d Layer", "%d Layers", layers), layers); } if (object) { gchar *em = g_markup_printf_escaped ("<b>%s</b>: %s\n", _("Type"), object->type->name); g_string_append (markup, em); g_free (em); g_string_append_printf (markup, "<b>%s</b>: %g,%g\n", Q_("object|Position"), object->position.x, object->position.y); g_string_append_printf (markup, "%d %s", g_list_length (object->children), _("Children")); /* and some dia_object_get_meta ? */ } else if (layer) { int objects = layer_object_count (layer); g_string_append_printf (markup, g_dngettext (GETTEXT_PACKAGE, "%d Object", "%d Objects", objects), objects); } if (markup->len > 0) { gtk_tree_view_get_cell_area (GTK_TREE_VIEW (widget), path, column, &cell_area); gtk_tree_view_convert_bin_window_to_widget_coords (GTK_TREE_VIEW (widget), cell_area.x, cell_area.y, &cell_area.x, &cell_area.y); gtk_tooltip_set_tip_area (tooltip, &cell_area); gtk_tooltip_set_markup (tooltip, markup->str); had_info = TRUE; } /* drop references */ if (diagram) g_object_unref (diagram); g_string_free (markup, TRUE); } gtk_tree_path_free (path); if (had_info) return TRUE; } return GTK_WIDGET_CLASS (_dtv_parent_class)->query_tooltip (widget, x, y, keyboard_mode, tooltip); }