summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabiertxo Arraiza Cenoz <jtx@jtx-desktop.markerlab.es>2017-10-18 09:59:53 +0000
committerJabiertxo Arraiza Cenoz <jtx@jtx-desktop.markerlab.es>2017-10-18 09:59:53 +0000
commitaa33189524513d54d049ee866c126c892461c62c (patch)
treeb116231916ab8bca5250087f95c41a556bba9d3c /src
parentAllow multiple shapes in 'shape-inside' and 'shape-subtract'. Work from Alex ... (diff)
downloadinkscape-aa33189524513d54d049ee866c126c892461c62c.tar.gz
inkscape-aa33189524513d54d049ee866c126c892461c62c.zip
Add search to symbols dialog
Diffstat (limited to 'src')
-rw-r--r--src/ui/dialog/symbols.cpp78
-rw-r--r--src/ui/dialog/symbols.h11
2 files changed, 72 insertions, 17 deletions
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<Glib::ustring> symbol_id;
Gtk::TreeModelColumn<Glib::ustring> symbol_title;
+ Gtk::TreeModelColumn<Glib::ustring> symbol_doc_title;
Gtk::TreeModelColumn< Glib::RefPtr<Gdk::Pixbuf> > 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<SPSymbol*
}
}
-std::vector<SPSymbol*> SymbolsDialog::symbols_in_doc( SPDocument* symbolDocument )
+std::vector<SPSymbol*> SymbolsDialog::symbols_in_doc( SPDocument* symbolDocument)
{
std::vector<SPSymbol*> l;
@@ -655,8 +675,7 @@ void SymbolsDialog::use_in_doc_recursive (SPObject *r, std::vector<SPUse*> &l)
}
}
-std::vector<SPUse*> SymbolsDialog::use_in_doc( SPDocument* useDocument ) {
-
+std::vector<SPUse*> SymbolsDialog::use_in_doc( SPDocument* useDocument) {
std::vector<SPUse*> 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<SPSymbol*> 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<SPSymbol*> 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<SPSymbol*> 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<Gdk::Pixbuf> 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 <gtkmm/searchentry.h>
#include <vector>
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<Gdk::DragContext>& 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<SPSymbol*> &l);
- std::vector<SPSymbol*> symbols_in_doc( SPDocument* document );
+ std::vector<SPSymbol*> symbols_in_doc( SPDocument* document);
void use_in_doc_recursive(SPObject *r, std::vector<SPUse*> &l);
- std::vector<SPUse*> use_in_doc( SPDocument* document );
+ std::vector<SPUse*> 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<Gdk::Pixbuf> draw_symbol(SPObject *symbol);
@@ -104,6 +106,7 @@ private:
Glib::RefPtr<Gtk::ListStore> store;
Gtk::ComboBoxText* symbolSet;
+ Gtk::SearchEntry* search;
Gtk::IconView* iconView;
Gtk::Button* addSymbol;
Gtk::Button* removeSymbol;