ocarina/gui/playlist.cpp

183 lines
4.4 KiB
C++

/*
* Copyright 2014 (c) Anna Schumaker.
*/
#include <core/audio.h>
#include <core/playlist.h>
#include <gui/tabs.h>
#include <gui/queue/label.h>
#include <gui/queue/toolbar.h>
#include <gui/queue/window.h>
static Gtk::ToggleButton *o_ban;
static Gtk::ToggleButton *o_fav;
static class PlaylistColumns : public Gtk::TreeModelColumnRecord {
public:
Gtk::TreeModelColumn<Glib::ustring> p_name;
PlaylistColumns() { add(p_name); }
} p_cols;
class PlaylistWindow : public Gtk::ScrolledWindow {
private:
Glib::RefPtr<Gtk::Builder> _builder;
public:
Gtk::TreeView *p_treeview;
Glib::RefPtr<Gtk::ListStore> p_list;
PlaylistWindow(BaseObjectType *cobject,
const Glib::RefPtr<Gtk::Builder> builder)
: Gtk::ScrolledWindow(cobject), _builder(builder)
{
_builder->get_widget("p_treeview", p_treeview);
p_list = Glib::RefPtr<Gtk::ListStore>::cast_static(_builder->get_object("p_list"));
p_treeview->signal_cursor_changed().connect(sigc::mem_fun(*this,
&PlaylistWindow::on_cursor_changed));
p_treeview->signal_button_press_event().connect(sigc::mem_fun(*this,
&PlaylistWindow::on_clicked));
}
~PlaylistWindow() {}
Glib::ustring current_playlist()
{
Gtk::TreePath path;
Gtk::TreeModel::Row row;
Gtk::TreeViewColumn *col;
p_treeview->get_cursor(path, col);
row = *(p_list->get_iter(path));
return row[p_cols.p_name];
}
void on_cursor_changed()
{
playlist :: select(current_playlist());
}
bool on_clicked(GdkEventButton *button)
{
return button->button == 3;
}
};
static class PlaylistTab : public Tab {
private:
Glib::RefPtr<Gtk::Builder> builder;
Gtk::VBox playlist_vbox;
Gtk::HBox playlist_hbox;
PlaylistLabel *playlist_label;
PlaylistWindow *playlist_window;
QueueToolbar *playlist_toolbar;
QueueWindow *playlist_tracks;
public:
PlaylistTab() : Tab(playlist :: get_queue())
{
builder = Gtk::Builder::create();
builder->add_from_file(gui :: share_file("QueueWindow.ui"));
builder->add_from_file(gui :: share_file("QueueToolbar.ui"));
builder->add_from_file(gui :: share_file("QueueLabel.ui"));
builder->add_from_file(gui :: share_file("PlaylistWindow.ui"));
builder->get_widget_derived("PlaylistLabel", playlist_label);
builder->get_widget_derived("PlaylistWindow", playlist_window);
builder->get_widget_derived("QueueToolbar", playlist_toolbar);
builder->get_widget_derived("QueueWindow", playlist_tracks);
playlist_hbox.pack_start(*playlist_window, false, true);
playlist_hbox.pack_start(*playlist_tracks, true, true);
playlist_hbox.show();
playlist_vbox.set_margin_left(1);
playlist_vbox.set_margin_right(1);
playlist_vbox.set_homogeneous(false);
playlist_vbox.pack_start(*playlist_toolbar, false, true, 2);
playlist_vbox.pack_start(playlist_hbox, true, true);
playlist_vbox.show();
tab_random = playlist_toolbar->q_random;
tab_repeat = playlist_toolbar->q_repeat;
tab_search = playlist_toolbar->q_search;
tab_treeview = playlist_tracks->q_treeview;
tab_widget = &playlist_vbox;
tab_finish_init();
gui :: get_widget<Gtk::Notebook>("o_notebook")->insert_page(playlist_vbox, *playlist_label, 0);
}
~PlaylistTab()
{
tab_unmap();
}
bool on_key_press_event(const std::string &key)
{
std::string cur;
std::vector<unsigned int> ids;
if (key != "Delete")
return Tab :: on_key_press_event(key);
cur = playlist_window->current_playlist();
if (cur == "")
return true;
tab_selected_ids(ids);
for (unsigned int i = 0; i < ids.size(); i++)
playlist :: del(tags :: get_track(ids[i]), cur);
return true;
}
} *p_tab;
static void on_ban()
{
Track *track = audio :: current_track();
if (o_ban->get_active()) {
if (!playlist :: has(track, "Banned")) {
playlist :: add(track, "Banned");
audio :: next();
}
} else
playlist :: del(track, "Banned");
}
static void on_favorite()
{
Track *track = audio :: current_track();
if (o_fav->get_active())
playlist :: add(track, "Favorites");
else
playlist :: del(track, "Favorites");
}
void plist :: track_loaded(Track *track)
{
o_ban->set_active(playlist :: has(track, "Banned"));
o_fav->set_active(playlist :: has(track, "Favorites"));
}
void plist :: init()
{
p_tab = new PlaylistTab;
o_ban = gui :: get_widget<Gtk::ToggleButton>("o_ban");
o_fav = gui :: get_widget<Gtk::ToggleButton>("o_favorite");
o_ban->signal_toggled().connect(sigc::ptr_fun(on_ban));
o_fav->signal_toggled().connect(sigc::ptr_fun(on_favorite));
}