88 lines
2.3 KiB
C++
88 lines
2.3 KiB
C++
/*
|
|
* Copyright 2015 (c) Anna Schumaker.
|
|
*/
|
|
extern "C" {
|
|
#include <core/audio.h>
|
|
#include <core/filter.h>
|
|
#include <gui/model.h>
|
|
#include <gui/queue.h>
|
|
}
|
|
#include <gui/queue/window.h>
|
|
|
|
QueueWindow :: QueueWindow(BaseObjectType *cobject,
|
|
const Glib::RefPtr<Gtk::Builder> builder)
|
|
: Gtk::ScrolledWindow(cobject), _builder(builder), _q_search_empty(true)
|
|
{
|
|
_q_search_res = SET_INIT();
|
|
_builder->get_widget("q_treeview", q_treeview);
|
|
}
|
|
|
|
QueueWindow :: ~QueueWindow()
|
|
{
|
|
set_deinit(&_q_search_res);
|
|
}
|
|
|
|
int queue_window_filter_ids(GtkTreeModel *model, GtkTreeIter *iter,
|
|
gpointer data)
|
|
{
|
|
QueueWindow *window = (QueueWindow *)data;
|
|
struct queue *queue = window->_queue;
|
|
struct track *track;
|
|
|
|
if (window->_q_search_empty)
|
|
return true;
|
|
|
|
track = gui_queue_model_iter_get_track(gui_queue(queue)->gq_model, iter);
|
|
return set_has(&window->_q_search_res, track->tr_dbe.dbe_index);
|
|
}
|
|
|
|
void QueueWindow :: init(queue *queue)
|
|
{
|
|
_queue = queue;
|
|
GtkTreeModel *model = GTK_TREE_MODEL(gui_queue(queue)->gq_model);
|
|
q_filter = gtk_tree_model_filter_new(model, NULL);
|
|
|
|
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(q_filter),
|
|
queue_window_filter_ids,
|
|
this, NULL);
|
|
|
|
q_treeview->signal_row_activated().connect(sigc::mem_fun(*this,
|
|
&QueueWindow :: on_row_activated));
|
|
q_treeview->signal_key_press_event().connect(sigc::mem_fun(*this,
|
|
&QueueWindow :: on_key_press), false);
|
|
gtk_tree_view_set_model(q_treeview->gobj(), q_filter);
|
|
}
|
|
|
|
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.c_str(), &_q_search_res);
|
|
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(q_filter));
|
|
}
|
|
|
|
bool QueueWindow :: on_key_press(GdkEventKey *event)
|
|
{
|
|
std::string key = gdk_keyval_name(event->keyval);
|
|
if (key == "space")
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
void QueueWindow :: on_row_activated(const Gtk::TreePath &path,
|
|
Gtk::TreeViewColumn *col)
|
|
{
|
|
GtkTreePath *orig = path.gobj_copy();
|
|
GtkTreePath *real = gtk_tree_model_filter_convert_path_to_child_path(
|
|
GTK_TREE_MODEL_FILTER(q_filter), orig);
|
|
struct track *track = gui_queue_model_path_get_track(
|
|
gui_queue(_queue)->gq_model, real);
|
|
|
|
audio_load(track);
|
|
queue_selected(_queue, gtk_tree_path_get_indices(real)[0]);
|
|
audio_play();
|
|
|
|
gtk_tree_path_free(orig);
|
|
gtk_tree_path_free(real);
|
|
}
|