summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2016-10-10 12:08:35 +0000
committerjabiertxof <info@marker.es>2016-10-10 12:08:35 +0000
commitc7f5c676fa15f59f5f78c934263539981a26bbd2 (patch)
tree12eb2965e90018d418ed4b31a9a84c278dcefb98
parentAdded widget to to rotate (diff)
downloadinkscape-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.h1
-rw-r--r--src/document-undo.cpp4
-rw-r--r--src/file.cpp4
-rw-r--r--src/sp-namedview.cpp37
-rw-r--r--src/sp-namedview.h6
-rw-r--r--src/viewbox.cpp63
-rw-r--r--src/viewbox.h9
-rw-r--r--src/widgets/desktop-widget.cpp41
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);
}
}