diff options
| author | Diederik van Lierop <mail@diedenrezi.nl> | 2019-04-30 20:40:33 +0000 |
|---|---|---|
| committer | Diederik van Lierop <mail@diedenrezi.nl> | 2019-04-30 20:40:33 +0000 |
| commit | d137944b06575b9e79d0a3e79a3e5f5b8f6665e2 (patch) | |
| tree | 6017a86cc0040ca9d7615c879036bd320f6e5de7 /src | |
| parent | Fix disappearing and antialiasing of grid lines (diff) | |
| parent | Set spacing in About Dialog (diff) | |
| download | inkscape-d137944b06575b9e79d0a3e79a3e5f5b8f6665e2.tar.gz inkscape-d137944b06575b9e79d0a3e79a3e5f5b8f6665e2.zip | |
Merge branch 'master' of gitlab.com:inkscape/inkscape
Diffstat (limited to 'src')
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; } |
