summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2017-10-01 21:59:23 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2017-10-01 21:59:23 +0000
commitfc21cbb9a2d2f830c217d7ea96311be36a561e62 (patch)
treead73f7dacf6b09745dfd5bcc2d659095a16db0fe /src
parentA little styling tweak to a LPE expander (diff)
downloadinkscape-fc21cbb9a2d2f830c217d7ea96311be36a561e62.tar.gz
inkscape-fc21cbb9a2d2f830c217d7ea96311be36a561e62.zip
Add better transform handle to Clone Item LPE
Diffstat (limited to 'src')
-rw-r--r--src/live_effects/effect.cpp1
-rw-r--r--src/live_effects/lpe-clone-original.cpp81
-rw-r--r--src/live_effects/lpe-clone-original.h11
-rw-r--r--src/live_effects/parameter/item.cpp10
-rw-r--r--src/live_effects/parameter/item.h5
-rw-r--r--src/live_effects/parameter/originalitem.cpp14
-rw-r--r--src/live_effects/parameter/originalitem.h2
-rw-r--r--src/live_effects/parameter/originalitemarray.cpp2
8 files changed, 104 insertions, 22 deletions
diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp
index 2332ab8f2..2e1160764 100644
--- a/src/live_effects/effect.cpp
+++ b/src/live_effects/effect.cpp
@@ -81,6 +81,7 @@
#include "display/curve.h"
#include <stdio.h>
#include <string.h>
+#include <gtkmm/expander.h>
namespace Inkscape {
diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp
index 6e5ad66bf..2d577bffd 100644
--- a/src/live_effects/lpe-clone-original.cpp
+++ b/src/live_effects/lpe-clone-original.cpp
@@ -46,7 +46,10 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) :
this->getRepr()->setAttribute("method", "bsplinespiro");
this->getRepr()->setAttribute("allow_transforms", "false");
};
-
+ is_updating = false;
+ listening = false;
+ previus_method = CLM_D;
+ linked = g_strdup(this->getRepr()->attribute("linkeditem"));
registerParameter(&linkeditem);
registerParameter(&method);
registerParameter(&attributes);
@@ -183,9 +186,9 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, const char *
sp_repr_css_write_string(css_dest,css_str);
dest->getRepr()->setAttribute("style", g_strdup(css_str.c_str()));
}
-
void
LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){
+ start_listening();
if (linkeditem.linksToItem()) {
Glib::ustring attr = "";
if (method != CLM_NONE) {
@@ -201,18 +204,82 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){
}
style_attr += Glib::ustring(style_attributes.param_getSVGValue()) + Glib::ustring(",");
- SPItem * origin = SP_ITEM(linkeditem.getObject());
- SPItem * dest = SP_ITEM(sp_lpe_item);
- cloneAttrbutes(origin, dest, g_strdup(attr.c_str()), g_strdup(style_attr.c_str()));
+ SPItem * orig = SP_ITEM(linkeditem.getObject());
+ SPItem * dest = SP_ITEM(sp_lpe_item);
+ Geom::OptRect o_bbox = orig->geometricBounds();
+ Geom::OptRect d_bbox = dest->geometricBounds();
+ gchar * id = g_strdup(orig->getId());
+ if (allow_transforms &&
+ !linkeditem.last_transform.isIdentity() &&
+ linkeditem.last_transform.isTranslation() &&
+ method != CLM_NONE)
+ {
+ Geom::Point expansion_dest = dest->transform.expansion();
+ Geom::Point expansion_orig = orig->transform.expansion();
+ dest->transform *= Geom::Scale(expansion_dest).inverse();
+ dest->transform *= Geom::Scale(expansion_orig);
+ dest->transform *= linkeditem.last_transform.inverse();
+ dest->transform *= Geom::Scale(expansion_orig).inverse();
+ dest->transform *= Geom::Scale(expansion_dest);
+ }
+ if ((strcmp(id, linked) != 0 || (previus_method != method && previus_method == CLM_NONE )) &&
+ allow_transforms &&
+ o_bbox &&
+ d_bbox)
+ {
+ dest->transform *= Geom::Translate((*o_bbox).corner(0) - (*d_bbox).corner(0)).inverse();
+ }
+ cloneAttrbutes(orig, dest, g_strdup(attr.c_str()), g_strdup(style_attr.c_str()));
+ if (allow_transforms &&
+ previus_method != method &&
+ method == CLM_NONE)
+ {
+ dest->transform *= Geom::Translate((*d_bbox).corner(0) - (*o_bbox).corner(0)).inverse();
+ }
if (!allow_transforms) {
- SP_ITEM(dest)->getRepr()->setAttribute("transform", SP_ITEM(origin)->getAttribute("transform"));
+ SP_ITEM(dest)->getRepr()->setAttribute("transform", SP_ITEM(orig)->getAttribute("transform"));
}
+ linked = g_strdup(id);
+ g_free(id);
+ } else {
+ linked = g_strdup("");
}
+ previus_method = method;
}
-LPECloneOriginal::~LPECloneOriginal()
+void
+LPECloneOriginal::start_listening()
+{
+ if ( !sp_lpe_item || listening ) {
+ return;
+ }
+ quit_listening();
+ modified_connection = SP_OBJECT(sp_lpe_item)->connectModified(sigc::mem_fun(*this, &LPECloneOriginal::modified));
+ listening = true;
+}
+
+void
+LPECloneOriginal::quit_listening(void)
{
+ modified_connection.disconnect();
+ listening = false;
+}
+void
+LPECloneOriginal::modified(SPObject */*obj*/, guint /*flags*/)
+{
+ if ( !sp_lpe_item || is_updating) {
+ is_updating = false;
+ return;
+ }
+ SP_OBJECT(this->getLPEObj())->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ is_updating = true;
+}
+
+LPECloneOriginal::~LPECloneOriginal()
+{
+ quit_listening();
+ g_free(linked);
}
void
diff --git a/src/live_effects/lpe-clone-original.h b/src/live_effects/lpe-clone-original.h
index b78b144bc..e429d6817 100644
--- a/src/live_effects/lpe-clone-original.h
+++ b/src/live_effects/lpe-clone-original.h
@@ -8,13 +8,14 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtkmm/expander.h>
#include "live_effects/effect.h"
#include "live_effects/parameter/enum.h"
#include "live_effects/parameter/originalitem.h"
#include "live_effects/parameter/text.h"
#include "live_effects/lpegroupbbox.h"
+#include <sigc++/sigc++.h>
+
namespace Inkscape {
namespace LivePathEffect {
@@ -34,6 +35,9 @@ public:
virtual void doBeforeEffect (SPLPEItem const* lpeitem);
virtual void transform_multiply(Geom::Affine const& postmul, bool set);
void cloneAttrbutes(SPObject *origin, SPObject *dest, const char * attributes, const char * style_attributes);
+ void modified(SPObject */*obj*/, guint /*flags*/);
+ void start_listening();
+ void quit_listening();
private:
OriginalItemParam linkeditem;
@@ -41,6 +45,11 @@ private:
TextParam attributes;
TextParam style_attributes;
BoolParam allow_transforms;
+ gchar * linked;
+ Clonelpemethod previus_method;
+ bool listening;
+ bool is_updating;
+ sigc::connection modified_connection;
LPECloneOriginal(const LPECloneOriginal&);
LPECloneOriginal& operator=(const LPECloneOriginal&);
};
diff --git a/src/live_effects/parameter/item.cpp b/src/live_effects/parameter/item.cpp
index e075cab1a..bf7402d99 100644
--- a/src/live_effects/parameter/item.cpp
+++ b/src/live_effects/parameter/item.cpp
@@ -43,6 +43,7 @@ ItemParam::ItemParam( const Glib::ustring& label, const Glib::ustring& tip,
href(NULL),
ref( (SPObject*)effect->getLPEObj() )
{
+ last_transform = Geom::identity();
defvalue = g_strdup(default_value);
ref_changed_connection = ref.changedSignal().connect(sigc::mem_fun(*this, &ItemParam::ref_changed));
}
@@ -213,9 +214,18 @@ ItemParam::linked_modified_callback(SPObject *linked_obj, guint /*flags*/)
{
emit_changed();
SP_OBJECT(param_effect->getLPEObj())->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ last_transform = Geom::identity();
}
void
+ItemParam::linked_transformed_callback(Geom::Affine const *rel_transf, SPItem */*moved_item*/)
+{
+ last_transform = *rel_transf;
+ SP_OBJECT(param_effect->getLPEObj())->requestModified(SP_OBJECT_MODIFIED_FLAG);
+}
+
+
+void
ItemParam::on_link_button_click()
{
Inkscape::UI::ClipboardManager *cm = Inkscape::UI::ClipboardManager::get();
diff --git a/src/live_effects/parameter/item.h b/src/live_effects/parameter/item.h
index b98294258..d32098db5 100644
--- a/src/live_effects/parameter/item.h
+++ b/src/live_effects/parameter/item.h
@@ -35,14 +35,13 @@ public:
virtual bool param_readSVGValue(const gchar * strvalue);
virtual gchar * param_getSVGValue() const;
virtual gchar * param_getDefaultSVGValue() const;
-
virtual void param_set_default();
virtual void param_update_default(const gchar * default_value);
void param_set_and_write_default();
virtual void addCanvasIndicators(SPLPEItem const* lpeitem, std::vector<Geom::PathVector> &hp_vec);
-
sigc::signal <void> signal_item_pasted;
sigc::signal <void> signal_item_changed;
+ Geom::Affine last_transform;
bool changed; /* this gets set whenever the path is changed (this is set to true, and then the signal_item_changed signal is emitted).
* the user must set it back to false if she wants to use it sensibly */
protected:
@@ -61,7 +60,7 @@ protected:
void linked_modified(SPObject *linked_obj, guint flags);
void linked_transformed(Geom::Affine const *rel_transf, SPItem *moved_item);
virtual void linked_modified_callback(SPObject *linked_obj, guint flags);
- virtual void linked_transformed_callback(Geom::Affine const * /*rel_transf*/, SPItem * /*moved_item*/) {};
+ virtual void linked_transformed_callback(Geom::Affine const *rel_transf, SPItem */*moved_item*/);
void on_link_button_click();
void emit_changed();
diff --git a/src/live_effects/parameter/originalitem.cpp b/src/live_effects/parameter/originalitem.cpp
index 6de70be17..e828e1800 100644
--- a/src/live_effects/parameter/originalitem.cpp
+++ b/src/live_effects/parameter/originalitem.cpp
@@ -35,7 +35,6 @@ OriginalItemParam::OriginalItemParam( const Glib::ustring& label, const Glib::us
Effect* effect)
: ItemParam(label, tip, key, wr, effect, "")
{
- _insensitive = false;
}
OriginalItemParam::~OriginalItemParam()
@@ -88,17 +87,16 @@ OriginalItemParam::param_newWidget()
void
OriginalItemParam::linked_modified_callback(SPObject *linked_obj, guint /*flags*/)
{
- if (!_insensitive) {
- emit_changed();
- SP_OBJECT(param_effect->getLPEObj())->requestModified(SP_OBJECT_MODIFIED_FLAG);
- }
+ emit_changed();
+ SP_OBJECT(param_effect->getLPEObj())->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ last_transform = Geom::identity();
}
void
-OriginalItemParam::linked_transformed_callback(Geom::Affine const * /*rel_transf*/, SPItem * /*moved_item*/)
+OriginalItemParam::linked_transformed_callback(Geom::Affine const * rel_transf, SPItem *moved_item)
{
-/** \todo find good way to compensate for referenced item transform, like done for normal clones.
- * See sp-use.cpp: sp_use_move_compensate */
+ last_transform = *rel_transf;
+ SP_OBJECT(param_effect->getLPEObj())->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
diff --git a/src/live_effects/parameter/originalitem.h b/src/live_effects/parameter/originalitem.h
index 9b692c503..168728f86 100644
--- a/src/live_effects/parameter/originalitem.h
+++ b/src/live_effects/parameter/originalitem.h
@@ -23,7 +23,6 @@ public:
Inkscape::UI::Widget::Registry* wr,
Effect* effect);
virtual ~OriginalItemParam();
- void setInsensitive(bool insensitive) { insensitive = _insensitive; }
bool linksToItem() const { return (href != NULL); }
SPItem * getObject() const { return ref.getObject(); }
@@ -36,7 +35,6 @@ protected:
void on_select_original_button_click();
private:
- bool _insensitive;
OriginalItemParam(const OriginalItemParam&);
OriginalItemParam& operator=(const OriginalItemParam&);
};
diff --git a/src/live_effects/parameter/originalitemarray.cpp b/src/live_effects/parameter/originalitemarray.cpp
index 83c237f2e..830d8aa90 100644
--- a/src/live_effects/parameter/originalitemarray.cpp
+++ b/src/live_effects/parameter/originalitemarray.cpp
@@ -444,7 +444,7 @@ gchar * OriginalItemArrayParam::param_getSVGValue() const
gchar * OriginalItemArrayParam::param_getDefaultSVGValue() const
{
- return "";
+ return g_strdup("");
}
void OriginalItemArrayParam::update()