summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-12-08 02:02:40 +0000
committerjabiertxof <jabier.arraiza@marker.es>2015-12-08 02:02:40 +0000
commit2f87fb8f6ee1c0d16ef54e546462ac659acab51f (patch)
tree9948abff72f547c04c1c5d19a5578cb30e6c4d95
parentstatic code analysis (diff)
parentupdate to trunk (diff)
downloadinkscape-2f87fb8f6ee1c0d16ef54e546462ac659acab51f.tar.gz
inkscape-2f87fb8f6ee1c0d16ef54e546462ac659acab51f.zip
merge lp:~inkscape.dev/inkscape/lock_guides
(bzr r14512)
-rw-r--r--src/attributes-test.h1
-rw-r--r--src/attributes.cpp2
-rw-r--r--src/attributes.h2
-rw-r--r--src/desktop-events.cpp13
-rw-r--r--src/desktop.cpp5
-rw-r--r--src/desktop.h2
-rw-r--r--src/display/guideline.cpp18
-rw-r--r--src/display/guideline.h2
-rw-r--r--src/display/sp-ctrlpoint.cpp28
-rw-r--r--src/display/sp-ctrlpoint.h6
-rw-r--r--src/menus-skeleton.h1
-rw-r--r--src/pixmaps/cursor-select.xpm38
-rw-r--r--src/sp-guide.cpp28
-rw-r--r--src/sp-guide.h4
-rw-r--r--src/sp-namedview.cpp41
-rw-r--r--src/sp-namedview.h2
-rw-r--r--src/ui/control-manager.cpp6
-rw-r--r--src/ui/dialog/guides.cpp25
-rw-r--r--src/ui/dialog/guides.h1
-rw-r--r--src/ui/interface.cpp3
-rw-r--r--src/ui/view/edit-widget-interface.h3
-rw-r--r--src/verbs.cpp9
-rw-r--r--src/verbs.h1
-rw-r--r--src/widgets/desktop-widget.cpp72
-rw-r--r--src/widgets/desktop-widget.h5
25 files changed, 292 insertions, 26 deletions
diff --git a/src/attributes-test.h b/src/attributes-test.h
index e197deedf..1fc3972c0 100644
--- a/src/attributes-test.h
+++ b/src/attributes-test.h
@@ -490,6 +490,7 @@ struct {char const *attr; bool supported;} const all_attrs[] = {
{"showgrid", true},
// {"gridtype", true},
{"showguides", true},
+// {"inkscape:lockguides", false}, //not sure about uncomment
{"gridtolerance", true},
{"guidetolerance", true},
{"objecttolerance", true},
diff --git a/src/attributes.cpp b/src/attributes.cpp
index d373dbc68..ad6a51c88 100644
--- a/src/attributes.cpp
+++ b/src/attributes.cpp
@@ -117,6 +117,7 @@ static SPStyleProp const props[] = {
{SP_ATTR_INKSCAPE_SNAP_PAGE_BORDER, "inkscape:snap-page"},
{SP_ATTR_INKSCAPE_CURRENT_LAYER, "inkscape:current-layer"},
{SP_ATTR_INKSCAPE_DOCUMENT_UNITS, "inkscape:document-units"}, // This setting sets the Display units, *not* the units used in SVG
+ {SP_ATTR_INKSCAPE_LOCKGUIDES, "inkscape:lockguides"},
{SP_ATTR_UNITS, "units"},
{SP_ATTR_INKSCAPE_CONNECTOR_SPACING, "inkscape:connector-spacing"},
/* SPColorProfile */
@@ -127,6 +128,7 @@ static SPStyleProp const props[] = {
{SP_ATTR_ORIENTATION, "orientation"},
{SP_ATTR_POSITION, "position"},
{SP_ATTR_INKSCAPE_COLOR, "inkscape:color"},
+ {SP_ATTR_INKSCAPE_LOCKED, "inkscape:locked"},
/* SPImage */
{SP_ATTR_X, "x"},
{SP_ATTR_Y, "y"},
diff --git a/src/attributes.h b/src/attributes.h
index 7d22858b8..03df0cb94 100644
--- a/src/attributes.h
+++ b/src/attributes.h
@@ -119,6 +119,7 @@ enum SPAttributeEnum {
SP_ATTR_INKSCAPE_SNAP_PAGE_BORDER,
SP_ATTR_INKSCAPE_CURRENT_LAYER,
SP_ATTR_INKSCAPE_DOCUMENT_UNITS,
+ SP_ATTR_INKSCAPE_LOCKGUIDES,
SP_ATTR_UNITS,
SP_ATTR_INKSCAPE_CONNECTOR_SPACING,
/* SPColorProfile */
@@ -129,6 +130,7 @@ enum SPAttributeEnum {
SP_ATTR_ORIENTATION,
SP_ATTR_POSITION,
SP_ATTR_INKSCAPE_COLOR,
+ SP_ATTR_INKSCAPE_LOCKED,
/* SPImage */
SP_ATTR_X,
SP_ATTR_Y,
diff --git a/src/desktop-events.cpp b/src/desktop-events.cpp
index b685dacbf..99bc4f7ae 100644
--- a/src/desktop-events.cpp
+++ b/src/desktop-events.cpp
@@ -50,6 +50,8 @@
#include "ui/tools-switch.h"
#include "verbs.h"
#include "widgets/desktop-widget.h"
+#include "sp-cursor.h"
+#include "pixmaps/cursor-select.xpm"
#include "xml/repr.h"
using Inkscape::DocumentUndo;
@@ -514,14 +516,18 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
break;
case GDK_ENTER_NOTIFY:
{
- sp_guideline_set_color(SP_GUIDELINE(item), guide->getHiColor());
-
+ if (!guide->getLocked()) {
+ sp_guideline_set_color(SP_GUIDELINE(item), guide->getHiColor());
+ }
// set move or rotate cursor
Geom::Point const event_w(event->crossing.x, event->crossing.y);
if ((event->crossing.state & GDK_SHIFT_MASK) && (drag_type != SP_DRAG_MOVE_ORIGIN)) {
GdkCursor *guide_cursor;
guide_cursor = gdk_cursor_new (GDK_EXCHANGE);
+ if(guide->getLocked()){
+ guide_cursor = sp_cursor_new_from_xpm(cursor_select_xpm , 1, 1);
+ }
gdk_window_set_cursor(gtk_widget_get_window (GTK_WIDGET(desktop->getCanvas())), guide_cursor);
#if GTK_CHECK_VERSION(3,0,0)
g_object_unref(guide_cursor);
@@ -531,6 +537,9 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
} else {
GdkCursor *guide_cursor;
guide_cursor = gdk_cursor_new (GDK_HAND1);
+ if(guide->getLocked()){
+ guide_cursor = sp_cursor_new_from_xpm(cursor_select_xpm , 1, 1);
+ }
gdk_window_set_cursor(gtk_widget_get_window (GTK_WIDGET(desktop->getCanvas())), guide_cursor);
#if GTK_CHECK_VERSION(3,0,0)
g_object_unref(guide_cursor);
diff --git a/src/desktop.cpp b/src/desktop.cpp
index 7b20bcb9f..ae92c058a 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -1467,6 +1467,11 @@ void SPDesktop::toggleColorProfAdjust()
_widget->toggleColorProfAdjust();
}
+void SPDesktop::toggleGuidesLock()
+{
+ _widget->toggleGuidesLock();
+}
+
bool SPDesktop::colorProfAdjustEnabled()
{
return _widget->colorProfAdjustEnabled();
diff --git a/src/desktop.h b/src/desktop.h
index 754e09766..f1444ba7b 100644
--- a/src/desktop.h
+++ b/src/desktop.h
@@ -383,6 +383,8 @@ public:
void clearWaitingCursor();
bool isWaitingCursor() const { return waiting_cursor; };
+ void toggleGuidesLock();
+
void toggleColorProfAdjust();
bool colorProfAdjustEnabled();
diff --git a/src/display/guideline.cpp b/src/display/guideline.cpp
index 44bbd14bd..4b7ea59ab 100644
--- a/src/display/guideline.cpp
+++ b/src/display/guideline.cpp
@@ -53,6 +53,7 @@ static void sp_guideline_init(SPGuideLine *gl)
{
gl->rgba = 0x0000ff7f;
+ gl->locked = false;
gl->normal_to_line = Geom::Point(0,1);
gl->angle = 3.14159265358979323846/2;
gl->point_on_line = Geom::Point(0,0);
@@ -177,9 +178,16 @@ static void sp_guideline_update(SPCanvasItem *item, Geom::Affine const &affine,
gl->affine = affine;
+ if (gl->locked) {
+ sp_ctrlpoint_set_circle(gl->origin, false);
+ sp_ctrlpoint_set_lenght(gl->origin, 6);
+ } else {
+ sp_ctrlpoint_set_circle(gl->origin, true);
+ sp_ctrlpoint_set_lenght(gl->origin, 4);
+ }
sp_ctrlpoint_set_coords(gl->origin, gl->point_on_line);
sp_canvas_item_request_update(SP_CANVAS_ITEM (gl->origin));
-
+
Geom::Point pol_transformed = gl->point_on_line*affine;
if (gl->is_horizontal()) {
sp_canvas_update_bbox (item, -1000000, round(pol_transformed[Geom::Y] - 16), 1000000, round(pol_transformed[Geom::Y] + 1));
@@ -189,6 +197,7 @@ static void sp_guideline_update(SPCanvasItem *item, Geom::Affine const &affine,
//TODO: labels in angled guidelines are not showing up for some reason.
sp_canvas_update_bbox (item, -1000000, -1000000, 1000000, 1000000);
}
+
}
// Returns 0.0 if point is on the guideline
@@ -219,6 +228,7 @@ SPCanvasItem *sp_guideline_new(SPCanvasGroup *parent, char* label, Geom::Point p
normal.normalize();
gl->label = label;
+ gl->locked = false;
gl->normal_to_line = normal;
gl->angle = tan( -gl->normal_to_line[Geom::X] / gl->normal_to_line[Geom::Y]);
sp_guideline_set_position(gl, point_on_line);
@@ -238,6 +248,12 @@ void sp_guideline_set_label(SPGuideLine *gl, const char* label)
sp_canvas_item_request_update(SP_CANVAS_ITEM (gl));
}
+void sp_guideline_set_locked(SPGuideLine *gl, const bool locked)
+{
+ gl->locked = locked;
+ sp_canvas_item_request_update(SP_CANVAS_ITEM (gl));
+}
+
void sp_guideline_set_position(SPGuideLine *gl, Geom::Point point_on_line)
{
gl->point_on_line = point_on_line;
diff --git a/src/display/guideline.h b/src/display/guideline.h
index 2d9a87d9b..778517f1d 100644
--- a/src/display/guideline.h
+++ b/src/display/guideline.h
@@ -32,6 +32,7 @@ struct SPGuideLine {
guint32 rgba;
char* label;
+ bool locked;
Geom::Point normal_to_line;
Geom::Point point_on_line;
double angle;
@@ -51,6 +52,7 @@ GType sp_guideline_get_type();
SPCanvasItem *sp_guideline_new(SPCanvasGroup *parent, char* label, Geom::Point point_on_line, Geom::Point normal);
void sp_guideline_set_label(SPGuideLine *gl, const char* label);
+void sp_guideline_set_locked(SPGuideLine *gl, const bool locked);
void sp_guideline_set_position(SPGuideLine *gl, Geom::Point point_on_line);
void sp_guideline_set_normal(SPGuideLine *gl, Geom::Point normal_to_line);
void sp_guideline_set_color(SPGuideLine *gl, unsigned int rgba);
diff --git a/src/display/sp-ctrlpoint.cpp b/src/display/sp-ctrlpoint.cpp
index 1082cb1b3..19dbbc130 100644
--- a/src/display/sp-ctrlpoint.cpp
+++ b/src/display/sp-ctrlpoint.cpp
@@ -42,7 +42,8 @@ sp_ctrlpoint_init (SPCtrlPoint *ctrlpoint)
ctrlpoint->rgba = 0x0000ff7f;
ctrlpoint->pt[Geom::X] = ctrlpoint->pt[Geom::Y] = 0.0;
ctrlpoint->item=NULL;
- ctrlpoint->radius = 2;
+ ctrlpoint->lenght = 4;
+ ctrlpoint->is_circle = true;
}
static void sp_ctrlpoint_destroy(SPCanvasItem *object)
@@ -75,8 +76,11 @@ sp_ctrlpoint_render (SPCanvasItem *item, SPCanvasBuf *buf)
cairo_new_path(buf->ct);
Geom::Point pt = cp->pt * cp->affine;
-
- cairo_arc(buf->ct, pt[Geom::X] - buf->rect.left(), pt[Geom::Y] - buf->rect.top(), cp->radius, 0.0, 2 * M_PI);
+ if( cp->is_circle ) {
+ cairo_arc(buf->ct, pt[Geom::X] - buf->rect.left(), pt[Geom::Y] - buf->rect.top(), cp->lenght/2.0, 0.0, 2 * M_PI);
+ } else {
+ cairo_rectangle(buf->ct, pt[Geom::X] - buf->rect.left() - cp->lenght/2.0, pt[Geom::Y] - buf->rect.top() - cp->lenght/2.0 , cp->lenght, cp->lenght);
+ }
cairo_stroke(buf->ct);
}
@@ -96,10 +100,10 @@ static void sp_ctrlpoint_update(SPCanvasItem *item, Geom::Affine const &affine,
Geom::Point pt = cp->pt * affine;
- item->x1 = pt[Geom::X] - cp->radius;
- item->y1 = pt[Geom::Y] - cp->radius;
- item->x2 = pt[Geom::X] + cp->radius;
- item->y2 = pt[Geom::Y] + cp->radius;
+ item->x1 = pt[Geom::X] - cp->lenght;
+ item->y1 = pt[Geom::Y] - cp->lenght;
+ item->x2 = pt[Geom::X] + cp->lenght;
+ item->y2 = pt[Geom::Y] + cp->lenght;
item->canvas->requestRedraw((int)item->x1 - 15, (int)item->y1 - 15,
(int)item->x1 + 15, (int)item->y1 + 15);
@@ -142,9 +146,15 @@ sp_ctrlpoint_set_coords (SPCtrlPoint *cp, const Geom::Point pt)
}
void
-sp_ctrlpoint_set_radius (SPCtrlPoint *cp, const double r)
+sp_ctrlpoint_set_lenght (SPCtrlPoint *cp, const double r)
+{
+ cp->lenght = r;
+}
+
+void
+sp_ctrlpoint_set_circle (SPCtrlPoint *cp, const bool circle)
{
- cp->radius = r;
+ cp->is_circle = circle;
}
/*
diff --git a/src/display/sp-ctrlpoint.h b/src/display/sp-ctrlpoint.h
index a7a5475b7..02e61caf0 100644
--- a/src/display/sp-ctrlpoint.h
+++ b/src/display/sp-ctrlpoint.h
@@ -25,7 +25,8 @@ struct SPCtrlPoint : public SPCanvasItem {
guint32 rgba;
Geom::Point pt;
Geom::Affine affine;
- double radius;
+ double lenght;
+ bool is_circle;
};
struct SPCtrlPointClass : public SPCanvasItemClass{};
@@ -34,7 +35,8 @@ GType sp_ctrlpoint_get_type (void);
void sp_ctrlpoint_set_color (SPCtrlPoint *cp, guint32 rgba);
void sp_ctrlpoint_set_coords (SPCtrlPoint *cp, const gdouble x, const gdouble y);
void sp_ctrlpoint_set_coords (SPCtrlPoint *cp, const Geom::Point pt);
-void sp_ctrlpoint_set_radius (SPCtrlPoint *cp, const double r);
+void sp_ctrlpoint_set_lenght (SPCtrlPoint *cp, const double r);
+void sp_ctrlpoint_set_circle (SPCtrlPoint *cp, const bool circle);
diff --git a/src/menus-skeleton.h b/src/menus-skeleton.h
index da78f99f1..11070d390 100644
--- a/src/menus-skeleton.h
+++ b/src/menus-skeleton.h
@@ -86,6 +86,7 @@ static char const menus_skeleton[] =
" <verb verb-id=\"EditInvert\" />\n"
" <verb verb-id=\"EditDeselect\" />\n"
" <separator/>\n"
+" <verb verb-id=\"EditGuidesToggleLock\" check=\"yes\" />\n"
" <verb verb-id=\"EditGuidesAroundPage\" />\n"
" <verb verb-id=\"EditRemoveAllGuides\" />\n"
" <separator/>\n"
diff --git a/src/pixmaps/cursor-select.xpm b/src/pixmaps/cursor-select.xpm
new file mode 100644
index 000000000..569573618
--- /dev/null
+++ b/src/pixmaps/cursor-select.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char const *cursor_select_xpm[] = {
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+". ",
+".. ",
+".+. ",
+".++. ",
+".+++. ",
+".++++. ",
+".+++++. ",
+".++++++. ",
+".+++++++. ",
+".++++++++. ",
+".+++++++++. ",
+".++++++..... ",
+".++++++. ",
+".++..++. ",
+".+. .+++. ",
+".. .++. ",
+". .+++. ",
+" .+. ",
+" .. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/src/sp-guide.cpp b/src/sp-guide.cpp
index bbdf5f260..fd07f76ef 100644
--- a/src/sp-guide.cpp
+++ b/src/sp-guide.cpp
@@ -43,6 +43,7 @@
#include <2geom/angle.h>
#include "document.h"
#include "document-undo.h"
+#include "helper-fns.h"
#include "verbs.h"
using Inkscape::DocumentUndo;
@@ -51,6 +52,7 @@ using std::vector;
SPGuide::SPGuide()
: SPObject()
, label(NULL)
+ , locked(0)
, views(NULL)
, normal_to_line(Geom::Point(0.,1.))
, point_on_line(Geom::Point(0.,0.))
@@ -73,6 +75,7 @@ void SPGuide::build(SPDocument *document, Inkscape::XML::Node *repr)
this->readAttr( "inkscape:color" );
this->readAttr( "inkscape:label" );
+ this->readAttr( "inkscape:locked" );
this->readAttr( "orientation" );
this->readAttr( "position" );
@@ -113,6 +116,12 @@ void SPGuide::set(unsigned int key, const gchar *value) {
this->set_label(this->label, false);
break;
+ case SP_ATTR_INKSCAPE_LOCKED:
+ this->locked = helperfns_read_bool(value, false);
+ if (value) {
+ this->set_locked(this->locked, false);
+ }
+ break;
case SP_ATTR_ORIENTATION:
{
if (value && !strcmp(value, "horizontal")) {
@@ -339,6 +348,9 @@ double SPGuide::getDistanceFrom(Geom::Point const &pt) const
*/
void SPGuide::moveto(Geom::Point const point_on_line, bool const commit)
{
+ if(this->locked) {
+ return;
+ }
for (GSList *l = views; l != NULL; l = l->next) {
sp_guideline_set_position(SP_GUIDELINE(l->data), point_on_line);
}
@@ -385,6 +397,9 @@ void SPGuide::moveto(Geom::Point const point_on_line, bool const commit)
*/
void SPGuide::set_normal(Geom::Point const normal_to_line, bool const commit)
{
+ if(this->locked) {
+ return;
+ }
for (GSList *l = this->views; l != NULL; l = l->next) {
sp_guideline_set_normal(SP_GUIDELINE(l->data), normal_to_line);
}
@@ -423,6 +438,18 @@ void SPGuide::set_color(const unsigned r, const unsigned g, const unsigned b, bo
}
}
+void SPGuide::set_locked(const bool locked, bool const commit)
+{
+ this->locked = locked;
+ if (views) {
+ sp_guideline_set_locked(SP_GUIDELINE(views->data), locked);
+ }
+
+ if (commit) {
+ getRepr()->setAttribute("inkscape:locked", g_strdup(locked ? "true" : "false"));
+ }
+}
+
void SPGuide::set_label(const char* label, bool const commit)
{
if (views) {
@@ -482,6 +509,7 @@ char* SPGuide::description(bool const verbose) const
descr = g_strconcat(oldDescr, shortcuts, NULL);
g_free(oldDescr);
}
+
g_free(shortcuts);
}
diff --git a/src/sp-guide.h b/src/sp-guide.h
index 382ea56f0..1ad415e85 100644
--- a/src/sp-guide.h
+++ b/src/sp-guide.h
@@ -53,6 +53,9 @@ public:
void set_label(const char* label, bool const commit);
char const* getLabel() const { return label; }
+ void set_locked(const bool locked, bool const commit);
+ bool getLocked() const { return locked; }
+
static SPGuide *createSPGuide(SPDocument *doc, Geom::Point const &pt1, Geom::Point const &pt2);
void showSPGuide(SPCanvasGroup *group, GCallback handler);
@@ -77,6 +80,7 @@ protected:
virtual void set(unsigned int key, const char* value);
char* label;
+ bool locked;
GSList *views; // contains an object of type SPGuideline (see display/guideline.cpp for definition)
Geom::Point normal_to_line;
Geom::Point point_on_line;
diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp
index b8554f352..22effd93c 100644
--- a/src/sp-namedview.cpp
+++ b/src/sp-namedview.cpp
@@ -51,7 +51,9 @@ using Inkscape::Util::unit_table;
#define DEFAULTPAGECOLOR 0xffffff00
static void sp_namedview_setup_guides(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);
static gboolean sp_str_to_bool(const gchar *str);
static gboolean sp_nv_read_opacity(const gchar *str, guint32 *color);
@@ -79,6 +81,7 @@ SPNamedView::SPNamedView() : SPObjectGroup(), snap_manager(this) {
this->editable = TRUE;
this->showguides = TRUE;
+ this->lockguides = false;
this->grids_visible = false;
this->showborder = TRUE;
this->showpageshadow = TRUE;
@@ -240,6 +243,7 @@ void SPNamedView::build(SPDocument *document, Inkscape::XML::Node *repr) {
this->readAttr( "inkscape:snap-page" );
this->readAttr( "inkscape:current-layer" );
this->readAttr( "inkscape:connector-spacing" );
+ this->readAttr( "inkscape:lockguides" );
/* Construct guideline list */
for (SPObject *o = this->firstChild() ; o; o = o->getNext() ) {
@@ -600,6 +604,11 @@ void SPNamedView::set(unsigned int key, const gchar* value) {
this->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
}
+ case SP_ATTR_INKSCAPE_LOCKGUIDES:
+ this->lockguides = value ? sp_str_to_bool(value) : FALSE;
+ sp_namedview_lock_guides(this);
+ this->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ break;
default:
SPObjectGroup::set(key, value);
break;
@@ -676,6 +685,7 @@ void SPNamedView::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *r
}
sp_namedview_show_single_guide(SP_GUIDE(g), this->showguides);
+ sp_namedview_lock_single_guide(SP_GUIDE(g), this->lockguides);
}
}
}
@@ -733,6 +743,7 @@ void SPNamedView::show(SPDesktop *desktop)
SP_GUIDE(l->data)->sensitize(desktop->getCanvas(), TRUE);
}
sp_namedview_show_single_guide(SP_GUIDE(l->data), showguides);
+ sp_namedview_lock_single_guide(SP_GUIDE(l->data), lockguides);
}
views = g_slist_prepend(views, desktop);
@@ -952,6 +963,13 @@ static void sp_namedview_setup_guides(SPNamedView *nv)
}
}
+static void sp_namedview_lock_guides(SPNamedView *nv)
+{
+ for (GSList *l = nv->guides; l != NULL; l = l->next) {
+ sp_namedview_lock_single_guide(SP_GUIDE(l->data), nv->lockguides);
+ }
+}
+
static void sp_namedview_show_single_guide(SPGuide* guide, bool show)
{
if (show) {
@@ -961,6 +979,11 @@ static void sp_namedview_show_single_guide(SPGuide* guide, bool show)
}
}
+static void sp_namedview_lock_single_guide(SPGuide* guide, bool locked)
+{
+ guide->set_locked(locked, true);
+}
+
void sp_namedview_toggle_guides(SPDocument *doc, Inkscape::XML::Node *repr)
{
unsigned int v;
@@ -979,6 +1002,23 @@ void sp_namedview_toggle_guides(SPDocument *doc, Inkscape::XML::Node *repr)
doc->setModifiedSinceSave();
}
+void sp_namedview_guides_toggle_lock(SPDocument *doc, Inkscape::XML::Node *repr)
+{
+ unsigned int v;
+ unsigned int set = sp_repr_get_boolean(repr, "inkscape:lockguides", &v);
+ if (!set) { // hide guides if not specified, for backwards compatibility
+ v = true;
+ } else {
+ v = !v;
+ }
+
+ bool saved = DocumentUndo::getUndoSensitive(doc);
+ DocumentUndo::setUndoSensitive(doc, false);
+ sp_repr_set_boolean(repr, "inkscape:lockguides", v);
+ DocumentUndo::setUndoSensitive(doc, saved);
+ doc->setModifiedSinceSave();
+}
+
void sp_namedview_show_grids(SPNamedView * namedview, bool show, bool dirty_document)
{
namedview->grids_visible = show;
@@ -1077,6 +1117,7 @@ void SPNamedView::setGuides(bool v)
g_assert(this->getRepr() != NULL);
sp_repr_set_boolean(this->getRepr(), "showguides", v);
sp_repr_set_boolean(this->getRepr(), "inkscape:guide-bbox", v);
+ sp_repr_set_boolean(this->getRepr(), "inkscape:locked", false);
}
bool SPNamedView::getGuides()
diff --git a/src/sp-namedview.h b/src/sp-namedview.h
index f1ecc12d3..d95da1254 100644
--- a/src/sp-namedview.h
+++ b/src/sp-namedview.h
@@ -44,6 +44,7 @@ public:
unsigned int editable : 1;
unsigned int showguides : 1;
+ unsigned int lockguides : 1;
unsigned int showborder : 1;
unsigned int showpageshadow : 1;
unsigned int borderlayer : 2;
@@ -122,6 +123,7 @@ void sp_namedview_document_from_window(SPDesktop *desktop);
void sp_namedview_update_layers_from_document (SPDesktop *desktop);
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);
Inkscape::CanvasGrid * sp_namedview_get_first_enabled_grid(SPNamedView *namedview);
diff --git a/src/ui/control-manager.cpp b/src/ui/control-manager.cpp
index 5a3c5a496..7a5620684 100644
--- a/src/ui/control-manager.cpp
+++ b/src/ui/control-manager.cpp
@@ -298,7 +298,11 @@ void ControlManagerImpl::updateItem(SPCanvasItem *item)
double target = _sizeTable[item->ctrlType][_size - 1];
if ((item->ctrlType == CTRL_TYPE_ORIGIN) && SP_IS_CTRLPOINT(item)) {
- sp_ctrlpoint_set_radius(SP_CTRLPOINT(item), target / 2.0);
+ if (SP_CTRLPOINT(item)->is_circle ) {
+ sp_ctrlpoint_set_lenght(SP_CTRLPOINT(item), target );
+ } else {
+ sp_ctrlpoint_set_lenght(SP_CTRLPOINT(item), target + 2 );
+ }
} else {
if (_sizeChangers.count(item->ctrlType) && _manager.isSelected(item)) {
target += 2;
diff --git a/src/ui/dialog/guides.cpp b/src/ui/dialog/guides.cpp
index af8e2cc31..e0efcde36 100644
--- a/src/ui/dialog/guides.cpp
+++ b/src/ui/dialog/guides.cpp
@@ -44,6 +44,7 @@ namespace Dialogs {
GuidelinePropertiesDialog::GuidelinePropertiesDialog(SPGuide *guide, SPDesktop *desktop)
: _desktop(desktop), _guide(guide),
+ _locked_toggle(_("Lo_cked"), _("Lock the movement of guides")),
_relative_toggle(_("Rela_tive change"), _("Move and/or rotate the guide relative to current settings")),
_spin_button_x(C_("Guides", "_X:"), "", UNIT_TYPE_LINEAR, "", "", &_unit_menu),
_spin_button_y(C_("Guides", "_Y:"), "", UNIT_TYPE_LINEAR, "", "", &_unit_menu),
@@ -100,6 +101,9 @@ void GuidelinePropertiesDialog::_onOK()
double rad_angle = Geom::deg_to_rad( deg_angle );
normal = Geom::rot90(Geom::Point::polar(rad_angle, 1.0));
}
+ //To allow reposition from dialog
+ _guide->set_locked(false, true);
+
_guide->set_normal(normal, true);
double const points_x = _spin_button_x.getValue("px");
@@ -113,6 +117,11 @@ void GuidelinePropertiesDialog::_onOK()
const gchar* name = g_strdup( _label_entry.getEntry()->get_text().c_str() );
_guide->set_label(name, true);
+
+ const bool locked = _locked_toggle.get_active();
+
+ _guide->set_locked(locked, true);
+
g_free((gpointer) name);
#if WITH_GTKMM_3_0
@@ -269,6 +278,12 @@ void GuidelinePropertiesDialog::_setup() {
_relative_toggle.set_valign(Gtk::ALIGN_FILL);
_relative_toggle.set_hexpand();
_layout_table.attach(_relative_toggle, 1, 7, 2, 1);
+
+ // locked radio button
+ _locked_toggle.set_halign(Gtk::ALIGN_FILL);
+ _locked_toggle.set_valign(Gtk::ALIGN_FILL);
+ _locked_toggle.set_hexpand();
+ _layout_table.attach(_locked_toggle, 1, 8, 2, 1);
#else
_layout_table.attach(_spin_angle,
1, 3, 6, 7, Gtk::EXPAND | Gtk::FILL, Gtk::FILL);
@@ -276,11 +291,21 @@ void GuidelinePropertiesDialog::_setup() {
// mode radio button
_layout_table.attach(_relative_toggle,
1, 3, 7, 8, Gtk::EXPAND | Gtk::FILL, Gtk::FILL);
+
+ // locked radio button
+ _layout_table.attach(_locked_toggle,
+ 1, 3, 8, 9, Gtk::EXPAND | Gtk::FILL, Gtk::FILL);
#endif
_relative_toggle.signal_toggled().connect(sigc::mem_fun(*this, &GuidelinePropertiesDialog::_modeChanged));
_relative_toggle.set_active(_relative_toggle_status);
+ bool global_guides_lock = _desktop->namedview->lockguides;
+ if(global_guides_lock){
+ _locked_toggle.set_sensitive(false);
+ }
+ _locked_toggle.set_active(_guide->getLocked());
+
// don't know what this exactly does, but it results in that the dialog closes when entering a value and pressing enter (see LP bug 484187)
g_signal_connect_swapped(G_OBJECT(_spin_button_x.getWidget()->gobj()), "activate",
G_CALLBACK(gtk_window_activate_default), gobj());
diff --git a/src/ui/dialog/guides.h b/src/ui/dialog/guides.h
index 4ff7b4fde..5dce0d6ed 100644
--- a/src/ui/dialog/guides.h
+++ b/src/ui/dialog/guides.h
@@ -79,6 +79,7 @@ private:
Gtk::Label _label_name;
Gtk::Label _label_descr;
+ Inkscape::UI::Widget::CheckButton _locked_toggle;
Inkscape::UI::Widget::CheckButton _relative_toggle;
static bool _relative_toggle_status; // remember the status of the _relative_toggle_status button across instances
Inkscape::UI::Widget::UnitMenu _unit_menu;
diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp
index 6fd5bed07..91301fb60 100644
--- a/src/ui/interface.cpp
+++ b/src/ui/interface.cpp
@@ -577,6 +577,9 @@ static gboolean checkitem_update(GtkWidget *widget, GdkEventExpose * /*event*/,
if (!strcmp(action->id, "ToggleGrid")) {
ison = dt->gridsEnabled();
}
+ else if (!strcmp(action->id, "EditGuidesToggleLock")) {
+ ison = dt->namedview->lockguides;
+ }
else if (!strcmp(action->id, "ToggleGuides")) {
ison = dt->namedview->getGuides();
}
diff --git a/src/ui/view/edit-widget-interface.h b/src/ui/view/edit-widget-interface.h
index 55683871d..fcba0c6da 100644
--- a/src/ui/view/edit-widget-interface.h
+++ b/src/ui/view/edit-widget-interface.h
@@ -116,6 +116,9 @@ struct EditWidgetInterface
/// Toggle CMS on/off and set preference value accordingly
virtual void toggleColorProfAdjust() = 0;
+ /// Toggle lock guides on/off and set namedview value accordingly
+ virtual void toggleGuidesLock() = 0;
+
/// Is CMS on/off
virtual bool colorProfAdjustEnabled() = 0;
diff --git a/src/verbs.cpp b/src/verbs.cpp
index 6b13eabb6..ed4b1ceb0 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -952,6 +952,10 @@ void EditVerb::perform(SPAction *action, void *data)
g_return_if_fail(ensure_desktop_valid(action));
SPDesktop *dt = sp_action_get_desktop(action);
+ SPDocument *doc = dt->getDocument();
+
+ Inkscape::XML::Node *repr = dt->namedview->getRepr();
+
switch (reinterpret_cast<std::size_t>(data)) {
case SP_VERB_EDIT_UNDO:
sp_undo(dt, dt->getDocument());
@@ -1079,10 +1083,12 @@ void EditVerb::perform(SPAction *action, void *data)
case SP_VERB_EDIT_DELETE_ALL_GUIDES:
sp_guide_delete_all_guides(dt);
break;
+ case SP_VERB_EDIT_GUIDES_TOGGLE_LOCK:
+ dt->toggleGuidesLock();
+ break;
case SP_VERB_EDIT_GUIDES_AROUND_PAGE:
sp_guide_create_guides_around_page(dt);
break;
-
case SP_VERB_EDIT_NEXT_PATHEFFECT_PARAMETER:
sp_selection_next_patheffect_param(dt);
break;
@@ -2540,6 +2546,7 @@ Verb *Verb::_base_verbs[] = {
N_("Deselect any selected objects or nodes"), INKSCAPE_ICON("edit-select-none")),
new EditVerb(SP_VERB_EDIT_DELETE_ALL_GUIDES, "EditRemoveAllGuides", N_("Delete All Guides"),
N_("Delete all the guides in the document"), NULL),
+ new EditVerb(SP_VERB_EDIT_GUIDES_TOGGLE_LOCK, "EditGuidesToggleLock", N_("Lock All Guides"), N_("Toggle lock of all guides in the document"), NULL),
new EditVerb(SP_VERB_EDIT_GUIDES_AROUND_PAGE, "EditGuidesAroundPage", N_("Create _Guides Around the Page"),
N_("Create four guides aligned with the page borders"), NULL),
new EditVerb(SP_VERB_EDIT_NEXT_PATHEFFECT_PARAMETER, "EditNextPathEffectParameter", N_("Next path effect parameter"),
diff --git a/src/verbs.h b/src/verbs.h
index 27aecae64..e16acb2d1 100644
--- a/src/verbs.h
+++ b/src/verbs.h
@@ -107,6 +107,7 @@ enum {
SP_VERB_EDIT_SELECT_PREV,
SP_VERB_EDIT_DESELECT,
SP_VERB_EDIT_DELETE_ALL_GUIDES,
+ SP_VERB_EDIT_GUIDES_TOGGLE_LOCK,
SP_VERB_EDIT_GUIDES_AROUND_PAGE,
SP_VERB_EDIT_NEXT_PATHEFFECT_PARAMETER,
/* Selection */
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index e19f56e48..fd2847506 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -107,6 +107,7 @@ static void sp_desktop_widget_realize (GtkWidget *widget);
static gint sp_desktop_widget_event (GtkWidget *widget, GdkEvent *event, SPDesktopWidget *dtw);
static void sp_dtw_color_profile_event(EgeColorProfTracker *widget, SPDesktopWidget *dtw);
+static void sp_update_guides_lock( GtkWidget *button, gpointer data );
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
static void cms_adjust_toggled( GtkWidget *button, gpointer data );
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
@@ -390,6 +391,21 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
dtw->tool_toolbox = ToolboxFactory::createToolToolbox();
ToolboxFactory::setOrientation( dtw->tool_toolbox, GTK_ORIENTATION_VERTICAL );
gtk_box_pack_start( GTK_BOX(dtw->hbox), dtw->tool_toolbox, FALSE, TRUE, 0 );
+ /* Lock all guides */
+#if GTK_CHECK_VERSION(3,0,0)
+ dtw->lock_and_hruler = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+#else
+ dtw->lock_and_hruler = gtk_hbox_new (FALSE, 0);
+#endif
+ // Lock guides button
+ dtw->guides_lock = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
+ SP_BUTTON_TYPE_TOGGLE,
+ NULL,
+ INKSCAPE_ICON("object-locked"),
+ _("Toggle lock of all guides in the document"));
+
+ gtk_box_pack_start (GTK_BOX (dtw->lock_and_hruler), dtw->guides_lock, FALSE, FALSE, 0);
+ g_signal_connect (G_OBJECT (dtw->guides_lock), "toggled", G_CALLBACK (sp_update_guides_lock), dtw);
/* Horizontal ruler */
GtkWidget *eventbox = gtk_event_box_new ();
@@ -399,6 +415,7 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
sp_ruler_set_unit(SP_RULER(dtw->hruler), pt);
gtk_widget_set_tooltip_text (dtw->hruler_box, gettext(pt->name_plural.c_str()));
gtk_container_add (GTK_CONTAINER (eventbox), dtw->hruler);
+ gtk_container_add (GTK_CONTAINER (dtw->lock_and_hruler), eventbox);
g_signal_connect (G_OBJECT (eventbox), "button_press_event", G_CALLBACK (sp_dt_hruler_event), dtw);
g_signal_connect (G_OBJECT (eventbox), "button_release_event", G_CALLBACK (sp_dt_hruler_event), dtw);
g_signal_connect (G_OBJECT (eventbox), "motion_notify_event", G_CALLBACK (sp_dt_hruler_event), dtw);
@@ -407,23 +424,25 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
GtkWidget *tbl = gtk_grid_new();
dtw->canvas_tbl = gtk_grid_new();
- gtk_grid_attach(GTK_GRID(dtw->canvas_tbl), eventbox, 1, 0, 1, 1);
+ gtk_grid_attach(GTK_GRID(dtw->canvas_tbl), dtw->lock_and_hruler, 0, 0, 1, 1);
#else
GtkWidget *tbl = gtk_table_new(2, 3, FALSE);
dtw->canvas_tbl = gtk_table_new(3, 3, FALSE);
gtk_table_attach(GTK_TABLE(dtw->canvas_tbl),
- eventbox,
- 1, 2, 0, 1,
+ dtw->lock_and_hruler,
+ 0, 2, 0, 1,
GTK_FILL, GTK_FILL,
0, 0);
#endif
-
+
gtk_box_pack_start( GTK_BOX(dtw->hbox), tbl, TRUE, TRUE, 1 );
/* Vertical ruler */
eventbox = gtk_event_box_new ();
dtw->vruler = sp_ruler_new(GTK_ORIENTATION_VERTICAL);
+
+ /* Vertical ruler */
dtw->vruler_box = eventbox;
sp_ruler_set_unit (SP_RULER (dtw->vruler), pt);
gtk_widget_set_tooltip_text (dtw->vruler_box, gettext(pt->name_plural.c_str()));
@@ -446,6 +465,9 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
// Horizontal scrollbar
dtw->hadj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, -4000.0, 4000.0, 10.0, 100.0, 4.0));
+
+
+
#if GTK_CHECK_VERSION(3,0,0)
dtw->hscrollbar = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (dtw->hadj));
gtk_grid_attach(GTK_GRID(dtw->canvas_tbl), dtw->hscrollbar, 1, 2, 1, 1);
@@ -1015,6 +1037,7 @@ sp_desktop_widget_event (GtkWidget *widget, GdkEvent *event, SPDesktopWidget *dt
return FALSE;
}
+
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
void sp_dtw_color_profile_event(EgeColorProfTracker */*tracker*/, SPDesktopWidget *dtw)
{
@@ -1036,6 +1059,27 @@ void sp_dtw_color_profile_event(EgeColorProfTracker */*tracker*/, SPDesktopWidge
}
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
+void sp_update_guides_lock( GtkWidget */*button*/, gpointer data )
+{
+ SPDesktopWidget *dtw = SP_DESKTOP_WIDGET(data);
+
+ bool down = SP_BUTTON_IS_DOWN(dtw->guides_lock);
+
+ SPDocument *doc = dtw->desktop->getDocument();
+ SPNamedView *nv = dtw->desktop->getNamedView();
+ Inkscape::XML::Node *repr = nv->getRepr();
+
+ if ( down != nv->lockguides ) {
+ nv->lockguides = down;
+ sp_namedview_guides_toggle_lock(doc, repr);
+ if (down) {
+ dtw->setMessage (Inkscape::NORMAL_MESSAGE, _("Locked all guides"));
+ } else {
+ dtw->setMessage (Inkscape::NORMAL_MESSAGE, _("Unlocked all guides"));
+ }
+ }
+}
+
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
void cms_adjust_toggled( GtkWidget */*button*/, gpointer data )
{
@@ -1549,10 +1593,10 @@ void SPDesktopWidget::layoutWidgets()
}
if (!prefs->getBool(pref_root + "rulers/state", true)) {
- gtk_widget_hide (dtw->hruler);
+ gtk_widget_hide (dtw->lock_and_hruler);
gtk_widget_hide (dtw->vruler);
} else {
- gtk_widget_show_all (dtw->hruler);
+ gtk_widget_show_all (dtw->lock_and_hruler);
gtk_widget_show_all (dtw->vruler);
}
}
@@ -1684,6 +1728,7 @@ SPDesktopWidget* SPDesktopWidget::createInstance(SPNamedView *namedview)
/* Once desktop is set, we can update rulers */
sp_desktop_widget_update_rulers (dtw);
+ sp_button_toggle_set_down( SP_BUTTON(dtw->guides_lock), namedview->lockguides );
sp_view_widget_set_view (SP_VIEW_WIDGET (dtw), dtw->desktop);
@@ -2039,12 +2084,12 @@ void
sp_desktop_widget_toggle_rulers (SPDesktopWidget *dtw)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- if (gtk_widget_get_visible (dtw->hruler)) {
- gtk_widget_hide (dtw->hruler);
+ if (gtk_widget_get_visible (dtw->lock_and_hruler)) {
+ gtk_widget_hide (dtw->lock_and_hruler);
gtk_widget_hide (dtw->vruler);
prefs->setBool(dtw->desktop->is_fullscreen() ? "/fullscreen/rulers/state" : "/window/rulers/state", false);
} else {
- gtk_widget_show_all (dtw->hruler);
+ gtk_widget_show_all (dtw->lock_and_hruler);
gtk_widget_show_all (dtw->vruler);
prefs->setBool(dtw->desktop->is_fullscreen() ? "/fullscreen/rulers/state" : "/window/rulers/state", true);
}
@@ -2075,7 +2120,6 @@ bool sp_desktop_widget_color_prof_adj_enabled( SPDesktopWidget *dtw )
void sp_desktop_widget_toggle_color_prof_adj( SPDesktopWidget *dtw )
{
-
if ( gtk_widget_get_sensitive( dtw->cms_adjust ) ) {
if ( SP_BUTTON_IS_DOWN(dtw->cms_adjust) ) {
sp_button_toggle_set_down( SP_BUTTON(dtw->cms_adjust), FALSE );
@@ -2085,6 +2129,14 @@ void sp_desktop_widget_toggle_color_prof_adj( SPDesktopWidget *dtw )
}
}
+void sp_desktop_widget_toggle_guides_lock( SPDesktopWidget *dtw )
+{
+ if ( SP_BUTTON_IS_DOWN(dtw->guides_lock) ) {
+ sp_button_toggle_set_down( SP_BUTTON(dtw->guides_lock), FALSE );
+ } else {
+ sp_button_toggle_set_down( SP_BUTTON(dtw->guides_lock), TRUE );
+ }
+}
/* Unused
void
sp_spw_toggle_menubar (SPDesktopWidget *dtw, bool is_fullscreen)
diff --git a/src/widgets/desktop-widget.h b/src/widgets/desktop-widget.h
index 489217d9a..bb5834165 100644
--- a/src/widgets/desktop-widget.h
+++ b/src/widgets/desktop-widget.h
@@ -49,6 +49,7 @@ void sp_desktop_widget_toggle_rulers (SPDesktopWidget *dtw);
void sp_desktop_widget_toggle_scrollbars (SPDesktopWidget *dtw);
void sp_desktop_widget_update_scrollbars (SPDesktopWidget *dtw, double scale);
void sp_desktop_widget_toggle_color_prof_adj( SPDesktopWidget *dtw );
+void sp_desktop_widget_toggle_guides_lock( SPDesktopWidget *dtw );
bool sp_desktop_widget_color_prof_adj_enabled( SPDesktopWidget *dtw );
void sp_dtw_desktop_activate (SPDesktopWidget *dtw);
@@ -87,6 +88,8 @@ struct SPDesktopWidget {
GtkWidget *hruler, *vruler;
GtkWidget *hruler_box, *vruler_box; // eventboxes for setting tooltips
+ GtkWidget *guides_lock;
+ GtkWidget *lock_and_hruler;
GtkWidget *sticky_zoom;
GtkWidget *cms_adjust;
GtkWidget *coord_status;
@@ -181,6 +184,8 @@ struct SPDesktopWidget {
{ sp_desktop_widget_toggle_scrollbars (_dtw); }
virtual void toggleColorProfAdjust()
{ sp_desktop_widget_toggle_color_prof_adj(_dtw); }
+ virtual void toggleGuidesLock()
+ { sp_desktop_widget_toggle_guides_lock(_dtw); }
virtual bool colorProfAdjustEnabled()
{ return sp_desktop_widget_color_prof_adj_enabled(_dtw); }
virtual void updateZoom()