Commit f6ceb976 authored by Laurent Aimar's avatar Laurent Aimar

* ncurses: better playlist handling.

parent 80352ad1
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* ncurses.c : NCurses plugin for vlc * ncurses.c : NCurses plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001-2004 VideoLAN * Copyright (C) 2001-2004 VideoLAN
* $Id: ncurses.c,v 1.9 2004/01/10 23:31:33 sigmunau Exp $ * $Id: ncurses.c,v 1.10 2004/01/11 00:01:35 fenrir Exp $
* *
* Authors: Sam Hocevar <sam@zoy.org> * Authors: Sam Hocevar <sam@zoy.org>
* Laurent Aimar <fenrir@via.ecp.fr> * Laurent Aimar <fenrir@via.ecp.fr>
...@@ -100,6 +100,9 @@ struct intf_sys_t ...@@ -100,6 +100,9 @@ struct intf_sys_t
int i_box_lines_total; int i_box_lines_total;
int i_box_start; int i_box_start;
int i_box_plidx; /* Playlist index */
int b_box_plidx_follow;
int b_box_cleared; int b_box_cleared;
msg_subscription_t* p_sub; /* message bank subscription */ msg_subscription_t* p_sub; /* message bank subscription */
...@@ -116,6 +119,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -116,6 +119,7 @@ static int Open( vlc_object_t *p_this )
{ {
intf_thread_t *p_intf = (intf_thread_t *)p_this; intf_thread_t *p_intf = (intf_thread_t *)p_this;
intf_sys_t *p_sys; intf_sys_t *p_sys;
vlc_value_t val;
/* Allocate instance and initialize some members */ /* Allocate instance and initialize some members */
p_sys = p_intf->p_sys = malloc( sizeof( intf_sys_t ) ); p_sys = p_intf->p_sys = malloc( sizeof( intf_sys_t ) );
...@@ -127,7 +131,9 @@ static int Open( vlc_object_t *p_this ) ...@@ -127,7 +131,9 @@ static int Open( vlc_object_t *p_this )
p_sys->i_box_lines = 0; p_sys->i_box_lines = 0;
p_sys->i_box_start= 0; p_sys->i_box_start= 0;
p_sys->i_box_lines_total = 0; p_sys->i_box_lines_total = 0;
p_sys->b_box_plidx_follow = VLC_TRUE;
p_sys->b_box_cleared = VLC_FALSE; p_sys->b_box_cleared = VLC_FALSE;
p_sys->i_box_plidx = 0;
p_sys->p_sub = msg_Subscribe( p_intf ); p_sys->p_sub = msg_Subscribe( p_intf );
/* Initialize the curses library */ /* Initialize the curses library */
...@@ -148,6 +154,10 @@ static int Open( vlc_object_t *p_this ) ...@@ -148,6 +154,10 @@ static int Open( vlc_object_t *p_this )
/* exported function */ /* exported function */
p_intf->pf_run = Run; p_intf->pf_run = Run;
/* Set quiet mode */
val.i_int = -1;
var_Set( p_intf->p_vlc, "verbose", val );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -201,28 +211,36 @@ static void Run( intf_thread_t *p_intf ) ...@@ -201,28 +211,36 @@ static void Run( intf_thread_t *p_intf )
{ {
p_sys->p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); p_sys->p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
} }
if( p_sys->p_input == NULL ) if( p_sys->p_playlist )
{ {
if( p_sys->p_playlist ) vlc_mutex_lock( &p_sys->p_playlist->object_lock );
if( p_sys->p_input == NULL )
{ {
p_sys->p_input = vlc_object_find( p_sys->p_playlist, p_sys->p_input = p_sys->p_playlist->p_input;
VLC_OBJECT_INPUT,FIND_CHILD ); if( p_sys->p_input )
{
if( !p_sys->p_input->b_dead )
{
vlc_object_yield( p_sys->p_input );
}
}
} }
else else if( p_sys->p_input->b_dead )
{ {
p_sys->p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, vlc_object_release( p_sys->p_input );
FIND_ANYWHERE ); p_sys->p_input = NULL;
p_sys->f_slider = p_sys->f_slider_old = 0.0;
p_sys->b_box_cleared = VLC_FALSE;
} }
p_sys->b_box_cleared = VLC_FALSE; vlc_mutex_unlock( &p_sys->p_playlist->object_lock );
} }
else if( p_sys->p_input->b_dead )
if( p_sys->b_box_plidx_follow )
{ {
vlc_object_release( p_sys->p_input ); p_sys->i_box_plidx = p_sys->p_playlist->i_index;
p_sys->p_input = NULL;
p_sys->f_slider = p_sys->f_slider_old = 0.0;
p_sys->b_box_cleared = VLC_FALSE;
} }
while( ( i_key = getch()) != -1 ) while( ( i_key = getch()) != -1 )
{ {
/* /*
...@@ -261,6 +279,8 @@ static int HandleKey( intf_thread_t *p_intf, int i_key ) ...@@ -261,6 +279,8 @@ static int HandleKey( intf_thread_t *p_intf, int i_key )
if( p_sys->i_box_type == BOX_PLAYLIST && p_sys->p_playlist ) if( p_sys->i_box_type == BOX_PLAYLIST && p_sys->p_playlist )
{ {
int b_ret = VLC_TRUE;
switch( i_key ) switch( i_key )
{ {
/* Playlist sort */ /* Playlist sort */
...@@ -276,52 +296,55 @@ static int HandleKey( intf_thread_t *p_intf, int i_key ) ...@@ -276,52 +296,55 @@ static int HandleKey( intf_thread_t *p_intf, int i_key )
/* Playlist navigation */ /* Playlist navigation */
case KEY_HOME: case KEY_HOME:
playlist_Goto( p_sys->p_playlist, 0 ); p_sys->i_box_plidx = 0;
return 1; break;
case KEY_END: case KEY_END:
playlist_Goto( p_sys->p_playlist, p_sys->p_playlist->i_size - 1 ); p_sys->i_box_plidx = p_sys->p_playlist->i_size - 1;
return 1; break;
case KEY_UP: case KEY_UP:
playlist_Prev( p_sys->p_playlist ); p_sys->i_box_plidx--;
return 1; break;
case KEY_DOWN: case KEY_DOWN:
playlist_Next( p_sys->p_playlist ); p_sys->i_box_plidx++;
return 1; break;
case KEY_PPAGE: case KEY_PPAGE:
{ p_sys->i_box_plidx -= p_sys->i_box_lines;
int i_item = p_sys->p_playlist->i_index - p_sys->i_box_lines; break;
if( i_item < 0 ) i_item = 0;
playlist_Goto( p_sys->p_playlist, i_item );
return 1;
}
case KEY_NPAGE: case KEY_NPAGE:
{ p_sys->i_box_plidx += p_sys->i_box_lines;
int i_item = p_sys->p_playlist->i_index + p_sys->i_box_lines; break;
if( i_item >= p_sys->p_playlist->i_size ) i_item = p_sys->p_playlist->i_size - 1;
if( i_item > 0 )
{
playlist_Goto( p_sys->p_playlist, i_item );
}
return 1;
}
case KEY_BACKSPACE: case KEY_BACKSPACE:
playlist_Delete( p_sys->p_playlist, p_sys->p_playlist->i_index );
return 1;
case KEY_DC: case KEY_DC:
{ {
int i_item = p_sys->p_playlist->i_index; int i_item = p_sys->p_playlist->i_index;
playlist_Delete( p_sys->p_playlist, p_sys->p_playlist->i_index );
if( i_item < p_sys->p_playlist->i_size ) playlist_Delete( p_sys->p_playlist, p_sys->i_box_plidx );
if( i_item < p_sys->p_playlist->i_size && i_item != p_sys->p_playlist->i_index )
{ {
playlist_Goto( p_sys->p_playlist, i_item ); playlist_Goto( p_sys->p_playlist, i_item );
} }
return 1; break;
} }
case KEY_ENTER:
case 0x0d:
playlist_Goto( p_sys->p_playlist, p_sys->i_box_plidx );
break;
default: default:
b_ret = VLC_FALSE;
break; break;
} }
if( b_ret )
{
if( p_sys->i_box_plidx >= p_sys->p_playlist->i_size ) p_sys->i_box_plidx = p_sys->p_playlist->i_size - 1;
if( p_sys->i_box_plidx < 0 ) p_sys->i_box_plidx = 0;
if( p_sys->i_box_plidx == p_sys->p_playlist->i_index )
p_sys->b_box_plidx_follow = VLC_TRUE;
else
p_sys->b_box_plidx_follow = VLC_FALSE;
return 1;
}
} }
else if( p_sys->i_box_type == BOX_HELP || p_sys->i_box_type == BOX_INFO ) else if( p_sys->i_box_type == BOX_HELP || p_sys->i_box_type == BOX_INFO )
{ {
...@@ -873,14 +896,17 @@ static void Redraw ( intf_thread_t *p_intf, time_t *t_last_refresh ) ...@@ -873,14 +896,17 @@ static void Redraw ( intf_thread_t *p_intf, time_t *t_last_refresh )
int i_item; int i_item;
DrawBox( p_sys->w, y++, 0, h, COLS, " Playlist " ); DrawBox( p_sys->w, y++, 0, h, COLS, " Playlist " );
if( p_playlist->i_index < (h - 2)/2 ) if( p_sys->i_box_plidx >= p_playlist->i_size ) p_sys->i_box_plidx = p_playlist->i_size - 1;
if( p_sys->i_box_plidx < 0 ) p_sys->i_box_plidx = 0;
if( p_sys->i_box_plidx < (h - 2)/2 )
{ {
i_start = 0; i_start = 0;
i_stop = h - 2; i_stop = h - 2;
} }
else if( p_playlist->i_size - p_playlist->i_index > (h - 2)/2 ) else if( p_playlist->i_size - p_sys->i_box_plidx > (h - 2)/2 )
{ {
i_start = p_playlist->i_index - (h - 2)/2; i_start = p_sys->i_box_plidx - (h - 2)/2;
i_stop = i_start + h - 2; i_stop = i_start + h - 2;
} }
else else
...@@ -899,7 +925,9 @@ static void Redraw ( intf_thread_t *p_intf, time_t *t_last_refresh ) ...@@ -899,7 +925,9 @@ static void Redraw ( intf_thread_t *p_intf, time_t *t_last_refresh )
for( i_item = i_start; i_item < i_stop; i_item++ ) for( i_item = i_start; i_item < i_stop; i_item++ )
{ {
vlc_bool_t b_selected = ( p_playlist->i_index == i_item ); vlc_bool_t b_selected = ( p_sys->i_box_plidx == i_item );
int c = p_playlist->i_index == i_item ? '>' : ' ';
if( y >= y_end ) break; if( y >= y_end ) break;
if( b_selected ) if( b_selected )
{ {
...@@ -907,13 +935,15 @@ static void Redraw ( intf_thread_t *p_intf, time_t *t_last_refresh ) ...@@ -907,13 +935,15 @@ static void Redraw ( intf_thread_t *p_intf, time_t *t_last_refresh )
} }
if( !strcmp( p_playlist->pp_items[i_item]->psz_name, p_playlist->pp_items[i_item]->psz_uri ) ) if( !strcmp( p_playlist->pp_items[i_item]->psz_name, p_playlist->pp_items[i_item]->psz_uri ) )
{ {
mvnprintw( y++, 1, COLS - 2, " %d - '%s'", mvnprintw( y++, 1, COLS - 2, "%c %d - '%s'",
c,
i_item, i_item,
p_playlist->pp_items[i_item]->psz_uri ); p_playlist->pp_items[i_item]->psz_uri );
} }
else else
{ {
mvnprintw( y++, 1, COLS - 2, " %d - '%s' (%s)", mvnprintw( y++, 1, COLS - 2, "%c %d - '%s' (%s)",
c,
i_item, i_item,
p_playlist->pp_items[i_item]->psz_uri, p_playlist->pp_items[i_item]->psz_uri,
p_playlist->pp_items[i_item]->psz_name ); p_playlist->pp_items[i_item]->psz_name );
......
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