[vlc-devel] [PATCH 1/2] Add a 'Play and stop once' feature to the Qt interface
David Sferruzza
david.sferruzza at gmail.com
Tue Jul 15 10:08:26 CEST 2014
This is a patch for #10732
Work document: https://gist.github.com/dsferruzza/8e9079a329975f3579e9
---
modules/gui/qt4/input_manager.cpp | 12 ++++++++++++
modules/gui/qt4/input_manager.hpp | 2 ++
modules/gui/qt4/menus.cpp | 9 +++++++++
src/libvlc-module.c | 6 ++++++
src/playlist/thread.c | 7 +++++++
5 files changed, 36 insertions(+)
diff --git a/modules/gui/qt4/input_manager.cpp b/modules/gui/qt4/input_manager.cpp
index f72b3b3..d69233a 100644
--- a/modules/gui/qt4/input_manager.cpp
+++ b/modules/gui/qt4/input_manager.cpp
@@ -1097,6 +1097,7 @@ void MainInputManager::customEvent( QEvent *event )
void MainInputManager::stop()
{
playlist_Stop( THEPL );
+ var_SetBool( THEPL, "play-and-stop-once", false );
}
void MainInputManager::next()
@@ -1205,6 +1206,17 @@ bool MainInputManager::getPlayExitState()
return var_InheritBool( THEPL, "play-and-exit" );
}
+void MainInputManager::activatePlayStopOnce( bool b_exit )
+{
+ var_Create( THEPL, "play-and-stop-once", VLC_VAR_BOOL );
+ var_SetBool( THEPL, "play-and-stop-once", b_exit );
+}
+
+bool MainInputManager::getPlayStopOnceState()
+{
+ return var_InheritBool( THEPL, "play-and-stop-once" );
+}
+
bool MainInputManager::hasEmptyPlaylist()
{
playlist_Lock( THEPL );
diff --git a/modules/gui/qt4/input_manager.hpp b/modules/gui/qt4/input_manager.hpp
index dac3bc3..6932a77 100644
--- a/modules/gui/qt4/input_manager.hpp
+++ b/modules/gui/qt4/input_manager.hpp
@@ -268,6 +268,7 @@ public:
audio_output_t *getAout();
bool getPlayExitState();
+ bool getPlayStopOnceState();
bool hasEmptyPlaylist();
void requestVoutUpdate() { return im->UpdateVout(); }
@@ -298,6 +299,7 @@ public slots:
void prev();
void prevOrReset();
void activatePlayQuit( bool );
+ void activatePlayStopOnce( bool );
void loopRepeatLoopStatus();
diff --git a/modules/gui/qt4/menus.cpp b/modules/gui/qt4/menus.cpp
index a29333b..584cc6e 100644
--- a/modules/gui/qt4/menus.cpp
+++ b/modules/gui/qt4/menus.cpp
@@ -826,6 +826,15 @@ void VLCMenuBar::PopupMenuPlaylistEntries( QMenu *menu,
action->setEnabled( false );
action->setData( ACTION_DELETE_ON_REBUILD );
+ /* Stop after current track */
+ action = addMIMStaticEntry( p_intf, menu, qtr( "Stop &after current track" ),
+ "", SLOT( activatePlayStopOnce( bool ) ), true );
+ action->setCheckable( true );
+ action->setChecked( THEMIM->getPlayStopOnceState() );
+ if( !p_input )
+ action->setEnabled( false );
+ action->setData( ACTION_DELETE_ON_REBUILD );
+
/* Next / Previous */
bool bPlaylistEmpty = THEMIM->hasEmptyPlaylist();
action = addMIMStaticEntry( p_intf, menu, qtr( "Pre&vious" ),
diff --git a/src/libvlc-module.c b/src/libvlc-module.c
index f0ee030..429732e 100644
--- a/src/libvlc-module.c
+++ b/src/libvlc-module.c
@@ -1136,6 +1136,10 @@ static const char *const ppsz_prefres[] = {
#define PAS_LONGTEXT N_( \
"Stop the playlist after each played playlist item." )
+#define PASO_TEXT N_("Play and stop once")
+#define PASO_LONGTEXT N_( \
+ "Stop the playlist after the next played playlist item." )
+
#define PAE_TEXT N_("Play and exit")
#define PAE_LONGTEXT N_( \
"Exit if there are no more items in the playlist." )
@@ -2628,6 +2632,8 @@ vlc_module_begin ()
add_string( "bookmark10", NULL,
BOOKMARK10_TEXT, BOOKMARK_LONGTEXT, false )
+ add_bool( "play-and-stop-once", 0, PASO_TEXT, PASO_LONGTEXT, false )
+
#define HELP_TEXT \
N_("print help for VLC (can be combined with --advanced and " \
"--help-verbose)")
diff --git a/src/playlist/thread.c b/src/playlist/thread.c
index a6ecbdb..dedf3b0 100644
--- a/src/playlist/thread.c
+++ b/src/playlist/thread.c
@@ -359,6 +359,7 @@ static playlist_item_t *NextItem( playlist_t *p_playlist )
bool b_loop = var_GetBool( p_playlist, "loop" );
bool b_repeat = var_GetBool( p_playlist, "repeat" );
bool b_playstop = var_InheritBool( p_playlist, "play-and-stop" );
+ bool b_playstoponce = var_InheritBool( p_playlist, "play-and-stop-once" );
/* Repeat and play/stop */
if( b_repeat && get_current_status_item( p_playlist ) )
@@ -371,6 +372,12 @@ static playlist_item_t *NextItem( playlist_t *p_playlist )
msg_Dbg( p_playlist,"stopping (play and stop)" );
return NULL;
}
+ else if( b_playstoponce )
+ {
+ msg_Dbg( p_playlist, "stopping (play and stop once)" );
+ var_SetBool( p_playlist, "play-and-stop-once", false );
+ return NULL;
+ }
/* */
if( get_current_status_item( p_playlist ) )
--
1.9.1
More information about the vlc-devel
mailing list