diff options
| author | Jabier Arraiza Cenoz <jabier.arraiza@marker.es> | 2016-10-10 12:08:35 +0000 |
|---|---|---|
| committer | jabiertxof <info@marker.es> | 2016-10-10 12:08:35 +0000 |
| commit | c7f5c676fa15f59f5f78c934263539981a26bbd2 (patch) | |
| tree | 12eb2965e90018d418ed4b31a9a84c278dcefb98 | |
| parent | Added widget to to rotate (diff) | |
| download | inkscape-c7f5c676fa15f59f5f78c934263539981a26bbd2.tar.gz inkscape-c7f5c676fa15f59f5f78c934263539981a26bbd2.zip | |
Fix some canvas problems and refactorization
(bzr r15142.1.8)
| -rw-r--r-- | src/display/canvas-temporary-item-list.h | 1 | ||||
| -rw-r--r-- | src/document-undo.cpp | 4 | ||||
| -rw-r--r-- | src/file.cpp | 4 | ||||
| -rw-r--r-- | src/sp-namedview.cpp | 37 | ||||
| -rw-r--r-- | src/sp-namedview.h | 6 | ||||
| -rw-r--r-- | src/viewbox.cpp | 63 | ||||
| -rw-r--r-- | src/viewbox.h | 9 | ||||
| -rw-r--r-- | src/widgets/desktop-widget.cpp | 41 |
8 files changed, 93 insertions, 72 deletions
diff --git a/src/display/canvas-temporary-item-list.h b/src/display/canvas-temporary-item-list.h index 471bb99b9..6b0e5796b 100644 --- a/src/display/canvas-temporary-item-list.h +++ b/src/display/canvas-temporary-item-list.h @@ -14,6 +14,7 @@ struct SPCanvasItem; class SPDesktop; +class SPViewBox; namespace Inkscape { namespace Display { diff --git a/src/document-undo.cpp b/src/document-undo.cpp index 113d09d66..023843fcc 100644 --- a/src/document-undo.cpp +++ b/src/document-undo.cpp @@ -281,6 +281,10 @@ gboolean Inkscape::DocumentUndo::undo(SPDocument *doc) if (ret) INKSCAPE.external_change(); + SPObject *updated = doc->getRoot(); + if (updated) { + updated->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); + } return ret; } diff --git a/src/file.cpp b/src/file.cpp index 7c17a6158..5a51bbf52 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -259,8 +259,9 @@ bool sp_file_open(const Glib::ustring &uri, SPDesktop *desktop = SP_ACTIVE_DESKTOP; if (desktop) { desktop->setWaitingCursor(); + desktop->remove_temporary_canvasitem(sp_document_namedview(desktop->getDocument(), NULL)->page_border_rotated); } - + SPDocument *doc = NULL; bool cancelled = false; try { @@ -287,7 +288,6 @@ bool sp_file_open(const Glib::ustring &uri, doc->setViewBox(Geom::Rect::from_xywh(0, 0, doc->getWidth().value(doc->getDisplayUnit()), doc->getHeight().value(doc->getDisplayUnit()))); DocumentUndo::setUndoSensitive(doc, true); } - SPDocument *existing = desktop ? desktop->getDocument() : NULL; if (existing && existing->virgin && replace_empty) { diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index e51d62522..ff0ac8336 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -19,7 +19,12 @@ #include "event-log.h" #include <2geom/transforms.h> +#include "display/sp-canvas-group.h" +#include "display/canvas-bpath.h" +#include "display/canvas-temporary-item.h" +#include "display/canvas-temporary-item-list.h" #include "display/canvas-grid.h" +#include "display/curve.h" #include "util/units.h" #include "svg/svg-color.h" #include "xml/repr.h" @@ -52,7 +57,6 @@ using Inkscape::Util::unit_table; #define DEFAULTPAGECOLOR 0xffffff00 static void sp_namedview_setup_guides(SPNamedView * nv); -static void sp_namedview_set_document_rotation(SPDocument * doc, SPNamedView * nv); static void sp_namedview_lock_guides(SPNamedView * nv); static void sp_namedview_show_single_guide(SPGuide* guide, bool show); static void sp_namedview_lock_single_guide(SPGuide* guide, bool show); @@ -97,9 +101,13 @@ SPNamedView::SPNamedView() : SPObjectGroup(), snap_manager(this) { this->default_layer_id = 0; this->connector_spacing = defaultConnSpacing; + this->page_border_rotated = NULL; } SPNamedView::~SPNamedView() { + if(!this->getViewList().empty()) { // >0 Desktops + this->getViewList()[0]->remove_temporary_canvasitem(this->page_border_rotated); + } } static void sp_namedview_generate_old_grid(SPNamedView * /*nv*/, SPDocument *document, Inkscape::XML::Node *repr) { @@ -952,7 +960,32 @@ static void sp_namedview_lock_guides(SPNamedView *nv) void sp_namedview_set_document_rotation(SPNamedView *nv) { - nv->document->getRoot()->set_rotation(nv->document_rotation); + if(!nv->getViewList().empty()) { // >0 Desktops + SPDesktop *desktop = nv->getViewList()[0]; + desktop->remove_temporary_canvasitem(nv->page_border_rotated); + SPRoot * root = nv->document->getRoot(); + SPCurve *c = new SPCurve(); + c->moveto(root->viewBox.min()); + c->lineto(Geom::Point(root->viewBox.max()[Geom::X],root->viewBox.min()[Geom::Y])); + c->lineto(Geom::Point(root->viewBox.max()[Geom::X],root->viewBox.max()[Geom::Y])); + c->lineto(Geom::Point(root->viewBox.min()[Geom::X],root->viewBox.max()[Geom::Y])); + c->closepath(); + Geom::Point page_center = root->viewBox.midpoint(); + Geom::PathVector const box = c->get_pathvector(); + Geom::Affine rot = Geom::identity(); + rot *= Geom::Translate(page_center).inverse(); + rot *= Geom::Rotate(Geom::rad_from_deg(nv->document_rotation * -1)); + rot *= Geom::Translate(page_center); + if (nv->document_rotation) { + SPCanvasItem *canvas_border = sp_canvas_bpath_new(desktop->getTempGroup(), c, true); + sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(canvas_border), 0xFF00009A, 1.0, SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT); + sp_canvas_bpath_set_fill(SP_CANVAS_BPATH(canvas_border), 0, SP_WIND_RULE_NONZERO); + sp_canvas_item_affine_absolute(canvas_border, rot * root->vbt); + nv->page_border_rotated = desktop->add_temporary_canvasitem(canvas_border, 0); + } + nv->document->getRoot()->set_rotation(nv->document_rotation); + c->unref(); + } if (nv->document_rotation) { nv->showborder = FALSE; } else { diff --git a/src/sp-namedview.h b/src/sp-namedview.h index e51908005..34f03e67e 100644 --- a/src/sp-namedview.h +++ b/src/sp-namedview.h @@ -21,6 +21,7 @@ #include "snap.h" #include "document.h" #include "util/units.h" +#include "display/sp-canvas.h" #include <vector> namespace Inkscape { @@ -28,6 +29,9 @@ namespace Inkscape { namespace Util { class Unit; } + namespace Display { + class TemporaryItem; + } } typedef unsigned int guint32; @@ -67,7 +71,7 @@ public: Inkscape::Util::Unit const *display_units; // Units used for the UI (*not* the same as units of SVG coordinates) Inkscape::Util::Unit const *page_size_units; // Only used in "Custom size" part of Document Properties dialog - + Inkscape::Display::TemporaryItem *page_border_rotated; GQuark default_layer_id; double connector_spacing; diff --git a/src/viewbox.cpp b/src/viewbox.cpp index d4e64a4da..15b5b19c4 100644 --- a/src/viewbox.cpp +++ b/src/viewbox.cpp @@ -17,10 +17,6 @@ #include "viewbox.h" #include "enums.h" #include "sp-item.h" -#include "sp-root.h" -#include "display/sp-canvas-group.h" -#include "display/canvas-bpath.h" -#include "display/curve.h" #include "inkscape.h" #include "desktop.h" @@ -31,6 +27,7 @@ SPViewBox::SPViewBox() , aspect_align(SP_ASPECT_XMID_YMID) // Default per spec , aspect_clip(SP_ASPECT_MEET) , c2p(Geom::identity()) + , vbt(Geom::identity()) , rotation(Geom::identity()) , angle(0) , previous_angle(0) @@ -243,7 +240,7 @@ void SPViewBox::apply_viewbox(const Geom::Rect& in, double scale_none) { } } /* Viewbox transform from scale and position */ - Geom::Affine vbt = Geom::identity(); + vbt = Geom::identity(); vbt[0] = scale_x; vbt[1] = 0.0; vbt[2] = 0.0; @@ -251,57 +248,27 @@ void SPViewBox::apply_viewbox(const Geom::Rect& in, double scale_none) { vbt[4] = x - scale_x * this->viewBox.left(); vbt[5] = y - scale_y * this->viewBox.top(); /* Append viewbox and turn transformation */ - Geom::Point rot_center = Geom::Point(); - Geom::Point p = this->viewBox.midpoint(); - Geom::Affine rotcenter = Geom::identity(); + Geom::Point page_center = this->viewBox.midpoint(); + Geom::Affine center_rotation = Geom::identity(); SPDesktop * desktop = SP_ACTIVE_DESKTOP; if (this->angle > 0.0 || this->angle < 0.0 ) { //!0 - SPCanvasItem *vw_rot = NULL; if (desktop) { - if (this->page_border_rotated) { - desktop->remove_temporary_canvasitem(this->page_border_rotated); - this->page_border_rotated = NULL; - } - SPCurve *c = new SPCurve(); - c->moveto(this->viewBox.min()); - c->lineto(Geom::Point(this->viewBox.max()[Geom::X],this->viewBox.min()[Geom::Y])); - c->lineto(Geom::Point(this->viewBox.max()[Geom::X],this->viewBox.max()[Geom::Y])); - c->lineto(Geom::Point(this->viewBox.min()[Geom::X],this->viewBox.max()[Geom::Y])); - c->closepath(); - vw_rot = sp_canvas_bpath_new(desktop->getTempGroup(), c, true); - sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(vw_rot), 0xFF00009A, 1.0, SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT); - sp_canvas_bpath_set_fill(SP_CANVAS_BPATH(vw_rot), 0, SP_WIND_RULE_NONZERO); - this->page_border_rotated = desktop->add_temporary_canvasitem(vw_rot, 0); - Geom::PathVector const box = c->get_pathvector(); - Geom::OptRect bbox = box.boundsFast(); - if (bbox){ - p = (*bbox).midpoint(); - } - Geom::Rect view = desktop->get_display_area(); - rot_center = desktop->doc2dt(view.midpoint()); - Geom::Affine rot = Geom::identity(); - rot *= Geom::Translate(p).inverse() * Geom::Rotate(Geom::rad_from_deg(-angle)) * Geom::Translate(p); - sp_canvas_item_affine_absolute(vw_rot, rot * vbt); - this->page_border_rotated = desktop->add_temporary_canvasitem(vw_rot, 0); - rotcenter *= Geom::Translate(p * vbt).inverse() * Geom::Rotate(Geom::rad_from_deg(this->angle - this->previous_angle)) * Geom::Translate(p * vbt); + rotation = Geom::Translate(page_center).inverse() * Geom::Rotate(Geom::rad_from_deg(angle)) * Geom::Translate(page_center); + this->c2p = rotation * vbt * this->c2p; + } else { + this->c2p = vbt * this->c2p; } - rotation = Geom::Translate(p).inverse() * Geom::Rotate(Geom::rad_from_deg(angle)) * Geom::Translate(p); - this->c2p = rotation * vbt * this->c2p; } else { - if (desktop) { - Geom::Rect view = desktop->get_display_area(); - rot_center = desktop->doc2dt(view.midpoint()); - rotcenter *= Geom::Translate(p * vbt).inverse() * Geom::Rotate(Geom::rad_from_deg(this->angle - this->previous_angle)) * Geom::Translate(p * vbt); - if (this->page_border_rotated) { - desktop->remove_temporary_canvasitem(this->page_border_rotated); - this->page_border_rotated = NULL; - } - } this->c2p = vbt * this->c2p; } if (desktop && this->rotated) { - rot_center = desktop->dt2doc(rot_center * rotcenter); - desktop->zoom_relative(rot_center[Geom::X], rot_center[Geom::Y], 1.0); + Geom::Rect view = desktop->get_display_area(); + Geom::Point view_center = desktop->doc2dt(view.midpoint()); + center_rotation *= Geom::Translate(page_center * vbt).inverse(); + center_rotation *= Geom::Rotate(Geom::rad_from_deg(this->angle - this->previous_angle)); + center_rotation *= Geom::Translate(page_center * vbt); + view_center = desktop->dt2doc(view_center * center_rotation); + desktop->zoom_relative(view_center[Geom::X], view_center[Geom::Y], 1.0); this->rotated = false; } } diff --git a/src/viewbox.h b/src/viewbox.h index 661a9b24a..2f107132c 100644 --- a/src/viewbox.h +++ b/src/viewbox.h @@ -17,13 +17,6 @@ #include <2geom/rect.h> #include <glib.h> -#include "display/sp-canvas.h" - -namespace Inkscape { - namespace Display { - class TemporaryItem; - } -} class SPItemCtx; @@ -43,11 +36,11 @@ public: /* Child to parent additional transform */ Geom::Affine c2p; + Geom::Affine vbt; Geom::Affine rotation; double angle; double previous_angle; bool rotated; - Inkscape::Display::TemporaryItem *page_border_rotated; double get_rotation(); void set_rotation(double angle_val); diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index df943b241..f648d8430 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -1645,7 +1645,6 @@ SPDesktopWidget* SPDesktopWidget::createInstance(SPNamedView *namedview) gtk_widget_show_all (dtw->menubar); SPNamedView *nv = dtw->desktop->namedview; dtw->rotatebar = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,0.0,360.0,45.0); - gtk_range_set_value(GTK_RANGE (dtw->rotatebar), nv->document_rotation); gtk_widget_set_name(dtw->rotatebar, "RotateBar"); gtk_widget_show_all (dtw->rotatebar); GtkWidget * containermenu = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); @@ -1661,7 +1660,11 @@ SPDesktopWidget* SPDesktopWidget::createInstance(SPNamedView *namedview) gtk_box_pack_start (GTK_BOX (dtw->vbox), containermenu, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (dtw->rotatebar), "button-release-event", G_CALLBACK (sp_desktop_widget_rotate_document), dtw); g_signal_connect (G_OBJECT (dtw->rotatebar), "key-release-event", G_CALLBACK (sp_desktop_widget_rotate_document), dtw); - + gtk_range_set_value(GTK_RANGE (dtw->rotatebar), nv->document_rotation); + //TODO: Find a better way to refresh the widget + gtk_widget_set_visible (dtw->rotatebar,false); + gtk_widget_set_visible (dtw->rotatebar,true); + sp_namedview_set_document_rotation(nv); dtw->layoutWidgets(); std::vector<GtkWidget *> toolboxes; @@ -1703,7 +1706,11 @@ sp_desktop_widget_update_rulers (SPDesktopWidget *dtw) void SPDesktopWidget::namedviewModified(SPObject *obj, guint flags) { SPNamedView *nv=SP_NAMEDVIEW(obj); - + gtk_range_set_value(GTK_RANGE(this->rotatebar), desktop->namedview->document_rotation); + sp_namedview_set_document_rotation(nv); + //TODO: Find a better way to refresh the widget + gtk_widget_set_visible (this->rotatebar,false); + gtk_widget_set_visible (this->rotatebar,true); if (flags & SP_OBJECT_MODIFIED_FLAG) { this->dt2r = 1. / nv->display_units->factor; this->ruler_origin = Geom::Point(0,0); //nv->gridorigin; Why was the grid origin used here? @@ -1756,15 +1763,27 @@ void SPDesktopWidget::namedviewModified(SPObject *obj, guint flags) static void sp_desktop_widget_rotate_document(GtkWidget *widget, GdkEvent *event, SPDesktopWidget *dtw) { - SPNamedView *nv = dtw->desktop->namedview; - double value = gtk_range_get_value(GTK_RANGE(widget)); - if (value != nv->document_rotation) { - sp_repr_set_svg_double(nv->getRepr(), "inkscape:document-rotation", value); - SPObject *updated = nv->document->getObjectByRepr(nv->getRepr()); - if (updated) { - updated->updateRepr(); + if (event->type == GDK_BUTTON_RELEASE || + event->key.keyval == GDK_KEY_Page_Down || + event->key.keyval == GDK_KEY_Page_Up || + event->key.keyval == GDK_KEY_End || + event->key.keyval == GDK_KEY_Begin || + event->key.keyval == GDK_KEY_Up || + event->key.keyval == GDK_KEY_Down || + event->key.keyval == GDK_KEY_Left || + event->key.keyval == GDK_KEY_Right) + { + SPNamedView *nv = dtw->desktop->namedview; + double value = gtk_range_get_value(GTK_RANGE(widget)); + if (value != nv->document_rotation) { + nv->document_rotation = value; + sp_repr_set_svg_double(nv->getRepr(), "inkscape:document-rotation", value); + SPObject *updated = SP_OBJECT(nv); + if (updated) { + updated->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); + } + gtk_widget_grab_focus(dtw->rotatebar); } - reinterpret_cast<SPObject *>(dtw->desktop->currentLayer())->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); } } |
