]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/dialogs/playlist.cpp
Initial drag and drop support for Qt
[vlc] / modules / gui / qt4 / dialogs / playlist.cpp
index 4a0b57ee51bc42647b63c3d5e4fb55f07a17cb53..47457438aa1180ec2037aa8f54cd1d1359b9384d 100644 (file)
  ******************************************************************************/
 
 #include "dialogs/playlist.hpp"
-#include "util/qvlcframe.hpp"
+
 #include "qt4.hpp"
-#include "components/playlist/panels.hpp"
-#include "components/playlist/selector.hpp"
+#include "main_interface.hpp"
+#include "util/qvlcframe.hpp"
+#include "components/interface_widgets.hpp"
+#include "dialogs_provider.hpp"
+#include "menus.hpp"
+
+#include <QUrl>
 #include <QHBoxLayout>
 #include <QSignalMapper>
 #include <QMenu>
 #include <QAction>
 #include <QMenuBar>
-#include "dialogs_provider.hpp"
 
 PlaylistDialog *PlaylistDialog::instance = NULL;
 
@@ -41,26 +45,12 @@ PlaylistDialog::PlaylistDialog( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     setCentralWidget( main );
     setWindowTitle( qtr( "Playlist" ) );
 
-    SDMapper = new QSignalMapper();
-    connect( SDMapper, SIGNAL( mapped (QString)), this,
-             SLOT( SDMenuAction( QString ) ) );
     createPlMenuBar( menuBar(), p_intf );
 
-    selector = new PLSelector( centralWidget(), p_intf, THEPL );
-    selector->setMaximumWidth( 130 );
+    QHBoxLayout *l = new QHBoxLayout( centralWidget() );
+    PlaylistWidget *plw = new PlaylistWidget( p_intf );
+    l->addWidget( plw );
 
-    playlist_item_t *p_root = playlist_GetPreferredNode( THEPL,
-                                                THEPL->p_local_category );
-
-    rightPanel = qobject_cast<PLPanel *>(new StandardPLPanel( centralWidget(),
-                              p_intf, THEPL, p_root ) );
-    connect( selector, SIGNAL( activated( int ) ),
-             rightPanel, SLOT( setRoot( int ) ) );
-
-    QHBoxLayout *layout = new QHBoxLayout();
-    layout->addWidget( selector, 0 );
-    layout->addWidget( rightPanel, 10 );
-    centralWidget()->setLayout( layout );
     readSettings( "playlist", QSize( 600,700 ) );
 }
 
@@ -72,75 +62,45 @@ PlaylistDialog::~PlaylistDialog()
 void PlaylistDialog::createPlMenuBar( QMenuBar *bar, intf_thread_t *p_intf )
 {
     QMenu *manageMenu = new QMenu();
-    manageMenu->setTitle( qtr("Add") );
-
-    QMenu *subPlaylist = new QMenu();
-    subPlaylist->setTitle( qtr("Add to current playlist") );
-    subPlaylist->addAction( "&File...", THEDP,
-                           SLOT( simplePLAppendDialog() ) );
-    subPlaylist->addAction( "&Advanced add...", THEDP,
-                           SLOT( PLAppendDialog() ) );
-    manageMenu->addMenu( subPlaylist );
-    manageMenu->addSeparator();
-
-    QMenu *subML = new QMenu();
-    subML->setTitle( qtr("Add to Media library") );
-    subML->addAction( "&File...", THEDP,
-                           SLOT( simpleMLAppendDialog() ) );
-    subML->addAction( "Directory", THEDP, SLOT( openMLDirectory() ));
-    subML->addAction( "&Advanced add...", THEDP,
-                           SLOT( MLAppendDialog() ) );
-    manageMenu->addMenu( subML );
+    manageMenu->setTitle( qtr("Manage") );
     manageMenu->addAction( "Open playlist file", THEDP, SLOT( openPlaylist() ));
-
+    manageMenu->addSeparator();
+    manageMenu->addAction( "Dock playlist", this, SLOT( dock() ) );
     bar->addMenu( manageMenu );
-    bar->addMenu( SDMenu() );
+    bar->addMenu( QVLCMenu::SDMenu( p_intf ) );
 }
 
-QMenu *PlaylistDialog::SDMenu()
+void PlaylistDialog::dock()
 {
-    QMenu *menu = new QMenu();
-    menu->setTitle( qtr( "Additional sources" ) );
-    vlc_list_t *p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE,
-                                        FIND_ANYWHERE );
-    int i_num = 0;
-    for( int i_index = 0 ; i_index < p_list->i_count; i_index++ )
-    {
-        module_t * p_parser = (module_t *)p_list->p_values[i_index].p_object ;
-        if( !strcmp( p_parser->psz_capability, "services_discovery" ) )
-            i_num++;
-    }
-    for( int i_index = 0 ; i_index < p_list->i_count; i_index++ )
-    {
-        module_t * p_parser = (module_t *)p_list->p_values[i_index].p_object;
-        if( !strcmp( p_parser->psz_capability, "services_discovery" ) )
-        {
-            QAction *a = new QAction( qfu( p_parser->psz_longname ), menu );
-            a->setCheckable( true );
-            /* hack to handle submodules properly */
-            int i = -1;
-            while( p_parser->pp_shortcuts[++i] != NULL );
-            i--;
-            if( playlist_IsServicesDiscoveryLoaded( THEPL,
-                 i>=0?p_parser->pp_shortcuts[i] : p_parser->psz_object_name ) )
-            {
-                a->setChecked( true );
-            }
-            connect( a , SIGNAL( triggered() ), SDMapper, SLOT( map() ) );
-            SDMapper->setMapping( a, i>=0? p_parser->pp_shortcuts[i] :
-                                            p_parser->psz_object_name );
-            menu->addAction( a );
-        }
-    }
-    vlc_list_release( p_list );
-    return menu;
+    hide();
+    QEvent *event = new QEvent( (QEvent::Type)(PLDockEvent_Type) );
+    QApplication::postEvent( p_intf->p_sys->p_mi, event );
 }
 
-void PlaylistDialog::SDMenuAction( QString data )
+
+void PlaylistDialog::dropEvent(QDropEvent *event)
+{
+     const QMimeData *mimeData = event->mimeData();
+     foreach( QUrl url, mimeData->urls() ) {
+        QString s = url.toString();
+        if( s.length() > 0 ) {
+            playlist_PlaylistAdd( THEPL, qtu(s), NULL,
+                                  PLAYLIST_APPEND, PLAYLIST_END );
+        }
+     }
+     event->acceptProposedAction();
+}
+void PlaylistDialog::dragEnterEvent(QDragEnterEvent *event)
 {
-    char *psz_sd = data.toUtf8().data();
-    if( !playlist_IsServicesDiscoveryLoaded( THEPL, psz_sd ) )
-        playlist_ServicesDiscoveryAdd( THEPL, psz_sd );
-    else
-        playlist_ServicesDiscoveryRemove( THEPL, psz_sd );
+     event->acceptProposedAction();
 }
+void PlaylistDialog::dragMoveEvent(QDragMoveEvent *event)
+{
+     event->acceptProposedAction();
+}
+void PlaylistDialog::dragLeaveEvent(QDragLeaveEvent *event)
+{
+     event->accept();
+}
+
+