summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPeter Moulder <peter.moulder@monash.edu>2008-07-05 11:21:52 +0000
committerpjrm <pjrm@users.sourceforge.net>2008-07-05 11:21:52 +0000
commitd92d2a2e8469f306555367680375aacdb2801447 (patch)
tree0264b131f000eafcdb0b60c00c2e42341af736d6 /src
parentEOL fixups (diff)
downloadinkscape-d92d2a2e8469f306555367680375aacdb2801447.tar.gz
inkscape-d92d2a2e8469f306555367680375aacdb2801447.zip
fix a long-standing bug with Undo after Fit canvas to selection/drawing.
(bzr r6165)
Diffstat (limited to 'src')
-rw-r--r--src/selection-chemistry.cpp65
-rw-r--r--src/selection-chemistry.h8
-rw-r--r--src/verbs.cpp4
3 files changed, 56 insertions, 21 deletions
diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp
index 9b11ef9f6..9695d58e9 100644
--- a/src/selection-chemistry.cpp
+++ b/src/selection-chemistry.cpp
@@ -2814,33 +2814,67 @@ void sp_selection_unset_mask(bool apply_clip_path) {
sp_document_done (doc, SP_VERB_OBJECT_UNSET_MASK, _("Release mask"));
}
-void fit_canvas_to_selection(SPDesktop *desktop) {
- g_return_if_fail(desktop != NULL);
+/**
+ * Returns true if an undoable change should be recorded.
+ */
+bool
+fit_canvas_to_selection(SPDesktop *desktop)
+{
+ g_return_val_if_fail(desktop != NULL, false);
SPDocument *doc = sp_desktop_document(desktop);
- g_return_if_fail(doc != NULL);
- g_return_if_fail(desktop->selection != NULL);
+ g_return_val_if_fail(doc != NULL, false);
+ g_return_val_if_fail(desktop->selection != NULL, false);
if (desktop->selection->isEmpty()) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to fit canvas to."));
- return;
+ return false;
}
NR::Maybe<NR::Rect> const bbox(desktop->selection->bounds());
if (bbox && !bbox->isEmpty()) {
doc->fitToRect(*bbox);
+ return true;
+ } else {
+ return false;
}
-};
+}
-void fit_canvas_to_drawing(SPDocument *doc) {
- g_return_if_fail(doc != NULL);
+/**
+ * Fit canvas to the bounding box of the selection, as an undoable action.
+ */
+void
+verb_fit_canvas_to_selection(SPDesktop *const desktop)
+{
+ if (fit_canvas_to_selection(desktop)) {
+ sp_document_done(sp_desktop_document(desktop), SP_VERB_FIT_CANVAS_TO_SELECTION,
+ _("Fit Page to Selection"));
+ }
+}
+
+bool
+fit_canvas_to_drawing(SPDocument *doc)
+{
+ g_return_val_if_fail(doc != NULL, false);
sp_document_ensure_up_to_date(doc);
SPItem const *const root = SP_ITEM(doc->root);
NR::Maybe<NR::Rect> const bbox(root->getBounds(from_2geom(sp_item_i2r_affine(root))));
if (bbox && !bbox->isEmpty()) {
doc->fitToRect(*bbox);
+ return true;
+ } else {
+ return false;
}
-};
+}
+
+void
+verb_fit_canvas_to_drawing(SPDesktop *desktop)
+{
+ if (fit_canvas_to_drawing(sp_desktop_document(desktop))) {
+ sp_document_done(sp_desktop_document(desktop), SP_VERB_FIT_CANVAS_TO_DRAWING,
+ _("Fit Page to Drawing"));
+ }
+}
void fit_canvas_to_selection_or_drawing(SPDesktop *desktop) {
g_return_if_fail(desktop != NULL);
@@ -2849,14 +2883,13 @@ void fit_canvas_to_selection_or_drawing(SPDesktop *desktop) {
g_return_if_fail(doc != NULL);
g_return_if_fail(desktop->selection != NULL);
- if (desktop->selection->isEmpty()) {
- fit_canvas_to_drawing(doc);
- } else {
- fit_canvas_to_selection(desktop);
+ bool const changed = ( desktop->selection->isEmpty()
+ ? fit_canvas_to_drawing(doc)
+ : fit_canvas_to_selection(desktop) );
+ if (changed) {
+ sp_document_done(sp_desktop_document(desktop), SP_VERB_FIT_CANVAS_TO_SELECTION_OR_DRAWING,
+ _("Fit Page to Selection or Drawing"));
}
-
- sp_document_done(doc, SP_VERB_FIT_CANVAS_TO_DRAWING,
- _("Fit page to selection"));
};
static void itemtree_map(void (*f)(SPItem *, SPDesktop *), SPObject *root, SPDesktop *desktop) {
diff --git a/src/selection-chemistry.h b/src/selection-chemistry.h
index e67d67930..37d8a4a09 100644
--- a/src/selection-chemistry.h
+++ b/src/selection-chemistry.h
@@ -116,9 +116,11 @@ void sp_selection_create_bitmap_copy ();
void sp_selection_set_mask(bool apply_clip_path, bool apply_to_layer);
void sp_selection_unset_mask(bool apply_clip_path);
-void fit_canvas_to_selection(SPDesktop *desktop);
-void fit_canvas_to_drawing(SPDocument *doc);
-void fit_canvas_to_selection_or_drawing(SPDesktop *desktop);
+bool fit_canvas_to_selection(SPDesktop *);
+void verb_fit_canvas_to_selection(SPDesktop *);
+bool fit_canvas_to_drawing(SPDocument *);
+void verb_fit_canvas_to_drawing(SPDesktop *);
+void fit_canvas_to_selection_or_drawing(SPDesktop *);
void unlock_all(SPDesktop *dt);
void unlock_all_in_all_layers(SPDesktop *dt);
diff --git a/src/verbs.cpp b/src/verbs.cpp
index 8c5ce310b..b92eb52c0 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -2097,10 +2097,10 @@ FitCanvasVerb::perform(SPAction *action, void *data, void */*pdata*/)
switch ((long) data) {
case SP_VERB_FIT_CANVAS_TO_SELECTION:
- fit_canvas_to_selection(dt);
+ verb_fit_canvas_to_selection(dt);
break;
case SP_VERB_FIT_CANVAS_TO_DRAWING:
- fit_canvas_to_drawing(doc);
+ verb_fit_canvas_to_drawing(dt);
break;
case SP_VERB_FIT_CANVAS_TO_SELECTION_OR_DRAWING:
fit_canvas_to_selection_or_drawing(dt);