summaryrefslogtreecommitdiffstats
path: root/src/desktop-style.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/desktop-style.cpp')
-rw-r--r--src/desktop-style.cpp66
1 files changed, 36 insertions, 30 deletions
diff --git a/src/desktop-style.cpp b/src/desktop-style.cpp
index 7f9b46c7d..4c07c76ea 100644
--- a/src/desktop-style.cpp
+++ b/src/desktop-style.cpp
@@ -24,11 +24,7 @@
#include "selection.h"
#include "inkscape.h"
#include "style.h"
-#include "preferences.h"
-#include "sp-use.h"
#include "filters/blend.h"
-#include "sp-filter.h"
-#include "sp-filter-reference.h"
#include "filters/gaussian-blur.h"
#include "sp-flowtext.h"
#include "sp-flowregion.h"
@@ -39,15 +35,12 @@
#include "sp-textpath.h"
#include "sp-tref.h"
#include "sp-tspan.h"
-#include "xml/repr.h"
#include "xml/sp-css-attr.h"
#include "sp-path.h"
#include "ui/tools/tool-base.h"
#include "desktop-style.h"
-#include "svg/svg-icc-color.h"
#include "box3d-side.h"
-#include <2geom/math-utils.h>
namespace {
@@ -163,17 +156,17 @@ sp_desktop_apply_css_recursive(SPObject *o, SPCSSAttr *css, bool skip_lines)
return;
}
- for ( SPObject *child = o->firstChild() ; child ; child = child->getNext() ) {
+ for (auto& child: o->children) {
if (sp_repr_css_property(css, "opacity", NULL) != NULL) {
// Unset properties which are accumulating and thus should not be set recursively.
// For example, setting opacity 0.5 on a group recursively would result in the visible opacity of 0.25 for an item in the group.
SPCSSAttr *css_recurse = sp_repr_css_attr_new();
sp_repr_css_merge(css_recurse, css);
sp_repr_css_set_property(css_recurse, "opacity", NULL);
- sp_desktop_apply_css_recursive(child, css_recurse, skip_lines);
+ sp_desktop_apply_css_recursive(&child, css_recurse, skip_lines);
sp_repr_css_attr_unref(css_recurse);
} else {
- sp_desktop_apply_css_recursive(child, css, skip_lines);
+ sp_desktop_apply_css_recursive(&child, css, skip_lines);
}
}
}
@@ -181,8 +174,12 @@ sp_desktop_apply_css_recursive(SPObject *o, SPCSSAttr *css, bool skip_lines)
/**
* Apply style on selection on desktop.
*/
+ void sp_desktop_set_style(SPDesktop *desktop, SPCSSAttr *css, bool change, bool write_current){
+ return sp_desktop_set_style(desktop->getSelection(), desktop, css, change, write_current);
+}
+
void
-sp_desktop_set_style(SPDesktop *desktop, SPCSSAttr *css, bool change, bool write_current)
+sp_desktop_set_style(Inkscape::ObjectSet *set, SPDesktop *desktop, SPCSSAttr *css, bool change, bool write_current)
{
if (write_current) {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
@@ -194,8 +191,8 @@ sp_desktop_set_style(SPDesktop *desktop, SPCSSAttr *css, bool change, bool write
sp_repr_css_merge(css_write, css);
sp_css_attr_unset_uris(css_write);
prefs->mergeStyle("/desktop/style", css_write);
- std::vector<SPItem*> const itemlist = desktop->selection->itemList();
- for (std::vector<SPItem*>::const_iterator i = itemlist.begin(); i!= itemlist.end(); ++i) {
+ auto itemlist = set->items();
+ for (auto i = itemlist.begin(); i!= itemlist.end(); ++i) {
/* last used styles for 3D box faces are stored separately */
SPObject *obj = *i;
Box3DSide *side = dynamic_cast<Box3DSide *>(obj);
@@ -212,7 +209,7 @@ sp_desktop_set_style(SPDesktop *desktop, SPCSSAttr *css, bool change, bool write
if (!change)
return;
-// 2. Emit signal
+// 2. Emit signal... See desktop->connectSetStyle in text-tool, tweak-tool, and gradient-drag.
bool intercepted = desktop->_set_style_signal.emit(css);
/** \todo
@@ -234,8 +231,8 @@ sp_desktop_set_style(SPDesktop *desktop, SPCSSAttr *css, bool change, bool write
sp_repr_css_merge(css_no_text, css);
css_no_text = sp_css_attr_unset_text(css_no_text);
- std::vector<SPItem*> const itemlist = desktop->selection->itemList();
- for (std::vector<SPItem*>::const_iterator i = itemlist.begin(); i!= itemlist.end(); ++i) {
+ auto itemlist = set->items();
+ for (auto i = itemlist.begin(); i!= itemlist.end(); ++i) {
SPItem *item = *i;
// If not text, don't apply text attributes (can a group have text attributes? Yes! FIXME)
@@ -1048,6 +1045,7 @@ objects_query_fontnumbers (const std::vector<SPItem*> &objects, SPStyle *style_r
bool lineheight_normal = false;
bool lineheight_unit_proportional = false;
bool lineheight_unit_absolute = false;
+ bool lineheight_set = false; // Set true if any object has lineheight set.
double size_prev = 0;
double letterspacing_prev = 0;
@@ -1133,6 +1131,9 @@ objects_query_fontnumbers (const std::vector<SPItem*> &objects, SPStyle *style_r
lineheight_normal = false;
lineheight += lineheight_current * doc_scale;
}
+ if (style->line_height.set) {
+ lineheight_set = true;
+ }
if ((size_prev != 0 && style->font_size.computed != size_prev) ||
(letterspacing_prev != 0 && style->letter_spacing.computed != letterspacing_prev) ||
@@ -1208,6 +1209,9 @@ objects_query_fontnumbers (const std::vector<SPItem*> &objects, SPStyle *style_r
}
}
+ // Used by text toolbar unset 'line-height'
+ style_res->line_height.set = lineheight_set;
+
if (texts > 1) {
if (different || different_lineheight) {
return QUERY_STYLE_MULTIPLE_AVERAGED;
@@ -1714,10 +1718,11 @@ objects_query_blend (const std::vector<SPItem*> &objects, SPStyle *style_res)
int blendcount = 0;
// determine whether filter is simple (blend and/or blur) or complex
- for(SPObject *primitive_obj = style->getFilter()->children;
- primitive_obj && dynamic_cast<SPFilterPrimitive *>(primitive_obj);
- primitive_obj = primitive_obj->next) {
- SPFilterPrimitive *primitive = dynamic_cast<SPFilterPrimitive *>(primitive_obj);
+ for(auto& primitive_obj: style->getFilter()->children) {
+ SPFilterPrimitive *primitive = dynamic_cast<SPFilterPrimitive *>(&primitive_obj);
+ if (!primitive) {
+ break;
+ }
if (dynamic_cast<SPFeBlend *>(primitive)) {
++blendcount;
} else if (dynamic_cast<SPGaussianBlur *>(primitive)) {
@@ -1730,10 +1735,12 @@ objects_query_blend (const std::vector<SPItem*> &objects, SPStyle *style_res)
// simple filter
if(blurcount == 1 || blendcount == 1) {
- for(SPObject *primitive_obj = style->getFilter()->children;
- primitive_obj && dynamic_cast<SPFilterPrimitive *>(primitive_obj);
- primitive_obj = primitive_obj->next) {
- SPFeBlend *spblend = dynamic_cast<SPFeBlend *>(primitive_obj);
+ for(auto& primitive_obj: style->getFilter()->children) {
+ SPFilterPrimitive *primitive = dynamic_cast<SPFilterPrimitive *>(&primitive_obj);
+ if (!primitive) {
+ break;
+ }
+ SPFeBlend *spblend = dynamic_cast<SPFeBlend *>(&primitive_obj);
if (spblend) {
blend = spblend->blend_mode;
}
@@ -1807,9 +1814,8 @@ objects_query_blur (const std::vector<SPItem*> &objects, SPStyle *style_res)
//if object has a filter
if (style->filter.set && style->getFilter()) {
//cycle through filter primitives
- SPObject *primitive_obj = style->getFilter()->children;
- while (primitive_obj) {
- SPFilterPrimitive *primitive = dynamic_cast<SPFilterPrimitive *>(primitive_obj);
+ for(auto& primitive_obj: style->getFilter()->children) {
+ SPFilterPrimitive *primitive = dynamic_cast<SPFilterPrimitive *>(&primitive_obj);
if (primitive) {
//if primitive is gaussianblur
@@ -1827,7 +1833,6 @@ objects_query_blur (const std::vector<SPItem*> &objects, SPStyle *style_res)
}
}
}
- primitive_obj = primitive_obj->next;
}
}
}
@@ -1909,7 +1914,7 @@ sp_desktop_query_style_from_list (const std::vector<SPItem*> &list, SPStyle *sty
int
sp_desktop_query_style(SPDesktop *desktop, SPStyle *style, int property)
{
- // Used by text tool and in gradient dragging
+ // Used by text tool and in gradient dragging. See connectQueryStyle.
int ret = desktop->_query_style_signal.emit(style, property);
if (ret != QUERY_STYLE_NOTHING)
@@ -1917,7 +1922,8 @@ sp_desktop_query_style(SPDesktop *desktop, SPStyle *style, int property)
// otherwise, do querying and averaging over selection
if (desktop->selection != NULL) {
- return sp_desktop_query_style_from_list (desktop->selection->itemList(), style, property);
+ std::vector<SPItem *> vec(desktop->selection->items().begin(), desktop->selection->items().end());
+ return sp_desktop_query_style_from_list (vec, style, property);
}
return QUERY_STYLE_NOTHING;