ocarina/gui/queue.cpp

202 lines
3.7 KiB
C++

/*
* Copyright 2014 (c) Anna Schumaker.
*/
#include <callback.h>
#include <deck.h>
#include <tabs.h>
#include <map>
class QueueTab : public Tab {
private:
/**
* Queue tab variables
*/
Gtk::HBox q_tab_box;
Gtk::Label q_tab_number;
Gtk::Label q_tab_size;
Gtk::Button q_tab_close;
Gtk::Image q_tab_close_img;
/**
* Queue page variables
*/
Gtk::ToggleButton q_random;
Gtk::SearchEntry q_search;
Gtk::TreeView q_treeview;
Gtk::VBox q_vbox;
public:
QueueTab(Playqueue *, unsigned int num);
~QueueTab();
/**
* Helper functions
*/
void on_post_init();
void tab_set_size();
void queue_set_number(unsigned int);
void on_tab_reordered();
void on_move_queue(int);
/**
* GTK-MM Callbacks
*/
void on_close_clicked();
};
static std::map<Gtk::Widget *, QueueTab *> queue_mapping;
QueueTab :: QueueTab(Playqueue *pq, unsigned int num)
: Tab(pq)
{
/*
* Create our tab widget
*/
q_tab_close_img.set_from_icon_name("window-close", Gtk::ICON_SIZE_MENU);
q_tab_close.set_image(q_tab_close_img);
q_tab_close.set_relief(Gtk::RELIEF_NONE);
q_tab_close.signal_clicked().connect(sigc::mem_fun(*this,
&QueueTab::on_close_clicked));
q_tab_size.set_justify(Gtk::JUSTIFY_CENTER);
q_tab_box.pack_start(q_tab_number, false, false);
q_tab_box.pack_start(q_tab_size, true, true);
q_tab_box.pack_start(q_tab_close, false, false);
tab_set_size();
queue_set_number(num);
q_tab_box.show_all();
/*
* Finish generic init
*/
tab_random = &q_random;
tab_search = &q_search;
tab_size = &q_tab_size;
tab_treeview = &q_treeview;
tab_widget = &q_vbox;
tab_finish_init();
queue_mapping[tab_widget] = this;
get_widget<Gtk::Notebook>("o_notebook")->insert_page(q_vbox, q_tab_box, num);
get_widget<Gtk::Notebook>("o_notebook")->set_tab_reorderable(q_vbox);
q_vbox.show_all();
}
QueueTab :: ~QueueTab()
{
queue_mapping.erase(tab_widget);
tab_unmap();
}
/**
*
* Queue tab helper functions
*
*/
void QueueTab :: on_post_init()
{
tab_init_random();
}
void QueueTab :: tab_set_size()
{
std::stringstream ss;
ss << "<span size='x-large'>" << tab_pq->size() << "</span>";
q_tab_size.set_markup(ss.str());
}
void QueueTab :: queue_set_number(unsigned int num)
{
std::stringstream ss;
ss << "<span size='x-large'>" << num << ". </span>";
q_tab_number.set_markup(ss.str());
}
void QueueTab :: on_tab_reordered()
{
queue_set_number(tab_page_num());
}
void QueueTab :: on_move_queue(int num)
{
deck :: move(tab_pq, num);
}
/**
*
* Gtk-MM Callback Functions
*
*/
void QueueTab :: on_close_clicked()
{
deck :: remove(tab_page_num());
}
/**
*
* Global functions
*
*/
static void renumber_queues()
{
std::map<Gtk::Widget *, QueueTab *>::iterator it;
for (it = queue_mapping.begin(); it != queue_mapping.end(); it++)
it->second->on_tab_reordered();
}
static void on_pq_created(Playqueue *pq, unsigned int num)
{
QueueTab *tab = new QueueTab(pq, num);
tab->on_post_init();
}
static void on_pq_removed(Playqueue *pq)
{
Tab *tab = find_tab(pq);
if (tab) {
delete tab;
renumber_queues();
}
}
static void on_page_reordered(Gtk::Widget *page, int num)
{
Gtk::Notebook *notebook = get_widget<Gtk::Notebook>("o_notebook");
if ((unsigned int)num >= deck :: size()) {
notebook->reorder_child(*page, deck::size() - 1);
return;
}
std::map<Gtk::Widget *, QueueTab *>::iterator it;
it = queue_mapping.find(page);
if (it != queue_mapping.end()) {
it->second->on_move_queue(num);
renumber_queues();
}
}
void init_queue_tabs()
{
struct Callbacks *cb = get_callbacks();
cb->on_pq_created = on_pq_created;
cb->on_pq_removed = on_pq_removed;
Gtk::Notebook *notebook = get_widget<Gtk::Notebook>("o_notebook");
notebook->signal_page_reordered().connect(sigc::ptr_fun(on_page_reordered));
}