gui: Trigger refiltering from the QueueToolbar

I also modify the QueueWindow to do the actual filtering.

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2015-04-17 21:03:31 -04:00
parent 8c3b1489bd
commit 83414ca3ad
6 changed files with 50 additions and 51 deletions

View File

@ -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();

View File

@ -1,11 +1,12 @@
/*
* Copyright 2015 (c) Anna Schumaker.
*/
#include <core/filter.h>
#include <gui/queue/window.h>
QueueWindow :: QueueWindow(BaseObjectType *cobject,
const Glib::RefPtr<Gtk::Builder> 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<QueueModel>(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<unsigned int>::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();
}

View File

@ -2,7 +2,6 @@
* Copyright 2014 (c) Anna Schumaker.
*/
#include <core/deck.h>
#include <core/filter.h>
#include <core/playlist.h>
#include <core/string.h>
#include <gui/tabs.h>
@ -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<unsigned int>::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

View File

@ -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();
};

View File

@ -6,12 +6,16 @@
#include <gui/queue/model.h>
#include <gtkmm.h>
#include <set>
class QueueWindow : public Gtk::ScrolledWindow {
private:
Glib::RefPtr<Gtk::Builder> _builder;
Queue *_queue;
std::set<unsigned int> _q_search_res;
bool _q_search_empty;
public:
Gtk::TreeView *q_treeview;
Glib::RefPtr<QueueModel> q_model;
@ -19,8 +23,10 @@ public:
QueueWindow(BaseObjectType *, const Glib::RefPtr<Gtk::Builder>);
~QueueWindow();
void init(Queue *);
void filter(std::string &);
bool filter_ids(const Gtk::TreeIter &);
};
#endif /* OCARINA_GUI_QUEUE_WINDOW_H */

View File

@ -7,11 +7,9 @@
#include <gui/ocarina.h>
#include <gui/queue/model.h>
#include <core/queue.h>
#include <set>
class Tab : public QNotifier {
private:
std::set<unsigned int> 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();
};