Commit b1b43f10 authored by Rafaël Carré's avatar Rafaël Carré

ncurses: factor HandlePlaylistKey() out of HandleKey()

parent 14b3c6a7
...@@ -1440,148 +1440,134 @@ static inline void BoxSwitch(intf_sys_t *p_sys, int box) ...@@ -1440,148 +1440,134 @@ static inline void BoxSwitch(intf_sys_t *p_sys, int box)
p_sys->i_box_type = (p_sys->i_box_type == box) ? BOX_NONE : box; p_sys->i_box_type = (p_sys->i_box_type == box) ? BOX_NONE : box;
} }
static int HandleKey(intf_thread_t *p_intf) static bool HandlePlaylistKey(intf_thread_t *p_intf, int key)
{ {
bool b_box_plidx_follow = false;
intf_sys_t *p_sys = p_intf->p_sys; intf_sys_t *p_sys = p_intf->p_sys;
playlist_t *p_playlist = pl_Get(p_intf); playlist_t *p_playlist = pl_Get(p_intf);
int i_key = wgetch(p_sys->w); struct pl_item_t *p_pl_item;
if (i_key == -1)
return 0;
if (p_sys->i_box_type == BOX_PLAYLIST) switch(key)
{ {
int b_ret = true; /* Playlist Settings */
bool b_box_plidx_follow = false; case 'r': var_ToggleBool(p_playlist, "random"); return true;
case 'l': var_ToggleBool(p_playlist, "loop"); return true;
switch(i_key) case 'R': var_ToggleBool(p_playlist, "repeat"); return true;
{
/* Playlist Settings */ /* Playlist sort */
case 'r': case 'o':
var_ToggleBool(p_playlist, "random"); case 'O':
return 1; playlist_RecursiveNodeSort(p_playlist, PlaylistGetRoot(p_intf),
case 'l': SORT_TITLE_NODES_FIRST,
var_ToggleBool(p_playlist, "loop"); (key == 'o')? ORDER_NORMAL : ORDER_REVERSE);
return 1; p_sys->b_need_update = true;
case 'R': return true;
var_ToggleBool(p_playlist, "repeat");
return 1; /* Playlist view */
case 'v':
/* Playlist sort */ p_sys->category_view = !p_sys->category_view;
case 'o': p_sys->b_need_update = true;
playlist_RecursiveNodeSort(p_playlist, PlaylistGetRoot(p_intf), return true;
SORT_TITLE_NODES_FIRST, ORDER_NORMAL);
p_sys->b_need_update = true; /* Playlist navigation */
return 1;
case 'O':
playlist_RecursiveNodeSort(p_playlist, PlaylistGetRoot(p_intf),
SORT_TITLE_NODES_FIRST, ORDER_REVERSE);
p_sys->b_need_update = true;
return 1;
/* Playlist view */
case 'v':
p_sys->category_view = !p_sys->category_view;
PlaylistRebuild(p_intf);
return 1;
/* Playlist navigation */
case 'g':
FindIndex(p_sys, p_playlist, false);
break;
case KEY_HOME:
p_sys->i_box_plidx = 0;
break;
#ifdef __FreeBSD__ #ifdef __FreeBSD__
/* workaround for FreeBSD + xterm: /* workaround for FreeBSD + xterm:
* see http://www.nabble.com/curses-vs.-xterm-key-mismatch-t3574377.html */ * see http://www.nabble.com/curses-vs.-xterm-key-mismatch-t3574377.html */
case KEY_SELECT: case KEY_SELECT:
#endif #endif
case KEY_END: case KEY_END: p_sys->i_box_plidx = p_playlist->items.i_size - 1; break;
p_sys->i_box_plidx = p_playlist->items.i_size - 1; case KEY_HOME: p_sys->i_box_plidx = 0; break;
break; case KEY_UP: p_sys->i_box_plidx--; break;
case KEY_UP: case KEY_DOWN: p_sys->i_box_plidx++; break;
p_sys->i_box_plidx--; case KEY_PPAGE: p_sys->i_box_plidx -= p_sys->i_box_lines; break;
break; case KEY_NPAGE: p_sys->i_box_plidx += p_sys->i_box_lines; break;
case KEY_DOWN: case 'g': FindIndex(p_sys, p_playlist, false); break;
p_sys->i_box_plidx++;
break; /* Deletion */
case KEY_PPAGE: case 'D':
p_sys->i_box_plidx -= p_sys->i_box_lines; case KEY_BACKSPACE:
break; case 0x7f:
case KEY_NPAGE: case KEY_DC:
p_sys->i_box_plidx += p_sys->i_box_lines; {
break; playlist_item_t *p_item;
case 'D':
case KEY_BACKSPACE:
case 0x7f:
case KEY_DC:
{
playlist_item_t *p_item;
PL_LOCK; PL_LOCK;
p_item = p_sys->pp_plist[p_sys->i_box_plidx]->p_item; p_item = p_sys->pp_plist[p_sys->i_box_plidx]->p_item;
if (p_item->i_children == -1) if (p_item->i_children == -1)
playlist_DeleteFromInput(p_playlist, p_item->p_input, pl_Locked); playlist_DeleteFromInput(p_playlist, p_item->p_input, pl_Locked);
else else
playlist_NodeDelete(p_playlist, p_item, true , false); playlist_NodeDelete(p_playlist, p_item, true , false);
PL_UNLOCK; PL_UNLOCK;
PlaylistRebuild(p_intf); p_sys->b_need_update = true;
break; break;
} }
case KEY_ENTER: case KEY_ENTER:
case '\r': case '\r':
case '\n': case '\n':
if (!p_sys->pp_plist[p_sys->i_box_plidx]) if (!(p_pl_item = p_sys->pp_plist[p_sys->i_box_plidx]))
{ return false;
b_ret = false;
break; if (p_pl_item->p_item->i_children)
} {
if (p_sys->pp_plist[p_sys->i_box_plidx]->p_item->i_children == -1) playlist_item_t *p_item, *p_parent = p_pl_item->p_item;
if (p_parent->i_children == -1)
{ {
playlist_item_t *p_item, *p_parent; p_item = p_parent;
p_item = p_parent = p_sys->pp_plist[p_sys->i_box_plidx]->p_item;
if (!p_parent)
p_parent = p_playlist->p_root_onelevel;
while (p_parent->p_parent) while (p_parent->p_parent)
p_parent = p_parent->p_parent; p_parent = p_parent->p_parent;
playlist_Control(p_playlist, PLAYLIST_VIEWPLAY, pl_Unlocked,
p_parent, p_item);
}
else if (!p_sys->pp_plist[p_sys->i_box_plidx]->p_item->i_children)
{ /* We only want to set the current node */
playlist_Stop(p_playlist);
p_sys->p_node = p_sys->pp_plist[p_sys->i_box_plidx]->p_item;
} }
else else
{ {
p_sys->p_node = p_sys->pp_plist[p_sys->i_box_plidx]->p_item; p_sys->p_node = p_parent;
playlist_Control(p_playlist, PLAYLIST_VIEWPLAY, pl_Unlocked, p_item = NULL;
p_sys->pp_plist[p_sys->i_box_plidx]->p_item, NULL);
} }
b_box_plidx_follow = true;
break; playlist_Control(p_playlist, PLAYLIST_VIEWPLAY, pl_Unlocked,
default: p_parent, p_item);
b_ret = false; }
break; else
{ /* We only want to set the current node */
playlist_Stop(p_playlist);
p_sys->p_node = p_pl_item->p_item;
} }
if (b_ret) b_box_plidx_follow = true;
{ break;
int i_max = p_sys->i_plist_entries;
if (p_sys->i_box_plidx >= i_max) p_sys->i_box_plidx = i_max - 1;
if (p_sys->i_box_plidx < 0) p_sys->i_box_plidx = 0;
PL_LOCK; default:
if (PlaylistIsPlaying(p_playlist, return false;
p_sys->pp_plist[p_sys->i_box_plidx]->p_item)) }
b_box_plidx_follow = true;
PL_UNLOCK; if (p_sys->i_box_plidx > p_sys->i_plist_entries - 1)
p_sys->b_box_plidx_follow = b_box_plidx_follow; p_sys->i_box_plidx = p_sys->i_plist_entries - 1;
if (p_sys->i_box_plidx < 0)
p_sys->i_box_plidx = 0;
p_pl_item = p_sys->pp_plist[p_sys->i_box_plidx];
PL_LOCK;
if (PlaylistIsPlaying(p_playlist, p_pl_item->p_item))
b_box_plidx_follow = true;
PL_UNLOCK;
p_sys->b_box_plidx_follow = b_box_plidx_follow;
return true;
}
static int HandleKey(intf_thread_t *p_intf)
{
intf_sys_t *p_sys = p_intf->p_sys;
playlist_t *p_playlist = pl_Get(p_intf);
int i_key = wgetch(p_sys->w);
if (i_key == -1)
return 0;
if (p_sys->i_box_type == BOX_PLAYLIST)
{
if (HandlePlaylistKey(p_intf, i_key))
return 1; return 1;
}
} }
else if (p_sys->i_box_type == BOX_BROWSE) else if (p_sys->i_box_type == BOX_BROWSE)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment