X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsp-namedview.cpp;h=da95a8ab70449d9714719d334d15a3226ad46ee9;hb=62d31275d48feeac9615611451ff4c9b724465e0;hp=4dfdb1b282945fea93f2dd213e0a750c3191d87e;hpb=91ff754f4da47efc8f558ea87cfcf92f86934944;p=inkscape.git diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index 4dfdb1b28..da95a8ab7 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -7,6 +7,7 @@ * Lauris Kaplinski * bulia byak * + * Copyright (C) 2006 Johan Engelen * Copyright (C) 1999-2005 Authors * Copyright (C) 2000-2001 Ximian, Inc. * @@ -15,10 +16,8 @@ #include "config.h" - - - #include "display/canvas-grid.h" +#include "display/canvas-axonomgrid.h" #include "helper/units.h" #include "svg/svg-color.h" #include "xml/repr.h" @@ -26,6 +25,7 @@ #include "document.h" #include "desktop-events.h" #include "desktop-handles.h" +#include "event-log.h" #include "sp-guide.h" #include "sp-item-group.h" #include "sp-namedview.h" @@ -109,6 +109,7 @@ static void sp_namedview_init(SPNamedView *nv) { nv->editable = TRUE; nv->showgrid = FALSE; + nv->gridtype = 0; nv->showguides = TRUE; nv->showborder = TRUE; nv->showpageshadow = TRUE; @@ -120,9 +121,7 @@ static void sp_namedview_init(SPNamedView *nv) nv->connector_spacing = defaultConnSpacing; - new (&nv->grid_snapper) Inkscape::GridSnapper(nv, 0); - new (&nv->guide_snapper) Inkscape::GuideSnapper(nv, 0); - new (&nv->object_snapper) Inkscape::ObjectSnapper(nv, 0); + new (&nv->snap_manager) SnapManager(nv); } static void sp_namedview_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) @@ -137,6 +136,7 @@ static void sp_namedview_build(SPObject *object, SPDocument *document, Inkscape: sp_object_read_attr(object, "inkscape:document-units"); sp_object_read_attr(object, "viewonly"); sp_object_read_attr(object, "showgrid"); + sp_object_read_attr(object, "gridtype"); sp_object_read_attr(object, "showguides"); sp_object_read_attr(object, "gridtolerance"); sp_object_read_attr(object, "guidetolerance"); @@ -146,6 +146,8 @@ static void sp_namedview_build(SPObject *object, SPDocument *document, Inkscape: sp_object_read_attr(object, "gridoriginy"); sp_object_read_attr(object, "gridspacingx"); sp_object_read_attr(object, "gridspacingy"); + sp_object_read_attr(object, "gridanglex"); + sp_object_read_attr(object, "gridanglez"); sp_object_read_attr(object, "gridempspacing"); sp_object_read_attr(object, "gridcolor"); sp_object_read_attr(object, "gridempcolor"); @@ -206,13 +208,11 @@ static void sp_namedview_release(SPObject *object) namedview->gridviews = g_slist_remove(namedview->gridviews, namedview->gridviews->data); } - namedview->grid_snapper.~GridSnapper(); - namedview->guide_snapper.~GuideSnapper(); - namedview->object_snapper.~ObjectSnapper(); - if (((SPObjectClass *) parent_class)->release) { ((SPObjectClass *) parent_class)->release(object); } + + namedview->snap_manager.~SnapManager(); } static void sp_namedview_set(SPObject *object, unsigned int key, const gchar *value) @@ -228,13 +228,14 @@ static void sp_namedview_set(SPObject *object, unsigned int key, const gchar *va case SP_ATTR_SHOWGRID: nv->showgrid = sp_str_to_bool(value); sp_namedview_setup_grid(nv); - if (!nv->showgrid) { // grid goes off, disable snaps even if they are turned on - nv->grid_snapper.setSnapTo(Inkscape::Snapper::BBOX_POINT, false); - nv->grid_snapper.setSnapTo(Inkscape::Snapper::SNAP_POINT, false); - } else { // grid goes on, enable snaps if they are turned on - nv->grid_snapper.setSnapTo(Inkscape::Snapper::BBOX_POINT, nv->snap_grid_bbox); - nv->grid_snapper.setSnapTo(Inkscape::Snapper::SNAP_POINT, nv->snap_grid_point); - } + /* Disable grid snaps if the grid is turned off */ + nv->snap_manager.grid.setEnabled(nv->showgrid); + nv->snap_manager.axonomgrid.setEnabled(nv->showgrid); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + case SP_ATTR_GRIDTYPE: + nv->gridtype = sp_str_to_bool(value); + sp_namedview_setup_grid(nv); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_SHOWGUIDES: @@ -243,13 +244,6 @@ static void sp_namedview_set(SPObject *object, unsigned int key, const gchar *va } else { nv->showguides = sp_str_to_bool(value); } - if (!nv->showguides) { // guides go off, disable snaps even if they are turned on - nv->guide_snapper.setSnapTo(Inkscape::Snapper::BBOX_POINT, false); - nv->guide_snapper.setSnapTo(Inkscape::Snapper::SNAP_POINT, false); - } else { // guides go on, enable snaps if they are turned on - nv->guide_snapper.setSnapTo(Inkscape::Snapper::BBOX_POINT, nv->snap_guide_bbox); - nv->guide_snapper.setSnapTo(Inkscape::Snapper::SNAP_POINT, nv->snap_guide_point); - } sp_namedview_setup_guides(nv); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; @@ -312,6 +306,18 @@ static void sp_namedview_set(SPObject *object, unsigned int key, const gchar *va object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; } + case SP_ATTR_GRIDANGLEX: + case SP_ATTR_GRIDANGLEZ: + { + unsigned const d = (key == SP_ATTR_GRIDANGLEZ); // 0=X 1=Z + nv->gridangle[d] = 30; // 30 deg default + if (value) { + nv->gridangle[d] = g_ascii_strtod(value, NULL); + } + sp_namedview_setup_grid(nv); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + } case SP_ATTR_GRIDCOLOR: nv->gridcolor = (nv->gridcolor & 0xff) | (DEFAULTGRIDCOLOR & 0xffffff00); if (value) { @@ -453,43 +459,37 @@ static void sp_namedview_set(SPObject *object, unsigned int key, const gchar *va object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_GRID_BBOX: - nv->snap_grid_bbox = (value) ? sp_str_to_bool(value) : TRUE; - nv->grid_snapper.setSnapTo(Inkscape::Snapper::BBOX_POINT, nv->showgrid && nv->snap_grid_bbox); + nv->snap_manager.grid.setSnapTo(Inkscape::Snapper::BBOX_POINT, value ? sp_str_to_bool(value) : TRUE); + nv->snap_manager.axonomgrid.setSnapTo(Inkscape::Snapper::BBOX_POINT, value ? sp_str_to_bool(value) : TRUE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_GRID_POINTS: - nv->snap_grid_point = (value) ? sp_str_to_bool(value) : FALSE; - nv->grid_snapper.setSnapTo(Inkscape::Snapper::SNAP_POINT, nv->showgrid && nv->snap_grid_point); + nv->snap_manager.grid.setSnapTo(Inkscape::Snapper::SNAP_POINT, value ? sp_str_to_bool(value) : FALSE); + nv->snap_manager.axonomgrid.setSnapTo(Inkscape::Snapper::SNAP_POINT, value ? sp_str_to_bool(value) : FALSE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_GUIDE_BBOX: - nv->snap_guide_bbox = (value) ? sp_str_to_bool(value) : TRUE; - nv->guide_snapper.setSnapTo(Inkscape::Snapper::BBOX_POINT, nv->showguides && nv->snap_guide_bbox); + nv->snap_manager.guide.setSnapTo(Inkscape::Snapper::BBOX_POINT, value ? sp_str_to_bool(value) : TRUE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_GUIDE_POINTS: - nv->snap_guide_point = (value) ? sp_str_to_bool(value) : FALSE; - nv->guide_snapper.setSnapTo(Inkscape::Snapper::SNAP_POINT, nv->showguides && nv->snap_guide_point); + nv->snap_manager.guide.setSnapTo(Inkscape::Snapper::SNAP_POINT, value ? sp_str_to_bool(value) : FALSE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_OBJECT_BBOX: - nv->snap_object_bbox = (value) ? sp_str_to_bool(value) : FALSE; - nv->object_snapper.setSnapTo(Inkscape::Snapper::BBOX_POINT, nv->snap_object_bbox); + nv->snap_manager.object.setSnapTo(Inkscape::Snapper::BBOX_POINT, (value) ? sp_str_to_bool(value) : FALSE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_OBJECT_POINTS: - nv->snap_object_point = (value) ? sp_str_to_bool(value) : FALSE; - nv->object_snapper.setSnapTo(Inkscape::Snapper::SNAP_POINT, nv->snap_object_point); + nv->snap_manager.object.setSnapTo(Inkscape::Snapper::SNAP_POINT, (value) ? sp_str_to_bool(value) : FALSE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_OBJECT_PATHS: - nv->snap_object_paths = (value) ? sp_str_to_bool(value) : TRUE; - nv->object_snapper.setSnapToPaths(nv->snap_object_paths); + nv->snap_manager.object.setSnapToPaths(value ? sp_str_to_bool(value) : TRUE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_OBJECT_NODES: - nv->snap_object_nodes = (value) ? sp_str_to_bool(value) : TRUE; - nv->object_snapper.setSnapToNodes(nv->snap_object_nodes); + nv->snap_manager.object.setSnapToNodes(value ? sp_str_to_bool(value) : TRUE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_CURRENT_LAYER: @@ -571,7 +571,7 @@ static void sp_namedview_child_added(SPObject *object, Inkscape::XML::Node *chil sp_guide_show(g, static_cast(l->data)->guides, (GCallback) sp_dt_guide_event); if (static_cast(l->data)->guides_active) sp_guide_sensitize(g, - SP_DT_CANVAS(static_cast (l->data)), + sp_desktop_canvas(static_cast (l->data)), TRUE); if (nv->showguides) { for (GSList *v = SP_GUIDE(g)->views; v != NULL; v = v->next) { @@ -627,7 +627,7 @@ void SPNamedView::show(SPDesktop *desktop) for (GSList *l = guides; l != NULL; l = l->next) { sp_guide_show(SP_GUIDE(l->data), desktop->guides, (GCallback) sp_dt_guide_event); if (desktop->guides_active) { - sp_guide_sensitize(SP_GUIDE(l->data), SP_DT_CANVAS(desktop), TRUE); + sp_guide_sensitize(SP_GUIDE(l->data), sp_desktop_canvas(desktop), TRUE); } if (showguides) { for (GSList *v = SP_GUIDE(l->data)->views; v != NULL; v = v->next) { @@ -642,11 +642,17 @@ void SPNamedView::show(SPDesktop *desktop) views = g_slist_prepend(views, desktop); - SPCanvasItem *item = sp_canvas_item_new(SP_DT_GRID(desktop), SP_TYPE_CGRID, NULL); + SPCanvasItem * item = sp_canvas_item_new(sp_desktop_grid(desktop), SP_TYPE_CGRID, NULL); + // since we're keeping a copy, we need to bump up the ref count + gtk_object_ref(GTK_OBJECT(item)); + gridviews = g_slist_prepend(gridviews, item); + + item = sp_canvas_item_new(sp_desktop_grid(desktop), SP_TYPE_CAXONOMGRID, NULL); // since we're keeping a copy, we need to bump up the ref count gtk_object_ref(GTK_OBJECT(item)); gridviews = g_slist_prepend(gridviews, item); - sp_namedview_setup_grid_item(this, item); + + sp_namedview_setup_grid(this); } /* @@ -670,7 +676,7 @@ void sp_namedview_window_from_document(SPDesktop *desktop) && nv->cx != HUGE_VAL && !isNaN(nv->cx) && nv->cy != HUGE_VAL && !isNaN(nv->cy)) { desktop->zoom_absolute(nv->cx, nv->cy, nv->zoom); - } else if (SP_DT_DOCUMENT(desktop)) { // document without saved zoom, zoom to its page + } else if (sp_desktop_document(desktop)) { // document without saved zoom, zoom to its page desktop->zoom_page(); } @@ -701,6 +707,9 @@ void sp_namedview_window_from_document(SPDesktop *desktop) if (layer) { desktop->setCurrentLayer(layer); } + + // FIXME: find a better place to do this + desktop->event_log->updateUndoVerbs(); } void sp_namedview_document_from_window(SPDesktop *desktop) @@ -710,8 +719,8 @@ void sp_namedview_document_from_window(SPDesktop *desktop) NR::Rect const r = desktop->get_display_area(); // saving window geometry is not undoable - gboolean saved = sp_document_get_undo_sensitive(SP_DT_DOCUMENT(desktop)); - sp_document_set_undo_sensitive(SP_DT_DOCUMENT(desktop), FALSE); + bool saved = sp_document_get_undo_sensitive(sp_desktop_document(desktop)); + sp_document_set_undo_sensitive(sp_desktop_document(desktop), false); sp_repr_set_svg_double(view, "inkscape:zoom", desktop->current_zoom()); sp_repr_set_svg_double(view, "inkscape:cx", r.midpoint()[NR::X]); @@ -729,7 +738,7 @@ void sp_namedview_document_from_window(SPDesktop *desktop) view->setAttribute("inkscape:current-layer", SP_OBJECT_ID(desktop->currentLayer())); // restore undoability - sp_document_set_undo_sensitive(SP_DT_DOCUMENT(desktop), saved); + sp_document_set_undo_sensitive(sp_desktop_document(desktop), saved); } void SPNamedView::hide(SPDesktop const *desktop) @@ -738,23 +747,19 @@ void SPNamedView::hide(SPDesktop const *desktop) g_assert(g_slist_find(views, desktop)); for (GSList *l = guides; l != NULL; l = l->next) { - sp_guide_hide(SP_GUIDE(l->data), SP_DT_CANVAS(desktop)); + sp_guide_hide(SP_GUIDE(l->data), sp_desktop_canvas(desktop)); } views = g_slist_remove(views, desktop); GSList *l; for (l = gridviews; l != NULL; l = l->next) { - if (SP_CANVAS_ITEM(l->data)->canvas == SP_DT_CANVAS(desktop)) { - break; + if (SP_CANVAS_ITEM(l->data)->canvas == sp_desktop_canvas(desktop)) { + sp_canvas_item_hide(SP_CANVAS_ITEM(l->data)); + gtk_object_unref(GTK_OBJECT(l->data)); + gridviews = g_slist_remove(gridviews, l->data); } } - - g_assert(l); - - sp_canvas_item_hide(SP_CANVAS_ITEM(l->data)); - gtk_object_unref(GTK_OBJECT(l->data)); - gridviews = g_slist_remove(gridviews, l->data); } void SPNamedView::activateGuides(gpointer desktop, gboolean active) @@ -765,7 +770,7 @@ void SPNamedView::activateGuides(gpointer desktop, gboolean active) SPDesktop *dt = static_cast(desktop); for (GSList *l = guides; l != NULL; l = l->next) { - sp_guide_sensitize(SP_GUIDE(l->data), SP_DT_CANVAS(dt), active); + sp_guide_sensitize(SP_GUIDE(l->data), sp_desktop_canvas(dt), active); } } @@ -794,8 +799,8 @@ void sp_namedview_toggle_guides(SPDocument *doc, Inkscape::XML::Node *repr) v = !v; } - gboolean saved = sp_document_get_undo_sensitive(doc); - sp_document_set_undo_sensitive(doc, FALSE); + bool saved = sp_document_get_undo_sensitive(doc); + sp_document_set_undo_sensitive(doc, false); sp_repr_set_boolean(repr, "showguides", v); @@ -809,8 +814,8 @@ void sp_namedview_toggle_grid(SPDocument *doc, Inkscape::XML::Node *repr) sp_repr_get_boolean(repr, "showgrid", &v); v = !v; - gboolean saved = sp_document_get_undo_sensitive(doc); - sp_document_set_undo_sensitive(doc, FALSE); + bool saved = sp_document_get_undo_sensitive(doc); + sp_document_set_undo_sensitive(doc, false); sp_repr_set_boolean(repr, "showgrid", v); @@ -818,6 +823,17 @@ void sp_namedview_toggle_grid(SPDocument *doc, Inkscape::XML::Node *repr) sp_document_set_undo_sensitive(doc, saved); } +void sp_namedview_set_gridtype(bool type, SPDocument *doc, Inkscape::XML::Node *repr) +{ + bool saved = sp_document_get_undo_sensitive(doc); + sp_document_set_undo_sensitive(doc, false); + + sp_repr_set_boolean(repr, "showgrid", type); + + doc->rroot->setAttribute("sodipodi:modified", "true"); + sp_document_set_undo_sensitive(doc, saved); +} + static void sp_namedview_setup_grid(SPNamedView *nv) { for (GSList *l = nv->gridviews; l != NULL; l = l->next) { @@ -827,23 +843,37 @@ static void sp_namedview_setup_grid(SPNamedView *nv) static void sp_namedview_setup_grid_item(SPNamedView *nv, SPCanvasItem *item) { - if (nv->showgrid) { + bool btype = SP_IS_CAXONOMGRID(GTK_OBJECT(item)); + + if ( nv->showgrid && (nv->gridtype == btype) ) { sp_canvas_item_show(item); } else { sp_canvas_item_hide(item); } - + sp_canvas_item_set((GtkObject *) item, "color", nv->gridcolor, "originx", nv->gridorigin[NR::X], "originy", nv->gridorigin[NR::Y], - "spacingx", nv->gridspacing[NR::X], "spacingy", nv->gridspacing[NR::Y], "empcolor", nv->gridempcolor, "empspacing", nv->gridempspacing, NULL); + if (!btype){ + // CGRID + sp_canvas_item_set((GtkObject *) item, + "spacingx", nv->gridspacing[NR::X], + NULL); + } else { + // CAXONOMGRID + sp_canvas_item_set((GtkObject *) item, + "anglex", nv->gridangle[0], + "anglez", nv->gridangle[1], + NULL); + } } + gchar const *SPNamedView::getName() const { SPException ex; @@ -977,15 +1007,6 @@ SPMetric SPNamedView::getDefaultMetric() const } } -SPNamedView::SnapperList SPNamedView::getSnappers() const -{ - SnapperList s; - s.push_back(&grid_snapper); - s.push_back(&guide_snapper); - s.push_back(&object_snapper); - return s; -} - /* Local Variables: mode:c++