diff options
| -rw-r--r-- | nncmpp.c | 48 | 
1 files changed, 48 insertions, 0 deletions
| @@ -521,6 +521,7 @@ static struct app_context  	struct tab *help_tab;               ///< Special help tab  	struct tab *tabs;                   ///< All other tabs  	struct tab *active_tab;             ///< Active tab +	struct tab *last_tab;               ///< Previous tab  	// Emulated widgets: @@ -1529,6 +1530,10 @@ app_prepend_tab (struct tab *tab)  static void  app_switch_tab (struct tab *tab)  { +	if (tab == g_ctx.active_tab) +		return; + +	g_ctx.last_tab = g_ctx.active_tab;  	g_ctx.active_tab = tab;  	app_invalidate ();  } @@ -1553,6 +1558,8 @@ app_goto_tab (int tab_index)  	\  	XX( QUIT,               "Quit application"        ) \  	XX( REDRAW,             "Redraw screen"           ) \ +	XX( HELP_TAB,           "Switch to the help tab"  ) \ +	XX( LAST_TAB,           "Switch to previous tab"  ) \  	\  	XX( MPD_PREVIOUS,       "Previous song"           ) \  	XX( MPD_TOGGLE,         "Toggle play/pause"       ) \ @@ -1565,6 +1572,7 @@ app_goto_tab (int tab_index)  	XX( MPD_REPLACE,     "Replace playlist with song" ) \  	\  	XX( CHOOSE,             "Choose item"             ) \ +	XX( DELETE,             "Delete item"             ) \  	\  	XX( SCROLL_UP,          "Scroll up"               ) \  	XX( SCROLL_DOWN,        "Scroll down"             ) \ @@ -1625,6 +1633,14 @@ app_process_user_action (enum user_action action)  		clear ();  		app_invalidate ();  		break; +	case USER_ACTION_LAST_TAB: +		if (!g_ctx.last_tab) +			return false; +		app_switch_tab (g_ctx.last_tab); +		break; +	case USER_ACTION_HELP_TAB: +		app_switch_tab (g_ctx.help_tab); +		break;  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1826,7 +1842,10 @@ static struct binding  g_default_bindings[] =  {  	{ "Escape",     USER_ACTION_QUIT               }, +	{ "q",          USER_ACTION_QUIT               },  	{ "C-l",        USER_ACTION_REDRAW             }, +	{ "M-Tab",      USER_ACTION_LAST_TAB           }, +	{ "F1",         USER_ACTION_HELP_TAB           },  	{ "Home",       USER_ACTION_GOTO_TOP           },  	{ "End",        USER_ACTION_GOTO_BOTTOM        }, @@ -1845,6 +1864,7 @@ g_default_bindings[] =  	// Not sure how to set these up, they're pretty arbitrary so far  	{ "Enter",      USER_ACTION_CHOOSE             }, +	{ "Delete",     USER_ACTION_DELETE             },  	{ "a",          USER_ACTION_MPD_ADD            },  	{ "r",          USER_ACTION_MPD_REPLACE        }, @@ -1906,6 +1926,33 @@ current_tab_on_item_draw (size_t item_index, struct row_buffer *buffer,  		(int) item_index == g_ctx.song ? A_BOLD : 0);  } +static bool +current_tab_on_action (enum user_action action) +{ +	struct tab *self = g_ctx.active_tab; +	if (self->item_selected < 0) +		return false; + +	struct mpd_client *c = &g_ctx.client; +	switch (action) +	{ +		char *song; +	case USER_ACTION_CHOOSE: +		song = xstrdup_printf ("%d", self->item_selected); +		MPD_SIMPLE ("play", song) +		free (song); +		return true; +	case USER_ACTION_DELETE: +		song = xstrdup_printf ("%d", self->item_selected); +		MPD_SIMPLE ("delete", song) +		free (song); +		return true; +	default: +		break; +	} +	return false; +} +  static void  current_tab_update (void)  { @@ -1918,6 +1965,7 @@ current_tab_init (void)  {  	struct tab *super = &g_current_tab.super;  	tab_init (super, "Current"); +	super->on_action = current_tab_on_action;  	super->on_item_draw = current_tab_on_item_draw;  	return super;  } | 
