gui: Add tracks to playqueue

I added tab numbers to make it easier to specify what playqueue to add
tracks to.

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
Anna Schumaker 2014-02-02 10:45:09 -05:00 committed by Anna Schumaker
parent 0929418fb7
commit 82243cfdd1
3 changed files with 77 additions and 4 deletions

View File

@ -57,7 +57,7 @@ void PlayqueueModel::on_row_changed(unsigned int row)
void PlayqueueModel::on_path_selected(const Gtk::TreePath &path)
{
audio :: load_trackid(queue->operator[](path[0]));
audio :: load_trackid(path_to_id(path));
queue->set_cur(path[0]);
audio :: play();
}
@ -67,6 +67,11 @@ unsigned int PlayqueueModel :: iter_to_id(const Gtk::TreeIter &iter)
return GPOINTER_TO_UINT(iter.gobj()->user_data);
}
unsigned int PlayqueueModel::path_to_id(const Gtk::TreePath &path)
{
return queue->operator[](path[0]);
}
/*

View File

@ -64,6 +64,7 @@ public:
OcarinaTab();
~OcarinaTab();
virtual void set_size(unsigned int) = 0;
virtual void set_number(unsigned int) = 0;
};
OcarinaTab::OcarinaTab() {}
@ -81,6 +82,7 @@ public:
PresetTab(const std::string &, const std::string &);
~PresetTab();
void set_size(unsigned int);
void set_number(unsigned int);
};
PresetTab::PresetTab(const std::string &name, const std::string &icon)
@ -102,6 +104,7 @@ PresetTab::PresetTab(const std::string &name, const std::string &icon)
}
PresetTab::~PresetTab() {}
void PresetTab::set_number(unsigned int num) {}
void PresetTab::set_size(unsigned int size)
{
@ -114,20 +117,23 @@ void PresetTab::set_size(unsigned int size)
class PQTab : public OcarinaTab {
public:
Gtk::Label number_label;
Gtk::Label size_label;
Gtk::Image close_icon;
Gtk::Button close_button;
PQTab();
~PQTab();
void set_size(unsigned int);
void set_number(unsigned int);
};
PQTab::PQTab() : size_label("0", 0.5, 0.5)
PQTab::PQTab() : number_label("0", 0, 0.5), size_label("0", 0.5, 0.5)
{
close_icon.set_from_icon_name("window-close", Gtk::ICON_SIZE_MENU);
close_button.set_image(close_icon);
close_button.set_relief(Gtk::RELIEF_NONE);
pack_start(number_label, false, false);
pack_start(size_label, true, true);
pack_start(close_button, false, false);
show_all();
@ -142,6 +148,13 @@ void PQTab::set_size(unsigned int size)
size_label.set_markup(ss.str());
}
void PQTab::set_number(unsigned int num)
{
std::stringstream ss;
ss << "<span size='x-large'>" << num << ". </span>";
number_label.set_markup(ss.str());
}
@ -197,6 +210,8 @@ public:
void on_entry_changed();
bool on_entry_key_released(GdkEventKey *);
bool on_filter_visible(const Gtk::TreeIter &);
void on_page_renumbered();
bool on_view_key_pressed(GdkEventKey *);
};
@ -292,6 +307,9 @@ void OcarinaPage::setup_treeview()
page_view.signal_row_activated().connect(sigc::mem_fun(*this,
&OcarinaPage::on_row_activated));
page_view.signal_key_press_event().connect(sigc::mem_fun(*this,
&OcarinaPage::on_view_key_pressed));
page_view.set_model(filter);
page_view.set_rules_hint();
page_view.set_enable_search(false);
@ -354,7 +372,7 @@ void OcarinaPage::queue_selected(bool random)
pq = deck::create(random);
std::vector<Gtk::TreeModel::Path> rows = sel->get_selected_rows();
for (it = rows.begin(); it != rows.end(); it++) {
track_id = (*model->queue)[(*it)[0]];
track_id = model->path_to_id(filter->convert_path_to_child_path(*it));
pq->add(track_id);
}
}
@ -456,6 +474,41 @@ bool OcarinaPage::on_filter_visible(const Gtk::TreeIter &iter)
return visible_ids.find(model->queue->operator[](pq_id)) != visible_ids.end();
}
void OcarinaPage::on_page_renumbered()
{
tab->set_number(notebook->page_num(*this));
}
bool OcarinaPage::on_view_key_pressed(GdkEventKey *event)
{
std::string key = gdk_keyval_name(event->keyval);
if (key.size() >= 3) {
if (key.substr(0, 3) == "KP_")
key = key.substr(3);
}
if (key >= "0" && key <= "9") {
unsigned int n = atoi(key.c_str());
if (n >= deck :: size())
return true;
Glib::RefPtr<Gtk::TreeSelection> sel = page_view.get_selection();
if (sel->count_selected_rows() == 0)
return true;
Playqueue *pq = deck :: get(n);
std::vector<Gtk::TreeModel::Path>::iterator it;
std::vector<Gtk::TreeModel::Path> rows = sel->get_selected_rows();
for (it = rows.begin(); it != rows.end(); it++) {
unsigned int track_id = model->path_to_id(filter->convert_path_to_child_path(*it));
pq->add(track_id);
}
return true;
}
return false;
}
/*
@ -504,6 +557,13 @@ static void on_switch_page(Gtk::Widget *page, int num)
sort_timeout_count = 0;
}
static void renumber_pqs()
{
std::map<Playqueue *, OcarinaPage *>::iterator it;
for (it = tab_map.begin(); it != tab_map.end(); it++)
it->second->on_page_renumbered();
}
static void on_page_reordered(Gtk::Widget *page, int num)
{
Gtk::Notebook *notebook;
@ -513,14 +573,17 @@ static void on_page_reordered(Gtk::Widget *page, int num)
if ((unsigned int)num >= deck :: size())
notebook->reorder_child(*page, deck::size() - 1);
else
else {
deck :: move(tab->model->queue, num);
renumber_pqs();
}
}
static void on_pq_created(Playqueue *pq, unsigned int num)
{
OcarinaPage *page = new OcarinaPage(pq, PQ_RANDOM | PQ_REPEAT, num);
page->check_pq_flags();
renumber_pqs();
}
static void on_pq_removed(Playqueue *pq)
@ -529,11 +592,15 @@ static void on_pq_removed(Playqueue *pq)
it = tab_map.find(pq);
if (it != tab_map.end())
delete it->second;
renumber_pqs();
}
void queue_selected(bool random)
{
std::map<Playqueue *, OcarinaPage *>::iterator it;
if (deck :: size() >= 10)
return;
for (it = tab_map.begin(); it != tab_map.end(); it++) {
if (it->second->is_current_tab()) {
it->second->queue_selected(random);

View File

@ -45,6 +45,7 @@ public:
void on_row_changed(unsigned int);
void on_path_selected(const Gtk::TreePath &);
unsigned int iter_to_id(const Gtk::TreeIter &);
unsigned int path_to_id(const Gtk::TreePath &);
};
/* tabs.cpp */