void LivePathEffectEditor::setDesktop(SPDesktop *desktop) { Panel::setDesktop(desktop); if ( desktop == current_desktop ) { return; } if (current_desktop) { selection_changed_connection.disconnect(); selection_modified_connection.disconnect(); } lpe_list_locked = false; current_desktop = desktop; if (desktop) { Inkscape::Selection *selection = sp_desktop_selection(desktop); selection_changed_connection = selection->connectChanged( sigc::bind (sigc::ptr_fun(&lpeeditor_selection_changed), this ) ); selection_modified_connection = selection->connectModified( sigc::bind (sigc::ptr_fun(&lpeeditor_selection_modified), this ) ); onSelectionChanged(selection); } else { onSelectionChanged(NULL); } }
void LpeTool::setup() { PenTool::setup(); Inkscape::Selection *selection = this->desktop->getSelection(); SPItem *item = selection->singleItem(); this->sel_changed_connection.disconnect(); this->sel_changed_connection = selection->connectChanged(sigc::bind(sigc::ptr_fun(&sp_lpetool_context_selection_changed), (gpointer)this)); this->shape_editor = new ShapeEditor(this->desktop); lpetool_context_switch_mode(this, Inkscape::LivePathEffect::INVALID_LPE); lpetool_context_reset_limiting_bbox(this); lpetool_create_measuring_items(this); // TODO temp force: this->enableSelectionCue(); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (item) { this->shape_editor->set_item(item); } if (prefs->getBool("/tools/lpetool/selcue")) { this->enableSelectionCue(); } }
static void mesh_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder) { static sigc::connection c_selection_changed; static sigc::connection c_selection_modified; static sigc::connection c_subselection_changed; static sigc::connection c_defs_release; static sigc::connection c_defs_modified; if (SP_IS_MESH_CONTEXT(ec)) { // connect to selection modified and changed signals Inkscape::Selection *selection = desktop->getSelection(); SPDocument *document = desktop->getDocument(); c_selection_changed = selection->connectChanged(sigc::bind(sigc::ptr_fun(&ms_tb_selection_changed), holder)); c_selection_modified = selection->connectModified(sigc::bind(sigc::ptr_fun(&ms_tb_selection_modified), holder)); c_subselection_changed = desktop->connectToolSubselectionChanged(sigc::bind(sigc::ptr_fun(&ms_drag_selection_changed), holder)); c_defs_release = document->getDefs()->connectRelease(sigc::bind<1>(sigc::ptr_fun(&ms_defs_release), holder)); c_defs_modified = document->getDefs()->connectModified(sigc::bind<2>(sigc::ptr_fun(&ms_defs_modified), holder)); ms_tb_selection_changed(selection, holder); } else { if (c_selection_changed) c_selection_changed.disconnect(); if (c_selection_modified) c_selection_modified.disconnect(); if (c_subselection_changed) c_subselection_changed.disconnect(); if (c_defs_release) c_defs_release.disconnect(); if (c_defs_modified) c_defs_modified.disconnect(); } }
static void sp_spiral_context_setup(SPEventContext *ec) { SPSpiralContext *sc = SP_SPIRAL_CONTEXT(ec); if (((SPEventContextClass *) parent_class)->setup) ((SPEventContextClass *) parent_class)->setup(ec); sp_event_context_read(ec, "expansion"); sp_event_context_read(ec, "revolution"); sp_event_context_read(ec, "t0"); ec->shape_editor = new ShapeEditor(ec->desktop); SPItem *item = sp_desktop_selection(ec->desktop)->singleItem(); if (item) { ec->shape_editor->set_item(item, SH_KNOTHOLDER); } Inkscape::Selection *selection = sp_desktop_selection(ec->desktop); sc->sel_changed_connection.disconnect(); sc->sel_changed_connection = selection->connectChanged(sigc::bind(sigc::ptr_fun(&sp_spiral_context_selection_changed), (gpointer)sc)); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (prefs->getBool("/tools/shapes/selcue")) { ec->enableSelectionCue(); } if (prefs->getBool("/tools/shapes/gradientdrag")) { ec->enableGrDrag(); } sc->_message_context = new Inkscape::MessageContext((ec->desktop)->messageStack()); }
static void rect_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder) { static sigc::connection changed; // use of dynamic_cast<> seems wrong here -- we just need to check the current tool if (dynamic_cast<Inkscape::UI::Tools::RectTool *>(ec)) { Inkscape::Selection *sel = desktop->getSelection(); changed = sel->connectChanged(sigc::bind(sigc::ptr_fun(sp_rect_toolbox_selection_changed), holder)); // Synthesize an emission to trigger the update sp_rect_toolbox_selection_changed(sel, holder); } else { if (changed) { changed.disconnect(); purge_repr_listener(NULL, holder); } } }
static void sp_gradient_context_setup(SPEventContext *ec) { SPGradientContext *rc = SP_GRADIENT_CONTEXT(ec); if (((SPEventContextClass *) parent_class)->setup) { ((SPEventContextClass *) parent_class)->setup(ec); } Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (prefs->getBool("/tools/gradient/selcue", true)) { ec->enableSelectionCue(); } ec->enableGrDrag(); Inkscape::Selection *selection = sp_desktop_selection(ec->desktop); rc->_message_context = new Inkscape::MessageContext(sp_desktop_message_stack(ec->desktop)); rc->selcon = new sigc::connection (selection->connectChanged( sigc::bind (sigc::ptr_fun(&gradient_selection_changed), rc))); rc->subselcon = new sigc::connection (ec->desktop->connectToolSubselectionChanged(sigc::bind (sigc::ptr_fun(&gradient_subselection_changed), rc))); gradient_selection_changed(selection, rc); }
static void sp_lpetool_context_setup(SPEventContext *ec) { SPLPEToolContext *lc = SP_LPETOOL_CONTEXT(ec); if (((SPEventContextClass *) lpetool_parent_class)->setup) ((SPEventContextClass *) lpetool_parent_class)->setup(ec); Inkscape::Selection *selection = sp_desktop_selection (ec->desktop); SPItem *item = selection->singleItem(); lc->sel_changed_connection.disconnect(); lc->sel_changed_connection = selection->connectChanged(sigc::bind(sigc::ptr_fun(&sp_lpetool_context_selection_changed), (gpointer)lc)); lc->shape_editor = new ShapeEditor(ec->desktop); lpetool_context_switch_mode(lc, Inkscape::LivePathEffect::INVALID_LPE); lpetool_context_reset_limiting_bbox(lc); lpetool_create_measuring_items(lc); // TODO temp force: ec->enableSelectionCue(); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (item) { lc->shape_editor->set_item(item, SH_NODEPATH); lc->shape_editor->set_item(item, SH_KNOTHOLDER); } if (prefs->getBool("/tools/lpetool/selcue")) { ec->enableSelectionCue(); } lc->_lpetool_message_context = new Inkscape::MessageContext((ec->desktop)->messageStack()); }
/** * Checks the current tool and connects gradient aux toolbox signals if it happens to be the gradient tool. * Called every time the current tool changes by signal emission. */ static void gradient_toolbox_check_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder) { static sigc::connection connChanged; static sigc::connection connModified; static sigc::connection connSubselectionChanged; static sigc::connection connDefsRelease; static sigc::connection connDefsModified; if (SP_IS_GRADIENT_CONTEXT(ec)) { Inkscape::Selection *selection = sp_desktop_selection(desktop); SPDocument *document = sp_desktop_document(desktop); // connect to selection modified and changed signals connChanged = selection->connectChanged(sigc::bind(sigc::ptr_fun(&gr_tb_selection_changed), holder)); connModified = selection->connectModified(sigc::bind(sigc::ptr_fun(&gr_tb_selection_modified), holder)); connSubselectionChanged = desktop->connectToolSubselectionChanged(sigc::bind(sigc::ptr_fun(&gr_drag_selection_changed), holder)); // Is this necessary? Couldn't hurt. gr_tb_selection_changed(selection, holder); // connect to release and modified signals of the defs (i.e. when someone changes gradient) connDefsRelease = document->getDefs()->connectRelease(sigc::bind<1>(sigc::ptr_fun(&gr_defs_release), GTK_WIDGET(holder))); connDefsModified = document->getDefs()->connectModified(sigc::bind<2>(sigc::ptr_fun(&gr_defs_modified), GTK_WIDGET(holder))); } else { if (connChanged) connChanged.disconnect(); if (connModified) connModified.disconnect(); if (connSubselectionChanged) connSubselectionChanged.disconnect(); if (connDefsRelease) connDefsRelease.disconnect(); if (connDefsModified) connDefsModified.disconnect(); } }
GtkWidget * gr_change_widget (SPDesktop *desktop) { Inkscape::Selection *selection = sp_desktop_selection (desktop); SPDocument *document = sp_desktop_document (desktop); SPEventContext *ev = sp_desktop_event_context (desktop); SPGradient *gr_selected = NULL; bool gr_multi = false; SPGradientSpread spr_selected = (SPGradientSpread) INT_MAX; // meaning undefined bool spr_multi = false; GtkTooltips *tt = gtk_tooltips_new(); gr_read_selection (selection, ev? ev->get_drag() : NULL, &gr_selected, &gr_multi, &spr_selected, &spr_multi); GtkWidget *widget = gtk_hbox_new(FALSE, FALSE); gtk_object_set_data(GTK_OBJECT(widget), "dtw", desktop->canvas); g_object_set_data (G_OBJECT (widget), "desktop", desktop); GtkWidget *om = gr_vector_list (desktop, selection->isEmpty(), gr_selected, gr_multi); g_object_set_data (G_OBJECT (widget), "menu", om); gtk_box_pack_start (GTK_BOX (widget), om, TRUE, TRUE, 0); { GtkWidget *buttons = gtk_hbox_new(FALSE, 1); /* Edit... */ { GtkWidget *hb = gtk_hbox_new(FALSE, 1); GtkWidget *b = gtk_button_new_with_label(_("Edit...")); gtk_tooltips_set_tip(tt, b, _("Edit the stops of the gradient"), NULL); gtk_widget_show(b); gtk_container_add(GTK_CONTAINER(hb), b); gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(gr_edit), widget); gtk_box_pack_start (GTK_BOX(buttons), hb, FALSE, FALSE, 0); } gtk_box_pack_end (GTK_BOX(widget), buttons, FALSE, FALSE, 0); g_object_set_data (G_OBJECT(widget), "buttons", buttons); gtk_widget_set_sensitive (buttons, (gr_selected && !gr_multi)); } // connect to selection modified and changed signals sigc::connection *conn1 = new sigc::connection (selection->connectChanged( sigc::bind ( sigc::ptr_fun(&gr_tb_selection_changed), (gpointer)widget ) )); sigc::connection *conn2 = new sigc::connection (selection->connectModified( sigc::bind ( sigc::ptr_fun(&gr_tb_selection_modified), (gpointer)widget ) )); sigc::connection *conn3 = new sigc::connection (desktop->connectToolSubselectionChanged( sigc::bind ( sigc::ptr_fun(&gr_drag_selection_changed), (gpointer)widget ) )); // when widget is destroyed, disconnect g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), conn1); g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), conn2); g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), conn3); // connect to release and modified signals of the defs (i.e. when someone changes gradient) sigc::connection *release_connection = new sigc::connection(); *release_connection = SP_DOCUMENT_DEFS(document)->connectRelease(sigc::bind<1>(sigc::ptr_fun(&gr_defs_release), widget)); sigc::connection *modified_connection = new sigc::connection(); *modified_connection = SP_DOCUMENT_DEFS(document)->connectModified(sigc::bind<2>(sigc::ptr_fun(&gr_defs_modified), widget)); // when widget is destroyed, disconnect g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), release_connection); g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), modified_connection); gtk_widget_show_all (widget); return widget; }