2014-01-18 14:43:24 -05:00
|
|
|
/*
|
|
|
|
* Copyright 2014 (c) Anna Schumaker.
|
|
|
|
*/
|
2014-01-19 11:03:53 -05:00
|
|
|
#include <callback.h>
|
2014-01-18 14:43:24 -05:00
|
|
|
#include <deck.h>
|
|
|
|
#include <ocarina.h>
|
|
|
|
#include <playqueue.h>
|
|
|
|
|
|
|
|
#include <map>
|
2014-01-19 10:34:26 -05:00
|
|
|
#include <sstream>
|
2014-01-18 14:43:24 -05:00
|
|
|
#include <string>
|
|
|
|
|
2014-01-19 10:34:26 -05:00
|
|
|
class OcarinaTab;
|
|
|
|
static std::map<Playqueue *, OcarinaTab *> tab_map;
|
2014-01-18 14:43:24 -05:00
|
|
|
|
2014-01-19 15:19:24 -05:00
|
|
|
static class QueueColumns : public Gtk::TreeModelColumnRecord {
|
|
|
|
public:
|
|
|
|
QueueColumns()
|
|
|
|
{ add(q_col_track); add(q_col_title); add(q_col_length);
|
|
|
|
add(q_col_artist); add(q_col_album); add(q_col_year);
|
|
|
|
add(q_col_genre); add(q_col_count); add(q_col_played); }
|
|
|
|
|
|
|
|
Gtk::TreeModelColumn<unsigned int> q_col_track;
|
|
|
|
Gtk::TreeModelColumn<std::string> q_col_title;
|
|
|
|
Gtk::TreeModelColumn<std::string> q_col_length;
|
|
|
|
Gtk::TreeModelColumn<std::string> q_col_artist;
|
|
|
|
Gtk::TreeModelColumn<std::string> q_col_album;
|
|
|
|
Gtk::TreeModelColumn<unsigned int> q_col_year;
|
|
|
|
Gtk::TreeModelColumn<std::string> q_col_genre;
|
|
|
|
Gtk::TreeModelColumn<unsigned int> q_col_count;
|
|
|
|
Gtk::TreeModelColumn<std::string> q_col_played;
|
|
|
|
} queue_cols;
|
|
|
|
static unsigned int q_col_width[] = { 20, 300, 1, 125, 125, 1, 125, 1, 1 };
|
|
|
|
|
|
|
|
|
2014-01-18 14:43:24 -05:00
|
|
|
/*
|
|
|
|
* Tab class definition
|
|
|
|
*/
|
|
|
|
class OcarinaTab {
|
|
|
|
private:
|
2014-01-20 19:06:52 -05:00
|
|
|
Glib::RefPtr<PlayqueueModel> model;
|
2014-01-19 10:34:26 -05:00
|
|
|
|
|
|
|
/* Tab widgets */
|
2014-01-18 14:43:24 -05:00
|
|
|
Gtk::VBox tab_box;
|
2014-01-19 10:34:26 -05:00
|
|
|
Gtk::Label tab_name;
|
|
|
|
Gtk::Label tab_size;
|
|
|
|
|
2014-01-19 15:19:24 -05:00
|
|
|
/* Page widgets */
|
|
|
|
Gtk::VBox page_box;
|
|
|
|
Gtk::HBox page_toolbar;
|
|
|
|
Gtk::SearchEntry page_entry;
|
|
|
|
Gtk::ToggleButton page_random;
|
|
|
|
//Gtk::ToggleButton page_repeat;
|
|
|
|
Gtk::ScrolledWindow page_scroll;
|
|
|
|
Gtk::TreeView page_view;
|
|
|
|
|
|
|
|
void setup_columns();
|
2014-01-20 19:06:52 -05:00
|
|
|
void set_tab_size();
|
2014-01-19 10:34:26 -05:00
|
|
|
|
2014-01-18 14:43:24 -05:00
|
|
|
public:
|
|
|
|
OcarinaTab(const std::string &, Playqueue *);
|
|
|
|
~OcarinaTab();
|
2014-01-20 19:06:52 -05:00
|
|
|
|
|
|
|
void on_row_inserted(unsigned int);
|
|
|
|
void on_row_deleted(unsigned int);
|
2014-01-18 14:43:24 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
OcarinaTab::OcarinaTab(const std::string &text, Playqueue *pq)
|
2014-01-20 19:06:52 -05:00
|
|
|
: tab_name("<big>" + text + "</big>", 1, 0.5),
|
2014-01-19 10:34:26 -05:00
|
|
|
tab_size("0", 1, 0.5)
|
2014-01-18 14:43:24 -05:00
|
|
|
{
|
|
|
|
Gtk::Notebook *notebook;
|
|
|
|
get_builder()->get_widget("o_notebook", notebook);
|
2014-01-20 19:06:52 -05:00
|
|
|
model = Glib::RefPtr<PlayqueueModel>(new PlayqueueModel(pq));
|
2014-01-19 10:34:26 -05:00
|
|
|
|
2014-01-19 15:19:24 -05:00
|
|
|
|
2014-01-19 10:34:26 -05:00
|
|
|
/* Make tab label */
|
|
|
|
tab_name.set_use_markup();
|
|
|
|
tab_box.pack_start(tab_name);
|
|
|
|
tab_box.pack_start(tab_size);
|
|
|
|
tab_box.show_all();
|
|
|
|
set_tab_size();
|
|
|
|
|
|
|
|
|
2014-01-19 15:19:24 -05:00
|
|
|
/* Make page content */
|
|
|
|
page_random.set_image_from_icon_name("media-playlist-shuffle");
|
|
|
|
page_random.set_active(pq->get_flags() & PQ_RANDOM);
|
|
|
|
//page_repeat.set_image_from_icon_name("media-playlist-repeat");
|
|
|
|
page_toolbar.set_spacing(5);
|
|
|
|
|
|
|
|
page_view.append_column("#", queue_cols.q_col_track);
|
|
|
|
page_view.append_column("Title", queue_cols.q_col_title);
|
|
|
|
page_view.append_column("Length", queue_cols.q_col_length);
|
|
|
|
page_view.append_column("Artist", queue_cols.q_col_artist);
|
|
|
|
page_view.append_column("Album", queue_cols.q_col_album);
|
|
|
|
page_view.append_column("Year", queue_cols.q_col_year);
|
|
|
|
page_view.append_column("Genre", queue_cols.q_col_genre);
|
|
|
|
page_view.append_column("Count", queue_cols.q_col_count);
|
|
|
|
page_view.append_column("Played", queue_cols.q_col_played);
|
2014-01-20 19:06:52 -05:00
|
|
|
|
|
|
|
page_view.set_model(model);
|
2014-01-19 15:19:24 -05:00
|
|
|
page_scroll.add(page_view);
|
|
|
|
setup_columns();
|
|
|
|
|
|
|
|
page_toolbar.pack_start(page_entry);
|
|
|
|
page_toolbar.pack_start(page_random, false, false);
|
|
|
|
//page_toolbar.pack_start(page_repeat, false, false);
|
|
|
|
page_box.pack_start(page_toolbar, false, false);
|
|
|
|
page_box.pack_start(page_scroll);
|
|
|
|
page_box.show_all();
|
|
|
|
|
|
|
|
|
|
|
|
/* Add to notebook */
|
|
|
|
notebook->prepend_page(page_box, tab_box);
|
2014-01-18 14:43:24 -05:00
|
|
|
tab_map[pq] = this;
|
|
|
|
};
|
|
|
|
|
|
|
|
OcarinaTab::~OcarinaTab()
|
|
|
|
{
|
2014-01-19 15:19:24 -05:00
|
|
|
Gtk::Notebook *notebook;
|
|
|
|
get_builder()->get_widget("o_notebook", notebook);
|
|
|
|
notebook->remove_page(page_box);
|
|
|
|
|
2014-01-20 19:06:52 -05:00
|
|
|
tab_map.erase(model->queue);
|
2014-01-19 10:34:26 -05:00
|
|
|
}
|
|
|
|
|
2014-01-19 15:19:24 -05:00
|
|
|
void OcarinaTab::setup_columns()
|
|
|
|
{
|
|
|
|
std::vector<Gtk::TreeViewColumn *> columns = page_view.get_columns();
|
|
|
|
for (unsigned int i = 0; i < columns.size(); i++) {
|
|
|
|
columns[i]->set_resizable();
|
|
|
|
columns[i]->set_fixed_width(q_col_width[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-20 19:06:52 -05:00
|
|
|
void OcarinaTab::set_tab_size()
|
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
ss << model->queue->size();
|
|
|
|
tab_size.set_text(ss.str());
|
|
|
|
}
|
|
|
|
|
|
|
|
void OcarinaTab::on_row_inserted(unsigned int row)
|
|
|
|
{
|
|
|
|
model->on_row_inserted(row);
|
|
|
|
set_tab_size();
|
|
|
|
}
|
|
|
|
|
|
|
|
void OcarinaTab::on_row_deleted(unsigned int row)
|
|
|
|
{
|
|
|
|
model->on_row_deleted(row);
|
|
|
|
set_tab_size();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-01-18 14:43:24 -05:00
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Do stuff with tabs
|
|
|
|
*/
|
2014-01-20 19:06:52 -05:00
|
|
|
static void on_track_added(Playqueue *pq, unsigned int row)
|
2014-01-19 11:03:53 -05:00
|
|
|
{
|
2014-01-20 19:06:52 -05:00
|
|
|
tab_map[pq]->on_row_inserted(row);
|
2014-01-19 11:03:53 -05:00
|
|
|
}
|
|
|
|
|
2014-01-20 19:06:52 -05:00
|
|
|
static void on_track_deleted(Playqueue *pq, unsigned int row)
|
2014-01-19 11:03:53 -05:00
|
|
|
{
|
2014-01-20 19:06:52 -05:00
|
|
|
tab_map[pq]->on_row_deleted(row);
|
2014-01-19 11:03:53 -05:00
|
|
|
}
|
|
|
|
|
2014-01-19 10:34:26 -05:00
|
|
|
void init_tabs()
|
2014-01-18 14:43:24 -05:00
|
|
|
{
|
2014-01-19 10:34:26 -05:00
|
|
|
new OcarinaTab("Library", deck::get_library_pq());
|
2014-01-19 11:03:53 -05:00
|
|
|
get_callbacks()->on_queue_track_add = on_track_added;
|
|
|
|
get_callbacks()->on_queue_track_del = on_track_deleted;
|
2014-01-18 14:43:24 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void cleanup_tabs()
|
|
|
|
{
|
|
|
|
std::map<Playqueue *, OcarinaTab *>::iterator it;
|
|
|
|
for (it = tab_map.begin(); it != tab_map.end(); it++)
|
|
|
|
delete it->second;
|
|
|
|
}
|