summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDiederik van Lierop <mail@diedenrezi.nl>2019-04-30 20:40:33 +0000
committerDiederik van Lierop <mail@diedenrezi.nl>2019-04-30 20:40:33 +0000
commitd137944b06575b9e79d0a3e79a3e5f5b8f6665e2 (patch)
tree6017a86cc0040ca9d7615c879036bd320f6e5de7 /src
parentFix disappearing and antialiasing of grid lines (diff)
parentSet spacing in About Dialog (diff)
downloadinkscape-d137944b06575b9e79d0a3e79a3e5f5b8f6665e2.tar.gz
inkscape-d137944b06575b9e79d0a3e79a3e5f5b8f6665e2.zip
Merge branch 'master' of gitlab.com:inkscape/inkscape
Diffstat (limited to 'src')
-rw-r--r--src/display/canvas-axonomgrid.cpp18
-rw-r--r--src/display/canvas-grid.cpp24
-rw-r--r--src/document.cpp5
-rw-r--r--src/extension/internal/pdfinput/pdf-input.cpp3
-rw-r--r--src/extension/internal/pdfinput/pdf-parser.cpp2
-rw-r--r--src/extension/internal/pdfinput/poppler-transition-api.h7
-rw-r--r--src/file-update.cpp47
-rw-r--r--src/file.h1
-rw-r--r--src/inkscape-application.cpp17
-rw-r--r--src/inkscape-application.h2
-rw-r--r--src/inkscape-main.cpp20
-rw-r--r--src/inkscape.h8
-rw-r--r--src/livarot/ShapeMisc.cpp2
-rw-r--r--src/selection-describer.cpp3
-rw-r--r--src/style.cpp8
-rw-r--r--src/ui/dialog/aboutbox.cpp3
-rw-r--r--src/ui/dialog/layers.cpp1
-rw-r--r--src/ui/dialog/livepatheffect-add.cpp9
-rw-r--r--src/ui/dialog/selectordialog.cpp84
-rw-r--r--src/ui/toolbar/arc-toolbar.cpp3
-rw-r--r--src/ui/toolbar/rect-toolbar.cpp2
-rw-r--r--src/ui/toolbar/text-toolbar.cpp2
-rw-r--r--src/ui/tools/flood-tool.cpp9
-rw-r--r--src/ui/tools/measure-tool.cpp6
-rw-r--r--src/ui/widget/color-icc-selector.cpp8
-rw-r--r--src/ui/widget/color-scales.cpp1
-rw-r--r--src/ui/widget/color-wheel-selector.cpp10
-rw-r--r--src/ui/widget/unit-tracker.cpp2
-rw-r--r--src/util/units.h2
-rw-r--r--src/widgets/desktop-widget.cpp4
-rw-r--r--src/widgets/stroke-style.cpp18
-rw-r--r--src/widgets/toolbox.cpp2
-rw-r--r--src/xml/repr-io.cpp3
33 files changed, 240 insertions, 96 deletions
diff --git a/src/display/canvas-axonomgrid.cpp b/src/display/canvas-axonomgrid.cpp
index 9f423b2ab..4699f0509 100644
--- a/src/display/canvas-axonomgrid.cpp
+++ b/src/display/canvas-axonomgrid.cpp
@@ -288,15 +288,6 @@ CanvasAxonomGrid::newSpecificWidget()
_rsi = Gtk::manage( new Inkscape::UI::Widget::RegisteredSuffixedInteger(
_("_Major grid line every:"), "", _("lines"), "empspacing", _wr, repr, doc ) );
- _rsu_ox->setDigits(5);
- _rsu_ox->setIncrements(0.1, 1.0);
-
- _rsu_oy->setDigits(5);
- _rsu_oy->setIncrements(0.1, 1.0);
-
- _rsu_sy->setDigits(5);
- _rsu_sy->setIncrements(0.1, 1.0);
-
_rumg->set_hexpand();
_rsu_ox->set_hexpand();
_rsu_oy->set_hexpand();
@@ -310,6 +301,15 @@ CanvasAxonomGrid::newSpecificWidget()
// set widget values
_wr.setUpdating (true);
+ _rsu_ox->setDigits(5);
+ _rsu_ox->setIncrements(0.1, 1.0);
+
+ _rsu_oy->setDigits(5);
+ _rsu_oy->setIncrements(0.1, 1.0);
+
+ _rsu_sy->setDigits(5);
+ _rsu_sy->setIncrements(0.1, 1.0);
+
_rumg->setUnit (gridunit->abbr);
gdouble val;
diff --git a/src/display/canvas-grid.cpp b/src/display/canvas-grid.cpp
index 60d51de2e..92faaca13 100644
--- a/src/display/canvas-grid.cpp
+++ b/src/display/canvas-grid.cpp
@@ -680,18 +680,6 @@ CanvasXYGrid::newSpecificWidget()
_rsi = Gtk::manage( new Inkscape::UI::Widget::RegisteredSuffixedInteger(
_("_Major grid line every:"), "", _("lines"), "empspacing", _wr, repr, doc) );
- _rsu_ox->setDigits(5);
- _rsu_ox->setIncrements(0.1, 1.0);
-
- _rsu_oy->setDigits(5);
- _rsu_oy->setIncrements(0.1, 1.0);
-
- _rsu_sx->setDigits(5);
- _rsu_sx->setIncrements(0.1, 1.0);
-
- _rsu_sy->setDigits(5);
- _rsu_sy->setIncrements(0.1, 1.0);
-
_rumg->set_hexpand();
_rsu_ox->set_hexpand();
_rsu_oy->set_hexpand();
@@ -704,6 +692,18 @@ CanvasXYGrid::newSpecificWidget()
// set widget values
_wr.setUpdating (true);
+ _rsu_ox->setDigits(5);
+ _rsu_ox->setIncrements(0.1, 1.0);
+
+ _rsu_oy->setDigits(5);
+ _rsu_oy->setIncrements(0.1, 1.0);
+
+ _rsu_sx->setDigits(5);
+ _rsu_sx->setIncrements(0.1, 1.0);
+
+ _rsu_sy->setDigits(5);
+ _rsu_sy->setIncrements(0.1, 1.0);
+
_rumg->setUnit (gridunit->abbr);
gdouble val;
diff --git a/src/document.cpp b/src/document.cpp
index 680e98f6a..03b285710 100644
--- a/src/document.cpp
+++ b/src/document.cpp
@@ -450,6 +450,11 @@ SPDocument *SPDocument::createDoc(Inkscape::XML::Document *rdoc,
sp_file_convert_font_name(document);
}
+ /** Fix first line spacing in legacy documents (pre-1.0 files) **/
+ if (sp_version_inside_range(document->root->version.inkscape, 0, 1, 1, 0)) {
+ sp_file_fix_empty_lines(document);
+ }
+
/** Fix dpi (pre-92 files). With GUI fixed in Inkscape::Application::fix_document. **/
if ( !(INKSCAPE.use_gui()) && sp_version_inside_range( document->root->version.inkscape, 0, 1, 0, 92 ) ) {
sp_file_convert_dpi(document);
diff --git a/src/extension/internal/pdfinput/pdf-input.cpp b/src/extension/internal/pdfinput/pdf-input.cpp
index 5e1a91589..3ff599ebf 100644
--- a/src/extension/internal/pdfinput/pdf-input.cpp
+++ b/src/extension/internal/pdfinput/pdf-input.cpp
@@ -782,6 +782,9 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) {
#endif
} else {
page_num = INKSCAPE.get_pdf_page();
+#ifdef HAVE_POPPLER_CAIRO
+ is_importvia_poppler = INKSCAPE.get_pdf_poppler();
+#endif
}
SPDocument *doc = nullptr;
diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp
index 8484984bd..4f798e35b 100644
--- a/src/extension/internal/pdfinput/pdf-parser.cpp
+++ b/src/extension/internal/pdfinput/pdf-parser.cpp
@@ -421,7 +421,7 @@ void PdfParser::parse(Object *obj, GBool topLevel) {
error(errInternal, -1, "Weird page contents");
return;
}
- parser = new Parser(xref, new Lexer(xref, obj), gFalse);
+ parser = new _POPPLER_NEW_PARSER(xref, obj);
go(topLevel);
delete parser;
parser = nullptr;
diff --git a/src/extension/internal/pdfinput/poppler-transition-api.h b/src/extension/internal/pdfinput/poppler-transition-api.h
index 61a15083a..5e8bc4ae9 100644
--- a/src/extension/internal/pdfinput/poppler-transition-api.h
+++ b/src/extension/internal/pdfinput/poppler-transition-api.h
@@ -14,6 +14,13 @@
#include <glib/poppler-features.h>
+#if POPPLER_CHECK_VERSION(0, 76, 0)
+#define _POPPLER_NEW_PARSER(xref, obj) Parser(xref, obj, gFalse)
+#else
+#define _POPPLER_NEW_PARSER(xref, obj) Parser(xref, new Lexer(xref, obj), gFalse)
+#endif
+
+
#if POPPLER_CHECK_VERSION(0, 72, 0)
#define getCString c_str
#endif
diff --git a/src/file-update.cpp b/src/file-update.cpp
index 5489ee499..9f1eafd7f 100644
--- a/src/file-update.cpp
+++ b/src/file-update.cpp
@@ -205,6 +205,53 @@ void sp_file_convert_text_baseline_spacing(SPDocument *doc)
sp_file_text_run_recursive(fix_update, doc->getRoot());
}
+
+/**
+ * Implements a fix for https://gitlab.com/inkscape/inkscape/issues/45
+ * Line spacing for empty lines was handled differently before 1.0
+ * and in particular with the first empty lines or with how style attributes
+ * are processed in empty lines (line = tspan with sodipodi:role="line")
+ *
+ * This function "fixes" a text element in a old document by removing the
+ * first empty lines and style attrs on other empty lines.
+ *
+ * */
+void _fix_pre_v1_empty_lines(SPObject *o)
+{
+ std::vector<SPObject *> cl = o->childList(false);
+ bool begin = true;
+ std::string cur_y = "";
+ for (std::vector<SPObject *>::const_iterator ci = cl.begin(); ci != cl.end(); ++ci) {
+ if (!SP_IS_TSPAN(*ci))
+ continue;
+ if (!is_line(*ci))
+ continue;
+ if (!(*ci)->childList(false).empty()) {
+ if (begin)
+ cur_y = (*ci)->getAttribute("y") ? (*ci)->getAttribute("y") : cur_y;
+ begin = false;
+ } else {
+ (*ci)->removeAttribute("style");
+ (*ci)->updateRepr();
+ if (begin) {
+ (*ci)->deleteObject();
+ }
+ }
+ if (cur_y != "")
+ o->setAttribute("y", cur_y);
+ }
+}
+
+
+
+void sp_file_fix_empty_lines(SPDocument *doc)
+{
+ sp_file_text_run_recursive(_fix_pre_v1_empty_lines, doc->getRoot());
+ sp_file_text_run_recursive(fix_update, doc->getRoot());
+}
+
+
+
void sp_file_convert_font_name(SPDocument *doc)
{
sp_file_text_run_recursive(fix_font_name, doc->getRoot());
diff --git a/src/file.h b/src/file.h
index fc0925b78..c6353ad99 100644
--- a/src/file.h
+++ b/src/file.h
@@ -196,6 +196,7 @@ void sp_file_vacuum (SPDocument *doc);
void sp_file_convert_text_baseline_spacing(SPDocument *doc);
void sp_file_convert_font_name(SPDocument *doc);
void sp_file_convert_dpi(SPDocument *doc);
+void sp_file_fix_empty_lines(SPDocument *doc);
enum File_DPI_Fix { FILE_DPI_UNCHANGED = 0, FILE_DPI_VIEWBOX_SCALED, FILE_DPI_DOCUMENT_SCALED };
extern int sp_file_convert_dpi_method_commandline;
diff --git a/src/inkscape-application.cpp b/src/inkscape-application.cpp
index 97233f32b..77734ecd4 100644
--- a/src/inkscape-application.cpp
+++ b/src/inkscape-application.cpp
@@ -66,6 +66,8 @@ InkscapeApplication::InkscapeApplication()
, _active_document(nullptr)
, _active_selection(nullptr)
, _active_view(nullptr)
+ , _pdf_page(0)
+ , _pdf_poppler(false)
{}
// Add document to app.
@@ -484,6 +486,7 @@ ConcreteInkscapeApplication<T>::ConcreteInkscapeApplication()
// Open/Import
this->add_main_option_entry(T::OPTION_TYPE_INT, "pdf-page", '\0', N_("Open: PDF page to import"), N_("PAGE"));
+ this->add_main_option_entry(T::OPTION_TYPE_BOOL, "pdf-poppler", '\0', N_("Use poppler when importing via commandline"), "");
this->add_main_option_entry(T::OPTION_TYPE_STRING, "convert-dpi-method", '\0', N_("Open: Method used to convert pre-0.92 document dpi, if needed: [none|scale-viewbox|scale-document]."), "[...]");
this->add_main_option_entry(T::OPTION_TYPE_BOOL, "no-convert-text-baseline-spacing", 0, N_("Open: Do not fix pre-0.92 document's text baseline spacing on opening."), "");
@@ -803,6 +806,10 @@ void
ConcreteInkscapeApplication<T>::on_open(const Gio::Application::type_vec_files& files, const Glib::ustring& hint)
{
on_startup2();
+ if(_pdf_poppler)
+ INKSCAPE.set_pdf_poppler(_pdf_poppler);
+ if(_pdf_page)
+ INKSCAPE.set_pdf_page(_pdf_page);
for (auto file : files) {
// Open file
@@ -849,6 +856,10 @@ void
ConcreteInkscapeApplication<Gtk::Application>::on_open(const Gio::Application::type_vec_files& files, const Glib::ustring& hint)
{
on_startup2();
+ if(_pdf_poppler)
+ INKSCAPE.set_pdf_poppler(_pdf_poppler);
+ if(_pdf_page)
+ INKSCAPE.set_pdf_page(_pdf_page);
for (auto file : files) {
if (_with_gui) {
@@ -1131,11 +1142,13 @@ ConcreteInkscapeApplication<T>::on_handle_local_options(const Glib::RefPtr<Glib:
// ================= OPEN/IMPORT ===================
+ if (options->contains("pdf-poppler")) {
+ _pdf_poppler = true;
+ }
if (options->contains("pdf-page")) { // Maybe useful for other file types?
int page = 0;
options->lookup_value("pdf-page", page);
- _command_line_actions.push_back(
- std::make_pair("open-page", Glib::Variant<int>::create(page)));
+ _pdf_page = page;
}
if (options->contains("convert-dpi-method")) {
diff --git a/src/inkscape-application.h b/src/inkscape-application.h
index 05fbafb89..d3c909f4a 100644
--- a/src/inkscape-application.h
+++ b/src/inkscape-application.h
@@ -92,6 +92,8 @@ protected:
bool _with_gui;
bool _batch_process; // Temp
bool _use_shell;
+ int _pdf_page;
+ int _pdf_poppler;
InkscapeApplication();
// Documents are owned by the application which is responsible for opening/saving/exporting. WIP
diff --git a/src/inkscape-main.cpp b/src/inkscape-main.cpp
index beb632fbd..aac164b37 100644
--- a/src/inkscape-main.cpp
+++ b/src/inkscape-main.cpp
@@ -30,15 +30,23 @@ static void set_extensions_env()
g_free(program_dir);
// add share/inkscape/extensions to PYTHONPATH so the inkex module is found by extensions in user folder
+ auto new_pythonpath = std::string(INKSCAPE_EXTENSIONDIR);
+
+ // add old PYTHONPATH
gchar const *pythonpath = g_getenv("PYTHONPATH");
- gchar *new_pythonpath;
if (pythonpath) {
- new_pythonpath = g_strdup_printf("%s" G_SEARCHPATH_SEPARATOR_S "%s", INKSCAPE_EXTENSIONDIR, pythonpath);
- } else {
- new_pythonpath = g_strdup(INKSCAPE_EXTENSIONDIR);
+ new_pythonpath.append(G_SEARCHPATH_SEPARATOR_S).append(pythonpath);
}
- g_setenv("PYTHONPATH", new_pythonpath, true);
- g_free(new_pythonpath);
+
+ // add share/inkscape/extensions/inkex/deprecated-simple
+ new_pythonpath.append(G_SEARCHPATH_SEPARATOR_S)
+ .append(INKSCAPE_EXTENSIONDIR)
+ .append(G_DIR_SEPARATOR_S)
+ .append("inkex")
+ .append(G_DIR_SEPARATOR_S)
+ .append("deprecated-simple");
+
+ g_setenv("PYTHONPATH", new_pythonpath.c_str(), true);
#ifdef _WIN32
// add inkscape directory to DLL search path so dynamically linked extension modules find their libraries
diff --git a/src/inkscape.h b/src/inkscape.h
index fd9a4c38d..840620171 100644
--- a/src/inkscape.h
+++ b/src/inkscape.h
@@ -193,12 +193,19 @@ public:
// may not be reflected by a selection change and thus needs a separate signal
sigc::signal<void> signal_external_change;
+ void set_pdf_poppler(bool p) {
+ _pdf_poppler = p;
+ }
+ bool get_pdf_poppler() {
+ return _pdf_poppler;
+ }
void set_pdf_page(gint page) {
_pdf_page = page;
}
gint get_pdf_page() {
return _pdf_page;
}
+
void add_gtk_css();
void add_icon_theme();
@@ -225,6 +232,7 @@ public:
static bool _crashIsHappening;
bool _use_gui;
gint _pdf_page;
+ bool _pdf_poppler;
};
} // namespace Inkscape
diff --git a/src/livarot/ShapeMisc.cpp b/src/livarot/ShapeMisc.cpp
index db5c19297..b76ea5875 100644
--- a/src/livarot/ShapeMisc.cpp
+++ b/src/livarot/ShapeMisc.cpp
@@ -397,7 +397,7 @@ Shape::ConvertToFormeNested (Path * dest, int nbP, Path * *orig, int /*wildPath*
parentContour = GPOINTER_TO_INT(swdData[askTo].misc);
parentContour-=1; // pour compenser le decalage
}
- childEdge = getPoint(fi).incidentEdge[FIRST];
+ childEdge = getPoint(fi % numberOfPoints()).incidentEdge[FIRST];
}
}
lastPtUsed = fi + 1;
diff --git a/src/selection-describer.cpp b/src/selection-describer.cpp
index b2b4b2d04..b3250ffbd 100644
--- a/src/selection-describer.cpp
+++ b/src/selection-describer.cpp
@@ -139,6 +139,9 @@ void SelectionDescriber::_updateMessageFromSelection(Inkscape::Selection *select
// Parent name
SPObject *parent = item->parent;
+ if (!parent) { // fix selector * to "svg:svg"
+ return;
+ }
gchar const *parent_label = parent->getId();
gchar *parent_name = nullptr;
if (parent_label) {
diff --git a/src/style.cpp b/src/style.cpp
index 1cece6dbd..c83b19230 100644
--- a/src/style.cpp
+++ b/src/style.cpp
@@ -685,7 +685,9 @@ SPStyle::readIfUnset(SPAttributeEnum id, gchar const *val, SPStyleSrc const &sou
g_warning("attribute 'clip-path' given as CSS");
//XML Tree being directly used here.
- this->object->getRepr()->setAttribute("clip-path", val);
+ if (object) {
+ object->getRepr()->setAttribute("clip-path", val);
+ }
return;
case SP_PROP_MASK:
/** \todo
@@ -694,7 +696,9 @@ SPStyle::readIfUnset(SPAttributeEnum id, gchar const *val, SPStyleSrc const &sou
g_warning("attribute 'mask' given as CSS");
//XML Tree being directly used here.
- this->object->getRepr()->setAttribute("mask", val);
+ if (object) {
+ object->getRepr()->setAttribute("mask", val);
+ }
return;
case SP_PROP_FILTER:
if( !filter.inherit ) filter.readIfUnset( val, source );
diff --git a/src/ui/dialog/aboutbox.cpp b/src/ui/dialog/aboutbox.cpp
index e829091cb..87141c655 100644
--- a/src/ui/dialog/aboutbox.cpp
+++ b/src/ui/dialog/aboutbox.cpp
@@ -91,6 +91,9 @@ AboutBox::AboutBox()
set_comments (_("Open Source Scalable Vector Graphics Editor\n"
"Draw Freely."));
// clang-format on
+
+ get_content_area()->set_border_width(3);
+ get_action_area()->set_border_width(3);
}
/**
diff --git a/src/ui/dialog/layers.cpp b/src/ui/dialog/layers.cpp
index 79bf767c7..449d6be1a 100644
--- a/src/ui/dialog/layers.cpp
+++ b/src/ui/dialog/layers.cpp
@@ -383,6 +383,7 @@ void LayersPanel::_layersChanged()
// g_message("_layersChanged()");
if (_desktop) {
SPDocument* document = _desktop->doc();
+ g_return_if_fail(document != nullptr); // bug #158: Crash on File>Quit
SPRoot* root = document->getRoot();
if ( root ) {
_selectedConnection.block();
diff --git a/src/ui/dialog/livepatheffect-add.cpp b/src/ui/dialog/livepatheffect-add.cpp
index 8e4d7db15..737d1e5ff 100644
--- a/src/ui/dialog/livepatheffect-add.cpp
+++ b/src/ui/dialog/livepatheffect-add.cpp
@@ -101,11 +101,10 @@ LivePathEffectAdd::LivePathEffectAdd()
_LPESelectorFlowBox->signal_child_activated().connect(sigc::mem_fun(*this, &LivePathEffectAdd::on_activate));
_LPEDialogSelector->add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK |
Gdk::ENTER_NOTIFY_MASK | Gdk::LEAVE_NOTIFY_MASK);
- Glib::ustring effectgladefile = get_filename(Inkscape::IO::Resource::UIS, "dialog-livepatheffect-add-effect.ui");
for (int i = 0; i < static_cast<int>(converter._length); ++i) {
Glib::RefPtr<Gtk::Builder> builder_effect;
try {
- builder_effect = Gtk::Builder::create_from_file(effectgladefile);
+ builder_effect = Gtk::Builder::create_from_file(gladefile);
} catch (const Glib::Error &ex) {
g_warning("Glade file loading failed for filter effect dialog");
return;
@@ -136,10 +135,10 @@ LivePathEffectAdd::LivePathEffectAdd()
Gtk::Label *LPEDescription;
builder_effect->get_widget("LPEDescription", LPEDescription);
LPEDescription->set_text(converter.get_description(data->id));
- Gtk::ToggleButton *LPEExperimental;
- builder_effect->get_widget("LPEExperimental", LPEExperimental);
+ Gtk::ToggleButton *LPEExperimentalToggle;
+ builder_effect->get_widget("LPEExperimentalToggle", LPEExperimentalToggle);
bool active = converter.get_experimental(data->id) ? true : false;
- LPEExperimental->set_active(active);
+ LPEExperimentalToggle->set_active(active);
Gtk::Image *LPEIcon;
builder_effect->get_widget("LPEIcon", LPEIcon);
LPEIcon->set_from_icon_name(converter.get_icon(data->id), Gtk::BuiltinIconSize(Gtk::ICON_SIZE_DIALOG));
diff --git a/src/ui/dialog/selectordialog.cpp b/src/ui/dialog/selectordialog.cpp
index 3db239933..4847facfb 100644
--- a/src/ui/dialog/selectordialog.cpp
+++ b/src/ui/dialog/selectordialog.cpp
@@ -457,7 +457,8 @@ void SelectorDialog::_readStyleElement()
coltype colType = SELECTOR;
for (auto tok : tokensplus) {
REMOVE_SPACES(tok);
- if (tok.find(" ") != -1 || tok.erase(0, 1).find(".") != -1) {
+ if (SPAttributeRelSVG::isSVGElement(tok) || tok.find(" ") != -1 || tok[0] == '>' || tok[0] == '+' ||
+ tok[0] == '~' || tok[0] == '*' || tok.erase(0, 1).find(".") != -1) {
colType = UNHANDLED;
}
}
@@ -485,16 +486,14 @@ void SelectorDialog::_readStyleElement()
row[_mColumns._colType] = colType;
row[_mColumns._colObj] = objVec;
row[_mColumns._colProperties] = properties;
- if (colType == SELECTOR) {
- // Add as children, objects that match selector.
- for (auto &obj : objVec) {
- Gtk::TreeModel::Row childrow = *(_store->append(row->children()));
- childrow[_mColumns._colSelector] = "#" + Glib::ustring(obj->getId());
- childrow[_mColumns._colExpand] = false;
- childrow[_mColumns._colType] = OBJECT;
- childrow[_mColumns._colObj] = std::vector<SPObject *>(1, obj);
- childrow[_mColumns._colProperties] = ""; // Unused
- }
+ // Add as children, objects that match selector.
+ for (auto &obj : objVec) {
+ Gtk::TreeModel::Row childrow = *(_store->append(row->children()));
+ childrow[_mColumns._colSelector] = "#" + Glib::ustring(obj->getId());
+ childrow[_mColumns._colExpand] = false;
+ childrow[_mColumns._colType] = colType == UNHANDLED ? UNHANDLED : OBJECT;
+ childrow[_mColumns._colObj] = std::vector<SPObject *>(1, obj);
+ childrow[_mColumns._colProperties] = ""; // Unused
}
}
_updating = false;
@@ -693,6 +692,9 @@ void SelectorDialog::_removeFromSelector(Gtk::TreeModel::Row row)
if (*row) {
Glib::ustring objectLabel = row[_mColumns._colSelector];
+ if (row[_mColumns._colType] == UNHANDLED) {
+ return;
+ };
Gtk::TreeModel::iterator iter = row->parent();
if (iter) {
Gtk::TreeModel::Row parent = *iter;
@@ -788,8 +790,21 @@ Glib::ustring SelectorDialog::_getIdList(std::vector<SPObject*> sel)
*/
std::vector<SPObject *> SelectorDialog::_getObjVec(Glib::ustring selector) {
- std::vector<SPObject *> objVec = SP_ACTIVE_DOCUMENT->getObjectsBySelector( selector );
-
+ std::vector<SPObject *> objVec;
+ std::vector<Glib::ustring> tokensplus = Glib::Regex::split_simple("[,]+", selector);
+ bool unhandled = false;
+ for (auto tok : tokensplus) {
+ REMOVE_SPACES(tok);
+ if (SPAttributeRelSVG::isSVGElement(tok) || tok.find(" ") != -1 || tok[0] == '>' || tok[0] == '+' ||
+ tok[0] == '~' || tok[0] == '*' || tok.erase(0, 1).find(".") != -1) {
+ unhandled = true;
+ std::vector<SPObject *> objVecSplited = SP_ACTIVE_DOCUMENT->getObjectsBySelector(tok);
+ objVec.insert(objVec.end(), objVecSplited.begin(), objVecSplited.end());
+ }
+ }
+ if (!unhandled) {
+ objVec = SP_ACTIVE_DOCUMENT->getObjectsBySelector(selector);
+ }
g_debug("SelectorDialog::_getObjVec: | %s |", selector.c_str());
for (auto& obj: objVec) {
g_debug(" %s", obj->getId() ? obj->getId() : "null");
@@ -943,17 +958,44 @@ void SelectorDialog::_addSelector()
* set to ".Class1"
*/
selectorValue = textEditPtr->get_text();
- Glib::ustring firstWord = selectorValue.substr(0, selectorValue.find_first_of(" >+~"));
- if (firstWord != selectorValue) {
- handled = false;
- }
+
del->set_sensitive(true);
+ std::vector<Glib::ustring> tokensplus = Glib::Regex::split_simple("[,]+", selectorValue);
+ bool unhandled = false;
+ bool partialinvalid = false;
+ for (auto tok : tokensplus) {
+ REMOVE_SPACES(tok);
+ if (SPAttributeRelSVG::isSVGElement(tok) || tok.find(" ") != -1 || tok[0] == '>' || tok[0] == '+' ||
+ tok[0] == '~' || tok[0] == '*' || tok.erase(0, 1).find(".") != -1) {
+ unhandled = true;
+ Glib::ustring firstWord = tok.substr(0, tok.find_first_of(" >+~"));
+ if (firstWord != tok) {
+ handled = false;
+ }
- if (selectorValue[0] == '.' || selectorValue[0] == '#' || selectorValue[0] == '*' ||
- SPAttributeRelSVG::isSVGElement(selectorValue)) {
- invalid = false;
- } else {
+ if (!partialinvalid &&
+ (tok[0] == '.' || tok[0] == '#' || tok[0] == '*' || SPAttributeRelSVG::isSVGElement(tok))) {
+ partialinvalid = false;
+ } else {
+ partialinvalid = true;
+ }
+ }
+ }
+ if (!unhandled) {
+ Glib::ustring firstWord = selectorValue.substr(0, selectorValue.find_first_of(" >+~"));
+ if (firstWord != selectorValue) {
+ handled = false;
+ }
+ if (selectorValue[0] == '.' || selectorValue[0] == '#' || selectorValue[0] == '*' ||
+ SPAttributeRelSVG::isSVGElement(selectorValue)) {
+ invalid = false;
+ } else {
+ textLabelPtr->show();
+ }
+ } else if (partialinvalid) {
textLabelPtr->show();
+ } else {
+ invalid = false;
}
}
delete textDialogPtr;
diff --git a/src/ui/toolbar/arc-toolbar.cpp b/src/ui/toolbar/arc-toolbar.cpp
index e9e25b7df..751efaa80 100644
--- a/src/ui/toolbar/arc-toolbar.cpp
+++ b/src/ui/toolbar/arc-toolbar.cpp
@@ -39,6 +39,7 @@
#include "verbs.h"
#include "object/sp-ellipse.h"
+#include "object/sp-namedview.h"
#include "ui/icon-names.h"
#include "ui/pref-pusher.h"
@@ -78,7 +79,7 @@ ArcToolbar::ArcToolbar(SPDesktop *desktop) :
_freeze(false),
_repr(nullptr)
{
- _tracker->setActiveUnit(unit_table.getUnit("px"));
+ _tracker->setActiveUnit(desktop->getNamedView()->display_units);
auto prefs = Inkscape::Preferences::get();
{
diff --git a/src/ui/toolbar/rect-toolbar.cpp b/src/ui/toolbar/rect-toolbar.cpp
index 960ddaac9..a8b49e62d 100644
--- a/src/ui/toolbar/rect-toolbar.cpp
+++ b/src/ui/toolbar/rect-toolbar.cpp
@@ -84,7 +84,7 @@ RectToolbar::RectToolbar(SPDesktop *desktop)
// rx/ry units menu: create
//tracker->addUnit( SP_UNIT_PERCENT, 0 );
// fixme: add % meaning per cent of the width/height
- _tracker->setActiveUnit(unit_table.getUnit("px"));
+ _tracker->setActiveUnit(desktop->getNamedView()->display_units);
_mode_item->set_use_markup(true);
/* W */
diff --git a/src/ui/toolbar/text-toolbar.cpp b/src/ui/toolbar/text-toolbar.cpp
index bd73fe584..3b55f8b08 100644
--- a/src/ui/toolbar/text-toolbar.cpp
+++ b/src/ui/toolbar/text-toolbar.cpp
@@ -265,7 +265,7 @@ TextToolbar::TextToolbar(SPDesktop *desktop)
_tracker(new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR))
{
/* Line height unit tracker */
- _tracker->prependUnit(unit_table.getUnit("")); // No unit
+ _tracker->prependUnit(unit_table.getUnit("")); // Ratio
_tracker->addUnit(unit_table.getUnit("%"));
_tracker->addUnit(unit_table.getUnit("em"));
_tracker->addUnit(unit_table.getUnit("ex"));
diff --git a/src/ui/tools/flood-tool.cpp b/src/ui/tools/flood-tool.cpp
index 6db530917..68987dfcc 100644
--- a/src/ui/tools/flood-tool.cpp
+++ b/src/ui/tools/flood-tool.cpp
@@ -627,7 +627,7 @@ static ScanlineCheckResult perform_bitmap_scanline_check(std::deque<Geom::Point>
bool can_paint_top = (top_ty > 0);
bool can_paint_bottom = (bottom_ty < bci.height);
- Geom::Point t = fill_queue->front();
+ Geom::Point front_of_queue = fill_queue->empty() ? Geom::Point() : fill_queue->front();
do {
ok = false;
@@ -645,8 +645,11 @@ static ScanlineCheckResult perform_bitmap_scanline_check(std::deque<Geom::Point>
paint_directions = paint_pixel(px, trace_px, orig_color, bci, current_trace_t);
if (bci.radius == 0) {
mark_pixel_checked(current_trace_t);
- if ((t[Geom::X] == bci.x) && (t[Geom::Y] == bci.y)) {
- fill_queue->pop_front(); t = fill_queue->front();
+ if ((!fill_queue->empty()) &&
+ (front_of_queue[Geom::X] == bci.x) &&
+ (front_of_queue[Geom::Y] == bci.y)) {
+ fill_queue->pop_front();
+ front_of_queue = fill_queue->empty() ? Geom::Point() : fill_queue->front();
}
}
diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp
index f8c8517c9..64824514e 100644
--- a/src/ui/tools/measure-tool.cpp
+++ b/src/ui/tools/measure-tool.cpp
@@ -810,7 +810,7 @@ void MeasureTool::toMarkDimension()
setLine(start, end, true, color);
Glib::ustring unit_name = prefs->getString("/tools/measure/unit");
if (!unit_name.compare("")) {
- unit_name = "px";
+ unit_name = DEFAULT_UNIT_NAME;
}
double fontsize = prefs->getDouble("/tools/measure/fontsize", 10.0);
int precision = prefs->getInt("/tools/measure/precision", 2);
@@ -1162,7 +1162,7 @@ void MeasureTool::showInfoBox(Geom::Point cursor, bool into_groups)
Glib::ustring unit_name = prefs->getString("/tools/measure/unit");
bool only_selected = prefs->getBool("/tools/measure/only_selected", false);
if (!unit_name.compare("")) {
- unit_name = "px";
+ unit_name = DEFAULT_UNIT_NAME;
}
Geom::Scale zoom = Geom::Scale(Inkscape::Util::Quantity::convert(desktop->current_zoom(), "px", unit->abbr)).inverse();
if(newover != over){
@@ -1324,7 +1324,7 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, bool to_phantom,
}
Glib::ustring unit_name = prefs->getString("/tools/measure/unit");
if (!unit_name.compare("")) {
- unit_name = "px";
+ unit_name = DEFAULT_UNIT_NAME;
}
double scale = prefs->getDouble("/tools/measure/scale", 100.0) / 100.0;
double fontsize = prefs->getDouble("/tools/measure/fontsize", 10.0);
diff --git a/src/ui/widget/color-icc-selector.cpp b/src/ui/widget/color-icc-selector.cpp
index 0970c779c..a8e1d255f 100644
--- a/src/ui/widget/color-icc-selector.cpp
+++ b/src/ui/widget/color-icc-selector.cpp
@@ -486,7 +486,7 @@ void ColorICCSelector::init()
attachToGridOrTable(t, _impl->_label, 0, row, 1, 1);
// Adjustment
- _impl->_adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 255.0, 1.0, 10.0, 10.0));
+ _impl->_adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 100.0, 1.0, 10.0, 10.0));
// Slider
_impl->_slider = Gtk::manage(new Inkscape::UI::Widget::ColorSlider(Glib::wrap(_impl->_adj, true)));
@@ -941,12 +941,6 @@ void ColorICCSelectorImpl::_updateSliders(gint ignore)
void ColorICCSelectorImpl::_adjustmentChanged(GtkAdjustment *adjustment, ColorICCSelectorImpl *cs)
{
-// // TODO check this. It looks questionable:
-// // if a value is entered between 0 and 1 exclusive, normalize it to (int) 0..255 or 0..100
-// if (adjustment->value > 0.0 && adjustment->value < 1.0) {
-// gtk_adjustment_set_value( adjustment, floor ((adjustment->value) * adjustment->upper + 0.5) );
-// }
-
#ifdef DEBUG_LCMS
g_message("/^^^^^^^^^ %p::_adjustmentChanged()", cs);
#endif // DEBUG_LCMS
diff --git a/src/ui/widget/color-scales.cpp b/src/ui/widget/color-scales.cpp
index 588e9a84d..d68d19aec 100644
--- a/src/ui/widget/color-scales.cpp
+++ b/src/ui/widget/color-scales.cpp
@@ -376,6 +376,7 @@ void ColorScales::setMode(SPColorScalesMode mode)
switch (mode) {
case SP_COLOR_SCALES_MODE_RGB:
_setRangeLimit(255.0);
+ gtk_adjustment_set_upper(_a[3], 100.0);
gtk_label_set_markup_with_mnemonic(GTK_LABEL(_l[0]), _("_R:"));
_s[0]->set_tooltip_text(_("Red"));
gtk_widget_set_tooltip_text(_b[0], _("Red"));
diff --git a/src/ui/widget/color-wheel-selector.cpp b/src/ui/widget/color-wheel-selector.cpp
index 1c2660876..969530302 100644
--- a/src/ui/widget/color-wheel-selector.cpp
+++ b/src/ui/widget/color-wheel-selector.cpp
@@ -78,7 +78,7 @@ void ColorWheelSelector::_initUI()
attach(*label, 0, row, 1, 1);
/* Adjustment */
- _alpha_adjustment = Gtk::Adjustment::create(0.0, 0.0, 255.0, 1.0, 10.0, 10.0);
+ _alpha_adjustment = Gtk::Adjustment::create(0.0, 0.0, 100.0, 1.0, 10.0, 10.0);
/* Slider */
_slider = Gtk::manage(new Inkscape::UI::Widget::ColorSlider(_alpha_adjustment));
@@ -137,14 +137,6 @@ void ColorWheelSelector::_adjustmentChanged()
return;
}
- // TODO check this. It looks questionable:
- // if a value is entered between 0 and 1 exclusive, normalize it to (int) 0..255 or 0..100
- gdouble value = _alpha_adjustment->get_value();
- gdouble upper = _alpha_adjustment->get_upper();
- if (value > 0.0 && value < 1.0) {
- _alpha_adjustment->set_value(floor(value * upper + 0.5));
- }
-
_color.preserveICC();
_color.setAlpha(ColorScales::getScaled(_alpha_adjustment->gobj()));
}
diff --git a/src/ui/widget/unit-tracker.cpp b/src/ui/widget/unit-tracker.cpp
index 665bb7497..4abfaa9c8 100644
--- a/src/ui/widget/unit-tracker.cpp
+++ b/src/ui/widget/unit-tracker.cpp
@@ -180,7 +180,9 @@ UnitTracker::create_tool_item(Glib::ustring const &label,
Glib::ustring const &tooltip)
{
auto combo = ComboToolItem::create(label, tooltip, "NotUsed", _store);
+ combo->set_active(_active);
combo->signal_changed().connect(sigc::mem_fun(*this, &UnitTracker::_unitChangedCB));
+ combo->set_data("unit-tracker", this);
_combo_list.push_back(combo);
return combo;
}
diff --git a/src/util/units.h b/src/util/units.h
index 2b7f8674c..48478c77c 100644
--- a/src/util/units.h
+++ b/src/util/units.h
@@ -22,6 +22,8 @@
#ifndef DOXYGEN_SHOULD_SKIP_THIS
+#define DEFAULT_UNIT_NAME "mm";
+
namespace std {
template <>
struct hash<Glib::ustring> : public std::unary_function<Glib::ustring, std::size_t> {
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index 7386f2fa5..a50427c09 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -1769,10 +1769,10 @@ void SPDesktopWidget::namedviewModified(SPObject *obj, guint flags)
// Don't apply to text toolbar. We want to be able to
// use different units for text. (Bug 1562217)
const Glib::ustring name = j->get_name();
- if ( name == "TextToolbar")
+ if ( name == "TextToolbar" || name == "MeasureToolbar")
continue;
- gpointer t = sp_search_by_data_recursive(GTK_WIDGET(j->gobj()), (gpointer) "tracker");
+ gpointer t = sp_search_by_data_recursive(GTK_WIDGET(j->gobj()), (gpointer) "unit-tracker");
if (t == nullptr) // didn't find any tracker data
continue;
diff --git a/src/widgets/stroke-style.cpp b/src/widgets/stroke-style.cpp
index 46454d508..48f0e3d78 100644
--- a/src/widgets/stroke-style.cpp
+++ b/src/widgets/stroke-style.cpp
@@ -951,15 +951,15 @@ StrokeStyle::updateLine()
return;
std::vector<SPItem*> const objects(sel->items().begin(), sel->items().end());
- SPObject * const object = objects[0];
- SPStyle * const style = object->style;
-
- /* Markers */
- updateAllMarkers(objects, true); // FIXME: make this desktop query too
-
- /* Dash */
- setDashSelectorFromStyle(dashSelector, style); // FIXME: make this desktop query too
-
+ if (objects.size()) {
+ SPObject *const object = objects[0];
+ SPStyle *const style = object->style;
+ /* Markers */
+ updateAllMarkers(objects, true); // FIXME: make this desktop query too
+
+ /* Dash */
+ setDashSelectorFromStyle(dashSelector, style); // FIXME: make this desktop query too
+ }
table->set_sensitive(true);
update = false;
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index d3daa892f..e3b95fa2b 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -198,6 +198,7 @@ static struct {
SP_VERB_INVALID, nullptr, nullptr},
{ "/tools/zoom", "zoom_toolbox", Inkscape::UI::Toolbar::ZoomToolbar::create, nullptr, "ZoomToolbar",
SP_VERB_INVALID, nullptr, nullptr},
+ // If you change MeasureToolbar here, change it also in desktop-widget.cpp
{ "/tools/measure", "measure_toolbox", Inkscape::UI::Toolbar::MeasureToolbar::create, nullptr, "MeasureToolbar",
SP_VERB_INVALID, nullptr, nullptr},
{ "/tools/shapes/star", "star_toolbox", Inkscape::UI::Toolbar::StarToolbar::create, nullptr, "StarToolbar",
@@ -819,6 +820,7 @@ void setup_aux_toolbox(GtkWidget *toolbox, SPDesktop *desktop)
gtk_container_add(GTK_CONTAINER(toolbox), holder);
gtk_size_group_add_widget(grouper, holder);
sp_set_font_size_smaller( holder );
+ gtk_widget_set_name( holder, aux_toolboxes[i].ui_name );
// TODO: We could make the toolbox a custom subclass of GtkEventBox
// so that we can store a list of toolbars, rather than using
diff --git a/src/xml/repr-io.cpp b/src/xml/repr-io.cpp
index f6552a5f9..7b76a3086 100644
--- a/src/xml/repr-io.cpp
+++ b/src/xml/repr-io.cpp
@@ -983,7 +983,8 @@ void sp_repr_write_stream_element( Node * repr, Writer & out,
// If this is a <text> element, suppress formatting whitespace
// for its content and children:
- if (strcmp(repr->name(),"svg:text") == 0) {
+ if (strcmp(repr->name(), "svg:text") == 0 ||
+ strcmp(repr->name(), "svg:flowRoot") == 0) {
add_whitespace = false;
}