SPCSSAttr *Preferences::_extractInheritedStyle(Entry const &v) { // This is the dirtiest extraction method. Generally we ignore whatever was in v._value // and just get the style using sp_repr_css_attr_inherited. To implement this in GConf, // we'll have to walk up the tree and call sp_repr_css_attr_add_from_string Glib::ustring node_key, attr_key; _keySplit(v._pref_path, node_key, attr_key); Inkscape::XML::Node *node = _getNode(node_key, false); return sp_repr_css_attr_inherited(node, attr_key.data()); }
static void sp_star_drag (SPStarContext * sc, double x, double y, guint state) { SPStar *star; SPDesktop * desktop; NRPointF p0, p1; gdouble sides, dx, dy, r1, arg1; GString * xs, * ys; gchar status[80]; NRPointF fp; desktop = SP_EVENT_CONTEXT (sc)->desktop; if (!sc->item) { SPRepr * repr, * style; SPCSSAttr * css; /* Create object */ repr = sp_repr_new ("polygon"); sp_repr_set_attr (repr, "sodipodi:type", "star"); /* Set style */ style = inkscape_get_repr (INKSCAPE, "tools.shapes.star"); if (style) { css = sp_repr_css_attr_inherited (style, "style"); sp_repr_css_set (repr, css, "style"); sp_repr_css_attr_unref (css); } sc->item = (SPItem *) sp_document_add_repr (SP_DT_DOCUMENT (desktop), repr); sp_repr_unref (repr); } /* This is bit ugly, but so we are */ /* if (state & GDK_CONTROL_MASK) { */ /* } else if (state & GDK_SHIFT_MASK) { */ /* Free movement for corner point */ sp_desktop_dt2root_xy_point (desktop, &fp, sc->center.x, sc->center.y); p0.x = fp.x; p0.y = fp.y; sp_desktop_dt2root_xy_point (desktop, &fp, x, y); p1.x = fp.x; p1.y = fp.y; sp_desktop_free_snap (desktop, &p1); star = SP_STAR(sc->item); sides = (gdouble) sc->magnitude; dx = p1.x - p0.x; dy = p1.y - p0.y; r1 = hypot (dx, dy); arg1 = atan2 (dy, dx); #if 0 sp_star_set (star, sc->magnitude, p0.x, p0.y, r1, r1 * (sides-2.0)/sides, arg1, arg1 + M_PI/sides); #else sp_star_position_set (star, sc->magnitude, p0.x, p0.y, r1, r1 * sc->proportion, arg1, arg1 + M_PI / sides); #endif /* status text */ xs = SP_PT_TO_METRIC_STRING (fabs(p0.x), SP_DEFAULT_METRIC); ys = SP_PT_TO_METRIC_STRING (fabs(p0.y), SP_DEFAULT_METRIC); sprintf (status, "Draw star at (%s,%s)", xs->str, ys->str); sp_view_set_status (SP_VIEW (desktop), status, FALSE); g_string_free (xs, FALSE); g_string_free (ys, FALSE); }
static void spdc_flush_white (SPDrawContext *dc, SPCurve *gc) { SPCurve *c; if (dc->white_curves) { g_assert (dc->white_item); c = sp_curve_concat (dc->white_curves); g_slist_free (dc->white_curves); dc->white_curves = NULL; if (gc) { sp_curve_append (c, gc, FALSE); } } else if (gc) { c = gc; sp_curve_ref (c); } else { return; } /* Now we have to go back to item coordinates at last */ if (dc->white_item) { NRMatrixD d2itemd; sp_item_dt2i_affine_d (dc->white_item, SP_EVENT_CONTEXT_DESKTOP (dc), &d2itemd); c = sp_curve_transform (c, NR_MATRIX_D_TO_DOUBLE (&d2itemd)); } else { gdouble d2item[6]; sp_desktop_dt2root_affine (SP_EVENT_CONTEXT_DESKTOP (dc), (NRMatrixD *) d2item); c = sp_curve_transform (c, d2item); } if (c && !sp_curve_empty (c)) { SPDesktop *dt; SPDocument *doc; SPRepr *repr; gchar *str; /* We actually have something to write */ dt = SP_EVENT_CONTEXT_DESKTOP (dc); doc = SP_DT_DOCUMENT (dt); if (dc->white_item) { repr = SP_OBJECT_REPR (dc->white_item); } else { SPRepr *style; repr = sp_repr_new ("path"); /* fixme: Pen and pencil need separate style (Lauris) */ style = inkscape_get_repr (INKSCAPE, "tools.freehand"); if (style) { SPCSSAttr *css; css = sp_repr_css_attr_inherited (style, "style"); sp_repr_css_set (repr, css, "style"); sp_repr_css_attr_unref (css); } } str = sp_svg_write_path (SP_CURVE_BPATH (c)); g_assert (str != NULL); sp_repr_set_attr (repr, "d", str); g_free (str); if (!dc->white_item) { /* Attach repr */ sp_document_add_repr (SP_DT_DOCUMENT (dt), repr); sp_selection_set_repr (dc->selection, repr); sp_repr_unref (repr); } sp_document_done (doc); } sp_curve_unref (c); /* Flush pending updates */ sp_document_ensure_up_to_date (SP_DT_DOCUMENT (SP_EVENT_CONTEXT_DESKTOP (dc))); }