/* * Copyright 2015 (c) Anna Schumaker. */ extern "C" { #include #include #include #include } #include QueueWindow :: QueueWindow(BaseObjectType *cobject, const Glib::RefPtr 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); }