X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdocument.h;h=e70582006f92ac3d2327d69ab4a19284923b0c49;hb=3fb170a90f9685e783f143880517c9d58fff83c9;hp=f7ce73fe8d2e629ab0cd1aaa611b80e7fa084b33;hpb=4ec52515516e3a6bf2fbc3ed01a7e179bde16d20;p=inkscape.git diff --git a/src/document.h b/src/document.h index f7ce73fe8..e70582006 100644 --- a/src/document.h +++ b/src/document.h @@ -3,8 +3,8 @@ /** \file * SPDocument: Typed SVG document implementation - * - * Authors: + */ +/* Authors: * Lauris Kaplinski * MenTaLguY * @@ -21,13 +21,15 @@ #include #include "libcroco/cr-cascade.h" -#include "libnr/nr-forward.h" +#include <2geom/forward.h> #include "gc-managed.h" #include "gc-finalized.h" #include "gc-anchored.h" #include #include "verbs.h" +#include +#include namespace Avoid { class Router; @@ -44,100 +46,147 @@ namespace Inkscape { class Selection; class UndoStackObserver; class EventLog; + class ProfileManager; namespace XML { class Document; class Node; } } +class SP3DBox; +class Persp3D; +class Persp3DImpl; + +namespace Proj { + class TransfMat3x4; +} + class SPDocumentPrivate; /// Typed SVG document implementation. struct SPDocument : public Inkscape::GC::Managed<>, public Inkscape::GC::Finalized, - public Inkscape::GC::Anchored + public Inkscape::GC::Anchored { - typedef sigc::signal IDChangedSignal; - typedef sigc::signal ResourcesChangedSignal; - typedef sigc::signal ModifiedSignal; - typedef sigc::signal URISetSignal; - typedef sigc::signal ResizedSignal; - typedef sigc::signal ReconstructionStart; - typedef sigc::signal ReconstructionFinish; - - SPDocument(); - ~SPDocument(); - - unsigned int keepalive : 1; - unsigned int virgin : 1; ///< Has the document never been touched? - - Inkscape::XML::Document *rdoc; ///< Our Inkscape::XML::Document - Inkscape::XML::Node *rroot; ///< Root element of Inkscape::XML::Document - SPObject *root; ///< Our SPRoot - CRCascade *style_cascade; - - gchar *uri; ///< URI string or NULL - gchar *base; - gchar *name; - - SPDocumentPrivate *priv; - - /// Last action key - const gchar *actionkey; - /// Handler ID - guint modified_id; + typedef sigc::signal IDChangedSignal; + typedef sigc::signal ResourcesChangedSignal; + typedef sigc::signal ModifiedSignal; + typedef sigc::signal URISetSignal; + typedef sigc::signal ResizedSignal; + typedef sigc::signal ReconstructionStart; + typedef sigc::signal ReconstructionFinish; + typedef sigc::signal CommitSignal; + + SPDocument(); + virtual ~SPDocument(); + + unsigned int keepalive : 1; + unsigned int virgin : 1; ///< Has the document never been touched? + unsigned int modified_since_save : 1; + + Inkscape::XML::Document *rdoc; ///< Our Inkscape::XML::Document + Inkscape::XML::Node *rroot; ///< Root element of Inkscape::XML::Document + SPObject *root; ///< Our SPRoot + CRCascade *style_cascade; + + gchar *uri; ///< A filename (not a URI yet), or NULL + gchar *base; ///< To be used for resolving relative hrefs. + gchar *name; ///< basename(uri) or other human-readable label for the document. + + SPDocumentPrivate *priv; + + /// Last action key + const gchar *actionkey; + /// Handler ID + guint modified_id; + + /// Connector rerouting handler ID + guint rerouting_handler_id; + + Inkscape::ProfileManager* profileManager; + + // Instance of the connector router + Avoid::Router *router; + + GSList *_collection_queue; + + bool oldSignalsConnected; + + void setCurrentPersp3D(Persp3D * const persp); + inline void setCurrentPersp3DImpl(Persp3DImpl * const persp_impl) { current_persp3d_impl = persp_impl; } + /* + * getCurrentPersp3D returns current_persp3d (if non-NULL) or the first + * perspective in the defs. If no perspective exists, returns NULL. + */ + Persp3D * getCurrentPersp3D(); + Persp3DImpl * getCurrentPersp3DImpl(); + void getPerspectivesInDefs(std::vector &list); + unsigned int numPerspectivesInDefs() { + std::vector list; + getPerspectivesInDefs(list); + return list.size(); + } - // Instance of the connector router - Avoid::Router *router; + //void initialize_current_persp3d(); - sigc::connection connectModified(ModifiedSignal::slot_type slot); - sigc::connection connectURISet(URISetSignal::slot_type slot); - sigc::connection connectResized(ResizedSignal::slot_type slot); + sigc::connection connectModified(ModifiedSignal::slot_type slot); + sigc::connection connectURISet(URISetSignal::slot_type slot); + sigc::connection connectResized(ResizedSignal::slot_type slot); +sigc::connection connectCommit(CommitSignal::slot_type slot); - void bindObjectToId(gchar const *id, SPObject *object); - SPObject *getObjectById(gchar const *id); - sigc::connection connectIdChanged(const gchar *id, IDChangedSignal::slot_type slot); + void bindObjectToId(gchar const *id, SPObject *object); + SPObject *getObjectById(gchar const *id); + sigc::connection connectIdChanged(const gchar *id, IDChangedSignal::slot_type slot); - void bindObjectToRepr(Inkscape::XML::Node *repr, SPObject *object); - SPObject *getObjectByRepr(Inkscape::XML::Node *repr); + void bindObjectToRepr(Inkscape::XML::Node *repr, SPObject *object); + SPObject *getObjectByRepr(Inkscape::XML::Node *repr); Glib::ustring getLanguage(); - void queueForOrphanCollection(SPObject *object); - void collectOrphans(); + void queueForOrphanCollection(SPObject *object); + void collectOrphans(); - void _emitModified(); + void _emitModified(); - GSList *_collection_queue; + void addUndoObserver(Inkscape::UndoStackObserver& observer); + void removeUndoObserver(Inkscape::UndoStackObserver& observer); - void addUndoObserver(Inkscape::UndoStackObserver& observer); - void removeUndoObserver(Inkscape::UndoStackObserver& observer); + bool _updateDocument(); - Inkscape::EventLog& getEventLog() const; + /// Are we currently in a transition between two "known good" states of the document? + bool isSeeking() const; + + bool isModifiedSinceSave() const { return modified_since_save; } + void setModifiedSinceSave(bool modified = true) { + modified_since_save = modified; + } private: - SPDocument(SPDocument const &); // no copy - void operator=(SPDocument const &); // no assign + SPDocument(SPDocument const &); // no copy + void operator=(SPDocument const &); // no assign + + Persp3D *current_persp3d; /**< Currently 'active' perspective (to which, e.g., newly created boxes are attached) */ + Persp3DImpl *current_persp3d_impl; public: - sigc::connection connectReconstructionStart(ReconstructionStart::slot_type slot); - sigc::connection connectReconstructionFinish (ReconstructionFinish::slot_type slot); - void emitReconstructionStart (void); - void emitReconstructionFinish (void); + sigc::connection connectReconstructionStart(ReconstructionStart::slot_type slot); + sigc::connection connectReconstructionFinish(ReconstructionFinish::slot_type slot); + void emitReconstructionStart(void); + void emitReconstructionFinish(void); - void reset_key (void *dummy); - sigc::connection _selection_changed_connection; - sigc::connection _desktop_activated_connection; + unsigned long serial() const; + void reset_key(void *dummy); + sigc::connection _selection_changed_connection; + sigc::connection _desktop_activated_connection; - void fitToRect(NRRect const & rect); + void fitToRect(Geom::Rect const &rect, bool with_margins = false); }; -SPDocument *sp_document_new (const gchar *uri, unsigned int keepalive, bool make_new = false); -SPDocument *sp_document_new_from_mem (const gchar *buffer, gint length, unsigned int keepalive); -SPDocument *sp_document_new_dummy(); +SPDocument *sp_document_new(const gchar *uri, unsigned int keepalive, bool make_new = false); +SPDocument *sp_document_new_from_mem(const gchar *buffer, gint length, unsigned int keepalive); -SPDocument *sp_document_ref (SPDocument *doc); -SPDocument *sp_document_unref (SPDocument *doc); +SPDocument *sp_document_ref(SPDocument *doc); +SPDocument *sp_document_unref(SPDocument *doc); SPDocument *sp_document_create(Inkscape::XML::Document *rdoc, gchar const *uri, gchar const *base, gchar const *name, unsigned int keepalive); @@ -149,17 +198,18 @@ SPDocument *sp_document_create(Inkscape::XML::Document *rdoc, gchar const *uri, #define sp_document_repr_doc(d) (d->rdoc) #define sp_document_repr_root(d) (d->rroot) #define sp_document_root(d) (d->root) -#define SP_DOCUMENT_ROOT(d) (d->root) +#define SP_DOCUMENT_ROOT(d) (d->root) -gdouble sp_document_width (SPDocument * document); -gdouble sp_document_height (SPDocument * document); +gdouble sp_document_width(SPDocument *document); +gdouble sp_document_height(SPDocument *document); +Geom::Point sp_document_dimensions(SPDocument *document); struct SPUnit; -void sp_document_set_width (SPDocument * document, gdouble width, const SPUnit *unit); -void sp_document_set_height (SPDocument * document, gdouble height, const SPUnit *unit); +void sp_document_set_width(SPDocument *document, gdouble width, const SPUnit *unit); +void sp_document_set_height(SPDocument *document, gdouble height, const SPUnit *unit); -#define SP_DOCUMENT_URI(d) (d->uri) +#define SP_DOCUMENT_URI(d) (d->uri) #define SP_DOCUMENT_NAME(d) (d->name) #define SP_DOCUMENT_BASE(d) (d->base) @@ -171,38 +221,38 @@ void sp_document_set_height (SPDocument * document, gdouble height, const SPUnit * Undo & redo */ -void sp_document_set_undo_sensitive (SPDocument * document, gboolean sensitive); -gboolean sp_document_get_undo_sensitive (SPDocument const * document); +void sp_document_set_undo_sensitive(SPDocument *document, bool sensitive); +bool sp_document_get_undo_sensitive(SPDocument const *document); -void sp_document_clear_undo (SPDocument * document); -void sp_document_clear_redo (SPDocument * document); +void sp_document_clear_undo(SPDocument *document); +void sp_document_clear_redo(SPDocument *document); -void sp_document_child_added (SPDocument *doc, SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref); -void sp_document_child_removed (SPDocument *doc, SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref); -void sp_document_attr_changed (SPDocument *doc, SPObject *object, const gchar *key, const gchar *oldval, const gchar *newval); -void sp_document_content_changed (SPDocument *doc, SPObject *object, const gchar *oldcontent, const gchar *newcontent); -void sp_document_order_changed (SPDocument *doc, SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *oldref, Inkscape::XML::Node *newref); +void sp_document_child_added(SPDocument *doc, SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref); +void sp_document_child_removed(SPDocument *doc, SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref); +void sp_document_attr_changed(SPDocument *doc, SPObject *object, const gchar *key, const gchar *oldval, const gchar *newval); +void sp_document_content_changed(SPDocument *doc, SPObject *object, const gchar *oldcontent, const gchar *newcontent); +void sp_document_order_changed(SPDocument *doc, SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *oldref, Inkscape::XML::Node *newref); /* Object modification root handler */ -void sp_document_request_modified (SPDocument *doc); -gint sp_document_ensure_up_to_date (SPDocument *doc); +void sp_document_request_modified(SPDocument *doc); +gint sp_document_ensure_up_to_date(SPDocument *doc); /* Save all previous actions to stack, as one undo step */ -void sp_document_done (SPDocument *document, unsigned int event_type, Glib::ustring event_description); -void sp_document_maybe_done (SPDocument *document, const gchar *keyconst, unsigned int event_type, Glib::ustring event_description); -void sp_document_reset_key (Inkscape::Application *inkscape, SPDesktop *desktop, GtkObject *base); +void sp_document_done(SPDocument *document, unsigned int event_type, Glib::ustring event_description); +void sp_document_maybe_done(SPDocument *document, const gchar *keyconst, unsigned int event_type, Glib::ustring event_description); +void sp_document_reset_key(Inkscape::Application *inkscape, SPDesktop *desktop, GtkObject *base); /* Cancel (and revert) current unsaved actions */ -void sp_document_cancel (SPDocument *document); +void sp_document_cancel(SPDocument *document); /* Undo and redo */ -gboolean sp_document_undo (SPDocument * document); -gboolean sp_document_redo (SPDocument * document); +gboolean sp_document_undo(SPDocument *document); +gboolean sp_document_redo(SPDocument *document); /* Resource management */ -gboolean sp_document_add_resource (SPDocument *document, const gchar *key, SPObject *object); -gboolean sp_document_remove_resource (SPDocument *document, const gchar *key, SPObject *object); -const GSList *sp_document_get_resource_list (SPDocument *document, const gchar *key); +gboolean sp_document_add_resource(SPDocument *document, const gchar *key, SPObject *object); +gboolean sp_document_remove_resource(SPDocument *document, const gchar *key, SPObject *object); +const GSList *sp_document_get_resource_list(SPDocument *document, const gchar *key); sigc::connection sp_document_resources_changed_connect(SPDocument *document, const gchar *key, SPDocument::ResourcesChangedSignal::slot_type slot); @@ -224,15 +274,30 @@ sigc::connection sp_document_resources_changed_connect(SPDocument *document, con * Misc */ -GSList * sp_document_items_in_box(SPDocument *document, unsigned int dkey, NR::Rect const &box); -GSList * sp_document_partial_items_in_box(SPDocument *document, unsigned int dkey, NR::Rect const &box); -SPItem* sp_document_item_from_list_at_point_bottom (unsigned int dkey, SPGroup *group, const GSList *list, NR::Point const p, bool take_insensitive = false); -SPItem * sp_document_item_at_point (SPDocument *document, unsigned int key, NR::Point const p, gboolean into_groups, SPItem *upto = NULL); -SPItem * sp_document_group_at_point (SPDocument *document, unsigned int key, NR::Point const p); +GSList *sp_document_items_in_box(SPDocument *document, unsigned int dkey, Geom::Rect const &box); +GSList *sp_document_partial_items_in_box(SPDocument *document, unsigned int dkey, Geom::Rect const &box); +SPItem *sp_document_item_from_list_at_point_bottom(unsigned int dkey, SPGroup *group, const GSList *list, Geom::Point const p, bool take_insensitive = false); +SPItem *sp_document_item_at_point (SPDocument *document, unsigned int key, Geom::Point const p, gboolean into_groups, SPItem *upto = NULL); +GSList *sp_document_items_at_points(SPDocument *document, unsigned const key, std::vector points); +SPItem *sp_document_group_at_point (SPDocument *document, unsigned int key, Geom::Point const p); -void sp_document_set_uri (SPDocument *document, const gchar *uri); -void sp_document_resized_signal_emit (SPDocument *doc, gdouble width, gdouble height); +void sp_document_set_uri(SPDocument *document, gchar const *uri); +void sp_document_change_uri_and_hrefs(SPDocument *document, gchar const *uri); + +void sp_document_resized_signal_emit(SPDocument *doc, gdouble width, gdouble height); + +unsigned int vacuum_document(SPDocument *document); -unsigned int vacuum_document (SPDocument *document); #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:encoding=utf-8:textwidth=99 :