ocarina: Implement switch-to-page-n keyboard shortcut

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-09-02 12:20:43 -04:00
parent 5c09db59a6
commit d27a1fb7ba
5 changed files with 16 additions and 128 deletions

View File

@ -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 *);

View File

@ -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);

View File

@ -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 */

View File

@ -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))

View File

@ -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")