diff --git a/gui/queue/toolbar.cpp b/gui/queue/toolbar.cpp index 41ec4179..2ba94f16 100644 --- a/gui/queue/toolbar.cpp +++ b/gui/queue/toolbar.cpp @@ -11,6 +11,11 @@ QueueToolbar :: QueueToolbar(BaseObjectType *cobject, _builder->get_widget("q_switch", _q_switch); _builder->get_widget("q_repeat", _q_repeat); _builder->get_widget("q_random", _q_random); + + q_search->signal_key_release_event().connect(sigc::mem_fun(*this, + &QueueToolbar::on_search_key_released)); + q_search->signal_search_changed().connect(sigc::mem_fun(*this, + &QueueToolbar::on_search_changed)); } QueueToolbar :: ~QueueToolbar() @@ -38,7 +43,6 @@ void QueueToolbar :: init(Queue *queue, QueueLabel *label, _q_random->show(); } - if (flags & T_REPEAT) { _q_repeat->signal_toggled().connect(sigc::mem_fun(*this, &QueueToolbar::on_repeat_toggled)); @@ -63,6 +67,18 @@ void QueueToolbar :: on_repeat_toggled() _queue->unset_flag(Q_REPEAT); } +bool QueueToolbar :: on_search_key_released(GdkEventKey *event) +{ + std::string key = gdk_keyval_name(event->keyval); + return key == "space"; +} + +void QueueToolbar :: on_search_changed() +{ + std::string text = q_search->get_text(); + _q_window->filter(text); +} + void QueueToolbar :: on_switch_toggled() { bool active = _q_switch->get_active(); diff --git a/gui/queue/window.cpp b/gui/queue/window.cpp index 8211328e..e4932da2 100644 --- a/gui/queue/window.cpp +++ b/gui/queue/window.cpp @@ -1,11 +1,12 @@ /* * Copyright 2015 (c) Anna Schumaker. */ +#include #include QueueWindow :: QueueWindow(BaseObjectType *cobject, const Glib::RefPtr builder) - : Gtk::ScrolledWindow(cobject), _builder(builder) + : Gtk::ScrolledWindow(cobject), _builder(builder), _q_search_empty(true) { _builder->get_widget("q_treeview", q_treeview); } @@ -20,4 +21,26 @@ void QueueWindow :: init(Queue *queue) q_model = Glib::RefPtr(new QueueModel(queue)); q_filter = Gtk::TreeModelFilter::create(q_model); q_treeview->set_model(q_filter); + q_filter->set_visible_func(sigc::mem_fun(*this, &QueueWindow::filter_ids)); +} + +void QueueWindow :: filter(std::string &text) +{ + _q_search_empty = (text.find_first_not_of(" \t") == std::string::npos); + if (!_q_search_empty) + filter :: search(text, _q_search_res); + q_filter->refilter(); +} + +bool QueueWindow :: filter_ids(const Gtk::TreeIter &iter) +{ + unsigned int id; + std::set::iterator it; + + if (_q_search_empty) + return true; + + id = q_model->iter_to_id(iter); + it = _q_search_res.find(_queue->operator[](id)->index()); + return it != _q_search_res.end(); } diff --git a/gui/tabs.cpp b/gui/tabs.cpp index 3a0c6a47..93b1f30a 100644 --- a/gui/tabs.cpp +++ b/gui/tabs.cpp @@ -2,7 +2,6 @@ * Copyright 2014 (c) Anna Schumaker. */ #include -#include #include #include #include @@ -38,13 +37,6 @@ Tab :: ~Tab() {} void Tab :: tab_finish_init() { - tab_filter->set_visible_func(sigc::mem_fun(*this, - &Tab::on_filter_visible)); - tab_search->signal_key_release_event().connect(sigc::mem_fun(*this, - &Tab::on_entry_key_released)); - tab_search->signal_search_changed().connect(sigc::mem_fun(*this, - &Tab::on_entry_changed)); - tab_treeview->signal_row_activated().connect(sigc::mem_fun(*this, &Tab :: on_row_activated)); tab_treeview->signal_key_press_event().connect(sigc::mem_fun(*this, @@ -311,39 +303,6 @@ bool Tab :: on_button_pressed(GdkEventButton *button) -/** - * - * Tab filtering functions - * - */ - -bool Tab :: on_filter_visible(const Gtk::TreeIter &iter) -{ - unsigned int pq_id; - std::set::iterator it; - - if (tab_search->get_text_length() == 0) - return true; - - pq_id = tab_model->iter_to_id(iter); - it = visible_ids.find(tab_pq->operator[](pq_id)->index()); - return it != visible_ids.end(); -} - -bool Tab :: on_entry_key_released(GdkEventKey *event) -{ - std::string key = gdk_keyval_name(event->keyval); - return key == "space"; -} - -void Tab :: on_entry_changed() -{ - filter :: search(tab_search->get_text(), visible_ids); - tab_filter->refilter(); -} - - - /** * * Global functions diff --git a/include/gui/queue/toolbar.h b/include/gui/queue/toolbar.h index 81933d90..60349a56 100644 --- a/include/gui/queue/toolbar.h +++ b/include/gui/queue/toolbar.h @@ -38,6 +38,8 @@ public: void on_random_toggled(); void on_repeat_toggled(); + bool on_search_key_released(GdkEventKey *event); + void on_search_changed(); void on_switch_toggled(); }; diff --git a/include/gui/queue/window.h b/include/gui/queue/window.h index bfebe820..3fa6ba9d 100644 --- a/include/gui/queue/window.h +++ b/include/gui/queue/window.h @@ -6,12 +6,16 @@ #include #include +#include class QueueWindow : public Gtk::ScrolledWindow { private: Glib::RefPtr _builder; Queue *_queue; + std::set _q_search_res; + bool _q_search_empty; + public: Gtk::TreeView *q_treeview; Glib::RefPtr q_model; @@ -19,8 +23,10 @@ public: QueueWindow(BaseObjectType *, const Glib::RefPtr); ~QueueWindow(); - void init(Queue *); + + void filter(std::string &); + bool filter_ids(const Gtk::TreeIter &); }; #endif /* OCARINA_GUI_QUEUE_WINDOW_H */ diff --git a/include/gui/tabs.h b/include/gui/tabs.h index 8a3a20e1..c4eeb1e0 100644 --- a/include/gui/tabs.h +++ b/include/gui/tabs.h @@ -7,11 +7,9 @@ #include #include #include -#include class Tab : public QNotifier { private: - std::set visible_ids; unsigned int tab_sorting_count; std::string tab_sorting_title; @@ -83,11 +81,6 @@ public: bool on_key_pressed(GdkEventKey *); void on_column_clicked(unsigned int); bool on_button_pressed(GdkEventButton *); - - /* Filtering functions */ - bool on_filter_visible(const Gtk::TreeIter &); - bool on_entry_key_released(GdkEventKey *); - void on_entry_changed(); };