summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/sp-namedview.cpp9
-rw-r--r--src/sp-namedview.h2
-rw-r--r--src/viewbox.cpp25
-rw-r--r--src/widgets/desktop-widget.cpp46
-rw-r--r--src/widgets/desktop-widget.h2
5 files changed, 61 insertions, 23 deletions
diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp
index e44c548bd..e51d62522 100644
--- a/src/sp-namedview.cpp
+++ b/src/sp-namedview.cpp
@@ -416,8 +416,8 @@ void SPNamedView::set(unsigned int key, const gchar* value) {
this->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_INKSCAPE_DOCUMENT_ROTATION:
- this->document_rotation = value ? g_ascii_strtod(value, NULL) : 0; // zero means not set
- sp_namedview_set_document_rotation(document, this);
+ this->document_rotation = value ? g_ascii_strtod(value, NULL) : 0;
+ sp_namedview_set_document_rotation(this);
this->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_INKSCAPE_WINDOW_WIDTH:
@@ -950,10 +950,9 @@ static void sp_namedview_lock_guides(SPNamedView *nv)
}
}
-static void sp_namedview_set_document_rotation(SPDocument *doc, SPNamedView *nv)
+void sp_namedview_set_document_rotation(SPNamedView *nv)
{
-
- doc->getRoot()->set_rotation(nv->document_rotation);
+ nv->document->getRoot()->set_rotation(nv->document_rotation);
if (nv->document_rotation) {
nv->showborder = FALSE;
} else {
diff --git a/src/sp-namedview.h b/src/sp-namedview.h
index 9e523632d..e51908005 100644
--- a/src/sp-namedview.h
+++ b/src/sp-namedview.h
@@ -122,7 +122,7 @@ SPNamedView const *sp_document_namedview(SPDocument const *document, char const
void sp_namedview_window_from_document(SPDesktop *desktop);
void sp_namedview_document_from_window(SPDesktop *desktop);
void sp_namedview_update_layers_from_document (SPDesktop *desktop);
-
+void sp_namedview_set_document_rotation(SPNamedView *nv);
void sp_namedview_toggle_guides(SPDocument *doc, Inkscape::XML::Node *repr);
void sp_namedview_guides_toggle_lock(SPDocument *doc, Inkscape::XML::Node *repr);
void sp_namedview_show_grids(SPNamedView *namedview, bool show, bool dirty_document);
diff --git a/src/viewbox.cpp b/src/viewbox.cpp
index dbbd462c8..d4e64a4da 100644
--- a/src/viewbox.cpp
+++ b/src/viewbox.cpp
@@ -251,13 +251,12 @@ 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();
+ SPDesktop * desktop = SP_ACTIVE_DESKTOP;
if (this->angle > 0.0 || this->angle < 0.0 ) { //!0
- Geom::Point r0 = this->viewBox.min();
- Geom::Point r1 = this->viewBox.max();
- Geom::Point p = (r0 + r1) / 2;
- SPDesktop * desktop = SP_ACTIVE_DESKTOP;
SPCanvasItem *vw_rot = NULL;
- Geom::Point rot_center = Geom::Point();
if (desktop) {
if (this->page_border_rotated) {
desktop->remove_temporary_canvasitem(this->page_border_rotated);
@@ -284,20 +283,15 @@ void SPViewBox::apply_viewbox(const Geom::Rect& in, double scale_none) {
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);
- Geom::Affine rotcenter = Geom::identity();
rotcenter *= Geom::Translate(p * vbt).inverse() * Geom::Rotate(Geom::rad_from_deg(this->angle - this->previous_angle)) * Geom::Translate(p * vbt);
- rot_center = rot_center * rotcenter;
}
rotation = Geom::Translate(p).inverse() * Geom::Rotate(Geom::rad_from_deg(angle)) * Geom::Translate(p);
this->c2p = rotation * vbt * this->c2p;
- rot_center = desktop->dt2doc(rot_center);
- if (desktop && this->rotated) {
- desktop->zoom_relative(rot_center[Geom::X], rot_center[Geom::Y], 1.0);
- this->rotated = false;
- }
} else {
- SPDesktop * desktop = SP_ACTIVE_DESKTOP;
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;
@@ -305,6 +299,11 @@ void SPViewBox::apply_viewbox(const Geom::Rect& in, double scale_none) {
}
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);
+ this->rotated = false;
+ }
}
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index 55dc82dc0..df943b241 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -54,7 +54,7 @@
#include "ui/uxmanager.h"
#include "util/ege-appear-time-tracker.h"
#include "sp-root.h"
-
+#include "attributes.h"
// We're in the "widgets" directory, so no need to explicitly prefix these:
#include "button.h"
#include "gimp/ruler.h"
@@ -105,6 +105,7 @@ static void sp_update_guides_lock( GtkWidget *button, gpointer data );
static void cms_adjust_toggled( GtkWidget *button, gpointer data );
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
static void cms_adjust_set_sensitive( SPDesktopWidget *dtw, bool enabled );
+static void sp_desktop_widget_rotate_document(GtkWidget *widget, GdkEvent *eventdtw, SPDesktopWidget *dtw);
static void sp_desktop_widget_adjustment_value_changed (GtkAdjustment *adj, SPDesktopWidget *dtw);
static gdouble sp_dtw_zoom_value_to_display (gdouble value);
@@ -1430,6 +1431,12 @@ void SPDesktopWidget::layoutWidgets()
} else {
gtk_widget_show_all (dtw->menubar);
}
+
+ if (!prefs->getBool(pref_root + "menu/state", true)) {
+ gtk_widget_hide (dtw->rotatebar);
+ } else {
+ gtk_widget_show_all (dtw->rotatebar);
+ }
if (!prefs->getBool(pref_root + "commands/state", true)) {
gtk_widget_hide (dtw->commands_toolbox);
@@ -1636,8 +1643,25 @@ SPDesktopWidget* SPDesktopWidget::createInstance(SPNamedView *namedview)
dtw->menubar = sp_ui_main_menubar (dtw->desktop);
gtk_widget_set_name(dtw->menubar, "MenuBar");
gtk_widget_show_all (dtw->menubar);
- gtk_box_pack_start (GTK_BOX (dtw->vbox), dtw->menubar, FALSE, FALSE, 0);
-
+ 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);
+ gtk_widget_show_all (containermenu);
+ GtkWidget * separator = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
+ gtk_widget_show_all(separator);
+ GtkWidget * label = gtk_label_new (_("Rotation"));
+ gtk_widget_show_all(label);
+ gtk_box_pack_start (GTK_BOX (containermenu), dtw->menubar, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (containermenu), separator, FALSE, FALSE, 10);
+ gtk_box_pack_start (GTK_BOX (containermenu), dtw->rotatebar, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (containermenu), label, FALSE, FALSE, 10);
+ 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);
+
dtw->layoutWidgets();
std::vector<GtkWidget *> toolboxes;
@@ -1730,6 +1754,22 @@ 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();
+ }
+ reinterpret_cast<SPObject *>(dtw->desktop->currentLayer())->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
+ }
+}
+
+
+static void
sp_desktop_widget_adjustment_value_changed (GtkAdjustment */*adj*/, SPDesktopWidget *dtw)
{
if (dtw->update)
diff --git a/src/widgets/desktop-widget.h b/src/widgets/desktop-widget.h
index 08966ad5f..26eaf1ff3 100644
--- a/src/widgets/desktop-widget.h
+++ b/src/widgets/desktop-widget.h
@@ -78,7 +78,7 @@ struct SPDesktopWidget {
GtkWidget *hbox;
- GtkWidget *menubar, *statusbar;
+ GtkWidget *menubar, *statusbar, *rotatebar;
Inkscape::UI::Dialogs::SwatchesPanel *panels;