pen-tool.h revision baaf66e2658cf2ae9c9a2413f3e7dcd20d2363dc
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick#ifndef SEEN_PEN_CONTEXT_H
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick#define SEEN_PEN_CONTEXT_H
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
32512d3117077508d22c9dd28803184c7072e8e4Alexandre Prokoudine/** \file
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick * PenTool: a context for pen tool events.
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick */
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick#include "ui/tools/freehand-base.h"
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick#include "live_effects/effect.h"
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick#define SP_PEN_CONTEXT(obj) (dynamic_cast<Inkscape::UI::Tools::PenTool*>((Inkscape::UI::Tools::ToolBase*)obj))
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick#define SP_IS_PEN_CONTEXT(obj) (dynamic_cast<const Inkscape::UI::Tools::PenTool*>((const Inkscape::UI::Tools::ToolBase*)obj) != NULL)
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nickstruct SPCtrlLine;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nicknamespace Inkscape {
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nicknamespace UI {
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nicknamespace Tools {
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick/**
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick * PenTool: a context for pen tool events.
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick */
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nickclass PenTool : public FreehandBase {
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nickpublic:
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick PenTool();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick PenTool(gchar const *const *cursor_shape, gint hot_x, gint hot_y);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick virtual ~PenTool();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick enum Mode {
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick MODE_CLICK,
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick MODE_DRAG
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick };
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick enum State {
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick POINT,
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick CONTROL,
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick CLOSE,
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick STOP
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick };
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick Geom::Point p[5];
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick /** \invar npoints in {0, 2, 5}. */
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick // npoints somehow determines the type of the node (what does it mean, exactly? the number of Bezier handles?)
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick gint npoints;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick Mode mode;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick State state;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick bool polylines_only;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick bool polylines_paraxial;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: propiedad que guarda si el modo Spiro está activo o no
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick bool spiro;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick bool bspline;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick int num_clicks;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick unsigned int expecting_clicks_for_LPE; // if positive, finish the path after this many clicks
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick Inkscape::LivePathEffect::Effect *waiting_LPE; // if NULL, waiting_LPE_type in SPDrawContext is taken into account
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick SPLPEItem *waiting_item;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick SPCanvasItem *c0;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick SPCanvasItem *c1;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick SPCtrlLine *cl0;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick SPCtrlLine *cl1;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick bool events_disabled;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick static const std::string prefsPath;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick virtual const std::string& getPrefsPath();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick int nextParaxialDirection(Geom::Point const &pt, Geom::Point const &origin, guint state) const;
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void setPolylineMode();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick bool hasWaitingLPE();
05445c57397b3e794e8d49df2f80af94d294da78JazzyNico void waitForLPEMouseClicks(Inkscape::LivePathEffect::EffectType effect_type, unsigned int num_clicks, bool use_polylines = true);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nickprotected:
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick virtual void setup();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick virtual void finish();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick virtual void set(const Inkscape::Preferences::Entry& val);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick virtual bool root_handler(GdkEvent* event);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick virtual bool item_handler(SPItem* item, GdkEvent* event);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nickprivate:
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick gint _handleButtonPress(GdkEventButton const &bevent);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick gint _handleMotionNotify(GdkEventMotion const &mevent);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick gint _handleButtonRelease(GdkEventButton const &revent);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick gint _handle2ButtonPress(GdkEventButton const &bevent);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick gint _handleKeyPress(GdkEvent *event);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: añade los modos spiro y bspline
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _pen_context_set_mode(guint mode);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: esta función cambia los colores rojo,verde y azul haciendolos transparentes o no en función de si se usa spiro
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_spiro_color();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: crea un nodo en modo bspline o spiro
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_spiro(bool shift);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: crea un nodo de modo spiro o bspline
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_spiro_on();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: crea un nodo de tipo CUSP
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_spiro_off();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: continua una curva existente en modo bspline o spiro
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_spiro_start_anchor(bool shift);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: continua una curva exsitente con el nodo de union en modo bspline o spiro
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_spiro_start_anchor_on();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: continua una curva existente con el nodo de union en modo CUSP
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_spiro_start_anchor_off();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: modifica la "red_curve" cuando se detecta movimiento
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_spiro_motion(bool shift);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: cierra la curva con el último nodo en modo bspline o spiro
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_spiro_end_anchor_on();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: cierra la curva con el último nodo en modo CUSP
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_spiro_end_anchor_off();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //spanish: unimos todas las curvas en juego y llamamos a la función doEffect.
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_spiro_build();
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //function bspline cloned from lpe-bspline.cpp
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _bspline_doEffect(SPCurve * curve);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick //function spiro cloned from lpe-spiro.cpp
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _spiro_doEffect(SPCurve * curve);
7765ee8964c8ffd7faee9baa0412abeb1ef5b0a4Nick void _setInitialPoint(Geom::Point const p);
void _setSubsequentPoint(Geom::Point const p, bool statusbar, guint status = 0);
void _setCtrl(Geom::Point const p, guint state);
void _finishSegment(Geom::Point p, guint state);
void _finish(gboolean closed);
void _resetColors();
void _disableEvents();
void _enableEvents();
void _setToNearestHorizVert(Geom::Point &pt, guint const state, bool snap) const;
void _setAngleDistanceStatusMessage(Geom::Point const p, int pc_point_to_compare, gchar const *message);
void _lastpointToLine();
void _lastpointToCurve();
void _lastpointMoveScreen(gdouble x, gdouble y);
void _lastpointMove(gdouble x, gdouble y);
void _redrawAll();
void _endpointSnapHandle(Geom::Point &p, guint const state) const;
void _endpointSnap(Geom::Point &p, guint const state) const;
void _cancel();
};
}
}
}
#endif /* !SEEN_PEN_CONTEXT_H */
/*
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:fileencoding=utf-8:textwidth=99 :