ocarina: Implement switch-to-page-n keyboard shortcut
Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
parent
5c09db59a6
commit
d27a1fb7ba
|
@ -56,6 +56,7 @@ bool playlist_entry_focused();
|
|||
void playlist_focus_entry();
|
||||
void playlist_focus_treeview();
|
||||
void playlist_switch_to(string &);
|
||||
void playlist_switch_to_n(unsigned int);
|
||||
void init_tabs();
|
||||
void new_playlist(libsaria::Playlist *);
|
||||
|
||||
|
|
|
@ -159,7 +159,7 @@ namespace ocarina
|
|||
gtk_box_pack_start(GTK_BOX(entry_box), entry, TRUE, TRUE, 0);
|
||||
gtk_box_pack_start(GTK_BOX(box), entry_box, FALSE, FALSE, 0);
|
||||
|
||||
setup_treeview();
|
||||
//setup_treeview();
|
||||
|
||||
gtk_box_pack_start(GTK_BOX(label_box), number, FALSE, FALSE, 0);
|
||||
gtk_box_pack_start(GTK_BOX(label_box), name, TRUE, TRUE, 0);
|
||||
|
|
|
@ -1,127 +0,0 @@
|
|||
// Copyright (c) 2012 Bryan Schumaker
|
||||
#include <ocarina/playlist.h>
|
||||
#include "playlist.h"
|
||||
|
||||
#include <libsaria/track.h>
|
||||
|
||||
struct column_info {
|
||||
const char *name;
|
||||
int width;
|
||||
bool visible;
|
||||
GType type;
|
||||
|
||||
column_info(const char *n, GType t, int w, bool v)
|
||||
{
|
||||
name = n;
|
||||
width = w;
|
||||
visible = v;
|
||||
type = t;
|
||||
}
|
||||
};
|
||||
|
||||
static struct column_info columns[] = {
|
||||
column_info( "Pointer", G_TYPE_POINTER, 2, false),
|
||||
column_info( "#", G_TYPE_INT, 20, true),
|
||||
column_info( "Title", G_TYPE_STRING, 300, true),
|
||||
column_info( "Length", G_TYPE_STRING, 60, true),
|
||||
column_info( "Artist", G_TYPE_STRING, 125, true),
|
||||
column_info( "Album", G_TYPE_STRING, 125, true),
|
||||
column_info( "Year", G_TYPE_INT, 50, true),
|
||||
column_info( "Count", G_TYPE_INT, 50, true),
|
||||
column_info("Last Played", G_TYPE_STRING, 80, true),
|
||||
column_info( "Filepath", G_TYPE_STRING, 2, false),
|
||||
};
|
||||
|
||||
#define TOOLTIP 9
|
||||
#define NUM_COLUMNS (sizeof(columns) / sizeof(column_info))
|
||||
|
||||
static void track_selected(GtkWidget *treeview, GtkTreePath *path,
|
||||
GtkTreeViewColumn *col, gpointer data)
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
GtkTreeModel *model;
|
||||
libsaria::Track *track;
|
||||
|
||||
model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
|
||||
gtk_tree_model_get_iter(model, &iter, path);
|
||||
gtk_tree_model_get(model, &iter, 0, &track, -1);
|
||||
|
||||
track->load(true);
|
||||
}
|
||||
|
||||
static gboolean do_filter(GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
|
||||
{
|
||||
libsaria::Track *track;
|
||||
ocarina::Playlist *plist = (ocarina::Playlist *)data;
|
||||
|
||||
gtk_tree_model_get(model, iter, 0, &track, -1);
|
||||
return plist->get_playlist()->is_visible(track);
|
||||
}
|
||||
|
||||
static GtkListStore *setup_liststore(GtkWidget *treeview)
|
||||
{
|
||||
GtkListStore *liststore;
|
||||
GtkTreeViewColumn *col;
|
||||
GtkCellRenderer *textcell = gtk_cell_renderer_text_new();
|
||||
GType types[NUM_COLUMNS];
|
||||
|
||||
for (unsigned int i = 0; i < NUM_COLUMNS; i++)
|
||||
types[i] = columns[i].type;
|
||||
|
||||
liststore = gtk_list_store_newv(NUM_COLUMNS, types);
|
||||
gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(textcell), 1);
|
||||
|
||||
for (unsigned int i = 0; i < NUM_COLUMNS; i++) {
|
||||
if (columns[i].type == G_TYPE_POINTER)
|
||||
continue;
|
||||
col = gtk_tree_view_column_new_with_attributes(columns[i].name,
|
||||
textcell,
|
||||
"text", i,
|
||||
NULL);
|
||||
gtk_tree_view_column_set_resizable(col, TRUE);
|
||||
gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED);
|
||||
gtk_tree_view_column_set_min_width(col, 2);
|
||||
gtk_tree_view_column_set_max_width(col, 700);
|
||||
gtk_tree_view_column_set_fixed_width(col, columns[i].width);
|
||||
gtk_tree_view_column_set_visible(col, columns[i].visible);
|
||||
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col);
|
||||
};
|
||||
|
||||
return liststore;
|
||||
}
|
||||
|
||||
namespace ocarina
|
||||
{
|
||||
|
||||
void Playlist::setup_treeview()
|
||||
{
|
||||
GtkWidget *scroll_win = gtk_scrolled_window_new(NULL, NULL);
|
||||
|
||||
treeview = gtk_tree_view_new();
|
||||
liststore = setup_liststore(treeview);
|
||||
|
||||
filter = gtk_tree_model_filter_new(GTK_TREE_MODEL(liststore), NULL);
|
||||
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filter),
|
||||
do_filter, this, NULL);
|
||||
|
||||
treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
|
||||
gtk_tree_selection_set_mode(treesel, GTK_SELECTION_MULTIPLE);
|
||||
|
||||
g_signal_connect(treeview, "row-activated", G_CALLBACK(track_selected), NULL);
|
||||
g_signal_connect(treeview, "button-release-event", G_CALLBACK(show_rc_menu), this);
|
||||
g_signal_connect(treeview, "key-press-event", G_CALLBACK(key_pressed), this);
|
||||
|
||||
gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
|
||||
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), filter);
|
||||
gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(treeview), TOOLTIP);
|
||||
gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview), -1);
|
||||
|
||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
|
||||
GTK_POLICY_AUTOMATIC,
|
||||
GTK_POLICY_AUTOMATIC);
|
||||
gtk_container_add(GTK_CONTAINER(scroll_win), treeview);
|
||||
gtk_box_pack_start(GTK_BOX(box), scroll_win, TRUE, TRUE, 0);
|
||||
gtk_widget_show_all(scroll_win);
|
||||
}
|
||||
|
||||
}; /* Namespace: ocarina */
|
|
@ -80,6 +80,15 @@ void playlist_switch_to(string &key)
|
|||
gtk_notebook_set_current_page(tabs, size + 2);
|
||||
}
|
||||
|
||||
void playlist_switch_to_n(unsigned int n)
|
||||
{
|
||||
GtkNotebook *tabs = GTK_NOTEBOOK(get_widget("PlaylistTabs"));
|
||||
unsigned int size = tabs_size();
|
||||
if (size <= n)
|
||||
return;
|
||||
gtk_notebook_set_current_page(tabs, n);
|
||||
}
|
||||
|
||||
static gboolean on_focus_change(GtkWidget *entry, GdkEvent *event, gpointer data)
|
||||
{
|
||||
if (gtk_widget_is_focus(entry))
|
||||
|
|
|
@ -57,6 +57,9 @@ static gboolean key_pressed(GtkWidget *widget, GdkEvent *event, gpointer data)
|
|||
if (playlist_entry_focused())
|
||||
return FALSE;
|
||||
|
||||
if (key.substr(0, 3) == "KP_")
|
||||
key = key.substr(3);
|
||||
|
||||
/*
|
||||
* TODO: 'j' and 'k' for treeview navigation,
|
||||
* something for banning / unbanning songs
|
||||
|
@ -64,6 +67,8 @@ static gboolean key_pressed(GtkWidget *widget, GdkEvent *event, gpointer data)
|
|||
*/
|
||||
if (key == "b" || key == "l" || key == "r")
|
||||
playlist_switch_to(key);
|
||||
else if (key >= "0" && key <= "9")
|
||||
playlist_switch_to_n(atoi(key.c_str()));
|
||||
else if (key == "n")
|
||||
libsaria::deck::next();
|
||||
else if (key == "N")
|
||||
|
|
Loading…
Reference in New Issue