From: johanengelen Date: Sun, 2 Mar 2008 22:01:12 +0000 (+0000) Subject: remove flashing test indicator on pointparam. X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=5dae8b7fdd5f82060b96b68ac7abcc524b855e7b;p=inkscape.git remove flashing test indicator on pointparam. remove some leftover code from point param code remove test pointparam from LPEKnot added SnapIndicator added SnapIndicator to SPDesktop, and a call from guidesnapping to display a snapindicator when a guide is snapped. fix canvas-temporary-item-list.cpp --- diff --git a/src/desktop-events.cpp b/src/desktop-events.cpp index 1351d62f0..e115a744a 100644 --- a/src/desktop-events.cpp +++ b/src/desktop-events.cpp @@ -17,6 +17,7 @@ #include #include #include "display/guideline.h" +#include "display/snap-indicator.h" #include "helper/unit-menu.h" #include "helper/units.h" #include "desktop.h" @@ -142,11 +143,16 @@ static gint sp_dt_ruler_event(GtkWidget *widget, GdkEvent *event, SPDesktopWidge NR::Point event_dt(desktop->w2d(event_w)); SnapManager const &m = desktop->namedview->snap_manager; - event_dt = m.guideSnap(event_dt, normal).getPoint(); - + Inkscape::SnappedPoint snappoint = m.guideSnap(event_dt, normal); + event_dt = snappoint.getPoint(); + sp_guideline_set_position(SP_GUIDELINE(guide), event_dt.to_2geom()); desktop->set_coordinate_status(event_dt); desktop->setPosition (event_dt); + + if (snappoint.getDistance() < NR_HUGE) { + desktop->snapindicator->set_new_snappoint(snappoint.getPoint().to_2geom()); + } } break; case GDK_BUTTON_RELEASE: @@ -238,12 +244,18 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data) // This is for snapping while dragging existing guidelines. New guidelines, // which are dragged off the ruler, are being snapped in sp_dt_ruler_event SnapManager const &m = desktop->namedview->snap_manager; - motion_dt = m.guideSnap(motion_dt, guide->normal_to_line).getPoint(); - + Inkscape::SnappedPoint snappoint = m.guideSnap(motion_dt, guide->normal_to_line); + motion_dt = snappoint.getPoint(); + sp_guide_moveto(*guide, motion_dt.to_2geom(), false); moved = true; desktop->set_coordinate_status(motion_dt); desktop->setPosition (motion_dt); + + if (snappoint.getDistance() < NR_HUGE) { + desktop->snapindicator->set_new_snappoint(snappoint.getPoint().to_2geom()); + } + ret = TRUE; } break; diff --git a/src/desktop.cpp b/src/desktop.cpp index 65025027a..3ff4bf2f5 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -78,6 +78,7 @@ #include "display/sodipodi-ctrlrect.h" #include "display/sp-canvas-util.h" #include "display/canvas-temporary-item-list.h" +#include "display/snap-indicator.h" #include "libnr/nr-matrix-div.h" #include "libnr/nr-rect-ops.h" #include "ui/dialog/dialog-manager.h" @@ -117,6 +118,7 @@ SPDesktop::SPDesktop() : layer_manager( 0 ), event_log( 0 ), temporary_item_list( 0 ), + snapindicator( 0 ), acetate( 0 ), main( 0 ), gridgroup( 0 ), @@ -316,13 +318,20 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas) showGrids(namedview->grids_visible, false); temporary_item_list = new Inkscape::Display::TemporaryItemList( this ); + snapindicator = new Inkscape::Display::SnapIndicator ( this ); } void SPDesktop::destroy() { - delete temporary_item_list; - temporary_item_list = NULL; + if (snapindicator) { + delete snapindicator; + snapindicator = NULL; + } + if (temporary_item_list) { + delete temporary_item_list; + temporary_item_list = NULL; + } namedview->hide(this); @@ -393,7 +402,10 @@ SPDesktop::add_temporary_canvasitem (SPCanvasItem *item, guint lifetime) void SPDesktop::remove_temporary_canvasitem (Inkscape::Display::TemporaryItem * tempitem) { - temporary_item_list->delete_item(tempitem); + // check for non-null temporary_item_list, because during destruction of desktop, some destructor might try to access this list! + if (tempitem && temporary_item_list) { + temporary_item_list->delete_item(tempitem); + } } void SPDesktop::setDisplayModeNormal() diff --git a/src/desktop.h b/src/desktop.h index bb05331b6..1435eea6f 100644 --- a/src/desktop.h +++ b/src/desktop.h @@ -75,6 +75,7 @@ namespace Inkscape { namespace Display { class TemporaryItemList; class TemporaryItem; + class SnapIndicator; } } @@ -95,6 +96,7 @@ struct SPDesktop : public Inkscape::UI::View::View Inkscape::EventLog *event_log; Inkscape::Display::TemporaryItemList *temporary_item_list; + Inkscape::Display::SnapIndicator *snapindicator; SPCanvasItem *acetate; SPCanvasGroup *main; diff --git a/src/display/Makefile_insert b/src/display/Makefile_insert index 61cb02155..d7b0fb608 100644 --- a/src/display/Makefile_insert +++ b/src/display/Makefile_insert @@ -55,6 +55,8 @@ display_libspdisplay_a_SOURCES = \ display/nr-plain-stuff-gdk.h \ display/nr-plain-stuff.cpp \ display/nr-plain-stuff.h \ + display/snap-indicator.cpp \ + display/snap-indicator.h \ display/sodipodi-ctrl.cpp \ display/sodipodi-ctrl.h \ display/sodipodi-ctrlrect.cpp \ diff --git a/src/display/canvas-temporary-item-list.cpp b/src/display/canvas-temporary-item-list.cpp index 5b92e1828..54e81a1f0 100644 --- a/src/display/canvas-temporary-item-list.cpp +++ b/src/display/canvas-temporary-item-list.cpp @@ -37,11 +37,11 @@ TemporaryItemList::~TemporaryItemList() TemporaryItem * TemporaryItemList::add_item(SPCanvasItem *item, guint lifetime) { - if (lifetime > 100) { // beware of strange things happening due to very short timeouts - TemporaryItem * tempitem = new TemporaryItem(item, lifetime); - itemlist.push_back(tempitem); - tempitem->signal_timeout.connect( sigc::mem_fun(*this, &TemporaryItemList::_item_timeout) ); - } + // beware of strange things happening due to very short timeouts + TemporaryItem * tempitem = new TemporaryItem(item, lifetime); + itemlist.push_back(tempitem); + tempitem->signal_timeout.connect( sigc::mem_fun(*this, &TemporaryItemList::_item_timeout) ); + return tempitem; } void diff --git a/src/display/display-forward.h b/src/display/display-forward.h index a28b7d03a..191aac61f 100644 --- a/src/display/display-forward.h +++ b/src/display/display-forward.h @@ -11,6 +11,12 @@ struct SPCanvasGroup; struct SPCanvasGroupClass; struct SPCurve; +namespace Inkscape { +namespace Display { + class TemporaryItem; + class TemporaryItemList; +} +} #define SP_TYPE_CANVAS_ITEM (sp_canvas_item_get_type()) #define SP_CANVAS_ITEM(obj) (GTK_CHECK_CAST((obj), SP_TYPE_CANVAS_ITEM, SPCanvasItem)) diff --git a/src/display/snap-indicator.cpp b/src/display/snap-indicator.cpp new file mode 100644 index 000000000..1d005ceb8 --- /dev/null +++ b/src/display/snap-indicator.cpp @@ -0,0 +1,76 @@ +/** \file + * Provides a class that shows a temporary indicator on the canvas of where the snap was, and what kind of snap + * + * Authors: + * Johan Engelen + * + * Copyright (C) Johan Engelen 2008 + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include "display/snap-indicator.h" + +#include "desktop.h" +#include "desktop-handles.h" +#include "display/sodipodi-ctrl.h" +#include "knot.h" + +namespace Inkscape { +namespace Display { + +/** lifetime is measured in milliseconds + */ +SnapIndicator::SnapIndicator(SPDesktop * desktop) + : tempitem(NULL), + desktop(desktop) +{ +} + +SnapIndicator::~SnapIndicator() +{ + // remove item that might be present + remove_snappoint(); +} + +void +SnapIndicator::set_new_snappoint(Geom::Point p) +{ + remove_snappoint(); + + SPCanvasItem * canvasitem = sp_canvas_item_new( sp_desktop_tempgroup (desktop), + SP_TYPE_CTRL, + "anchor", GTK_ANCHOR_CENTER, + "size", 6.0, + "stroked", TRUE, + "stroke_color", 0xf000f0ff, + "mode", SP_KNOT_MODE_XOR, + "shape", SP_KNOT_SHAPE_CROSS, + NULL ); + SP_CTRL(canvasitem)->moveto ( p ); + tempitem = desktop->add_temporary_canvasitem(canvasitem, 2000); +} + +void +SnapIndicator::remove_snappoint() +{ + if (tempitem) { + desktop->remove_temporary_canvasitem(tempitem); + tempitem = NULL; + } +} + + +} //namespace Display +} /* namespace Inkscape */ + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 : diff --git a/src/display/snap-indicator.h b/src/display/snap-indicator.h new file mode 100644 index 000000000..bedeb492b --- /dev/null +++ b/src/display/snap-indicator.h @@ -0,0 +1,53 @@ +#ifndef INKSCAPE_DISPLAY_SNAP_INDICATOR_H +#define INKSCAPE_DISPLAY_SNAP_INDICATOR_H + +/** \file + * Provides a class that shows a temporary indicator on the canvas of where the snap was, and what kind of snap + * + * Authors: + * Johan Engelen + * + * Copyright (C) Johan Engelen 2008 + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include "forward.h" +#include "display/display-forward.h" +#include <2geom/point.h> + +namespace Inkscape { +namespace Display { + +class SnapIndicator { +public: + SnapIndicator(SPDesktop *desktop); + virtual ~SnapIndicator(); + + void set_new_snappoint(Geom::Point p); + void remove_snappoint(); + +protected: + TemporaryItem * tempitem; + SPDesktop *desktop; + +private: + SnapIndicator(const SnapIndicator&); + SnapIndicator& operator=(const SnapIndicator&); +}; + +} //namespace Display +} //namespace Inkscape + +#endif + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 : diff --git a/src/live_effects/lpe-knot.h b/src/live_effects/lpe-knot.h index f456ab2ce..a030f7567 100644 --- a/src/live_effects/lpe-knot.h +++ b/src/live_effects/lpe-knot.h @@ -16,7 +16,6 @@ #include "live_effects/effect.h" #include "live_effects/parameter/parameter.h" -#include "live_effects/parameter/point.h" namespace Inkscape { namespace LivePathEffect { diff --git a/src/live_effects/parameter/point.cpp b/src/live_effects/parameter/point.cpp index 38bf4be57..075f7544f 100644 --- a/src/live_effects/parameter/point.cpp +++ b/src/live_effects/parameter/point.cpp @@ -24,12 +24,6 @@ #include "desktop.h" #include "selection.h" -// temporarily needed for tempitem tryout -#include "desktop-handles.h" -#include "display/sodipodi-ctrl.h" -#include "knot.h" -#include "display/canvas-temporary-item-list.h" - #define LPEPOINTPARAM_DEBUG // undefine to disable all on-canvas editing code for PointParam namespace Inkscape { @@ -41,7 +35,6 @@ PointParam::PointParam( const Glib::ustring& label, const Glib::ustring& tip, Effect* effect, Geom::Point default_value ) : Geom::Point(default_value), Parameter(label, tip, key, wr, effect), defvalue(default_value) { - knot = NULL; #ifdef LPEPOINTPARAM_DEBUG oncanvas_editable = true; #endif @@ -49,8 +42,6 @@ PointParam::PointParam( const Glib::ustring& label, const Glib::ustring& tip, PointParam::~PointParam() { - if (knot) - g_object_unref (G_OBJECT (knot)); } void @@ -144,22 +135,6 @@ PointParam::param_editOncanvas(SPItem * item, SPDesktop * dt) ShapeEditor * shape_editor = SP_NODE_CONTEXT( dt->event_context )->shape_editor; shape_editor->set_item_lpe_point_parameter(item, SP_OBJECT(param_effect->getLPEObj()), param_key.c_str()); - - - /* TEMPORARY CODE TO TEST TEMPORARY CANVAS ITEMS */ - SPDesktop *desktop = SP_ACTIVE_DESKTOP; - SPCanvasItem * canvasitem = sp_canvas_item_new( sp_desktop_tempgroup (desktop), - SP_TYPE_CTRL, - "anchor", GTK_ANCHOR_CENTER, - "size", 8.0, - "stroked", TRUE, - "stroke_color", 0xf000f0ff, - "mode", SP_KNOT_MODE_XOR, - "shape", SP_KNOT_SHAPE_CROSS, - NULL ); - SP_CTRL(canvasitem)->moveto ( static_cast (*this) ); - desktop->add_temporary_canvasitem(canvasitem, 2000); - /* END ---- TEMPORARY CODE TO TEST TEMPORARY CANVAS ITEMS */ } diff --git a/src/live_effects/parameter/point.h b/src/live_effects/parameter/point.h index a6866f7df..c167807d9 100644 --- a/src/live_effects/parameter/point.h +++ b/src/live_effects/parameter/point.h @@ -16,8 +16,6 @@ #include "live_effects/parameter/parameter.h" -struct SPKnot; - namespace Inkscape { namespace LivePathEffect { @@ -53,8 +51,6 @@ private: void on_button_click(); - SPKnot *knot; - Geom::Point defvalue; };