summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-12-02 17:24:10 +0000
committerjabiertxof <jabier.arraiza@marker.es>2015-12-02 17:24:10 +0000
commit067752b1cf216b8aa55c9e52926496553673cdb7 (patch)
treeb2abbbfbb4401ae56997dc59f43460c0b4d095f7
parentAdd some SVG2 text properties to tables. (diff)
downloadinkscape-067752b1cf216b8aa55c9e52926496553673cdb7.tar.gz
inkscape-067752b1cf216b8aa55c9e52926496553673cdb7.zip
Add lock to guides
(bzr r14500.1.1)
-rw-r--r--src/attributes.cpp1
-rw-r--r--src/attributes.h1
-rw-r--r--src/display/guideline.cpp8
-rw-r--r--src/display/guideline.h2
-rw-r--r--src/sp-guide.cpp28
-rw-r--r--src/sp-guide.h4
-rw-r--r--src/ui/dialog/guides.cpp22
-rw-r--r--src/ui/dialog/guides.h1
8 files changed, 67 insertions, 0 deletions
diff --git a/src/attributes.cpp b/src/attributes.cpp
index a237f8861..5da75e348 100644
--- a/src/attributes.cpp
+++ b/src/attributes.cpp
@@ -116,6 +116,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_LOCKED, "inkscape:locked"},
{SP_ATTR_UNITS, "units"},
{SP_ATTR_INKSCAPE_CONNECTOR_SPACING, "inkscape:connector-spacing"},
/* SPColorProfile */
diff --git a/src/attributes.h b/src/attributes.h
index 42ec99d8f..d5bb20ca3 100644
--- a/src/attributes.h
+++ b/src/attributes.h
@@ -118,6 +118,7 @@ enum SPAttributeEnum {
SP_ATTR_INKSCAPE_SNAP_PAGE_BORDER,
SP_ATTR_INKSCAPE_CURRENT_LAYER,
SP_ATTR_INKSCAPE_DOCUMENT_UNITS,
+ SP_ATTR_INKSCAPE_LOCKED,
SP_ATTR_UNITS,
SP_ATTR_INKSCAPE_CONNECTOR_SPACING,
/* SPColorProfile */
diff --git a/src/display/guideline.cpp b/src/display/guideline.cpp
index 44bbd14bd..0a564f550 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);
@@ -219,6 +220,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 +240,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/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/ui/dialog/guides.cpp b/src/ui/dialog/guides.cpp
index af8e2cc31..4951cf39c 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,18 @@ 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);
+ std::cout << _guide->getLocked() << "_guide->getLocked()\n";
+ _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;