// Create a SheetItem from an ItemData object. This is a bit ugly. // It could be beautified by having a method that creates the item. // E.g. sheet_item->new_from_data (data); SheetItem * sheet_item_factory_create_sheet_item (Sheet *sheet, ItemData *data) { SheetItem *item; g_return_val_if_fail (data != NULL, NULL); g_return_val_if_fail (IS_ITEM_DATA (data), NULL); g_return_val_if_fail (sheet != NULL, NULL); g_return_val_if_fail (IS_SHEET (sheet), NULL); item = NULL; // Pick the right model. if (IS_PART (data)) { NG_DEBUG ("sheet_item_factory_create_sheet_item part\n\n"); item = SHEET_ITEM (part_item_new (sheet, PART (data))); } else if (IS_WIRE (data)) { NG_DEBUG ("sheet_item_factory_create_sheet_item wire\n\n"); item = SHEET_ITEM (wire_item_new (sheet, WIRE (data))); } else if (IS_TEXTBOX (data)) { NG_DEBUG ("sheet_item_factory_create_sheet_item text\n\n"); item = SHEET_ITEM (textbox_item_new (sheet, TEXTBOX (data))); } else g_warning ("Unknown Item type."); return item; }
static void textbox_unregister (ItemData *data) { NodeStore *store; g_return_if_fail (IS_TEXTBOX (data)); store = item_data_get_store (data); node_store_remove_textbox (store, TEXTBOX (data)); }
static void textbox_copy (ItemData *dest, ItemData *src) { Textbox *dest_textbox, *src_textbox; g_return_if_fail (dest != NULL); g_return_if_fail (IS_TEXTBOX (dest)); g_return_if_fail (src != NULL); g_return_if_fail (IS_TEXTBOX (src)); if (parent_class->copy != NULL) parent_class->copy (dest, src); dest_textbox = TEXTBOX (dest); src_textbox = TEXTBOX (src); dest_textbox->priv->text = src_textbox->priv->text; dest_textbox->priv->font = src_textbox->priv->font; }
static ItemData * textbox_clone (ItemData *src) { Textbox *src_textbox, *new_textbox; ItemDataClass *id_class; g_return_val_if_fail (src != NULL, NULL); g_return_val_if_fail (IS_TEXTBOX (src), NULL); id_class = ITEM_DATA_CLASS(G_OBJECT_GET_CLASS(src)); if (id_class->copy == NULL) return NULL; src_textbox = TEXTBOX(src); new_textbox = TEXTBOX(g_object_new(TYPE_TEXTBOX, NULL)); id_class->copy (ITEM_DATA (new_textbox), src); return ITEM_DATA (new_textbox); }
static void textbox_finalize(GObject *object) { Textbox *textbox = TEXTBOX (object); TextboxPriv *priv = textbox->priv; g_free (priv); G_OBJECT_CLASS(parent_class)->finalize(object); }
static int textbox_register (ItemData *data) { NodeStore *store; g_return_val_if_fail (IS_TEXTBOX (data), 0); store = item_data_get_store (data); node_store_add_textbox (store, TEXTBOX (data)); return 0; }
// Go through the properties and commit the changes. void edit_dialog_ok (TextboxItem *item) { const gchar *value; Textbox *textbox; g_return_if_fail (item != NULL); g_return_if_fail (IS_TEXTBOX_ITEM (item)); textbox = TEXTBOX (sheet_item_get_data (SHEET_ITEM (item))); value = gtk_entry_get_text (GTK_ENTRY (prop_dialog->entry)); textbox_set_text (textbox, value); }
Textbox * textbox_new (char *font) { Textbox *textbox; textbox = TEXTBOX(g_object_new(TYPE_TEXTBOX, NULL)); if (font == NULL) textbox->priv->font = g_strdup (TEXTBOX_DEFAULT_FONT); else textbox->priv->font = g_strdup (font); return textbox; }
static void textbox_flip (ItemData *data, gboolean horizontal, SheetPos *center) { double affine[6]; ArtPoint src, dst; Textbox *textbox; TextboxPriv *priv; SheetPos b1, b2; SheetPos textbox_center, delta; g_return_if_fail (data != NULL); g_return_if_fail (IS_TEXTBOX (data)); textbox = TEXTBOX (data); if (center) { item_data_get_absolute_bbox (ITEM_DATA (textbox), &b1, &b2); textbox_center.x = b1.x + (b2.x - b1.x) / 2; textbox_center.y = b1.y + (b2.y - b1.y) / 2; } priv = textbox->priv; if (horizontal) art_affine_scale (affine, -1, 1); else art_affine_scale (affine, 1, -1); /* * Let the views (canvas items) know about the rotation. */ g_signal_emit_by_name(G_OBJECT (textbox), "flipped", horizontal); if (center) { SheetPos textbox_pos; item_data_get_pos (ITEM_DATA (textbox), &textbox_pos); src.x = textbox_center.x - center->x; src.y = textbox_center.y - center->y; art_affine_point (&dst, &src, affine); delta.x = -src.x + dst.x; delta.y = -src.y + dst.y; item_data_move (ITEM_DATA (textbox), &delta); } }
static void edit_textbox (SheetItem *sheet_item) { TextboxItem *item; Textbox *textbox; const char *value; GtkBuilder *builder; GError *e = NULL; Sheet *sheet = sheet_item_get_sheet (sheet_item); g_return_if_fail (sheet_item != NULL); g_return_if_fail (IS_TEXTBOX_ITEM (sheet_item)); if ((builder = gtk_builder_new ()) == NULL) { oregano_error (_ ("Could not create textbox properties dialog")); return; } gtk_builder_set_translation_domain (builder, NULL); item = TEXTBOX_ITEM (sheet_item); textbox = TEXTBOX (sheet_item_get_data (sheet_item)); if (!gtk_builder_add_from_file (builder, OREGANO_UIDIR "/textbox-properties-dialog.ui", &e)) { oregano_error_with_title (_ ("Could not create textbox properties dialog."), e->message); g_clear_error (&e); return; } prop_dialog = g_new0 (TextboxPropDialog, 1); prop_dialog->dialog = GTK_DIALOG (gtk_builder_get_object (builder, "textbox-properties-dialog")); prop_dialog->entry = GTK_ENTRY (gtk_builder_get_object (builder, "entry")); value = textbox_get_text (textbox); gtk_entry_set_text (GTK_ENTRY (prop_dialog->entry), value); gtk_dialog_run (GTK_DIALOG (prop_dialog->dialog)); edit_dialog_ok (item); gtk_widget_destroy (GTK_WIDGET (prop_dialog->dialog)); g_free (prop_dialog); g_object_unref (builder); }