X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Flive_effects%2Fparameter%2Fpoint.cpp;h=e7abb70ea82e7149c476a211f0d8acf804d6723c;hb=e72ec96ad2ab870dc0af88bc559c86b32c63dd9c;hp=eea337c8599a46e6eb2a9f476776ab1b5b0713df;hpb=0903335a0099bd7ee779925f43a15a2216a0e863;p=inkscape.git diff --git a/src/live_effects/parameter/point.cpp b/src/live_effects/parameter/point.cpp index eea337c85..e7abb70ea 100644 --- a/src/live_effects/parameter/point.cpp +++ b/src/live_effects/parameter/point.cpp @@ -13,15 +13,13 @@ #include #include "ui/widget/point.h" #include "widgets/icon.h" - -#include "knot.h" +#include "ui/widget/registered-widget.h" #include "inkscape.h" #include "verbs.h" +#include "knotholder.h" -#define noLPEPOINTPARAM_DEBUG - -#define PRM_KNOT_COLOR_NORMAL 0xffffff00 -#define PRM_KNOT_COLOR_SELECTED 0x0000ff00 +// needed for on-canvas editting: +#include "desktop.h" namespace Inkscape { @@ -29,24 +27,19 @@ namespace LivePathEffect { PointParam::PointParam( const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, Inkscape::UI::Widget::Registry* wr, - Effect* effect, Geom::Point default_value ) + Effect* effect, const gchar *htip, Geom::Point default_value) : Geom::Point(default_value), Parameter(label, tip, key, wr, effect), defvalue(default_value) { - _widget = NULL; - pointwdg = NULL; - knot = NULL; - _tooltips = NULL; + knot_shape = SP_KNOT_SHAPE_DIAMOND; + knot_mode = SP_KNOT_MODE_XOR; + knot_color = 0xffffff00; + handle_tip = g_strdup(htip); } PointParam::~PointParam() { - if (pointwdg) - delete pointwdg; - if (_tooltips) - delete _tooltips; - - if (knot) - g_object_unref (G_OBJECT (knot)); + if (handle_tip) + g_free(handle_tip); } void @@ -71,58 +64,50 @@ PointParam::param_readSVGValue(const gchar * strvalue) } gchar * -PointParam::param_writeSVGValue() const +PointParam::param_getSVGValue() const { Inkscape::SVGOStringStream os; - os << (*this)[0] << "," << (*this)[1]; + os << *dynamic_cast( this ); gchar * str = g_strdup(os.str().c_str()); return str; } Gtk::Widget * -PointParam::param_getWidget() +PointParam::param_newWidget(Gtk::Tooltips * /*tooltips*/) { - if (!_widget) { - pointwdg = new Inkscape::UI::Widget::RegisteredPoint(); - pointwdg->init(param_label, param_tooltip, param_key, *param_wr, param_effect->getRepr(), param_effect->getSPDoc()); - pointwdg->setValue( (*this)[0], (*this)[1] ); - pointwdg->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change point parameter")); - - Gtk::Widget* pIcon = Gtk::manage( sp_icon_get_icon( "draw_node", Inkscape::ICON_SIZE_BUTTON) ); - Gtk::Button * pButton = Gtk::manage(new Gtk::Button()); - pButton->set_relief(Gtk::RELIEF_NONE); - pIcon->show(); - pButton->add(*pIcon); - pButton->show(); - pButton->signal_clicked().connect(sigc::mem_fun(*this, &PointParam::on_button_click)); -#ifndef LPEPOINTPARAM_DEBUG - pButton->set_sensitive(false); -#endif - - _widget = Gtk::manage( new Gtk::HBox() ); - static_cast(_widget)->pack_start(*pButton, true, true); - static_cast(_widget)->pack_start(*(pointwdg->getPoint()), true, true); - static_cast(_widget)->show_all_children(); - - _tooltips = new Gtk::Tooltips(); - _tooltips->set_tip(*pButton, _("Edit on-canvas")); - } - return dynamic_cast (_widget); + Inkscape::UI::Widget::RegisteredTransformedPoint * pointwdg = Gtk::manage( + new Inkscape::UI::Widget::RegisteredTransformedPoint( param_label, + param_tooltip, + param_key, + *param_wr, + param_effect->getRepr(), + param_effect->getSPDoc() ) ); + // TODO: fix to get correct desktop (don't use SP_ACTIVE_DESKTOP) + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + Geom::Matrix transf = desktop->doc2dt(); + pointwdg->setTransform(transf); + pointwdg->setValue( *this ); + pointwdg->clearProgrammatically(); + pointwdg->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change point parameter")); + + Gtk::HBox * hbox = Gtk::manage( new Gtk::HBox() ); + static_cast(hbox)->pack_start(*pointwdg, true, true); + static_cast(hbox)->show_all_children(); + + return dynamic_cast (hbox); } void PointParam::param_setValue(Geom::Point newpoint) { *dynamic_cast( this ) = newpoint; - if (pointwdg) - pointwdg->setValue(newpoint[0], newpoint[1]); } void PointParam::param_set_and_write_new_value (Geom::Point newpoint) { Inkscape::SVGOStringStream os; - os << newpoint[0] << "," << newpoint[1]; + os << newpoint; gchar * str = g_strdup(os.str().c_str()); param_write_to_repr(str); g_free(str); @@ -135,42 +120,55 @@ PointParam::param_transform_multiply(Geom::Matrix const& postmul, bool /*set*/) } -// CALLBACKS: +void +PointParam::set_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color) +{ + knot_shape = shape; + knot_mode = mode; + knot_color = color; +} + +class PointParamKnotHolderEntity : public LPEKnotHolderEntity { +public: + PointParamKnotHolderEntity(PointParam *p) { this->pparam = p; } + virtual ~PointParamKnotHolderEntity() {} + + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_click(guint state); + +private: + PointParam *pparam; +}; void -PointParam::on_button_click() +PointParamKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/) { - g_message("add knot to canvas on correct location :S"); - - if (!knot) { - // create the knot - knot = sp_knot_new (SP_ACTIVE_DESKTOP, NULL); - knot->setMode(SP_KNOT_MODE_XOR); - knot->setFill(PRM_KNOT_COLOR_NORMAL, PRM_KNOT_COLOR_NORMAL, PRM_KNOT_COLOR_NORMAL); - knot->setStroke(0x000000ff, 0x000000ff, 0x000000ff); - sp_knot_update_ctrl(knot); - - // move knot to the given point - sp_knot_set_position (knot, &NR::Point(*static_cast(this)), SP_KNOT_STATE_NORMAL); - sp_knot_show (knot); -/* - // connect knot's signals - if ( (draggable) // it can be NULL if a node in unsnapped (eg. focus point unsnapped from center) - // luckily, midstops never snap to other nodes so are never unsnapped... - && ( (draggable->point_type == POINT_LG_MID) - || (draggable->point_type == POINT_RG_MID1) - || (draggable->point_type == POINT_RG_MID2) ) ) - { - this->handler_id = g_signal_connect (G_OBJECT (this->knot), "moved", G_CALLBACK (gr_knot_moved_midpoint_handler), this); - } else { - this->handler_id = g_signal_connect (G_OBJECT (this->knot), "moved", G_CALLBACK (gr_knot_moved_handler), this); - } - g_signal_connect (G_OBJECT (this->knot), "clicked", G_CALLBACK (gr_knot_clicked_handler), this); - g_signal_connect (G_OBJECT (this->knot), "doubleclicked", G_CALLBACK (gr_knot_doubleclicked_handler), this); - g_signal_connect (G_OBJECT (this->knot), "grabbed", G_CALLBACK (gr_knot_grabbed_handler), this); - g_signal_connect (G_OBJECT (this->knot), "ungrabbed", G_CALLBACK (gr_knot_ungrabbed_handler), this); -*/ - } + Geom::Point const s = snap_knot_position(p); + pparam->param_setValue(s); + sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false); +} + +Geom::Point +PointParamKnotHolderEntity::knot_get() +{ + return *pparam; +} + +void +PointParamKnotHolderEntity::knot_click(guint /*state*/) +{ + g_print ("This is the handle associated to parameter '%s'\n", pparam->param_key.c_str()); +} + +void +PointParam::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) +{ + PointParamKnotHolderEntity *e = new PointParamKnotHolderEntity(this); + // TODO: can we ditch handleTip() etc. because we have access to handle_tip etc. itself??? + e->create(desktop, item, knotholder, handleTip(), knot_shape, knot_mode, knot_color); + knotholder->add(e); + } } /* namespace LivePathEffect */