diff --git a/src/gradient-drag.h b/src/gradient-drag.h
index 72e9ce0dd5a31d30d6b87f4ad8becf0306edaf03..a53acffe6fc0997bf703d41ca20f9bcf6ff0bf5f 100644 (file)
--- a/src/gradient-drag.h
+++ b/src/gradient-drag.h
*
* Authors:
* bulia byak <bulia@users.sf.net>
+ * Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
*
+ * Copyright (C) 2007 Johan Engelen
* Copyright (C) 2005 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
#include <vector>
#include <forward.h>
+#include <libnr/nr-forward.h>
+#include <2geom/point.h>
#include <knot-enums.h>
struct SPItem;
struct SPKnot;
-namespace NR {
-class Point;
-}
/**
This class represents a single draggable point of a gradient. It remembers the item
GrPointType enum), and the point number (needed if more than 2 stops are present).
*/
struct GrDraggable {
- GrDraggable(SPItem *item, guint point_type, guint point_i, bool fill_or_stroke);
- ~GrDraggable();
+ GrDraggable(SPItem *item, guint point_type, guint point_i, bool fill_or_stroke);
+ virtual ~GrDraggable();
- SPItem *item;
- guint point_type;
- guint point_i; // the stop number of this point ( = 0 for all types except POINT_LG_MID)
- bool fill_or_stroke;
+ SPItem *item;
+ gint point_type;
+ gint point_i; // the stop number of this point ( = 0 POINT_LG_BEGIN and POINT_RG_CENTER)
+ bool fill_or_stroke;
- bool mayMerge (GrDraggable *da2);
+ SPObject *getServer();
+
+ bool mayMerge (GrDraggable *da2);
inline int equals (GrDraggable *other) {
- return ((item == other->item) && (point_type == other->point_type) && (point_i == other->point_i) && (fill_or_stroke == other->fill_or_stroke));
+ return ((item == other->item) && (point_type == other->point_type) && (point_i == other->point_i) && (fill_or_stroke == other->fill_or_stroke));
}
};
-struct GrDrag;
+class GrDrag;
/**
This class holds together a visible on-canvas knot and a list of draggables that need to
@@ -54,91 +57,128 @@ be moved when the knot moves. Normally there's one draggable in the list, but th
be more when draggers are snapped together.
*/
struct GrDragger {
- GrDragger (GrDrag *parent, NR::Point p, GrDraggable *draggable);
- ~GrDragger();
+ GrDragger (GrDrag *parent, Geom::Point p, GrDraggable *draggable);
+ virtual ~GrDragger();
- GrDrag *parent;
+ GrDrag *parent;
- SPKnot *knot;
+ SPKnot *knot;
- // position of the knot, desktop coords
- NR::Point point;
- // position of the knot before it began to drag; updated when released
- NR::Point point_original;
+ // position of the knot, desktop coords
+ Geom::Point point;
+ // position of the knot before it began to drag; updated when released
+ Geom::Point point_original;
- /** Connection to \a knot's "moved" signal, for blocking it (unused?). */
- guint handler_id;
+ /** Connection to \a knot's "moved" signal, for blocking it (unused?). */
+ guint handler_id;
- GSList *draggables;
+ GSList *draggables;
- void addDraggable(GrDraggable *draggable);
+ void addDraggable(GrDraggable *draggable);
- void updateKnotShape();
- void updateTip();
+ void updateKnotShape();
+ void updateTip();
+
+ void select();
+ void deselect();
+ bool isSelected();
- void moveThisToDraggable (SPItem *item, guint point_type, guint point_i, bool fill_or_stroke, bool write_repr);
- void moveOtherToDraggable (SPItem *item, guint point_type, guint point_i, bool fill_or_stroke, bool write_repr);
- void updateDependencies (bool write_repr);
+ void moveThisToDraggable (SPItem *item, gint point_type, gint point_i, bool fill_or_stroke, bool write_repr);
+ void moveOtherToDraggable (SPItem *item, gint point_type, gint point_i, bool fill_or_stroke, bool write_repr);
+ void updateMidstopDependencies (GrDraggable *draggable, bool write_repr);
+ void updateDependencies (bool write_repr);
- bool mayMerge (GrDragger *other);
- bool mayMerge (GrDraggable *da2);
+ bool mayMerge (GrDragger *other);
+ bool mayMerge (GrDraggable *da2);
- bool isA (guint point_type);
- bool isA (SPItem *item, guint point_type, guint point_i, bool fill_or_stroke);
+ bool isA (gint point_type);
+ bool isA (SPItem *item, gint point_type, bool fill_or_stroke);
+ bool isA (SPItem *item, gint point_type, gint point_i, bool fill_or_stroke);
- void fireDraggables (bool write_repr, bool scale_radial = false, bool merging_focus = false);
+ void fireDraggables (bool write_repr, bool scale_radial = false, bool merging_focus = false);
};
/**
This is the root class of the gradient dragging machinery. It holds lists of GrDraggers
and of lines (simple canvas items). It also remembers one of the draggers as selected.
*/
-struct GrDrag {
- GrDrag(SPDesktop *desktop);
- ~GrDrag();
+class GrDrag {
+public: // FIXME: make more of this private!
+
+ GrDrag(SPDesktop *desktop);
+ virtual ~GrDrag();
+
+ bool isNonEmpty() {return (draggers != NULL);}
+ bool hasSelection() {return (selected != NULL);}
+ guint numSelected() {return (selected? g_list_length(selected) : 0);}
+ guint numDraggers() {return (draggers? g_list_length(draggers) : 0);}
+ guint singleSelectedDraggerNumDraggables() {return (selected? g_slist_length(((GrDragger *) selected->data)->draggables) : 0);}
+ guint singleSelectedDraggerSingleDraggableType() {return (selected? ((GrDraggable *) ((GrDragger *) selected->data)->draggables->data)->point_type : 0);}
+
+ // especially the selection must be private, fix gradient-context to remove direct access to it
+ GList *selected; // list of GrDragger*
+ void setSelected (GrDragger *dragger, bool add_to_selection = false, bool override = true);
+ void setDeselected (GrDragger *dragger);
+ void deselectAll();
+ void selectAll();
+ void selectByCoords(std::vector<Geom::Point> coords);
+ void selectRect(Geom::Rect const &r);
+
+ bool dropColor(SPItem *item, gchar const *c, Geom::Point p);
+
+ SPStop *addStopNearPoint (SPItem *item, Geom::Point mouse_p, double tolerance);
+
+ void deleteSelected (bool just_one = false);
+
+ guint32 getColor();
+
+ bool keep_selection;
+
+ GrDragger *getDraggerFor (SPItem *item, gint point_type, gint point_i, bool fill_or_stroke);
- void addLine (NR::Point p1, NR::Point p2, guint32 rgba);
+ void grabKnot (GrDragger *dragger, gint x, gint y, guint32 etime);
+ void grabKnot (SPItem *item, gint point_type, gint point_i, bool fill_or_stroke, gint x, gint y, guint32 etime);
- void addDragger (GrDraggable *draggable);
+ bool local_change;
- void addDraggersRadial (SPRadialGradient *rg, SPItem *item, bool fill_or_stroke);
- void addDraggersLinear (SPLinearGradient *lg, SPItem *item, bool fill_or_stroke);
+ SPDesktop *desktop;
- GrDragger *selected;
- void setSelected (GrDragger *dragger);
+ // lists of edges of selection bboxes, to snap draggers to
+ std::vector<double> hor_levels;
+ std::vector<double> vert_levels;
- GrDragger *getDraggerFor (SPItem *item, guint point_type, guint point_i, bool fill_or_stroke);
+ GList *draggers;
+ GSList *lines;
- void grabKnot (SPItem *item, guint point_type, guint point_i, bool fill_or_stroke, gint x, gint y, guint32 etime);
+ void updateDraggers ();
+ void updateLines ();
+ void updateLevels ();
- bool local_change;
+ void selected_move_nowrite (double x, double y, bool scale_radial);
+ void selected_move (double x, double y, bool write_repr = true, bool scale_radial = false);
+ void selected_move_screen (double x, double y);
- SPDesktop *desktop;
- Inkscape::Selection *selection;
- sigc::connection sel_changed_connection;
- sigc::connection sel_modified_connection;
+ GrDragger *select_next ();
+ GrDragger *select_prev ();
- sigc::connection style_set_connection;
- sigc::connection style_query_connection;
+ void selected_reverse_vector ();
- // lists of edges of selection bboxes, to snap draggers to
- std::vector<double> hor_levels;
- std::vector<double> vert_levels;
+private:
+ void deselect_all();
- GList *draggers;
- GSList *lines;
+ void addLine (SPItem *item, Geom::Point p1, Geom::Point p2, guint32 rgba);
- void updateDraggers ();
- void updateLines ();
- void updateLevels ();
+ void addDragger (GrDraggable *draggable);
- void selected_move (double x, double y);
- void selected_move_screen (double x, double y);
+ void addDraggersRadial (SPRadialGradient *rg, SPItem *item, bool fill_or_stroke);
+ void addDraggersLinear (SPLinearGradient *lg, SPItem *item, bool fill_or_stroke);
- void select_next ();
- void select_prev ();
+ Inkscape::Selection *selection;
+ sigc::connection sel_changed_connection;
+ sigc::connection sel_modified_connection;
- void selected_reverse_vector ();
+ sigc::connection style_set_connection;
+ sigc::connection style_query_connection;
};
#endif