From 23b73ce7a1e4af469fa3020ee6b66da58c525b3c Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Mon, 3 Oct 2022 11:58:41 +0200 Subject: [PATCH 1/2] Prevent reload all icons in each desktop intance --- src/ui/dialog/symbols.cpp | 85 ++++++++++++++++++++++++--------------- src/ui/dialog/symbols.h | 2 +- 2 files changed, 53 insertions(+), 34 deletions(-) diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index be71c756e4..c421558d48 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -63,7 +63,7 @@ namespace Inkscape { namespace UI { namespace Dialog { - +static std::map > symbol_sets; /** * Constructor */ @@ -379,7 +379,7 @@ void SymbolsDialog::rebuild() { icons_found = false; //We are not in search all docs if (search->get_text() != _("Searching...") && search->get_text() != _("Loading all symbols...")) { - Glib::ustring current = Glib::Markup::escape_text(symbol_set->get_active_text()); + Glib::ustring current = Glib::Markup::escape_text(get_active_base_text()); if (current == ALLDOCS && search->get_text() != "") { searchsymbols(); return; @@ -392,7 +392,7 @@ void SymbolsDialog::rebuild() { } } void SymbolsDialog::showOverlay() { - Glib::ustring current = Glib::Markup::escape_text(symbol_set->get_active_text()); + Glib::ustring current = Glib::Markup::escape_text(get_active_base_text()); if (current == ALLDOCS && !l.size()) { overlay_icon->hide(); @@ -487,8 +487,8 @@ void SymbolsDialog::iconDragDataGet(const Glib::RefPtr& /*cont void SymbolsDialog::defsModified(SPObject * /*object*/, guint /*flags*/) { - Glib::ustring doc_title = symbol_set->get_active_text(); - if (doc_title != ALLDOCS && !symbol_sets[doc_title] ) { + Glib::ustring doc_title = get_active_base_text(); + if (doc_title != ALLDOCS && !symbol_sets[doc_title].second ) { rebuild(); } } @@ -498,7 +498,7 @@ void SymbolsDialog::selectionChanged(Inkscape::Selection *selection) { Glib::ustring symbol_id = getSymbolId(selected); Glib::ustring doc_title = getSymbolDocTitle(selected); if (!doc_title.empty()) { - SPDocument* symbol_document = symbol_sets[doc_title]; + SPDocument* symbol_document = symbol_sets[doc_title].second; if (!symbol_document) { //we are in global search so get the original symbol document by title symbol_document = selectedSymbols(); @@ -517,7 +517,7 @@ void SymbolsDialog::documentReplaced() defs_modified.disconnect(); if (auto document = getDocument()) { defs_modified = document->getDefs()->connectModified(sigc::mem_fun(*this, &SymbolsDialog::defsModified)); - if (!symbol_sets[symbol_set->get_active_text()]) { + if (!symbol_sets[get_active_base_text()].second) { // Symbol set is from Current document, need to rebuild rebuild(); } @@ -526,11 +526,11 @@ void SymbolsDialog::documentReplaced() SPDocument* SymbolsDialog::selectedSymbols() { /* OK, we know symbol name... now we need to copy it to clipboard, bon chance! */ - Glib::ustring doc_title = symbol_set->get_active_text(); + Glib::ustring doc_title = get_active_base_text(); if (doc_title == ALLDOCS) { return nullptr; } - SPDocument* symbol_document = symbol_sets[doc_title]; + SPDocument* symbol_document = symbol_sets[doc_title].second; if( !symbol_document ) { symbol_document = getSymbolsSet(doc_title).second; // Symbol must be from Current Document (this method of checking should be language independent). @@ -598,7 +598,7 @@ Glib::ustring SymbolsDialog::documentTitle(SPDocument* symbol_doc) { } g_free(title); } - Glib::ustring current = symbol_set->get_active_text(); + Glib::ustring current = get_active_base_text(); if (current == CURRENTDOC) { return current; } @@ -618,7 +618,7 @@ void SymbolsDialog::sendToClipboard(Gtk::TreeModel::Path const &symbol_path, Geo //we are in global search so get the original symbol document by title Glib::ustring doc_title = getSymbolDocTitle(symbol_path); if (!doc_title.empty()) { - symbol_document = symbol_sets[doc_title]; + symbol_document = symbol_sets[doc_title].second; } } if (!symbol_document) { @@ -819,7 +819,8 @@ void SymbolsDialog::getSymbolsTitle() { if(title.empty()) { title = _("Unnamed Symbols"); } - symbol_sets[title]= nullptr; + if (!symbol_sets[title].second) + symbol_sets[title]= std::make_pair(title,nullptr); ++number_docs; } else { std::ifstream infile(filename); @@ -828,7 +829,8 @@ void SymbolsDialog::getSymbolsTitle() { std::string title_res = std::regex_replace (line, matchtitle,"$1",std::regex_constants::format_no_copy); if (!title_res.empty()) { title_res = g_dpgettext2(nullptr, "Symbol", title_res.c_str()); - symbol_sets[ellipsize(Glib::ustring(title_res), 33)]= nullptr; + if (!symbol_sets[ellipsize(Glib::ustring(title_res), 33)].second) + symbol_sets[ellipsize(Glib::ustring(title_res), 33)]= std::make_pair(ellipsize(Glib::ustring(title_res), 33),nullptr); ++number_docs; break; } @@ -840,7 +842,8 @@ void SymbolsDialog::getSymbolsTitle() { if(title.empty()) { title = _("Unnamed Symbols"); } - symbol_sets[title]= nullptr; + if (!symbol_sets[title].second) + symbol_sets[title]= std::make_pair(title,nullptr); ++number_docs; break; } @@ -857,23 +860,24 @@ std::pair SymbolsDialog::getSymbolsSet(Glib::ustring title) { SPDocument* symbol_doc = nullptr; - Glib::ustring current = symbol_set->get_active_text(); - if (current == CURRENTDOC) { - return std::make_pair(CURRENTDOC, symbol_doc); + Glib::ustring current = get_active_base_text(); + if (title == CURRENTDOC) { + symbol_sets[CURRENTDOC] = std::make_pair(CURRENTDOC, nullptr); + return symbol_sets[CURRENTDOC]; } - if (symbol_sets[title]) { + if (symbol_sets[title].second) { sensitive = false; symbol_set->remove_all(); symbol_set->append(CURRENTDOC); symbol_set->append(ALLDOCS); for(auto const &symbol_document_map : symbol_sets) { - if (CURRENTDOC != symbol_document_map.first) { - symbol_set->append(symbol_document_map.first); + if (CURRENTDOC != symbol_document_map.second.first) { + symbol_set->append(symbol_document_map.second.first); } } symbol_set->set_active_text(title); sensitive = true; - return std::make_pair(title, symbol_sets[title]); + return symbol_sets[title]; } using namespace Inkscape::IO::Resource; Glib::ustring new_title; @@ -926,21 +930,20 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) } } if(symbol_doc) { - symbol_sets.erase(title); - symbol_sets[new_title] = symbol_doc; + symbol_sets[title] = std::make_pair(new_title,symbol_doc); sensitive = false; symbol_set->remove_all(); symbol_set->append(CURRENTDOC); symbol_set->append(ALLDOCS); for(auto const &symbol_document_map : symbol_sets) { - if (CURRENTDOC != symbol_document_map.first) { - symbol_set->append(symbol_document_map.first); + if (CURRENTDOC != symbol_document_map.second.first) { + symbol_set->append(symbol_document_map.second.first); } } - symbol_set->set_active_text(new_title); + symbol_set->set_active_text(title); sensitive = true; } - return std::make_pair(new_title, symbol_doc); + return symbol_sets[title]; } void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::map > &l, Glib::ustring doc_title) @@ -1133,18 +1136,34 @@ bool SymbolsDialog::callbackSymbols(){ return true; } +Glib::ustring SymbolsDialog::get_active_base_text() +{ + Glib::ustring out = symbol_set->get_active_text(); + for(auto const &symbol_document_map : symbol_sets) { + if (symbol_document_map.second.first == out) { + out = symbol_document_map.first; + } + } + return out; +} + + bool SymbolsDialog::callbackAllSymbols(){ - Glib::ustring current = symbol_set->get_active_text(); + Glib::ustring current = get_active_base_text(); if (current == ALLDOCS && search->get_text() == _("Loading all symbols...")) { size_t counter = 0; - std::map symbol_sets_tmp = symbol_sets; + std::map > symbol_sets_tmp = symbol_sets; for(auto const &symbol_document_map : symbol_sets_tmp) { ++counter; - SPDocument* symbol_document = symbol_document_map.second; + Glib::ustring current = get_active_base_text(); + if (current == CURRENTDOC) { + return true; + } + SPDocument* symbol_document = symbol_document_map.second.second; if (symbol_document) { continue; } - symbol_document = getSymbolsSet(symbol_document_map.first).second; + symbol_document = getSymbolsSet(symbol_document_map.second.first).second; symbol_set->set_active_text(ALLDOCS); if (!symbol_document) { continue; @@ -1198,7 +1217,7 @@ void SymbolsDialog::addSymbols() { store->clear(); icons_found = false; for(auto const &symbol_document_map : symbol_sets) { - SPDocument* symbol_document = symbol_document_map.second; + SPDocument* symbol_document = symbol_document_map.second.second; if (!symbol_document) { continue; } @@ -1232,7 +1251,7 @@ void SymbolsDialog::addSymbol(SPSymbol *symbol, Glib::ustring doc_title) if (doc_title.empty()) { doc_title = CURRENTDOC; } else { - doc_title = g_dpgettext2(nullptr, "Symbol", doc_title.c_str()); + doc_title = g_dpgettext2(nullptr, "Symbol", doc_title.c_str()); } Glib::ustring symbol_title; diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index e43e8fb91e..7a66d0fe89 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -121,13 +121,13 @@ private: void clearSearch(); bool callbackSymbols(); bool callbackAllSymbols(); + Glib::ustring get_active_base_text(); void enableWidgets(bool enable); Glib::ustring ellipsize(Glib::ustring data, size_t limit); gchar const* styleFromUse( gchar const* id, SPDocument* document); Glib::RefPtr drawSymbol(SPObject *symbol); Glib::RefPtr getOverlay(gint width, gint height); /* Keep track of all symbol template documents */ - std::map symbol_sets; std::map > l; // Index into sizes which is selected int pack_size; -- GitLab From d9ec7b4e45b4b4f42eca9fb7bfb93512f92c2fac Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Wed, 5 Oct 2022 19:33:09 +0200 Subject: [PATCH 2/2] ... --- src/ui/dialog/symbols.cpp | 252 ++++++++++++++++++++++++-------------- src/ui/dialog/symbols.h | 43 +++++-- 2 files changed, 190 insertions(+), 105 deletions(-) diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index c421558d48..5522d093f0 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -22,6 +22,7 @@ #include #include + #include #include #include @@ -45,6 +46,7 @@ #include "ui/icon-loader.h" #include "ui/icon-names.h" #include "ui/widget/scrollprotected.h" +#include "async/async.h" #ifdef WITH_LIBVISIO #include @@ -206,19 +208,6 @@ SymbolsDialog::SymbolsDialog(gchar const *prefsPath) previous_height = 0; previous_width = 0; ++row; - - /******************** Progress *******************************/ - progress = new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL); - progress_bar = Gtk::manage(new Gtk::ProgressBar()); - table->attach(*Gtk::manage(progress),0,row, 2, 1); - progress->pack_start(* progress_bar, Gtk::PACK_EXPAND_WIDGET); - progress->set_margin_top(15); - progress->set_margin_bottom(15); - progress->set_margin_start(20); - progress->set_margin_end(20); - - ++row; - /******************** Tools *******************************/ tools = new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL); @@ -318,6 +307,7 @@ SymbolsDialog::SymbolsDialog(gchar const *prefsPath) getSymbolsTitle(); icons_found = false; + Glib::signal_idle().connect(sigc::mem_fun(*this, &SymbolsDialog::callbackAllSymbols)); } SymbolsDialog::~SymbolsDialog() @@ -326,7 +316,6 @@ SymbolsDialog::~SymbolsDialog() connection.disconnect(); } gtk_connections.clear(); - idleconn.disconnect(); Inkscape::GC::release(preview_document); assert(preview_document->_anchored_refcount() == 0); @@ -375,7 +364,7 @@ void SymbolsDialog::rebuild() { zoom_out->set_sensitive( true ); } store->clear(); - SPDocument* symbol_document = selectedSymbols(); + SPDocument * symbol_document = selectedSymbols(); icons_found = false; //We are not in search all docs if (search->get_text() != _("Searching...") && search->get_text() != _("Loading all symbols...")) { @@ -498,7 +487,7 @@ void SymbolsDialog::selectionChanged(Inkscape::Selection *selection) { Glib::ustring symbol_id = getSymbolId(selected); Glib::ustring doc_title = getSymbolDocTitle(selected); if (!doc_title.empty()) { - SPDocument* symbol_document = symbol_sets[doc_title].second; + SPDocument * symbol_document = symbol_sets[doc_title].second; if (!symbol_document) { //we are in global search so get the original symbol document by title symbol_document = selectedSymbols(); @@ -524,13 +513,14 @@ void SymbolsDialog::documentReplaced() } } -SPDocument* SymbolsDialog::selectedSymbols() { +SPDocument * SymbolsDialog::selectedSymbols() { /* OK, we know symbol name... now we need to copy it to clipboard, bon chance! */ + SPDocument * ret; Glib::ustring doc_title = get_active_base_text(); if (doc_title == ALLDOCS) { - return nullptr; + return ret; } - SPDocument* symbol_document = symbol_sets[doc_title].second; + SPDocument * symbol_document = symbol_sets[doc_title].second; if( !symbol_document ) { symbol_document = getSymbolsSet(doc_title).second; // Symbol must be from Current Document (this method of checking should be language independent). @@ -547,6 +537,23 @@ SPDocument* SymbolsDialog::selectedSymbols() { } return symbol_document; } +/* dest = getSymbolsSet(doc_title, false, [this, symbol_document = std::move(symbol_document)] (std::pair current_symbol_sets) { + symbol_document = current_symbol_sets.second; + if( !symbol_document ) { + // Symbol must be from Current Document (this method of + // checking should be language independent). + symbol_document = getDocument(); + add_symbol->set_sensitive( true ); + remove_symbol->set_sensitive( true ); + } else { + add_symbol->set_sensitive( false ); + remove_symbol->set_sensitive( false ); + } + dest.close(); + }); + } + return symbol_document; +} */ /** Return the path to the selected symbol, or an empty optional if nothing is selected. */ std::optional SymbolsDialog::getSelected() const @@ -589,7 +596,7 @@ Glib::ustring SymbolsDialog::getSymbolDocTitle(std::optionalgetRoot(); gchar * title = root->title(); @@ -613,7 +620,7 @@ Glib::ustring SymbolsDialog::documentTitle(SPDocument* symbol_doc) { void SymbolsDialog::sendToClipboard(Gtk::TreeModel::Path const &symbol_path, Geom::Rect const &bbox) { Glib::ustring symbol_id = getSymbolId(symbol_path); - SPDocument* symbol_document = selectedSymbols(); + SPDocument * symbol_document = selectedSymbols(); if (!symbol_document) { //we are in global search so get the original symbol document by title Glib::ustring doc_title = getSymbolDocTitle(symbol_path); @@ -722,7 +729,7 @@ class REVENGE_API RVNGSVGDrawingGenerator_WithTitle : public RVNGSVGDrawingGener }; // Read Visio stencil files -SPDocument* read_vss(Glib::ustring filename, Glib::ustring name ) { +SPDocument * read_vss(Glib::ustring filename, Glib::ustring name ) { gchar *fullname; #ifdef _WIN32 // RVNGFileStream uses fopen() internally which unfortunately only uses ANSI encoding on Windows @@ -810,6 +817,7 @@ void SymbolsDialog::getSymbolsTitle() { using namespace Inkscape::IO::Resource; Glib::ustring title; number_docs = 0; + SPDocument * doc; std::regex matchtitle (".*?(.*?)<(/| /)"); for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { if(Glib::str_has_suffix(filename, ".vss")) { @@ -820,7 +828,7 @@ void SymbolsDialog::getSymbolsTitle() { title = _("Unnamed Symbols"); } if (!symbol_sets[title].second) - symbol_sets[title]= std::make_pair(title,nullptr); + symbol_sets[title]= std::make_pair(title,doc); ++number_docs; } else { std::ifstream infile(filename); @@ -830,7 +838,7 @@ void SymbolsDialog::getSymbolsTitle() { if (!title_res.empty()) { title_res = g_dpgettext2(nullptr, "Symbol", title_res.c_str()); if (!symbol_sets[ellipsize(Glib::ustring(title_res), 33)].second) - symbol_sets[ellipsize(Glib::ustring(title_res), 33)]= std::make_pair(ellipsize(Glib::ustring(title_res), 33),nullptr); + symbol_sets[ellipsize(Glib::ustring(title_res), 33)]= std::make_pair(ellipsize(Glib::ustring(title_res), 33),doc); ++number_docs; break; } @@ -843,7 +851,7 @@ void SymbolsDialog::getSymbolsTitle() { title = _("Unnamed Symbols"); } if (!symbol_sets[title].second) - symbol_sets[title]= std::make_pair(title,nullptr); + symbol_sets[title]= std::make_pair(title,doc); ++number_docs; break; } @@ -856,13 +864,12 @@ void SymbolsDialog::getSymbolsTitle() { } /* Hunts preference directories for symbol files */ -std::pair +std::pair SymbolsDialog::getSymbolsSet(Glib::ustring title) { - SPDocument* symbol_doc = nullptr; - Glib::ustring current = get_active_base_text(); + SPDocument * symbol_doc; if (title == CURRENTDOC) { - symbol_sets[CURRENTDOC] = std::make_pair(CURRENTDOC, nullptr); + symbol_sets[CURRENTDOC] = std::make_pair(CURRENTDOC, symbol_doc); return symbol_sets[CURRENTDOC]; } if (symbol_sets[title].second) { @@ -879,9 +886,62 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) sensitive = true; return symbol_sets[title]; } + symbol_sets[title] = parseSymbolsSet(title); + sensitive = false; + symbol_set->remove_all(); + symbol_set->append(CURRENTDOC); + symbol_set->append(ALLDOCS); + for(auto const &symbol_document_map : symbol_sets) { + if (CURRENTDOC != symbol_document_map.second.first) { + symbol_set->append(symbol_document_map.second.first); + } + } + symbol_set->set_active_text(title); + sensitive = true; + return symbol_sets[title]; +} + +/* Hunts preference directories for symbol files async */ +void +SymbolsDialog::getSymbolsSetAsync(Glib::ustring title) +{ + defer([this, title = std::move(title)] () mutable { + dest = loadAsyncSymbolsSet(title, [this, title = std::move(title)] (std::pair current_symbol_sets) { + symbol_sets[title] = current_symbol_sets; + dest.close(); + }); + }); +} + +/* Hunts preference directories for symbol files */ +Async::Channel::Dest +SymbolsDialog::loadAsyncSymbolsSet(Glib::ustring title, std::function)> &&onfinished) +{ + auto [src, dst] = Async::Channel::create(); + Async::fire_and_forget([this, + title = std::move(title), + onfinished = std::move(onfinished), + src = std::move(src)] + { + std::pair doc = parseSymbolsSet(title); + src.run([this, + title = std::move(title), + onfinished = std::move(onfinished), + doc = std::move(doc)] { + + onfinished(std::move(doc)); + }); + }); + return std::move(dst); +} + +/* Hunts preference directories for symbol files */ +std::pair +SymbolsDialog::parseSymbolsSet(Glib::ustring title) +{ using namespace Inkscape::IO::Resource; Glib::ustring new_title; - + SPDocument * symbol_doc; std::regex matchtitle (".*?(.*?)<(/| /)"); for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { if(Glib::str_has_suffix(filename, ".vss")) { @@ -929,21 +989,7 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) break; } } - if(symbol_doc) { - symbol_sets[title] = std::make_pair(new_title,symbol_doc); - sensitive = false; - symbol_set->remove_all(); - symbol_set->append(CURRENTDOC); - symbol_set->append(ALLDOCS); - for(auto const &symbol_document_map : symbol_sets) { - if (CURRENTDOC != symbol_document_map.second.first) { - symbol_set->append(symbol_document_map.second.first); - } - } - symbol_set->set_active_text(title); - sensitive = true; - } - return symbol_sets[title]; + return std::make_pair(new_title,symbol_doc); } void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::map > &l, Glib::ustring doc_title) @@ -971,7 +1017,7 @@ void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::map > -SymbolsDialog::symbolsInDoc( SPDocument* symbol_document, Glib::ustring doc_title) +SymbolsDialog::symbolsInDoc( SPDocument * symbol_document, Glib::ustring doc_title) { std::map > l; @@ -993,7 +1039,7 @@ void SymbolsDialog::useInDoc (SPObject *r, std::vector &l) } } -std::vector SymbolsDialog::useInDoc( SPDocument* useDocument) { +std::vector SymbolsDialog::useInDoc( SPDocument * useDocument) { std::vector l; useInDoc (useDocument->getRoot(), l); return l; @@ -1001,7 +1047,7 @@ std::vector SymbolsDialog::useInDoc( SPDocument* useDocument) { // Returns style from first element found that references id. // This is a last ditch effort to find a style. -gchar const* SymbolsDialog::styleFromUse( gchar const* id, SPDocument* document) { +gchar const* SymbolsDialog::styleFromUse( gchar const* id, SPDocument *document) { gchar const* style = nullptr; std::vector l = useInDoc( document ); @@ -1028,7 +1074,7 @@ void SymbolsDialog::clearSearch() enableWidgets(false); search_str = ""; store->clear(); - SPDocument* symbol_document = selectedSymbols(); + SPDocument * symbol_document = selectedSymbols(); if (symbol_document) { //We are not in search all docs icons_found = false; @@ -1059,9 +1105,8 @@ void SymbolsDialog::beforeSearch(GdkEventKey* evt) void SymbolsDialog::searchsymbols() { - progress_bar->set_fraction(0.0); enableWidgets(false); - SPDocument *symbol_document = selectedSymbols(); + SPDocument * symbol_document = selectedSymbols(); if (symbol_document) { // We are not in search all docs search->set_text(_("Searching...")); @@ -1069,9 +1114,9 @@ void SymbolsDialog::searchsymbols() icons_found = false; addSymbolsInDoc(symbol_document); } else { - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect(sigc::mem_fun(*this, &SymbolsDialog::callbackAllSymbols)); - search->set_text(_("Loading all symbols...")); + + search->set_text(_("Loading all symbols...")); + //callbackAllSymbols(); } } @@ -1111,7 +1156,6 @@ bool SymbolsDialog::callbackSymbols(){ icons_found = true; } - progress_bar->set_fraction(((100.0/number_symbols) * counter_symbols)/100.0); symbol_data = l.erase(l.begin()); //to get more items and best performance int modulus = number_symbols > 200 ? 50 : (number_symbols/4); @@ -1126,7 +1170,6 @@ bool SymbolsDialog::callbackSymbols(){ } else { hideOverlay(); } - progress_bar->set_fraction(0); sensitive = false; search->set_text(search_str); sensitive = true; @@ -1148,35 +1191,67 @@ Glib::ustring SymbolsDialog::get_active_base_text() } -bool SymbolsDialog::callbackAllSymbols(){ - Glib::ustring current = get_active_base_text(); - if (current == ALLDOCS && search->get_text() == _("Loading all symbols...")) { - size_t counter = 0; - std::map > symbol_sets_tmp = symbol_sets; - for(auto const &symbol_document_map : symbol_sets_tmp) { - ++counter; - Glib::ustring current = get_active_base_text(); - if (current == CURRENTDOC) { - return true; - } - SPDocument* symbol_document = symbol_document_map.second.second; - if (symbol_document) { +void SymbolsDialog::snapshot() +{ + assert(!_snapshotted); + _snapshotted = true; +} + +void SymbolsDialog::unsnapshot() +{ + assert(_snapshotted); + _snapshotted = false; // Unsnapshot before replaying log so further work is not deferred. + _funclog(); +} + + +bool SymbolsDialog::callbackAllSymbols() { + static bool started = true; + symbol_set->set_active_text(ALLDOCS); + if (started) { + snapshot(); + for(auto const &symbol_document_map : symbol_sets) { + Glib::ustring key = symbol_document_map.first; + if (key == CURRENTDOC) { continue; } - symbol_document = getSymbolsSet(symbol_document_map.second.first).second; - symbol_set->set_active_text(ALLDOCS); - if (!symbol_document) { - continue; + if (started) { + std::cout << "CCCCCCCCCCCCCCCCCCCCCCCC" << std::endl; + getSymbolsSetAsync(key); } - progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); - return true; } - symbol_sets_tmp.clear(); - hideOverlay(); - all_docs_processed = true; + unsnapshot(); + } + started = false; + bool finish = true; + for(auto const &symbol_document_map : symbol_sets) { + Glib::ustring key = symbol_document_map.first; + if (key == CURRENTDOC) { + continue; + } + SPDocument * symbol_document = symbol_document_map.second.second; + if (symbol_document) { + continue; + } + finish = false; + return true; + } + std::cout << "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAa" << std::endl; + hideOverlay(); + all_docs_processed = finish; + if (all_docs_processed) { addSymbols(); - progress_bar->set_fraction(0); search->set_text("Searching..."); + sensitive = false; + symbol_set->remove_all(); + symbol_set->append(CURRENTDOC); + symbol_set->append(ALLDOCS); + for(auto const &symbol_document_map : symbol_sets) { + if (CURRENTDOC != symbol_document_map.second.first) { + symbol_set->append(symbol_document_map.second.first); + } + } + sensitive = true; return false; } return true; @@ -1190,13 +1265,12 @@ Glib::ustring SymbolsDialog::ellipsize(Glib::ustring data, size_t limit) { return data; } -void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { +void SymbolsDialog::addSymbolsInDoc(SPDocument * symbol_document) { if (!symbol_document) { return; //Search all } Glib::ustring doc_title = documentTitle(symbol_document); - progress_bar->set_fraction(0.0); counter_symbols = 0; l = symbolsInDoc(symbol_document, doc_title); number_symbols = l.size(); @@ -1205,11 +1279,10 @@ void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { search->set_text(search_str); sensitive = true; enableWidgets(true); - idleconn.disconnect(); showOverlay(); - } else { - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); + /* } else { + search->set_text(_("Loading all symbols...")); + callbackAllSymbols(); */ } } @@ -1217,7 +1290,7 @@ void SymbolsDialog::addSymbols() { store->clear(); icons_found = false; for(auto const &symbol_document_map : symbol_sets) { - SPDocument* symbol_document = symbol_document_map.second.second; + SPDocument * symbol_document = symbol_document_map.second.second; if (!symbol_document) { continue; } @@ -1229,18 +1302,13 @@ void SymbolsDialog::addSymbols() { l_tmp.clear(); } counter_symbols = 0; - progress_bar->set_fraction(0.0); number_symbols = l.size(); if (!number_symbols) { showOverlay(); - idleconn.disconnect(); sensitive = false; search->set_text(search_str); sensitive = true; enableWidgets(true); - } else { - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); } } @@ -1365,7 +1433,7 @@ SymbolsDialog::drawSymbol(SPObject *symbol) * Symbols are by default not rendered so a element is * provided. */ -SPDocument* SymbolsDialog::symbolsPreviewDoc() +SPDocument * SymbolsDialog::symbolsPreviewDoc() { // BUG: must be inside gchar const *buffer = diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 7a66d0fe89..0e5c5607fd 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -17,7 +17,8 @@ #include #include - +#include +#include "async/channel.h" #include "display/drawing.h" #include "helper/auto-connection.h" #include "include/gtkmm_version.h" @@ -93,7 +94,7 @@ private: void insertSymbol(); void revertSymbol(); void defsModified(SPObject *object, guint flags); - SPDocument* selectedSymbols(); + SPDocument * selectedSymbols(); void iconChanged(); void sendToClipboard(Gtk::TreeModel::Path const &symbol_path, Geom::Rect const &bbox); std::optional getSelected() const; @@ -103,19 +104,22 @@ private: void iconDragDataGet(const Glib::RefPtr& context, Gtk::SelectionData& selection_data, guint info, guint time); void onDragStart(); void getSymbolsTitle(); - Glib::ustring documentTitle(SPDocument* doc); - std::pair getSymbolsSet(Glib::ustring title); + Glib::ustring documentTitle(SPDocument *doc); + std::pair getSymbolsSet(Glib::ustring title); + void getSymbolsSetAsync(Glib::ustring title); + Async::Channel::Dest loadAsyncSymbolsSet(Glib::ustring title, std::function symboldoc)> &&onfinished); + std::pair parseSymbolsSet(Glib::ustring title); void addSymbol(SPSymbol *symbol, Glib::ustring doc_title); - SPDocument* symbolsPreviewDoc(); + SPDocument *symbolsPreviewDoc(); void symbolsInDocRecursive (SPObject *r, std::map > &l, Glib::ustring doc_title); - std::map > symbolsInDoc( SPDocument* document, Glib::ustring doc_title); + std::map > symbolsInDoc( SPDocument * document, Glib::ustring doc_title); void useInDoc(SPObject *r, std::vector &l); - std::vector useInDoc( SPDocument* document); + std::vector useInDoc( SPDocument * document); void beforeSearch(GdkEventKey* evt); void unsensitive(GdkEventKey* evt); void searchsymbols(); void addSymbols(); - void addSymbolsInDoc(SPDocument* document); + void addSymbolsInDoc(SPDocument * document); void showOverlay(); void hideOverlay(); void clearSearch(); @@ -124,7 +128,7 @@ private: Glib::ustring get_active_base_text(); void enableWidgets(bool enable); Glib::ustring ellipsize(Glib::ustring data, size_t limit); - gchar const* styleFromUse( gchar const* id, SPDocument* document); + gchar const* styleFromUse( gchar const* id, SPDocument *document); Glib::RefPtr drawSymbol(SPObject *symbol); Glib::RefPtr getOverlay(gint width, gint height); /* Keep track of all symbol template documents */ @@ -145,8 +149,7 @@ private: Glib::RefPtr store; Glib::ustring search_str; Gtk::ComboBoxText* symbol_set; - Gtk::ProgressBar* progress_bar; - Gtk::Box* progress; + Async::Channel::Dest dest; Gtk::SearchEntry* search; Gtk::IconView* icon_view; Gtk::Button* add_symbol; @@ -165,13 +168,27 @@ private: Gtk::ToggleButton* fit_symbol; Gtk::IconSize iconsize; - SPDocument* preview_document; /* Document to render single symbol */ + SPDocument * preview_document; /* Document to render single symbol */ - sigc::connection idleconn; + void snapshot(); + void unsnapshot(); + bool snapshotted() const { return _snapshotted; } /* For rendering the template drawing */ unsigned key; Inkscape::Drawing renderDrawing; + bool _snapshotted = false; + Util::FuncLog _funclog; + + template + void defer(F &&f) + { + if (!_snapshotted) { + f(); + } else { + _funclog.emplace(std::forward(f)); + } + } std::vector gtk_connections; Inkscape::auto_connection defs_modified; -- GitLab