From aa33189524513d54d049ee866c126c892461c62c Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Wed, 18 Oct 2017 11:59:53 +0200 Subject: Add search to symbols dialog --- src/ui/dialog/symbols.cpp | 78 +++++++++++++++++++++++++++++++++++++++-------- src/ui/dialog/symbols.h | 11 ++++--- 2 files changed, 72 insertions(+), 17 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 558b0b19e..28fd491fd 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -84,11 +84,14 @@ public: Gtk::TreeModelColumn symbol_id; Gtk::TreeModelColumn symbol_title; + Gtk::TreeModelColumn symbol_doc_title; Gtk::TreeModelColumn< Glib::RefPtr > symbol_image; + SymbolColumns() { add(symbol_id); add(symbol_title); + add(symbol_doc_title); add(symbol_image); } }; @@ -182,7 +185,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : addSymbol->set_tooltip_text(_("Add Symbol from the current document.")); addSymbol->set_relief( Gtk::RELIEF_NONE ); addSymbol->set_focus_on_click( false ); - addSymbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::insertSymbol)); + addSymbol->signal_activate().connect(sigc::mem_fun(*this, &SymbolsDialog::insertSymbol)); tools->pack_start(* addSymbol, Gtk::PACK_SHRINK); auto removeSymbolImage = Gtk::manage(new Gtk::Image()); @@ -198,7 +201,10 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : Gtk::Label* spacer = Gtk::manage(new Gtk::Label("")); tools->pack_start(* Gtk::manage(spacer)); - + search = Gtk::manage(new Gtk::SearchEntry()); // Search + tools->pack_start(* search, Gtk::PACK_SHRINK); + sigc::connection connSetSearch = search->signal_key_press_event().connect_notify(sigc::bind<0>(sigc::mem_fun(*this, &SymbolsDialog::find_symbols), search)); + // Pack size (controls display area) pack_size = 2; // Default 32px @@ -422,8 +428,10 @@ void SymbolsDialog::documentReplaced(SPDesktop *desktop, SPDocument *document) SPDocument* SymbolsDialog::selectedSymbols() { /* OK, we know symbol name... now we need to copy it to clipboard, bon chance! */ - Glib::ustring symbolSetString = symbolSet->get_active_text(); - + Glib::ustring symbolSetString = selectedSymbolDocTitle(); + if (symbolSetString.empty()) { + symbolSetString = symbolSet->get_active_text(); + } SPDocument* symbolDocument = symbolSets[symbolSetString]; if( !symbolDocument ) { // Symbol must be from Current Document (this method of checking should be language independent). @@ -444,6 +452,18 @@ Glib::ustring SymbolsDialog::selectedSymbolId() { return Glib::ustring(""); } +Glib::ustring SymbolsDialog::selectedSymbolDocTitle() { + + auto iconArray = iconView->get_selected_items(); + + if( !iconArray.empty() ) { + Gtk::TreeModel::Path const & path = *iconArray.begin(); + Gtk::ListStore::iterator row = store->get_iter(path); + return (*row)[getColumns()->symbol_doc_title]; + } + return Glib::ustring(""); +} + void SymbolsDialog::iconChanged() { Glib::ustring symbol_id = selectedSymbolId(); @@ -635,7 +655,7 @@ void SymbolsDialog::symbols_in_doc_recursive (SPObject *r, std::vector SymbolsDialog::symbols_in_doc( SPDocument* symbolDocument ) +std::vector SymbolsDialog::symbols_in_doc( SPDocument* symbolDocument) { std::vector l; @@ -655,8 +675,7 @@ void SymbolsDialog::use_in_doc_recursive (SPObject *r, std::vector &l) } } -std::vector SymbolsDialog::use_in_doc( SPDocument* useDocument ) { - +std::vector SymbolsDialog::use_in_doc( SPDocument* useDocument) { std::vector l; use_in_doc_recursive (useDocument->getRoot(), l); return l; @@ -685,17 +704,46 @@ gchar const* SymbolsDialog::style_from_use( gchar const* id, SPDocument* documen return style; } -void SymbolsDialog::add_symbols( SPDocument* symbolDocument ) { +void SymbolsDialog::add_symbols( SPDocument* symbol_document ) { + if (symbol_document) { + std::vector l = symbols_in_doc( symbol_document ); + Glib::ustring doc_title = ""; + if (symbol_document->getRoot()->title()) { + doc_title = symbol_document->getRoot()->title(); + } + for(auto symbol:l) { + if (symbol) { + add_symbol( symbol, doc_title); + } + } + } +} - std::vector l = symbols_in_doc( symbolDocument ); - for(auto symbol:l) { - if (symbol) { - add_symbol( symbol ); +void SymbolsDialog::find_symbols(Gtk::SearchEntry* search, GdkEventKey* evt) { + store->clear(); + Glib::ustring title = search->get_text(); + if (evt->keyval != GDK_KEY_Return || title.empty()) { + return; + } + symbolSet->set_active_text(_("Search")); + for(auto const &symbol_document_map : symbolSets) { + SPDocument* symbol_document = symbol_document_map.second; + std::vector l = symbols_in_doc( symbol_document); + for(auto symbol:l) { + gchar const *symbol_title_char = symbol->title(); + if (symbol_title_char) { + Glib::ustring symbol_title = Glib::ustring(symbol_title_char); + auto pos = symbol_title.rfind(title); + if (symbol && pos != std::string::npos) { + Glib::ustring doc_title = symbol_document_map.first; // From doc title element + add_symbol( symbol, doc_title); + } + } } } } -void SymbolsDialog::add_symbol( SPObject* symbol ) { +void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { SymbolColumns* columns = getColumns(); @@ -704,6 +752,9 @@ void SymbolsDialog::add_symbol( SPObject* symbol ) { if( !title ) { title = id; } + if( doc_title.empty() ) { + return; + } Glib::RefPtr pixbuf = draw_symbol( symbol ); @@ -711,6 +762,7 @@ void SymbolsDialog::add_symbol( SPObject* symbol ) { Gtk::ListStore::iterator row = store->append(); (*row)[columns->symbol_id] = Glib::ustring( id ); (*row)[columns->symbol_title] = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "Symbol", title) )); + (*row)[columns->symbol_doc_title] = Glib::Markup::escape_text(doc_title); (*row)[columns->symbol_image] = pixbuf; } diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 747e5c6c9..1ce826f4b 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -18,7 +18,7 @@ #include "ui/widget/panel.h" #include "sp-symbol.h" #include "sp-use.h" - +#include #include class SPObject; @@ -77,18 +77,20 @@ private: void documentReplaced(SPDesktop *desktop, SPDocument *document); SPDocument* selectedSymbols(); Glib::ustring selectedSymbolId(); + Glib::ustring selectedSymbolDocTitle(); void iconChanged(); void iconDragDataGet(const Glib::RefPtr& context, Gtk::SelectionData& selection_data, guint info, guint time); void get_symbols(); void add_symbols( SPDocument* symbol_document ); - void add_symbol( SPObject* symbol_document ); + void add_symbol( SPObject* symbol, Glib::ustring doc_title); SPDocument* symbols_preview_doc(); void symbols_in_doc_recursive(SPObject *r, std::vector &l); - std::vector symbols_in_doc( SPDocument* document ); + std::vector symbols_in_doc( SPDocument* document); void use_in_doc_recursive(SPObject *r, std::vector &l); - std::vector use_in_doc( SPDocument* document ); + std::vector use_in_doc( SPDocument* document); + void find_symbols(Gtk::SearchEntry* search, GdkEventKey* evt); gchar const* style_from_use( gchar const* id, SPDocument* document); Glib::RefPtr draw_symbol(SPObject *symbol); @@ -104,6 +106,7 @@ private: Glib::RefPtr store; Gtk::ComboBoxText* symbolSet; + Gtk::SearchEntry* search; Gtk::IconView* iconView; Gtk::Button* addSymbol; Gtk::Button* removeSymbol; -- cgit v1.2.3 From f515f9cb276b1fb5027cf592ed07c1f0b660d03c Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Wed, 18 Oct 2017 22:45:05 +0200 Subject: Working on speed improvements --- src/ui/dialog/symbols.cpp | 120 +++++++++++++++++++++++++++++++++------------- src/ui/dialog/symbols.h | 1 + 2 files changed, 89 insertions(+), 32 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 28fd491fd..152c1e7e3 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -202,6 +202,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : Gtk::Label* spacer = Gtk::manage(new Gtk::Label("")); tools->pack_start(* Gtk::manage(spacer)); search = Gtk::manage(new Gtk::SearchEntry()); // Search + search->set_tooltip_text(_("Search trought all symbols. Use * to get all (slow).")); tools->pack_start(* search, Gtk::PACK_SHRINK); sigc::connection connSetSearch = search->signal_key_press_event().connect_notify(sigc::bind<0>(sigc::mem_fun(*this, &SymbolsDialog::find_symbols), search)); @@ -359,18 +360,24 @@ void SymbolsDialog::rebuild() { store->clear(); Glib::ustring symbolSetString = symbolSet->get_active_text(); - SPDocument* symbolDocument = symbolSets[symbolSetString]; - if( !symbolDocument ) { - // Symbol must be from Current Document (this method of - // checking should be language independent). - symbolDocument = currentDocument; - addSymbol->set_sensitive( true ); - removeSymbol->set_sensitive( true ); + SPDocument* symbol_document = symbolSets[symbolSetString]; + if( !symbol_document ) { + get_symbols(symbolSetString); + symbolSetString = symbolSet->get_active_text(); + symbol_document = symbolSets[symbolSetString]; + // Symbol must be from Current Document (this method of checking should be language independent). + if( !symbol_document ) { + // Symbol must be from Current Document (this method of + // checking should be language independent). + symbol_document = currentDocument; + addSymbol->set_sensitive( true ); + removeSymbol->set_sensitive( true ); + } } else { addSymbol->set_sensitive( false ); removeSymbol->set_sensitive( false ); } - add_symbols( symbolDocument ); + add_symbols( symbol_document ); } void SymbolsDialog::insertSymbol() { @@ -411,8 +418,8 @@ void SymbolsDialog::defsModified(SPObject * /*object*/, guint /*flags*/) void SymbolsDialog::selectionChanged(Inkscape::Selection *selection) { Glib::ustring symbol_id = selectedSymbolId(); - SPDocument* symbolDocument = selectedSymbols(); - SPObject* symbol = symbolDocument->getObjectById(symbol_id); + SPDocument* symbol_document = selectedSymbols(); + SPObject* symbol = symbol_document->getObjectById(symbol_id); if(symbol && !selection->includes(symbol)) { iconView->unselect_all(); @@ -432,12 +439,17 @@ SPDocument* SymbolsDialog::selectedSymbols() { if (symbolSetString.empty()) { symbolSetString = symbolSet->get_active_text(); } - SPDocument* symbolDocument = symbolSets[symbolSetString]; - if( !symbolDocument ) { + SPDocument* symbol_document = symbolSets[symbolSetString]; + if( !symbol_document ) { + get_symbols(symbolSetString); + symbolSetString = symbolSet->get_active_text(); + symbol_document = symbolSets[symbolSetString]; // Symbol must be from Current Document (this method of checking should be language independent). - return currentDocument; + if( !symbol_document ) { + return currentDocument; + } } - return symbolDocument; + return symbol_document; } Glib::ustring SymbolsDialog::selectedSymbolId() { @@ -467,8 +479,8 @@ Glib::ustring SymbolsDialog::selectedSymbolDocTitle() { void SymbolsDialog::iconChanged() { Glib::ustring symbol_id = selectedSymbolId(); - SPDocument* symbolDocument = selectedSymbols(); - SPObject* symbol = symbolDocument->getObjectById(symbol_id); + SPDocument* symbol_document = selectedSymbols(); + SPObject* symbol = symbol_document->getObjectById(symbol_id); if( symbol ) { // Find style for use in @@ -476,15 +488,15 @@ void SymbolsDialog::iconChanged() { gchar const* style = symbol->getAttribute("inkscape:symbol-style"); if( !style ) { // If no default style in , look in documents. - if( symbolDocument == currentDocument ) { + if( symbol_document == currentDocument ) { style = style_from_use( symbol_id.c_str(), currentDocument ); } else { - style = symbolDocument->getReprRoot()->attribute("style"); + style = symbol_document->getReprRoot()->attribute("style"); } } ClipboardManager *cm = ClipboardManager::get(); - cm->copySymbol(symbol->getRepr(), style, symbolDocument == currentDocument); + cm->copySymbol(symbol->getRepr(), style, symbol_document == currentDocument); } } @@ -610,29 +622,68 @@ SPDocument* read_vss(Glib::ustring filename, Glib::ustring name ) { void SymbolsDialog::get_symbols() { using namespace Inkscape::IO::Resource; - SPDocument* symbol_doc = NULL; Glib::ustring title; - for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { if(Glib::str_has_suffix(filename, ".svg")) { + title = filename.erase(filename.rfind('.')); + if(title.empty()) { + title = _("Unnamed Symbols"); + } + symbolSets[title]= NULL; + symbolSet->append(title); + } +#ifdef WITH_LIBVISIO + if(Glib::str_has_suffix(filename, ".vss")) { + title = filename.erase(filename.rfind('.')); + if(title.empty()) { + title = _("Unnamed Symbols"); + } + symbolSets[title]= NULL; + symbolSet->append(title); + } +#endif + } +} + +/* Hunts preference directories for symbol files */ +void SymbolsDialog::get_symbols(Glib::ustring title) { + + using namespace Inkscape::IO::Resource; + SPDocument* symbol_doc = NULL; + Glib::ustring new_title; + size_t i = 0; + for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { + if(filename == title + ".svg") { symbol_doc = SPDocument::createNewDoc(filename.c_str(), FALSE); if(symbol_doc) { - title = symbol_doc->getRoot()->title(); - if(title.empty()) { - title = _("Unnamed Symbols"); + new_title = symbol_doc->getRoot()->title(); + if(new_title.empty()) { + new_title = _("Unnamed Symbols"); } } - + } + if(Glib::str_has_suffix(filename, ".svg")) { + i++; } #ifdef WITH_LIBVISIO if(Glib::str_has_suffix(filename, ".vss")) { - Glib::ustring title = filename.erase(filename.rfind('.')); + i++; + } + if(filename == title + ".vss") { symbol_doc = read_vss(filename, title); + if(symbol_doc) { + new_title = symbol_doc->getRoot()->title(); + if(new_title.empty()) { + new_title = _("Unnamed Symbols"); + } + } } #endif if(symbol_doc) { - symbolSets[title]= symbol_doc; - symbolSet->append(title); + symbolSets.erase(title); + symbolSets[new_title]= symbol_doc; + symbolSet->set_active(i); + symbolSet->set_active_text(new_title); } } } @@ -655,11 +706,11 @@ void SymbolsDialog::symbols_in_doc_recursive (SPObject *r, std::vector SymbolsDialog::symbols_in_doc( SPDocument* symbolDocument) +std::vector SymbolsDialog::symbols_in_doc( SPDocument* symbol_document) { std::vector l; - symbols_in_doc_recursive (symbolDocument->getRoot(), l ); + symbols_in_doc_recursive (symbol_document->getRoot(), l ); return l; } @@ -725,22 +776,27 @@ void SymbolsDialog::find_symbols(Gtk::SearchEntry* search, GdkEventKey* evt) { if (evt->keyval != GDK_KEY_Return || title.empty()) { return; } - symbolSet->set_active_text(_("Search")); for(auto const &symbol_document_map : symbolSets) { SPDocument* symbol_document = symbol_document_map.second; + if (!symbol_document) { + get_symbols(symbol_document_map.first); + Glib::ustring symbolSetString = symbolSet->get_active_text(); + symbol_document = symbolSets[symbolSetString]; + } std::vector l = symbols_in_doc( symbol_document); for(auto symbol:l) { gchar const *symbol_title_char = symbol->title(); if (symbol_title_char) { Glib::ustring symbol_title = Glib::ustring(symbol_title_char); auto pos = symbol_title.rfind(title); - if (symbol && pos != std::string::npos) { + if (title == "*" || symbol && pos != std::string::npos) { Glib::ustring doc_title = symbol_document_map.first; // From doc title element add_symbol( symbol, doc_title); } } } } + symbolSet->set_active_text(_("Search")); } void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 1ce826f4b..96c9585f5 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -82,6 +82,7 @@ private: void iconDragDataGet(const Glib::RefPtr& context, Gtk::SelectionData& selection_data, guint info, guint time); void get_symbols(); + void get_symbols(Glib::ustring title); void add_symbols( SPDocument* symbol_document ); void add_symbol( SPObject* symbol, Glib::ustring doc_title); SPDocument* symbols_preview_doc(); -- cgit v1.2.3 From 62a1c37f667a8095a834deef50134af8ec477592 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Thu, 19 Oct 2017 03:25:18 +0200 Subject: Improving speed --- src/ui/dialog/symbols.cpp | 105 ++++++++++++++++++++++++++++------------------ src/ui/dialog/symbols.h | 6 ++- 2 files changed, 69 insertions(+), 42 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 152c1e7e3..d4b460d1d 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -204,7 +204,8 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : search = Gtk::manage(new Gtk::SearchEntry()); // Search search->set_tooltip_text(_("Search trought all symbols. Use * to get all (slow).")); tools->pack_start(* search, Gtk::PACK_SHRINK); - sigc::connection connSetSearch = search->signal_key_press_event().connect_notify(sigc::bind<0>(sigc::mem_fun(*this, &SymbolsDialog::find_symbols), search)); + + search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::find_symbols)); // Pack size (controls display area) pack_size = 2; // Default 32px @@ -273,6 +274,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : ++row; /**********************************************************/ + sensitive = true; currentDesktop = SP_ACTIVE_DESKTOP; currentDocument = currentDesktop->getDocument(); @@ -349,6 +351,9 @@ void SymbolsDialog::zoomout() { void SymbolsDialog::rebuild() { + if (!sensitive) { + return; + } if( fitSymbol->get_active() ) { zoomIn->set_sensitive( false ); zoomOut->set_sensitive( false ); @@ -358,26 +363,22 @@ void SymbolsDialog::rebuild() { } store->clear(); - Glib::ustring symbolSetString = symbolSet->get_active_text(); - - SPDocument* symbol_document = symbolSets[symbolSetString]; + SPDocument* symbol_document = selectedSymbols(); if( !symbol_document ) { - get_symbols(symbolSetString); - symbolSetString = symbolSet->get_active_text(); - symbol_document = symbolSets[symbolSetString]; - // Symbol must be from Current Document (this method of checking should be language independent). - if( !symbol_document ) { // Symbol must be from Current Document (this method of // checking should be language independent). symbol_document = currentDocument; addSymbol->set_sensitive( true ); removeSymbol->set_sensitive( true ); - } } else { addSymbol->set_sensitive( false ); removeSymbol->set_sensitive( false ); } - add_symbols( symbol_document ); + if (symbolSet->get_active_text() == "Search") { + find_symbols_overload(); + } else { + add_symbols( symbol_document ); + } } void SymbolsDialog::insertSymbol() { @@ -435,15 +436,14 @@ void SymbolsDialog::documentReplaced(SPDesktop *desktop, SPDocument *document) SPDocument* SymbolsDialog::selectedSymbols() { /* OK, we know symbol name... now we need to copy it to clipboard, bon chance! */ - Glib::ustring symbolSetString = selectedSymbolDocTitle(); - if (symbolSetString.empty()) { - symbolSetString = symbolSet->get_active_text(); + Glib::ustring doc_title = selectedSymbolDocTitle(); + if (doc_title.empty()) { + doc_title = symbolSet->get_active_text(); } - SPDocument* symbol_document = symbolSets[symbolSetString]; + SPDocument* symbol_document = symbolSets[doc_title]; if( !symbol_document ) { - get_symbols(symbolSetString); - symbolSetString = symbolSet->get_active_text(); - symbol_document = symbolSets[symbolSetString]; + doc_title = get_symbols(doc_title); + symbol_document = symbolSets[doc_title]; // Symbol must be from Current Document (this method of checking should be language independent). if( !symbol_document ) { return currentDocument; @@ -625,6 +625,9 @@ void SymbolsDialog::get_symbols() { Glib::ustring title; for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { if(Glib::str_has_suffix(filename, ".svg")) { + //TODO: find a way to get real title without loading all SPDocument + std::size_t found = filename.find_last_of("/\\"); + filename = filename.substr(found+1); title = filename.erase(filename.rfind('.')); if(title.empty()) { title = _("Unnamed Symbols"); @@ -634,6 +637,8 @@ void SymbolsDialog::get_symbols() { } #ifdef WITH_LIBVISIO if(Glib::str_has_suffix(filename, ".vss")) { + std::size_t found = filename.find_last_of("/\\"); + filename = filename.substr(found+1); title = filename.erase(filename.rfind('.')); if(title.empty()) { title = _("Unnamed Symbols"); @@ -646,14 +651,16 @@ void SymbolsDialog::get_symbols() { } /* Hunts preference directories for symbol files */ -void SymbolsDialog::get_symbols(Glib::ustring title) { +Glib::ustring SymbolsDialog::get_symbols(Glib::ustring title) { using namespace Inkscape::IO::Resource; SPDocument* symbol_doc = NULL; Glib::ustring new_title; size_t i = 0; for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { - if(filename == title + ".svg") { + std::size_t found = filename.find_last_of("/\\"); + Glib::ustring filename_short = filename.substr(found+1); + if(filename_short == title + ".svg") { symbol_doc = SPDocument::createNewDoc(filename.c_str(), FALSE); if(symbol_doc) { new_title = symbol_doc->getRoot()->title(); @@ -666,10 +673,7 @@ void SymbolsDialog::get_symbols(Glib::ustring title) { i++; } #ifdef WITH_LIBVISIO - if(Glib::str_has_suffix(filename, ".vss")) { - i++; - } - if(filename == title + ".vss") { + if(filename_short == title + ".vss") { symbol_doc = read_vss(filename, title); if(symbol_doc) { new_title = symbol_doc->getRoot()->title(); @@ -678,14 +682,23 @@ void SymbolsDialog::get_symbols(Glib::ustring title) { } } } + if(Glib::str_has_suffix(filename, ".vss")) { + i++; + } #endif if(symbol_doc) { - symbolSets.erase(title); + symbolSets.erase(title); symbolSets[new_title]= symbol_doc; + sensitive = false; + symbolSet->remove_text(i); + symbolSet->insert (i, new_title); symbolSet->set_active(i); symbolSet->set_active_text(new_title); + sensitive = true; + break; } } + return new_title; } void SymbolsDialog::symbols_in_doc_recursive (SPObject *r, std::vector &l) @@ -770,33 +783,45 @@ void SymbolsDialog::add_symbols( SPDocument* symbol_document ) { } } -void SymbolsDialog::find_symbols(Gtk::SearchEntry* search, GdkEventKey* evt) { +void SymbolsDialog::find_symbols(GdkEventKey* evt) { + if (evt->keyval != GDK_KEY_Return) { + return; + } + find_symbols_overload(); +} + +void SymbolsDialog::find_symbols_overload() { store->clear(); Glib::ustring title = search->get_text(); - if (evt->keyval != GDK_KEY_Return || title.empty()) { + if (title.empty()) { return; } - for(auto const &symbol_document_map : symbolSets) { + std::map symbolSetsCopy = symbolSets; + for(auto const &symbol_document_map : symbolSetsCopy) { SPDocument* symbol_document = symbol_document_map.second; + Glib::ustring doc_title = symbol_document_map.first; if (!symbol_document) { - get_symbols(symbol_document_map.first); - Glib::ustring symbolSetString = symbolSet->get_active_text(); - symbol_document = symbolSets[symbolSetString]; + doc_title = get_symbols(symbol_document_map.first); + search->set_text(doc_title); + symbol_document = symbolSets[doc_title]; } - std::vector l = symbols_in_doc( symbol_document); - for(auto symbol:l) { - gchar const *symbol_title_char = symbol->title(); - if (symbol_title_char) { - Glib::ustring symbol_title = Glib::ustring(symbol_title_char); - auto pos = symbol_title.rfind(title); - if (title == "*" || symbol && pos != std::string::npos) { - Glib::ustring doc_title = symbol_document_map.first; // From doc title element - add_symbol( symbol, doc_title); + if (symbol_document) { + std::vector l = symbols_in_doc(symbol_document); + for(auto symbol:l) { + gchar const *symbol_title_char = symbol->title(); + if (symbol_title_char) { + Glib::ustring symbol_title = Glib::ustring(symbol_title_char); + auto pos = symbol_title.rfind(title); + if (symbol && (title == "*" || pos != std::string::npos)) { + add_symbol( symbol, doc_title); + } } } } } + search->set_text(title); symbolSet->set_active_text(_("Search")); + symbolSetsCopy.clear(); } void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 96c9585f5..0ae8c4fcc 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -82,7 +82,7 @@ private: void iconDragDataGet(const Glib::RefPtr& context, Gtk::SelectionData& selection_data, guint info, guint time); void get_symbols(); - void get_symbols(Glib::ustring title); + Glib::ustring get_symbols(Glib::ustring title); void add_symbols( SPDocument* symbol_document ); void add_symbol( SPObject* symbol, Glib::ustring doc_title); SPDocument* symbols_preview_doc(); @@ -91,7 +91,8 @@ private: std::vector symbols_in_doc( SPDocument* document); void use_in_doc_recursive(SPObject *r, std::vector &l); std::vector use_in_doc( SPDocument* document); - void find_symbols(Gtk::SearchEntry* search, GdkEventKey* evt); + void find_symbols(GdkEventKey* evt); + void find_symbols_overload(); gchar const* style_from_use( gchar const* id, SPDocument* document); Glib::RefPtr draw_symbol(SPObject *symbol); @@ -107,6 +108,7 @@ private: Glib::RefPtr store; Gtk::ComboBoxText* symbolSet; + bool sensitive; Gtk::SearchEntry* search; Gtk::IconView* iconView; Gtk::Button* addSymbol; -- cgit v1.2.3 From d1b095af84220d7f46123cdd2a2fae1de79d184e Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Thu, 19 Oct 2017 11:15:11 +0200 Subject: Working on current document --- src/ui/dialog/symbols.cpp | 32 +++++++++++++++++++------------- src/ui/dialog/symbols.h | 3 ++- 2 files changed, 21 insertions(+), 14 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index d4b460d1d..ccaacd6a3 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -363,7 +363,7 @@ void SymbolsDialog::rebuild() { } store->clear(); - SPDocument* symbol_document = selectedSymbols(); + SPDocument* symbol_document = selectedSymbols(true); if( !symbol_document ) { // Symbol must be from Current Document (this method of // checking should be language independent). @@ -434,7 +434,7 @@ void SymbolsDialog::documentReplaced(SPDesktop *desktop, SPDocument *document) rebuild(); } -SPDocument* SymbolsDialog::selectedSymbols() { +SPDocument* SymbolsDialog::selectedSymbols(bool ignorecurrent) { /* OK, we know symbol name... now we need to copy it to clipboard, bon chance! */ Glib::ustring doc_title = selectedSymbolDocTitle(); if (doc_title.empty()) { @@ -446,6 +446,9 @@ SPDocument* SymbolsDialog::selectedSymbols() { symbol_document = symbolSets[doc_title]; // Symbol must be from Current Document (this method of checking should be language independent). if( !symbol_document ) { + if (ignorecurrent) { + return NULL; + } return currentDocument; } } @@ -769,16 +772,14 @@ gchar const* SymbolsDialog::style_from_use( gchar const* id, SPDocument* documen } void SymbolsDialog::add_symbols( SPDocument* symbol_document ) { - if (symbol_document) { - std::vector l = symbols_in_doc( symbol_document ); - Glib::ustring doc_title = ""; - if (symbol_document->getRoot()->title()) { - doc_title = symbol_document->getRoot()->title(); - } - for(auto symbol:l) { - if (symbol) { - add_symbol( symbol, doc_title); - } + std::vector l = symbols_in_doc( symbol_document ); + Glib::ustring doc_title = ""; + if (symbol_document->getRoot()->title()) { + doc_title = symbol_document->getRoot()->title(); + } + for(auto symbol:l) { + if (symbol) { + add_symbol( symbol, doc_title); } } } @@ -790,6 +791,12 @@ void SymbolsDialog::find_symbols(GdkEventKey* evt) { find_symbols_overload(); } +void SymbolsDialog::update_search_box(gpointer data) +{ + Glib::ustring doc_title = *reinterpret_cast(data); + search->set_text(doc_title); +} + void SymbolsDialog::find_symbols_overload() { store->clear(); Glib::ustring title = search->get_text(); @@ -802,7 +809,6 @@ void SymbolsDialog::find_symbols_overload() { Glib::ustring doc_title = symbol_document_map.first; if (!symbol_document) { doc_title = get_symbols(symbol_document_map.first); - search->set_text(doc_title); symbol_document = symbolSets[doc_title]; } if (symbol_document) { diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 0ae8c4fcc..585e8f98f 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -75,7 +75,8 @@ private: void defsModified(SPObject *object, guint flags); void selectionChanged(Inkscape::Selection *selection); void documentReplaced(SPDesktop *desktop, SPDocument *document); - SPDocument* selectedSymbols(); + SPDocument* selectedSymbols(bool ignorecurrent = false); + void update_search_box(gpointer data); Glib::ustring selectedSymbolId(); Glib::ustring selectedSymbolDocTitle(); void iconChanged(); -- cgit v1.2.3 From 5b1b6e8cf111c4c7c691f9e87bc52dd3626e29cb Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Thu, 19 Oct 2017 19:43:46 +0200 Subject: Finish speed improvements --- src/ui/dialog/symbols.cpp | 82 ++++++++++++++++++++++++++++------------------- src/ui/dialog/symbols.h | 3 +- 2 files changed, 51 insertions(+), 34 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index ccaacd6a3..00796e096 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -17,14 +17,6 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include #include #include #include @@ -202,7 +194,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : Gtk::Label* spacer = Gtk::manage(new Gtk::Label("")); tools->pack_start(* Gtk::manage(spacer)); search = Gtk::manage(new Gtk::SearchEntry()); // Search - search->set_tooltip_text(_("Search trought all symbols. Use * to get all (slow).")); + search->set_tooltip_text(_("Return to start search. Use * to get all symbols (slow).")); tools->pack_start(* search, Gtk::PACK_SHRINK); search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::find_symbols)); @@ -275,6 +267,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : /**********************************************************/ sensitive = true; + finded = false; currentDesktop = SP_ACTIVE_DESKTOP; currentDocument = currentDesktop->getDocument(); @@ -798,36 +791,57 @@ void SymbolsDialog::update_search_box(gpointer data) } void SymbolsDialog::find_symbols_overload() { - store->clear(); Glib::ustring title = search->get_text(); if (title.empty()) { return; } - std::map symbolSetsCopy = symbolSets; - for(auto const &symbol_document_map : symbolSetsCopy) { - SPDocument* symbol_document = symbol_document_map.second; - Glib::ustring doc_title = symbol_document_map.first; - if (!symbol_document) { - doc_title = get_symbols(symbol_document_map.first); - symbol_document = symbolSets[doc_title]; + if (!finded) { + Gtk::Dialog search_dialog(_("Slow process please read")); + search_dialog.set_border_width(10); + Gtk::Label explanation; + explanation.set_markup(_("First time search is slow, next searchs are fast")); + explanation.set_line_wrap(true); + Gtk::Box *content = search_dialog.get_content_area(); + content->pack_start(explanation, false, false, 5); + Gtk::Button *ko_button = search_dialog.add_button(_("Cancel"), GTK_RESPONSE_CLOSE); + ko_button->grab_focus(); + Gtk::Button *ok_button = search_dialog.add_button(_("Search"), GTK_RESPONSE_ACCEPT); + ok_button->grab_focus(); + ko_button->grab_focus(); + search_dialog.show_all_children(); + int status = search_dialog.run(); + if ( status == GTK_RESPONSE_ACCEPT ) { + finded = true; } - if (symbol_document) { - std::vector l = symbols_in_doc(symbol_document); - for(auto symbol:l) { - gchar const *symbol_title_char = symbol->title(); - if (symbol_title_char) { - Glib::ustring symbol_title = Glib::ustring(symbol_title_char); - auto pos = symbol_title.rfind(title); - if (symbol && (title == "*" || pos != std::string::npos)) { - add_symbol( symbol, doc_title); + } + if (finded) { + store->clear(); + std::map symbolSetsCopy = symbolSets; + for(auto const &symbol_document_map : symbolSetsCopy) { + SPDocument* symbol_document = symbol_document_map.second; + Glib::ustring doc_title = symbol_document_map.first; + if (!symbol_document) { + doc_title = get_symbols(symbol_document_map.first); + symbol_document = symbolSets[doc_title]; + } + if (symbol_document) { + std::vector l = symbols_in_doc(symbol_document); + for(auto symbol:l) { + gchar const *symbol_title_char = symbol->title(); + if (symbol_title_char) { + Glib::ustring symbol_title = Glib::ustring(symbol_title_char); + auto pos = symbol_title.rfind(title); + if (symbol && (title == "*" || pos != std::string::npos)) { + add_symbol( symbol, doc_title); + } } } } } + search->set_text(title); + symbolSet->set_active_text(_("Search")); + symbolSetsCopy.clear(); } - search->set_text(title); - symbolSet->set_active_text(_("Search")); - symbolSetsCopy.clear(); } void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { @@ -839,16 +853,18 @@ void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { if( !title ) { title = id; } - if( doc_title.empty() ) { - return; + Glib::ustring symbol_title = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "Symbol", title) )); + if (doc_title.empty()) { + symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(" [") +_("Current Document") + Glib::ustring("]")); + } else { + symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(" [") + doc_title + Glib::ustring("]")); } - Glib::RefPtr pixbuf = draw_symbol( symbol ); if( pixbuf ) { Gtk::ListStore::iterator row = store->append(); (*row)[columns->symbol_id] = Glib::ustring( id ); - (*row)[columns->symbol_title] = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "Symbol", title) )); + (*row)[columns->symbol_title] = symbol_title; (*row)[columns->symbol_doc_title] = Glib::Markup::escape_text(doc_title); (*row)[columns->symbol_image] = pixbuf; } diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 585e8f98f..9a28da1a0 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -12,13 +12,13 @@ #ifndef INKSCAPE_UI_DIALOG_SYMBOLS_H #define INKSCAPE_UI_DIALOG_SYMBOLS_H +#include #include "display/drawing.h" #include "ui/dialog/desktop-tracker.h" #include "ui/widget/panel.h" #include "sp-symbol.h" #include "sp-use.h" -#include #include class SPObject; @@ -110,6 +110,7 @@ private: Glib::RefPtr store; Gtk::ComboBoxText* symbolSet; bool sensitive; + bool finded; Gtk::SearchEntry* search; Gtk::IconView* iconView; Gtk::Button* addSymbol; -- cgit v1.2.3 From f2149d04cdff6c8278fef20928b1bbee6bcbb06f Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Fri, 20 Oct 2017 05:51:55 +0200 Subject: Add case insensitive and no dialog loading --- src/ui/dialog/symbols.cpp | 91 +++++++++++++++++++---------------------------- src/ui/dialog/symbols.h | 6 ++-- 2 files changed, 39 insertions(+), 58 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 00796e096..a098d64c1 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -197,8 +197,9 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : search->set_tooltip_text(_("Return to start search. Use * to get all symbols (slow).")); tools->pack_start(* search, Gtk::PACK_SHRINK); - search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::find_symbols)); - + search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::prepare_find_symbols)); + search->signal_key_release_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::find_symbols)); + // Pack size (controls display area) pack_size = 2; // Default 32px @@ -267,7 +268,6 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : /**********************************************************/ sensitive = true; - finded = false; currentDesktop = SP_ACTIVE_DESKTOP; currentDocument = currentDesktop->getDocument(); @@ -368,7 +368,7 @@ void SymbolsDialog::rebuild() { removeSymbol->set_sensitive( false ); } if (symbolSet->get_active_text() == "Search") { - find_symbols_overload(); + find_symbols_overloaded(); } else { add_symbols( symbol_document ); } @@ -781,67 +781,48 @@ void SymbolsDialog::find_symbols(GdkEventKey* evt) { if (evt->keyval != GDK_KEY_Return) { return; } - find_symbols_overload(); + find_symbols_overloaded(); } -void SymbolsDialog::update_search_box(gpointer data) -{ - Glib::ustring doc_title = *reinterpret_cast(data); - search->set_text(doc_title); +void SymbolsDialog::prepare_find_symbols(GdkEventKey* evt) { + if (evt->keyval != GDK_KEY_Return) { + return; + } + search_str = search->get_text().lowercase(); + search->set_text(_("Loading...")); + } -void SymbolsDialog::find_symbols_overload() { - Glib::ustring title = search->get_text(); - if (title.empty()) { +void SymbolsDialog::find_symbols_overloaded() { + if (search_str.empty()) { return; } - if (!finded) { - Gtk::Dialog search_dialog(_("Slow process please read")); - search_dialog.set_border_width(10); - Gtk::Label explanation; - explanation.set_markup(_("First time search is slow, next searchs are fast")); - explanation.set_line_wrap(true); - Gtk::Box *content = search_dialog.get_content_area(); - content->pack_start(explanation, false, false, 5); - Gtk::Button *ko_button = search_dialog.add_button(_("Cancel"), GTK_RESPONSE_CLOSE); - ko_button->grab_focus(); - Gtk::Button *ok_button = search_dialog.add_button(_("Search"), GTK_RESPONSE_ACCEPT); - ok_button->grab_focus(); - ko_button->grab_focus(); - search_dialog.show_all_children(); - int status = search_dialog.run(); - if ( status == GTK_RESPONSE_ACCEPT ) { - finded = true; + store->clear(); + std::map symbolSetsCopy = symbolSets; + for(auto const &symbol_document_map : symbolSetsCopy) { + SPDocument* symbol_document = symbol_document_map.second; + Glib::ustring doc_title = symbol_document_map.first; + if (!symbol_document) { + doc_title = get_symbols(symbol_document_map.first); + symbol_document = symbolSets[doc_title]; } - } - if (finded) { - store->clear(); - std::map symbolSetsCopy = symbolSets; - for(auto const &symbol_document_map : symbolSetsCopy) { - SPDocument* symbol_document = symbol_document_map.second; - Glib::ustring doc_title = symbol_document_map.first; - if (!symbol_document) { - doc_title = get_symbols(symbol_document_map.first); - symbol_document = symbolSets[doc_title]; - } - if (symbol_document) { - std::vector l = symbols_in_doc(symbol_document); - for(auto symbol:l) { - gchar const *symbol_title_char = symbol->title(); - if (symbol_title_char) { - Glib::ustring symbol_title = Glib::ustring(symbol_title_char); - auto pos = symbol_title.rfind(title); - if (symbol && (title == "*" || pos != std::string::npos)) { - add_symbol( symbol, doc_title); - } + if (symbol_document) { + std::vector l = symbols_in_doc(symbol_document); + for(auto symbol:l) { + gchar const *symbol_title_char = symbol->title(); + if (symbol_title_char) { + Glib::ustring symbol_title = Glib::ustring(symbol_title_char).lowercase(); + auto pos = symbol_title.rfind(search_str); + if (symbol && (search_str == "*" || pos != std::string::npos)) { + add_symbol( symbol, doc_title); } } } } - search->set_text(title); - symbolSet->set_active_text(_("Search")); - symbolSetsCopy.clear(); } + search->set_text(search_str); + symbolSet->set_active_text(_("Search")); + symbolSetsCopy.clear(); } void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { @@ -855,9 +836,9 @@ void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { } Glib::ustring symbol_title = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "Symbol", title) )); if (doc_title.empty()) { - symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(" [") +_("Current Document") + Glib::ustring("]")); + symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" [") +_("Current Document") + Glib::ustring("]")).c_str()))); } else { - symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(" [") + doc_title + Glib::ustring("]")); + symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" [") + doc_title + Glib::ustring("]")).c_str()))); } Glib::RefPtr pixbuf = draw_symbol( symbol ); diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 9a28da1a0..e2e467cd6 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -76,7 +76,6 @@ private: void selectionChanged(Inkscape::Selection *selection); void documentReplaced(SPDesktop *desktop, SPDocument *document); SPDocument* selectedSymbols(bool ignorecurrent = false); - void update_search_box(gpointer data); Glib::ustring selectedSymbolId(); Glib::ustring selectedSymbolDocTitle(); void iconChanged(); @@ -93,7 +92,8 @@ private: void use_in_doc_recursive(SPObject *r, std::vector &l); std::vector use_in_doc( SPDocument* document); void find_symbols(GdkEventKey* evt); - void find_symbols_overload(); + void prepare_find_symbols(GdkEventKey* evt); + void find_symbols_overloaded(); gchar const* style_from_use( gchar const* id, SPDocument* document); Glib::RefPtr draw_symbol(SPObject *symbol); @@ -110,8 +110,8 @@ private: Glib::RefPtr store; Gtk::ComboBoxText* symbolSet; bool sensitive; - bool finded; Gtk::SearchEntry* search; + Glib::ustring search_str; Gtk::IconView* iconView; Gtk::Button* addSymbol; Gtk::Button* removeSymbol; -- cgit v1.2.3 From f99611197da52e8854719e1bd10d14f1f00d074f Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Fri, 20 Oct 2017 09:53:04 +0200 Subject: Add description search and icon if no results --- src/ui/dialog/symbols.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index a098d64c1..434dcf3b9 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -799,6 +799,8 @@ void SymbolsDialog::find_symbols_overloaded() { } store->clear(); std::map symbolSetsCopy = symbolSets; + bool icons_found = false; + SPDocument* searchdoc; for(auto const &symbol_document_map : symbolSetsCopy) { SPDocument* symbol_document = symbol_document_map.second; Glib::ustring doc_title = symbol_document_map.first; @@ -806,22 +808,42 @@ void SymbolsDialog::find_symbols_overloaded() { doc_title = get_symbols(symbol_document_map.first); symbol_document = symbolSets[doc_title]; } + if (doc_title == "Search") { + searchdoc = symbol_document; + continue; + } if (symbol_document) { std::vector l = symbols_in_doc(symbol_document); for(auto symbol:l) { gchar const *symbol_title_char = symbol->title(); + gchar const *symbol_desc_char = symbol->description(); if (symbol_title_char) { + bool found = false; Glib::ustring symbol_title = Glib::ustring(symbol_title_char).lowercase(); auto pos = symbol_title.rfind(search_str); - if (symbol && (search_str == "*" || pos != std::string::npos)) { + if (pos != std::string::npos) { + found = true; + } + if (!found && symbol_desc_char) { + Glib::ustring symbol_desc = Glib::ustring(symbol_title_char).lowercase(); + auto pos = symbol_desc.rfind(search_str); + if (pos != std::string::npos) { + found = true; + } + } + if (symbol && (search_str == "*" || found)) { add_symbol( symbol, doc_title); + icons_found = true; } } } } } + if (!icons_found) { + add_symbols(searchdoc); + } + symbolSet->set_active_text(_("Search")); search->set_text(search_str); - symbolSet->set_active_text(_("Search")); symbolSetsCopy.clear(); } -- cgit v1.2.3 From cd617235986381ed4de6cba8ba4cf6c74a6cf2d3 Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Fri, 20 Oct 2017 12:58:40 +0200 Subject: Add progress bar to loading, currently not working but all the base code is done. need to look into idle methods --- src/ui/dialog/symbols.cpp | 27 +++++++++++++++++++++------ src/ui/dialog/symbols.h | 8 +++++++- 2 files changed, 28 insertions(+), 7 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 434dcf3b9..77a9b8ca5 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -20,7 +20,7 @@ #include #include #include -#include + #include "path-prefix.h" #include "io/sys.h" #include "io/resource.h" @@ -63,6 +63,7 @@ #include "verbs.h" #include "helper/action.h" +#include namespace Inkscape { namespace UI { @@ -109,7 +110,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : { /******************** Table *************************/ - auto table = new Gtk::Grid(); + table = new Gtk::Grid(); // panel is a cloked Gtk::VBox _getContents()->pack_start(*Gtk::manage(table), Gtk::PACK_EXPAND_WIDGET); @@ -152,13 +153,12 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : sigc::mem_fun(*this, &SymbolsDialog::iconChanged)); instanceConns.push_back(connIconChanged); - Gtk::ScrolledWindow *scroller = new Gtk::ScrolledWindow(); + scroller = new Gtk::ScrolledWindow(); scroller->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); scroller->add(*Gtk::manage(iconView)); scroller->set_hexpand(); scroller->set_vexpand(); table->attach(*Gtk::manage(scroller),0,row,2,1); - ++row; /******************** Tools *******************************/ @@ -266,6 +266,14 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : ++row; + /******************** Progress *******************************/ + progress = new Gtk::HBox(); + progressbar = Gtk::manage(new Gtk::ProgressBar()); + table->attach(*Gtk::manage(progress),0,row, 2, 1); + progress->pack_start(* progressbar, Gtk::PACK_EXPAND_WIDGET); + progress->set_margin_top(5); + ++row; + /**********************************************************/ sensitive = true; currentDesktop = SP_ACTIVE_DESKTOP; @@ -289,7 +297,6 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : sigc::connection documentReplacedConn = currentDesktop->connectDocumentReplaced( sigc::mem_fun(*this, &SymbolsDialog::documentReplaced)); instanceConns.push_back(documentReplacedConn); - get_symbols(); add_symbols( currentDocument ); /* Defaults to current document */ @@ -619,6 +626,7 @@ void SymbolsDialog::get_symbols() { using namespace Inkscape::IO::Resource; Glib::ustring title; + number_docs = 0; for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { if(Glib::str_has_suffix(filename, ".svg")) { //TODO: find a way to get real title without loading all SPDocument @@ -630,6 +638,7 @@ void SymbolsDialog::get_symbols() { } symbolSets[title]= NULL; symbolSet->append(title); + ++number_docs; } #ifdef WITH_LIBVISIO if(Glib::str_has_suffix(filename, ".vss")) { @@ -641,6 +650,7 @@ void SymbolsDialog::get_symbols() { } symbolSets[title]= NULL; symbolSet->append(title); + ++number_docs; } #endif } @@ -788,9 +798,9 @@ void SymbolsDialog::prepare_find_symbols(GdkEventKey* evt) { if (evt->keyval != GDK_KEY_Return) { return; } + progressbar->set_fraction(0.0); search_str = search->get_text().lowercase(); search->set_text(_("Loading...")); - } void SymbolsDialog::find_symbols_overloaded() { @@ -801,7 +811,9 @@ void SymbolsDialog::find_symbols_overloaded() { std::map symbolSetsCopy = symbolSets; bool icons_found = false; SPDocument* searchdoc; + size_t counter = 0; for(auto const &symbol_document_map : symbolSetsCopy) { + ++counter; SPDocument* symbol_document = symbol_document_map.second; Glib::ustring doc_title = symbol_document_map.first; if (!symbol_document) { @@ -813,6 +825,8 @@ void SymbolsDialog::find_symbols_overloaded() { continue; } if (symbol_document) { + progressbar->set_fraction(((100.0/number_docs) * counter)/100.0); + progressbar->set_text(doc_title); std::vector l = symbols_in_doc(symbol_document); for(auto symbol:l) { gchar const *symbol_title_char = symbol->title(); @@ -845,6 +859,7 @@ void SymbolsDialog::find_symbols_overloaded() { symbolSet->set_active_text(_("Search")); search->set_text(search_str); symbolSetsCopy.clear(); + progressbar->set_fraction(1.0); } void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index e2e467cd6..1b7d04acd 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -107,9 +107,13 @@ private: // Scale factor int scale_factor; + bool sensitive; + size_t number_docs; + Glib::RefPtr store; Gtk::ComboBoxText* symbolSet; - bool sensitive; + Gtk::ProgressBar* progressbar; + Gtk::HBox* progress; Gtk::SearchEntry* search; Glib::ustring search_str; Gtk::IconView* iconView; @@ -117,6 +121,8 @@ private: Gtk::Button* removeSymbol; Gtk::Button* zoomIn; Gtk::Button* zoomOut; + Gtk::Grid* table; + Gtk::ScrolledWindow *scroller; Gtk::ToggleButton* fitSymbol; void setTargetDesktop(SPDesktop *desktop); -- cgit v1.2.3 From eda9c670f48804bf43707de3001300496e9cf809 Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Fri, 20 Oct 2017 16:01:49 +0200 Subject: Fiz the MR note note_44059492. Thanks Eduard --- src/ui/dialog/symbols.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 77a9b8ca5..7f2c69ffd 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -839,7 +839,7 @@ void SymbolsDialog::find_symbols_overloaded() { found = true; } if (!found && symbol_desc_char) { - Glib::ustring symbol_desc = Glib::ustring(symbol_title_char).lowercase(); + Glib::ustring symbol_desc = Glib::ustring(symbol_desc_char).lowercase(); auto pos = symbol_desc.rfind(search_str); if (pos != std::string::npos) { found = true; -- cgit v1.2.3 From 4bcc974f13115b19f2b320b98355ef1431e4f9ed Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sat, 21 Oct 2017 00:20:40 +0200 Subject: Progress Bar workinggit add .git add . --- src/ui/dialog/symbols.cpp | 96 +++++++++++++++++++++++++---------------------- src/ui/dialog/symbols.h | 7 +++- 2 files changed, 57 insertions(+), 46 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 7f2c69ffd..eb787387a 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -198,7 +198,6 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : tools->pack_start(* search, Gtk::PACK_SHRINK); search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::prepare_find_symbols)); - search->signal_key_release_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::find_symbols)); // Pack size (controls display area) pack_size = 2; // Default 32px @@ -276,6 +275,8 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : /**********************************************************/ sensitive = true; + processed = false; + search_str = ""; currentDesktop = SP_ACTIVE_DESKTOP; currentDocument = currentDesktop->getDocument(); @@ -303,7 +304,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : sigc::connection desktopChangeConn = deskTrack.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); instanceConns.push_back( desktopChangeConn ); - + Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::parse_documents) ); deskTrack.connect(GTK_WIDGET(gobj())); } @@ -375,7 +376,7 @@ void SymbolsDialog::rebuild() { removeSymbol->set_sensitive( false ); } if (symbolSet->get_active_text() == "Search") { - find_symbols_overloaded(); + find_symbols(); } else { add_symbols( symbol_document ); } @@ -787,68 +788,76 @@ void SymbolsDialog::add_symbols( SPDocument* symbol_document ) { } } -void SymbolsDialog::find_symbols(GdkEventKey* evt) { - if (evt->keyval != GDK_KEY_Return) { - return; - } - find_symbols_overloaded(); -} - void SymbolsDialog::prepare_find_symbols(GdkEventKey* evt) { if (evt->keyval != GDK_KEY_Return) { return; } progressbar->set_fraction(0.0); search_str = search->get_text().lowercase(); - search->set_text(_("Loading...")); + search->set_text(_("Searching...")); + if(processed) { + find_symbols(); + } } -void SymbolsDialog::find_symbols_overloaded() { - if (search_str.empty()) { - return; +bool SymbolsDialog::parse_documents(){ + if (search->get_text() != _("Searching...")) { + return true; } - store->clear(); - std::map symbolSetsCopy = symbolSets; + size_t counter = 0; + for(auto const &symbol_document_map : symbolSets) { + ++counter; + SPDocument* symbol_document = symbol_document_map.second; + if (symbol_document) { + continue; + } + get_symbols(symbol_document_map.first); + progressbar->set_fraction(((100.0/number_docs) * counter)/100.0); + return true; + } + find_symbols(); + processed = true; + progressbar->set_fraction(1.0); + return false; +} + +void SymbolsDialog::find_symbols() { bool icons_found = false; SPDocument* searchdoc; size_t counter = 0; - for(auto const &symbol_document_map : symbolSetsCopy) { + store->clear(); + for(auto const &symbol_document_map : symbolSets) { ++counter; SPDocument* symbol_document = symbol_document_map.second; - Glib::ustring doc_title = symbol_document_map.first; if (!symbol_document) { - doc_title = get_symbols(symbol_document_map.first); - symbol_document = symbolSets[doc_title]; + return; } + Glib::ustring doc_title = symbol_document_map.first; if (doc_title == "Search") { searchdoc = symbol_document; continue; } - if (symbol_document) { - progressbar->set_fraction(((100.0/number_docs) * counter)/100.0); - progressbar->set_text(doc_title); - std::vector l = symbols_in_doc(symbol_document); - for(auto symbol:l) { - gchar const *symbol_title_char = symbol->title(); - gchar const *symbol_desc_char = symbol->description(); - if (symbol_title_char) { - bool found = false; - Glib::ustring symbol_title = Glib::ustring(symbol_title_char).lowercase(); - auto pos = symbol_title.rfind(search_str); + std::vector l = symbols_in_doc(symbol_document); + for(auto symbol:l) { + gchar const *symbol_title_char = symbol->title(); + gchar const *symbol_desc_char = symbol->description(); + if (symbol_title_char) { + bool found = false; + Glib::ustring symbol_title = Glib::ustring(symbol_title_char).lowercase(); + auto pos = symbol_title.rfind(search_str); + if (pos != std::string::npos) { + found = true; + } + if (!found && symbol_desc_char) { + Glib::ustring symbol_desc = Glib::ustring(symbol_desc_char).lowercase(); + auto pos = symbol_desc.rfind(search_str); if (pos != std::string::npos) { found = true; } - if (!found && symbol_desc_char) { - Glib::ustring symbol_desc = Glib::ustring(symbol_desc_char).lowercase(); - auto pos = symbol_desc.rfind(search_str); - if (pos != std::string::npos) { - found = true; - } - } - if (symbol && (search_str == "*" || found)) { - add_symbol( symbol, doc_title); - icons_found = true; - } + } + if (symbol && (search_str == "*" || found)) { + add_symbol( symbol, doc_title); + icons_found = true; } } } @@ -858,8 +867,7 @@ void SymbolsDialog::find_symbols_overloaded() { } symbolSet->set_active_text(_("Search")); search->set_text(search_str); - symbolSetsCopy.clear(); - progressbar->set_fraction(1.0); + dynamic_cast(progress)->hide(); } void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 1b7d04acd..23a81c68c 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -91,9 +91,9 @@ private: std::vector symbols_in_doc( SPDocument* document); void use_in_doc_recursive(SPObject *r, std::vector &l); std::vector use_in_doc( SPDocument* document); - void find_symbols(GdkEventKey* evt); void prepare_find_symbols(GdkEventKey* evt); - void find_symbols_overloaded(); + void find_symbols(); + bool parse_documents(); gchar const* style_from_use( gchar const* id, SPDocument* document); Glib::RefPtr draw_symbol(SPObject *symbol); @@ -108,6 +108,9 @@ private: int scale_factor; bool sensitive; + + bool processed; + size_t number_docs; Glib::RefPtr store; -- cgit v1.2.3 From 3bd9472b2498d5a0a33026260c64d2cac8ad2878 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sat, 21 Oct 2017 02:44:59 +0200 Subject: Fis come things pointed by Eduard in the MR --- src/ui/dialog/symbols.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index eb787387a..5e9a5ae2b 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -355,6 +355,7 @@ void SymbolsDialog::rebuild() { if (!sensitive) { return; } + if( fitSymbol->get_active() ) { zoomIn->set_sensitive( false ); zoomOut->set_sensitive( false ); @@ -789,19 +790,23 @@ void SymbolsDialog::add_symbols( SPDocument* symbol_document ) { } void SymbolsDialog::prepare_find_symbols(GdkEventKey* evt) { - if (evt->keyval != GDK_KEY_Return) { + search_str = search->get_text().lowercase(); + if (evt->keyval != GDK_KEY_Return || search_str.empty()) { return; } progressbar->set_fraction(0.0); - search_str = search->get_text().lowercase(); search->set_text(_("Searching...")); + search->set_sensitive(false); if(processed) { find_symbols(); + } else { + dynamic_cast(progressbar)->set_visible(true); } } bool SymbolsDialog::parse_documents(){ if (search->get_text() != _("Searching...")) { + dynamic_cast(progressbar)->set_visible(false); return true; } size_t counter = 0; @@ -867,7 +872,8 @@ void SymbolsDialog::find_symbols() { } symbolSet->set_active_text(_("Search")); search->set_text(search_str); - dynamic_cast(progress)->hide(); + search->set_sensitive(true); + dynamic_cast(progressbar)->set_visible(false); } void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { @@ -1010,7 +1016,6 @@ SPDocument* SymbolsDialog::symbols_preview_doc() " " " " ""; - return SPDocument::createNewDocFromMem( buffer, strlen(buffer), FALSE ); } -- cgit v1.2.3 From 5d8948b99524245009680f3af3013f15bc8e8086 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sun, 22 Oct 2017 11:21:17 +0200 Subject: Add discarted switch mode, working on global search --- src/ui/dialog/symbols.cpp | 533 ++++++++++++++++++++++++++-------------------- src/ui/dialog/symbols.h | 66 +++--- 2 files changed, 342 insertions(+), 257 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 5e9a5ae2b..56af2256b 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -101,11 +101,11 @@ SymbolColumns* SymbolsDialog::getColumns() SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : UI::Widget::Panel("", prefsPath, SP_VERB_DIALOG_SYMBOLS), store(Gtk::ListStore::create(*getColumns())), - iconView(0), - currentDesktop(0), - deskTrack(), - currentDocument(0), - previewDocument(0), + icon_view(0), + current_desktop(0), + desk_track(), + current_document(0), + preview_document(0), instanceConns() { @@ -119,43 +119,87 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : /******************** Symbol Sets *************************/ Gtk::Label* labelSet = new Gtk::Label(_("Symbol set: ")); table->attach(*Gtk::manage(labelSet),0,row,1,1); - symbolSet = new Gtk::ComboBoxText(); // Fill in later - symbolSet->append(_("Current Document")); - symbolSet->set_active_text(_("Current Document")); - symbolSet->set_hexpand(); - table->attach(*Gtk::manage(symbolSet),1,row,1,1); - sigc::connection connSet = symbolSet->signal_changed().connect( + symbol_set = new Gtk::ComboBoxText(); // Fill in later + symbol_set->append(_("Current Document")); + symbol_set->set_active_text(_("Current Document")); + symbol_set->set_hexpand(); + table->attach(*Gtk::manage(symbol_set),1,row,1,1); + sigc::connection connSet = symbol_set->signal_changed().connect( sigc::mem_fun(*this, &SymbolsDialog::rebuild)); instanceConns.push_back(connSet); ++row; + + Gtk::Separator* separator_sets = new Gtk::Separator(); + separator_sets->set_margin_top(3); + separator_sets->set_margin_bottom(3); + table->attach(*Gtk::manage(separator_sets),0,row,2,1); + + ++row; + /******************** Search *************************/ + + Gtk::Label* label_global = new Gtk::Label(_("Global Search: ")); + table->attach(*Gtk::manage(label_global),0,row,1,1); + Gtk::HBox * global_container = new Gtk::HBox(); + global = new Gtk::Switch(); + global->set_state(false); + global_container->pack_start(* global, Gtk::PACK_SHRINK); + Gtk::Separator* separator_global = new Gtk::Separator(Gtk::ORIENTATION_VERTICAL); + separator_global->set_margin_right(3); + separator_global->set_margin_left(3); + global_container->pack_start(* separator_global, Gtk::PACK_SHRINK); + search = Gtk::manage(new Gtk::SearchEntry()); // Search + search->set_tooltip_text(_("Return to start search.")); + search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::prepareFindSymbols)); + search->signal_search_changed().connect(sigc::mem_fun(*this, &SymbolsDialog::clearSearch)); + global_container->pack_start(* search, Gtk::PACK_EXPAND_WIDGET); + table->attach(*Gtk::manage(global_container),1,row,1,1); + + ++row; + + /******************** Progress *******************************/ + progress = new Gtk::HBox(); + 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(5); + + ++row; + + Gtk::Separator* separator_search = new Gtk::Separator(); + separator_search->set_margin_top(2); + separator_search->set_margin_bottom(3); + table->attach(*Gtk::manage(separator_search),0,row,2,1); + + ++row; + /********************* Icon View **************************/ SymbolColumns* columns = getColumns(); - iconView = new Gtk::IconView(static_cast >(store)); - //iconView->set_text_column( columns->symbol_id ); - iconView->set_tooltip_column( 1 ); - iconView->set_pixbuf_column( columns->symbol_image ); + icon_view = new Gtk::IconView(static_cast >(store)); + //icon_view->set_text_column( columns->symbol_id ); + icon_view->set_tooltip_column( 1 ); + icon_view->set_pixbuf_column( columns->symbol_image ); // Giving the iconview a small minimum size will help users understand // What the dialog does. - iconView->set_size_request( 100, 200 ); + icon_view->set_size_request( 100, 200 ); std::vector< Gtk::TargetEntry > targets; targets.push_back(Gtk::TargetEntry( "application/x-inkscape-paste")); - iconView->enable_model_drag_source (targets, Gdk::BUTTON1_MASK, Gdk::ACTION_COPY); - iconView->signal_drag_data_get().connect( + icon_view->enable_model_drag_source (targets, Gdk::BUTTON1_MASK, Gdk::ACTION_COPY); + icon_view->signal_drag_data_get().connect( sigc::mem_fun(*this, &SymbolsDialog::iconDragDataGet)); sigc::connection connIconChanged; - connIconChanged = iconView->signal_selection_changed().connect( + connIconChanged = icon_view->signal_selection_changed().connect( sigc::mem_fun(*this, &SymbolsDialog::iconChanged)); instanceConns.push_back(connIconChanged); scroller = new Gtk::ScrolledWindow(); scroller->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); - scroller->add(*Gtk::manage(iconView)); + scroller->add(*Gtk::manage(icon_view)); scroller->set_hexpand(); scroller->set_vexpand(); table->attach(*Gtk::manage(scroller),0,row,2,1); @@ -169,35 +213,30 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : scroller->set_hexpand(); table->attach(*Gtk::manage(tools),0,row,2,1); - auto addSymbolImage = Gtk::manage(new Gtk::Image()); - addSymbolImage->set_from_icon_name("symbol-add", Gtk::ICON_SIZE_SMALL_TOOLBAR); + auto add_symbol_image = Gtk::manage(new Gtk::Image()); + add_symbol_image->set_from_icon_name("symbol-add", Gtk::ICON_SIZE_SMALL_TOOLBAR); - addSymbol = Gtk::manage(new Gtk::Button()); - addSymbol->add(*addSymbolImage); - addSymbol->set_tooltip_text(_("Add Symbol from the current document.")); - addSymbol->set_relief( Gtk::RELIEF_NONE ); - addSymbol->set_focus_on_click( false ); - addSymbol->signal_activate().connect(sigc::mem_fun(*this, &SymbolsDialog::insertSymbol)); - tools->pack_start(* addSymbol, Gtk::PACK_SHRINK); + add_symbol = Gtk::manage(new Gtk::Button()); + add_symbol->add(*add_symbol_image); + add_symbol->set_tooltip_text(_("Add Symbol from the current document.")); + add_symbol->set_relief( Gtk::RELIEF_NONE ); + add_symbol->set_focus_on_click( false ); + add_symbol->signal_activate().connect(sigc::mem_fun(*this, &SymbolsDialog::insertSymbol)); + tools->pack_start(* add_symbol, Gtk::PACK_SHRINK); - auto removeSymbolImage = Gtk::manage(new Gtk::Image()); - removeSymbolImage->set_from_icon_name("symbol-remove", Gtk::ICON_SIZE_SMALL_TOOLBAR); + auto remove_symbolImage = Gtk::manage(new Gtk::Image()); + remove_symbolImage->set_from_icon_name("symbol-remove", Gtk::ICON_SIZE_SMALL_TOOLBAR); - removeSymbol = Gtk::manage(new Gtk::Button()); - removeSymbol->add(*removeSymbolImage); - removeSymbol->set_tooltip_text(_("Remove Symbol from the current document.")); - removeSymbol->set_relief( Gtk::RELIEF_NONE ); - removeSymbol->set_focus_on_click( false ); - removeSymbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::revertSymbol)); - tools->pack_start(* removeSymbol, Gtk::PACK_SHRINK); + remove_symbol = Gtk::manage(new Gtk::Button()); + remove_symbol->add(*remove_symbolImage); + remove_symbol->set_tooltip_text(_("Remove Symbol from the current document.")); + remove_symbol->set_relief( Gtk::RELIEF_NONE ); + remove_symbol->set_focus_on_click( false ); + remove_symbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::revertSymbol)); + tools->pack_start(* remove_symbol, Gtk::PACK_SHRINK); Gtk::Label* spacer = Gtk::manage(new Gtk::Label("")); tools->pack_start(* Gtk::manage(spacer)); - search = Gtk::manage(new Gtk::SearchEntry()); // Search - search->set_tooltip_text(_("Return to start search. Use * to get all symbols (slow).")); - tools->pack_start(* search, Gtk::PACK_SHRINK); - - search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::prepare_find_symbols)); // Pack size (controls display area) pack_size = 2; // Default 32px @@ -225,87 +264,79 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : tools->pack_start(* button, Gtk::PACK_SHRINK); // Toggle scale to fit on/off - auto fitSymbolImage = Gtk::manage(new Gtk::Image()); - fitSymbolImage->set_from_icon_name("symbol-fit", Gtk::ICON_SIZE_SMALL_TOOLBAR); - - fitSymbol = Gtk::manage(new Gtk::ToggleButton()); - fitSymbol->add(*fitSymbolImage); - fitSymbol->set_tooltip_text(_("Toggle 'fit' symbols in icon space.")); - fitSymbol->set_relief( Gtk::RELIEF_NONE ); - fitSymbol->set_focus_on_click( false ); - fitSymbol->set_active( true ); - fitSymbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::rebuild)); - tools->pack_start(* fitSymbol, Gtk::PACK_SHRINK); + auto fit_symbolImage = Gtk::manage(new Gtk::Image()); + fit_symbolImage->set_from_icon_name("symbol-fit", Gtk::ICON_SIZE_SMALL_TOOLBAR); + + fit_symbol = Gtk::manage(new Gtk::ToggleButton()); + fit_symbol->add(*fit_symbolImage); + fit_symbol->set_tooltip_text(_("Toggle 'fit' symbols in icon space.")); + fit_symbol->set_relief( Gtk::RELIEF_NONE ); + fit_symbol->set_focus_on_click( false ); + fit_symbol->set_active( true ); + fit_symbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::rebuild)); + tools->pack_start(* fit_symbol, Gtk::PACK_SHRINK); // Render size (scales symbols within display area) scale_factor = 0; // Default 1:1 * pack_size/pack_size default - auto zoomOutImage = Gtk::manage(new Gtk::Image()); - zoomOutImage->set_from_icon_name("symbol-smaller", Gtk::ICON_SIZE_SMALL_TOOLBAR); - - zoomOut = Gtk::manage(new Gtk::Button()); - zoomOut->add(*zoomOutImage); - zoomOut->set_tooltip_text(_("Make symbols smaller by zooming out.")); - zoomOut->set_relief( Gtk::RELIEF_NONE ); - zoomOut->set_focus_on_click( false ); - zoomOut->set_sensitive( false ); - zoomOut->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::zoomout)); - tools->pack_start(* zoomOut, Gtk::PACK_SHRINK); - - auto zoomInImage = Gtk::manage(new Gtk::Image()); - zoomInImage->set_from_icon_name("symbol-bigger", Gtk::ICON_SIZE_SMALL_TOOLBAR); - - zoomIn = Gtk::manage(new Gtk::Button()); - zoomIn->add(*zoomInImage); - zoomIn->set_tooltip_text(_("Make symbols bigger by zooming in.")); - zoomIn->set_relief( Gtk::RELIEF_NONE ); - zoomIn->set_focus_on_click( false ); - zoomIn->set_sensitive( false ); - zoomIn->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::zoomin)); - tools->pack_start(* zoomIn, Gtk::PACK_SHRINK); - - ++row; + auto zoom_outImage = Gtk::manage(new Gtk::Image()); + zoom_outImage->set_from_icon_name("symbol-smaller", Gtk::ICON_SIZE_SMALL_TOOLBAR); + + zoom_out = Gtk::manage(new Gtk::Button()); + zoom_out->add(*zoom_outImage); + zoom_out->set_tooltip_text(_("Make symbols smaller by zooming out.")); + zoom_out->set_relief( Gtk::RELIEF_NONE ); + zoom_out->set_focus_on_click( false ); + zoom_out->set_sensitive( false ); + zoom_out->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::zoomout)); + tools->pack_start(* zoom_out, Gtk::PACK_SHRINK); + + auto zoom_inImage = Gtk::manage(new Gtk::Image()); + zoom_inImage->set_from_icon_name("symbol-bigger", Gtk::ICON_SIZE_SMALL_TOOLBAR); + + zoom_in = Gtk::manage(new Gtk::Button()); + zoom_in->add(*zoom_inImage); + zoom_in->set_tooltip_text(_("Make symbols bigger by zooming in.")); + zoom_in->set_relief( Gtk::RELIEF_NONE ); + zoom_in->set_focus_on_click( false ); + zoom_in->set_sensitive( false ); + zoom_in->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::zoomin)); + tools->pack_start(* zoom_in, Gtk::PACK_SHRINK); - /******************** Progress *******************************/ - progress = new Gtk::HBox(); - progressbar = Gtk::manage(new Gtk::ProgressBar()); - table->attach(*Gtk::manage(progress),0,row, 2, 1); - progress->pack_start(* progressbar, Gtk::PACK_EXPAND_WIDGET); - progress->set_margin_top(5); ++row; /**********************************************************/ sensitive = true; processed = false; search_str = ""; - currentDesktop = SP_ACTIVE_DESKTOP; - currentDocument = currentDesktop->getDocument(); + current_desktop = SP_ACTIVE_DESKTOP; + current_document = current_desktop->getDocument(); - previewDocument = symbols_preview_doc(); /* Template to render symbols in */ - previewDocument->ensureUpToDate(); /* Necessary? */ + preview_document = symbolsPreviewDoc(); /* Template to render symbols in */ + preview_document->ensureUpToDate(); /* Necessary? */ key = SPItem::display_key_new(1); - renderDrawing.setRoot(previewDocument->getRoot()->invoke_show(renderDrawing, key, SP_ITEM_SHOW_DISPLAY )); + renderDrawing.setRoot(preview_document->getRoot()->invoke_show(renderDrawing, key, SP_ITEM_SHOW_DISPLAY )); // This might need to be a global variable so setTargetDesktop can modify it - SPDefs *defs = currentDocument->getDefs(); + SPDefs *defs = current_document->getDefs(); sigc::connection defsModifiedConn = defs->connectModified(sigc::mem_fun(*this, &SymbolsDialog::defsModified)); instanceConns.push_back(defsModifiedConn); - sigc::connection selectionChangedConn = currentDesktop->selection->connectChanged( + sigc::connection selectionChangedConn = current_desktop->selection->connectChanged( sigc::mem_fun(*this, &SymbolsDialog::selectionChanged)); instanceConns.push_back(selectionChangedConn); - sigc::connection documentReplacedConn = currentDesktop->connectDocumentReplaced( + sigc::connection documentReplacedConn = current_desktop->connectDocumentReplaced( sigc::mem_fun(*this, &SymbolsDialog::documentReplaced)); instanceConns.push_back(documentReplacedConn); - get_symbols(); - add_symbols( currentDocument ); /* Defaults to current document */ + getSymbols(); + addSymbols( current_document ); /* Defaults to current document */ sigc::connection desktopChangeConn = - deskTrack.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); + desk_track.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); instanceConns.push_back( desktopChangeConn ); - Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::parse_documents) ); - deskTrack.connect(GTK_WIDGET(gobj())); + Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::parseDocuments) ); + desk_track.connect(GTK_WIDGET(gobj())); } SymbolsDialog::~SymbolsDialog() @@ -314,7 +345,7 @@ SymbolsDialog::~SymbolsDialog() it->disconnect(); } instanceConns.clear(); - deskTrack.disconnect(); + desk_track.disconnect(); } SymbolsDialog& SymbolsDialog::getInstance() @@ -356,12 +387,12 @@ void SymbolsDialog::rebuild() { return; } - if( fitSymbol->get_active() ) { - zoomIn->set_sensitive( false ); - zoomOut->set_sensitive( false ); + if( fit_symbol->get_active() ) { + zoom_in->set_sensitive( false ); + zoom_out->set_sensitive( false ); } else { - zoomIn->set_sensitive( true); - zoomOut->set_sensitive( true ); + zoom_in->set_sensitive( true); + zoom_out->set_sensitive( true ); } store->clear(); @@ -369,35 +400,35 @@ void SymbolsDialog::rebuild() { if( !symbol_document ) { // Symbol must be from Current Document (this method of // checking should be language independent). - symbol_document = currentDocument; - addSymbol->set_sensitive( true ); - removeSymbol->set_sensitive( true ); + symbol_document = current_document; + add_symbol->set_sensitive( true ); + remove_symbol->set_sensitive( true ); } else { - addSymbol->set_sensitive( false ); - removeSymbol->set_sensitive( false ); + add_symbol->set_sensitive( false ); + remove_symbol->set_sensitive( false ); } - if (symbolSet->get_active_text() == "Search") { - find_symbols(); + if (symbol_set->get_active_text() == _("Global Search")) { + findSymbols(); } else { - add_symbols( symbol_document ); + findSymbolsInDoc(symbol_document, last_symbol_set); } } void SymbolsDialog::insertSymbol() { Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_SYMBOL ); - SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) this->currentDesktop) ); + SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) this->current_desktop) ); sp_action_perform (action, NULL); } void SymbolsDialog::revertSymbol() { Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_UNSYMBOL ); - SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) this->currentDesktop ) ); + SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) this->current_desktop ) ); sp_action_perform (action, NULL); } void SymbolsDialog::iconDragDataGet(const Glib::RefPtr& /*context*/, Gtk::SelectionData& data, guint /*info*/, guint /*time*/) { - auto iconArray = iconView->get_selected_items(); + auto iconArray = icon_view->get_selected_items(); if( iconArray.empty() ) { //std::cout << " iconArray empty: huh? " << std::endl; @@ -414,7 +445,7 @@ void SymbolsDialog::iconDragDataGet(const Glib::RefPtr& /*cont void SymbolsDialog::defsModified(SPObject * /*object*/, guint /*flags*/) { - if ( !symbolSets[symbolSet->get_active_text()] ) { + if ( !symbol_sets[symbol_set->get_active_text()] ) { rebuild(); } } @@ -425,14 +456,14 @@ void SymbolsDialog::selectionChanged(Inkscape::Selection *selection) { SPObject* symbol = symbol_document->getObjectById(symbol_id); if(symbol && !selection->includes(symbol)) { - iconView->unselect_all(); + icon_view->unselect_all(); } } void SymbolsDialog::documentReplaced(SPDesktop *desktop, SPDocument *document) { - currentDesktop = desktop; - currentDocument = document; + current_desktop = desktop; + current_document = document; rebuild(); } @@ -440,18 +471,17 @@ SPDocument* SymbolsDialog::selectedSymbols(bool ignorecurrent) { /* OK, we know symbol name... now we need to copy it to clipboard, bon chance! */ Glib::ustring doc_title = selectedSymbolDocTitle(); if (doc_title.empty()) { - doc_title = symbolSet->get_active_text(); + doc_title = symbol_set->get_active_text(); } - SPDocument* symbol_document = symbolSets[doc_title]; + SPDocument* symbol_document = symbol_sets[doc_title]; if( !symbol_document ) { - doc_title = get_symbols(doc_title); - symbol_document = symbolSets[doc_title]; + symbol_document = getSymbols(doc_title).second; // Symbol must be from Current Document (this method of checking should be language independent). if( !symbol_document ) { if (ignorecurrent) { return NULL; } - return currentDocument; + return current_document; } } return symbol_document; @@ -459,7 +489,7 @@ SPDocument* SymbolsDialog::selectedSymbols(bool ignorecurrent) { Glib::ustring SymbolsDialog::selectedSymbolId() { - auto iconArray = iconView->get_selected_items(); + auto iconArray = icon_view->get_selected_items(); if( !iconArray.empty() ) { Gtk::TreeModel::Path const & path = *iconArray.begin(); @@ -471,7 +501,7 @@ Glib::ustring SymbolsDialog::selectedSymbolId() { Glib::ustring SymbolsDialog::selectedSymbolDocTitle() { - auto iconArray = iconView->get_selected_items(); + auto iconArray = icon_view->get_selected_items(); if( !iconArray.empty() ) { Gtk::TreeModel::Path const & path = *iconArray.begin(); @@ -493,15 +523,15 @@ void SymbolsDialog::iconChanged() { gchar const* style = symbol->getAttribute("inkscape:symbol-style"); if( !style ) { // If no default style in , look in documents. - if( symbol_document == currentDocument ) { - style = style_from_use( symbol_id.c_str(), currentDocument ); + if( symbol_document == current_document ) { + style = styleFromUse( symbol_id.c_str(), current_document ); } else { style = symbol_document->getReprRoot()->attribute("style"); } } ClipboardManager *cm = ClipboardManager::get(); - cm->copySymbol(symbol->getRepr(), style, symbol_document == currentDocument); + cm->copySymbol(symbol->getRepr(), style, symbol_document == current_document); } } @@ -624,7 +654,7 @@ SPDocument* read_vss(Glib::ustring filename, Glib::ustring name ) { #endif /* Hunts preference directories for symbol files */ -void SymbolsDialog::get_symbols() { +void SymbolsDialog::getSymbols() { using namespace Inkscape::IO::Resource; Glib::ustring title; @@ -638,8 +668,8 @@ void SymbolsDialog::get_symbols() { if(title.empty()) { title = _("Unnamed Symbols"); } - symbolSets[title]= NULL; - symbolSet->append(title); + symbol_sets[title]= NULL; + symbol_set->append(title); ++number_docs; } #ifdef WITH_LIBVISIO @@ -650,8 +680,8 @@ void SymbolsDialog::get_symbols() { if(title.empty()) { title = _("Unnamed Symbols"); } - symbolSets[title]= NULL; - symbolSet->append(title); + symbol_sets[title]= NULL; + symbol_set->append(title); ++number_docs; } #endif @@ -659,8 +689,9 @@ void SymbolsDialog::get_symbols() { } /* Hunts preference directories for symbol files */ -Glib::ustring SymbolsDialog::get_symbols(Glib::ustring title) { - +std::pair +SymbolsDialog::getSymbols(Glib::ustring title) +{ using namespace Inkscape::IO::Resource; SPDocument* symbol_doc = NULL; Glib::ustring new_title; @@ -695,21 +726,21 @@ Glib::ustring SymbolsDialog::get_symbols(Glib::ustring title) { } #endif if(symbol_doc) { - symbolSets.erase(title); - symbolSets[new_title]= symbol_doc; + symbol_sets.erase(title); + symbol_sets[new_title]= symbol_doc; sensitive = false; - symbolSet->remove_text(i); - symbolSet->insert (i, new_title); - symbolSet->set_active(i); - symbolSet->set_active_text(new_title); + symbol_set->remove_text(i); + symbol_set->insert (i, new_title); + symbol_set->set_active(i); + symbol_set->set_active_text(new_title); sensitive = true; break; } } - return new_title; + return std::make_pair(new_title, symbol_doc); } -void SymbolsDialog::symbols_in_doc_recursive (SPObject *r, std::vector &l) +void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::vector &l) { if(!r) return; @@ -723,19 +754,19 @@ void SymbolsDialog::symbols_in_doc_recursive (SPObject *r, std::vectorchildren) { - symbols_in_doc_recursive( &child, l ); + symbolsInDocRecursive( &child, l ); } } -std::vector SymbolsDialog::symbols_in_doc( SPDocument* symbol_document) +std::vector SymbolsDialog::symbolsInDoc( SPDocument* symbol_document) { std::vector l; - symbols_in_doc_recursive (symbol_document->getRoot(), l ); + symbolsInDocRecursive (symbol_document->getRoot(), l ); return l; } -void SymbolsDialog::use_in_doc_recursive (SPObject *r, std::vector &l) +void SymbolsDialog::useInDoc (SPObject *r, std::vector &l) { if ( dynamic_cast(r) ) { @@ -743,22 +774,22 @@ void SymbolsDialog::use_in_doc_recursive (SPObject *r, std::vector &l) } for (auto& child: r->children) { - use_in_doc_recursive( &child, l ); + useInDoc( &child, l ); } } -std::vector SymbolsDialog::use_in_doc( SPDocument* useDocument) { +std::vector SymbolsDialog::useInDoc( SPDocument* useDocument) { std::vector l; - use_in_doc_recursive (useDocument->getRoot(), l); + useInDoc (useDocument->getRoot(), l); return l; } // Returns style from first element found that references id. // This is a last ditch effort to find a style. -gchar const* SymbolsDialog::style_from_use( gchar const* id, SPDocument* document) { +gchar const* SymbolsDialog::styleFromUse( gchar const* id, SPDocument* document) { gchar const* style = 0; - std::vector l = use_in_doc( document ); + std::vector l = useInDoc( document ); for( auto use:l ) { if ( use ) { gchar const *href = use->getRepr()->attribute("xlink:href"); @@ -776,107 +807,157 @@ gchar const* SymbolsDialog::style_from_use( gchar const* id, SPDocument* documen return style; } -void SymbolsDialog::add_symbols( SPDocument* symbol_document ) { - std::vector l = symbols_in_doc( symbol_document ); +void SymbolsDialog::addSymbols( SPDocument* symbol_document ) { + std::vector l = symbolsInDoc( symbol_document ); Glib::ustring doc_title = ""; if (symbol_document->getRoot()->title()) { doc_title = symbol_document->getRoot()->title(); } for(auto symbol:l) { if (symbol) { - add_symbol( symbol, doc_title); + addSymbol( symbol, doc_title); } } } -void SymbolsDialog::prepare_find_symbols(GdkEventKey* evt) { +void SymbolsDialog::clearSearch() +{ + search_str = search->get_text(); + if(search_str.empty()) { + store->clear(); + findSymbolsInDoc(symbol_sets[last_symbol_set], last_symbol_set); + symbol_set->set_active_text(last_symbol_set); + } +} + +void SymbolsDialog::prepareFindSymbols(GdkEventKey* evt) +{ search_str = search->get_text().lowercase(); - if (evt->keyval != GDK_KEY_Return || search_str.empty()) { + if (evt->keyval != GDK_KEY_Return) { return; } - progressbar->set_fraction(0.0); + progress_bar->set_fraction(0.0); search->set_text(_("Searching...")); search->set_sensitive(false); - if(processed) { - find_symbols(); + global->set_sensitive(false); + if(!global->get_active()) { + bool icons_found = false; + Glib::ustring doc_title = symbol_set->get_active_text(); + if (!doc_title.empty()) { + SPDocument* symbol_document = symbol_sets[doc_title]; + if(symbol_document) { + store->clear(); + icons_found = findSymbolsInDoc(symbol_document, doc_title); + } + } + if (!icons_found) { + for(auto const &symbol_document_map : symbol_sets) { + SPDocument* symbol_document = symbol_document_map.second; + Glib::ustring doc_title = symbol_document_map.first; + //Cover the two cases if search document is procesed or not (title based or filename based) + if (doc_title.lowercase() == "search") { + if(!symbol_document) { + symbol_document = getSymbols(symbol_document_map.first).second; + } + addSymbols(symbol_document); + break; + } + } + } + search->set_text(search_str); + search->set_sensitive(true); + global->set_sensitive(true); + dynamic_cast(progress_bar)->set_visible(false); + } else if(processed) { + findSymbols(); } else { - dynamic_cast(progressbar)->set_visible(true); + dynamic_cast(progress_bar)->set_visible(true); } } -bool SymbolsDialog::parse_documents(){ - if (search->get_text() != _("Searching...")) { - dynamic_cast(progressbar)->set_visible(false); +bool SymbolsDialog::parseDocuments(){ + if (search->get_text() != _("Searching...") || !global->get_active()) { + dynamic_cast(progress_bar)->set_visible(false); return true; } size_t counter = 0; - for(auto const &symbol_document_map : symbolSets) { + for(auto const &symbol_document_map : symbol_sets) { ++counter; SPDocument* symbol_document = symbol_document_map.second; if (symbol_document) { continue; } - get_symbols(symbol_document_map.first); - progressbar->set_fraction(((100.0/number_docs) * counter)/100.0); + getSymbols(symbol_document_map.first); + progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); return true; } - find_symbols(); + findSymbols(); processed = true; - progressbar->set_fraction(1.0); + progress_bar->set_fraction(1.0); return false; } -void SymbolsDialog::find_symbols() { +bool SymbolsDialog::findSymbolsInDoc(SPDocument* symbol_document, Glib::ustring doc_title) { + bool icons_found = false; + std::vector l = symbolsInDoc(symbol_document); + last_symbol_set = doc_title; + for(auto symbol:l) { + gchar const *symbol_title_char = symbol->title(); + gchar const *symbol_desc_char = symbol->description(); + if (symbol_title_char) { + bool found = false; + Glib::ustring symbol_title = Glib::ustring(symbol_title_char).lowercase(); + auto pos = symbol_title.rfind(search_str); + if (pos != std::string::npos) { + found = true; + } + if (!found && symbol_desc_char) { + Glib::ustring symbol_desc = Glib::ustring(symbol_desc_char).lowercase(); + auto pos = symbol_desc.rfind(search_str); + if (pos != std::string::npos) { + found = true; + } + } + if (symbol && (search_str.empty() || found)) { + addSymbol( symbol, doc_title); + icons_found = true; + } + } + } + return icons_found; +} + +void SymbolsDialog::findSymbols() { bool icons_found = false; SPDocument* searchdoc; - size_t counter = 0; store->clear(); - for(auto const &symbol_document_map : symbolSets) { - ++counter; + for(auto const &symbol_document_map : symbol_sets) { SPDocument* symbol_document = symbol_document_map.second; if (!symbol_document) { - return; + continue; } Glib::ustring doc_title = symbol_document_map.first; if (doc_title == "Search") { searchdoc = symbol_document; continue; } - std::vector l = symbols_in_doc(symbol_document); - for(auto symbol:l) { - gchar const *symbol_title_char = symbol->title(); - gchar const *symbol_desc_char = symbol->description(); - if (symbol_title_char) { - bool found = false; - Glib::ustring symbol_title = Glib::ustring(symbol_title_char).lowercase(); - auto pos = symbol_title.rfind(search_str); - if (pos != std::string::npos) { - found = true; - } - if (!found && symbol_desc_char) { - Glib::ustring symbol_desc = Glib::ustring(symbol_desc_char).lowercase(); - auto pos = symbol_desc.rfind(search_str); - if (pos != std::string::npos) { - found = true; - } - } - if (symbol && (search_str == "*" || found)) { - add_symbol( symbol, doc_title); - icons_found = true; - } - } + if(findSymbolsInDoc(symbol_document, doc_title) && !icons_found) { + icons_found = true; } } if (!icons_found) { - add_symbols(searchdoc); + addSymbols(searchdoc); + } + if (global->get_active()) { + symbol_set->set_active_text(_("Global Search")); } - symbolSet->set_active_text(_("Search")); search->set_text(search_str); search->set_sensitive(true); - dynamic_cast(progressbar)->set_visible(false); + global->set_sensitive(true); + dynamic_cast(progress_bar)->set_visible(false); } -void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { +void SymbolsDialog::addSymbol( SPObject* symbol, Glib::ustring doc_title) { SymbolColumns* columns = getColumns(); @@ -887,11 +968,11 @@ void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { } Glib::ustring symbol_title = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "Symbol", title) )); if (doc_title.empty()) { - symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" [") +_("Current Document") + Glib::ustring("]")).c_str()))); + symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" (") +_("Current Document") + Glib::ustring(")")).c_str()))); } else { - symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" [") + doc_title + Glib::ustring("]")).c_str()))); + symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" (") + doc_title + Glib::ustring(")")).c_str()))); } - Glib::RefPtr pixbuf = draw_symbol( symbol ); + Glib::RefPtr pixbuf = drawSymbol( symbol ); if( pixbuf ) { Gtk::ListStore::iterator row = store->append(); @@ -914,16 +995,16 @@ void SymbolsDialog::add_symbol( SPObject* symbol, Glib::ustring doc_title) { * the temporary document is rendered. */ Glib::RefPtr -SymbolsDialog::draw_symbol(SPObject *symbol) +SymbolsDialog::drawSymbol(SPObject *symbol) { // Create a copy repr of the symbol with id="the_symbol" - Inkscape::XML::Document *xml_doc = previewDocument->getReprDoc(); + Inkscape::XML::Document *xml_doc = preview_document->getReprDoc(); Inkscape::XML::Node *repr = symbol->getRepr()->duplicate(xml_doc); repr->setAttribute("id", "the_symbol"); - // Replace old "the_symbol" in previewDocument by new. - Inkscape::XML::Node *root = previewDocument->getReprRoot(); - SPObject *symbol_old = previewDocument->getObjectById("the_symbol"); + // Replace old "the_symbol" in preview_document by new. + Inkscape::XML::Node *root = preview_document->getReprRoot(); + SPObject *symbol_old = preview_document->getObjectById("the_symbol"); if (symbol_old) { symbol_old->deleteObject(false); } @@ -932,9 +1013,9 @@ SymbolsDialog::draw_symbol(SPObject *symbol) gchar const* style = repr->attribute("inkscape:symbol-style"); if( !style ) { // If no default style in , look in documents. - if( symbol->document == currentDocument ) { + if( symbol->document == current_document ) { gchar const *id = symbol->getRepr()->attribute("id"); - style = style_from_use( id, symbol->document ); + style = styleFromUse( id, symbol->document ); } else { style = symbol->document->getReprRoot()->attribute("style"); } @@ -951,19 +1032,19 @@ SymbolsDialog::draw_symbol(SPObject *symbol) //defsrepr->appendChild(repr); Inkscape::GC::release(repr); - // Uncomment this to get the previewDocument documents saved (useful for debugging) + // Uncomment this to get the preview_document documents saved (useful for debugging) // FILE *fp = fopen (g_strconcat(id, ".svg", NULL), "w"); - // sp_repr_save_stream(previewDocument->getReprDoc(), fp); + // sp_repr_save_stream(preview_document->getReprDoc(), fp); // fclose (fp); - // Make sure previewDocument is up-to-date. - previewDocument->getRoot()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); - previewDocument->ensureUpToDate(); + // Make sure preview_document is up-to-date. + preview_document->getRoot()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); + preview_document->ensureUpToDate(); - // Make sure we have symbol in previewDocument - SPObject *object_temp = previewDocument->getObjectById( "the_use" ); - previewDocument->getRoot()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); - previewDocument->ensureUpToDate(); + // Make sure we have symbol in preview_document + SPObject *object_temp = preview_document->getObjectById( "the_use" ); + preview_document->getRoot()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); + preview_document->ensureUpToDate(); SPItem *item = dynamic_cast(object_temp); g_assert(item != NULL); @@ -987,7 +1068,7 @@ SymbolsDialog::draw_symbol(SPObject *symbol) if( width == 0.0 ) width = 1.0; if( height == 0.0 ) height = 1.0; - if( fitSymbol->get_active() ) + if( fit_symbol->get_active() ) scale = psize / std::max(width, height); else scale = pow( 2.0, scale_factor/2.0 ) * psize / 32.0; @@ -1003,7 +1084,7 @@ SymbolsDialog::draw_symbol(SPObject *symbol) * Symbols are by default not rendered so a element is * provided. */ -SPDocument* SymbolsDialog::symbols_preview_doc() +SPDocument* SymbolsDialog::symbolsPreviewDoc() { // BUG: must be inside gchar const *buffer = @@ -1021,9 +1102,9 @@ SPDocument* SymbolsDialog::symbols_preview_doc() void SymbolsDialog::setTargetDesktop(SPDesktop *desktop) { - if (this->currentDesktop != desktop) { - this->currentDesktop = desktop; - if( !symbolSets[symbolSet->get_active_text()] ) { + if (this->current_desktop != desktop) { + this->current_desktop = desktop; + if( !symbol_sets[symbol_set->get_active_text()] ) { // Symbol set is from Current document, update rebuild(); } diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 23a81c68c..54a42ec71 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -6,6 +6,7 @@ * * Copyright (C) 2012 Tavmjong Bah * 2013 Martin Owens + * 2017 Jabiertxo Arraiza * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -81,29 +82,31 @@ private: void iconChanged(); void iconDragDataGet(const Glib::RefPtr& context, Gtk::SelectionData& selection_data, guint info, guint time); - void get_symbols(); - Glib::ustring get_symbols(Glib::ustring title); - void add_symbols( SPDocument* symbol_document ); - void add_symbol( SPObject* symbol, Glib::ustring doc_title); - SPDocument* symbols_preview_doc(); - - void symbols_in_doc_recursive(SPObject *r, std::vector &l); - std::vector symbols_in_doc( SPDocument* document); - void use_in_doc_recursive(SPObject *r, std::vector &l); - std::vector use_in_doc( SPDocument* document); - void prepare_find_symbols(GdkEventKey* evt); - void find_symbols(); - bool parse_documents(); - gchar const* style_from_use( gchar const* id, SPDocument* document); - - Glib::RefPtr draw_symbol(SPObject *symbol); + void getSymbols(); + std::pair getSymbols(Glib::ustring title); + void addSymbols( SPDocument* symbol_document ); + void addSymbol( SPObject* symbol, Glib::ustring doc_title); + SPDocument* symbolsPreviewDoc(); + + void symbolsInDocRecursive(SPObject *r, std::vector &l); + std::vector symbolsInDoc( SPDocument* document); + void useInDoc(SPObject *r, std::vector &l); + std::vector useInDoc( SPDocument* document); + void prepareFindSymbols(GdkEventKey* evt); + void findSymbols(); + void clearSearch(); + bool findSymbolsInDoc(SPDocument* document, Glib::ustring doc_title); + bool parseDocuments(); + gchar const* styleFromUse( gchar const* id, SPDocument* document); + + Glib::RefPtr drawSymbol(SPObject *symbol); /* Keep track of all symbol template documents */ - std::map symbolSets; + std::map symbol_sets; // Index into sizes which is selected int pack_size; - + // Scale factor int scale_factor; @@ -112,27 +115,28 @@ private: bool processed; size_t number_docs; - + Glib::ustring last_symbol_set; Glib::RefPtr store; - Gtk::ComboBoxText* symbolSet; - Gtk::ProgressBar* progressbar; + Gtk::ComboBoxText* symbol_set; + Gtk::ProgressBar* progress_bar; Gtk::HBox* progress; Gtk::SearchEntry* search; Glib::ustring search_str; - Gtk::IconView* iconView; - Gtk::Button* addSymbol; - Gtk::Button* removeSymbol; - Gtk::Button* zoomIn; - Gtk::Button* zoomOut; + Gtk::IconView* icon_view; + Gtk::Button* add_symbol; + Gtk::Button* remove_symbol; + Gtk::Button* zoom_in; + Gtk::Button* zoom_out; Gtk::Grid* table; + Gtk::Switch * global; Gtk::ScrolledWindow *scroller; - Gtk::ToggleButton* fitSymbol; + Gtk::ToggleButton* fit_symbol; void setTargetDesktop(SPDesktop *desktop); - SPDesktop* currentDesktop; - DesktopTracker deskTrack; - SPDocument* currentDocument; - SPDocument* previewDocument; /* Document to render single symbol */ + SPDesktop* current_desktop; + DesktopTracker desk_track; + SPDocument* current_document; + SPDocument* preview_document; /* Document to render single symbol */ /* For rendering the template drawing */ unsigned key; -- cgit v1.2.3 From 9ff0e67294c5bf435c76fe74ec39c13adeb10d86 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sun, 22 Oct 2017 19:17:34 +0200 Subject: Added some improvements discused in MR --- src/ui/dialog/symbols.cpp | 267 ++++++++++++++++++++++------------------------ src/ui/dialog/symbols.h | 24 ++--- 2 files changed, 141 insertions(+), 150 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 56af2256b..6c7fa6bef 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -111,7 +111,9 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : /******************** Table *************************/ table = new Gtk::Grid(); - + table->set_margin_left(3); + table->set_margin_right(3); + table->set_margin_top(4); // panel is a cloked Gtk::VBox _getContents()->pack_start(*Gtk::manage(table), Gtk::PACK_EXPAND_WIDGET); guint row = 0; @@ -121,6 +123,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : table->attach(*Gtk::manage(labelSet),0,row,1,1); symbol_set = new Gtk::ComboBoxText(); // Fill in later symbol_set->append(_("Current Document")); + symbol_set->append(_("Search all sets")); symbol_set->set_active_text(_("Current Document")); symbol_set->set_hexpand(); table->attach(*Gtk::manage(symbol_set),1,row,1,1); @@ -130,49 +133,29 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : ++row; - Gtk::Separator* separator_sets = new Gtk::Separator(); - separator_sets->set_margin_top(3); - separator_sets->set_margin_bottom(3); - table->attach(*Gtk::manage(separator_sets),0,row,2,1); - - ++row; - /******************** Search *************************/ - - Gtk::Label* label_global = new Gtk::Label(_("Global Search: ")); - table->attach(*Gtk::manage(label_global),0,row,1,1); - Gtk::HBox * global_container = new Gtk::HBox(); - global = new Gtk::Switch(); - global->set_state(false); - global_container->pack_start(* global, Gtk::PACK_SHRINK); - Gtk::Separator* separator_global = new Gtk::Separator(Gtk::ORIENTATION_VERTICAL); - separator_global->set_margin_right(3); - separator_global->set_margin_left(3); - global_container->pack_start(* separator_global, Gtk::PACK_SHRINK); - search = Gtk::manage(new Gtk::SearchEntry()); // Search - search->set_tooltip_text(_("Return to start search.")); - search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::prepareFindSymbols)); - search->signal_search_changed().connect(sigc::mem_fun(*this, &SymbolsDialog::clearSearch)); - global_container->pack_start(* search, Gtk::PACK_EXPAND_WIDGET); - table->attach(*Gtk::manage(global_container),1,row,1,1); - - ++row; - /******************** Progress *******************************/ progress = new Gtk::HBox(); 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(5); + progress->set_margin_top(8); + progress->set_margin_bottom(8); ++row; - Gtk::Separator* separator_search = new Gtk::Separator(); - separator_search->set_margin_top(2); - separator_search->set_margin_bottom(3); - table->attach(*Gtk::manage(separator_search),0,row,2,1); + /******************** Search *************************/ + - ++row; + search = Gtk::manage(new Gtk::SearchEntry()); // Search + search->set_tooltip_text(_("Return to start search.")); + search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::beforeAddSymbols)); + search->set_margin_left(10); + search->set_margin_right(10); + search->signal_search_changed().connect(sigc::mem_fun(*this, &SymbolsDialog::clearSearch)); + table->attach(*Gtk::manage(search),0,row,2,1); + ++row; + /********************* Icon View **************************/ SymbolColumns* columns = getColumns(); @@ -329,13 +312,12 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : sigc::connection documentReplacedConn = current_desktop->connectDocumentReplaced( sigc::mem_fun(*this, &SymbolsDialog::documentReplaced)); instanceConns.push_back(documentReplacedConn); - getSymbols(); - addSymbols( current_document ); /* Defaults to current document */ + getSymbolsFilename(); + addSymbolsInDoc(current_document); /* Defaults to current document */ sigc::connection desktopChangeConn = desk_track.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); instanceConns.push_back( desktopChangeConn ); - Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::parseDocuments) ); desk_track.connect(GTK_WIDGET(gobj())); } @@ -407,10 +389,14 @@ void SymbolsDialog::rebuild() { add_symbol->set_sensitive( false ); remove_symbol->set_sensitive( false ); } - if (symbol_set->get_active_text() == _("Global Search")) { - findSymbols(); + if (symbol_set->get_active_text() == _("Search all sets")) { + store->clear(); + if (search_str != "" && processed) { + addSymbols(); + } } else { - findSymbolsInDoc(symbol_document, last_symbol_set); + search->set_text(""); + addSymbolsInDoc(symbol_document); } } @@ -475,7 +461,7 @@ SPDocument* SymbolsDialog::selectedSymbols(bool ignorecurrent) { } SPDocument* symbol_document = symbol_sets[doc_title]; if( !symbol_document ) { - symbol_document = getSymbols(doc_title).second; + symbol_document = getSymbolsSet(doc_title).second; // Symbol must be from Current Document (this method of checking should be language independent). if( !symbol_document ) { if (ignorecurrent) { @@ -511,6 +497,18 @@ Glib::ustring SymbolsDialog::selectedSymbolDocTitle() { return Glib::ustring(""); } +Glib::ustring SymbolsDialog::documentTitle(SPDocument* symbol_doc) { + Glib::ustring title = ""; + if (symbol_doc) { + SPRoot * root = symbol_doc->getRoot(); + if (root->title()) { + title = Glib::ustring(root->title()); + } + return title; + } + return title; +} + void SymbolsDialog::iconChanged() { Glib::ustring symbol_id = selectedSymbolId(); @@ -654,7 +652,7 @@ SPDocument* read_vss(Glib::ustring filename, Glib::ustring name ) { #endif /* Hunts preference directories for symbol files */ -void SymbolsDialog::getSymbols() { +void SymbolsDialog::getSymbolsFilename() { using namespace Inkscape::IO::Resource; Glib::ustring title; @@ -690,52 +688,57 @@ void SymbolsDialog::getSymbols() { /* Hunts preference directories for symbol files */ std::pair -SymbolsDialog::getSymbols(Glib::ustring title) +SymbolsDialog::getSymbolsSet(Glib::ustring title) { + if (symbol_sets[title]) { + return std::make_pair(title, symbol_sets[title]); + } using namespace Inkscape::IO::Resource; SPDocument* symbol_doc = NULL; Glib::ustring new_title; size_t i = 0; for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { - std::size_t found = filename.find_last_of("/\\"); - Glib::ustring filename_short = filename.substr(found+1); - if(filename_short == title + ".svg") { - symbol_doc = SPDocument::createNewDoc(filename.c_str(), FALSE); - if(symbol_doc) { - new_title = symbol_doc->getRoot()->title(); - if(new_title.empty()) { - new_title = _("Unnamed Symbols"); - } - } - } - if(Glib::str_has_suffix(filename, ".svg")) { - i++; - } + std::size_t pos = filename.find_last_of("/\\"); + if (pos != std::string::npos) { + Glib::ustring filename_short = filename.substr(pos+1); + if(filename_short == title + ".svg") { + symbol_doc = SPDocument::createNewDoc(filename.c_str(), FALSE); + if(symbol_doc) { + new_title = symbol_doc->getRoot()->title(); + if(new_title.empty()) { + new_title = _("Unnamed Symbols"); + } + } + } + if(Glib::str_has_suffix(filename, ".svg")) { + i++; + } #ifdef WITH_LIBVISIO - if(filename_short == title + ".vss") { - symbol_doc = read_vss(filename, title); - if(symbol_doc) { - new_title = symbol_doc->getRoot()->title(); - if(new_title.empty()) { - new_title = _("Unnamed Symbols"); - } - } - } - if(Glib::str_has_suffix(filename, ".vss")) { - i++; - } + if(filename_short == title + ".vss") { + symbol_doc = read_vss(filename, title); + if(symbol_doc) { + new_title = symbol_doc->getRoot()->title(); + if(new_title.empty()) { + new_title = _("Unnamed Symbols"); + } + } + } + if(Glib::str_has_suffix(filename, ".vss")) { + i++; + } #endif - if(symbol_doc) { - symbol_sets.erase(title); - symbol_sets[new_title]= symbol_doc; - sensitive = false; - symbol_set->remove_text(i); - symbol_set->insert (i, new_title); - symbol_set->set_active(i); - symbol_set->set_active_text(new_title); - sensitive = true; - break; - } + if(symbol_doc) { + symbol_sets.erase(title); + symbol_sets[new_title]= symbol_doc; + sensitive = false; + symbol_set->remove_text(i+1); + symbol_set->insert (i+1, new_title); + symbol_set->set_active(i+1); + symbol_set->set_active_text(new_title); + sensitive = true; + break; + } + } } return std::make_pair(new_title, symbol_doc); } @@ -807,30 +810,19 @@ gchar const* SymbolsDialog::styleFromUse( gchar const* id, SPDocument* document) return style; } -void SymbolsDialog::addSymbols( SPDocument* symbol_document ) { - std::vector l = symbolsInDoc( symbol_document ); - Glib::ustring doc_title = ""; - if (symbol_document->getRoot()->title()) { - doc_title = symbol_document->getRoot()->title(); - } - for(auto symbol:l) { - if (symbol) { - addSymbol( symbol, doc_title); - } - } -} - void SymbolsDialog::clearSearch() { - search_str = search->get_text(); - if(search_str.empty()) { + if(search->get_text().empty()) { + search_str = ""; store->clear(); - findSymbolsInDoc(symbol_sets[last_symbol_set], last_symbol_set); - symbol_set->set_active_text(last_symbol_set); + Glib::ustring current = symbol_set->get_active_text(); + if (current != _("Search all sets")) { + addSymbolsInDoc(symbol_sets[current]); + } } } -void SymbolsDialog::prepareFindSymbols(GdkEventKey* evt) +void SymbolsDialog::beforeAddSymbols(GdkEventKey* evt) { search_str = search->get_text().lowercase(); if (evt->keyval != GDK_KEY_Return) { @@ -839,45 +831,33 @@ void SymbolsDialog::prepareFindSymbols(GdkEventKey* evt) progress_bar->set_fraction(0.0); search->set_text(_("Searching...")); search->set_sensitive(false); - global->set_sensitive(false); - if(!global->get_active()) { + Glib::ustring current = symbol_set->get_active_text(); + if (current != _("Search all sets")) { bool icons_found = false; Glib::ustring doc_title = symbol_set->get_active_text(); if (!doc_title.empty()) { SPDocument* symbol_document = symbol_sets[doc_title]; if(symbol_document) { store->clear(); - icons_found = findSymbolsInDoc(symbol_document, doc_title); + icons_found = addSymbolsInDoc(symbol_document); } } if (!icons_found) { - for(auto const &symbol_document_map : symbol_sets) { - SPDocument* symbol_document = symbol_document_map.second; - Glib::ustring doc_title = symbol_document_map.first; - //Cover the two cases if search document is procesed or not (title based or filename based) - if (doc_title.lowercase() == "search") { - if(!symbol_document) { - symbol_document = getSymbols(symbol_document_map.first).second; - } - addSymbols(symbol_document); - break; - } - } + //show overlay } search->set_text(search_str); search->set_sensitive(true); - global->set_sensitive(true); - dynamic_cast(progress_bar)->set_visible(false); } else if(processed) { - findSymbols(); + Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackGetSymbols) ); + addSymbols(); } else { - dynamic_cast(progress_bar)->set_visible(true); + Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackGetSymbolsSets) ); } } -bool SymbolsDialog::parseDocuments(){ - if (search->get_text() != _("Searching...") || !global->get_active()) { - dynamic_cast(progress_bar)->set_visible(false); +bool SymbolsDialog::callbackGetSymbolsSets(){ + Glib::ustring current = symbol_set->get_active_text(); + if (search->get_text() != _("Searching...") || current != _("Search all sets")) { return true; } size_t counter = 0; @@ -887,20 +867,40 @@ bool SymbolsDialog::parseDocuments(){ if (symbol_document) { continue; } - getSymbols(symbol_document_map.first); + symbol_document = getSymbolsSet(symbol_document_map.first).second; + symbol_set->set_active_text(_("Search all sets")); + if (!symbol_document) { + continue; + } progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); return true; } - findSymbols(); + addSymbols(); processed = true; progress_bar->set_fraction(1.0); return false; } -bool SymbolsDialog::findSymbolsInDoc(SPDocument* symbol_document, Glib::ustring doc_title) { +bool SymbolsDialog::callbackGetSymbols() +{ + if (loading && processed) { + progress_bar->pulse(); + return true; + } + return false; +} + +bool SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { bool icons_found = false; + if (!symbol_document) { + return false; //Search all + } + Glib::ustring doc_title = documentTitle(symbol_document); + if (doc_title.empty()) { + return false; + } std::vector l = symbolsInDoc(symbol_document); - last_symbol_set = doc_title; + loading = false; for(auto symbol:l) { gchar const *symbol_title_char = symbol->title(); gchar const *symbol_desc_char = symbol->description(); @@ -923,38 +923,29 @@ bool SymbolsDialog::findSymbolsInDoc(SPDocument* symbol_document, Glib::ustring icons_found = true; } } + } + loading = false; return icons_found; } -void SymbolsDialog::findSymbols() { +void SymbolsDialog::addSymbols() { bool icons_found = false; - SPDocument* searchdoc; store->clear(); for(auto const &symbol_document_map : symbol_sets) { SPDocument* symbol_document = symbol_document_map.second; if (!symbol_document) { continue; } - Glib::ustring doc_title = symbol_document_map.first; - if (doc_title == "Search") { - searchdoc = symbol_document; - continue; - } - if(findSymbolsInDoc(symbol_document, doc_title) && !icons_found) { + if(addSymbolsInDoc(symbol_document) && !icons_found) { icons_found = true; } } if (!icons_found) { - addSymbols(searchdoc); - } - if (global->get_active()) { - symbol_set->set_active_text(_("Global Search")); + //Show overlay } search->set_text(search_str); search->set_sensitive(true); - global->set_sensitive(true); - dynamic_cast(progress_bar)->set_visible(false); } void SymbolsDialog::addSymbol( SPObject* symbol, Glib::ustring doc_title) { diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 54a42ec71..bc6c127a7 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -81,22 +81,22 @@ private: Glib::ustring selectedSymbolDocTitle(); void iconChanged(); void iconDragDataGet(const Glib::RefPtr& context, Gtk::SelectionData& selection_data, guint info, guint time); - - void getSymbols(); - std::pair getSymbols(Glib::ustring title); - void addSymbols( SPDocument* symbol_document ); + void getSymbolsFilename(); + Glib::ustring documentTitle(SPDocument* doc); + std::pair getSymbolsSet(Glib::ustring title); void addSymbol( SPObject* symbol, Glib::ustring doc_title); SPDocument* symbolsPreviewDoc(); - void symbolsInDocRecursive(SPObject *r, std::vector &l); std::vector symbolsInDoc( SPDocument* document); void useInDoc(SPObject *r, std::vector &l); std::vector useInDoc( SPDocument* document); - void prepareFindSymbols(GdkEventKey* evt); - void findSymbols(); + void beforeAddSymbols(GdkEventKey* evt); + void addSymbols(); + bool addSymbolsInDoc(SPDocument* document); void clearSearch(); - bool findSymbolsInDoc(SPDocument* document, Glib::ustring doc_title); - bool parseDocuments(); + bool callbackGetSymbolsSets(); + bool callbackGetSymbols(); + gchar const* styleFromUse( gchar const* id, SPDocument* document); Glib::RefPtr drawSymbol(SPObject *symbol); @@ -112,23 +112,23 @@ private: bool sensitive; + bool loading; + bool processed; size_t number_docs; - Glib::ustring last_symbol_set; Glib::RefPtr store; + Glib::ustring search_str; Gtk::ComboBoxText* symbol_set; Gtk::ProgressBar* progress_bar; Gtk::HBox* progress; Gtk::SearchEntry* search; - Glib::ustring search_str; Gtk::IconView* icon_view; Gtk::Button* add_symbol; Gtk::Button* remove_symbol; Gtk::Button* zoom_in; Gtk::Button* zoom_out; Gtk::Grid* table; - Gtk::Switch * global; Gtk::ScrolledWindow *scroller; Gtk::ToggleButton* fit_symbol; -- cgit v1.2.3 From d26f81a4c3c918fa2af5cb454ec569376a7c0b51 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Wed, 25 Oct 2017 01:12:45 +0200 Subject: Add progressbar to all actions --- src/ui/dialog/symbols.cpp | 278 +++++++++++++++++++++++++++++----------------- src/ui/dialog/symbols.h | 24 ++-- 2 files changed, 185 insertions(+), 117 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 6c7fa6bef..bb544e4c9 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -115,15 +115,15 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : table->set_margin_right(3); table->set_margin_top(4); // panel is a cloked Gtk::VBox - _getContents()->pack_start(*Gtk::manage(table), Gtk::PACK_EXPAND_WIDGET); + _getContents()->pack_start(* Gtk::manage(table), Gtk::PACK_EXPAND_WIDGET); guint row = 0; /******************** Symbol Sets *************************/ - Gtk::Label* labelSet = new Gtk::Label(_("Symbol set: ")); - table->attach(*Gtk::manage(labelSet),0,row,1,1); + Gtk::Label* label_set = new Gtk::Label(_("Symbol set: ")); + table->attach(*Gtk::manage(label_set),0,row,1,1); symbol_set = new Gtk::ComboBoxText(); // Fill in later symbol_set->append(_("Current Document")); - symbol_set->append(_("Search all sets")); + symbol_set->append(_("All symbols sets")); symbol_set->set_active_text(_("Current Document")); symbol_set->set_hexpand(); table->attach(*Gtk::manage(symbol_set),1,row,1,1); @@ -133,13 +133,13 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : ++row; - /******************** Progress *******************************/ - progress = new Gtk::HBox(); - 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(8); - progress->set_margin_bottom(8); + /******************** Separator *************************/ + + + Gtk::Separator* separator = Gtk::manage(new Gtk::Separator()); // Search + separator->set_margin_top(10); + separator->set_margin_bottom(10); + table->attach(*Gtk::manage(separator),0,row,2,1); ++row; @@ -185,7 +185,24 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : scroller->add(*Gtk::manage(icon_view)); scroller->set_hexpand(); scroller->set_vexpand(); - table->attach(*Gtk::manage(scroller),0,row,2,1); + overlay = new Gtk::Overlay(); + overlay->set_hexpand(); + overlay->set_vexpand(); + overlay->add(* scroller); + table->attach(*Gtk::manage(overlay),0,row,2,1); + + ++row; + + /******************** Progress *******************************/ + progress = new Gtk::HBox(); + 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_left(20); + progress->set_margin_right(20); + ++row; /******************** Tools *******************************/ @@ -289,7 +306,6 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : /**********************************************************/ sensitive = true; - processed = false; search_str = ""; current_desktop = SP_ACTIVE_DESKTOP; current_document = current_desktop->getDocument(); @@ -313,6 +329,10 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : sigc::mem_fun(*this, &SymbolsDialog::documentReplaced)); instanceConns.push_back(documentReplacedConn); getSymbolsFilename(); + icons_found = false; + + Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); + addSymbolsInDoc(current_document); /* Defaults to current document */ sigc::connection desktopChangeConn = @@ -389,13 +409,14 @@ void SymbolsDialog::rebuild() { add_symbol->set_sensitive( false ); remove_symbol->set_sensitive( false ); } - if (symbol_set->get_active_text() == _("Search all sets")) { + if (search->get_text() != _("Searching...")) { + search_str = ""; + search->set_text(""); + } + icons_found = false; + if (symbol_set->get_active_text() == _("All symbols sets")) { store->clear(); - if (search_str != "" && processed) { - addSymbols(); - } } else { - search->set_text(""); addSymbolsInDoc(symbol_document); } } @@ -816,8 +837,13 @@ void SymbolsDialog::clearSearch() search_str = ""; store->clear(); Glib::ustring current = symbol_set->get_active_text(); - if (current != _("Search all sets")) { - addSymbolsInDoc(symbol_sets[current]); + if (current != _("All symbols sets")) { + icons_found = false; + SPDocument* symbol_document = symbol_sets[current]; + if (current == _("Current Document")) { + symbol_document = current_document; + } + addSymbolsInDoc(symbol_document); } } } @@ -832,120 +858,134 @@ void SymbolsDialog::beforeAddSymbols(GdkEventKey* evt) search->set_text(_("Searching...")); search->set_sensitive(false); Glib::ustring current = symbol_set->get_active_text(); - if (current != _("Search all sets")) { - bool icons_found = false; + if (current != _("All symbols sets")) { Glib::ustring doc_title = symbol_set->get_active_text(); if (!doc_title.empty()) { SPDocument* symbol_document = symbol_sets[doc_title]; - if(symbol_document) { - store->clear(); - icons_found = addSymbolsInDoc(symbol_document); + if (current == _("Current Document")) { + symbol_document = current_document; } + store->clear(); + icons_found = false; + addSymbolsInDoc(symbol_document); } - if (!icons_found) { - //show overlay - } - search->set_text(search_str); - search->set_sensitive(true); - } else if(processed) { - Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackGetSymbols) ); + } else if(all_docs_processed) { addSymbols(); - } else { - Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackGetSymbolsSets) ); } } -bool SymbolsDialog::callbackGetSymbolsSets(){ +bool SymbolsDialog::callbackSymbols(){ Glib::ustring current = symbol_set->get_active_text(); - if (search->get_text() != _("Searching...") || current != _("Search all sets")) { - return true; - } - size_t counter = 0; - for(auto const &symbol_document_map : symbol_sets) { - ++counter; - SPDocument* symbol_document = symbol_document_map.second; - if (symbol_document) { - continue; + if (l.size()) { + for (auto symbol:l) { + counter_symbols ++; + gchar const *symbol_title_char = symbol->title(); + gchar const *symbol_desc_char = symbol->description(); + if (symbol_title_char) { + bool found = false; + Glib::ustring symbol_title = Glib::ustring(symbol_title_char).lowercase(); + auto pos = symbol_title.rfind(search_str); + if (pos != std::string::npos) { + found = true; + } + if (!found && symbol_desc_char) { + Glib::ustring symbol_desc = Glib::ustring(symbol_desc_char).lowercase(); + auto pos = symbol_desc.rfind(search_str); + if (pos != std::string::npos) { + found = true; + } + } + if (symbol && (search_str.empty() || found)) { + addSymbol( symbol, doc_title); + icons_found = true; + } + } + progress_bar->set_fraction(((100.0/number_symbols) * counter_symbols)/100.0); + l.erase(l.begin()); + //to get more items and best performance + int modulus = number_symbols > 200 ? 50 : (number_symbols/4); + if (modulus && counter_symbols % modulus == 0 && !l.empty()) { + return true; + } } - symbol_document = getSymbolsSet(symbol_document_map.first).second; - symbol_set->set_active_text(_("Search all sets")); - if (!symbol_document) { - continue; + if (!icons_found && !search_str.empty()) { + Gtk::Image* no_results_icon = new Gtk::Image(getSearchPixbuf()); + no_results_icon->set_halign(Gtk::ALIGN_CENTER ); + no_results_icon->set_valign(Gtk::ALIGN_CENTER ); + Gtk::Label* no_results = new Gtk::Label(); + no_results->set_halign(Gtk::ALIGN_CENTER ); + no_results->set_valign(Gtk::ALIGN_CENTER ); + no_results->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + Gtk::Label* different = new Gtk::Label(); + different->set_halign(Gtk::ALIGN_CENTER ); + different->set_valign(Gtk::ALIGN_CENTER ); + different->set_markup(Glib::ustring("") + Glib::ustring(_("Try a different search")) + Glib::ustring("")); + overlay->add_overlay(* no_results_icon); + overlay->add_overlay(* no_results); + overlay->add_overlay(* different); } - progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); + search->set_text(search_str); + search->set_sensitive(true); return true; - } - addSymbols(); - processed = true; - progress_bar->set_fraction(1.0); - return false; -} - -bool SymbolsDialog::callbackGetSymbols() -{ - if (loading && processed) { - progress_bar->pulse(); + } else if (current == _("All symbols sets") && + search->get_text() == _("Searching...") ) { + size_t counter = 0; + for(auto const &symbol_document_map : symbol_sets) { + ++counter; + SPDocument* symbol_document = symbol_document_map.second; + if (symbol_document) { + continue; + } + symbol_document = getSymbolsSet(symbol_document_map.first).second; + symbol_set->set_active_text(_("All symbols sets")); + if (!symbol_document) { + continue; + } + progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); + return true; + } + progress_bar->set_fraction(1.0); + all_docs_processed = true; + addSymbols(); return true; } - return false; + return true; } -bool SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { - bool icons_found = false; +void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { if (!symbol_document) { - return false; //Search all + return; //Search all } - Glib::ustring doc_title = documentTitle(symbol_document); + doc_title = documentTitle(symbol_document); if (doc_title.empty()) { - return false; - } - std::vector l = symbolsInDoc(symbol_document); - loading = false; - for(auto symbol:l) { - gchar const *symbol_title_char = symbol->title(); - gchar const *symbol_desc_char = symbol->description(); - if (symbol_title_char) { - bool found = false; - Glib::ustring symbol_title = Glib::ustring(symbol_title_char).lowercase(); - auto pos = symbol_title.rfind(search_str); - if (pos != std::string::npos) { - found = true; - } - if (!found && symbol_desc_char) { - Glib::ustring symbol_desc = Glib::ustring(symbol_desc_char).lowercase(); - auto pos = symbol_desc.rfind(search_str); - if (pos != std::string::npos) { - found = true; - } - } - if (symbol && (search_str.empty() || found)) { - addSymbol( symbol, doc_title); - icons_found = true; - } - } - + doc_title = _("Untitled document"); ; } - loading = false; - return icons_found; + progress_bar->set_fraction(0.0); + counter_symbols = 0; + std::vector container_symbols_tmp = symbolsInDoc(symbol_document); + number_symbols = container_symbols_tmp.size(); + l = container_symbols_tmp; + container_symbols_tmp.clear(); } void SymbolsDialog::addSymbols() { - bool icons_found = false; store->clear(); + icons_found = false; + std::vector container_symbols; for(auto const &symbol_document_map : symbol_sets) { SPDocument* symbol_document = symbol_document_map.second; if (!symbol_document) { continue; } - if(addSymbolsInDoc(symbol_document) && !icons_found) { - icons_found = true; - } - } - if (!icons_found) { - //Show overlay + std::vector container_symbols_tmp = symbolsInDoc(symbol_document); + container_symbols.insert(container_symbols.end(), container_symbols_tmp.begin(), container_symbols_tmp.end()); + container_symbols_tmp.clear(); } - search->set_text(search_str); - search->set_sensitive(true); + counter_symbols = 0; + progress_bar->set_fraction(0.0); + number_symbols = container_symbols.size(); + l = container_symbols; + container_symbols.clear(); } void SymbolsDialog::addSymbol( SPObject* symbol, Glib::ustring doc_title) { @@ -1091,6 +1131,38 @@ SPDocument* SymbolsDialog::symbolsPreviewDoc() return SPDocument::createNewDocFromMem( buffer, strlen(buffer), FALSE ); } +/* + * Return search symbol pixbuf + */ +Glib::RefPtr +SymbolsDialog::getSearchPixbuf() +{ + // BUG: must be inside + gchar const *buffer = +"" +" " +" " +" Search Taiga Icon" +" " +" " +" " +""; + + SPDocument* doc = SPDocument::createNewDocFromMem( buffer, strlen(buffer), FALSE ); + std::vector l = symbolsInDoc(doc); + int prev_scale_factor = scale_factor; + scale_factor = 10; + Glib::RefPtr pb = drawSymbol(l[0]); + scale_factor = prev_scale_factor; + return pb; +} + void SymbolsDialog::setTargetDesktop(SPDesktop *desktop) { if (this->current_desktop != desktop) { diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index bc6c127a7..586ea2116 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -92,31 +92,26 @@ private: std::vector useInDoc( SPDocument* document); void beforeAddSymbols(GdkEventKey* evt); void addSymbols(); - bool addSymbolsInDoc(SPDocument* document); + void addSymbolsInDoc(SPDocument* document); void clearSearch(); - bool callbackGetSymbolsSets(); - bool callbackGetSymbols(); - + bool callbackSymbols(); gchar const* styleFromUse( gchar const* id, SPDocument* document); - + Glib::ustring doc_title; Glib::RefPtr drawSymbol(SPObject *symbol); - + Glib::RefPtr getSearchPixbuf(); /* Keep track of all symbol template documents */ std::map symbol_sets; - + std::vector l; // Index into sizes which is selected int pack_size; - // Scale factor int scale_factor; - bool sensitive; - - bool loading; - - bool processed; - + bool all_docs_processed; size_t number_docs; + size_t number_symbols; + size_t counter_symbols; + bool icons_found; Glib::RefPtr store; Glib::ustring search_str; Gtk::ComboBoxText* symbol_set; @@ -131,6 +126,7 @@ private: Gtk::Grid* table; Gtk::ScrolledWindow *scroller; Gtk::ToggleButton* fit_symbol; + Gtk::Overlay* overlay; void setTargetDesktop(SPDesktop *desktop); SPDesktop* current_desktop; -- cgit v1.2.3 From 465a6f1db66db8101b22ee14d9a528a836f01e77 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sat, 28 Oct 2017 01:00:20 +0200 Subject: Fix simbols dialog expand, Fix add symbols to document on global search --- src/ui/dialog/symbols.cpp | 163 ++++++++++++++++++++++++++-------------------- src/ui/dialog/symbols.h | 14 ++-- 2 files changed, 103 insertions(+), 74 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index bb544e4c9..9b4d2ae12 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -148,7 +148,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : search = Gtk::manage(new Gtk::SearchEntry()); // Search search->set_tooltip_text(_("Return to start search.")); - search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::beforeAddSymbols)); + search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::beforeSearch)); search->set_margin_left(10); search->set_margin_right(10); search->signal_search_changed().connect(sigc::mem_fun(*this, &SymbolsDialog::clearSearch)); @@ -206,8 +206,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : ++row; /******************** Tools *******************************/ - Gtk::Button* button; - Gtk::HBox* tools = new Gtk::HBox(); + tools = new Gtk::HBox(); //tools->set_layout( Gtk::BUTTONBOX_END ); scroller->set_hexpand(); @@ -244,24 +243,24 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : auto packMoreImage = Gtk::manage(new Gtk::Image()); packMoreImage->set_from_icon_name("pack-more", Gtk::ICON_SIZE_SMALL_TOOLBAR); - button = Gtk::manage(new Gtk::Button()); - button->add(*packMoreImage); - button->set_tooltip_text(_("Display more icons in row.")); - button->set_relief( Gtk::RELIEF_NONE ); - button->set_focus_on_click( false ); - button->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::packmore)); - tools->pack_start(* button, Gtk::PACK_SHRINK); + more = Gtk::manage(new Gtk::Button()); + more->add(*packMoreImage); + more->set_tooltip_text(_("Display more icons in row.")); + more->set_relief( Gtk::RELIEF_NONE ); + more->set_focus_on_click( false ); + more->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::packmore)); + tools->pack_start(* more, Gtk::PACK_SHRINK); auto packLessImage = Gtk::manage(new Gtk::Image()); packLessImage->set_from_icon_name("pack-less", Gtk::ICON_SIZE_SMALL_TOOLBAR); - button = Gtk::manage(new Gtk::Button()); - button->add(*packLessImage); - button->set_tooltip_text(_("Display fewer icons in row.")); - button->set_relief( Gtk::RELIEF_NONE ); - button->set_focus_on_click( false ); - button->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::packless)); - tools->pack_start(* button, Gtk::PACK_SHRINK); + fewer = Gtk::manage(new Gtk::Button()); + fewer->add(*packLessImage); + fewer->set_tooltip_text(_("Display fewer icons in row.")); + fewer->set_relief( Gtk::RELIEF_NONE ); + fewer->set_focus_on_click( false ); + fewer->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::packless)); + tools->pack_start(* fewer, Gtk::PACK_SHRINK); // Toggle scale to fit on/off auto fit_symbolImage = Gtk::manage(new Gtk::Image()); @@ -396,7 +395,6 @@ void SymbolsDialog::rebuild() { zoom_in->set_sensitive( true); zoom_out->set_sensitive( true ); } - store->clear(); SPDocument* symbol_document = selectedSymbols(true); if( !symbol_document ) { @@ -409,14 +407,15 @@ void SymbolsDialog::rebuild() { add_symbol->set_sensitive( false ); remove_symbol->set_sensitive( false ); } - if (search->get_text() != _("Searching...")) { + if (search->get_text() != _("Searching...") && + search->get_text() != _("Loading documents...") && + search->get_text() != _("Documents done, searchig inside...") ) + { search_str = ""; search->set_text(""); } icons_found = false; - if (symbol_set->get_active_text() == _("All symbols sets")) { - store->clear(); - } else { + if (symbol_set->get_active_text() != _("All symbols sets")) { addSymbolsInDoc(symbol_document); } } @@ -523,7 +522,7 @@ Glib::ustring SymbolsDialog::documentTitle(SPDocument* symbol_doc) { if (symbol_doc) { SPRoot * root = symbol_doc->getRoot(); if (root->title()) { - title = Glib::ustring(root->title()); + title = ellipsize(Glib::ustring(root->title())); } return title; } @@ -725,7 +724,7 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) if(filename_short == title + ".svg") { symbol_doc = SPDocument::createNewDoc(filename.c_str(), FALSE); if(symbol_doc) { - new_title = symbol_doc->getRoot()->title(); + new_title = ellipsize(symbol_doc->getRoot()->title()); if(new_title.empty()) { new_title = _("Unnamed Symbols"); } @@ -738,7 +737,7 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) if(filename_short == title + ".vss") { symbol_doc = read_vss(filename, title); if(symbol_doc) { - new_title = symbol_doc->getRoot()->title(); + new_title = ellipsize(symbol_doc->getRoot()->title()); if(new_title.empty()) { new_title = _("Unnamed Symbols"); } @@ -764,7 +763,7 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) return std::make_pair(new_title, symbol_doc); } -void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::vector &l) +void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::vector > &l, Glib::ustring doc_title) { if(!r) return; @@ -774,19 +773,20 @@ void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::vector & } if ( dynamic_cast(r) ) { - l.push_back(dynamic_cast(r)); + l.push_back(std::make_pair(doc_title,dynamic_cast(r))); } for (auto& child: r->children) { - symbolsInDocRecursive( &child, l ); + symbolsInDocRecursive(&child, l, doc_title); } } -std::vector SymbolsDialog::symbolsInDoc( SPDocument* symbol_document) +std::vector > +SymbolsDialog::symbolsInDoc( SPDocument* symbol_document, Glib::ustring doc_title) { - std::vector l; - symbolsInDocRecursive (symbol_document->getRoot(), l ); + std::vector > l; + symbolsInDocRecursive (symbol_document->getRoot(), l , doc_title); return l; } @@ -833,7 +833,7 @@ gchar const* SymbolsDialog::styleFromUse( gchar const* id, SPDocument* document) void SymbolsDialog::clearSearch() { - if(search->get_text().empty()) { + if(search->get_text().empty() && sensitive) { search_str = ""; store->clear(); Glib::ustring current = symbol_set->get_active_text(); @@ -848,17 +848,24 @@ void SymbolsDialog::clearSearch() } } -void SymbolsDialog::beforeAddSymbols(GdkEventKey* evt) +void SymbolsDialog::enableWidgets(bool enable) +{ + symbol_set->set_sensitive(enable); + search->set_sensitive(enable); + tools ->set_sensitive(enable); +} + +void SymbolsDialog::beforeSearch(GdkEventKey* evt) { search_str = search->get_text().lowercase(); if (evt->keyval != GDK_KEY_Return) { return; } progress_bar->set_fraction(0.0); - search->set_text(_("Searching...")); - search->set_sensitive(false); + enableWidgets(false); Glib::ustring current = symbol_set->get_active_text(); if (current != _("All symbols sets")) { + search->set_text(_("Searching...")); Glib::ustring doc_title = symbol_set->get_active_text(); if (!doc_title.empty()) { SPDocument* symbol_document = symbol_sets[doc_title]; @@ -869,15 +876,40 @@ void SymbolsDialog::beforeAddSymbols(GdkEventKey* evt) icons_found = false; addSymbolsInDoc(symbol_document); } - } else if(all_docs_processed) { - addSymbols(); + } else { + search->set_text(_("Loading documents...")); } } bool SymbolsDialog::callbackSymbols(){ Glib::ustring current = symbol_set->get_active_text(); - if (l.size()) { - for (auto symbol:l) { + if (current == _("All symbols sets") && + search->get_text() == _("Loading documents...") ) + { + size_t counter = 0; + for(auto const &symbol_document_map : symbol_sets) { + ++counter; + SPDocument* symbol_document = symbol_document_map.second; + if (symbol_document) { + continue; + } + symbol_document = getSymbolsSet(symbol_document_map.first).second; + symbol_set->set_active_text(_("All symbols sets")); + if (!symbol_document) { + continue; + } + progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); + return true; + } + progress_bar->set_fraction(1.0); + all_docs_processed = true; + addSymbols(); + search->set_text("Documents done, searchig inside..."); + return true; + } else if (l.size()) { + for (auto symbol_data = l.begin(); symbol_data != l.end();) { + Glib::ustring doc_title = symbol_data->first; + SPSymbol * symbol = symbol_data->second; counter_symbols ++; gchar const *symbol_title_char = symbol->title(); gchar const *symbol_desc_char = symbol->description(); @@ -901,7 +933,7 @@ bool SymbolsDialog::callbackSymbols(){ } } progress_bar->set_fraction(((100.0/number_symbols) * counter_symbols)/100.0); - l.erase(l.begin()); + symbol_data = l.erase(l.begin()); //to get more items and best performance int modulus = number_symbols > 200 ? 50 : (number_symbols/4); if (modulus && counter_symbols % modulus == 0 && !l.empty()) { @@ -924,45 +956,34 @@ bool SymbolsDialog::callbackSymbols(){ overlay->add_overlay(* no_results); overlay->add_overlay(* different); } + bool prev_sensitive = sensitive; + sensitive = false; search->set_text(search_str); - search->set_sensitive(true); - return true; - } else if (current == _("All symbols sets") && - search->get_text() == _("Searching...") ) { - size_t counter = 0; - for(auto const &symbol_document_map : symbol_sets) { - ++counter; - SPDocument* symbol_document = symbol_document_map.second; - if (symbol_document) { - continue; - } - symbol_document = getSymbolsSet(symbol_document_map.first).second; - symbol_set->set_active_text(_("All symbols sets")); - if (!symbol_document) { - continue; - } - progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); - return true; - } - progress_bar->set_fraction(1.0); - all_docs_processed = true; - addSymbols(); + sensitive = prev_sensitive; + enableWidgets(true); return true; } return true; } +Glib::ustring SymbolsDialog::ellipsize(Glib::ustring data, size_t limit) { + if (data.length() > limit) { + return data.substr(0,limit-3) + "..."; + } + return data; +} + void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { if (!symbol_document) { return; //Search all } - doc_title = documentTitle(symbol_document); + Glib::ustring doc_title = documentTitle(symbol_document); if (doc_title.empty()) { doc_title = _("Untitled document"); ; } progress_bar->set_fraction(0.0); counter_symbols = 0; - std::vector container_symbols_tmp = symbolsInDoc(symbol_document); + std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); number_symbols = container_symbols_tmp.size(); l = container_symbols_tmp; container_symbols_tmp.clear(); @@ -971,14 +992,18 @@ void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { void SymbolsDialog::addSymbols() { store->clear(); icons_found = false; - std::vector container_symbols; + std::vector > container_symbols; for(auto const &symbol_document_map : symbol_sets) { SPDocument* symbol_document = symbol_document_map.second; if (!symbol_document) { continue; } - std::vector container_symbols_tmp = symbolsInDoc(symbol_document); - container_symbols.insert(container_symbols.end(), container_symbols_tmp.begin(), container_symbols_tmp.end()); + Glib::ustring doc_title = documentTitle(symbol_document); + if (doc_title.empty()) { + doc_title = _("Untitled document"); ; + } + std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); + container_symbols.insert(container_symbols.end(), std::make_move_iterator(container_symbols_tmp.begin()), std::make_move_iterator(container_symbols_tmp.end())); container_symbols_tmp.clear(); } counter_symbols = 0; @@ -1155,10 +1180,10 @@ SymbolsDialog::getSearchPixbuf() ""; SPDocument* doc = SPDocument::createNewDocFromMem( buffer, strlen(buffer), FALSE ); - std::vector l = symbolsInDoc(doc); + std::vector > l = symbolsInDoc(doc, "Search Taiga Icon"); int prev_scale_factor = scale_factor; scale_factor = 10; - Glib::RefPtr pb = drawSymbol(l[0]); + Glib::RefPtr pb = drawSymbol(l[0].second); scale_factor = prev_scale_factor; return pb; } diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 586ea2116..d252b7c71 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -86,22 +86,23 @@ private: std::pair getSymbolsSet(Glib::ustring title); void addSymbol( SPObject* symbol, Glib::ustring doc_title); SPDocument* symbolsPreviewDoc(); - void symbolsInDocRecursive(SPObject *r, std::vector &l); - std::vector symbolsInDoc( SPDocument* document); + void symbolsInDocRecursive (SPObject *r, std::vector > &l, Glib::ustring doc_title); + std::vector > symbolsInDoc( SPDocument* document, Glib::ustring doc_title); void useInDoc(SPObject *r, std::vector &l); std::vector useInDoc( SPDocument* document); - void beforeAddSymbols(GdkEventKey* evt); + void beforeSearch(GdkEventKey* evt); void addSymbols(); void addSymbolsInDoc(SPDocument* document); void clearSearch(); bool callbackSymbols(); + void enableWidgets(bool enable); + Glib::ustring ellipsize(Glib::ustring data, size_t limit = 40); gchar const* styleFromUse( gchar const* id, SPDocument* document); - Glib::ustring doc_title; Glib::RefPtr drawSymbol(SPObject *symbol); Glib::RefPtr getSearchPixbuf(); /* Keep track of all symbol template documents */ std::map symbol_sets; - std::vector l; + std::vector > l; // Index into sizes which is selected int pack_size; // Scale factor @@ -123,6 +124,9 @@ private: Gtk::Button* remove_symbol; Gtk::Button* zoom_in; Gtk::Button* zoom_out; + Gtk::Button* more; + Gtk::Button* fewer; + Gtk::HBox* tools; Gtk::Grid* table; Gtk::ScrolledWindow *scroller; Gtk::ToggleButton* fit_symbol; -- cgit v1.2.3 From c9e7774bafe671e2b5c09c70f9f83a6eec8cb1a7 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sat, 28 Oct 2017 03:01:52 +0200 Subject: Remove CMake blank line --- src/ui/dialog/symbols.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 9b4d2ae12..e1b013c10 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -220,7 +220,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : add_symbol->set_tooltip_text(_("Add Symbol from the current document.")); add_symbol->set_relief( Gtk::RELIEF_NONE ); add_symbol->set_focus_on_click( false ); - add_symbol->signal_activate().connect(sigc::mem_fun(*this, &SymbolsDialog::insertSymbol)); + add_symbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::insertSymbol)); tools->pack_start(* add_symbol, Gtk::PACK_SHRINK); auto remove_symbolImage = Gtk::manage(new Gtk::Image()); @@ -421,14 +421,15 @@ void SymbolsDialog::rebuild() { } void SymbolsDialog::insertSymbol() { + std::cout << "fgasgggggggggggggg" << std::endl; Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_SYMBOL ); - SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) this->current_desktop) ); + SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) current_desktop) ); sp_action_perform (action, NULL); } void SymbolsDialog::revertSymbol() { Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_UNSYMBOL ); - SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) this->current_desktop ) ); + SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) current_desktop ) ); sp_action_perform (action, NULL); } -- cgit v1.2.3 From c55b8b44d0b477069231a62507d5cbd968a34935 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sat, 28 Oct 2017 19:19:36 +0200 Subject: Bug fixes previous to overlay implementation --- src/ui/dialog/symbols.cpp | 190 +++++++++++++++++++++++----------------------- src/ui/dialog/symbols.h | 5 +- 2 files changed, 100 insertions(+), 95 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index e1b013c10..e0aa4cb23 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -148,9 +148,11 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : search = Gtk::manage(new Gtk::SearchEntry()); // Search search->set_tooltip_text(_("Return to start search.")); - search->signal_key_press_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::beforeSearch)); + search->signal_key_press_event().connect_notify( sigc::mem_fun(*this, &SymbolsDialog::beforeSearch)); + search->signal_key_release_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::unsensitive)); search->set_margin_left(10); search->set_margin_right(10); + search->set_margin_bottom(6); search->signal_search_changed().connect(sigc::mem_fun(*this, &SymbolsDialog::clearSearch)); table->attach(*Gtk::manage(search),0,row,2,1); @@ -396,32 +398,22 @@ void SymbolsDialog::rebuild() { zoom_out->set_sensitive( true ); } store->clear(); - SPDocument* symbol_document = selectedSymbols(true); - if( !symbol_document ) { - // Symbol must be from Current Document (this method of - // checking should be language independent). - symbol_document = current_document; - add_symbol->set_sensitive( true ); - remove_symbol->set_sensitive( true ); - } else { - add_symbol->set_sensitive( false ); - remove_symbol->set_sensitive( false ); - } + SPDocument* symbol_document = selectedSymbols(); + icons_found = false; + //We are not in search all docs if (search->get_text() != _("Searching...") && - search->get_text() != _("Loading documents...") && - search->get_text() != _("Documents done, searchig inside...") ) + search->get_text() != _("Loading documents...") && + search->get_text() != _("Documents done, searchig inside...") ) { search_str = ""; search->set_text(""); } - icons_found = false; - if (symbol_set->get_active_text() != _("All symbols sets")) { + if (symbol_document) { addSymbolsInDoc(symbol_document); } } void SymbolsDialog::insertSymbol() { - std::cout << "fgasgggggggggggggg" << std::endl; Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_SYMBOL ); SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) current_desktop) ); sp_action_perform (action, NULL); @@ -443,7 +435,6 @@ void SymbolsDialog::iconDragDataGet(const Glib::RefPtr& /*cont Gtk::TreeModel::Path const & path = *iconArray.begin(); Gtk::ListStore::iterator row = store->get_iter(path); Glib::ustring symbol_id = (*row)[getColumns()->symbol_id]; - GdkAtom dataAtom = gdk_atom_intern( "application/x-inkscape-paste", FALSE ); gtk_selection_data_set( data.gobj(), dataAtom, 9, (guchar*)symbol_id.c_str(), symbol_id.length() ); } @@ -452,18 +443,24 @@ void SymbolsDialog::iconDragDataGet(const Glib::RefPtr& /*cont void SymbolsDialog::defsModified(SPObject * /*object*/, guint /*flags*/) { - if ( !symbol_sets[symbol_set->get_active_text()] ) { + Glib::ustring doc_title = symbol_set->get_active_text(); + if (doc_title != _("All symbols sets") && !symbol_sets[symbol_set->get_active_text()] ) { rebuild(); } } void SymbolsDialog::selectionChanged(Inkscape::Selection *selection) { Glib::ustring symbol_id = selectedSymbolId(); - SPDocument* symbol_document = selectedSymbols(); - SPObject* symbol = symbol_document->getObjectById(symbol_id); - - if(symbol && !selection->includes(symbol)) { - icon_view->unselect_all(); + SPDocument* symbol_document = symbol_sets[selectedSymbolTitle()]; + if (!symbol_document) { + //we are in global search so get the original symbol document by title + symbol_document = selectedSymbols(); + } + if (symbol_document) { + SPObject* symbol = symbol_document->getObjectById(symbol_id); + if(symbol && !selection->includes(symbol)) { + icon_view->unselect_all(); + } } } @@ -474,21 +471,25 @@ void SymbolsDialog::documentReplaced(SPDesktop *desktop, SPDocument *document) rebuild(); } -SPDocument* SymbolsDialog::selectedSymbols(bool ignorecurrent) { +SPDocument* SymbolsDialog::selectedSymbols() { /* OK, we know symbol name... now we need to copy it to clipboard, bon chance! */ - Glib::ustring doc_title = selectedSymbolDocTitle(); - if (doc_title.empty()) { - doc_title = symbol_set->get_active_text(); + Glib::ustring doc_title = symbol_set->get_active_text(); + if (doc_title == _("All symbols sets")) { + return NULL; } SPDocument* symbol_document = symbol_sets[doc_title]; if( !symbol_document ) { symbol_document = getSymbolsSet(doc_title).second; // Symbol must be from Current Document (this method of checking should be language independent). if( !symbol_document ) { - if (ignorecurrent) { - return NULL; - } - return current_document; + // Symbol must be from Current Document (this method of + // checking should be language independent). + symbol_document = current_document; + add_symbol->set_sensitive( true ); + remove_symbol->set_sensitive( true ); + } else { + add_symbol->set_sensitive( false ); + remove_symbol->set_sensitive( false ); } } return symbol_document; @@ -506,7 +507,7 @@ Glib::ustring SymbolsDialog::selectedSymbolId() { return Glib::ustring(""); } -Glib::ustring SymbolsDialog::selectedSymbolDocTitle() { +Glib::ustring SymbolsDialog::selectedSymbolTitle() { auto iconArray = icon_view->get_selected_items(); @@ -519,13 +520,17 @@ Glib::ustring SymbolsDialog::selectedSymbolDocTitle() { } Glib::ustring SymbolsDialog::documentTitle(SPDocument* symbol_doc) { - Glib::ustring title = ""; + Glib::ustring title = _("Untitled document"); if (symbol_doc) { SPRoot * root = symbol_doc->getRoot(); if (root->title()) { title = ellipsize(Glib::ustring(root->title())); + return title; } - return title; + } + Glib::ustring current = symbol_set->get_active_text(); + if (current == _("Current Document")) { + return current; } return title; } @@ -534,23 +539,33 @@ void SymbolsDialog::iconChanged() { Glib::ustring symbol_id = selectedSymbolId(); SPDocument* symbol_document = selectedSymbols(); - SPObject* symbol = symbol_document->getObjectById(symbol_id); - - if( symbol ) { - // Find style for use in - // First look for default style stored in - gchar const* style = symbol->getAttribute("inkscape:symbol-style"); - if( !style ) { - // If no default style in , look in documents. + if (!symbol_document) { + //we are in global search so get the original symbol document by title + symbol_document = symbol_sets[selectedSymbolTitle()]; + } + if (symbol_document) { + SPObject* symbol = symbol_document->getObjectById(symbol_id); + + if( symbol ) { if( symbol_document == current_document ) { - style = styleFromUse( symbol_id.c_str(), current_document ); - } else { - style = symbol_document->getReprRoot()->attribute("style"); + // Select the symbol on the canvas so it can be manipulated + current_desktop->selection->set( symbol, false ); + } + // Find style for use in + // First look for default style stored in + gchar const* style = symbol->getAttribute("inkscape:symbol-style"); + if( !style ) { + // If no default style in , look in documents. + if( symbol_document == current_document ) { + style = styleFromUse( symbol_id.c_str(), current_document ); + } else { + style = symbol_document->getReprRoot()->attribute("style"); + } } - } - ClipboardManager *cm = ClipboardManager::get(); - cm->copySymbol(symbol->getRepr(), style, symbol_document == current_document); + ClipboardManager *cm = ClipboardManager::get(); + cm->copySymbol(symbol->getRepr(), style, symbol_document == current_document); + } } } @@ -725,10 +740,7 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) if(filename_short == title + ".svg") { symbol_doc = SPDocument::createNewDoc(filename.c_str(), FALSE); if(symbol_doc) { - new_title = ellipsize(symbol_doc->getRoot()->title()); - if(new_title.empty()) { - new_title = _("Unnamed Symbols"); - } + new_title = documentTitle(symbol_doc); } } if(Glib::str_has_suffix(filename, ".svg")) { @@ -738,10 +750,7 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) if(filename_short == title + ".vss") { symbol_doc = read_vss(filename, title); if(symbol_doc) { - new_title = ellipsize(symbol_doc->getRoot()->title()); - if(new_title.empty()) { - new_title = _("Unnamed Symbols"); - } + new_title = documentTitle(symbol_doc); } } if(Glib::str_has_suffix(filename, ".vss")) { @@ -835,16 +844,16 @@ gchar const* SymbolsDialog::styleFromUse( gchar const* id, SPDocument* document) void SymbolsDialog::clearSearch() { if(search->get_text().empty() && sensitive) { + enableWidgets(false); search_str = ""; store->clear(); - Glib::ustring current = symbol_set->get_active_text(); - if (current != _("All symbols sets")) { + SPDocument* symbol_document = selectedSymbols(); + if (symbol_document) { + //We are not in search all docs icons_found = false; - SPDocument* symbol_document = symbol_sets[current]; - if (current == _("Current Document")) { - symbol_document = current_document; - } addSymbolsInDoc(symbol_document); + } else { + enableWidgets(true); } } } @@ -858,30 +867,30 @@ void SymbolsDialog::enableWidgets(bool enable) void SymbolsDialog::beforeSearch(GdkEventKey* evt) { + sensitive = false; search_str = search->get_text().lowercase(); if (evt->keyval != GDK_KEY_Return) { return; } progress_bar->set_fraction(0.0); enableWidgets(false); - Glib::ustring current = symbol_set->get_active_text(); - if (current != _("All symbols sets")) { + SPDocument* symbol_document = selectedSymbols(); + if (symbol_document) { + //We are not in search all docs search->set_text(_("Searching...")); - Glib::ustring doc_title = symbol_set->get_active_text(); - if (!doc_title.empty()) { - SPDocument* symbol_document = symbol_sets[doc_title]; - if (current == _("Current Document")) { - symbol_document = current_document; - } - store->clear(); - icons_found = false; - addSymbolsInDoc(symbol_document); - } + store->clear(); + icons_found = false; + addSymbolsInDoc(symbol_document); } else { search->set_text(_("Loading documents...")); } } +void SymbolsDialog::unsensitive(GdkEventKey* evt) +{ + sensitive = true; +} + bool SymbolsDialog::callbackSymbols(){ Glib::ustring current = symbol_set->get_active_text(); if (current == _("All symbols sets") && @@ -914,8 +923,8 @@ bool SymbolsDialog::callbackSymbols(){ counter_symbols ++; gchar const *symbol_title_char = symbol->title(); gchar const *symbol_desc_char = symbol->description(); + bool found = false; if (symbol_title_char) { - bool found = false; Glib::ustring symbol_title = Glib::ustring(symbol_title_char).lowercase(); auto pos = symbol_title.rfind(search_str); if (pos != std::string::npos) { @@ -928,11 +937,12 @@ bool SymbolsDialog::callbackSymbols(){ found = true; } } - if (symbol && (search_str.empty() || found)) { - addSymbol( symbol, doc_title); - icons_found = true; - } } + if (symbol && (search_str.empty() || found || (search_str.empty() && !symbol_title_char))) { + addSymbol( symbol, doc_title); + 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 @@ -957,10 +967,9 @@ bool SymbolsDialog::callbackSymbols(){ overlay->add_overlay(* no_results); overlay->add_overlay(* different); } - bool prev_sensitive = sensitive; sensitive = false; search->set_text(search_str); - sensitive = prev_sensitive; + sensitive = true; enableWidgets(true); return true; } @@ -975,13 +984,11 @@ Glib::ustring SymbolsDialog::ellipsize(Glib::ustring data, size_t limit) { } void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { + if (!symbol_document) { return; //Search all } Glib::ustring doc_title = documentTitle(symbol_document); - if (doc_title.empty()) { - doc_title = _("Untitled document"); ; - } progress_bar->set_fraction(0.0); counter_symbols = 0; std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); @@ -1000,9 +1007,6 @@ void SymbolsDialog::addSymbols() { continue; } Glib::ustring doc_title = documentTitle(symbol_document); - if (doc_title.empty()) { - doc_title = _("Untitled document"); ; - } std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); container_symbols.insert(container_symbols.end(), std::make_move_iterator(container_symbols_tmp.begin()), std::make_move_iterator(container_symbols_tmp.end())); container_symbols_tmp.clear(); @@ -1025,10 +1029,9 @@ void SymbolsDialog::addSymbol( SPObject* symbol, Glib::ustring doc_title) { } Glib::ustring symbol_title = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "Symbol", title) )); if (doc_title.empty()) { - symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" (") +_("Current Document") + Glib::ustring(")")).c_str()))); - } else { - symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" (") + doc_title + Glib::ustring(")")).c_str()))); + doc_title = _("Current Document"); } + symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" (") + doc_title + Glib::ustring(")")).c_str()))); Glib::RefPtr pixbuf = drawSymbol( symbol ); if( pixbuf ) { @@ -1125,8 +1128,9 @@ SymbolsDialog::drawSymbol(SPObject *symbol) if( width == 0.0 ) width = 1.0; if( height == 0.0 ) height = 1.0; - if( fit_symbol->get_active() ) - scale = psize / std::max(width, height); + if( fit_symbol->get_active() ) { + scale = psize / ceil(std::max(width, height)); + } else scale = pow( 2.0, scale_factor/2.0 ) * psize / 32.0; diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index d252b7c71..a77a265b5 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -76,9 +76,9 @@ private: void defsModified(SPObject *object, guint flags); void selectionChanged(Inkscape::Selection *selection); void documentReplaced(SPDesktop *desktop, SPDocument *document); - SPDocument* selectedSymbols(bool ignorecurrent = false); + SPDocument* selectedSymbols(); Glib::ustring selectedSymbolId(); - Glib::ustring selectedSymbolDocTitle(); + Glib::ustring selectedSymbolTitle(); void iconChanged(); void iconDragDataGet(const Glib::RefPtr& context, Gtk::SelectionData& selection_data, guint info, guint time); void getSymbolsFilename(); @@ -91,6 +91,7 @@ private: void useInDoc(SPObject *r, std::vector &l); std::vector useInDoc( SPDocument* document); void beforeSearch(GdkEventKey* evt); + void unsensitive(GdkEventKey* evt); void addSymbols(); void addSymbolsInDoc(SPDocument* document); void clearSearch(); -- cgit v1.2.3 From 625c4435399d3b80902b9cdbd2be3071ca527f77 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sun, 29 Oct 2017 11:18:24 +0100 Subject: Add overlay widgets --- src/ui/dialog/symbols.cpp | 197 +++++++++++++++++++++++++++++++++++++--------- src/ui/dialog/symbols.h | 12 ++- 2 files changed, 167 insertions(+), 42 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index e0aa4cb23..ec1345257 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -108,7 +108,6 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : preview_document(0), instanceConns() { - /******************** Table *************************/ table = new Gtk::Grid(); table->set_margin_left(3); @@ -155,9 +154,10 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : search->set_margin_bottom(6); search->signal_search_changed().connect(sigc::mem_fun(*this, &SymbolsDialog::clearSearch)); table->attach(*Gtk::manage(search),0,row,2,1); + search_str = ""; ++row; - + /********************* Icon View **************************/ SymbolColumns* columns = getColumns(); @@ -192,7 +192,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : overlay->set_vexpand(); overlay->add(* scroller); table->attach(*Gtk::manage(overlay),0,row,2,1); - + ++row; /******************** Progress *******************************/ @@ -305,20 +305,47 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : ++row; - /**********************************************************/ sensitive = true; - search_str = ""; + current_desktop = SP_ACTIVE_DESKTOP; current_document = current_desktop->getDocument(); - preview_document = symbolsPreviewDoc(); /* Template to render symbols in */ preview_document->ensureUpToDate(); /* Necessary? */ - key = SPItem::display_key_new(1); renderDrawing.setRoot(preview_document->getRoot()->invoke_show(renderDrawing, key, SP_ITEM_SHOW_DISPLAY )); // This might need to be a global variable so setTargetDesktop can modify it SPDefs *defs = current_document->getDefs(); + + /*************************Overlays******************************/ + //Loading + overlay_opacity = new Gtk::Image(getStockPixbuf("overlay", 1000)); + overlay_opacity->set_halign(Gtk::ALIGN_START ); + overlay_opacity->set_valign(Gtk::ALIGN_START ); + //No results + noresults_icon = getStockPixbuf("noresults", 90); + search_icon = getStockPixbuf("search", 90); + overlay_icon = new Gtk::Image(noresults_icon); + overlay_icon->set_halign(Gtk::ALIGN_CENTER ); + overlay_icon->set_valign(Gtk::ALIGN_START ); + overlay_icon->set_margin_top(45); + overlay_title = new Gtk::Label(); + overlay_title->set_halign(Gtk::ALIGN_CENTER ); + overlay_title->set_valign(Gtk::ALIGN_START ); + overlay_title->set_justify(Gtk::JUSTIFY_CENTER); + overlay_title->set_margin_top(155); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc = new Gtk::Label(); + overlay_desc->set_halign(Gtk::ALIGN_CENTER ); + overlay_desc->set_valign(Gtk::ALIGN_START ); + overlay_desc->set_margin_top(180); + overlay_desc->set_justify(Gtk::JUSTIFY_CENTER); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a another search or select other set")) + Glib::ustring("")); + overlay->add_overlay(* overlay_opacity); + overlay->add_overlay(* overlay_icon); + overlay->add_overlay(* overlay_title); + overlay->add_overlay(* overlay_desc); + sigc::connection defsModifiedConn = defs->connectModified(sigc::mem_fun(*this, &SymbolsDialog::defsModified)); instanceConns.push_back(defsModifiedConn); @@ -796,7 +823,9 @@ SymbolsDialog::symbolsInDoc( SPDocument* symbol_document, Glib::ustring doc_titl { std::vector > l; - symbolsInDocRecursive (symbol_document->getRoot(), l , doc_title); + if (symbol_document) { + symbolsInDocRecursive (symbol_document->getRoot(), l , doc_title); + } return l; } @@ -893,9 +922,42 @@ void SymbolsDialog::unsensitive(GdkEventKey* evt) bool SymbolsDialog::callbackSymbols(){ Glib::ustring current = symbol_set->get_active_text(); + if (current == _("All symbols sets") && + search->get_text() != _("Loading documents...")) + { + if (!all_docs_processed) { + overlay_opacity->show(); + overlay_icon->set(noresults_icon); + overlay_icon->show(); + overlay_title->show(); + overlay_desc->show(); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Search over all symbols sets")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("This process is slow first time.\nFuture searches dont need this process.\nKeep waiting!")) + Glib::ustring("")); + } + } + if (current == _("Current Document") && !icons_found) { + if (!all_docs_processed) { + overlay_icon->set(noresults_icon); + overlay_opacity->show(); + overlay_icon->show(); + overlay_title->show(); + overlay_desc->show(); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No icons in current document")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You can fill me if you want\nUse add and remove buttons.\nOr drag symbols from other sets")) + Glib::ustring("")); + } + } if (current == _("All symbols sets") && search->get_text() == _("Loading documents...") ) { + overlay_opacity->show(); + if (!all_docs_processed) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Processing all symbols sets")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("This process is slow first time.\nFuture searches dont need this process.\nKeep waiting!")) + Glib::ustring("")); + overlay_icon->show(); + overlay_title->show(); + overlay_icon->set(search_icon); + overlay_desc->show(); + } size_t counter = 0; for(auto const &symbol_document_map : symbol_sets) { ++counter; @@ -911,12 +973,16 @@ bool SymbolsDialog::callbackSymbols(){ progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); return true; } + overlay_icon->hide(); + overlay_title->hide(); + overlay_desc->hide(); progress_bar->set_fraction(1.0); all_docs_processed = true; addSymbols(); search->set_text("Documents done, searchig inside..."); return true; } else if (l.size()) { + overlay_opacity->show(); for (auto symbol_data = l.begin(); symbol_data != l.end();) { Glib::ustring doc_title = symbol_data->first; SPSymbol * symbol = symbol_data->second; @@ -952,20 +1018,17 @@ bool SymbolsDialog::callbackSymbols(){ } } if (!icons_found && !search_str.empty()) { - Gtk::Image* no_results_icon = new Gtk::Image(getSearchPixbuf()); - no_results_icon->set_halign(Gtk::ALIGN_CENTER ); - no_results_icon->set_valign(Gtk::ALIGN_CENTER ); - Gtk::Label* no_results = new Gtk::Label(); - no_results->set_halign(Gtk::ALIGN_CENTER ); - no_results->set_valign(Gtk::ALIGN_CENTER ); - no_results->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - Gtk::Label* different = new Gtk::Label(); - different->set_halign(Gtk::ALIGN_CENTER ); - different->set_valign(Gtk::ALIGN_CENTER ); - different->set_markup(Glib::ustring("") + Glib::ustring(_("Try a different search")) + Glib::ustring("")); - overlay->add_overlay(* no_results_icon); - overlay->add_overlay(* no_results); - overlay->add_overlay(* different); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a another search or select other set")) + Glib::ustring("")); + overlay_icon->set(noresults_icon); + overlay_icon->show(); + overlay_title->show(); + overlay_desc->show(); + } else { + overlay_opacity->hide(); + overlay_icon->hide(); + overlay_title->hide(); + overlay_desc->hide(); } sensitive = false; search->set_text(search_str); @@ -995,6 +1058,16 @@ void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { number_symbols = container_symbols_tmp.size(); l = container_symbols_tmp; container_symbols_tmp.clear(); + if (!number_symbols) { + overlay_icon->set(noresults_icon); + overlay_icon->show(); + overlay_title->show(); + overlay_desc->show(); + sensitive = false; + search->set_text(search_str); + sensitive = true; + enableWidgets(true); + } } void SymbolsDialog::addSymbols() { @@ -1016,6 +1089,16 @@ void SymbolsDialog::addSymbols() { number_symbols = container_symbols.size(); l = container_symbols; container_symbols.clear(); + if (!number_symbols) { + overlay_icon->set(noresults_icon); + overlay_icon->show(); + overlay_title->show(); + overlay_desc->show(); + sensitive = false; + search->set_text(search_str); + sensitive = true; + enableWidgets(true); + } } void SymbolsDialog::addSymbol( SPObject* symbol, Glib::ustring doc_title) { @@ -1055,7 +1138,7 @@ void SymbolsDialog::addSymbol( SPObject* symbol, Glib::ustring doc_title) { * the temporary document is rendered. */ Glib::RefPtr -SymbolsDialog::drawSymbol(SPObject *symbol) +SymbolsDialog::drawSymbol(SPObject *symbol, unsigned force_psize) { // Create a copy repr of the symbol with id="the_symbol" Inkscape::XML::Document *xml_doc = preview_document->getReprDoc(); @@ -1128,12 +1211,16 @@ SymbolsDialog::drawSymbol(SPObject *symbol) if( width == 0.0 ) width = 1.0; if( height == 0.0 ) height = 1.0; - if( fit_symbol->get_active() ) { - scale = psize / ceil(std::max(width, height)); - } + if( fit_symbol->get_active() ) + scale = psize / ceil(std::max(width, height)); else scale = pow( 2.0, scale_factor/2.0 ) * psize / 32.0; + if (force_psize > 0) { + psize = force_psize; + scale = psize / ceil(std::max(width, height)); + } + pixbuf = Glib::wrap(render_pixbuf(renderDrawing, scale, *dbox, psize)); } @@ -1165,32 +1252,64 @@ SPDocument* SymbolsDialog::symbolsPreviewDoc() * Return search symbol pixbuf */ Glib::RefPtr -SymbolsDialog::getSearchPixbuf() +SymbolsDialog::getStockPixbuf(gchar const * symbol_title, unsigned psize) { - // BUG: must be inside gchar const *buffer = "" +" Inkscape " " " " " +" id=\"search\">" " Search Taiga Icon" +" id=\"search_title\">Search" +" From Taiga Icon Set" " " +" style=\"fill:#dddddd;stroke:none\"" +" d=\"m 296.87191,139.51013 c -42.96864,0 -77.93812,28.58932 -77.93812,63.7203 0,35.13101 34.96894,63.72102 77.93812,63.72102 18.73068,0 35.93889,-5.43504 49.39552,-14.4736 l 50.71196,41.46091 8.86813,-7.2504 -50.55612,-41.33356 c 12.13855,-11.23867 19.51775,-25.99037 19.51775,-42.12437 0,-35.13098 -34.96854,-63.7203 -77.93724,-63.7203 z m 0,10.25413 c 36.19119,0 65.3962,23.87692 65.3962,53.46617 0,29.58969 -29.20519,53.46706 -65.3962,53.46706 -36.19149,0 -65.39616,-23.87737 -65.39616,-53.46706 0,-29.58939 29.20467,-53.46685 65.39616,-53.46685 z\"" +" id=\"search_shape_1\" />" +" " +" " +" Overlay" +" Overlay Square" +" " +" " +" " +" No Results" +" No results" +" " " " " " ""; SPDocument* doc = SPDocument::createNewDocFromMem( buffer, strlen(buffer), FALSE ); - std::vector > l = symbolsInDoc(doc, "Search Taiga Icon"); - int prev_scale_factor = scale_factor; - scale_factor = 10; - Glib::RefPtr pb = drawSymbol(l[0].second); - scale_factor = prev_scale_factor; - return pb; + std::vector > symbols_data = symbolsInDoc(doc, "Search Taiga Icon"); + Glib::RefPtr pixbuf(NULL); + for(auto data:symbols_data) { + Glib::ustring doc_title = data.first; + SPSymbol * symbol = data.second; + if (!strcmp(symbol->getId(),symbol_title)) { + pixbuf = drawSymbol(symbol, psize); + return pixbuf; + } + } + //Fallback if errors + return pixbuf; } void SymbolsDialog::setTargetDesktop(SPDesktop *desktop) diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index a77a265b5..3a007aba8 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -99,12 +99,14 @@ private: void enableWidgets(bool enable); Glib::ustring ellipsize(Glib::ustring data, size_t limit = 40); gchar const* styleFromUse( gchar const* id, SPDocument* document); - Glib::RefPtr drawSymbol(SPObject *symbol); - Glib::RefPtr getSearchPixbuf(); + Glib::RefPtr drawSymbol(SPObject *symbol, unsigned force_psize = 0); + Glib::RefPtr getStockPixbuf(gchar const * symbol_title, unsigned psize); /* Keep track of all symbol template documents */ std::map symbol_sets; std::vector > l; // Index into sizes which is selected + Glib::RefPtr noresults_icon; + Glib::RefPtr search_icon; int pack_size; // Scale factor int scale_factor; @@ -128,10 +130,14 @@ private: Gtk::Button* more; Gtk::Button* fewer; Gtk::HBox* tools; + Gtk::Overlay* overlay; + Gtk::Image* overlay_icon; + Gtk::Image* overlay_opacity; + Gtk::Label* overlay_title; + Gtk::Label* overlay_desc; Gtk::Grid* table; Gtk::ScrolledWindow *scroller; Gtk::ToggleButton* fit_symbol; - Gtk::Overlay* overlay; void setTargetDesktop(SPDesktop *desktop); SPDesktop* current_desktop; -- cgit v1.2.3 From 0af8e9ec59bd4bde68da4b74cba74ff986344176 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sun, 29 Oct 2017 22:19:49 +0100 Subject: Add search and no results from stock icons. Improve text. Thanks Maren for the inputs --- src/ui/dialog/symbols.cpp | 109 +++++++++++++++++++++------------------------- src/ui/dialog/symbols.h | 5 ++- 2 files changed, 52 insertions(+), 62 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index ec1345257..082993158 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -319,12 +319,14 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : /*************************Overlays******************************/ //Loading - overlay_opacity = new Gtk::Image(getStockPixbuf("overlay", 1000)); + overlay_opacity = new Gtk::Image(); + overlay_opacity->set(getOverlay(overlay_opacity, "overlay", 1000)); overlay_opacity->set_halign(Gtk::ALIGN_START ); overlay_opacity->set_valign(Gtk::ALIGN_START ); //No results - noresults_icon = getStockPixbuf("noresults", 90); - search_icon = getStockPixbuf("search", 90); + iconsize = Gtk::IconSize().register_new(Glib::ustring("ICON_SIZE_DIALOG_EXTRA"), 110, 110); + overlay_icon = new Gtk::Image(); + overlay_icon->set_from_icon_name("none", iconsize); overlay_icon = new Gtk::Image(noresults_icon); overlay_icon->set_halign(Gtk::ALIGN_CENTER ); overlay_icon->set_valign(Gtk::ALIGN_START ); @@ -478,15 +480,18 @@ void SymbolsDialog::defsModified(SPObject * /*object*/, guint /*flags*/) void SymbolsDialog::selectionChanged(Inkscape::Selection *selection) { Glib::ustring symbol_id = selectedSymbolId(); - SPDocument* symbol_document = symbol_sets[selectedSymbolTitle()]; - if (!symbol_document) { - //we are in global search so get the original symbol document by title - symbol_document = selectedSymbols(); - } - if (symbol_document) { - SPObject* symbol = symbol_document->getObjectById(symbol_id); - if(symbol && !selection->includes(symbol)) { - icon_view->unselect_all(); + Glib::ustring doc_title = selectedSymbolDocTitle(); + if (!doc_title.empty()) { + SPDocument* symbol_document = symbol_sets[doc_title]; + if (!symbol_document) { + //we are in global search so get the original symbol document by title + symbol_document = selectedSymbols(); + } + if (symbol_document) { + SPObject* symbol = symbol_document->getObjectById(symbol_id); + if(symbol && !selection->includes(symbol)) { + icon_view->unselect_all(); + } } } } @@ -534,7 +539,7 @@ Glib::ustring SymbolsDialog::selectedSymbolId() { return Glib::ustring(""); } -Glib::ustring SymbolsDialog::selectedSymbolTitle() { +Glib::ustring SymbolsDialog::selectedSymbolDocTitle() { auto iconArray = icon_view->get_selected_items(); @@ -568,7 +573,10 @@ void SymbolsDialog::iconChanged() { SPDocument* symbol_document = selectedSymbols(); if (!symbol_document) { //we are in global search so get the original symbol document by title - symbol_document = symbol_sets[selectedSymbolTitle()]; + Glib::ustring doc_title = selectedSymbolDocTitle(); + if (!doc_title.empty()) { + symbol_document = symbol_sets[doc_title]; + } } if (symbol_document) { SPObject* symbol = symbol_document->getObjectById(symbol_id); @@ -927,23 +935,23 @@ bool SymbolsDialog::callbackSymbols(){ { if (!all_docs_processed) { overlay_opacity->show(); - overlay_icon->set(noresults_icon); + overlay_icon->set_from_icon_name("none", iconsize); overlay_icon->show(); overlay_title->show(); overlay_desc->show(); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Search over all symbols sets")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("This process is slow first time.\nFuture searches dont need this process.\nKeep waiting!")) + Glib::ustring("")); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); } } if (current == _("Current Document") && !icons_found) { if (!all_docs_processed) { - overlay_icon->set(noresults_icon); + overlay_icon->set_from_icon_name("none", iconsize); overlay_opacity->show(); overlay_icon->show(); overlay_title->show(); overlay_desc->show(); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No icons in current document")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You can fill me if you want\nUse add and remove buttons.\nOr drag symbols from other sets")) + Glib::ustring("")); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); } } if (current == _("All symbols sets") && @@ -951,11 +959,11 @@ bool SymbolsDialog::callbackSymbols(){ { overlay_opacity->show(); if (!all_docs_processed) { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Processing all symbols sets")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("This process is slow first time.\nFuture searches dont need this process.\nKeep waiting!")) + Glib::ustring("")); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); overlay_icon->show(); overlay_title->show(); - overlay_icon->set(search_icon); + overlay_icon->set_from_icon_name("searching", iconsize); overlay_desc->show(); } size_t counter = 0; @@ -983,6 +991,9 @@ bool SymbolsDialog::callbackSymbols(){ return true; } else if (l.size()) { overlay_opacity->show(); + overlay_icon->hide(); + overlay_title->hide(); + overlay_desc->hide(); for (auto symbol_data = l.begin(); symbol_data != l.end();) { Glib::ustring doc_title = symbol_data->first; SPSymbol * symbol = symbol_data->second; @@ -1019,16 +1030,13 @@ bool SymbolsDialog::callbackSymbols(){ } if (!icons_found && !search_str.empty()) { overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a another search or select other set")) + Glib::ustring("")); - overlay_icon->set(noresults_icon); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); + overlay_icon->set_from_icon_name("none", iconsize); overlay_icon->show(); overlay_title->show(); overlay_desc->show(); } else { overlay_opacity->hide(); - overlay_icon->hide(); - overlay_title->hide(); - overlay_desc->hide(); } sensitive = false; search->set_text(search_str); @@ -1059,8 +1067,10 @@ void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { l = container_symbols_tmp; container_symbols_tmp.clear(); if (!number_symbols) { - overlay_icon->set(noresults_icon); + overlay_icon->set_from_icon_name("none", iconsize); overlay_icon->show(); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); overlay_title->show(); overlay_desc->show(); sensitive = false; @@ -1090,7 +1100,9 @@ void SymbolsDialog::addSymbols() { l = container_symbols; container_symbols.clear(); if (!number_symbols) { - overlay_icon->set(noresults_icon); + overlay_icon->set_from_icon_name("none", iconsize); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); overlay_icon->show(); overlay_title->show(); overlay_desc->show(); @@ -1249,12 +1261,12 @@ SPDocument* SymbolsDialog::symbolsPreviewDoc() } /* - * Return search symbol pixbuf + * Update image widgets */ -Glib::RefPtr -SymbolsDialog::getStockPixbuf(gchar const * symbol_title, unsigned psize) +Glib::RefPtr +SymbolsDialog::getOverlay(Gtk::Image* image, gchar const * icon_title, unsigned psize) { - gchar const *buffer = +gchar const *buffer = "Inkscape " " " " " -" Search" -" From Taiga Icon Set" -" " -" " -" " " Overlay" " Overlay Square" " " " " -" " -" No Results" -" No results" -" " -" " " " ""; SPDocument* doc = SPDocument::createNewDocFromMem( buffer, strlen(buffer), FALSE ); - std::vector > symbols_data = symbolsInDoc(doc, "Search Taiga Icon"); + std::vector > symbols_data = symbolsInDoc(doc, "Overlay Doc"); Glib::RefPtr pixbuf(NULL); for(auto data:symbols_data) { Glib::ustring doc_title = data.first; SPSymbol * symbol = data.second; - if (!strcmp(symbol->getId(),symbol_title)) { + if (!strcmp(symbol->getId(), icon_title)) { pixbuf = drawSymbol(symbol, psize); return pixbuf; } } - //Fallback if errors return pixbuf; } diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 3a007aba8..1bddc5b2c 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -78,7 +78,7 @@ private: void documentReplaced(SPDesktop *desktop, SPDocument *document); SPDocument* selectedSymbols(); Glib::ustring selectedSymbolId(); - Glib::ustring selectedSymbolTitle(); + Glib::ustring selectedSymbolDocTitle(); void iconChanged(); void iconDragDataGet(const Glib::RefPtr& context, Gtk::SelectionData& selection_data, guint info, guint time); void getSymbolsFilename(); @@ -100,7 +100,7 @@ private: Glib::ustring ellipsize(Glib::ustring data, size_t limit = 40); gchar const* styleFromUse( gchar const* id, SPDocument* document); Glib::RefPtr drawSymbol(SPObject *symbol, unsigned force_psize = 0); - Glib::RefPtr getStockPixbuf(gchar const * symbol_title, unsigned psize); + Glib::RefPtr getOverlay(Gtk::Image* image, gchar const * icon_title, unsigned psize); /* Keep track of all symbol template documents */ std::map symbol_sets; std::vector > l; @@ -138,6 +138,7 @@ private: Gtk::Grid* table; Gtk::ScrolledWindow *scroller; Gtk::ToggleButton* fit_symbol; + Gtk::IconSize iconsize; void setTargetDesktop(SPDesktop *desktop); SPDesktop* current_desktop; -- cgit v1.2.3 From 7883844354e236e287bf33076190b270366ff8ee Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Fri, 3 Nov 2017 19:59:00 +0100 Subject: Minor tweak to symbols search UX --- src/ui/dialog/symbols.cpp | 8 ++++---- src/ui/dialog/symbols.h | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 082993158..2380ba56f 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -168,7 +168,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : icon_view->set_pixbuf_column( columns->symbol_image ); // Giving the iconview a small minimum size will help users understand // What the dialog does. - icon_view->set_size_request( 100, 200 ); + icon_view->set_size_request( 100, 250 ); std::vector< Gtk::TargetEntry > targets; targets.push_back(Gtk::TargetEntry( "application/x-inkscape-paste")); @@ -191,6 +191,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : overlay->set_hexpand(); overlay->set_vexpand(); overlay->add(* scroller); + scroller->set_size_request(100, 250); table->attach(*Gtk::manage(overlay),0,row,2,1); ++row; @@ -327,7 +328,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : iconsize = Gtk::IconSize().register_new(Glib::ustring("ICON_SIZE_DIALOG_EXTRA"), 110, 110); overlay_icon = new Gtk::Image(); overlay_icon->set_from_icon_name("none", iconsize); - overlay_icon = new Gtk::Image(noresults_icon); + overlay_icon = new Gtk::Image(); overlay_icon->set_halign(Gtk::ALIGN_CENTER ); overlay_icon->set_valign(Gtk::ALIGN_START ); overlay_icon->set_margin_top(45); @@ -364,11 +365,11 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); addSymbolsInDoc(current_document); /* Defaults to current document */ - sigc::connection desktopChangeConn = desk_track.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); instanceConns.push_back( desktopChangeConn ); desk_track.connect(GTK_WIDGET(gobj())); + overlay->hide(); } SymbolsDialog::~SymbolsDialog() @@ -820,7 +821,6 @@ void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::vector(r) ) { l.push_back(std::make_pair(doc_title,dynamic_cast(r))); } - for (auto& child: r->children) { symbolsInDocRecursive(&child, l, doc_title); } diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 1bddc5b2c..13ba9caf9 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -105,8 +105,6 @@ private: std::map symbol_sets; std::vector > l; // Index into sizes which is selected - Glib::RefPtr noresults_icon; - Glib::RefPtr search_icon; int pack_size; // Scale factor int scale_factor; -- cgit v1.2.3 From a97a9d336818d0efc675c0578f8d02136f0836e7 Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Fri, 3 Nov 2017 23:52:11 +0100 Subject: Add Ignore Gtk::Overlay if GTK=3.0 --- src/ui/dialog/symbols.cpp | 34 +++++++++++++++++++++++++++++----- src/ui/dialog/symbols.h | 3 ++- 2 files changed, 31 insertions(+), 6 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 2380ba56f..727fdf4f2 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -108,13 +108,14 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : preview_document(0), instanceConns() { - /******************** Table *************************/ - table = new Gtk::Grid(); + + /******************** Table *************************/ + auto table = new Gtk::Grid(); table->set_margin_left(3); table->set_margin_right(3); table->set_margin_top(4); // panel is a cloked Gtk::VBox - _getContents()->pack_start(* Gtk::manage(table), Gtk::PACK_EXPAND_WIDGET); + _getContents()->pack_start(*Gtk::manage(table), Gtk::PACK_EXPAND_WIDGET); guint row = 0; /******************** Symbol Sets *************************/ @@ -125,6 +126,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : symbol_set->append(_("All symbols sets")); symbol_set->set_active_text(_("Current Document")); symbol_set->set_hexpand(); + table->attach(*Gtk::manage(symbol_set),1,row,1,1); sigc::connection connSet = symbol_set->signal_changed().connect( sigc::mem_fun(*this, &SymbolsDialog::rebuild)); @@ -187,13 +189,16 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : scroller->add(*Gtk::manage(icon_view)); scroller->set_hexpand(); scroller->set_vexpand(); +#if GTK_CHECK_VERSION(3,2,4) overlay = new Gtk::Overlay(); overlay->set_hexpand(); overlay->set_vexpand(); overlay->add(* scroller); scroller->set_size_request(100, 250); table->attach(*Gtk::manage(overlay),0,row,2,1); - +#else + table->attach(*Gtk::manage(scroller),0,row,2,1); +#endif ++row; /******************** Progress *******************************/ @@ -319,6 +324,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : SPDefs *defs = current_document->getDefs(); /*************************Overlays******************************/ +#if GTK_CHECK_VERSION(3,2,4) //Loading overlay_opacity = new Gtk::Image(); overlay_opacity->set(getOverlay(overlay_opacity, "overlay", 1000)); @@ -348,7 +354,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : overlay->add_overlay(* overlay_icon); overlay->add_overlay(* overlay_title); overlay->add_overlay(* overlay_desc); - +#endif sigc::connection defsModifiedConn = defs->connectModified(sigc::mem_fun(*this, &SymbolsDialog::defsModified)); instanceConns.push_back(defsModifiedConn); @@ -369,7 +375,9 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : desk_track.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); instanceConns.push_back( desktopChangeConn ); desk_track.connect(GTK_WIDGET(gobj())); +#if GTK_CHECK_VERSION(3,2,4) overlay->hide(); +#endif } SymbolsDialog::~SymbolsDialog() @@ -930,6 +938,7 @@ void SymbolsDialog::unsensitive(GdkEventKey* evt) bool SymbolsDialog::callbackSymbols(){ Glib::ustring current = symbol_set->get_active_text(); +#if GTK_CHECK_VERSION(3,2,4) if (current == _("All symbols sets") && search->get_text() != _("Loading documents...")) { @@ -954,17 +963,22 @@ bool SymbolsDialog::callbackSymbols(){ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); } } +#endif if (current == _("All symbols sets") && search->get_text() == _("Loading documents...") ) { +#if GTK_CHECK_VERSION(3,2,4) overlay_opacity->show(); +#endif if (!all_docs_processed) { +#if GTK_CHECK_VERSION(3,2,4) overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); overlay_icon->show(); overlay_title->show(); overlay_icon->set_from_icon_name("searching", iconsize); overlay_desc->show(); +#endif } size_t counter = 0; for(auto const &symbol_document_map : symbol_sets) { @@ -981,19 +995,23 @@ bool SymbolsDialog::callbackSymbols(){ progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); return true; } +#if GTK_CHECK_VERSION(3,2,4) overlay_icon->hide(); overlay_title->hide(); overlay_desc->hide(); +#endif progress_bar->set_fraction(1.0); all_docs_processed = true; addSymbols(); search->set_text("Documents done, searchig inside..."); return true; } else if (l.size()) { +#if GTK_CHECK_VERSION(3,2,4) overlay_opacity->show(); overlay_icon->hide(); overlay_title->hide(); overlay_desc->hide(); +#endif for (auto symbol_data = l.begin(); symbol_data != l.end();) { Glib::ustring doc_title = symbol_data->first; SPSymbol * symbol = symbol_data->second; @@ -1028,6 +1046,7 @@ bool SymbolsDialog::callbackSymbols(){ return true; } } +#if GTK_CHECK_VERSION(3,2,4) if (!icons_found && !search_str.empty()) { overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); @@ -1038,6 +1057,7 @@ bool SymbolsDialog::callbackSymbols(){ } else { overlay_opacity->hide(); } +#endif sensitive = false; search->set_text(search_str); sensitive = true; @@ -1067,12 +1087,14 @@ void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { l = container_symbols_tmp; container_symbols_tmp.clear(); if (!number_symbols) { +#if GTK_CHECK_VERSION(3,2,4) overlay_icon->set_from_icon_name("none", iconsize); overlay_icon->show(); overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); overlay_title->show(); overlay_desc->show(); +#endif sensitive = false; search->set_text(search_str); sensitive = true; @@ -1100,12 +1122,14 @@ void SymbolsDialog::addSymbols() { l = container_symbols; container_symbols.clear(); if (!number_symbols) { +#if GTK_CHECK_VERSION(3,2,4) overlay_icon->set_from_icon_name("none", iconsize); overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); overlay_icon->show(); overlay_title->show(); overlay_desc->show(); +#endif sensitive = false; search->set_text(search_str); sensitive = true; diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 13ba9caf9..ebd56d5e0 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -128,12 +128,13 @@ private: Gtk::Button* more; Gtk::Button* fewer; Gtk::HBox* tools; +#if GTK_CHECK_VERSION(3,2,4) Gtk::Overlay* overlay; +#endif Gtk::Image* overlay_icon; Gtk::Image* overlay_opacity; Gtk::Label* overlay_title; Gtk::Label* overlay_desc; - Gtk::Grid* table; Gtk::ScrolledWindow *scroller; Gtk::ToggleButton* fit_symbol; Gtk::IconSize iconsize; -- cgit v1.2.3 From c51823602c76838600f21683fce839b3938ffc25 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Sat, 4 Nov 2017 10:31:30 +0100 Subject: Remove need to restart Inkscape when changing tile multiplier. Increase default and maximum values of tile multiplier. --- src/ui/dialog/inkscape-preferences.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index 09ba06720..0801ae0a1 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -1420,8 +1420,9 @@ void InkscapePreferences::initPageRendering() _page_rendering.add_line( false, _("Rendering _cache size:"), _rendering_cache_size, C_("mebibyte (2^20 bytes) abbreviation","MiB"), _("Set the amount of memory per document which can be used to store rendered parts of the drawing for later reuse; set to zero to disable caching"), false); // rendering tile multiplier - _rendering_tile_multiplier.init("/options/rendering/tile-multiplier", 1.0, 64.0, 1.0, 4.0, 1.0, true, false); - _page_rendering.add_line( false, _("Rendering tile multiplier:"), _rendering_tile_multiplier, _("requires restart"), _("Set the relative size of tiles used to render the canvas. The larger the value, the bigger the tile size."), false); + _rendering_tile_multiplier.init("/options/rendering/tile-multiplier", 1.0, 512.0, 1.0, 16.0, 16.0, true, false); + _page_rendering.add_line( false, _("Rendering tile multiplier:"), _rendering_tile_multiplier, _(""), + _("Set the relative size of tiles used to render the canvas. The larger the value, the bigger the tile size."), false); /* blur quality */ _blur_quality_best.init ( _("Best quality (slowest)"), "/options/blurquality/value", -- cgit v1.2.3 From d79e73eff64fffc67a971641b5fa0a5b711f3360 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sat, 4 Nov 2017 14:23:08 +0100 Subject: Make color selector visible hover white backgrounds if the selected color is opaque white --- src/ui/widget/color-picker.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/ui') diff --git a/src/ui/widget/color-picker.cpp b/src/ui/widget/color-picker.cpp index 5a62c3c98..5c6820e83 100644 --- a/src/ui/widget/color-picker.cpp +++ b/src/ui/widget/color-picker.cpp @@ -33,7 +33,6 @@ ColorPicker::ColorPicker (const Glib::ustring& title, const Glib::ustring& tip, _colorSelectorDialog("dialogs.colorpickerwindow") { setupDialog(title); - set_relief (Gtk::RELIEF_NONE); _preview.show(); add (_preview); set_tooltip_text (tip); -- cgit v1.2.3 From 8d8f6375dcb32493a426ba8901467171fa2627e9 Mon Sep 17 00:00:00 2001 From: Simon Wells Date: Sun, 5 Nov 2017 12:51:54 +1300 Subject: added braces as specified in the coding standard --- src/ui/tools/select-tool.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/ui') diff --git a/src/ui/tools/select-tool.cpp b/src/ui/tools/select-tool.cpp index 3dfb764bb..2468575c6 100644 --- a/src/ui/tools/select-tool.cpp +++ b/src/ui/tools/select-tool.cpp @@ -397,11 +397,13 @@ void SelectTool::sp_select_context_cycle_through_items(Inkscape::Selection *sele next = std::find( cycling_items.begin(), cycling_items.end(), cycling_cur_item ); g_assert (next != cycling_items.end()); next++; - if (next == cycling_items.end()) - if ( cycling_wrap ) + if (next == cycling_items.end()) { + if ( cycling_wrap ) { next = cycling_items.begin(); - else + } else { next--; + } + } } } else { if (! cycling_cur_item) { -- cgit v1.2.3 From 0ee0c59c2fefac7b98a9b951c06f03786f3d0af2 Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Mon, 6 Nov 2017 20:19:35 +0100 Subject: Fixes to Filter Dialog --- src/ui/dialog/filter-effects-dialog.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/filter-effects-dialog.cpp b/src/ui/dialog/filter-effects-dialog.cpp index bef37215a..e60785f57 100644 --- a/src/ui/dialog/filter-effects-dialog.cpp +++ b/src/ui/dialog/filter-effects-dialog.cpp @@ -1749,7 +1749,6 @@ FilterEffectsDialog::PrimitiveList::PrimitiveList(FilterEffectsDialog& d) _in_drag(0), _observer(new Inkscape::XML::SignalObserver) { - d.signal_draw().connect(sigc::mem_fun(*this, &PrimitiveList::on_draw_signal)); signal_draw().connect(sigc::mem_fun(*this, &PrimitiveList::on_draw_signal)); add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK); @@ -1926,7 +1925,7 @@ bool FilterEffectsDialog::PrimitiveList::on_draw_signal(const Cairo::RefPtrset_text(_(FPInputConverter.get_label((FilterPrimitiveInput)i).c_str())); const int x = text_start_x + get_input_type_width() * i; cr->save(); - cr->rectangle(x, 0, get_input_type_width(), vis.get_height()); gdk_cairo_set_source_rgba(cr->cobj(), &bg_color); + cr->rectangle(x, 0, get_input_type_width(), vis.get_height()); cr->fill_preserve(); gdk_cairo_set_source_rgba(cr->cobj(), &fg_color); - cr->move_to(x+get_input_type_width(), 0); + cr->move_to(x + get_input_type_width(), 5); cr->rotate_degrees(90); _vertical_layout->show_in_cairo_context(cr); @@ -1974,6 +1972,8 @@ bool FilterEffectsDialog::PrimitiveList::on_draw_signal(const Cairo::RefPtrstroke(); cr->restore(); } + cr->rectangle(vis.get_x(), 0, vis.get_width(), vis.get_height()); + cairo_clip(cr->cobj()); } int row_index = 0; @@ -1993,6 +1993,7 @@ bool FilterEffectsDialog::PrimitiveList::on_draw_signal(const Cairo::RefPtrget_device_manager(); auto device = dm->get_client_pointer(); #endif + cairo_set_line_width (cr->cobj(),0.5); get_bin_window()->get_device_position(device, mx, my, mask); // Outline the bottom of the connection area @@ -2001,7 +2002,7 @@ bool FilterEffectsDialog::PrimitiveList::on_draw_signal(const Cairo::RefPtrcobj(), &mid_color); - cr->move_to(x, y + h); + cr->move_to(vis.get_x(), y + h); cr->line_to(outline_x, y + h); // Side outline cr->line_to(outline_x, y - 1); @@ -2023,7 +2024,7 @@ bool FilterEffectsDialog::PrimitiveList::on_draw_signal(const Cairo::RefPtrsave(); gdk_cairo_set_source_rgba(cr->cobj(), - inside && mask & GDK_BUTTON1_MASK ? + (inside && mask & GDK_BUTTON1_MASK) ? &mid_color : &mid_color_active); @@ -2052,7 +2053,7 @@ bool FilterEffectsDialog::PrimitiveList::on_draw_signal(const Cairo::RefPtrsave(); gdk_cairo_set_source_rgba(cr->cobj(), - inside && mask & GDK_BUTTON1_MASK ? + (inside && mask & GDK_BUTTON1_MASK) ? &mid_color : &mid_color_active); @@ -2078,7 +2079,7 @@ bool FilterEffectsDialog::PrimitiveList::on_draw_signal(const Cairo::RefPtrsave(); gdk_cairo_set_source_rgba(cr->cobj(), - inside && mask & GDK_BUTTON1_MASK ? + (inside && mask & GDK_BUTTON1_MASK) ? &mid_color : &mid_color_active); @@ -2628,8 +2629,8 @@ FilterEffectsDialog::FilterEffectsDialog() _sizegroup = Gtk::SizeGroup::create(Gtk::SIZE_GROUP_HORIZONTAL); // Initialize widget hierarchy - auto hpaned = Gtk::manage(new Gtk::Paned); - _primitive_box = Gtk::manage(new Gtk::Paned); + auto hpaned = Gtk::manage(new Gtk::Paned()); + _primitive_box = Gtk::manage(new Gtk::Paned(Gtk::ORIENTATION_VERTICAL)); _sw_infobox = Gtk::manage(new Gtk::ScrolledWindow); Gtk::ScrolledWindow* sw_prims = Gtk::manage(new Gtk::ScrolledWindow); @@ -2659,7 +2660,7 @@ FilterEffectsDialog::FilterEffectsDialog() _infobox_desc.set_valign(Gtk::ALIGN_START); _infobox_desc.set_justify(Gtk::JUSTIFY_LEFT); _infobox_desc.set_line_wrap(true); - _infobox_desc.set_size_request(200, -1); + _infobox_desc.set_size_request(300, -1); vb_desc->pack_start(_infobox_desc, true, true); @@ -2667,7 +2668,7 @@ FilterEffectsDialog::FilterEffectsDialog() infobox->pack_start(*vb_desc, true, true); //_sw_infobox->set_size_request(-1, -1); - _sw_infobox->set_size_request(200, -1); + _sw_infobox->set_size_request(300, -1); _sw_infobox->add(*infobox); //vb_prims->set_size_request(-1, 50); -- cgit v1.2.3 From 97f5dce9b826bcb8cf57b99e9961c725db3e7063 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Tue, 7 Nov 2017 02:06:23 +0100 Subject: Fixes to CPU --- src/ui/dialog/symbols.cpp | 11 ++++++++--- src/ui/dialog/symbols.h | 4 +++- 2 files changed, 11 insertions(+), 4 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 727fdf4f2..51d801d6a 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -368,8 +368,6 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : getSymbolsFilename(); icons_found = false; - Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); - addSymbolsInDoc(current_document); /* Defaults to current document */ sigc::connection desktopChangeConn = desk_track.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); @@ -385,6 +383,7 @@ SymbolsDialog::~SymbolsDialog() for (std::vector::iterator it = instanceConns.begin(); it != instanceConns.end(); ++it) { it->disconnect(); } + idleconn.disconnect(); instanceConns.clear(); desk_track.disconnect(); } @@ -447,6 +446,8 @@ void SymbolsDialog::rebuild() { search->set_text(""); } if (symbol_document) { + idleconn.disconnect(); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); addSymbolsInDoc(symbol_document); } } @@ -895,6 +896,8 @@ void SymbolsDialog::clearSearch() SPDocument* symbol_document = selectedSymbols(); if (symbol_document) { //We are not in search all docs + idleconn.disconnect(); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); icons_found = false; addSymbolsInDoc(symbol_document); } else { @@ -920,6 +923,8 @@ void SymbolsDialog::beforeSearch(GdkEventKey* evt) progress_bar->set_fraction(0.0); enableWidgets(false); SPDocument* symbol_document = selectedSymbols(); + idleconn.disconnect(); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); if (symbol_document) { //We are not in search all docs search->set_text(_("Searching...")); @@ -1062,7 +1067,7 @@ bool SymbolsDialog::callbackSymbols(){ search->set_text(search_str); sensitive = true; enableWidgets(true); - return true; + return false; } return true; } diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index ebd56d5e0..a4d1f93fb 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -144,7 +144,9 @@ private: DesktopTracker desk_track; SPDocument* current_document; SPDocument* preview_document; /* Document to render single symbol */ - + + sigc::connection idleconn; + /* For rendering the template drawing */ unsigned key; Inkscape::Drawing renderDrawing; -- cgit v1.2.3 From 2659ce5a325688a3db9900d6d662e92048f0539e Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 7 Nov 2017 13:55:26 -0500 Subject: Misc. typos Found using `codespell -q 3 -w --skip="*.svg,*.po,*.ts,./share/tutorials,./src/libavoid,./packaging/win32/languages,./man,./src/2geom" -I ../inkscape-whitelist.txt` whereby whitelist file contained: ``` dum iff glight substract te upto ``` --- src/ui/clipboard.cpp | 2 +- src/ui/dialog/align-and-distribute.cpp | 2 +- src/ui/dialog/align-and-distribute.h | 2 +- src/ui/dialog/dock-behavior.h | 2 +- src/ui/dialog/document-properties.cpp | 2 +- src/ui/dialog/extension-editor.cpp | 2 +- src/ui/dialog/filedialog.h | 2 +- src/ui/dialog/filedialogimpl-gtkmm.cpp | 6 +++--- src/ui/dialog/filedialogimpl-gtkmm.h | 2 +- src/ui/dialog/filedialogimpl-win32.cpp | 4 ++-- src/ui/dialog/font-substitution.cpp | 2 +- src/ui/dialog/grid-arrange-tab.cpp | 2 +- src/ui/dialog/input.cpp | 2 +- src/ui/dialog/ocaldialogs.cpp | 4 ++-- src/ui/dialog/polar-arrange-tab.cpp | 2 +- src/ui/dialog/print-colors-preview-dialog.cpp | 2 +- src/ui/dialog/styledialog.cpp | 4 ++-- src/ui/dialog/xml-tree.cpp | 4 ++-- src/ui/tool/node.cpp | 12 ++++++------ src/ui/tool/path-manipulator.cpp | 2 +- src/ui/tools/gradient-tool.cpp | 2 +- src/ui/tools/measure-tool.cpp | 2 +- src/ui/widget/color-notebook.cpp | 2 +- src/ui/widget/font-variants.cpp | 2 +- src/ui/widget/object-composite-settings.cpp | 2 +- src/ui/widget/panel.h | 2 +- 26 files changed, 37 insertions(+), 37 deletions(-) (limited to 'src/ui') diff --git a/src/ui/clipboard.cpp b/src/ui/clipboard.cpp index 33ad4401c..dbeee644c 100644 --- a/src/ui/clipboard.cpp +++ b/src/ui/clipboard.cpp @@ -656,7 +656,7 @@ Glib::ustring ClipboardManagerImpl::getShapeOrTextObjectId(SPDesktop *desktop) /** * Get all objects id from the clipboard. * @return A vector containing all IDs or empty if no shape or text item was found. - * type. Set to "*" to retrive all elements of the types vector inside, feel free to populate more + * type. Set to "*" to retrieve all elements of the types vector inside, feel free to populate more */ std::vector ClipboardManagerImpl::getElementsOfType(SPDesktop *desktop, gchar const* type) { diff --git a/src/ui/dialog/align-and-distribute.cpp b/src/ui/dialog/align-and-distribute.cpp index 27bfa681f..52f31e046 100644 --- a/src/ui/dialog/align-and-distribute.cpp +++ b/src/ui/dialog/align-and-distribute.cpp @@ -275,7 +275,7 @@ public : private : virtual void on_button_click() { - //Retreive selected objects + //Retrieve selected objects SPDesktop *desktop = _dialog.getDesktop(); if (!desktop) return; diff --git a/src/ui/dialog/align-and-distribute.h b/src/ui/dialog/align-and-distribute.h index acb3d02ed..ce45fcccd 100644 --- a/src/ui/dialog/align-and-distribute.h +++ b/src/ui/dialog/align-and-distribute.h @@ -185,7 +185,7 @@ private : virtual void on_button_click() { - //Retreive selected objects + //Retrieve selected objects SPDesktop *desktop = _dialog.getDesktop(); if (!desktop) return; diff --git a/src/ui/dialog/dock-behavior.h b/src/ui/dialog/dock-behavior.h index de7386ad9..15429f1c9 100644 --- a/src/ui/dialog/dock-behavior.h +++ b/src/ui/dialog/dock-behavior.h @@ -70,7 +70,7 @@ private: /** Internal helpers */ Gtk::Paned *_getPaned(); //< gives the parent pane, if the dock item has one - void _requestHeight(int height); //< tries to resize the dock item to the requested hieght + void _requestHeight(int height); //< tries to resize the dock item to the requested height /** Internal signal handlers */ void _onHide(); diff --git a/src/ui/dialog/document-properties.cpp b/src/ui/dialog/document-properties.cpp index 2765e63f4..baf70ea82 100644 --- a/src/ui/dialog/document-properties.cpp +++ b/src/ui/dialog/document-properties.cpp @@ -1217,7 +1217,7 @@ void DocumentProperties::changeEmbeddedScript(){ //XML Tree being used directly here while it shouldn't be. SPObject* child = obj->firstChild(); - //TODO: shouldnt we get all children instead of simply the first child? + //TODO: shouldn't we get all children instead of simply the first child? if (child && child->getRepr()){ const gchar* content = child->getRepr()->content(); diff --git a/src/ui/dialog/extension-editor.cpp b/src/ui/dialog/extension-editor.cpp index 248f4f67f..a710a2fb4 100644 --- a/src/ui/dialog/extension-editor.cpp +++ b/src/ui/dialog/extension-editor.cpp @@ -116,7 +116,7 @@ ExtensionEditor::setExtensionIter(const Gtk::TreeModel::iterator &iter) } /** - * Called every time a new extention is selected + * Called every time a new extension is selected * * This function is set up to handle the signal for a changed extension * from the tree view in the left pane. It figure out which extension diff --git a/src/ui/dialog/filedialog.h b/src/ui/dialog/filedialog.h index 175031bcf..8ee63e654 100644 --- a/src/ui/dialog/filedialog.h +++ b/src/ui/dialog/filedialog.h @@ -352,7 +352,7 @@ public: virtual Glib::ustring getDestinationUnits() = 0; /** - * Return the destination DPI image resulution, if bitmap + * Return the destination DPI image resolution, if bitmap */ virtual double getDestinationDPI() = 0; diff --git a/src/ui/dialog/filedialogimpl-gtkmm.cpp b/src/ui/dialog/filedialogimpl-gtkmm.cpp index 64f6c98c6..86ad8649d 100644 --- a/src/ui/dialog/filedialogimpl-gtkmm.cpp +++ b/src/ui/dialog/filedialogimpl-gtkmm.cpp @@ -694,7 +694,7 @@ FileOpenDialogImplGtk::FileOpenDialogImplGtk(Gtk::Window &parentWindow, const Gl set_local_only(false); - /* Initalize to Autodetect */ + /* Initialize to Autodetect */ extension = NULL; /* No filename to start out with */ myFilename = ""; @@ -956,7 +956,7 @@ FileSaveDialogImplGtk::FileSaveDialogImplGtk(Gtk::Window &parentWindow, const Gl set_local_only(false); - /* Initalize to Autodetect */ + /* Initialize to Autodetect */ extension = NULL; /* No filename to start out with */ myFilename = ""; @@ -1438,7 +1438,7 @@ FileExportDialogImpl::FileExportDialogImpl(Gtk::Window &parentWindow, const Glib set_local_only(false); - /* Initalize to Autodetect */ + /* Initialize to Autodetect */ extension = NULL; /* No filename to start out with */ myFilename = ""; diff --git a/src/ui/dialog/filedialogimpl-gtkmm.h b/src/ui/dialog/filedialogimpl-gtkmm.h index 7501b5e14..82ca75065 100644 --- a/src/ui/dialog/filedialogimpl-gtkmm.h +++ b/src/ui/dialog/filedialogimpl-gtkmm.h @@ -446,7 +446,7 @@ public: { return destUnitsSpinner.getUnitAbbr(); } /** - * Return the destination DPI image resulution, if bitmap + * Return the destination DPI image resolution, if bitmap */ double getDestinationDPI() { return destDPISpinner.getValue(); } diff --git a/src/ui/dialog/filedialogimpl-win32.cpp b/src/ui/dialog/filedialogimpl-win32.cpp index 7f0bf58c5..7aca8e242 100644 --- a/src/ui/dialog/filedialogimpl-win32.cpp +++ b/src/ui/dialog/filedialogimpl-win32.cpp @@ -146,7 +146,7 @@ FileOpenDialogImplWin32::FileOpenDialogImplWin32(Gtk::Window &parent, const gchar *title) : FileDialogBaseWin32(parent, dir, title, fileTypes, "dialogs.open") { - // Initalize to Autodetect + // Initialize to Autodetect _extension = NULL; // Set our dialog type (open, import, etc...) @@ -1329,7 +1329,7 @@ void FileOpenDialogImplWin32::render_preview() GetBValue(background) / 255.0); context->paint(); - //----- Draw the drop shaddow -----// + //----- Draw the drop shadow -----// // Left Edge x = frameX + shaddowOffsetX - halfBlurRadius; diff --git a/src/ui/dialog/font-substitution.cpp b/src/ui/dialog/font-substitution.cpp index abae8ea70..ad035aa8d 100644 --- a/src/ui/dialog/font-substitution.cpp +++ b/src/ui/dialog/font-substitution.cpp @@ -130,7 +130,7 @@ FontSubstitution::show(Glib::ustring out, std::vector &l) * * Return a list of SPItems where fonts have been substituted. * - * Walk thru all the objects ... + * Walk through all the objects ... * a. Build up a list of the objects with fonts defined in the style attribute * b. Build up a list of the objects rendered fonts - taken for the objects layout/spans * If there are fonts in a. that are not in b. then those fonts have been substituted. diff --git a/src/ui/dialog/grid-arrange-tab.cpp b/src/ui/dialog/grid-arrange-tab.cpp index c16e60c5f..96e6acb3c 100644 --- a/src/ui/dialog/grid-arrange-tab.cpp +++ b/src/ui/dialog/grid-arrange-tab.cpp @@ -215,7 +215,7 @@ } - /// Make sure the top and left of the grid dont move by compensating for align values. + /// Make sure the top and left of the grid don't move by compensating for align values. if (RowHeightButton.get_active()){ grid_top = grid_top - (((row_height - row_heights[0]) / 2)*(VertAlign)); } diff --git a/src/ui/dialog/input.cpp b/src/ui/dialog/input.cpp index 5b316936d..5a27056f3 100644 --- a/src/ui/dialog/input.cpp +++ b/src/ui/dialog/input.cpp @@ -559,7 +559,7 @@ Glib::RefPtr InputDialogImpl::getPix(PixId id) } -// Now that we've defined the *Impl class, we can do the method to aquire one. +// Now that we've defined the *Impl class, we can do the method to acquire one. InputDialog &InputDialog::getInstance() { InputDialog *dialog = new InputDialogImpl(); diff --git a/src/ui/dialog/ocaldialogs.cpp b/src/ui/dialog/ocaldialogs.cpp index 72a2814ed..13ce4e4cd 100644 --- a/src/ui/dialog/ocaldialogs.cpp +++ b/src/ui/dialog/ocaldialogs.cpp @@ -84,7 +84,7 @@ ExportDialog::ExportDialog(Gtk::Window &parentWindow, * and a Entry to take the filename * Later put the extension selection and checkbox (?) */ - /* Initalize to Autodetect */ + /* Initialize to Autodetect */ /* extension = NULL; */ @@ -1063,7 +1063,7 @@ ImportDialog::ImportDialog(Gtk::Window& parent_window, FileDialogType file_types const Glib::ustring &title) : FileDialogBase(title, parent_window) { - // Initalize to Autodetect + // Initialize to Autodetect extension = NULL; // No filename to start out with Glib::ustring search_keywords = ""; diff --git a/src/ui/dialog/polar-arrange-tab.cpp b/src/ui/dialog/polar-arrange-tab.cpp index 75e1a56b8..2f18d5c0d 100644 --- a/src/ui/dialog/polar-arrange-tab.cpp +++ b/src/ui/dialog/polar-arrange-tab.cpp @@ -183,7 +183,7 @@ static Geom::Point calcPoint(float cx, float cy, float rx, float ry, float angle /** * Returns the selected anchor point in document coordinates. If anchor - * is 0 to 8, then a bounding box point has been choosen. If it is 9 however + * is 0 to 8, then a bounding box point has been chosen. If it is 9 however * the rotational center is chosen. * @todo still using a hack to get the real coordinate space (subtracting document height * and inverting axes) diff --git a/src/ui/dialog/print-colors-preview-dialog.cpp b/src/ui/dialog/print-colors-preview-dialog.cpp index ef5c1b6f6..5e96a8e61 100644 --- a/src/ui/dialog/print-colors-preview-dialog.cpp +++ b/src/ui/dialog/print-colors-preview-dialog.cpp @@ -19,7 +19,7 @@ namespace UI { namespace Dialog { //Yes, I know we shouldn't hardcode CMYK. This class needs to be refactored -// in order to accomodate spot colors and color components defined using +// in order to accommodate spot colors and color components defined using // ICC colors. --Juca void PrintColorsPreviewDialog::toggle_cyan(){ diff --git a/src/ui/dialog/styledialog.cpp b/src/ui/dialog/styledialog.cpp index 60138fa89..5ca085094 100644 --- a/src/ui/dialog/styledialog.cpp +++ b/src/ui/dialog/styledialog.cpp @@ -191,7 +191,7 @@ StyleDialog::TreeStore::row_draggable_vfunc(const Gtk::TreeModel::Path& path) co /** - * Allow dropping only inbetween other selectors. + * Allow dropping only in between other selectors. */ bool StyleDialog::TreeStore::row_drop_possible_vfunc(const Gtk::TreeModel::Path& dest, @@ -750,7 +750,7 @@ void StyleDialog::_removeFromSelector(Gtk::TreeModel::Row row) /** * @brief StyleDialog::_getIdList * @param sel - * @return This function returns a comma seperated list of ids for objects in input vector. + * @return This function returns a comma separated list of ids for objects in input vector. * It is used in creating an 'id' selector. It relies on objects having 'id's. */ Glib::ustring StyleDialog::_getIdList(std::vector sel) diff --git a/src/ui/dialog/xml-tree.cpp b/src/ui/dialog/xml-tree.cpp index c245890bc..5747c7726 100644 --- a/src/ui/dialog/xml-tree.cpp +++ b/src/ui/dialog/xml-tree.cpp @@ -1004,7 +1004,7 @@ void XmlTree::cmd_delete_attr() SPObject *updated = current_document->getObjectByRepr(selected_repr); if (updated) { - // force immediate update of dependant attributes + // force immediate update of dependent attributes updated->updateRepr(); } @@ -1028,7 +1028,7 @@ void XmlTree::cmd_set_attr() SPObject *updated = current_document->getObjectByRepr(selected_repr); if (updated) { - // force immediate update of dependant attributes + // force immediate update of dependent attributes updated->updateRepr(); } diff --git a/src/ui/tool/node.cpp b/src/ui/tool/node.cpp index 4f42400d4..67768571d 100644 --- a/src/ui/tool/node.cpp +++ b/src/ui/tool/node.cpp @@ -168,7 +168,7 @@ void Handle::move(Geom::Point const &new_pos) } setPosition(new_pos); - //move the handler and its oposite the same proportion + //move the handler and its opposite the same proportion if(_pm()._isBSpline()){ setPosition(_pm()._bsplineHandleReposition(this, false)); bspline_weight = _pm()._bsplineHandlePosition(this, false); @@ -186,7 +186,7 @@ void Handle::move(Geom::Point const &new_pos) / Geom::L2sq(direction)) * direction; setRelativePos(new_delta); - //move the handler and its oposite the same proportion + //move the handler and its opposite the same proportion if(_pm()._isBSpline()){ setPosition(_pm()._bsplineHandleReposition(this, false)); bspline_weight = _pm()._bsplineHandlePosition(this, false); @@ -213,7 +213,7 @@ void Handle::move(Geom::Point const &new_pos) } setPosition(new_pos); - // moves the handler and its oposite the same proportion + // moves the handler and its opposite the same proportion if(_pm()._isBSpline()){ setPosition(_pm()._bsplineHandleReposition(this, false)); bspline_weight = _pm()._bsplineHandlePosition(this, false); @@ -307,7 +307,7 @@ bool Handle::_eventHandler(Inkscape::UI::Tools::ToolBase *event_context, GdkEven return ControlPoint::_eventHandler(event_context, event); } -//this function moves the handler and its oposite to the default proportion of DEFAULT_START_POWER +//this function moves the handler and its opposite to the default proportion of DEFAULT_START_POWER void Handle::handle_2button_press(){ if(_pm()._isBSpline()){ setPosition(_pm()._bsplineHandleReposition(this, DEFAULT_START_POWER)); @@ -364,7 +364,7 @@ void Handle::dragged(Geom::Point &new_pos, GdkEventMotion *event) ctrl_constraint = Inkscape::Snapper::SnapConstraint(parent_pos, parent_pos - perp_pos); } new_pos = result; - // moves the handler and its oposite in X fixed positions depending on parameter "steps with control" + // moves the handler and its opposite in X fixed positions depending on parameter "steps with control" // by default in live BSpline if(_pm()._isBSpline()){ setPosition(new_pos); @@ -478,7 +478,7 @@ Glib::ustring Handle::_getTip(unsigned state) const { char const *more; // a trick to mark as bspline if the node has no strength, we are going to use it later - // to show the appropiate messages. We cannot do it in any different way becasue the function is constant + // to show the appropriate messages. We cannot do it in any different way because the function is constant Handle *h = const_cast(this); bool isBSpline = _pm()._isBSpline(); bool can_shift_rotate = _parent->type() == NODE_CUSP && !other()->isDegenerate(); diff --git a/src/ui/tool/path-manipulator.cpp b/src/ui/tool/path-manipulator.cpp index 2c99e7fc8..f39afb8c4 100644 --- a/src/ui/tool/path-manipulator.cpp +++ b/src/ui/tool/path-manipulator.cpp @@ -1688,7 +1688,7 @@ void PathManipulator::_updateOutlineOnZoomChange() if (_show_path_direction) _updateOutline(); } -/** Compute the radius from the edge of the path where clicks chould initiate a curve drag +/** Compute the radius from the edge of the path where clicks should initiate a curve drag * or segment selection, in window coordinates. */ double PathManipulator::_getStrokeTolerance() { diff --git a/src/ui/tools/gradient-tool.cpp b/src/ui/tools/gradient-tool.cpp index 1735a78df..81d2f6a5b 100644 --- a/src/ui/tools/gradient-tool.cpp +++ b/src/ui/tools/gradient-tool.cpp @@ -636,7 +636,7 @@ bool GradientTool::root_handler(GdkEvent* event) { } } else if (this->item_to_select) { if (over_line && line) { - // Clicked on an existing gradient line, dont change selection. This stops + // Clicked on an existing gradient line, don't change selection. This stops // possible change in selection during a double click with overlapping objects } else { // no dragging, select clicked item if any diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp index 24295e7cf..bd2964d94 100644 --- a/src/ui/tools/measure-tool.cpp +++ b/src/ui/tools/measure-tool.cpp @@ -1236,7 +1236,7 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, bool to_phantom, sp_canvas_item_destroy(measure_tmp_items[idx]); } measure_tmp_items.clear(); - //TODO:Calculate the measure area for current lenght and origin + //TODO:Calculate the measure area for current length and origin // and use canvas->requestRedraw. In the calculation need a gap for outside text // maybe this remove the trash lines on measure use Inkscape::Preferences *prefs = Inkscape::Preferences::get(); diff --git a/src/ui/widget/color-notebook.cpp b/src/ui/widget/color-notebook.cpp index ba333d0ed..bd4b21bdb 100644 --- a/src/ui/widget/color-notebook.cpp +++ b/src/ui/widget/color-notebook.cpp @@ -289,7 +289,7 @@ void ColorNotebook::_updateICCButtons() /* Some literature states that when the sum of paint values exceed 320%, it is considered to be a satured color, - which means the paper can get too wet due to an excessive ammount of ink. This may lead to several + which means the paper can get too wet due to an excessive amount of ink. This may lead to several issues such as misalignment and poor quality of printing in general.*/ if (ink_sum > 3.2) diff --git a/src/ui/widget/font-variants.cpp b/src/ui/widget/font-variants.cpp index d1755a6d5..f6c81df3b 100644 --- a/src/ui/widget/font-variants.cpp +++ b/src/ui/widget/font-variants.cpp @@ -563,7 +563,7 @@ namespace Widget { if( (it = table_copy.find("zero")) != table_copy.end() ) table_copy.erase( it ); std::string ott_list = "OpenType tables not included above: "; for(it = table_copy.begin(); it != table_copy.end(); ++it) { - // std::cout << "Other: " << it->first << " Occurances: " << it->second << std::endl; + // std::cout << "Other: " << it->first << " Occurrences: " << it->second << std::endl; ott_list += it->first; ott_list += ", "; } diff --git a/src/ui/widget/object-composite-settings.cpp b/src/ui/widget/object-composite-settings.cpp index ca33a845c..5f5b801d1 100644 --- a/src/ui/widget/object-composite-settings.cpp +++ b/src/ui/widget/object-composite-settings.cpp @@ -67,7 +67,7 @@ ObjectCompositeSettings::ObjectCompositeSettings(unsigned int verb_code, char co show_all_children(); - // These signals dont properly detect change in desktop, rely on owner dialog to call setSubject() from setTargetDesktop() + // These signals don't properly detect change in desktop, rely on owner dialog to call setSubject() from setTargetDesktop() //_desktop_activated = g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (&ObjectCompositeSettings::_on_desktop_activate), this ); //_desktop_activated = g_signal_connect ( G_OBJECT (INKSCAPE), "deactivate_desktop", G_CALLBACK (&ObjectCompositeSettings::_on_desktop_deactivate), this ); } diff --git a/src/ui/widget/panel.h b/src/ui/widget/panel.h index b5498498d..06b65dfbc 100644 --- a/src/ui/widget/panel.h +++ b/src/ui/widget/panel.h @@ -104,7 +104,7 @@ public: void setDefaultResponse(int response_id); void setResponseSensitive(int response_id, bool setting); - /* Return signals. Signals emited by PanelDialog. */ + /* Return signals. Signals emitted by PanelDialog. */ virtual sigc::signal &signalDocumentReplaced(); virtual sigc::signal &signalActivateDesktop(); virtual sigc::signal &signalDeactiveDesktop(); -- cgit v1.2.3 From 13cd1abbb6a366ca3a3ade2712fd3ce440adf9e6 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Wed, 8 Nov 2017 00:27:29 +0100 Subject: Working on CPU issues --- src/ui/dialog/symbols.cpp | 68 +++++++++++++++++++++++------------------------ src/ui/dialog/symbols.h | 1 - 2 files changed, 34 insertions(+), 35 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 51d801d6a..9c4f13946 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -343,13 +343,13 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : overlay_title->set_valign(Gtk::ALIGN_START ); overlay_title->set_justify(Gtk::JUSTIFY_CENTER); overlay_title->set_margin_top(155); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); overlay_desc = new Gtk::Label(); overlay_desc->set_halign(Gtk::ALIGN_CENTER ); overlay_desc->set_valign(Gtk::ALIGN_START ); overlay_desc->set_margin_top(180); overlay_desc->set_justify(Gtk::JUSTIFY_CENTER); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a another search or select other set")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a another search or select other set")) + Glib::ustring("")); overlay->add_overlay(* overlay_opacity); overlay->add_overlay(* overlay_icon); overlay->add_overlay(* overlay_title); @@ -943,42 +943,33 @@ void SymbolsDialog::unsensitive(GdkEventKey* evt) bool SymbolsDialog::callbackSymbols(){ Glib::ustring current = symbol_set->get_active_text(); + #if GTK_CHECK_VERSION(3,2,4) - if (current == _("All symbols sets") && - search->get_text() != _("Loading documents...")) +if (current == _("All symbols sets") && search->get_text() != _("Loading documents...") && !l.size()) { - if (!all_docs_processed) { - overlay_opacity->show(); - overlay_icon->set_from_icon_name("none", iconsize); - overlay_icon->show(); - overlay_title->show(); - overlay_desc->show(); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); - } - } - if (current == _("Current Document") && !icons_found) { - if (!all_docs_processed) { - overlay_icon->set_from_icon_name("none", iconsize); - overlay_opacity->show(); - overlay_icon->show(); - overlay_title->show(); - overlay_desc->show(); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); + if (!all_docs_processed ) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time,\n search will be slow.\nPlease wait ...")) + Glib::ustring("")); + } else { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("All symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); } + overlay_opacity->show(); + overlay_icon->set_from_icon_name("none", iconsize); + overlay_icon->show(); + overlay_title->show(); + overlay_desc->show(); + return false; } #endif - if (current == _("All symbols sets") && - search->get_text() == _("Loading documents...") ) - { + if (current == _("All symbols sets") && search->get_text() == _("Loading documents...")) { #if GTK_CHECK_VERSION(3,2,4) overlay_opacity->show(); #endif if (!all_docs_processed) { #if GTK_CHECK_VERSION(3,2,4) - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("")+ Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); overlay_icon->show(); overlay_title->show(); overlay_icon->set_from_icon_name("searching", iconsize); @@ -1053,8 +1044,8 @@ bool SymbolsDialog::callbackSymbols(){ } #if GTK_CHECK_VERSION(3,2,4) if (!icons_found && !search_str.empty()) { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); overlay_icon->set_from_icon_name("none", iconsize); overlay_icon->show(); overlay_title->show(); @@ -1094,9 +1085,8 @@ void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { if (!number_symbols) { #if GTK_CHECK_VERSION(3,2,4) overlay_icon->set_from_icon_name("none", iconsize); + overlay_opacity->show(); overlay_icon->show(); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); overlay_title->show(); overlay_desc->show(); #endif @@ -1105,6 +1095,16 @@ void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { sensitive = true; enableWidgets(true); } +#if GTK_CHECK_VERSION(3,2,4) + Glib::ustring current = symbol_set->get_active_text(); + if (!number_symbols && (current != _("Current Document") || !search_str.empty())) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); + } else if (!number_symbols) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols in current document.\nYou could create in the current document\n or add into from other different symbol set.")) + Glib::ustring("")); + } +#endif } void SymbolsDialog::addSymbols() { @@ -1129,8 +1129,8 @@ void SymbolsDialog::addSymbols() { if (!number_symbols) { #if GTK_CHECK_VERSION(3,2,4) overlay_icon->set_from_icon_name("none", iconsize); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); overlay_icon->show(); overlay_title->show(); overlay_desc->show(); diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index a4d1f93fb..8255877b8 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -138,7 +138,6 @@ private: Gtk::ScrolledWindow *scroller; Gtk::ToggleButton* fit_symbol; Gtk::IconSize iconsize; - void setTargetDesktop(SPDesktop *desktop); SPDesktop* current_desktop; DesktopTracker desk_track; -- cgit v1.2.3 From 1ead5fb28fa719125fa7a1893e1efa3db6a937c4 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Wed, 8 Nov 2017 01:12:53 +0100 Subject: Reducing the risk of ocureences of 100% CPU bug --- src/ui/dialog/symbols.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 9c4f13946..f018261c6 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -446,8 +446,6 @@ void SymbolsDialog::rebuild() { search->set_text(""); } if (symbol_document) { - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); addSymbolsInDoc(symbol_document); } } @@ -896,8 +894,6 @@ void SymbolsDialog::clearSearch() SPDocument* symbol_document = selectedSymbols(); if (symbol_document) { //We are not in search all docs - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); icons_found = false; addSymbolsInDoc(symbol_document); } else { @@ -923,8 +919,6 @@ void SymbolsDialog::beforeSearch(GdkEventKey* evt) progress_bar->set_fraction(0.0); enableWidgets(false); SPDocument* symbol_document = selectedSymbols(); - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); if (symbol_document) { //We are not in search all docs search->set_text(_("Searching...")); @@ -932,6 +926,8 @@ void SymbolsDialog::beforeSearch(GdkEventKey* evt) icons_found = false; addSymbolsInDoc(symbol_document); } else { + idleconn.disconnect(); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); search->set_text(_("Loading documents...")); } } @@ -1094,6 +1090,10 @@ void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { search->set_text(search_str); sensitive = true; enableWidgets(true); + idleconn.disconnect(); + } else { + idleconn.disconnect(); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); } #if GTK_CHECK_VERSION(3,2,4) Glib::ustring current = symbol_set->get_active_text(); @@ -1135,6 +1135,7 @@ void SymbolsDialog::addSymbols() { overlay_title->show(); overlay_desc->show(); #endif + idleconn.disconnect(); sensitive = false; search->set_text(search_str); sensitive = true; -- cgit v1.2.3 From d042ff18f4b4f4123794f457856552c5ebf8cd2e Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Wed, 8 Nov 2017 01:59:30 +0100 Subject: Fixes CPU problems --- src/ui/dialog/symbols.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index f018261c6..52f22103f 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -447,6 +447,9 @@ void SymbolsDialog::rebuild() { } if (symbol_document) { addSymbolsInDoc(symbol_document); + } else { + idleconn.disconnect(); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); } } @@ -897,6 +900,8 @@ void SymbolsDialog::clearSearch() icons_found = false; addSymbolsInDoc(symbol_document); } else { + idleconn.disconnect(); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); enableWidgets(true); } } -- cgit v1.2.3 From 24db09e6b2d18dedd76bca079be820ab1364298c Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Wed, 8 Nov 2017 21:59:16 +0100 Subject: Refactor and order of document list --- src/ui/dialog/symbols.cpp | 363 ++++++++++++++++++++++------------------------ src/ui/dialog/symbols.h | 5 +- 2 files changed, 179 insertions(+), 189 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 52f22103f..c04b8bcc2 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -69,7 +69,8 @@ namespace Inkscape { namespace UI { namespace Dialog { - +const Glib::ustring CURRENTDOC = _("Current Document"); +const Glib::ustring ALLDOCS = _("All symbols sets"); // See: http://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeModelColumnRecord.html class SymbolColumns : public Gtk::TreeModel::ColumnRecord { @@ -122,9 +123,9 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : Gtk::Label* label_set = new Gtk::Label(_("Symbol set: ")); table->attach(*Gtk::manage(label_set),0,row,1,1); symbol_set = new Gtk::ComboBoxText(); // Fill in later - symbol_set->append(_("Current Document")); - symbol_set->append(_("All symbols sets")); - symbol_set->set_active_text(_("Current Document")); + symbol_set->append(CURRENTDOC); + symbol_set->append(ALLDOCS); + symbol_set->set_active_text(CURRENTDOC); symbol_set->set_hexpand(); table->attach(*Gtk::manage(symbol_set),1,row,1,1); @@ -196,6 +197,31 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : overlay->add(* scroller); scroller->set_size_request(100, 250); table->attach(*Gtk::manage(overlay),0,row,2,1); + + /*************************Overlays******************************/ + overlay_opacity = new Gtk::Image(); + overlay_opacity->set_halign(Gtk::ALIGN_START ); + overlay_opacity->set_valign(Gtk::ALIGN_START ); + //No results + iconsize = Gtk::IconSize().register_new(Glib::ustring("ICON_SIZE_DIALOG_EXTRA"), 110, 110); + overlay_icon = new Gtk::Image(); + overlay_icon->set_halign(Gtk::ALIGN_CENTER ); + overlay_icon->set_valign(Gtk::ALIGN_START ); + overlay_icon->set_margin_top(45); + overlay_title = new Gtk::Label(); + overlay_title->set_halign(Gtk::ALIGN_CENTER ); + overlay_title->set_valign(Gtk::ALIGN_START ); + overlay_title->set_justify(Gtk::JUSTIFY_CENTER); + overlay_title->set_margin_top(155); + overlay_desc = new Gtk::Label(); + overlay_desc->set_halign(Gtk::ALIGN_CENTER ); + overlay_desc->set_valign(Gtk::ALIGN_START ); + overlay_desc->set_margin_top(180); + overlay_desc->set_justify(Gtk::JUSTIFY_CENTER); + overlay->add_overlay(* overlay_opacity); + overlay->add_overlay(* overlay_icon); + overlay->add_overlay(* overlay_title); + overlay->add_overlay(* overlay_desc); #else table->attach(*Gtk::manage(scroller),0,row,2,1); #endif @@ -322,38 +348,8 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : // This might need to be a global variable so setTargetDesktop can modify it SPDefs *defs = current_document->getDefs(); - - /*************************Overlays******************************/ #if GTK_CHECK_VERSION(3,2,4) - //Loading - overlay_opacity = new Gtk::Image(); overlay_opacity->set(getOverlay(overlay_opacity, "overlay", 1000)); - overlay_opacity->set_halign(Gtk::ALIGN_START ); - overlay_opacity->set_valign(Gtk::ALIGN_START ); - //No results - iconsize = Gtk::IconSize().register_new(Glib::ustring("ICON_SIZE_DIALOG_EXTRA"), 110, 110); - overlay_icon = new Gtk::Image(); - overlay_icon->set_from_icon_name("none", iconsize); - overlay_icon = new Gtk::Image(); - overlay_icon->set_halign(Gtk::ALIGN_CENTER ); - overlay_icon->set_valign(Gtk::ALIGN_START ); - overlay_icon->set_margin_top(45); - overlay_title = new Gtk::Label(); - overlay_title->set_halign(Gtk::ALIGN_CENTER ); - overlay_title->set_valign(Gtk::ALIGN_START ); - overlay_title->set_justify(Gtk::JUSTIFY_CENTER); - overlay_title->set_margin_top(155); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc = new Gtk::Label(); - overlay_desc->set_halign(Gtk::ALIGN_CENTER ); - overlay_desc->set_valign(Gtk::ALIGN_START ); - overlay_desc->set_margin_top(180); - overlay_desc->set_justify(Gtk::JUSTIFY_CENTER); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a another search or select other set")) + Glib::ustring("")); - overlay->add_overlay(* overlay_opacity); - overlay->add_overlay(* overlay_icon); - overlay->add_overlay(* overlay_title); - overlay->add_overlay(* overlay_desc); #endif sigc::connection defsModifiedConn = defs->connectModified(sigc::mem_fun(*this, &SymbolsDialog::defsModified)); instanceConns.push_back(defsModifiedConn); @@ -373,9 +369,6 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : desk_track.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); instanceConns.push_back( desktopChangeConn ); desk_track.connect(GTK_WIDGET(gobj())); -#if GTK_CHECK_VERSION(3,2,4) - overlay->hide(); -#endif } SymbolsDialog::~SymbolsDialog() @@ -448,11 +441,67 @@ void SymbolsDialog::rebuild() { if (symbol_document) { addSymbolsInDoc(symbol_document); } else { - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); + showOverlay(); + } +} +void SymbolsDialog::showOverlay() { +#if GTK_CHECK_VERSION(3,2,4) +Glib::ustring current = Glib::Markup::escape_text(symbol_set->get_active_text()); + if (current == ALLDOCS && + search->get_text() != _("Loading documents...") && + !l.size()) + { + if (!all_docs_processed ) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time,\n search will be slow.\nPlease wait ...")) + Glib::ustring("")); + } else if (!icons_found && !search_str.empty()) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); + } else { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("All symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); + } + } else if (current == ALLDOCS && search->get_text() == _("Loading documents...")) { + if (!all_docs_processed) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("")+ Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); + overlay_icon->show(); + overlay_title->show(); + overlay_icon->set_from_icon_name("searching", iconsize); + overlay_desc->show(); + } + } else if (!number_symbols && (current != CURRENTDOC || !search_str.empty())) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); + } else if (!number_symbols && current == CURRENTDOC) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols in current document.\nYou could create in the current document\n or add into from other different symbol set.")) + Glib::ustring("")); + } else if (!icons_found && !search_str.empty()) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); + } + overlay_opacity->show(); + overlay_icon->set_from_icon_name("none", iconsize); + overlay_icon->show(); + overlay_title->show(); + overlay_desc->show(); + if (l.size()) { + overlay_opacity->show(); + overlay_icon->hide(); + overlay_title->hide(); + overlay_desc->hide(); } +#endif } +void SymbolsDialog::hideOverlay() { +#if GTK_CHECK_VERSION(3,2,4) + overlay_opacity->hide(); + overlay_icon->hide(); + overlay_title->hide(); + overlay_desc->hide(); +#endif +} void SymbolsDialog::insertSymbol() { Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_SYMBOL ); SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) current_desktop) ); @@ -484,7 +533,7 @@ 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 != _("All symbols sets") && !symbol_sets[symbol_set->get_active_text()] ) { + if (doc_title != ALLDOCS && !symbol_sets[doc_title] ) { rebuild(); } } @@ -517,7 +566,7 @@ void SymbolsDialog::documentReplaced(SPDesktop *desktop, SPDocument *document) 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(); - if (doc_title == _("All symbols sets")) { + if (doc_title == ALLDOCS) { return NULL; } SPDocument* symbol_document = symbol_sets[doc_title]; @@ -563,19 +612,17 @@ Glib::ustring SymbolsDialog::selectedSymbolDocTitle() { } Glib::ustring SymbolsDialog::documentTitle(SPDocument* symbol_doc) { - Glib::ustring title = _("Untitled document"); if (symbol_doc) { SPRoot * root = symbol_doc->getRoot(); if (root->title()) { - title = ellipsize(Glib::ustring(root->title())); - return title; + return ellipsize(Glib::ustring(root->title()), 33); } } Glib::ustring current = symbol_set->get_active_text(); - if (current == _("Current Document")) { + if (current == CURRENTDOC) { return current; } - return title; + return _("Untitled document"); } void SymbolsDialog::iconChanged() { @@ -749,7 +796,6 @@ void SymbolsDialog::getSymbolsFilename() { title = _("Unnamed Symbols"); } symbol_sets[title]= NULL; - symbol_set->append(title); ++number_docs; } #ifdef WITH_LIBVISIO @@ -761,11 +807,13 @@ void SymbolsDialog::getSymbolsFilename() { title = _("Unnamed Symbols"); } symbol_sets[title]= NULL; - symbol_set->append(title); ++number_docs; } #endif } + for(auto const &symbol_document_map : symbol_sets) { + symbol_set->append(symbol_document_map.first); + } } /* Hunts preference directories for symbol files */ @@ -773,12 +821,20 @@ std::pair SymbolsDialog::getSymbolsSet(Glib::ustring title) { if (symbol_sets[title]) { + sensitive = false; + symbol_set->remove_all(); + symbol_set->append(CURRENTDOC); + symbol_set->append(ALLDOCS); + for(auto const &symbol_document_map : symbol_sets) { + symbol_set->append(symbol_document_map.first); + } + symbol_set->set_active_text(new_title); + sensitive = true; return std::make_pair(title, symbol_sets[title]); } using namespace Inkscape::IO::Resource; SPDocument* symbol_doc = NULL; Glib::ustring new_title; - size_t i = 0; for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { std::size_t pos = filename.find_last_of("/\\"); if (pos != std::string::npos) { @@ -787,35 +843,33 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) symbol_doc = SPDocument::createNewDoc(filename.c_str(), FALSE); if(symbol_doc) { new_title = documentTitle(symbol_doc); + break; } } - if(Glib::str_has_suffix(filename, ".svg")) { - i++; - } #ifdef WITH_LIBVISIO if(filename_short == title + ".vss") { symbol_doc = read_vss(filename, title); if(symbol_doc) { new_title = documentTitle(symbol_doc); + break; } } - if(Glib::str_has_suffix(filename, ".vss")) { - i++; - } #endif - if(symbol_doc) { - symbol_sets.erase(title); - symbol_sets[new_title]= symbol_doc; - sensitive = false; - symbol_set->remove_text(i+1); - symbol_set->insert (i+1, new_title); - symbol_set->set_active(i+1); - symbol_set->set_active_text(new_title); - sensitive = true; - break; - } } } + if(symbol_doc) { + symbol_sets.erase(title); + symbol_sets[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) { + symbol_set->append(symbol_document_map.first); + } + symbol_set->set_active_text(new_title); + sensitive = true; + } return std::make_pair(new_title, symbol_doc); } @@ -900,8 +954,7 @@ void SymbolsDialog::clearSearch() icons_found = false; addSymbolsInDoc(symbol_document); } else { - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); + showOverlay(); enableWidgets(true); } } @@ -932,7 +985,7 @@ void SymbolsDialog::beforeSearch(GdkEventKey* evt) addSymbolsInDoc(symbol_document); } else { idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackAllSymbols)); search->set_text(_("Loading documents...")); } } @@ -943,72 +996,8 @@ void SymbolsDialog::unsensitive(GdkEventKey* evt) } bool SymbolsDialog::callbackSymbols(){ - Glib::ustring current = symbol_set->get_active_text(); - -#if GTK_CHECK_VERSION(3,2,4) -if (current == _("All symbols sets") && search->get_text() != _("Loading documents...") && !l.size()) - { - if (!all_docs_processed ) { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time,\n search will be slow.\nPlease wait ...")) + Glib::ustring("")); - } else { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("All symbol sets ...")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); - } - overlay_opacity->show(); - overlay_icon->set_from_icon_name("none", iconsize); - overlay_icon->show(); - overlay_title->show(); - overlay_desc->show(); - return false; - } -#endif - if (current == _("All symbols sets") && search->get_text() == _("Loading documents...")) { -#if GTK_CHECK_VERSION(3,2,4) - overlay_opacity->show(); -#endif - if (!all_docs_processed) { -#if GTK_CHECK_VERSION(3,2,4) - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("")+ Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); - overlay_icon->show(); - overlay_title->show(); - overlay_icon->set_from_icon_name("searching", iconsize); - overlay_desc->show(); -#endif - } - size_t counter = 0; - for(auto const &symbol_document_map : symbol_sets) { - ++counter; - SPDocument* symbol_document = symbol_document_map.second; - if (symbol_document) { - continue; - } - symbol_document = getSymbolsSet(symbol_document_map.first).second; - symbol_set->set_active_text(_("All symbols sets")); - if (!symbol_document) { - continue; - } - progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); - return true; - } -#if GTK_CHECK_VERSION(3,2,4) - overlay_icon->hide(); - overlay_title->hide(); - overlay_desc->hide(); -#endif - progress_bar->set_fraction(1.0); - all_docs_processed = true; - addSymbols(); - search->set_text("Documents done, searchig inside..."); - return true; - } else if (l.size()) { -#if GTK_CHECK_VERSION(3,2,4) - overlay_opacity->show(); - overlay_icon->hide(); - overlay_title->hide(); - overlay_desc->hide(); -#endif + if (l.size()) { + showOverlay(); for (auto symbol_data = l.begin(); symbol_data != l.end();) { Glib::ustring doc_title = symbol_data->first; SPSymbol * symbol = symbol_data->second; @@ -1043,18 +1032,11 @@ if (current == _("All symbols sets") && search->get_text() != _("Loading documen return true; } } -#if GTK_CHECK_VERSION(3,2,4) if (!icons_found && !search_str.empty()) { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); - overlay_icon->set_from_icon_name("none", iconsize); - overlay_icon->show(); - overlay_title->show(); - overlay_desc->show(); + showOverlay(); } else { - overlay_opacity->hide(); + hideOverlay(); } -#endif sensitive = false; search->set_text(search_str); sensitive = true; @@ -1064,9 +1046,40 @@ if (current == _("All symbols sets") && search->get_text() != _("Loading documen return true; } +bool SymbolsDialog::callbackAllSymbols(){ + Glib::ustring current = symbol_set->get_active_text(); + if (current == ALLDOCS && search->get_text() == _("Loading documents...")) { + size_t counter = 0; + std::map symbol_sets_tmp = symbol_sets; + for(auto const &symbol_document_map : symbol_sets_tmp) { + ++counter; + SPDocument* symbol_document = symbol_document_map.second; + if (symbol_document) { + continue; + } + symbol_document = getSymbolsSet(symbol_document_map.first).second; + symbol_set->set_active_text(ALLDOCS); + if (!symbol_document) { + continue; + } + progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); + return true; + } + symbol_sets_tmp.clear(); + hideOverlay(); + progress_bar->set_fraction(1.0); + all_docs_processed = true; + addSymbols(); + search->set_text("Documents done, searchig inside..."); + return false; + } + return true; +} + Glib::ustring SymbolsDialog::ellipsize(Glib::ustring data, size_t limit) { if (data.length() > limit) { - return data.substr(0,limit-3) + "..."; + data = data.substr(0, limit-3); + return data + "..."; } return data; } @@ -1079,72 +1092,47 @@ void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { Glib::ustring doc_title = documentTitle(symbol_document); progress_bar->set_fraction(0.0); counter_symbols = 0; - std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); - number_symbols = container_symbols_tmp.size(); - l = container_symbols_tmp; - container_symbols_tmp.clear(); + l = symbolsInDoc(symbol_document, doc_title); + number_symbols = l.size(); if (!number_symbols) { -#if GTK_CHECK_VERSION(3,2,4) - overlay_icon->set_from_icon_name("none", iconsize); - overlay_opacity->show(); - overlay_icon->show(); - overlay_title->show(); - overlay_desc->show(); -#endif sensitive = false; 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)); } -#if GTK_CHECK_VERSION(3,2,4) - Glib::ustring current = symbol_set->get_active_text(); - if (!number_symbols && (current != _("Current Document") || !search_str.empty())) { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); - } else if (!number_symbols) { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols in current document.\nYou could create in the current document\n or add into from other different symbol set.")) + Glib::ustring("")); - } -#endif } void SymbolsDialog::addSymbols() { store->clear(); icons_found = false; - std::vector > container_symbols; for(auto const &symbol_document_map : symbol_sets) { SPDocument* symbol_document = symbol_document_map.second; if (!symbol_document) { continue; } Glib::ustring doc_title = documentTitle(symbol_document); - std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); - container_symbols.insert(container_symbols.end(), std::make_move_iterator(container_symbols_tmp.begin()), std::make_move_iterator(container_symbols_tmp.end())); - container_symbols_tmp.clear(); + std::vector > l_tmp = symbolsInDoc(symbol_document, doc_title); + l.insert(l.end(), std::make_move_iterator(l_tmp.begin()), std::make_move_iterator(l_tmp.end())); + l_tmp.clear(); } counter_symbols = 0; progress_bar->set_fraction(0.0); - number_symbols = container_symbols.size(); - l = container_symbols; - container_symbols.clear(); + number_symbols = l.size(); if (!number_symbols) { -#if GTK_CHECK_VERSION(3,2,4) - overlay_icon->set_from_icon_name("none", iconsize); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); - overlay_icon->show(); - overlay_title->show(); - overlay_desc->show(); -#endif + 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)); } } @@ -1157,19 +1145,18 @@ void SymbolsDialog::addSymbol( SPObject* symbol, Glib::ustring doc_title) { if( !title ) { title = id; } - Glib::ustring symbol_title = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "Symbol", title) )); if (doc_title.empty()) { - doc_title = _("Current Document"); + doc_title = CURRENTDOC; } - symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" (") + doc_title + Glib::ustring(")")).c_str()))); + Glib::ustring symbol_title = Glib::ustring(title) + Glib::ustring(" (") + doc_title + Glib::ustring(")"); Glib::RefPtr pixbuf = drawSymbol( symbol ); if( pixbuf ) { Gtk::ListStore::iterator row = store->append(); - (*row)[columns->symbol_id] = Glib::ustring( id ); - (*row)[columns->symbol_title] = symbol_title; - (*row)[columns->symbol_doc_title] = Glib::Markup::escape_text(doc_title); - (*row)[columns->symbol_image] = pixbuf; + (*row)[columns->symbol_id] = Glib::ustring( id ); + (*row)[columns->symbol_title] = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "Symbol", symbol_title.c_str()) )); + (*row)[columns->symbol_doc_title] = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "SymbolDoc", doc_title.c_str()) )); + (*row)[columns->symbol_image] = pixbuf; } delete columns; diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 8255877b8..2fcdcfe72 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -94,10 +94,13 @@ private: void unsensitive(GdkEventKey* evt); void addSymbols(); void addSymbolsInDoc(SPDocument* document); + void showOverlay(); + void hideOverlay(); void clearSearch(); bool callbackSymbols(); + bool callbackAllSymbols(); void enableWidgets(bool enable); - Glib::ustring ellipsize(Glib::ustring data, size_t limit = 40); + Glib::ustring ellipsize(Glib::ustring data, size_t limit); gchar const* styleFromUse( gchar const* id, SPDocument* document); Glib::RefPtr drawSymbol(SPObject *symbol, unsigned force_psize = 0); Glib::RefPtr getOverlay(Gtk::Image* image, gchar const * icon_title, unsigned psize); -- cgit v1.2.3 From 434bc94a17b4912e31e78cd7913e169bff1295d9 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Wed, 8 Nov 2017 23:47:43 +0100 Subject: Now symbols are sorted --- src/ui/dialog/symbols.cpp | 33 ++++++++++++++++++++------------- src/ui/dialog/symbols.h | 6 +++--- 2 files changed, 23 insertions(+), 16 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index c04b8bcc2..aef7948d8 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -828,7 +828,7 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) for(auto const &symbol_document_map : symbol_sets) { symbol_set->append(symbol_document_map.first); } - symbol_set->set_active_text(new_title); + symbol_set->set_active_text(title); sensitive = true; return std::make_pair(title, symbol_sets[title]); } @@ -873,7 +873,7 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) return std::make_pair(new_title, symbol_doc); } -void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::vector > &l, Glib::ustring doc_title) +void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::map > &l, Glib::ustring doc_title) { if(!r) return; @@ -882,19 +882,24 @@ void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::vector(r) ) { - l.push_back(std::make_pair(doc_title,dynamic_cast(r))); + if ( dynamic_cast(r) && r->title()) { + Glib::ustring current = symbol_set->get_active_text(); + if (current == ALLDOCS) { + l[doc_title + r->title()] = std::make_pair(doc_title,dynamic_cast(r)); + } else { + l[r->title()] = std::make_pair(doc_title,dynamic_cast(r)); + } } for (auto& child: r->children) { symbolsInDocRecursive(&child, l, doc_title); } } -std::vector > +std::map > SymbolsDialog::symbolsInDoc( SPDocument* symbol_document, Glib::ustring doc_title) { - std::vector > l; + std::map > l; if (symbol_document) { symbolsInDocRecursive (symbol_document->getRoot(), l , doc_title); } @@ -999,8 +1004,8 @@ bool SymbolsDialog::callbackSymbols(){ if (l.size()) { showOverlay(); for (auto symbol_data = l.begin(); symbol_data != l.end();) { - Glib::ustring doc_title = symbol_data->first; - SPSymbol * symbol = symbol_data->second; + Glib::ustring doc_title = symbol_data->second.first; + SPSymbol * symbol = symbol_data->second.second; counter_symbols ++; gchar const *symbol_title_char = symbol->title(); gchar const *symbol_desc_char = symbol->description(); @@ -1116,8 +1121,10 @@ void SymbolsDialog::addSymbols() { continue; } Glib::ustring doc_title = documentTitle(symbol_document); - std::vector > l_tmp = symbolsInDoc(symbol_document, doc_title); - l.insert(l.end(), std::make_move_iterator(l_tmp.begin()), std::make_move_iterator(l_tmp.end())); + std::map > l_tmp = symbolsInDoc(symbol_document, doc_title); + for(auto &p : l_tmp ) { + l[p.first] = p.second; + } l_tmp.clear(); } counter_symbols = 0; @@ -1310,11 +1317,11 @@ gchar const *buffer = ""; SPDocument* doc = SPDocument::createNewDocFromMem( buffer, strlen(buffer), FALSE ); - std::vector > symbols_data = symbolsInDoc(doc, "Overlay Doc"); + std::map > symbols_data = symbolsInDoc(doc, "Overlay Doc"); Glib::RefPtr pixbuf(NULL); for(auto data:symbols_data) { - Glib::ustring doc_title = data.first; - SPSymbol * symbol = data.second; + Glib::ustring doc_title = data.second.first; + SPSymbol * symbol = data.second.second; if (!strcmp(symbol->getId(), icon_title)) { pixbuf = drawSymbol(symbol, psize); return pixbuf; diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 2fcdcfe72..f387dde51 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -86,8 +86,8 @@ private: std::pair getSymbolsSet(Glib::ustring title); void addSymbol( SPObject* symbol, Glib::ustring doc_title); SPDocument* symbolsPreviewDoc(); - void symbolsInDocRecursive (SPObject *r, std::vector > &l, Glib::ustring doc_title); - std::vector > symbolsInDoc( SPDocument* document, Glib::ustring doc_title); + void symbolsInDocRecursive (SPObject *r, std::map > &l, 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); void beforeSearch(GdkEventKey* evt); @@ -106,7 +106,7 @@ private: Glib::RefPtr getOverlay(Gtk::Image* image, gchar const * icon_title, unsigned psize); /* Keep track of all symbol template documents */ std::map symbol_sets; - std::vector > l; + std::map > l; // Index into sizes which is selected int pack_size; // Scale factor -- cgit v1.2.3 From 0af722a0a0eaef1b1f2bb096935af2c6645c9719 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Fri, 10 Nov 2017 01:58:44 +0100 Subject: Start working on Eduard improvements --- src/ui/dialog/symbols.cpp | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index aef7948d8..44f161184 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -432,8 +432,8 @@ void SymbolsDialog::rebuild() { icons_found = false; //We are not in search all docs if (search->get_text() != _("Searching...") && - search->get_text() != _("Loading documents...") && - search->get_text() != _("Documents done, searchig inside...") ) + search->get_text() != _("Loading all symbols...") && + search->get_text() != _("Searching....") ) { search_str = ""; search->set_text(""); @@ -446,22 +446,25 @@ void SymbolsDialog::rebuild() { } void SymbolsDialog::showOverlay() { #if GTK_CHECK_VERSION(3,2,4) -Glib::ustring current = Glib::Markup::escape_text(symbol_set->get_active_text()); + Glib::ustring current = Glib::Markup::escape_text(symbol_set->get_active_text()); + overlay_icon->set_from_icon_name("none", iconsize); if (current == ALLDOCS && - search->get_text() != _("Loading documents...") && + search->get_text() != _("Loading all symbols...") && !l.size()) { if (!all_docs_processed ) { + overlay_icon->set_from_icon_name("search", iconsize); overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time,\n search will be slow.\nPlease wait ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("First search can be slow.")) + Glib::ustring("")); } else if (!icons_found && !search_str.empty()) { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found ...")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a different search term.")) + Glib::ustring("")); } else { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("All symbol sets ...")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); + overlay_icon->set_from_icon_name("search", iconsize); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("")) + Glib::ustring("")); } - } else if (current == ALLDOCS && search->get_text() == _("Loading documents...")) { + } else if (current == ALLDOCS && search->get_text() == _("Loading all symbols...")) { if (!all_docs_processed) { overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); overlay_desc->set_markup(Glib::ustring("")+ Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); @@ -472,16 +475,15 @@ Glib::ustring current = Glib::Markup::escape_text(symbol_set->get_active_text()) } } else if (!number_symbols && (current != CURRENTDOC || !search_str.empty())) { overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); } else if (!number_symbols && current == CURRENTDOC) { overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols in current document.\nYou could create in the current document\n or add into from other different symbol set.")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols in current document\nChoose a different symbol set\nor add a new symbol.")) + Glib::ustring("")); } else if (!icons_found && !search_str.empty()) { overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); } overlay_opacity->show(); - overlay_icon->set_from_icon_name("none", iconsize); overlay_icon->show(); overlay_title->show(); overlay_desc->show(); @@ -826,7 +828,9 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) symbol_set->append(CURRENTDOC); symbol_set->append(ALLDOCS); for(auto const &symbol_document_map : symbol_sets) { - symbol_set->append(symbol_document_map.first); + if (CURRENTDOC != symbol_document_map.first) { + symbol_set->append(symbol_document_map.first); + } } symbol_set->set_active_text(title); sensitive = true; @@ -865,7 +869,9 @@ SymbolsDialog::getSymbolsSet(Glib::ustring title) symbol_set->append(CURRENTDOC); symbol_set->append(ALLDOCS); for(auto const &symbol_document_map : symbol_sets) { - symbol_set->append(symbol_document_map.first); + if (CURRENTDOC != symbol_document_map.first) { + symbol_set->append(symbol_document_map.first); + } } symbol_set->set_active_text(new_title); sensitive = true; @@ -991,7 +997,7 @@ void SymbolsDialog::beforeSearch(GdkEventKey* evt) } else { idleconn.disconnect(); idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackAllSymbols)); - search->set_text(_("Loading documents...")); + search->set_text(_("Loading all symbols...")); } } @@ -1053,7 +1059,7 @@ bool SymbolsDialog::callbackSymbols(){ bool SymbolsDialog::callbackAllSymbols(){ Glib::ustring current = symbol_set->get_active_text(); - if (current == ALLDOCS && search->get_text() == _("Loading documents...")) { + 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) { @@ -1075,7 +1081,7 @@ bool SymbolsDialog::callbackAllSymbols(){ progress_bar->set_fraction(1.0); all_docs_processed = true; addSymbols(); - search->set_text("Documents done, searchig inside..."); + search->set_text("Searching...."); return false; } return true; -- cgit v1.2.3 From 5ec782085c8ad17039591316e00140da6609b0ef Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Fri, 10 Nov 2017 19:47:09 +0100 Subject: Add eduard improvements --- src/ui/dialog/symbols.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 44f161184..1fcede8f1 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -453,15 +453,15 @@ void SymbolsDialog::showOverlay() { !l.size()) { if (!all_docs_processed ) { - overlay_icon->set_from_icon_name("search", iconsize); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); + overlay_icon->set_from_icon_name("searching", iconsize); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Search in all symbol sets ...")) + Glib::ustring("")); overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("First search can be slow.")) + Glib::ustring("")); } else if (!icons_found && !search_str.empty()) { overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a different search term.")) + Glib::ustring("")); } else { - overlay_icon->set_from_icon_name("search", iconsize); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); + overlay_icon->set_from_icon_name("searching", iconsize); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Search in all symbol sets ...")) + Glib::ustring("")); overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("")) + Glib::ustring("")); } } else if (current == ALLDOCS && search->get_text() == _("Loading all symbols...")) { -- cgit v1.2.3 From c78c92430c6a07adf448fe9ff8105f2935aa1d5e Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Thu, 9 Nov 2017 19:03:26 +0100 Subject: Add lock margins to document settings --- src/ui/dialog/symbols.cpp.orig | 1364 ++++++++++++++++++++++++++++++++++++++++ src/ui/dialog/symbols.cpp.rej | 384 +++++++++++ src/ui/dialog/symbols.h.orig | 172 +++++ src/ui/dialog/symbols.h.rej | 19 + src/ui/widget/page-sizer.cpp | 45 +- src/ui/widget/page-sizer.h | 26 +- 6 files changed, 1994 insertions(+), 16 deletions(-) create mode 100644 src/ui/dialog/symbols.cpp.orig create mode 100644 src/ui/dialog/symbols.cpp.rej create mode 100644 src/ui/dialog/symbols.h.orig create mode 100644 src/ui/dialog/symbols.h.rej (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp.orig b/src/ui/dialog/symbols.cpp.orig new file mode 100644 index 000000000..52f22103f --- /dev/null +++ b/src/ui/dialog/symbols.cpp.orig @@ -0,0 +1,1364 @@ +/** + * @file + * Symbols dialog. + */ +/* Authors: + * Copyright (C) 2012 Tavmjong Bah + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#include +#include +#include + +#include "path-prefix.h" +#include "io/sys.h" +#include "io/resource.h" + +#include "ui/cache/svg_preview_cache.h" +#include "ui/clipboard.h" +#include "ui/icon-names.h" + +#include "symbols.h" + +#include "selection.h" +#include "desktop.h" + +#include "document.h" +#include "inkscape.h" +#include "sp-root.h" +#include "sp-use.h" +#include "sp-defs.h" +#include "sp-symbol.h" + +#ifdef WITH_LIBVISIO + #include + + // TODO: Drop this check when librevenge is widespread. + #if WITH_LIBVISIO01 + #include + + using librevenge::RVNGFileStream; + using librevenge::RVNGString; + using librevenge::RVNGStringVector; + using librevenge::RVNGPropertyList; + using librevenge::RVNGSVGDrawingGenerator; + #else + #include + + typedef WPXFileStream RVNGFileStream; + typedef libvisio::VSDStringVector RVNGStringVector; + #endif +#endif + +#include "verbs.h" +#include "helper/action.h" +#include + +namespace Inkscape { +namespace UI { + +namespace Dialog { + +// See: http://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeModelColumnRecord.html +class SymbolColumns : public Gtk::TreeModel::ColumnRecord +{ +public: + + Gtk::TreeModelColumn symbol_id; + Gtk::TreeModelColumn symbol_title; + Gtk::TreeModelColumn symbol_doc_title; + Gtk::TreeModelColumn< Glib::RefPtr > symbol_image; + + + SymbolColumns() { + add(symbol_id); + add(symbol_title); + add(symbol_doc_title); + add(symbol_image); + } +}; + +SymbolColumns* SymbolsDialog::getColumns() +{ + SymbolColumns* columns = new SymbolColumns(); + return columns; +} + +/** + * Constructor + */ +SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : + UI::Widget::Panel("", prefsPath, SP_VERB_DIALOG_SYMBOLS), + store(Gtk::ListStore::create(*getColumns())), + icon_view(0), + current_desktop(0), + desk_track(), + current_document(0), + preview_document(0), + instanceConns() +{ + + /******************** Table *************************/ + auto table = new Gtk::Grid(); + table->set_margin_left(3); + table->set_margin_right(3); + table->set_margin_top(4); + // panel is a cloked Gtk::VBox + _getContents()->pack_start(*Gtk::manage(table), Gtk::PACK_EXPAND_WIDGET); + guint row = 0; + + /******************** Symbol Sets *************************/ + Gtk::Label* label_set = new Gtk::Label(_("Symbol set: ")); + table->attach(*Gtk::manage(label_set),0,row,1,1); + symbol_set = new Gtk::ComboBoxText(); // Fill in later + symbol_set->append(_("Current Document")); + symbol_set->append(_("All symbols sets")); + symbol_set->set_active_text(_("Current Document")); + symbol_set->set_hexpand(); + + table->attach(*Gtk::manage(symbol_set),1,row,1,1); + sigc::connection connSet = symbol_set->signal_changed().connect( + sigc::mem_fun(*this, &SymbolsDialog::rebuild)); + instanceConns.push_back(connSet); + + ++row; + + /******************** Separator *************************/ + + + Gtk::Separator* separator = Gtk::manage(new Gtk::Separator()); // Search + separator->set_margin_top(10); + separator->set_margin_bottom(10); + table->attach(*Gtk::manage(separator),0,row,2,1); + + ++row; + + /******************** Search *************************/ + + + search = Gtk::manage(new Gtk::SearchEntry()); // Search + search->set_tooltip_text(_("Return to start search.")); + search->signal_key_press_event().connect_notify( sigc::mem_fun(*this, &SymbolsDialog::beforeSearch)); + search->signal_key_release_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::unsensitive)); + search->set_margin_left(10); + search->set_margin_right(10); + search->set_margin_bottom(6); + search->signal_search_changed().connect(sigc::mem_fun(*this, &SymbolsDialog::clearSearch)); + table->attach(*Gtk::manage(search),0,row,2,1); + search_str = ""; + + ++row; + + + /********************* Icon View **************************/ + SymbolColumns* columns = getColumns(); + + icon_view = new Gtk::IconView(static_cast >(store)); + //icon_view->set_text_column( columns->symbol_id ); + icon_view->set_tooltip_column( 1 ); + icon_view->set_pixbuf_column( columns->symbol_image ); + // Giving the iconview a small minimum size will help users understand + // What the dialog does. + icon_view->set_size_request( 100, 250 ); + + std::vector< Gtk::TargetEntry > targets; + targets.push_back(Gtk::TargetEntry( "application/x-inkscape-paste")); + + icon_view->enable_model_drag_source (targets, Gdk::BUTTON1_MASK, Gdk::ACTION_COPY); + icon_view->signal_drag_data_get().connect( + sigc::mem_fun(*this, &SymbolsDialog::iconDragDataGet)); + + sigc::connection connIconChanged; + connIconChanged = icon_view->signal_selection_changed().connect( + sigc::mem_fun(*this, &SymbolsDialog::iconChanged)); + instanceConns.push_back(connIconChanged); + + scroller = new Gtk::ScrolledWindow(); + scroller->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); + scroller->add(*Gtk::manage(icon_view)); + scroller->set_hexpand(); + scroller->set_vexpand(); +#if GTK_CHECK_VERSION(3,2,4) + overlay = new Gtk::Overlay(); + overlay->set_hexpand(); + overlay->set_vexpand(); + overlay->add(* scroller); + scroller->set_size_request(100, 250); + table->attach(*Gtk::manage(overlay),0,row,2,1); +#else + table->attach(*Gtk::manage(scroller),0,row,2,1); +#endif + ++row; + + /******************** Progress *******************************/ + progress = new Gtk::HBox(); + 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_left(20); + progress->set_margin_right(20); + + ++row; + + /******************** Tools *******************************/ + tools = new Gtk::HBox(); + + //tools->set_layout( Gtk::BUTTONBOX_END ); + scroller->set_hexpand(); + table->attach(*Gtk::manage(tools),0,row,2,1); + + auto add_symbol_image = Gtk::manage(new Gtk::Image()); + add_symbol_image->set_from_icon_name("symbol-add", Gtk::ICON_SIZE_SMALL_TOOLBAR); + + add_symbol = Gtk::manage(new Gtk::Button()); + add_symbol->add(*add_symbol_image); + add_symbol->set_tooltip_text(_("Add Symbol from the current document.")); + add_symbol->set_relief( Gtk::RELIEF_NONE ); + add_symbol->set_focus_on_click( false ); + add_symbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::insertSymbol)); + tools->pack_start(* add_symbol, Gtk::PACK_SHRINK); + + auto remove_symbolImage = Gtk::manage(new Gtk::Image()); + remove_symbolImage->set_from_icon_name("symbol-remove", Gtk::ICON_SIZE_SMALL_TOOLBAR); + + remove_symbol = Gtk::manage(new Gtk::Button()); + remove_symbol->add(*remove_symbolImage); + remove_symbol->set_tooltip_text(_("Remove Symbol from the current document.")); + remove_symbol->set_relief( Gtk::RELIEF_NONE ); + remove_symbol->set_focus_on_click( false ); + remove_symbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::revertSymbol)); + tools->pack_start(* remove_symbol, Gtk::PACK_SHRINK); + + Gtk::Label* spacer = Gtk::manage(new Gtk::Label("")); + tools->pack_start(* Gtk::manage(spacer)); + + // Pack size (controls display area) + pack_size = 2; // Default 32px + + auto packMoreImage = Gtk::manage(new Gtk::Image()); + packMoreImage->set_from_icon_name("pack-more", Gtk::ICON_SIZE_SMALL_TOOLBAR); + + more = Gtk::manage(new Gtk::Button()); + more->add(*packMoreImage); + more->set_tooltip_text(_("Display more icons in row.")); + more->set_relief( Gtk::RELIEF_NONE ); + more->set_focus_on_click( false ); + more->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::packmore)); + tools->pack_start(* more, Gtk::PACK_SHRINK); + + auto packLessImage = Gtk::manage(new Gtk::Image()); + packLessImage->set_from_icon_name("pack-less", Gtk::ICON_SIZE_SMALL_TOOLBAR); + + fewer = Gtk::manage(new Gtk::Button()); + fewer->add(*packLessImage); + fewer->set_tooltip_text(_("Display fewer icons in row.")); + fewer->set_relief( Gtk::RELIEF_NONE ); + fewer->set_focus_on_click( false ); + fewer->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::packless)); + tools->pack_start(* fewer, Gtk::PACK_SHRINK); + + // Toggle scale to fit on/off + auto fit_symbolImage = Gtk::manage(new Gtk::Image()); + fit_symbolImage->set_from_icon_name("symbol-fit", Gtk::ICON_SIZE_SMALL_TOOLBAR); + + fit_symbol = Gtk::manage(new Gtk::ToggleButton()); + fit_symbol->add(*fit_symbolImage); + fit_symbol->set_tooltip_text(_("Toggle 'fit' symbols in icon space.")); + fit_symbol->set_relief( Gtk::RELIEF_NONE ); + fit_symbol->set_focus_on_click( false ); + fit_symbol->set_active( true ); + fit_symbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::rebuild)); + tools->pack_start(* fit_symbol, Gtk::PACK_SHRINK); + + // Render size (scales symbols within display area) + scale_factor = 0; // Default 1:1 * pack_size/pack_size default + auto zoom_outImage = Gtk::manage(new Gtk::Image()); + zoom_outImage->set_from_icon_name("symbol-smaller", Gtk::ICON_SIZE_SMALL_TOOLBAR); + + zoom_out = Gtk::manage(new Gtk::Button()); + zoom_out->add(*zoom_outImage); + zoom_out->set_tooltip_text(_("Make symbols smaller by zooming out.")); + zoom_out->set_relief( Gtk::RELIEF_NONE ); + zoom_out->set_focus_on_click( false ); + zoom_out->set_sensitive( false ); + zoom_out->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::zoomout)); + tools->pack_start(* zoom_out, Gtk::PACK_SHRINK); + + auto zoom_inImage = Gtk::manage(new Gtk::Image()); + zoom_inImage->set_from_icon_name("symbol-bigger", Gtk::ICON_SIZE_SMALL_TOOLBAR); + + zoom_in = Gtk::manage(new Gtk::Button()); + zoom_in->add(*zoom_inImage); + zoom_in->set_tooltip_text(_("Make symbols bigger by zooming in.")); + zoom_in->set_relief( Gtk::RELIEF_NONE ); + zoom_in->set_focus_on_click( false ); + zoom_in->set_sensitive( false ); + zoom_in->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::zoomin)); + tools->pack_start(* zoom_in, Gtk::PACK_SHRINK); + + ++row; + + sensitive = true; + + current_desktop = SP_ACTIVE_DESKTOP; + current_document = current_desktop->getDocument(); + preview_document = symbolsPreviewDoc(); /* Template to render symbols in */ + preview_document->ensureUpToDate(); /* Necessary? */ + key = SPItem::display_key_new(1); + renderDrawing.setRoot(preview_document->getRoot()->invoke_show(renderDrawing, key, SP_ITEM_SHOW_DISPLAY )); + + // This might need to be a global variable so setTargetDesktop can modify it + SPDefs *defs = current_document->getDefs(); + + /*************************Overlays******************************/ +#if GTK_CHECK_VERSION(3,2,4) + //Loading + overlay_opacity = new Gtk::Image(); + overlay_opacity->set(getOverlay(overlay_opacity, "overlay", 1000)); + overlay_opacity->set_halign(Gtk::ALIGN_START ); + overlay_opacity->set_valign(Gtk::ALIGN_START ); + //No results + iconsize = Gtk::IconSize().register_new(Glib::ustring("ICON_SIZE_DIALOG_EXTRA"), 110, 110); + overlay_icon = new Gtk::Image(); + overlay_icon->set_from_icon_name("none", iconsize); + overlay_icon = new Gtk::Image(); + overlay_icon->set_halign(Gtk::ALIGN_CENTER ); + overlay_icon->set_valign(Gtk::ALIGN_START ); + overlay_icon->set_margin_top(45); + overlay_title = new Gtk::Label(); + overlay_title->set_halign(Gtk::ALIGN_CENTER ); + overlay_title->set_valign(Gtk::ALIGN_START ); + overlay_title->set_justify(Gtk::JUSTIFY_CENTER); + overlay_title->set_margin_top(155); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc = new Gtk::Label(); + overlay_desc->set_halign(Gtk::ALIGN_CENTER ); + overlay_desc->set_valign(Gtk::ALIGN_START ); + overlay_desc->set_margin_top(180); + overlay_desc->set_justify(Gtk::JUSTIFY_CENTER); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a another search or select other set")) + Glib::ustring("")); + overlay->add_overlay(* overlay_opacity); + overlay->add_overlay(* overlay_icon); + overlay->add_overlay(* overlay_title); + overlay->add_overlay(* overlay_desc); +#endif + sigc::connection defsModifiedConn = defs->connectModified(sigc::mem_fun(*this, &SymbolsDialog::defsModified)); + instanceConns.push_back(defsModifiedConn); + + sigc::connection selectionChangedConn = current_desktop->selection->connectChanged( + sigc::mem_fun(*this, &SymbolsDialog::selectionChanged)); + instanceConns.push_back(selectionChangedConn); + + sigc::connection documentReplacedConn = current_desktop->connectDocumentReplaced( + sigc::mem_fun(*this, &SymbolsDialog::documentReplaced)); + instanceConns.push_back(documentReplacedConn); + getSymbolsFilename(); + icons_found = false; + + addSymbolsInDoc(current_document); /* Defaults to current document */ + sigc::connection desktopChangeConn = + desk_track.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); + instanceConns.push_back( desktopChangeConn ); + desk_track.connect(GTK_WIDGET(gobj())); +#if GTK_CHECK_VERSION(3,2,4) + overlay->hide(); +#endif +} + +SymbolsDialog::~SymbolsDialog() +{ + for (std::vector::iterator it = instanceConns.begin(); it != instanceConns.end(); ++it) { + it->disconnect(); + } + idleconn.disconnect(); + instanceConns.clear(); + desk_track.disconnect(); +} + +SymbolsDialog& SymbolsDialog::getInstance() +{ + return *new SymbolsDialog(); +} + +void SymbolsDialog::packless() { + if(pack_size < 4) { + pack_size++; + rebuild(); + } +} + +void SymbolsDialog::packmore() { + if(pack_size > 0) { + pack_size--; + rebuild(); + } +} + +void SymbolsDialog::zoomin() { + if(scale_factor < 4) { + scale_factor++; + rebuild(); + } +} + +void SymbolsDialog::zoomout() { + if(scale_factor > -8) { + scale_factor--; + rebuild(); + } +} + +void SymbolsDialog::rebuild() { + + if (!sensitive) { + return; + } + + if( fit_symbol->get_active() ) { + zoom_in->set_sensitive( false ); + zoom_out->set_sensitive( false ); + } else { + zoom_in->set_sensitive( true); + zoom_out->set_sensitive( true ); + } + store->clear(); + SPDocument* symbol_document = selectedSymbols(); + icons_found = false; + //We are not in search all docs + if (search->get_text() != _("Searching...") && + search->get_text() != _("Loading documents...") && + search->get_text() != _("Documents done, searchig inside...") ) + { + search_str = ""; + search->set_text(""); + } + if (symbol_document) { + addSymbolsInDoc(symbol_document); + } else { + idleconn.disconnect(); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); + } +} + +void SymbolsDialog::insertSymbol() { + Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_SYMBOL ); + SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) current_desktop) ); + sp_action_perform (action, NULL); +} + +void SymbolsDialog::revertSymbol() { + Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_UNSYMBOL ); + SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) current_desktop ) ); + sp_action_perform (action, NULL); +} + +void SymbolsDialog::iconDragDataGet(const Glib::RefPtr& /*context*/, Gtk::SelectionData& data, guint /*info*/, guint /*time*/) +{ + auto iconArray = icon_view->get_selected_items(); + + if( iconArray.empty() ) { + //std::cout << " iconArray empty: huh? " << std::endl; + } else { + Gtk::TreeModel::Path const & path = *iconArray.begin(); + Gtk::ListStore::iterator row = store->get_iter(path); + Glib::ustring symbol_id = (*row)[getColumns()->symbol_id]; + GdkAtom dataAtom = gdk_atom_intern( "application/x-inkscape-paste", FALSE ); + gtk_selection_data_set( data.gobj(), dataAtom, 9, (guchar*)symbol_id.c_str(), symbol_id.length() ); + } + +} + +void SymbolsDialog::defsModified(SPObject * /*object*/, guint /*flags*/) +{ + Glib::ustring doc_title = symbol_set->get_active_text(); + if (doc_title != _("All symbols sets") && !symbol_sets[symbol_set->get_active_text()] ) { + rebuild(); + } +} + +void SymbolsDialog::selectionChanged(Inkscape::Selection *selection) { + Glib::ustring symbol_id = selectedSymbolId(); + Glib::ustring doc_title = selectedSymbolDocTitle(); + if (!doc_title.empty()) { + SPDocument* symbol_document = symbol_sets[doc_title]; + if (!symbol_document) { + //we are in global search so get the original symbol document by title + symbol_document = selectedSymbols(); + } + if (symbol_document) { + SPObject* symbol = symbol_document->getObjectById(symbol_id); + if(symbol && !selection->includes(symbol)) { + icon_view->unselect_all(); + } + } + } +} + +void SymbolsDialog::documentReplaced(SPDesktop *desktop, SPDocument *document) +{ + current_desktop = desktop; + current_document = document; + rebuild(); +} + +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(); + if (doc_title == _("All symbols sets")) { + return NULL; + } + SPDocument* symbol_document = symbol_sets[doc_title]; + if( !symbol_document ) { + symbol_document = getSymbolsSet(doc_title).second; + // Symbol must be from Current Document (this method of checking should be language independent). + if( !symbol_document ) { + // Symbol must be from Current Document (this method of + // checking should be language independent). + symbol_document = current_document; + add_symbol->set_sensitive( true ); + remove_symbol->set_sensitive( true ); + } else { + add_symbol->set_sensitive( false ); + remove_symbol->set_sensitive( false ); + } + } + return symbol_document; +} + +Glib::ustring SymbolsDialog::selectedSymbolId() { + + auto iconArray = icon_view->get_selected_items(); + + if( !iconArray.empty() ) { + Gtk::TreeModel::Path const & path = *iconArray.begin(); + Gtk::ListStore::iterator row = store->get_iter(path); + return (*row)[getColumns()->symbol_id]; + } + return Glib::ustring(""); +} + +Glib::ustring SymbolsDialog::selectedSymbolDocTitle() { + + auto iconArray = icon_view->get_selected_items(); + + if( !iconArray.empty() ) { + Gtk::TreeModel::Path const & path = *iconArray.begin(); + Gtk::ListStore::iterator row = store->get_iter(path); + return (*row)[getColumns()->symbol_doc_title]; + } + return Glib::ustring(""); +} + +Glib::ustring SymbolsDialog::documentTitle(SPDocument* symbol_doc) { + Glib::ustring title = _("Untitled document"); + if (symbol_doc) { + SPRoot * root = symbol_doc->getRoot(); + if (root->title()) { + title = ellipsize(Glib::ustring(root->title())); + return title; + } + } + Glib::ustring current = symbol_set->get_active_text(); + if (current == _("Current Document")) { + return current; + } + return title; +} + +void SymbolsDialog::iconChanged() { + + Glib::ustring symbol_id = selectedSymbolId(); + SPDocument* symbol_document = selectedSymbols(); + if (!symbol_document) { + //we are in global search so get the original symbol document by title + Glib::ustring doc_title = selectedSymbolDocTitle(); + if (!doc_title.empty()) { + symbol_document = symbol_sets[doc_title]; + } + } + if (symbol_document) { + SPObject* symbol = symbol_document->getObjectById(symbol_id); + + if( symbol ) { + if( symbol_document == current_document ) { + // Select the symbol on the canvas so it can be manipulated + current_desktop->selection->set( symbol, false ); + } + // Find style for use in + // First look for default style stored in + gchar const* style = symbol->getAttribute("inkscape:symbol-style"); + if( !style ) { + // If no default style in , look in documents. + if( symbol_document == current_document ) { + style = styleFromUse( symbol_id.c_str(), current_document ); + } else { + style = symbol_document->getReprRoot()->attribute("style"); + } + } + + ClipboardManager *cm = ClipboardManager::get(); + cm->copySymbol(symbol->getRepr(), style, symbol_document == current_document); + } + } +} + +#ifdef WITH_LIBVISIO + +#if WITH_LIBVISIO01 +// Extend libvisio's native RVNGSVGDrawingGenerator with support for extracting stencil names (to be used as ID/title) +class REVENGE_API RVNGSVGDrawingGenerator_WithTitle : public RVNGSVGDrawingGenerator { + public: + RVNGSVGDrawingGenerator_WithTitle(RVNGStringVector &output, RVNGStringVector &titles, const RVNGString &nmSpace) + : RVNGSVGDrawingGenerator(output, nmSpace) + , _titles(titles) + {} + + void startPage(const RVNGPropertyList &propList) + { + RVNGSVGDrawingGenerator::startPage(propList); + if (propList["draw:name"]) { + _titles.append(propList["draw:name"]->getStr()); + } else { + _titles.append(""); + } + } + + private: + RVNGStringVector &_titles; +}; +#endif + +// Read Visio stencil files +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 + // therefore attempt to convert uri to the system codepage + // even if this is not possible the alternate short (8.3) file name will be used if available + fullname = g_win32_locale_filename_from_utf8(filename.c_str()); + #else + filename.copy(fullname, filename.length()); + #endif + + RVNGFileStream input(fullname); + g_free(fullname); + + if (!libvisio::VisioDocument::isSupported(&input)) { + return NULL; + } + + RVNGStringVector output; + RVNGStringVector titles; +#if WITH_LIBVISIO01 + RVNGSVGDrawingGenerator_WithTitle generator(output, titles, "svg"); + + if (!libvisio::VisioDocument::parseStencils(&input, &generator)) { +#else + if (!libvisio::VisioDocument::generateSVGStencils(&input, output)) { +#endif + return NULL; + } + + if (output.empty()) { + return NULL; + } + + // prepare a valid title for the symbol file + Glib::ustring title = Glib::Markup::escape_text(name); + // prepare a valid id prefix for symbols libvisio doesn't give us a name for + Glib::RefPtr regex1 = Glib::Regex::create("[^a-zA-Z0-9_-]"); + Glib::ustring id = regex1->replace(name, 0, "_", Glib::REGEX_MATCH_PARTIAL); + + Glib::ustring tmpSVGOutput; + tmpSVGOutput += "\n"; + tmpSVGOutput += "\n"; + tmpSVGOutput += " "; + tmpSVGOutput += title; + tmpSVGOutput += "\n"; + tmpSVGOutput += " \n"; + + // Each "symbol" is in its own SVG file, we wrap with and merge into one file. + for (unsigned i=0; ireplace(titles[i].cstr(), 0, "_", Glib::REGEX_MATCH_PARTIAL); + } else { + ss << id << "_" << i; + } + + tmpSVGOutput += " \n"; + +#if WITH_LIBVISIO01 + if (titles.size() == output.size() && titles[i] != "") { + tmpSVGOutput += " " + Glib::ustring(RVNGString::escapeXML(titles[i].cstr()).cstr()) + "\n"; + } +#endif + + std::istringstream iss( output[i].cstr() ); + std::string line; + while( std::getline( iss, line ) ) { + if( line.find( "svg:svg" ) == std::string::npos ) { + tmpSVGOutput += " " + line + "\n"; + } + } + + tmpSVGOutput += " \n"; + } + + tmpSVGOutput += " \n"; + tmpSVGOutput += "\n"; + + return SPDocument::createNewDocFromMem( tmpSVGOutput.c_str(), strlen( tmpSVGOutput.c_str()), 0 ); + +} +#endif + +/* Hunts preference directories for symbol files */ +void SymbolsDialog::getSymbolsFilename() { + + using namespace Inkscape::IO::Resource; + Glib::ustring title; + number_docs = 0; + for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { + if(Glib::str_has_suffix(filename, ".svg")) { + //TODO: find a way to get real title without loading all SPDocument + std::size_t found = filename.find_last_of("/\\"); + filename = filename.substr(found+1); + title = filename.erase(filename.rfind('.')); + if(title.empty()) { + title = _("Unnamed Symbols"); + } + symbol_sets[title]= NULL; + symbol_set->append(title); + ++number_docs; + } +#ifdef WITH_LIBVISIO + if(Glib::str_has_suffix(filename, ".vss")) { + std::size_t found = filename.find_last_of("/\\"); + filename = filename.substr(found+1); + title = filename.erase(filename.rfind('.')); + if(title.empty()) { + title = _("Unnamed Symbols"); + } + symbol_sets[title]= NULL; + symbol_set->append(title); + ++number_docs; + } +#endif + } +} + +/* Hunts preference directories for symbol files */ +std::pair +SymbolsDialog::getSymbolsSet(Glib::ustring title) +{ + if (symbol_sets[title]) { + return std::make_pair(title, symbol_sets[title]); + } + using namespace Inkscape::IO::Resource; + SPDocument* symbol_doc = NULL; + Glib::ustring new_title; + size_t i = 0; + for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { + std::size_t pos = filename.find_last_of("/\\"); + if (pos != std::string::npos) { + Glib::ustring filename_short = filename.substr(pos+1); + if(filename_short == title + ".svg") { + symbol_doc = SPDocument::createNewDoc(filename.c_str(), FALSE); + if(symbol_doc) { + new_title = documentTitle(symbol_doc); + } + } + if(Glib::str_has_suffix(filename, ".svg")) { + i++; + } +#ifdef WITH_LIBVISIO + if(filename_short == title + ".vss") { + symbol_doc = read_vss(filename, title); + if(symbol_doc) { + new_title = documentTitle(symbol_doc); + } + } + if(Glib::str_has_suffix(filename, ".vss")) { + i++; + } +#endif + if(symbol_doc) { + symbol_sets.erase(title); + symbol_sets[new_title]= symbol_doc; + sensitive = false; + symbol_set->remove_text(i+1); + symbol_set->insert (i+1, new_title); + symbol_set->set_active(i+1); + symbol_set->set_active_text(new_title); + sensitive = true; + break; + } + } + } + return std::make_pair(new_title, symbol_doc); +} + +void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::vector > &l, Glib::ustring doc_title) +{ + if(!r) return; + + // Stop multiple counting of same symbol + if ( dynamic_cast(r) ) { + return; + } + + if ( dynamic_cast(r) ) { + l.push_back(std::make_pair(doc_title,dynamic_cast(r))); + } + for (auto& child: r->children) { + symbolsInDocRecursive(&child, l, doc_title); + } +} + +std::vector > +SymbolsDialog::symbolsInDoc( SPDocument* symbol_document, Glib::ustring doc_title) +{ + + std::vector > l; + if (symbol_document) { + symbolsInDocRecursive (symbol_document->getRoot(), l , doc_title); + } + return l; +} + +void SymbolsDialog::useInDoc (SPObject *r, std::vector &l) +{ + + if ( dynamic_cast(r) ) { + l.push_back(dynamic_cast(r)); + } + + for (auto& child: r->children) { + useInDoc( &child, l ); + } +} + +std::vector SymbolsDialog::useInDoc( SPDocument* useDocument) { + std::vector l; + useInDoc (useDocument->getRoot(), l); + return l; +} + +// 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* style = 0; + std::vector l = useInDoc( document ); + for( auto use:l ) { + if ( use ) { + gchar const *href = use->getRepr()->attribute("xlink:href"); + if( href ) { + Glib::ustring href2(href); + Glib::ustring id2(id); + id2 = "#" + id2; + if( !href2.compare(id2) ) { + style = use->getRepr()->attribute("style"); + break; + } + } + } + } + return style; +} + +void SymbolsDialog::clearSearch() +{ + if(search->get_text().empty() && sensitive) { + enableWidgets(false); + search_str = ""; + store->clear(); + SPDocument* symbol_document = selectedSymbols(); + if (symbol_document) { + //We are not in search all docs + icons_found = false; + addSymbolsInDoc(symbol_document); + } else { + idleconn.disconnect(); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); + enableWidgets(true); + } + } +} + +void SymbolsDialog::enableWidgets(bool enable) +{ + symbol_set->set_sensitive(enable); + search->set_sensitive(enable); + tools ->set_sensitive(enable); +} + +void SymbolsDialog::beforeSearch(GdkEventKey* evt) +{ + sensitive = false; + search_str = search->get_text().lowercase(); + if (evt->keyval != GDK_KEY_Return) { + return; + } + progress_bar->set_fraction(0.0); + enableWidgets(false); + SPDocument* symbol_document = selectedSymbols(); + if (symbol_document) { + //We are not in search all docs + search->set_text(_("Searching...")); + store->clear(); + icons_found = false; + addSymbolsInDoc(symbol_document); + } else { + idleconn.disconnect(); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); + search->set_text(_("Loading documents...")); + } +} + +void SymbolsDialog::unsensitive(GdkEventKey* evt) +{ + sensitive = true; +} + +bool SymbolsDialog::callbackSymbols(){ + Glib::ustring current = symbol_set->get_active_text(); + +#if GTK_CHECK_VERSION(3,2,4) +if (current == _("All symbols sets") && search->get_text() != _("Loading documents...") && !l.size()) + { + if (!all_docs_processed ) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time,\n search will be slow.\nPlease wait ...")) + Glib::ustring("")); + } else { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("All symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); + } + overlay_opacity->show(); + overlay_icon->set_from_icon_name("none", iconsize); + overlay_icon->show(); + overlay_title->show(); + overlay_desc->show(); + return false; + } +#endif + if (current == _("All symbols sets") && search->get_text() == _("Loading documents...")) { +#if GTK_CHECK_VERSION(3,2,4) + overlay_opacity->show(); +#endif + if (!all_docs_processed) { +#if GTK_CHECK_VERSION(3,2,4) + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("")+ Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); + overlay_icon->show(); + overlay_title->show(); + overlay_icon->set_from_icon_name("searching", iconsize); + overlay_desc->show(); +#endif + } + size_t counter = 0; + for(auto const &symbol_document_map : symbol_sets) { + ++counter; + SPDocument* symbol_document = symbol_document_map.second; + if (symbol_document) { + continue; + } + symbol_document = getSymbolsSet(symbol_document_map.first).second; + symbol_set->set_active_text(_("All symbols sets")); + if (!symbol_document) { + continue; + } + progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); + return true; + } +#if GTK_CHECK_VERSION(3,2,4) + overlay_icon->hide(); + overlay_title->hide(); + overlay_desc->hide(); +#endif + progress_bar->set_fraction(1.0); + all_docs_processed = true; + addSymbols(); + search->set_text("Documents done, searchig inside..."); + return true; + } else if (l.size()) { +#if GTK_CHECK_VERSION(3,2,4) + overlay_opacity->show(); + overlay_icon->hide(); + overlay_title->hide(); + overlay_desc->hide(); +#endif + for (auto symbol_data = l.begin(); symbol_data != l.end();) { + Glib::ustring doc_title = symbol_data->first; + SPSymbol * symbol = symbol_data->second; + counter_symbols ++; + gchar const *symbol_title_char = symbol->title(); + gchar const *symbol_desc_char = symbol->description(); + bool found = false; + if (symbol_title_char) { + Glib::ustring symbol_title = Glib::ustring(symbol_title_char).lowercase(); + auto pos = symbol_title.rfind(search_str); + if (pos != std::string::npos) { + found = true; + } + if (!found && symbol_desc_char) { + Glib::ustring symbol_desc = Glib::ustring(symbol_desc_char).lowercase(); + auto pos = symbol_desc.rfind(search_str); + if (pos != std::string::npos) { + found = true; + } + } + } + if (symbol && (search_str.empty() || found || (search_str.empty() && !symbol_title_char))) { + addSymbol( symbol, doc_title); + 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); + if (modulus && counter_symbols % modulus == 0 && !l.empty()) { + return true; + } + } +#if GTK_CHECK_VERSION(3,2,4) + if (!icons_found && !search_str.empty()) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); + overlay_icon->set_from_icon_name("none", iconsize); + overlay_icon->show(); + overlay_title->show(); + overlay_desc->show(); + } else { + overlay_opacity->hide(); + } +#endif + sensitive = false; + search->set_text(search_str); + sensitive = true; + enableWidgets(true); + return false; + } + return true; +} + +Glib::ustring SymbolsDialog::ellipsize(Glib::ustring data, size_t limit) { + if (data.length() > limit) { + return data.substr(0,limit-3) + "..."; + } + return data; +} + +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; + std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); + number_symbols = container_symbols_tmp.size(); + l = container_symbols_tmp; + container_symbols_tmp.clear(); + if (!number_symbols) { +#if GTK_CHECK_VERSION(3,2,4) + overlay_icon->set_from_icon_name("none", iconsize); + overlay_opacity->show(); + overlay_icon->show(); + overlay_title->show(); + overlay_desc->show(); +#endif + sensitive = false; + search->set_text(search_str); + sensitive = true; + enableWidgets(true); + idleconn.disconnect(); + } else { + idleconn.disconnect(); + idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); + } +#if GTK_CHECK_VERSION(3,2,4) + Glib::ustring current = symbol_set->get_active_text(); + if (!number_symbols && (current != _("Current Document") || !search_str.empty())) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); + } else if (!number_symbols) { + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols in current document.\nYou could create in the current document\n or add into from other different symbol set.")) + Glib::ustring("")); + } +#endif +} + +void SymbolsDialog::addSymbols() { + store->clear(); + icons_found = false; + std::vector > container_symbols; + for(auto const &symbol_document_map : symbol_sets) { + SPDocument* symbol_document = symbol_document_map.second; + if (!symbol_document) { + continue; + } + Glib::ustring doc_title = documentTitle(symbol_document); + std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); + container_symbols.insert(container_symbols.end(), std::make_move_iterator(container_symbols_tmp.begin()), std::make_move_iterator(container_symbols_tmp.end())); + container_symbols_tmp.clear(); + } + counter_symbols = 0; + progress_bar->set_fraction(0.0); + number_symbols = container_symbols.size(); + l = container_symbols; + container_symbols.clear(); + if (!number_symbols) { +#if GTK_CHECK_VERSION(3,2,4) + overlay_icon->set_from_icon_name("none", iconsize); + overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); + overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); + overlay_icon->show(); + overlay_title->show(); + overlay_desc->show(); +#endif + idleconn.disconnect(); + sensitive = false; + search->set_text(search_str); + sensitive = true; + enableWidgets(true); + } +} + +void SymbolsDialog::addSymbol( SPObject* symbol, Glib::ustring doc_title) { + + SymbolColumns* columns = getColumns(); + + gchar const *id = symbol->getRepr()->attribute("id"); + gchar const *title = symbol->title(); // From title element + if( !title ) { + title = id; + } + Glib::ustring symbol_title = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "Symbol", title) )); + if (doc_title.empty()) { + doc_title = _("Current Document"); + } + symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" (") + doc_title + Glib::ustring(")")).c_str()))); + Glib::RefPtr pixbuf = drawSymbol( symbol ); + + if( pixbuf ) { + Gtk::ListStore::iterator row = store->append(); + (*row)[columns->symbol_id] = Glib::ustring( id ); + (*row)[columns->symbol_title] = symbol_title; + (*row)[columns->symbol_doc_title] = Glib::Markup::escape_text(doc_title); + (*row)[columns->symbol_image] = pixbuf; + } + + delete columns; +} + +/* + * Returns image of symbol. + * + * Symbols normally are not visible. They must be referenced by a + * element. A temporary document is created with a dummy + * element and a element that references the symbol + * element. Each real symbol is swapped in for the dummy symbol and + * the temporary document is rendered. + */ +Glib::RefPtr +SymbolsDialog::drawSymbol(SPObject *symbol, unsigned force_psize) +{ + // Create a copy repr of the symbol with id="the_symbol" + Inkscape::XML::Document *xml_doc = preview_document->getReprDoc(); + Inkscape::XML::Node *repr = symbol->getRepr()->duplicate(xml_doc); + repr->setAttribute("id", "the_symbol"); + + // Replace old "the_symbol" in preview_document by new. + Inkscape::XML::Node *root = preview_document->getReprRoot(); + SPObject *symbol_old = preview_document->getObjectById("the_symbol"); + if (symbol_old) { + symbol_old->deleteObject(false); + } + + // First look for default style stored in + gchar const* style = repr->attribute("inkscape:symbol-style"); + if( !style ) { + // If no default style in , look in documents. + if( symbol->document == current_document ) { + gchar const *id = symbol->getRepr()->attribute("id"); + style = styleFromUse( id, symbol->document ); + } else { + style = symbol->document->getReprRoot()->attribute("style"); + } + } + // Last ditch effort to provide some default styling + if( !style ) style = "fill:#bbbbbb;stroke:#808080"; + + // This is for display in Symbols dialog only + if( style ) repr->setAttribute( "style", style ); + + // BUG: Symbols don't work if defined outside of . Causes Inkscape + // crash when trying to read in such a file. + root->appendChild(repr); + //defsrepr->appendChild(repr); + Inkscape::GC::release(repr); + + // Uncomment this to get the preview_document documents saved (useful for debugging) + // FILE *fp = fopen (g_strconcat(id, ".svg", NULL), "w"); + // sp_repr_save_stream(preview_document->getReprDoc(), fp); + // fclose (fp); + + // Make sure preview_document is up-to-date. + preview_document->getRoot()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); + preview_document->ensureUpToDate(); + + // Make sure we have symbol in preview_document + SPObject *object_temp = preview_document->getObjectById( "the_use" ); + preview_document->getRoot()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); + preview_document->ensureUpToDate(); + + SPItem *item = dynamic_cast(object_temp); + g_assert(item != NULL); + unsigned psize = SYMBOL_ICON_SIZES[pack_size]; + + Glib::RefPtr pixbuf(NULL); + // We could use cache here, but it doesn't really work with the structure + // of this user interface and we've already cached the pixbuf in the gtklist + + // Find object's bbox in document. + // Note symbols can have own viewport... ignore for now. + //Geom::OptRect dbox = item->geometricBounds(); + Geom::OptRect dbox = item->documentVisualBounds(); + + if (dbox) { + /* Scale symbols to fit */ + double scale = 1.0; + double width = dbox->width(); + double height = dbox->height(); + + if( width == 0.0 ) width = 1.0; + if( height == 0.0 ) height = 1.0; + + if( fit_symbol->get_active() ) + scale = psize / ceil(std::max(width, height)); + else + scale = pow( 2.0, scale_factor/2.0 ) * psize / 32.0; + + if (force_psize > 0) { + psize = force_psize; + scale = psize / ceil(std::max(width, height)); + } + + pixbuf = Glib::wrap(render_pixbuf(renderDrawing, scale, *dbox, psize)); + } + + return pixbuf; +} + +/* + * Return empty doc to render symbols in. + * Symbols are by default not rendered so a element is + * provided. + */ +SPDocument* SymbolsDialog::symbolsPreviewDoc() +{ + // BUG: must be inside + gchar const *buffer = +"" +" " +" " +" " +" " +""; + return SPDocument::createNewDocFromMem( buffer, strlen(buffer), FALSE ); +} + +/* + * Update image widgets + */ +Glib::RefPtr +SymbolsDialog::getOverlay(Gtk::Image* image, gchar const * icon_title, unsigned psize) +{ +gchar const *buffer = +"" +" Inkscape " +" " +" " +" Overlay" +" Overlay Square" +" " +" " +" " +""; + + SPDocument* doc = SPDocument::createNewDocFromMem( buffer, strlen(buffer), FALSE ); + std::vector > symbols_data = symbolsInDoc(doc, "Overlay Doc"); + Glib::RefPtr pixbuf(NULL); + for(auto data:symbols_data) { + Glib::ustring doc_title = data.first; + SPSymbol * symbol = data.second; + if (!strcmp(symbol->getId(), icon_title)) { + pixbuf = drawSymbol(symbol, psize); + return pixbuf; + } + } + return pixbuf; +} + +void SymbolsDialog::setTargetDesktop(SPDesktop *desktop) +{ + if (this->current_desktop != desktop) { + this->current_desktop = desktop; + if( !symbol_sets[symbol_set->get_active_text()] ) { + // Symbol set is from Current document, update + rebuild(); + } + } +} + +} //namespace Dialogs +} //namespace UI +} //namespace Inkscape + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-basic-offset:2 + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=8:softtabstop=2:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/symbols.cpp.rej b/src/ui/dialog/symbols.cpp.rej new file mode 100644 index 000000000..fe32c8bad --- /dev/null +++ b/src/ui/dialog/symbols.cpp.rej @@ -0,0 +1,384 @@ +--- src/ui/dialog/symbols.cpp ++++ src/ui/dialog/symbols.cpp +@@ -348,38 +374,8 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : + + // This might need to be a global variable so setTargetDesktop can modify it + SPDefs *defs = current_document->getDefs(); +- +- /*************************Overlays******************************/ + #if GTK_CHECK_VERSION(3,2,4) +- //Loading +- overlay_opacity = new Gtk::Image(); + overlay_opacity->set(getOverlay(overlay_opacity, "overlay", 1000)); +- overlay_opacity->set_halign(Gtk::ALIGN_START ); +- overlay_opacity->set_valign(Gtk::ALIGN_START ); +- //No results +- iconsize = Gtk::IconSize().register_new(Glib::ustring("ICON_SIZE_DIALOG_EXTRA"), 110, 110); +- overlay_icon = new Gtk::Image(); +- overlay_icon->set_from_icon_name("none", iconsize); +- overlay_icon = new Gtk::Image(); +- overlay_icon->set_halign(Gtk::ALIGN_CENTER ); +- overlay_icon->set_valign(Gtk::ALIGN_START ); +- overlay_icon->set_margin_top(45); +- overlay_title = new Gtk::Label(); +- overlay_title->set_halign(Gtk::ALIGN_CENTER ); +- overlay_title->set_valign(Gtk::ALIGN_START ); +- overlay_title->set_justify(Gtk::JUSTIFY_CENTER); +- overlay_title->set_margin_top(155); +- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); +- overlay_desc = new Gtk::Label(); +- overlay_desc->set_halign(Gtk::ALIGN_CENTER ); +- overlay_desc->set_valign(Gtk::ALIGN_START ); +- overlay_desc->set_margin_top(180); +- overlay_desc->set_justify(Gtk::JUSTIFY_CENTER); +- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a another search or select other set")) + Glib::ustring("")); +- overlay->add_overlay(* overlay_opacity); +- overlay->add_overlay(* overlay_icon); +- overlay->add_overlay(* overlay_title); +- overlay->add_overlay(* overlay_desc); + #endif + sigc::connection defsModifiedConn = defs->connectModified(sigc::mem_fun(*this, &SymbolsDialog::defsModified)); + instanceConns.push_back(defsModifiedConn); +@@ -394,16 +390,11 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : + getSymbolsFilename(); + icons_found = false; + +- Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); +- + addSymbolsInDoc(current_document); /* Defaults to current document */ + sigc::connection desktopChangeConn = + desk_track.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); + instanceConns.push_back( desktopChangeConn ); + desk_track.connect(GTK_WIDGET(gobj())); +-#if GTK_CHECK_VERSION(3,2,4) +- overlay->hide(); +-#endif + } + + SymbolsDialog::~SymbolsDialog() +@@ -411,6 +402,7 @@ SymbolsDialog::~SymbolsDialog() + for (std::vector::iterator it = instanceConns.begin(); it != instanceConns.end(); ++it) { + it->disconnect(); + } ++ idleconn.disconnect(); + instanceConns.clear(); + desk_track.disconnect(); + } +@@ -474,9 +466,68 @@ void SymbolsDialog::rebuild() { + } + if (symbol_document) { + addSymbolsInDoc(symbol_document); ++ } else { ++ showOverlay(); + } + } ++void SymbolsDialog::showOverlay() { ++#if GTK_CHECK_VERSION(3,2,4) ++Glib::ustring current = Glib::Markup::escape_text(symbol_set->get_active_text()); ++ if (current == ALLDOCS && ++ search->get_text() != _("Loading documents...") && ++ !l.size()) ++ { ++ if (!all_docs_processed ) { ++ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); ++ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time,\n search will be slow.\nPlease wait ...")) + Glib::ustring("")); ++ } else if (!icons_found && !search_str.empty()) { ++ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found ...")) + Glib::ustring("")); ++ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); ++ } else { ++ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("All symbol sets ...")) + Glib::ustring("")); ++ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); ++ } ++ } else if (current == ALLDOCS && search->get_text() == _("Loading documents...")) { ++ if (!all_docs_processed) { ++ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); ++ overlay_desc->set_markup(Glib::ustring("")+ Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); ++ overlay_icon->show(); ++ overlay_title->show(); ++ overlay_icon->set_from_icon_name("searching", iconsize); ++ overlay_desc->show(); ++ } ++ } else if (!number_symbols && (current != CURRENTDOC || !search_str.empty())) { ++ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); ++ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); ++ } else if (!number_symbols && current == CURRENTDOC) { ++ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols found")) + Glib::ustring("")); ++ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols in current document.\nYou could create in the current document\n or add into from other different symbol set.")) + Glib::ustring("")); ++ } else if (!icons_found && !search_str.empty()) { ++ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); ++ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); ++ } ++ overlay_opacity->show(); ++ overlay_icon->set_from_icon_name("none", iconsize); ++ overlay_icon->show(); ++ overlay_title->show(); ++ overlay_desc->show(); ++ if (l.size()) { ++ overlay_opacity->show(); ++ overlay_icon->hide(); ++ overlay_title->hide(); ++ overlay_desc->hide(); ++ } ++#endif ++} + ++void SymbolsDialog::hideOverlay() { ++#if GTK_CHECK_VERSION(3,2,4) ++ overlay_opacity->hide(); ++ overlay_icon->hide(); ++ overlay_title->hide(); ++ overlay_desc->hide(); ++#endif ++} + void SymbolsDialog::insertSymbol() { + Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_SYMBOL ); + SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) current_desktop) ); +@@ -934,6 +995,7 @@ void SymbolsDialog::clearSearch() + icons_found = false; + addSymbolsInDoc(symbol_document); + } else { ++ showOverlay(); + enableWidgets(true); + } + } +@@ -963,6 +1025,8 @@ void SymbolsDialog::beforeSearch(GdkEventKey* evt) + icons_found = false; + addSymbolsInDoc(symbol_document); + } else { ++ idleconn.disconnect(); ++ idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackAllSymbols)); + search->set_text(_("Loading documents...")); + } + } +@@ -973,84 +1037,11 @@ void SymbolsDialog::unsensitive(GdkEventKey* evt) + } + + bool SymbolsDialog::callbackSymbols(){ +- Glib::ustring current = symbol_set->get_active_text(); +-#if GTK_CHECK_VERSION(3,2,4) +- if (current == _("All symbols sets") && +- search->get_text() != _("Loading documents...")) +- { +- if (!all_docs_processed) { +- overlay_opacity->show(); +- overlay_icon->set_from_icon_name("none", iconsize); +- overlay_icon->show(); +- overlay_title->show(); +- overlay_desc->show(); +- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); +- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); +- } +- } +- if (current == _("Current Document") && !icons_found) { +- if (!all_docs_processed) { +- overlay_icon->set_from_icon_name("none", iconsize); +- overlay_opacity->show(); +- overlay_icon->show(); +- overlay_title->show(); +- overlay_desc->show(); +- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); +- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); +- } +- } +-#endif +- if (current == _("All symbols sets") && +- search->get_text() == _("Loading documents...") ) +- { +-#if GTK_CHECK_VERSION(3,2,4) +- overlay_opacity->show(); +-#endif +- if (!all_docs_processed) { +-#if GTK_CHECK_VERSION(3,2,4) +- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); +- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); +- overlay_icon->show(); +- overlay_title->show(); +- overlay_icon->set_from_icon_name("searching", iconsize); +- overlay_desc->show(); +-#endif +- } +- size_t counter = 0; +- for(auto const &symbol_document_map : symbol_sets) { +- ++counter; +- SPDocument* symbol_document = symbol_document_map.second; +- if (symbol_document) { +- continue; +- } +- symbol_document = getSymbolsSet(symbol_document_map.first).second; +- symbol_set->set_active_text(_("All symbols sets")); +- if (!symbol_document) { +- continue; +- } +- progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); +- return true; +- } +-#if GTK_CHECK_VERSION(3,2,4) +- overlay_icon->hide(); +- overlay_title->hide(); +- overlay_desc->hide(); +-#endif +- progress_bar->set_fraction(1.0); +- all_docs_processed = true; +- addSymbols(); +- search->set_text("Documents done, searchig inside..."); +- return true; +- } else if (l.size()) { +-#if GTK_CHECK_VERSION(3,2,4) +- overlay_opacity->show(); +- overlay_icon->hide(); +- overlay_title->hide(); +- overlay_desc->hide(); +-#endif ++ if (l.size()) { ++ showOverlay(); + for (auto symbol_data = l.begin(); symbol_data != l.end();) { +- Glib::ustring doc_title = symbol_data->first; +- SPSymbol * symbol = symbol_data->second; ++ Glib::ustring doc_title = symbol_data->second.first; ++ SPSymbol * symbol = symbol_data->second.second; + counter_symbols ++; + gchar const *symbol_title_char = symbol->title(); + gchar const *symbol_desc_char = symbol->description(); +@@ -1082,30 +1073,54 @@ bool SymbolsDialog::callbackSymbols(){ + return true; + } + } +-#if GTK_CHECK_VERSION(3,2,4) + if (!icons_found && !search_str.empty()) { +- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); +- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); +- overlay_icon->set_from_icon_name("none", iconsize); +- overlay_icon->show(); +- overlay_title->show(); +- overlay_desc->show(); ++ showOverlay(); + } else { +- overlay_opacity->hide(); ++ hideOverlay(); + } +-#endif + sensitive = false; + search->set_text(search_str); + sensitive = true; + enableWidgets(true); +- return true; ++ return false; ++ } ++ return true; ++} ++ ++bool SymbolsDialog::callbackAllSymbols(){ ++ Glib::ustring current = symbol_set->get_active_text(); ++ if (current == ALLDOCS && search->get_text() == _("Loading documents...")) { ++ size_t counter = 0; ++ std::map symbol_sets_tmp = symbol_sets; ++ for(auto const &symbol_document_map : symbol_sets_tmp) { ++ ++counter; ++ SPDocument* symbol_document = symbol_document_map.second; ++ if (symbol_document) { ++ continue; ++ } ++ symbol_document = getSymbolsSet(symbol_document_map.first).second; ++ symbol_set->set_active_text(ALLDOCS); ++ if (!symbol_document) { ++ continue; ++ } ++ progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); ++ return true; ++ } ++ symbol_sets_tmp.clear(); ++ hideOverlay(); ++ progress_bar->set_fraction(1.0); ++ all_docs_processed = true; ++ addSymbols(); ++ search->set_text("Documents done, searchig inside..."); ++ return false; + } + return true; + } + + Glib::ustring SymbolsDialog::ellipsize(Glib::ustring data, size_t limit) { + if (data.length() > limit) { +- return data.substr(0,limit-3) + "..."; ++ data = data.substr(0, limit-3); ++ return data + "..."; + } + return data; + } +@@ -1118,58 +1133,49 @@ void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { + Glib::ustring doc_title = documentTitle(symbol_document); + progress_bar->set_fraction(0.0); + counter_symbols = 0; +- std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); +- number_symbols = container_symbols_tmp.size(); +- l = container_symbols_tmp; +- container_symbols_tmp.clear(); ++ l = symbolsInDoc(symbol_document, doc_title); ++ number_symbols = l.size(); + if (!number_symbols) { +-#if GTK_CHECK_VERSION(3,2,4) +- overlay_icon->set_from_icon_name("none", iconsize); +- overlay_icon->show(); +- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); +- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); +- overlay_title->show(); +- overlay_desc->show(); +-#endif + sensitive = false; + 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)); + } + } + + void SymbolsDialog::addSymbols() { + store->clear(); + icons_found = false; +- std::vector > container_symbols; + for(auto const &symbol_document_map : symbol_sets) { + SPDocument* symbol_document = symbol_document_map.second; + if (!symbol_document) { + continue; + } + Glib::ustring doc_title = documentTitle(symbol_document); +- std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); +- container_symbols.insert(container_symbols.end(), std::make_move_iterator(container_symbols_tmp.begin()), std::make_move_iterator(container_symbols_tmp.end())); +- container_symbols_tmp.clear(); ++ std::map > l_tmp = symbolsInDoc(symbol_document, doc_title); ++ for(auto &p : l_tmp ) { ++ l[p.first] = p.second; ++ } ++ l_tmp.clear(); + } + counter_symbols = 0; + progress_bar->set_fraction(0.0); +- number_symbols = container_symbols.size(); +- l = container_symbols; +- container_symbols.clear(); ++ number_symbols = l.size(); + if (!number_symbols) { +-#if GTK_CHECK_VERSION(3,2,4) +- overlay_icon->set_from_icon_name("none", iconsize); +- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); +- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); +- overlay_icon->show(); +- overlay_title->show(); +- overlay_desc->show(); +-#endif ++ 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)); + } + } + diff --git a/src/ui/dialog/symbols.h.orig b/src/ui/dialog/symbols.h.orig new file mode 100644 index 000000000..8255877b8 --- /dev/null +++ b/src/ui/dialog/symbols.h.orig @@ -0,0 +1,172 @@ +/** @file + * @brief Symbols dialog + */ +/* Authors: + * Tavmjong Bah, Martin Owens + * + * Copyright (C) 2012 Tavmjong Bah + * 2013 Martin Owens + * 2017 Jabiertxo Arraiza + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#ifndef INKSCAPE_UI_DIALOG_SYMBOLS_H +#define INKSCAPE_UI_DIALOG_SYMBOLS_H +#include + +#include "display/drawing.h" +#include "ui/dialog/desktop-tracker.h" +#include "ui/widget/panel.h" +#include "sp-symbol.h" +#include "sp-use.h" +#include + +class SPObject; + +namespace Inkscape { +namespace UI { +namespace Dialog { + +class SymbolColumns; // For Gtk::ListStore + +/** + * A dialog that displays selectable symbols and allows users to drag or paste + * those symbols from the dialog into the document. + * + * Symbol documents are loaded from the preferences paths and displayed in a + * drop-down list to the user. The user then selects which of the symbols + * documents they want to get symbols from. The first document in the list is + * always the current document. + * + * This then updates an icon-view with all the symbols available. Selecting one + * puts it onto the clipboard. Dragging it or pasting it onto the canvas copies + * the symbol from the symbol document, into the current document and places a + * new & context, Gtk::SelectionData& selection_data, guint info, guint time); + void getSymbolsFilename(); + Glib::ustring documentTitle(SPDocument* doc); + std::pair getSymbolsSet(Glib::ustring title); + void addSymbol( SPObject* symbol, Glib::ustring doc_title); + SPDocument* symbolsPreviewDoc(); + void symbolsInDocRecursive (SPObject *r, std::vector > &l, Glib::ustring doc_title); + std::vector > symbolsInDoc( SPDocument* document, Glib::ustring doc_title); + void useInDoc(SPObject *r, std::vector &l); + std::vector useInDoc( SPDocument* document); + void beforeSearch(GdkEventKey* evt); + void unsensitive(GdkEventKey* evt); + void addSymbols(); + void addSymbolsInDoc(SPDocument* document); + void clearSearch(); + bool callbackSymbols(); + void enableWidgets(bool enable); + Glib::ustring ellipsize(Glib::ustring data, size_t limit = 40); + gchar const* styleFromUse( gchar const* id, SPDocument* document); + Glib::RefPtr drawSymbol(SPObject *symbol, unsigned force_psize = 0); + Glib::RefPtr getOverlay(Gtk::Image* image, gchar const * icon_title, unsigned psize); + /* Keep track of all symbol template documents */ + std::map symbol_sets; + std::vector > l; + // Index into sizes which is selected + int pack_size; + // Scale factor + int scale_factor; + bool sensitive; + bool all_docs_processed; + size_t number_docs; + size_t number_symbols; + size_t counter_symbols; + bool icons_found; + Glib::RefPtr store; + Glib::ustring search_str; + Gtk::ComboBoxText* symbol_set; + Gtk::ProgressBar* progress_bar; + Gtk::HBox* progress; + Gtk::SearchEntry* search; + Gtk::IconView* icon_view; + Gtk::Button* add_symbol; + Gtk::Button* remove_symbol; + Gtk::Button* zoom_in; + Gtk::Button* zoom_out; + Gtk::Button* more; + Gtk::Button* fewer; + Gtk::HBox* tools; +#if GTK_CHECK_VERSION(3,2,4) + Gtk::Overlay* overlay; +#endif + Gtk::Image* overlay_icon; + Gtk::Image* overlay_opacity; + Gtk::Label* overlay_title; + Gtk::Label* overlay_desc; + Gtk::ScrolledWindow *scroller; + Gtk::ToggleButton* fit_symbol; + Gtk::IconSize iconsize; + void setTargetDesktop(SPDesktop *desktop); + SPDesktop* current_desktop; + DesktopTracker desk_track; + SPDocument* current_document; + SPDocument* preview_document; /* Document to render single symbol */ + + sigc::connection idleconn; + + /* For rendering the template drawing */ + unsigned key; + Inkscape::Drawing renderDrawing; + + std::vector instanceConns; +}; + +} //namespace Dialogs +} //namespace UI +} //namespace Inkscape + + +#endif // INKSCAPE_UI_DIALOG_SYMBOLS_H + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/symbols.h.rej b/src/ui/dialog/symbols.h.rej new file mode 100644 index 000000000..72cb5b299 --- /dev/null +++ b/src/ui/dialog/symbols.h.rej @@ -0,0 +1,19 @@ +--- src/ui/dialog/symbols.h ++++ src/ui/dialog/symbols.h +@@ -141,13 +144,14 @@ private: + Gtk::ScrolledWindow *scroller; + Gtk::ToggleButton* fit_symbol; + Gtk::IconSize iconsize; +- + void setTargetDesktop(SPDesktop *desktop); + SPDesktop* current_desktop; + DesktopTracker desk_track; + SPDocument* current_document; + SPDocument* preview_document; /* Document to render single symbol */ +- ++ ++ sigc::connection idleconn; ++ + /* For rendering the template drawing */ + unsigned key; + Inkscape::Drawing renderDrawing; diff --git a/src/ui/widget/page-sizer.cpp b/src/ui/widget/page-sizer.cpp index 7427ad4e2..06d54b682 100644 --- a/src/ui/widget/page-sizer.cpp +++ b/src/ui/widget/page-sizer.cpp @@ -219,6 +219,7 @@ PageSizer::PageSizer(Registry & _wr) _dimensionUnits( _("U_nits:"), "units", _wr ), _dimensionWidth( _("_Width:"), _("Width of paper"), "width", _dimensionUnits, _wr ), _dimensionHeight( _("_Height:"), _("Height of paper"), "height", _dimensionUnits, _wr ), + _marginLock( _("L_ock"), _("Lock margins"), "lock-margins", _wr ), _marginTop( _("T_op margin:"), _("Top margin"), "fit-margin-top", _wr ), _marginLeft( _("L_eft:"), _("Left margin"), "fit-margin-left", _wr), _marginRight( _("Ri_ght:"), _("Right margin"), "fit-margin-right", _wr), @@ -376,27 +377,33 @@ PageSizer::PageSizer(Registry & _wr) _marginTop.set_halign(Gtk::ALIGN_CENTER); _marginTop.set_hexpand(); _marginTop.set_vexpand(); - _marginTable.attach(_marginTop, 0, 0, 2, 1); + + _marginTable.attach(_marginTop, 0, 0, 3, 1); - _marginLeft.set_halign(Gtk::ALIGN_START); + _marginLeft.set_halign(Gtk::ALIGN_CENTER); _marginLeft.set_hexpand(); _marginLeft.set_vexpand(); _marginTable.attach(_marginLeft, 0, 1, 1, 1); - - _marginRight.set_halign(Gtk::ALIGN_END); + + _marginLock.set_halign(Gtk::ALIGN_CENTER); + _marginLock.set_hexpand(); + _marginLock.set_vexpand(); + _marginTable.attach(_marginLock, 1, 1, 1, 1); + + _marginRight.set_halign(Gtk::ALIGN_CENTER); _marginRight.set_hexpand(); _marginRight.set_vexpand(); - _marginTable.attach(_marginRight, 1, 1, 1, 1); - + _marginTable.attach(_marginRight, 2, 1, 1, 1); + _marginBottom.set_halign(Gtk::ALIGN_CENTER); _marginBottom.set_hexpand(); _marginBottom.set_vexpand(); - _marginTable.attach(_marginBottom, 0, 2, 2, 1); + _marginTable.attach(_marginBottom, 0, 2, 3, 1); _fitPageButton.set_halign(Gtk::ALIGN_CENTER); _fitPageButton.set_hexpand(); _fitPageButton.set_vexpand(); - _marginTable.attach(_fitPageButton, 0, 3, 2, 1); + _marginTable.attach(_fitPageButton, 0, 3, 3, 1); _fitPageButton.set_use_underline(); _fitPageButton.set_label(_("_Resize page to drawing or selection (Ctrl+Shift+R)")); @@ -474,6 +481,10 @@ PageSizer::init () _changedvy_connection = _viewboxY.signal_value_changed().connect (sigc::mem_fun (*this, &PageSizer::on_viewbox_changed)); _changedvw_connection = _viewboxW.signal_value_changed().connect (sigc::mem_fun (*this, &PageSizer::on_viewbox_changed)); _changedvh_connection = _viewboxH.signal_value_changed().connect (sigc::mem_fun (*this, &PageSizer::on_viewbox_changed)); + _changedmt_connection = _marginTop.signal_value_changed().connect (sigc::bind(sigc::mem_fun (*this, &PageSizer::on_margin_changed), &_marginTop)); + _changedmb_connection = _marginBottom.signal_value_changed().connect (sigc::bind(sigc::mem_fun (*this, &PageSizer::on_margin_changed), &_marginBottom)); + _changedml_connection = _marginLeft.signal_value_changed().connect (sigc::bind(sigc::mem_fun (*this, &PageSizer::on_margin_changed), &_marginLeft)); + _changedmr_connection = _marginRight.signal_value_changed().connect (sigc::bind(sigc::mem_fun (*this, &PageSizer::on_margin_changed), &_marginRight)); show_all_children(); } @@ -892,6 +903,24 @@ PageSizer::on_viewbox_changed() } } +/** + * Callback for viewbox widgets + */ +void +PageSizer::on_margin_changed(RegisteredScalar* widg) +{ + double value = widg->getValue(); + if (_widgetRegistry->isUpdating()) return; + if (_marginLock.get_active() && !_marginLocked) { + _marginLocked = true; + _marginLeft.setValue(value); + _marginRight.setValue(value); + _marginTop.setValue(value); + _marginBottom.setValue(value); + _marginLocked = false; + } +} + } // namespace Widget } // namespace UI } // namespace Inkscape diff --git a/src/ui/widget/page-sizer.h b/src/ui/widget/page-sizer.h index 329ecfc6d..7cf8bacfd 100644 --- a/src/ui/widget/page-sizer.h +++ b/src/ui/widget/page-sizer.h @@ -161,7 +161,11 @@ public: * of the ui widgets to match the xml). */ void updateFitMarginsUI(Inkscape::XML::Node *nv_repr); - + + /** + * Updates the margin widgets. If lock widget is active + */ + void on_margin_changed(RegisteredScalar* widg); /** * Updates the scale widgets. (Just changes the values of the ui widgets.) */ @@ -225,13 +229,15 @@ protected: //### Fit Page options Gtk::Expander _fitPageMarginExpander; - Gtk::Grid _marginTable; - RegisteredScalar _marginTop; - RegisteredScalar _marginLeft; - RegisteredScalar _marginRight; - RegisteredScalar _marginBottom; - Gtk::Button _fitPageButton; - bool _lockMarginUpdate; + Gtk::Grid _marginTable; + RegisteredCheckButton _marginLock; + RegisteredScalar _marginTop; + RegisteredScalar _marginLeft; + RegisteredScalar _marginRight; + RegisteredScalar _marginBottom; + Gtk::Button _fitPageButton; + bool _lockMarginUpdate; + bool _marginLocked; // Document scale Gtk::Frame _scaleFrame; @@ -265,6 +271,10 @@ protected: sigc::connection _changedvy_connection; sigc::connection _changedvw_connection; sigc::connection _changedvh_connection; + sigc::connection _changedmt_connection; + sigc::connection _changedmb_connection; + sigc::connection _changedml_connection; + sigc::connection _changedmr_connection; Registry *_widgetRegistry; -- cgit v1.2.3 From 474fa8bbdb6112ca6e97cc9824a209f1626f5626 Mon Sep 17 00:00:00 2001 From: Jabiertxo Arraiza Cenoz Date: Thu, 9 Nov 2017 19:04:39 +0100 Subject: Removing regects --- src/ui/dialog/symbols.cpp.orig | 1364 ---------------------------------------- src/ui/dialog/symbols.cpp.rej | 384 ----------- src/ui/dialog/symbols.h.orig | 172 ----- src/ui/dialog/symbols.h.rej | 19 - 4 files changed, 1939 deletions(-) delete mode 100644 src/ui/dialog/symbols.cpp.orig delete mode 100644 src/ui/dialog/symbols.cpp.rej delete mode 100644 src/ui/dialog/symbols.h.orig delete mode 100644 src/ui/dialog/symbols.h.rej (limited to 'src/ui') diff --git a/src/ui/dialog/symbols.cpp.orig b/src/ui/dialog/symbols.cpp.orig deleted file mode 100644 index 52f22103f..000000000 --- a/src/ui/dialog/symbols.cpp.orig +++ /dev/null @@ -1,1364 +0,0 @@ -/** - * @file - * Symbols dialog. - */ -/* Authors: - * Copyright (C) 2012 Tavmjong Bah - * - * Released under GNU GPL, read the file 'COPYING' for more information - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include -#include - -#include -#include -#include - -#include "path-prefix.h" -#include "io/sys.h" -#include "io/resource.h" - -#include "ui/cache/svg_preview_cache.h" -#include "ui/clipboard.h" -#include "ui/icon-names.h" - -#include "symbols.h" - -#include "selection.h" -#include "desktop.h" - -#include "document.h" -#include "inkscape.h" -#include "sp-root.h" -#include "sp-use.h" -#include "sp-defs.h" -#include "sp-symbol.h" - -#ifdef WITH_LIBVISIO - #include - - // TODO: Drop this check when librevenge is widespread. - #if WITH_LIBVISIO01 - #include - - using librevenge::RVNGFileStream; - using librevenge::RVNGString; - using librevenge::RVNGStringVector; - using librevenge::RVNGPropertyList; - using librevenge::RVNGSVGDrawingGenerator; - #else - #include - - typedef WPXFileStream RVNGFileStream; - typedef libvisio::VSDStringVector RVNGStringVector; - #endif -#endif - -#include "verbs.h" -#include "helper/action.h" -#include - -namespace Inkscape { -namespace UI { - -namespace Dialog { - -// See: http://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeModelColumnRecord.html -class SymbolColumns : public Gtk::TreeModel::ColumnRecord -{ -public: - - Gtk::TreeModelColumn symbol_id; - Gtk::TreeModelColumn symbol_title; - Gtk::TreeModelColumn symbol_doc_title; - Gtk::TreeModelColumn< Glib::RefPtr > symbol_image; - - - SymbolColumns() { - add(symbol_id); - add(symbol_title); - add(symbol_doc_title); - add(symbol_image); - } -}; - -SymbolColumns* SymbolsDialog::getColumns() -{ - SymbolColumns* columns = new SymbolColumns(); - return columns; -} - -/** - * Constructor - */ -SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : - UI::Widget::Panel("", prefsPath, SP_VERB_DIALOG_SYMBOLS), - store(Gtk::ListStore::create(*getColumns())), - icon_view(0), - current_desktop(0), - desk_track(), - current_document(0), - preview_document(0), - instanceConns() -{ - - /******************** Table *************************/ - auto table = new Gtk::Grid(); - table->set_margin_left(3); - table->set_margin_right(3); - table->set_margin_top(4); - // panel is a cloked Gtk::VBox - _getContents()->pack_start(*Gtk::manage(table), Gtk::PACK_EXPAND_WIDGET); - guint row = 0; - - /******************** Symbol Sets *************************/ - Gtk::Label* label_set = new Gtk::Label(_("Symbol set: ")); - table->attach(*Gtk::manage(label_set),0,row,1,1); - symbol_set = new Gtk::ComboBoxText(); // Fill in later - symbol_set->append(_("Current Document")); - symbol_set->append(_("All symbols sets")); - symbol_set->set_active_text(_("Current Document")); - symbol_set->set_hexpand(); - - table->attach(*Gtk::manage(symbol_set),1,row,1,1); - sigc::connection connSet = symbol_set->signal_changed().connect( - sigc::mem_fun(*this, &SymbolsDialog::rebuild)); - instanceConns.push_back(connSet); - - ++row; - - /******************** Separator *************************/ - - - Gtk::Separator* separator = Gtk::manage(new Gtk::Separator()); // Search - separator->set_margin_top(10); - separator->set_margin_bottom(10); - table->attach(*Gtk::manage(separator),0,row,2,1); - - ++row; - - /******************** Search *************************/ - - - search = Gtk::manage(new Gtk::SearchEntry()); // Search - search->set_tooltip_text(_("Return to start search.")); - search->signal_key_press_event().connect_notify( sigc::mem_fun(*this, &SymbolsDialog::beforeSearch)); - search->signal_key_release_event().connect_notify(sigc::mem_fun(*this, &SymbolsDialog::unsensitive)); - search->set_margin_left(10); - search->set_margin_right(10); - search->set_margin_bottom(6); - search->signal_search_changed().connect(sigc::mem_fun(*this, &SymbolsDialog::clearSearch)); - table->attach(*Gtk::manage(search),0,row,2,1); - search_str = ""; - - ++row; - - - /********************* Icon View **************************/ - SymbolColumns* columns = getColumns(); - - icon_view = new Gtk::IconView(static_cast >(store)); - //icon_view->set_text_column( columns->symbol_id ); - icon_view->set_tooltip_column( 1 ); - icon_view->set_pixbuf_column( columns->symbol_image ); - // Giving the iconview a small minimum size will help users understand - // What the dialog does. - icon_view->set_size_request( 100, 250 ); - - std::vector< Gtk::TargetEntry > targets; - targets.push_back(Gtk::TargetEntry( "application/x-inkscape-paste")); - - icon_view->enable_model_drag_source (targets, Gdk::BUTTON1_MASK, Gdk::ACTION_COPY); - icon_view->signal_drag_data_get().connect( - sigc::mem_fun(*this, &SymbolsDialog::iconDragDataGet)); - - sigc::connection connIconChanged; - connIconChanged = icon_view->signal_selection_changed().connect( - sigc::mem_fun(*this, &SymbolsDialog::iconChanged)); - instanceConns.push_back(connIconChanged); - - scroller = new Gtk::ScrolledWindow(); - scroller->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); - scroller->add(*Gtk::manage(icon_view)); - scroller->set_hexpand(); - scroller->set_vexpand(); -#if GTK_CHECK_VERSION(3,2,4) - overlay = new Gtk::Overlay(); - overlay->set_hexpand(); - overlay->set_vexpand(); - overlay->add(* scroller); - scroller->set_size_request(100, 250); - table->attach(*Gtk::manage(overlay),0,row,2,1); -#else - table->attach(*Gtk::manage(scroller),0,row,2,1); -#endif - ++row; - - /******************** Progress *******************************/ - progress = new Gtk::HBox(); - 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_left(20); - progress->set_margin_right(20); - - ++row; - - /******************** Tools *******************************/ - tools = new Gtk::HBox(); - - //tools->set_layout( Gtk::BUTTONBOX_END ); - scroller->set_hexpand(); - table->attach(*Gtk::manage(tools),0,row,2,1); - - auto add_symbol_image = Gtk::manage(new Gtk::Image()); - add_symbol_image->set_from_icon_name("symbol-add", Gtk::ICON_SIZE_SMALL_TOOLBAR); - - add_symbol = Gtk::manage(new Gtk::Button()); - add_symbol->add(*add_symbol_image); - add_symbol->set_tooltip_text(_("Add Symbol from the current document.")); - add_symbol->set_relief( Gtk::RELIEF_NONE ); - add_symbol->set_focus_on_click( false ); - add_symbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::insertSymbol)); - tools->pack_start(* add_symbol, Gtk::PACK_SHRINK); - - auto remove_symbolImage = Gtk::manage(new Gtk::Image()); - remove_symbolImage->set_from_icon_name("symbol-remove", Gtk::ICON_SIZE_SMALL_TOOLBAR); - - remove_symbol = Gtk::manage(new Gtk::Button()); - remove_symbol->add(*remove_symbolImage); - remove_symbol->set_tooltip_text(_("Remove Symbol from the current document.")); - remove_symbol->set_relief( Gtk::RELIEF_NONE ); - remove_symbol->set_focus_on_click( false ); - remove_symbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::revertSymbol)); - tools->pack_start(* remove_symbol, Gtk::PACK_SHRINK); - - Gtk::Label* spacer = Gtk::manage(new Gtk::Label("")); - tools->pack_start(* Gtk::manage(spacer)); - - // Pack size (controls display area) - pack_size = 2; // Default 32px - - auto packMoreImage = Gtk::manage(new Gtk::Image()); - packMoreImage->set_from_icon_name("pack-more", Gtk::ICON_SIZE_SMALL_TOOLBAR); - - more = Gtk::manage(new Gtk::Button()); - more->add(*packMoreImage); - more->set_tooltip_text(_("Display more icons in row.")); - more->set_relief( Gtk::RELIEF_NONE ); - more->set_focus_on_click( false ); - more->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::packmore)); - tools->pack_start(* more, Gtk::PACK_SHRINK); - - auto packLessImage = Gtk::manage(new Gtk::Image()); - packLessImage->set_from_icon_name("pack-less", Gtk::ICON_SIZE_SMALL_TOOLBAR); - - fewer = Gtk::manage(new Gtk::Button()); - fewer->add(*packLessImage); - fewer->set_tooltip_text(_("Display fewer icons in row.")); - fewer->set_relief( Gtk::RELIEF_NONE ); - fewer->set_focus_on_click( false ); - fewer->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::packless)); - tools->pack_start(* fewer, Gtk::PACK_SHRINK); - - // Toggle scale to fit on/off - auto fit_symbolImage = Gtk::manage(new Gtk::Image()); - fit_symbolImage->set_from_icon_name("symbol-fit", Gtk::ICON_SIZE_SMALL_TOOLBAR); - - fit_symbol = Gtk::manage(new Gtk::ToggleButton()); - fit_symbol->add(*fit_symbolImage); - fit_symbol->set_tooltip_text(_("Toggle 'fit' symbols in icon space.")); - fit_symbol->set_relief( Gtk::RELIEF_NONE ); - fit_symbol->set_focus_on_click( false ); - fit_symbol->set_active( true ); - fit_symbol->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::rebuild)); - tools->pack_start(* fit_symbol, Gtk::PACK_SHRINK); - - // Render size (scales symbols within display area) - scale_factor = 0; // Default 1:1 * pack_size/pack_size default - auto zoom_outImage = Gtk::manage(new Gtk::Image()); - zoom_outImage->set_from_icon_name("symbol-smaller", Gtk::ICON_SIZE_SMALL_TOOLBAR); - - zoom_out = Gtk::manage(new Gtk::Button()); - zoom_out->add(*zoom_outImage); - zoom_out->set_tooltip_text(_("Make symbols smaller by zooming out.")); - zoom_out->set_relief( Gtk::RELIEF_NONE ); - zoom_out->set_focus_on_click( false ); - zoom_out->set_sensitive( false ); - zoom_out->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::zoomout)); - tools->pack_start(* zoom_out, Gtk::PACK_SHRINK); - - auto zoom_inImage = Gtk::manage(new Gtk::Image()); - zoom_inImage->set_from_icon_name("symbol-bigger", Gtk::ICON_SIZE_SMALL_TOOLBAR); - - zoom_in = Gtk::manage(new Gtk::Button()); - zoom_in->add(*zoom_inImage); - zoom_in->set_tooltip_text(_("Make symbols bigger by zooming in.")); - zoom_in->set_relief( Gtk::RELIEF_NONE ); - zoom_in->set_focus_on_click( false ); - zoom_in->set_sensitive( false ); - zoom_in->signal_clicked().connect(sigc::mem_fun(*this, &SymbolsDialog::zoomin)); - tools->pack_start(* zoom_in, Gtk::PACK_SHRINK); - - ++row; - - sensitive = true; - - current_desktop = SP_ACTIVE_DESKTOP; - current_document = current_desktop->getDocument(); - preview_document = symbolsPreviewDoc(); /* Template to render symbols in */ - preview_document->ensureUpToDate(); /* Necessary? */ - key = SPItem::display_key_new(1); - renderDrawing.setRoot(preview_document->getRoot()->invoke_show(renderDrawing, key, SP_ITEM_SHOW_DISPLAY )); - - // This might need to be a global variable so setTargetDesktop can modify it - SPDefs *defs = current_document->getDefs(); - - /*************************Overlays******************************/ -#if GTK_CHECK_VERSION(3,2,4) - //Loading - overlay_opacity = new Gtk::Image(); - overlay_opacity->set(getOverlay(overlay_opacity, "overlay", 1000)); - overlay_opacity->set_halign(Gtk::ALIGN_START ); - overlay_opacity->set_valign(Gtk::ALIGN_START ); - //No results - iconsize = Gtk::IconSize().register_new(Glib::ustring("ICON_SIZE_DIALOG_EXTRA"), 110, 110); - overlay_icon = new Gtk::Image(); - overlay_icon->set_from_icon_name("none", iconsize); - overlay_icon = new Gtk::Image(); - overlay_icon->set_halign(Gtk::ALIGN_CENTER ); - overlay_icon->set_valign(Gtk::ALIGN_START ); - overlay_icon->set_margin_top(45); - overlay_title = new Gtk::Label(); - overlay_title->set_halign(Gtk::ALIGN_CENTER ); - overlay_title->set_valign(Gtk::ALIGN_START ); - overlay_title->set_justify(Gtk::JUSTIFY_CENTER); - overlay_title->set_margin_top(155); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc = new Gtk::Label(); - overlay_desc->set_halign(Gtk::ALIGN_CENTER ); - overlay_desc->set_valign(Gtk::ALIGN_START ); - overlay_desc->set_margin_top(180); - overlay_desc->set_justify(Gtk::JUSTIFY_CENTER); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a another search or select other set")) + Glib::ustring("")); - overlay->add_overlay(* overlay_opacity); - overlay->add_overlay(* overlay_icon); - overlay->add_overlay(* overlay_title); - overlay->add_overlay(* overlay_desc); -#endif - sigc::connection defsModifiedConn = defs->connectModified(sigc::mem_fun(*this, &SymbolsDialog::defsModified)); - instanceConns.push_back(defsModifiedConn); - - sigc::connection selectionChangedConn = current_desktop->selection->connectChanged( - sigc::mem_fun(*this, &SymbolsDialog::selectionChanged)); - instanceConns.push_back(selectionChangedConn); - - sigc::connection documentReplacedConn = current_desktop->connectDocumentReplaced( - sigc::mem_fun(*this, &SymbolsDialog::documentReplaced)); - instanceConns.push_back(documentReplacedConn); - getSymbolsFilename(); - icons_found = false; - - addSymbolsInDoc(current_document); /* Defaults to current document */ - sigc::connection desktopChangeConn = - desk_track.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); - instanceConns.push_back( desktopChangeConn ); - desk_track.connect(GTK_WIDGET(gobj())); -#if GTK_CHECK_VERSION(3,2,4) - overlay->hide(); -#endif -} - -SymbolsDialog::~SymbolsDialog() -{ - for (std::vector::iterator it = instanceConns.begin(); it != instanceConns.end(); ++it) { - it->disconnect(); - } - idleconn.disconnect(); - instanceConns.clear(); - desk_track.disconnect(); -} - -SymbolsDialog& SymbolsDialog::getInstance() -{ - return *new SymbolsDialog(); -} - -void SymbolsDialog::packless() { - if(pack_size < 4) { - pack_size++; - rebuild(); - } -} - -void SymbolsDialog::packmore() { - if(pack_size > 0) { - pack_size--; - rebuild(); - } -} - -void SymbolsDialog::zoomin() { - if(scale_factor < 4) { - scale_factor++; - rebuild(); - } -} - -void SymbolsDialog::zoomout() { - if(scale_factor > -8) { - scale_factor--; - rebuild(); - } -} - -void SymbolsDialog::rebuild() { - - if (!sensitive) { - return; - } - - if( fit_symbol->get_active() ) { - zoom_in->set_sensitive( false ); - zoom_out->set_sensitive( false ); - } else { - zoom_in->set_sensitive( true); - zoom_out->set_sensitive( true ); - } - store->clear(); - SPDocument* symbol_document = selectedSymbols(); - icons_found = false; - //We are not in search all docs - if (search->get_text() != _("Searching...") && - search->get_text() != _("Loading documents...") && - search->get_text() != _("Documents done, searchig inside...") ) - { - search_str = ""; - search->set_text(""); - } - if (symbol_document) { - addSymbolsInDoc(symbol_document); - } else { - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); - } -} - -void SymbolsDialog::insertSymbol() { - Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_SYMBOL ); - SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) current_desktop) ); - sp_action_perform (action, NULL); -} - -void SymbolsDialog::revertSymbol() { - Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_UNSYMBOL ); - SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) current_desktop ) ); - sp_action_perform (action, NULL); -} - -void SymbolsDialog::iconDragDataGet(const Glib::RefPtr& /*context*/, Gtk::SelectionData& data, guint /*info*/, guint /*time*/) -{ - auto iconArray = icon_view->get_selected_items(); - - if( iconArray.empty() ) { - //std::cout << " iconArray empty: huh? " << std::endl; - } else { - Gtk::TreeModel::Path const & path = *iconArray.begin(); - Gtk::ListStore::iterator row = store->get_iter(path); - Glib::ustring symbol_id = (*row)[getColumns()->symbol_id]; - GdkAtom dataAtom = gdk_atom_intern( "application/x-inkscape-paste", FALSE ); - gtk_selection_data_set( data.gobj(), dataAtom, 9, (guchar*)symbol_id.c_str(), symbol_id.length() ); - } - -} - -void SymbolsDialog::defsModified(SPObject * /*object*/, guint /*flags*/) -{ - Glib::ustring doc_title = symbol_set->get_active_text(); - if (doc_title != _("All symbols sets") && !symbol_sets[symbol_set->get_active_text()] ) { - rebuild(); - } -} - -void SymbolsDialog::selectionChanged(Inkscape::Selection *selection) { - Glib::ustring symbol_id = selectedSymbolId(); - Glib::ustring doc_title = selectedSymbolDocTitle(); - if (!doc_title.empty()) { - SPDocument* symbol_document = symbol_sets[doc_title]; - if (!symbol_document) { - //we are in global search so get the original symbol document by title - symbol_document = selectedSymbols(); - } - if (symbol_document) { - SPObject* symbol = symbol_document->getObjectById(symbol_id); - if(symbol && !selection->includes(symbol)) { - icon_view->unselect_all(); - } - } - } -} - -void SymbolsDialog::documentReplaced(SPDesktop *desktop, SPDocument *document) -{ - current_desktop = desktop; - current_document = document; - rebuild(); -} - -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(); - if (doc_title == _("All symbols sets")) { - return NULL; - } - SPDocument* symbol_document = symbol_sets[doc_title]; - if( !symbol_document ) { - symbol_document = getSymbolsSet(doc_title).second; - // Symbol must be from Current Document (this method of checking should be language independent). - if( !symbol_document ) { - // Symbol must be from Current Document (this method of - // checking should be language independent). - symbol_document = current_document; - add_symbol->set_sensitive( true ); - remove_symbol->set_sensitive( true ); - } else { - add_symbol->set_sensitive( false ); - remove_symbol->set_sensitive( false ); - } - } - return symbol_document; -} - -Glib::ustring SymbolsDialog::selectedSymbolId() { - - auto iconArray = icon_view->get_selected_items(); - - if( !iconArray.empty() ) { - Gtk::TreeModel::Path const & path = *iconArray.begin(); - Gtk::ListStore::iterator row = store->get_iter(path); - return (*row)[getColumns()->symbol_id]; - } - return Glib::ustring(""); -} - -Glib::ustring SymbolsDialog::selectedSymbolDocTitle() { - - auto iconArray = icon_view->get_selected_items(); - - if( !iconArray.empty() ) { - Gtk::TreeModel::Path const & path = *iconArray.begin(); - Gtk::ListStore::iterator row = store->get_iter(path); - return (*row)[getColumns()->symbol_doc_title]; - } - return Glib::ustring(""); -} - -Glib::ustring SymbolsDialog::documentTitle(SPDocument* symbol_doc) { - Glib::ustring title = _("Untitled document"); - if (symbol_doc) { - SPRoot * root = symbol_doc->getRoot(); - if (root->title()) { - title = ellipsize(Glib::ustring(root->title())); - return title; - } - } - Glib::ustring current = symbol_set->get_active_text(); - if (current == _("Current Document")) { - return current; - } - return title; -} - -void SymbolsDialog::iconChanged() { - - Glib::ustring symbol_id = selectedSymbolId(); - SPDocument* symbol_document = selectedSymbols(); - if (!symbol_document) { - //we are in global search so get the original symbol document by title - Glib::ustring doc_title = selectedSymbolDocTitle(); - if (!doc_title.empty()) { - symbol_document = symbol_sets[doc_title]; - } - } - if (symbol_document) { - SPObject* symbol = symbol_document->getObjectById(symbol_id); - - if( symbol ) { - if( symbol_document == current_document ) { - // Select the symbol on the canvas so it can be manipulated - current_desktop->selection->set( symbol, false ); - } - // Find style for use in - // First look for default style stored in - gchar const* style = symbol->getAttribute("inkscape:symbol-style"); - if( !style ) { - // If no default style in , look in documents. - if( symbol_document == current_document ) { - style = styleFromUse( symbol_id.c_str(), current_document ); - } else { - style = symbol_document->getReprRoot()->attribute("style"); - } - } - - ClipboardManager *cm = ClipboardManager::get(); - cm->copySymbol(symbol->getRepr(), style, symbol_document == current_document); - } - } -} - -#ifdef WITH_LIBVISIO - -#if WITH_LIBVISIO01 -// Extend libvisio's native RVNGSVGDrawingGenerator with support for extracting stencil names (to be used as ID/title) -class REVENGE_API RVNGSVGDrawingGenerator_WithTitle : public RVNGSVGDrawingGenerator { - public: - RVNGSVGDrawingGenerator_WithTitle(RVNGStringVector &output, RVNGStringVector &titles, const RVNGString &nmSpace) - : RVNGSVGDrawingGenerator(output, nmSpace) - , _titles(titles) - {} - - void startPage(const RVNGPropertyList &propList) - { - RVNGSVGDrawingGenerator::startPage(propList); - if (propList["draw:name"]) { - _titles.append(propList["draw:name"]->getStr()); - } else { - _titles.append(""); - } - } - - private: - RVNGStringVector &_titles; -}; -#endif - -// Read Visio stencil files -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 - // therefore attempt to convert uri to the system codepage - // even if this is not possible the alternate short (8.3) file name will be used if available - fullname = g_win32_locale_filename_from_utf8(filename.c_str()); - #else - filename.copy(fullname, filename.length()); - #endif - - RVNGFileStream input(fullname); - g_free(fullname); - - if (!libvisio::VisioDocument::isSupported(&input)) { - return NULL; - } - - RVNGStringVector output; - RVNGStringVector titles; -#if WITH_LIBVISIO01 - RVNGSVGDrawingGenerator_WithTitle generator(output, titles, "svg"); - - if (!libvisio::VisioDocument::parseStencils(&input, &generator)) { -#else - if (!libvisio::VisioDocument::generateSVGStencils(&input, output)) { -#endif - return NULL; - } - - if (output.empty()) { - return NULL; - } - - // prepare a valid title for the symbol file - Glib::ustring title = Glib::Markup::escape_text(name); - // prepare a valid id prefix for symbols libvisio doesn't give us a name for - Glib::RefPtr regex1 = Glib::Regex::create("[^a-zA-Z0-9_-]"); - Glib::ustring id = regex1->replace(name, 0, "_", Glib::REGEX_MATCH_PARTIAL); - - Glib::ustring tmpSVGOutput; - tmpSVGOutput += "\n"; - tmpSVGOutput += "\n"; - tmpSVGOutput += " "; - tmpSVGOutput += title; - tmpSVGOutput += "\n"; - tmpSVGOutput += " \n"; - - // Each "symbol" is in its own SVG file, we wrap with and merge into one file. - for (unsigned i=0; ireplace(titles[i].cstr(), 0, "_", Glib::REGEX_MATCH_PARTIAL); - } else { - ss << id << "_" << i; - } - - tmpSVGOutput += " \n"; - -#if WITH_LIBVISIO01 - if (titles.size() == output.size() && titles[i] != "") { - tmpSVGOutput += " " + Glib::ustring(RVNGString::escapeXML(titles[i].cstr()).cstr()) + "\n"; - } -#endif - - std::istringstream iss( output[i].cstr() ); - std::string line; - while( std::getline( iss, line ) ) { - if( line.find( "svg:svg" ) == std::string::npos ) { - tmpSVGOutput += " " + line + "\n"; - } - } - - tmpSVGOutput += " \n"; - } - - tmpSVGOutput += " \n"; - tmpSVGOutput += "\n"; - - return SPDocument::createNewDocFromMem( tmpSVGOutput.c_str(), strlen( tmpSVGOutput.c_str()), 0 ); - -} -#endif - -/* Hunts preference directories for symbol files */ -void SymbolsDialog::getSymbolsFilename() { - - using namespace Inkscape::IO::Resource; - Glib::ustring title; - number_docs = 0; - for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { - if(Glib::str_has_suffix(filename, ".svg")) { - //TODO: find a way to get real title without loading all SPDocument - std::size_t found = filename.find_last_of("/\\"); - filename = filename.substr(found+1); - title = filename.erase(filename.rfind('.')); - if(title.empty()) { - title = _("Unnamed Symbols"); - } - symbol_sets[title]= NULL; - symbol_set->append(title); - ++number_docs; - } -#ifdef WITH_LIBVISIO - if(Glib::str_has_suffix(filename, ".vss")) { - std::size_t found = filename.find_last_of("/\\"); - filename = filename.substr(found+1); - title = filename.erase(filename.rfind('.')); - if(title.empty()) { - title = _("Unnamed Symbols"); - } - symbol_sets[title]= NULL; - symbol_set->append(title); - ++number_docs; - } -#endif - } -} - -/* Hunts preference directories for symbol files */ -std::pair -SymbolsDialog::getSymbolsSet(Glib::ustring title) -{ - if (symbol_sets[title]) { - return std::make_pair(title, symbol_sets[title]); - } - using namespace Inkscape::IO::Resource; - SPDocument* symbol_doc = NULL; - Glib::ustring new_title; - size_t i = 0; - for(auto &filename: get_filenames(SYMBOLS, {".svg", ".vss"})) { - std::size_t pos = filename.find_last_of("/\\"); - if (pos != std::string::npos) { - Glib::ustring filename_short = filename.substr(pos+1); - if(filename_short == title + ".svg") { - symbol_doc = SPDocument::createNewDoc(filename.c_str(), FALSE); - if(symbol_doc) { - new_title = documentTitle(symbol_doc); - } - } - if(Glib::str_has_suffix(filename, ".svg")) { - i++; - } -#ifdef WITH_LIBVISIO - if(filename_short == title + ".vss") { - symbol_doc = read_vss(filename, title); - if(symbol_doc) { - new_title = documentTitle(symbol_doc); - } - } - if(Glib::str_has_suffix(filename, ".vss")) { - i++; - } -#endif - if(symbol_doc) { - symbol_sets.erase(title); - symbol_sets[new_title]= symbol_doc; - sensitive = false; - symbol_set->remove_text(i+1); - symbol_set->insert (i+1, new_title); - symbol_set->set_active(i+1); - symbol_set->set_active_text(new_title); - sensitive = true; - break; - } - } - } - return std::make_pair(new_title, symbol_doc); -} - -void SymbolsDialog::symbolsInDocRecursive (SPObject *r, std::vector > &l, Glib::ustring doc_title) -{ - if(!r) return; - - // Stop multiple counting of same symbol - if ( dynamic_cast(r) ) { - return; - } - - if ( dynamic_cast(r) ) { - l.push_back(std::make_pair(doc_title,dynamic_cast(r))); - } - for (auto& child: r->children) { - symbolsInDocRecursive(&child, l, doc_title); - } -} - -std::vector > -SymbolsDialog::symbolsInDoc( SPDocument* symbol_document, Glib::ustring doc_title) -{ - - std::vector > l; - if (symbol_document) { - symbolsInDocRecursive (symbol_document->getRoot(), l , doc_title); - } - return l; -} - -void SymbolsDialog::useInDoc (SPObject *r, std::vector &l) -{ - - if ( dynamic_cast(r) ) { - l.push_back(dynamic_cast(r)); - } - - for (auto& child: r->children) { - useInDoc( &child, l ); - } -} - -std::vector SymbolsDialog::useInDoc( SPDocument* useDocument) { - std::vector l; - useInDoc (useDocument->getRoot(), l); - return l; -} - -// 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* style = 0; - std::vector l = useInDoc( document ); - for( auto use:l ) { - if ( use ) { - gchar const *href = use->getRepr()->attribute("xlink:href"); - if( href ) { - Glib::ustring href2(href); - Glib::ustring id2(id); - id2 = "#" + id2; - if( !href2.compare(id2) ) { - style = use->getRepr()->attribute("style"); - break; - } - } - } - } - return style; -} - -void SymbolsDialog::clearSearch() -{ - if(search->get_text().empty() && sensitive) { - enableWidgets(false); - search_str = ""; - store->clear(); - SPDocument* symbol_document = selectedSymbols(); - if (symbol_document) { - //We are not in search all docs - icons_found = false; - addSymbolsInDoc(symbol_document); - } else { - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); - enableWidgets(true); - } - } -} - -void SymbolsDialog::enableWidgets(bool enable) -{ - symbol_set->set_sensitive(enable); - search->set_sensitive(enable); - tools ->set_sensitive(enable); -} - -void SymbolsDialog::beforeSearch(GdkEventKey* evt) -{ - sensitive = false; - search_str = search->get_text().lowercase(); - if (evt->keyval != GDK_KEY_Return) { - return; - } - progress_bar->set_fraction(0.0); - enableWidgets(false); - SPDocument* symbol_document = selectedSymbols(); - if (symbol_document) { - //We are not in search all docs - search->set_text(_("Searching...")); - store->clear(); - icons_found = false; - addSymbolsInDoc(symbol_document); - } else { - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); - search->set_text(_("Loading documents...")); - } -} - -void SymbolsDialog::unsensitive(GdkEventKey* evt) -{ - sensitive = true; -} - -bool SymbolsDialog::callbackSymbols(){ - Glib::ustring current = symbol_set->get_active_text(); - -#if GTK_CHECK_VERSION(3,2,4) -if (current == _("All symbols sets") && search->get_text() != _("Loading documents...") && !l.size()) - { - if (!all_docs_processed ) { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time,\n search will be slow.\nPlease wait ...")) + Glib::ustring("")); - } else { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("All symbol sets ...")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); - } - overlay_opacity->show(); - overlay_icon->set_from_icon_name("none", iconsize); - overlay_icon->show(); - overlay_title->show(); - overlay_desc->show(); - return false; - } -#endif - if (current == _("All symbols sets") && search->get_text() == _("Loading documents...")) { -#if GTK_CHECK_VERSION(3,2,4) - overlay_opacity->show(); -#endif - if (!all_docs_processed) { -#if GTK_CHECK_VERSION(3,2,4) - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("")+ Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); - overlay_icon->show(); - overlay_title->show(); - overlay_icon->set_from_icon_name("searching", iconsize); - overlay_desc->show(); -#endif - } - size_t counter = 0; - for(auto const &symbol_document_map : symbol_sets) { - ++counter; - SPDocument* symbol_document = symbol_document_map.second; - if (symbol_document) { - continue; - } - symbol_document = getSymbolsSet(symbol_document_map.first).second; - symbol_set->set_active_text(_("All symbols sets")); - if (!symbol_document) { - continue; - } - progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); - return true; - } -#if GTK_CHECK_VERSION(3,2,4) - overlay_icon->hide(); - overlay_title->hide(); - overlay_desc->hide(); -#endif - progress_bar->set_fraction(1.0); - all_docs_processed = true; - addSymbols(); - search->set_text("Documents done, searchig inside..."); - return true; - } else if (l.size()) { -#if GTK_CHECK_VERSION(3,2,4) - overlay_opacity->show(); - overlay_icon->hide(); - overlay_title->hide(); - overlay_desc->hide(); -#endif - for (auto symbol_data = l.begin(); symbol_data != l.end();) { - Glib::ustring doc_title = symbol_data->first; - SPSymbol * symbol = symbol_data->second; - counter_symbols ++; - gchar const *symbol_title_char = symbol->title(); - gchar const *symbol_desc_char = symbol->description(); - bool found = false; - if (symbol_title_char) { - Glib::ustring symbol_title = Glib::ustring(symbol_title_char).lowercase(); - auto pos = symbol_title.rfind(search_str); - if (pos != std::string::npos) { - found = true; - } - if (!found && symbol_desc_char) { - Glib::ustring symbol_desc = Glib::ustring(symbol_desc_char).lowercase(); - auto pos = symbol_desc.rfind(search_str); - if (pos != std::string::npos) { - found = true; - } - } - } - if (symbol && (search_str.empty() || found || (search_str.empty() && !symbol_title_char))) { - addSymbol( symbol, doc_title); - 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); - if (modulus && counter_symbols % modulus == 0 && !l.empty()) { - return true; - } - } -#if GTK_CHECK_VERSION(3,2,4) - if (!icons_found && !search_str.empty()) { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); - overlay_icon->set_from_icon_name("none", iconsize); - overlay_icon->show(); - overlay_title->show(); - overlay_desc->show(); - } else { - overlay_opacity->hide(); - } -#endif - sensitive = false; - search->set_text(search_str); - sensitive = true; - enableWidgets(true); - return false; - } - return true; -} - -Glib::ustring SymbolsDialog::ellipsize(Glib::ustring data, size_t limit) { - if (data.length() > limit) { - return data.substr(0,limit-3) + "..."; - } - return data; -} - -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; - std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); - number_symbols = container_symbols_tmp.size(); - l = container_symbols_tmp; - container_symbols_tmp.clear(); - if (!number_symbols) { -#if GTK_CHECK_VERSION(3,2,4) - overlay_icon->set_from_icon_name("none", iconsize); - overlay_opacity->show(); - overlay_icon->show(); - overlay_title->show(); - overlay_desc->show(); -#endif - sensitive = false; - search->set_text(search_str); - sensitive = true; - enableWidgets(true); - idleconn.disconnect(); - } else { - idleconn.disconnect(); - idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); - } -#if GTK_CHECK_VERSION(3,2,4) - Glib::ustring current = symbol_set->get_active_text(); - if (!number_symbols && (current != _("Current Document") || !search_str.empty())) { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); - } else if (!number_symbols) { - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols in current document.\nYou could create in the current document\n or add into from other different symbol set.")) + Glib::ustring("")); - } -#endif -} - -void SymbolsDialog::addSymbols() { - store->clear(); - icons_found = false; - std::vector > container_symbols; - for(auto const &symbol_document_map : symbol_sets) { - SPDocument* symbol_document = symbol_document_map.second; - if (!symbol_document) { - continue; - } - Glib::ustring doc_title = documentTitle(symbol_document); - std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); - container_symbols.insert(container_symbols.end(), std::make_move_iterator(container_symbols_tmp.begin()), std::make_move_iterator(container_symbols_tmp.end())); - container_symbols_tmp.clear(); - } - counter_symbols = 0; - progress_bar->set_fraction(0.0); - number_symbols = container_symbols.size(); - l = container_symbols; - container_symbols.clear(); - if (!number_symbols) { -#if GTK_CHECK_VERSION(3,2,4) - overlay_icon->set_from_icon_name("none", iconsize); - overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); - overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); - overlay_icon->show(); - overlay_title->show(); - overlay_desc->show(); -#endif - idleconn.disconnect(); - sensitive = false; - search->set_text(search_str); - sensitive = true; - enableWidgets(true); - } -} - -void SymbolsDialog::addSymbol( SPObject* symbol, Glib::ustring doc_title) { - - SymbolColumns* columns = getColumns(); - - gchar const *id = symbol->getRepr()->attribute("id"); - gchar const *title = symbol->title(); // From title element - if( !title ) { - title = id; - } - Glib::ustring symbol_title = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "Symbol", title) )); - if (doc_title.empty()) { - doc_title = _("Current Document"); - } - symbol_title = symbol_title + Glib::Markup::escape_text(Glib::ustring(g_dpgettext2(NULL, "Symbol", (Glib::ustring(" (") + doc_title + Glib::ustring(")")).c_str()))); - Glib::RefPtr pixbuf = drawSymbol( symbol ); - - if( pixbuf ) { - Gtk::ListStore::iterator row = store->append(); - (*row)[columns->symbol_id] = Glib::ustring( id ); - (*row)[columns->symbol_title] = symbol_title; - (*row)[columns->symbol_doc_title] = Glib::Markup::escape_text(doc_title); - (*row)[columns->symbol_image] = pixbuf; - } - - delete columns; -} - -/* - * Returns image of symbol. - * - * Symbols normally are not visible. They must be referenced by a - * element. A temporary document is created with a dummy - * element and a element that references the symbol - * element. Each real symbol is swapped in for the dummy symbol and - * the temporary document is rendered. - */ -Glib::RefPtr -SymbolsDialog::drawSymbol(SPObject *symbol, unsigned force_psize) -{ - // Create a copy repr of the symbol with id="the_symbol" - Inkscape::XML::Document *xml_doc = preview_document->getReprDoc(); - Inkscape::XML::Node *repr = symbol->getRepr()->duplicate(xml_doc); - repr->setAttribute("id", "the_symbol"); - - // Replace old "the_symbol" in preview_document by new. - Inkscape::XML::Node *root = preview_document->getReprRoot(); - SPObject *symbol_old = preview_document->getObjectById("the_symbol"); - if (symbol_old) { - symbol_old->deleteObject(false); - } - - // First look for default style stored in - gchar const* style = repr->attribute("inkscape:symbol-style"); - if( !style ) { - // If no default style in , look in documents. - if( symbol->document == current_document ) { - gchar const *id = symbol->getRepr()->attribute("id"); - style = styleFromUse( id, symbol->document ); - } else { - style = symbol->document->getReprRoot()->attribute("style"); - } - } - // Last ditch effort to provide some default styling - if( !style ) style = "fill:#bbbbbb;stroke:#808080"; - - // This is for display in Symbols dialog only - if( style ) repr->setAttribute( "style", style ); - - // BUG: Symbols don't work if defined outside of . Causes Inkscape - // crash when trying to read in such a file. - root->appendChild(repr); - //defsrepr->appendChild(repr); - Inkscape::GC::release(repr); - - // Uncomment this to get the preview_document documents saved (useful for debugging) - // FILE *fp = fopen (g_strconcat(id, ".svg", NULL), "w"); - // sp_repr_save_stream(preview_document->getReprDoc(), fp); - // fclose (fp); - - // Make sure preview_document is up-to-date. - preview_document->getRoot()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); - preview_document->ensureUpToDate(); - - // Make sure we have symbol in preview_document - SPObject *object_temp = preview_document->getObjectById( "the_use" ); - preview_document->getRoot()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); - preview_document->ensureUpToDate(); - - SPItem *item = dynamic_cast(object_temp); - g_assert(item != NULL); - unsigned psize = SYMBOL_ICON_SIZES[pack_size]; - - Glib::RefPtr pixbuf(NULL); - // We could use cache here, but it doesn't really work with the structure - // of this user interface and we've already cached the pixbuf in the gtklist - - // Find object's bbox in document. - // Note symbols can have own viewport... ignore for now. - //Geom::OptRect dbox = item->geometricBounds(); - Geom::OptRect dbox = item->documentVisualBounds(); - - if (dbox) { - /* Scale symbols to fit */ - double scale = 1.0; - double width = dbox->width(); - double height = dbox->height(); - - if( width == 0.0 ) width = 1.0; - if( height == 0.0 ) height = 1.0; - - if( fit_symbol->get_active() ) - scale = psize / ceil(std::max(width, height)); - else - scale = pow( 2.0, scale_factor/2.0 ) * psize / 32.0; - - if (force_psize > 0) { - psize = force_psize; - scale = psize / ceil(std::max(width, height)); - } - - pixbuf = Glib::wrap(render_pixbuf(renderDrawing, scale, *dbox, psize)); - } - - return pixbuf; -} - -/* - * Return empty doc to render symbols in. - * Symbols are by default not rendered so a element is - * provided. - */ -SPDocument* SymbolsDialog::symbolsPreviewDoc() -{ - // BUG: must be inside - gchar const *buffer = -"" -" " -" " -" " -" " -""; - return SPDocument::createNewDocFromMem( buffer, strlen(buffer), FALSE ); -} - -/* - * Update image widgets - */ -Glib::RefPtr -SymbolsDialog::getOverlay(Gtk::Image* image, gchar const * icon_title, unsigned psize) -{ -gchar const *buffer = -"" -" Inkscape " -" " -" " -" Overlay" -" Overlay Square" -" " -" " -" " -""; - - SPDocument* doc = SPDocument::createNewDocFromMem( buffer, strlen(buffer), FALSE ); - std::vector > symbols_data = symbolsInDoc(doc, "Overlay Doc"); - Glib::RefPtr pixbuf(NULL); - for(auto data:symbols_data) { - Glib::ustring doc_title = data.first; - SPSymbol * symbol = data.second; - if (!strcmp(symbol->getId(), icon_title)) { - pixbuf = drawSymbol(symbol, psize); - return pixbuf; - } - } - return pixbuf; -} - -void SymbolsDialog::setTargetDesktop(SPDesktop *desktop) -{ - if (this->current_desktop != desktop) { - this->current_desktop = desktop; - if( !symbol_sets[symbol_set->get_active_text()] ) { - // Symbol set is from Current document, update - rebuild(); - } - } -} - -} //namespace Dialogs -} //namespace UI -} //namespace Inkscape - -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-basic-offset:2 - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=8:softtabstop=2:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/symbols.cpp.rej b/src/ui/dialog/symbols.cpp.rej deleted file mode 100644 index fe32c8bad..000000000 --- a/src/ui/dialog/symbols.cpp.rej +++ /dev/null @@ -1,384 +0,0 @@ ---- src/ui/dialog/symbols.cpp -+++ src/ui/dialog/symbols.cpp -@@ -348,38 +374,8 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : - - // This might need to be a global variable so setTargetDesktop can modify it - SPDefs *defs = current_document->getDefs(); -- -- /*************************Overlays******************************/ - #if GTK_CHECK_VERSION(3,2,4) -- //Loading -- overlay_opacity = new Gtk::Image(); - overlay_opacity->set(getOverlay(overlay_opacity, "overlay", 1000)); -- overlay_opacity->set_halign(Gtk::ALIGN_START ); -- overlay_opacity->set_valign(Gtk::ALIGN_START ); -- //No results -- iconsize = Gtk::IconSize().register_new(Glib::ustring("ICON_SIZE_DIALOG_EXTRA"), 110, 110); -- overlay_icon = new Gtk::Image(); -- overlay_icon->set_from_icon_name("none", iconsize); -- overlay_icon = new Gtk::Image(); -- overlay_icon->set_halign(Gtk::ALIGN_CENTER ); -- overlay_icon->set_valign(Gtk::ALIGN_START ); -- overlay_icon->set_margin_top(45); -- overlay_title = new Gtk::Label(); -- overlay_title->set_halign(Gtk::ALIGN_CENTER ); -- overlay_title->set_valign(Gtk::ALIGN_START ); -- overlay_title->set_justify(Gtk::JUSTIFY_CENTER); -- overlay_title->set_margin_top(155); -- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); -- overlay_desc = new Gtk::Label(); -- overlay_desc->set_halign(Gtk::ALIGN_CENTER ); -- overlay_desc->set_valign(Gtk::ALIGN_START ); -- overlay_desc->set_margin_top(180); -- overlay_desc->set_justify(Gtk::JUSTIFY_CENTER); -- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("Try a another search or select other set")) + Glib::ustring("")); -- overlay->add_overlay(* overlay_opacity); -- overlay->add_overlay(* overlay_icon); -- overlay->add_overlay(* overlay_title); -- overlay->add_overlay(* overlay_desc); - #endif - sigc::connection defsModifiedConn = defs->connectModified(sigc::mem_fun(*this, &SymbolsDialog::defsModified)); - instanceConns.push_back(defsModifiedConn); -@@ -394,16 +390,11 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : - getSymbolsFilename(); - icons_found = false; - -- Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackSymbols)); -- - addSymbolsInDoc(current_document); /* Defaults to current document */ - sigc::connection desktopChangeConn = - desk_track.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); - instanceConns.push_back( desktopChangeConn ); - desk_track.connect(GTK_WIDGET(gobj())); --#if GTK_CHECK_VERSION(3,2,4) -- overlay->hide(); --#endif - } - - SymbolsDialog::~SymbolsDialog() -@@ -411,6 +402,7 @@ SymbolsDialog::~SymbolsDialog() - for (std::vector::iterator it = instanceConns.begin(); it != instanceConns.end(); ++it) { - it->disconnect(); - } -+ idleconn.disconnect(); - instanceConns.clear(); - desk_track.disconnect(); - } -@@ -474,9 +466,68 @@ void SymbolsDialog::rebuild() { - } - if (symbol_document) { - addSymbolsInDoc(symbol_document); -+ } else { -+ showOverlay(); - } - } -+void SymbolsDialog::showOverlay() { -+#if GTK_CHECK_VERSION(3,2,4) -+Glib::ustring current = Glib::Markup::escape_text(symbol_set->get_active_text()); -+ if (current == ALLDOCS && -+ search->get_text() != _("Loading documents...") && -+ !l.size()) -+ { -+ if (!all_docs_processed ) { -+ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); -+ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time,\n search will be slow.\nPlease wait ...")) + Glib::ustring("")); -+ } else if (!icons_found && !search_str.empty()) { -+ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found ...")) + Glib::ustring("")); -+ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); -+ } else { -+ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("All symbol sets ...")) + Glib::ustring("")); -+ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("We have all symbols preloaded,\n search is faster now ...")) + Glib::ustring("")); -+ } -+ } else if (current == ALLDOCS && search->get_text() == _("Loading documents...")) { -+ if (!all_docs_processed) { -+ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); -+ overlay_desc->set_markup(Glib::ustring("")+ Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); -+ overlay_icon->show(); -+ overlay_title->show(); -+ overlay_icon->set_from_icon_name("searching", iconsize); -+ overlay_desc->show(); -+ } -+ } else if (!number_symbols && (current != CURRENTDOC || !search_str.empty())) { -+ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); -+ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); -+ } else if (!number_symbols && current == CURRENTDOC) { -+ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols found")) + Glib::ustring("")); -+ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("No symbols in current document.\nYou could create in the current document\n or add into from other different symbol set.")) + Glib::ustring("")); -+ } else if (!icons_found && !search_str.empty()) { -+ overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); -+ overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); -+ } -+ overlay_opacity->show(); -+ overlay_icon->set_from_icon_name("none", iconsize); -+ overlay_icon->show(); -+ overlay_title->show(); -+ overlay_desc->show(); -+ if (l.size()) { -+ overlay_opacity->show(); -+ overlay_icon->hide(); -+ overlay_title->hide(); -+ overlay_desc->hide(); -+ } -+#endif -+} - -+void SymbolsDialog::hideOverlay() { -+#if GTK_CHECK_VERSION(3,2,4) -+ overlay_opacity->hide(); -+ overlay_icon->hide(); -+ overlay_title->hide(); -+ overlay_desc->hide(); -+#endif -+} - void SymbolsDialog::insertSymbol() { - Inkscape::Verb *verb = Inkscape::Verb::get( SP_VERB_EDIT_SYMBOL ); - SPAction *action = verb->get_action(Inkscape::ActionContext( (Inkscape::UI::View::View *) current_desktop) ); -@@ -934,6 +995,7 @@ void SymbolsDialog::clearSearch() - icons_found = false; - addSymbolsInDoc(symbol_document); - } else { -+ showOverlay(); - enableWidgets(true); - } - } -@@ -963,6 +1025,8 @@ void SymbolsDialog::beforeSearch(GdkEventKey* evt) - icons_found = false; - addSymbolsInDoc(symbol_document); - } else { -+ idleconn.disconnect(); -+ idleconn = Glib::signal_idle().connect( sigc::mem_fun(*this, &SymbolsDialog::callbackAllSymbols)); - search->set_text(_("Loading documents...")); - } - } -@@ -973,84 +1037,11 @@ void SymbolsDialog::unsensitive(GdkEventKey* evt) - } - - bool SymbolsDialog::callbackSymbols(){ -- Glib::ustring current = symbol_set->get_active_text(); --#if GTK_CHECK_VERSION(3,2,4) -- if (current == _("All symbols sets") && -- search->get_text() != _("Loading documents...")) -- { -- if (!all_docs_processed) { -- overlay_opacity->show(); -- overlay_icon->set_from_icon_name("none", iconsize); -- overlay_icon->show(); -- overlay_title->show(); -- overlay_desc->show(); -- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Searching in all symbol sets ...")) + Glib::ustring("")); -- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); -- } -- } -- if (current == _("Current Document") && !icons_found) { -- if (!all_docs_processed) { -- overlay_icon->set_from_icon_name("none", iconsize); -- overlay_opacity->show(); -- overlay_icon->show(); -- overlay_title->show(); -- overlay_desc->show(); -- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); -- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); -- } -- } --#endif -- if (current == _("All symbols sets") && -- search->get_text() == _("Loading documents...") ) -- { --#if GTK_CHECK_VERSION(3,2,4) -- overlay_opacity->show(); --#endif -- if (!all_docs_processed) { --#if GTK_CHECK_VERSION(3,2,4) -- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("Loading all symbol sets ...")) + Glib::ustring("")); -- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("When run for the first time, search will be slow.\nPlease wait ...")) + Glib::ustring("")); -- overlay_icon->show(); -- overlay_title->show(); -- overlay_icon->set_from_icon_name("searching", iconsize); -- overlay_desc->show(); --#endif -- } -- size_t counter = 0; -- for(auto const &symbol_document_map : symbol_sets) { -- ++counter; -- SPDocument* symbol_document = symbol_document_map.second; -- if (symbol_document) { -- continue; -- } -- symbol_document = getSymbolsSet(symbol_document_map.first).second; -- symbol_set->set_active_text(_("All symbols sets")); -- if (!symbol_document) { -- continue; -- } -- progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); -- return true; -- } --#if GTK_CHECK_VERSION(3,2,4) -- overlay_icon->hide(); -- overlay_title->hide(); -- overlay_desc->hide(); --#endif -- progress_bar->set_fraction(1.0); -- all_docs_processed = true; -- addSymbols(); -- search->set_text("Documents done, searchig inside..."); -- return true; -- } else if (l.size()) { --#if GTK_CHECK_VERSION(3,2,4) -- overlay_opacity->show(); -- overlay_icon->hide(); -- overlay_title->hide(); -- overlay_desc->hide(); --#endif -+ if (l.size()) { -+ showOverlay(); - for (auto symbol_data = l.begin(); symbol_data != l.end();) { -- Glib::ustring doc_title = symbol_data->first; -- SPSymbol * symbol = symbol_data->second; -+ Glib::ustring doc_title = symbol_data->second.first; -+ SPSymbol * symbol = symbol_data->second.second; - counter_symbols ++; - gchar const *symbol_title_char = symbol->title(); - gchar const *symbol_desc_char = symbol->description(); -@@ -1082,30 +1073,54 @@ bool SymbolsDialog::callbackSymbols(){ - return true; - } - } --#if GTK_CHECK_VERSION(3,2,4) - if (!icons_found && !search_str.empty()) { -- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); -- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); -- overlay_icon->set_from_icon_name("none", iconsize); -- overlay_icon->show(); -- overlay_title->show(); -- overlay_desc->show(); -+ showOverlay(); - } else { -- overlay_opacity->hide(); -+ hideOverlay(); - } --#endif - sensitive = false; - search->set_text(search_str); - sensitive = true; - enableWidgets(true); -- return true; -+ return false; -+ } -+ return true; -+} -+ -+bool SymbolsDialog::callbackAllSymbols(){ -+ Glib::ustring current = symbol_set->get_active_text(); -+ if (current == ALLDOCS && search->get_text() == _("Loading documents...")) { -+ size_t counter = 0; -+ std::map symbol_sets_tmp = symbol_sets; -+ for(auto const &symbol_document_map : symbol_sets_tmp) { -+ ++counter; -+ SPDocument* symbol_document = symbol_document_map.second; -+ if (symbol_document) { -+ continue; -+ } -+ symbol_document = getSymbolsSet(symbol_document_map.first).second; -+ symbol_set->set_active_text(ALLDOCS); -+ if (!symbol_document) { -+ continue; -+ } -+ progress_bar->set_fraction(((100.0/number_docs) * counter)/100.0); -+ return true; -+ } -+ symbol_sets_tmp.clear(); -+ hideOverlay(); -+ progress_bar->set_fraction(1.0); -+ all_docs_processed = true; -+ addSymbols(); -+ search->set_text("Documents done, searchig inside..."); -+ return false; - } - return true; - } - - Glib::ustring SymbolsDialog::ellipsize(Glib::ustring data, size_t limit) { - if (data.length() > limit) { -- return data.substr(0,limit-3) + "..."; -+ data = data.substr(0, limit-3); -+ return data + "..."; - } - return data; - } -@@ -1118,58 +1133,49 @@ void SymbolsDialog::addSymbolsInDoc(SPDocument* symbol_document) { - Glib::ustring doc_title = documentTitle(symbol_document); - progress_bar->set_fraction(0.0); - counter_symbols = 0; -- std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); -- number_symbols = container_symbols_tmp.size(); -- l = container_symbols_tmp; -- container_symbols_tmp.clear(); -+ l = symbolsInDoc(symbol_document, doc_title); -+ number_symbols = l.size(); - if (!number_symbols) { --#if GTK_CHECK_VERSION(3,2,4) -- overlay_icon->set_from_icon_name("none", iconsize); -- overlay_icon->show(); -- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); -- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); -- overlay_title->show(); -- overlay_desc->show(); --#endif - sensitive = false; - 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)); - } - } - - void SymbolsDialog::addSymbols() { - store->clear(); - icons_found = false; -- std::vector > container_symbols; - for(auto const &symbol_document_map : symbol_sets) { - SPDocument* symbol_document = symbol_document_map.second; - if (!symbol_document) { - continue; - } - Glib::ustring doc_title = documentTitle(symbol_document); -- std::vector > container_symbols_tmp = symbolsInDoc(symbol_document, doc_title); -- container_symbols.insert(container_symbols.end(), std::make_move_iterator(container_symbols_tmp.begin()), std::make_move_iterator(container_symbols_tmp.end())); -- container_symbols_tmp.clear(); -+ std::map > l_tmp = symbolsInDoc(symbol_document, doc_title); -+ for(auto &p : l_tmp ) { -+ l[p.first] = p.second; -+ } -+ l_tmp.clear(); - } - counter_symbols = 0; - progress_bar->set_fraction(0.0); -- number_symbols = container_symbols.size(); -- l = container_symbols; -- container_symbols.clear(); -+ number_symbols = l.size(); - if (!number_symbols) { --#if GTK_CHECK_VERSION(3,2,4) -- overlay_icon->set_from_icon_name("none", iconsize); -- overlay_title->set_markup(Glib::ustring("") + Glib::ustring(_("No results found")) + Glib::ustring("")); -- overlay_desc->set_markup(Glib::ustring("") + Glib::ustring(_("You could try a different search term,\nor switch to a different symbol set.")) + Glib::ustring("")); -- overlay_icon->show(); -- overlay_title->show(); -- overlay_desc->show(); --#endif -+ 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)); - } - } - diff --git a/src/ui/dialog/symbols.h.orig b/src/ui/dialog/symbols.h.orig deleted file mode 100644 index 8255877b8..000000000 --- a/src/ui/dialog/symbols.h.orig +++ /dev/null @@ -1,172 +0,0 @@ -/** @file - * @brief Symbols dialog - */ -/* Authors: - * Tavmjong Bah, Martin Owens - * - * Copyright (C) 2012 Tavmjong Bah - * 2013 Martin Owens - * 2017 Jabiertxo Arraiza - * - * Released under GNU GPL, read the file 'COPYING' for more information - */ - -#ifndef INKSCAPE_UI_DIALOG_SYMBOLS_H -#define INKSCAPE_UI_DIALOG_SYMBOLS_H -#include - -#include "display/drawing.h" -#include "ui/dialog/desktop-tracker.h" -#include "ui/widget/panel.h" -#include "sp-symbol.h" -#include "sp-use.h" -#include - -class SPObject; - -namespace Inkscape { -namespace UI { -namespace Dialog { - -class SymbolColumns; // For Gtk::ListStore - -/** - * A dialog that displays selectable symbols and allows users to drag or paste - * those symbols from the dialog into the document. - * - * Symbol documents are loaded from the preferences paths and displayed in a - * drop-down list to the user. The user then selects which of the symbols - * documents they want to get symbols from. The first document in the list is - * always the current document. - * - * This then updates an icon-view with all the symbols available. Selecting one - * puts it onto the clipboard. Dragging it or pasting it onto the canvas copies - * the symbol from the symbol document, into the current document and places a - * new & context, Gtk::SelectionData& selection_data, guint info, guint time); - void getSymbolsFilename(); - Glib::ustring documentTitle(SPDocument* doc); - std::pair getSymbolsSet(Glib::ustring title); - void addSymbol( SPObject* symbol, Glib::ustring doc_title); - SPDocument* symbolsPreviewDoc(); - void symbolsInDocRecursive (SPObject *r, std::vector > &l, Glib::ustring doc_title); - std::vector > symbolsInDoc( SPDocument* document, Glib::ustring doc_title); - void useInDoc(SPObject *r, std::vector &l); - std::vector useInDoc( SPDocument* document); - void beforeSearch(GdkEventKey* evt); - void unsensitive(GdkEventKey* evt); - void addSymbols(); - void addSymbolsInDoc(SPDocument* document); - void clearSearch(); - bool callbackSymbols(); - void enableWidgets(bool enable); - Glib::ustring ellipsize(Glib::ustring data, size_t limit = 40); - gchar const* styleFromUse( gchar const* id, SPDocument* document); - Glib::RefPtr drawSymbol(SPObject *symbol, unsigned force_psize = 0); - Glib::RefPtr getOverlay(Gtk::Image* image, gchar const * icon_title, unsigned psize); - /* Keep track of all symbol template documents */ - std::map symbol_sets; - std::vector > l; - // Index into sizes which is selected - int pack_size; - // Scale factor - int scale_factor; - bool sensitive; - bool all_docs_processed; - size_t number_docs; - size_t number_symbols; - size_t counter_symbols; - bool icons_found; - Glib::RefPtr store; - Glib::ustring search_str; - Gtk::ComboBoxText* symbol_set; - Gtk::ProgressBar* progress_bar; - Gtk::HBox* progress; - Gtk::SearchEntry* search; - Gtk::IconView* icon_view; - Gtk::Button* add_symbol; - Gtk::Button* remove_symbol; - Gtk::Button* zoom_in; - Gtk::Button* zoom_out; - Gtk::Button* more; - Gtk::Button* fewer; - Gtk::HBox* tools; -#if GTK_CHECK_VERSION(3,2,4) - Gtk::Overlay* overlay; -#endif - Gtk::Image* overlay_icon; - Gtk::Image* overlay_opacity; - Gtk::Label* overlay_title; - Gtk::Label* overlay_desc; - Gtk::ScrolledWindow *scroller; - Gtk::ToggleButton* fit_symbol; - Gtk::IconSize iconsize; - void setTargetDesktop(SPDesktop *desktop); - SPDesktop* current_desktop; - DesktopTracker desk_track; - SPDocument* current_document; - SPDocument* preview_document; /* Document to render single symbol */ - - sigc::connection idleconn; - - /* For rendering the template drawing */ - unsigned key; - Inkscape::Drawing renderDrawing; - - std::vector instanceConns; -}; - -} //namespace Dialogs -} //namespace UI -} //namespace Inkscape - - -#endif // INKSCAPE_UI_DIALOG_SYMBOLS_H - -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/symbols.h.rej b/src/ui/dialog/symbols.h.rej deleted file mode 100644 index 72cb5b299..000000000 --- a/src/ui/dialog/symbols.h.rej +++ /dev/null @@ -1,19 +0,0 @@ ---- src/ui/dialog/symbols.h -+++ src/ui/dialog/symbols.h -@@ -141,13 +144,14 @@ private: - Gtk::ScrolledWindow *scroller; - Gtk::ToggleButton* fit_symbol; - Gtk::IconSize iconsize; -- - void setTargetDesktop(SPDesktop *desktop); - SPDesktop* current_desktop; - DesktopTracker desk_track; - SPDocument* current_document; - SPDocument* preview_document; /* Document to render single symbol */ -- -+ -+ sigc::connection idleconn; -+ - /* For rendering the template drawing */ - unsigned key; - Inkscape::Drawing renderDrawing; -- cgit v1.2.3