ocarina/gui/queue/window.cpp

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