glMerge *merge;
GHashTable *pixbuf_cache;
+ GHashTable *svg_cache;
/* Delay changed signals while operating on selections of multiple objects. */
gboolean selection_op_flag;
gboolean default_font_italic_flag;
guint default_text_color;
PangoAlignment default_text_alignment;
+ glValignment default_text_valignment;
gdouble default_text_line_spacing;
/* Default object line properties */
static void object_changed_cb (glLabelObject *object,
glLabel *label);
+static void object_moved_cb (glLabelObject *object,
+ glLabel *label);
+
static void do_modify (glLabel *label);
static void begin_selection_op (glLabel *label);
/*****************************************************************************/
/* Boilerplate object stuff. */
/*****************************************************************************/
-G_DEFINE_TYPE (glLabel, gl_label, G_TYPE_OBJECT);
+G_DEFINE_TYPE (glLabel, gl_label, G_TYPE_OBJECT)
static void
label->priv->merge = NULL;
label->priv->pixbuf_cache = gl_pixbuf_cache_new ();
+ label->priv->svg_cache = gl_svg_cache_new ();
label->priv->undo_stack = g_queue_new ();
label->priv->redo_stack = g_queue_new ();
{
g_object_unref (G_OBJECT(label->priv->merge));
}
- gl_pixbuf_cache_free (label->priv->pixbuf_cache);
g_free (label->priv->default_font_family);
stack_clear (label->priv->undo_stack);
g_queue_free (label->priv->undo_stack);
g_queue_free (label->priv->redo_stack);
+ gl_pixbuf_cache_free (label->priv->pixbuf_cache);
+ gl_svg_cache_free (label->priv->svg_cache);
+
g_free (label->priv);
G_OBJECT_CLASS (gl_label_parent_class)->finalize (object);
}
+/****************************************************************************/
+/* Object "moved" callback. */
+/****************************************************************************/
+static void
+object_moved_cb (glLabelObject *object,
+ glLabel *label)
+{
+ do_modify (label);
+}
+
+
/****************************************************************************/
/* Do modify. */
/****************************************************************************/
}
+/****************************************************************************/
+/* Get svg cache. */
+/****************************************************************************/
+GHashTable *
+gl_label_get_svg_cache (glLabel *label)
+{
+ return label->priv->svg_cache;
+}
+
+
/*****************************************************************************/
/* Add object to label. */
/*****************************************************************************/
g_signal_connect (G_OBJECT (object), "changed",
G_CALLBACK (object_changed_cb), label);
+ g_signal_connect (G_OBJECT (object), "moved",
+ G_CALLBACK (object_moved_cb), label);
do_modify (label);
g_signal_handlers_disconnect_by_func (G_OBJECT (object),
G_CALLBACK (object_changed_cb), label);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (object),
+ G_CALLBACK (object_moved_cb), label);
g_object_unref (object);
do_modify (label);
end_selection_op (label);
+ g_signal_emit (G_OBJECT(label), signals[SELECTION_CHANGED], 0);
+
gl_debug (DEBUG_LABEL, "END");
}
}
+/*****************************************************************************/
+/* Set vertical text alignment for all text contained in selected objects. */
+/*****************************************************************************/
+void
+gl_label_set_selection_text_valignment (glLabel *label,
+ glValignment text_valignment)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+ gl_label_object_set_text_valignment (object, text_valignment, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
/*****************************************************************************/
/* Set text line spacing for all text contained in selected objects. */
/*****************************************************************************/
if ( gl_label_is_selection_atomic (label) &&
GL_IS_LABEL_IMAGE (selection_list->data) )
{
- glLabelImage *image_object = GL_LABEL_IMAGE (selection_list->data);
- const GdkPixbuf *pixbuf = gl_label_image_get_pixbuf (image_object, NULL);
+ glLabelImage *image_object = GL_LABEL_IMAGE (selection_list->data);
+ GdkPixbuf *pixbuf = gl_label_image_get_pixbuf (image_object, NULL);
- gtk_target_list_add_image_targets (target_list, 2, TRUE);
-
- data->pixbuf = g_object_ref (G_OBJECT (pixbuf));
+ if (pixbuf)
+ {
+ gtk_target_list_add_image_targets (target_list, 2, TRUE);
+ data->pixbuf = pixbuf;
+ }
}
}
+/****************************************************************************/
+/* Set default vertical text alignment. */
+/****************************************************************************/
+void
+gl_label_set_default_text_valignment (glLabel *label,
+ glValignment text_valignment)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ label->priv->default_text_valignment = text_valignment;
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
/****************************************************************************/
/* Set default text line spacing. */
/****************************************************************************/
}
+/****************************************************************************/
+/* Get default vertical text alignment. */
+/****************************************************************************/
+glValignment
+gl_label_get_default_text_valignment (glLabel *label)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_val_if_fail (label && GL_IS_LABEL (label), GL_VALIGN_TOP);
+
+ gl_debug (DEBUG_LABEL, "END");
+
+ return label->priv->default_text_valignment;
+}
+
+
/****************************************************************************/
/* Get default text line spacing. */
/****************************************************************************/