gui: Add a right click menu

At the moment it only adds tracks to a playqueue.  I will add in
removing tracks soon!

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
Anna Schumaker 2014-02-06 21:45:02 -05:00 committed by Anna Schumaker
parent 240ae7e21a
commit 5761740f6b
2 changed files with 271 additions and 15 deletions

View File

@ -7,6 +7,126 @@
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkImage" id="image12">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-new</property>
<property name="icon_size">1</property>
</object>
<object class="GtkImage" id="image13">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
<property name="icon_size">1</property>
</object>
<object class="GtkMenu" id="o_rc_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="o_new_pq">
<property name="label" translatable="yes">New Playqueue</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">image12</property>
<property name="use_stock">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="o_add_to_pq">
<property name="label" translatable="yes">Add to Playqueue</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">image13</property>
<property name="use_stock">False</property>
<child type="submenu">
<object class="GtkMenu" id="menu1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="o_pq_0">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Playqueue 0</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="o_pq_1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Playqueue 1</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="o_pq_2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Playqueue 2</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="o_pq_3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Playqueue 3</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="o_pq_4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Playqueue 4</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="o_pq_5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Playqueue 5</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="o_pq_6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Playqueue 6</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="o_pq_7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Playqueue 7</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="o_pq_8">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Playqueue 8</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="o_pq_9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Playqueue 9</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<object class="GtkListStore" id="o_collection_dirs">
<columns>
<!-- column-name id -->

View File

@ -63,6 +63,75 @@ static void dec_sort_timeout()
}
}
static Gtk::MenuItem *get_menu_widget(const std::string &name)
{
Gtk::MenuItem *widget;
get_builder()->get_widget(name, widget);
return widget;
}
static void prepare_rc_menu()
{
unsigned int size = deck::size();
/* Set widgets visible */
switch (size) {
case 10:
get_menu_widget("o_pq_9")->show();
case 9:
get_menu_widget("o_pq_8")->show();
case 8:
get_menu_widget("o_pq_7")->show();
case 7:
get_menu_widget("o_pq_6")->show();
case 6:
get_menu_widget("o_pq_5")->show();
case 5:
get_menu_widget("o_pq_4")->show();
case 4:
get_menu_widget("o_pq_3")->show();
case 3:
get_menu_widget("o_pq_2")->show();
case 2:
get_menu_widget("o_pq_1")->show();
case 1:
get_menu_widget("o_pq_0")->show();
get_menu_widget("o_add_to_pq")->show();
default:
if (size != 10)
get_menu_widget("o_new_pq")->show();
break;
}
/* Set widgets invisible */
switch (size) {
case 0:
get_menu_widget("o_add_to_pq")->hide();
get_menu_widget("o_pq_0")->hide();
case 1:
get_menu_widget("o_pq_1")->hide();
case 2:
get_menu_widget("o_pq_2")->hide();
case 3:
get_menu_widget("o_pq_3")->hide();
case 4:
get_menu_widget("o_pq_4")->hide();
case 5:
get_menu_widget("o_pq_5")->hide();
case 6:
get_menu_widget("o_pq_6")->hide();
case 7:
get_menu_widget("o_pq_7")->hide();
case 8:
get_menu_widget("o_pq_8")->hide();
case 9:
get_menu_widget("o_pq_9")->hide();
break;
case 10:
get_menu_widget("o_new_pq")->hide();
};
}
/*
@ -259,8 +328,11 @@ public:
bool on_entry_key_released(GdkEventKey *);
bool on_filter_visible(const Gtk::TreeIter &);
void on_page_renumbered();
bool on_add_to_pq(unsigned int);
bool on_view_key_pressed(GdkEventKey *);
void on_sidebar_cursor_changed();
bool on_sidebar_clicked(GdkEventButton *);
bool on_view_button_pressed(GdkEventButton *);
};
@ -363,6 +435,8 @@ void OcarinaPage::setup_sidebar()
sb_view.get_selection()->set_mode(Gtk::SELECTION_BROWSE);
sb_view.signal_cursor_changed().connect(sigc::mem_fun(*this,
&OcarinaPage::on_sidebar_cursor_changed));
sb_view.signal_button_press_event().connect(sigc::mem_fun(*this,
&OcarinaPage::on_sidebar_clicked), false);
row = *(sb_store->append());
row[sb_cols.sb_col_name] = "Favorites";
@ -397,6 +471,8 @@ void OcarinaPage::setup_treeview()
&OcarinaPage::on_row_activated));
page_view.signal_key_press_event().connect(sigc::mem_fun(*this,
&OcarinaPage::on_view_key_pressed));
page_view.signal_button_press_event().connect(sigc::mem_fun(*this,
&OcarinaPage::on_view_button_pressed), false);
page_view.set_model(filter);
page_view.set_rules_hint();
@ -572,6 +648,25 @@ void OcarinaPage::on_page_renumbered()
tab->set_number(notebook->page_num(*this));
}
bool OcarinaPage::on_add_to_pq(unsigned int n)
{
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;
}
bool OcarinaPage::on_view_key_pressed(GdkEventKey *event)
{
std::string key = gdk_keyval_name(event->keyval);
@ -583,21 +678,7 @@ bool OcarinaPage::on_view_key_pressed(GdkEventKey *event)
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 on_add_to_pq(n);
}
return false;
}
@ -612,6 +693,25 @@ void OcarinaPage::on_sidebar_cursor_changed()
playlist :: select(row[sb_cols.sb_col_name]);
}
bool OcarinaPage::on_sidebar_clicked(GdkEventButton *button)
{
if (button->button != 3)
return false;
return true;
}
bool OcarinaPage::on_view_button_pressed(GdkEventButton *button)
{
Gtk::Menu *menu;
get_builder()->get_widget("o_rc_menu", menu);
if (button->button != 3)
return false;
prepare_rc_menu();
menu->popup(button->button, button->time);
return true;
}
/*
@ -712,6 +812,29 @@ void queue_selected(bool random)
}
}
static void on_new_queue()
{
queue_selected(false);
}
static void on_add_to_queue(unsigned int num)
{
std::map<Playqueue *, OcarinaPage *>::iterator it;
for (it = tab_map.begin(); it != tab_map.end(); it++) {
if (it->second->is_current_tab()) {
it->second->on_add_to_pq(num);
return;
}
}
}
static void init_menu_item(const std::string &name, unsigned int num)
{
Gtk::MenuItem *menu = get_menu_widget(name);
menu->signal_activate().connect(sigc::bind<unsigned int> (
sigc::ptr_fun(on_add_to_queue), num));
}
void init_tabs()
{
Gtk::Notebook *notebook;
@ -720,12 +843,25 @@ void init_tabs()
new OcarinaPage("Playlist\nManager", "emblem-documents", playlist::get_pq());
new OcarinaPage("History", "document-open-recent", audio::get_recent_pq(), 0);
new OcarinaPage("Collection", "media-optical", deck::get_library_pq(), PQ_RANDOM);
get_callbacks()->on_pq_created = on_pq_created;
get_callbacks()->on_pq_removed = on_pq_removed;
get_callbacks()->on_queue_track_add = on_track_added;
get_callbacks()->on_queue_track_del = on_track_deleted;
get_callbacks()->on_queue_track_changed = on_track_changed;
get_menu_widget("o_new_pq")->signal_activate().connect(sigc::ptr_fun(on_new_queue));
init_menu_item("o_pq_0", 0);
init_menu_item("o_pq_1", 1);
init_menu_item("o_pq_2", 2);
init_menu_item("o_pq_3", 3);
init_menu_item("o_pq_4", 4);
init_menu_item("o_pq_5", 5);
init_menu_item("o_pq_6", 6);
init_menu_item("o_pq_7", 7);
init_menu_item("o_pq_8", 8);
init_menu_item("o_pq_9", 9);
notebook->signal_switch_page().connect(sigc::ptr_fun(on_switch_page));
notebook->signal_page_reordered().connect(sigc::ptr_fun(on_page_reordered));
notebook->set_current_page(0);