X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdocument.cpp;h=252c9b17379070e296bc2cc7b058400b42b841da;hb=724821145d62dee9f97465c706952582da6e432d;hp=3579c4c91ffc1906ae25060816f0c804093c0d90;hpb=89949341e299d2857fc2435d5a8758845947dc0a;p=inkscape.git diff --git a/src/document.cpp b/src/document.cpp index 3579c4c91..252c9b173 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -70,6 +70,8 @@ gboolean sp_document_resource_list_free(gpointer key, gpointer value, gpointer d static gint doc_count = 0; +static unsigned long next_serial = 0; + SPDocument::SPDocument() { SPDocumentPrivate *p; @@ -96,6 +98,8 @@ SPDocument::SPDocument() { p = new SPDocumentPrivate(); + p->serial = next_serial++; + p->iddef = g_hash_table_new(g_direct_hash, g_direct_equal); p->reprdef = g_hash_table_new(g_direct_hash, g_direct_equal); @@ -106,6 +110,7 @@ SPDocument::SPDocument() { p->history_size = 0; p->undo = NULL; p->redo = NULL; + p->seeking = false; priv = p; @@ -117,8 +122,6 @@ SPDocument::~SPDocument() { collectOrphans(); if (priv) { - inkscape_remove_document(this); - if (priv->partial) { sp_repr_free_log(priv->partial); priv->partial = NULL; @@ -183,6 +186,10 @@ SPDocument::~SPDocument() { //delete this->_whiteboard_session_manager; } +unsigned long SPDocument::serial() const { + return priv->serial; +} + void SPDocument::queueForOrphanCollection(SPObject *object) { g_return_if_fail(object != NULL); g_return_if_fail(SP_OBJECT_DOCUMENT(object) == this); @@ -261,10 +268,7 @@ sp_document_create(Inkscape::XML::Document *rdoc, /* Quick hack 3 - Set uri attributes */ if (uri) { - /* fixme: Think, what this means for images (Lauris) */ rroot->setAttribute("sodipodi:docname", uri); - if (document->base) - rroot->setAttribute("sodipodi:docbase", document->base); } /* End of quick hack 3 */ @@ -281,7 +285,7 @@ sp_document_create(Inkscape::XML::Document *rdoc, rnew->setAttribute("id", "base"); } else { // otherwise, take from preferences - rnew = r->duplicate(); + rnew = r->duplicate(rroot->document()); } // insert into the document rroot->addChild(rnew, NULL); @@ -317,7 +321,6 @@ sp_document_create(Inkscape::XML::Document *rdoc, document->_selection_changed_connection = Inkscape::NSApplication::Editor::connectSelectionChanged (sigc::mem_fun (*document, &SPDocument::reset_key)); document->_desktop_activated_connection = Inkscape::NSApplication::Editor::connectDesktopActivated (sigc::mem_fun (*document, &SPDocument::reset_key)); } - inkscape_add_document(document); return document; } @@ -402,12 +405,6 @@ sp_document_new_from_mem(gchar const *buffer, gint length, unsigned int keepaliv return doc; } -SPDocument *sp_document_new_dummy() { - SPDocument *document = new SPDocument(); - inkscape_add_document(document); - return document; -} - SPDocument * sp_document_ref(SPDocument *doc) { @@ -488,23 +485,26 @@ gdouble sp_document_height(SPDocument *document) } /** - * Given an NRRect that may, for example, correspond to the bbox of an object + * Given an NR::Rect that may, for example, correspond to the bbox of an object, * this function fits the canvas to that rect by resizing the canvas * and translating the document root into position. */ -void SPDocument::fitToRect(NRRect const & rect) +void SPDocument::fitToRect(NR::Rect const &rect) { - g_return_if_fail(!empty(rect)); - - gdouble w = rect.x1 - rect.x0; - gdouble h = rect.y1 - rect.y0; - gdouble old_height = sp_document_height(this); - SPUnit unit = sp_unit_get_by_id(SP_UNIT_PX); - sp_document_set_width(this, w, &unit); - sp_document_set_height(this, h, &unit); - - NR::translate tr = NR::translate::translate(-rect.x0,-(rect.y0 + (h - old_height))); - static_cast(root)->translateChildItems(tr); + g_return_if_fail(!rect.isEmpty()); + + using NR::X; using NR::Y; + double const w = rect.extent(X); + double const h = rect.extent(Y); + + double const old_height = sp_document_height(this); + SPUnit const &px(sp_unit_get_by_id(SP_UNIT_PX)); + sp_document_set_width(this, w, &px); + sp_document_set_height(this, h, &px); + + NR::translate const tr(NR::Point(0, (old_height - h)) + - rect.min()); + SP_GROUP(root)->translateChildItems(tr); } void sp_document_set_uri(SPDocument *document, gchar const *uri) @@ -548,8 +548,6 @@ void sp_document_set_uri(SPDocument *document, gchar const *uri) // changing uri in the document repr must not be not undoable bool saved = sp_document_get_undo_sensitive(document); sp_document_set_undo_sensitive(document, false); - if (document->base) - repr->setAttribute("sodipodi:docbase", document->base); repr->setAttribute("sodipodi:docname", document->name); sp_document_set_undo_sensitive(document, saved); @@ -837,8 +835,8 @@ static GSList *find_items_in_area(GSList *s, SPGroup *group, unsigned int dkey, s = find_items_in_area(s, SP_GROUP(o), dkey, area, test); } else { SPItem *child = SP_ITEM(o); - NR::Rect box = sp_item_bbox_desktop(child); - if (test(area, box) && (take_insensitive || child->isVisibleAndUnlocked(dkey))) { + NR::Maybe box = sp_item_bbox_desktop(child); + if ( box && test(area, *box) && (take_insensitive || child->isVisibleAndUnlocked(dkey))) { s = g_slist_append(s, child); } } @@ -1004,6 +1002,30 @@ GSList *sp_document_partial_items_in_box(SPDocument *document, unsigned int dkey return find_items_in_area(NULL, SP_GROUP(document->root), dkey, box, overlaps); } +GSList * +sp_document_items_at_points(SPDocument *document, unsigned const key, std::vector points) +{ + GSList *items = NULL; + + // When picking along the path, we don't want small objects close together + // (such as hatching strokes) to obscure each other by their deltas, + // so we temporarily set delta to a small value + gdouble saved_delta = prefs_get_double_attribute ("options.cursortolerance", "value", 1.0); + prefs_set_double_attribute ("options.cursortolerance", "value", 0.25); + + for(unsigned int i = 0; i < points.size(); i++) { + SPItem *item = sp_document_item_at_point(document, key, points[i], + false, NULL); + if (item && !g_slist_find(items, item)) + items = g_slist_prepend (items, item); + } + + // and now we restore it back + prefs_set_double_attribute ("options.cursortolerance", "value", saved_delta); + + return items; +} + SPItem * sp_document_item_at_point(SPDocument *document, unsigned const key, NR::Point const p, gboolean const into_groups, SPItem *upto) @@ -1160,6 +1182,10 @@ vacuum_document(SPDocument *document) return start - newend; } +bool SPDocument::isSeeking() const { + return priv->seeking; +} + /* Local Variables: