void StarKnotHolderEntity1::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state) { SPStar *star = SP_STAR(item); Geom::Point const s = snap_knot_position(p, state); Geom::Point d = s - star->center; double arg1 = atan2(d); double darg1 = arg1 - star->arg[0]; if (state & GDK_MOD1_MASK) { star->randomized = darg1/(star->arg[0] - star->arg[1]); } else if (state & GDK_SHIFT_MASK) { star->rounded = darg1/(star->arg[0] - star->arg[1]); } else if (state & GDK_CONTROL_MASK) { star->r[0] = L2(d); } else { star->r[0] = L2(d); star->arg[0] = arg1; star->arg[1] += darg1; } (static_cast<SPObject *>(star))->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); }
Geom::Point StarKnotHolderEntity2::knot_get() const { g_assert(item != NULL); SPStar const *star = SP_STAR(item); return sp_star_get_xy(star, SP_STAR_POINT_KNOT2, 0); }
static void sp_star_knot_click(SPItem *item, guint state) { SPStar *star = SP_STAR(item); if (state & GDK_MOD1_MASK) { star->randomized = 0; (static_cast<SPObject *>(star))->updateRepr(); } else if (state & GDK_SHIFT_MASK) { star->rounded = 0; (static_cast<SPObject *>(star))->updateRepr(); } else if (state & GDK_CONTROL_MASK) { star->arg[1] = star->arg[0] + M_PI / star->sides; (static_cast<SPObject *>(star))->updateRepr(); } }
StarKnotHolder::StarKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderReleasedFunc relhandler) : KnotHolder(desktop, item, relhandler) { SPStar *star = SP_STAR(item); StarKnotHolderEntity1 *entity1 = new StarKnotHolderEntity1(); entity1->create(desktop, item, this, Inkscape::CTRL_TYPE_SHAPER, _("Adjust the <b>tip radius</b> of the star or polygon; " "with <b>Shift</b> to round; with <b>Alt</b> to randomize")); entity.push_back(entity1); if (star->flatsided == false) { StarKnotHolderEntity2 *entity2 = new StarKnotHolderEntity2(); entity2->create(desktop, item, this, Inkscape::CTRL_TYPE_SHAPER, _("Adjust the <b>base radius</b> of the star; with <b>Ctrl</b> to keep star rays " "radial (no skew); with <b>Shift</b> to round; with <b>Alt</b> to randomize")); entity.push_back(entity2); } add_pattern_knotholder(); }
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); }