diff options
| -rw-r--r-- | src/sp-namedview.cpp | 9 | ||||
| -rw-r--r-- | src/sp-namedview.h | 2 | ||||
| -rw-r--r-- | src/viewbox.cpp | 25 | ||||
| -rw-r--r-- | src/widgets/desktop-widget.cpp | 46 | ||||
| -rw-r--r-- | src/widgets/desktop-widget.h | 2 |
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; |
