dialogs_provider.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:20k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * dialogs_provider.cpp : Dialog Provider
  3.  *****************************************************************************
  4.  * Copyright (C) 2006-2009 the VideoLAN team
  5.  * $Id: 89cd76ca1e523e0a931057ffebebf0f8e5160d65 $
  6.  *
  7.  * Authors: Clément Stenac <zorglub@videolan.org>
  8.  *          Jean-Baptiste Kempf <jb@videolan.org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #ifdef HAVE_CONFIG_H
  25. # include "config.h"
  26. #endif
  27. #include <vlc_intf_strings.h>
  28. #include "qt4.hpp"
  29. #include "dialogs_provider.hpp"
  30. #include "input_manager.hpp" /* Load Subtitles */
  31. #include "menus.hpp"
  32. #include "recents.hpp"
  33. #include "util/qt_dirs.hpp"
  34. /* The dialogs */
  35. #include "dialogs/playlist.hpp"
  36. #include "dialogs/bookmarks.hpp"
  37. #include "dialogs/preferences.hpp"
  38. #include "dialogs/mediainfo.hpp"
  39. #include "dialogs/messages.hpp"
  40. #include "dialogs/extended.hpp"
  41. #include "dialogs/vlm.hpp"
  42. #include "dialogs/sout.hpp"
  43. #include "dialogs/convert.hpp"
  44. #include "dialogs/open.hpp"
  45. #include "dialogs/openurl.hpp"
  46. #include "dialogs/help.hpp"
  47. #include "dialogs/gototime.hpp"
  48. #include "dialogs/podcast_configuration.hpp"
  49. #include "dialogs/toolbar.hpp"
  50. #include "dialogs/plugins.hpp"
  51. #include "dialogs/external.hpp"
  52. #include <QEvent>
  53. #include <QApplication>
  54. #include <QSignalMapper>
  55. #include <QFileDialog>
  56. DialogsProvider* DialogsProvider::instance = NULL;
  57. DialogsProvider::DialogsProvider( intf_thread_t *_p_intf ) :
  58.                                   QObject( NULL ), p_intf( _p_intf )
  59. {
  60.     b_isDying = false;
  61.     /* Various signal mappers for the menus */
  62.     menusMapper = new QSignalMapper();
  63.     CONNECT( menusMapper, mapped(QObject *), this, menuAction( QObject *) );
  64.     menusUpdateMapper = new QSignalMapper();
  65.     CONNECT( menusUpdateMapper, mapped(QObject *),
  66.              this, menuUpdateAction( QObject *) );
  67.     SDMapper = new QSignalMapper();
  68.     CONNECT( SDMapper, mapped (QString), this, SDMenuAction( QString ) );
  69.     DialogHandler *dialogHandler = new DialogHandler (p_intf, this );
  70. }
  71. DialogsProvider::~DialogsProvider()
  72. {
  73.     PlaylistDialog::killInstance();
  74.     MediaInfoDialog::killInstance();
  75.     MessagesDialog::killInstance();
  76.     ExtendedDialog::killInstance();
  77.     BookmarksDialog::killInstance();
  78.     HelpDialog::killInstance();
  79. #ifdef UPDATE_CHECK
  80.     UpdateDialog::killInstance();
  81. #endif
  82.     delete menusMapper;
  83.     delete menusUpdateMapper;
  84.     delete SDMapper;
  85. }
  86. void DialogsProvider::quit()
  87. {
  88.     b_isDying = true;
  89.     libvlc_Quit( p_intf->p_libvlc );
  90. }
  91. void DialogsProvider::customEvent( QEvent *event )
  92. {
  93.     if( event->type() == (int)DialogEvent_Type )
  94.     {
  95.         DialogEvent *de = static_cast<DialogEvent*>(event);
  96.         switch( de->i_dialog )
  97.         {
  98.         case INTF_DIALOG_FILE_SIMPLE:
  99.         case INTF_DIALOG_FILE:
  100.             openDialog(); break;
  101.         case INTF_DIALOG_FILE_GENERIC:
  102.             openFileGenericDialog( de->p_arg ); break;
  103.         case INTF_DIALOG_DISC:
  104.             openDiscDialog(); break;
  105.         case INTF_DIALOG_NET:
  106.             openNetDialog(); break;
  107.         case INTF_DIALOG_SAT:
  108.         case INTF_DIALOG_CAPTURE:
  109.             openCaptureDialog(); break;
  110.         case INTF_DIALOG_DIRECTORY:
  111.             PLAppendDir(); break;
  112.         case INTF_DIALOG_PLAYLIST:
  113.             playlistDialog(); break;
  114.         case INTF_DIALOG_MESSAGES:
  115.             messagesDialog(); break;
  116.         case INTF_DIALOG_FILEINFO:
  117.            mediaInfoDialog(); break;
  118.         case INTF_DIALOG_PREFS:
  119.            prefsDialog(); break;
  120.         case INTF_DIALOG_BOOKMARKS:
  121.            bookmarksDialog(); break;
  122.         case INTF_DIALOG_EXTENDED:
  123.            extendedDialog(); break;
  124. #ifdef ENABLE_VLM
  125.         case INTF_DIALOG_VLM:
  126.            vlmDialog(); break;
  127. #endif
  128.         case INTF_DIALOG_POPUPMENU:
  129.            QVLCMenu::PopupMenu( p_intf, (de->i_arg != 0) ); break;
  130.         case INTF_DIALOG_AUDIOPOPUPMENU:
  131.            QVLCMenu::AudioPopupMenu( p_intf ); break;
  132.         case INTF_DIALOG_VIDEOPOPUPMENU:
  133.            QVLCMenu::VideoPopupMenu( p_intf ); break;
  134.         case INTF_DIALOG_MISCPOPUPMENU:
  135.            QVLCMenu::MiscPopupMenu( p_intf ); break;
  136.         case INTF_DIALOG_WIZARD:
  137.         case INTF_DIALOG_STREAMWIZARD:
  138.             openAndStreamingDialogs(); break;
  139. #ifdef UPDATE_CHECK
  140.         case INTF_DIALOG_UPDATEVLC:
  141.             updateDialog(); break;
  142. #endif
  143.         case INTF_DIALOG_EXIT:
  144.             quit(); break;
  145.         default:
  146.            msg_Warn( p_intf, "unimplemented dialog" );
  147.         }
  148.     }
  149. }
  150. /****************************************************************************
  151.  * Individual simple dialogs
  152.  ****************************************************************************/
  153. void DialogsProvider::playlistDialog()
  154. {
  155.     PlaylistDialog::getInstance( p_intf )->toggleVisible();
  156. }
  157. void DialogsProvider::prefsDialog()
  158. {
  159.     PrefsDialog *p = new PrefsDialog( (QWidget *)p_intf->p_sys->p_mi, p_intf );
  160.     p->toggleVisible();
  161. }
  162. void DialogsProvider::extendedDialog()
  163. {
  164.     if( !ExtendedDialog::getInstance( p_intf )->isVisible() || /* Hidden */
  165.         ExtendedDialog::getInstance( p_intf )->currentTab() != 0 )  /* wrong tab */
  166.         ExtendedDialog::getInstance( p_intf )->showTab( 0 );
  167.     else
  168.         ExtendedDialog::getInstance( p_intf )->hide();
  169. }
  170. void DialogsProvider::synchroDialog()
  171. {
  172.     if( !ExtendedDialog::getInstance( p_intf )->isVisible() || /* Hidden */
  173.         ExtendedDialog::getInstance( p_intf )->currentTab() != 2 )  /* wrong tab */
  174.         ExtendedDialog::getInstance( p_intf )->showTab( 2 );
  175.     else
  176.         ExtendedDialog::getInstance( p_intf )->hide();
  177. }
  178. void DialogsProvider::messagesDialog()
  179. {
  180.     MessagesDialog::getInstance( p_intf )->toggleVisible();
  181. }
  182. void DialogsProvider::gotoTimeDialog()
  183. {
  184.     GotoTimeDialog::getInstance( p_intf )->toggleVisible();
  185. }
  186. #ifdef ENABLE_VLM
  187. void DialogsProvider::vlmDialog()
  188. {
  189.     VLMDialog::getInstance( p_intf )->toggleVisible();
  190. }
  191. #endif
  192. void DialogsProvider::helpDialog()
  193. {
  194.     HelpDialog::getInstance( p_intf )->toggleVisible();
  195. }
  196. #ifdef UPDATE_CHECK
  197. void DialogsProvider::updateDialog()
  198. {
  199.     UpdateDialog::getInstance( p_intf )->toggleVisible();
  200. }
  201. #endif
  202. void DialogsProvider::aboutDialog()
  203. {
  204.     AboutDialog::getInstance( p_intf )->toggleVisible();
  205. }
  206. void DialogsProvider::mediaInfoDialog()
  207. {
  208.     MediaInfoDialog::getInstance( p_intf )->showTab( 0 );
  209. }
  210. void DialogsProvider::mediaCodecDialog()
  211. {
  212.     MediaInfoDialog::getInstance( p_intf )->showTab( 2 );
  213. }
  214. void DialogsProvider::bookmarksDialog()
  215. {
  216.     BookmarksDialog::getInstance( p_intf )->toggleVisible();
  217. }
  218. void DialogsProvider::podcastConfigureDialog()
  219. {
  220.     PodcastConfigDialog::getInstance( p_intf )->toggleVisible();
  221. }
  222. void DialogsProvider::toolbarDialog()
  223. {
  224.     ToolbarEditDialog *toolbarEditor = new ToolbarEditDialog( (QWidget *)p_intf->p_sys->p_mi, p_intf );
  225.     if( toolbarEditor->exec() == QDialog::Accepted )
  226.         emit toolBarConfUpdated();
  227. }
  228. void DialogsProvider::pluginDialog()
  229. {
  230.     PluginDialog::getInstance( p_intf )->toggleVisible();
  231. }
  232. /* Generic open file */
  233. void DialogsProvider::openFileGenericDialog( intf_dialog_args_t *p_arg )
  234. {
  235.     if( p_arg == NULL )
  236.     {
  237.         msg_Warn( p_intf, "openFileGenericDialog() called with NULL arg" );
  238.         return;
  239.     }
  240.     /* Replace the extensions to a Qt format */
  241.     int i = 0;
  242.     QString extensions = qfu( p_arg->psz_extensions );
  243.     while ( ( i = extensions.indexOf( "|", i ) ) != -1 )
  244.     {
  245.         if( ( extensions.count( "|" ) % 2 ) == 0 )
  246.             extensions.replace( i, 1, ");;" );
  247.         else
  248.             extensions.replace( i, 1, "(" );
  249.     }
  250.     extensions.replace(QString(";*"), QString(" *"));
  251.     extensions.append( ")" );
  252.     /* Save */
  253.     if( p_arg->b_save )
  254.     {
  255.         QString file = QFileDialog::getSaveFileName( NULL, p_arg->psz_title,
  256.                                         p_intf->p_sys->filepath, extensions );
  257.         if( !file.isEmpty() )
  258.         {
  259.             p_arg->i_results = 1;
  260.             p_arg->psz_results = (char **)malloc( p_arg->i_results * sizeof( char * ) );
  261.             p_arg->psz_results[0] = strdup( qtu( toNativeSepNoSlash( file ) ) );
  262.         }
  263.         else
  264.             p_arg->i_results = 0;
  265.     }
  266.     else /* non-save mode */
  267.     {
  268.         QStringList files = QFileDialog::getOpenFileNames( NULL,
  269.                 p_arg->psz_title, p_intf->p_sys->filepath,
  270.                 extensions );
  271.         p_arg->i_results = files.count();
  272.         p_arg->psz_results = (char **)malloc( p_arg->i_results * sizeof( char * ) );
  273.         i = 0;
  274.         foreach( const QString &file, files )
  275.             p_arg->psz_results[i++] = strdup( qtu( toNativeSepNoSlash( file ) ) );
  276.         p_intf->p_sys->filepath = qfu( p_arg->psz_results[i] );
  277.     }
  278.     /* Callback */
  279.     if( p_arg->pf_callback )
  280.         p_arg->pf_callback( p_arg );
  281.     /* Clean afterwards */
  282.     if( p_arg->psz_results )
  283.     {
  284.         for( i = 0; i < p_arg->i_results; i++ )
  285.             free( p_arg->psz_results[i] );
  286.         free( p_arg->psz_results );
  287.     }
  288.     free( p_arg->psz_title );
  289.     free( p_arg->psz_extensions );
  290.     free( p_arg );
  291. }
  292. /****************************************************************************
  293.  * All the open/add stuff
  294.  * Open Dialog first - Simple Open then
  295.  ****************************************************************************/
  296. void DialogsProvider::openDialog( int i_tab )
  297. {
  298.     OpenDialog::getInstance( p_intf->p_sys->p_mi , p_intf )->showTab( i_tab );
  299. }
  300. void DialogsProvider::openDialog()
  301. {
  302.     openDialog( OPEN_FILE_TAB );
  303. }
  304. void DialogsProvider::openFileDialog()
  305. {
  306.     openDialog( OPEN_FILE_TAB );
  307. }
  308. void DialogsProvider::openDiscDialog()
  309. {
  310.     openDialog( OPEN_DISC_TAB );
  311. }
  312. void DialogsProvider::openNetDialog()
  313. {
  314.     openDialog( OPEN_NETWORK_TAB );
  315. }
  316. void DialogsProvider::openCaptureDialog()
  317. {
  318.     openDialog( OPEN_CAPTURE_TAB );
  319. }
  320. /* Same as the open one, but force the enqueue */
  321. void DialogsProvider::PLAppendDialog()
  322. {
  323.     OpenDialog::getInstance( p_intf->p_sys->p_mi, p_intf, false,
  324.                              OPEN_AND_ENQUEUE )->showTab( OPEN_FILE_TAB );
  325. }
  326. void DialogsProvider::MLAppendDialog()
  327. {
  328.     OpenDialog::getInstance( p_intf->p_sys->p_mi, p_intf, false,
  329.                             OPEN_AND_ENQUEUE, false, false )
  330.                                     ->showTab( OPEN_FILE_TAB );
  331. }
  332. /**
  333.  * Simple open
  334.  ***/
  335. QStringList DialogsProvider::showSimpleOpen( QString help,
  336.                                              int filters,
  337.                                              QString path )
  338. {
  339.     QString fileTypes = "";
  340.     if( filters & EXT_FILTER_MEDIA ) {
  341.         ADD_FILTER_MEDIA( fileTypes );
  342.     }
  343.     if( filters & EXT_FILTER_VIDEO ) {
  344.         ADD_FILTER_VIDEO( fileTypes );
  345.     }
  346.     if( filters & EXT_FILTER_AUDIO ) {
  347.         ADD_FILTER_AUDIO( fileTypes );
  348.     }
  349.     if( filters & EXT_FILTER_PLAYLIST ) {
  350.         ADD_FILTER_PLAYLIST( fileTypes );
  351.     }
  352.     if( filters & EXT_FILTER_SUBTITLE ) {
  353.         ADD_FILTER_SUBTITLE( fileTypes );
  354.     }
  355.     ADD_FILTER_ALL( fileTypes );
  356.     fileTypes.replace(QString(";*"), QString(" *"));
  357.     QStringList files = QFileDialog::getOpenFileNames( NULL,
  358.         help.isEmpty() ? qtr(I_OP_SEL_FILES ) : help,
  359.         path.isEmpty() ? p_intf->p_sys->filepath : path,
  360.         fileTypes );
  361.     if( !files.isEmpty() ) savedirpathFromFile( files.last() );
  362.     return files;
  363. }
  364. /**
  365.  * Open a file,
  366.  * pl helps you to choose from playlist or media library,
  367.  * go to start or enqueue
  368.  **/
  369. void DialogsProvider::addFromSimple( bool pl, bool go)
  370. {
  371.     QStringList files = DialogsProvider::showSimpleOpen();
  372.     int i = 0;
  373.     files.sort();
  374.     foreach( const QString &file, files )
  375.     {
  376.         playlist_Add( THEPL, qtu( toNativeSeparators( file ) ), NULL,
  377.                       go ? ( PLAYLIST_APPEND | ( i ? 0 : PLAYLIST_GO ) |
  378.                                                ( i ? PLAYLIST_PREPARSE : 0 ) )
  379.                          : ( PLAYLIST_APPEND | PLAYLIST_PREPARSE ),
  380.                       PLAYLIST_END,
  381.                       pl ? true : false, false );
  382.         RecentsMRL::getInstance( p_intf )->addRecent(
  383.                 toNativeSeparators( file ) );
  384.         i++;
  385.     }
  386. }
  387. void DialogsProvider::simpleOpenDialog()
  388. {
  389.     addFromSimple( true, true ); /* Playlist and Go */
  390. }
  391. void DialogsProvider::simplePLAppendDialog()
  392. {
  393.     addFromSimple( true, false );
  394. }
  395. void DialogsProvider::simpleMLAppendDialog()
  396. {
  397.     addFromSimple( false, false );
  398. }
  399. /* Url & Clipboard */
  400. /**
  401.  * Open a MRL.
  402.  * If the clipboard contains URLs, the first is automatically 'preselected'.
  403.  **/
  404. void DialogsProvider::openUrlDialog()
  405. {
  406.     OpenUrlDialog *oud = OpenUrlDialog::getInstance( p_intf->p_sys->p_mi,
  407.                                                      p_intf );
  408.     if( oud->exec() == QDialog::Accepted )
  409.     {
  410.         QString url = oud->url();
  411.         if( !url.isEmpty() )
  412.         {
  413.             playlist_Add( THEPL, qtu( url ),
  414.                           NULL, !oud->shouldEnqueue() ?
  415.                                   ( PLAYLIST_APPEND | PLAYLIST_GO )
  416.                                 : ( PLAYLIST_APPEND | PLAYLIST_PREPARSE ),
  417.                           PLAYLIST_END, true, false );
  418.             RecentsMRL::getInstance( p_intf )->addRecent( url );
  419.         }
  420.     }
  421. }
  422. /* Directory */
  423. /**
  424.  * Open a directory,
  425.  * pl helps you to choose from playlist or media library,
  426.  * go to start or enqueue
  427.  **/
  428. static void openDirectory( intf_thread_t *p_intf, bool pl, bool go )
  429. {
  430.     QString dir = QFileDialog::getExistingDirectory( NULL, qtr("Open Directory"), p_intf->p_sys->filepath );
  431.     if (!dir.isEmpty() )
  432.     {
  433.         QString mrl = (dir.endsWith( "VIDEO_TS", Qt::CaseInsensitive ) ?
  434.                        "dvd://" : "directory://")
  435.                     + toNativeSeparators( dir );
  436.         input_item_t *p_input = input_item_New( THEPL, qtu( mrl ), NULL );
  437.         /* FIXME: playlist_AddInput() can fail */
  438.         playlist_AddInput( THEPL, p_input,
  439.                        go ? ( PLAYLIST_APPEND | PLAYLIST_GO ) : PLAYLIST_APPEND,
  440.                        PLAYLIST_END, pl, pl_Unlocked );
  441.         RecentsMRL::getInstance( p_intf )->addRecent( mrl );
  442.         if( !go )
  443.             input_Read( THEPL, p_input, true );
  444.         vlc_gc_decref( p_input );
  445.     }
  446. }
  447. void DialogsProvider::PLOpenDir()
  448. {
  449.     openDirectory( p_intf, true, true );
  450. }
  451. void DialogsProvider::PLAppendDir()
  452. {
  453.     openDirectory( p_intf, true, false );
  454. }
  455. void DialogsProvider::MLAppendDir()
  456. {
  457.     openDirectory( p_intf, false , false );
  458. }
  459. /****************
  460.  * Playlist     *
  461.  ****************/
  462. void DialogsProvider::openAPlaylist()
  463. {
  464.     QStringList files = showSimpleOpen( qtr( "Open playlist..." ),
  465.                                         EXT_FILTER_PLAYLIST );
  466.     foreach( const QString &file, files )
  467.     {
  468.         playlist_Import( THEPL, qtu( toNativeSeparators( file ) ) );
  469.     }
  470. }
  471. void DialogsProvider::saveAPlaylist()
  472. {
  473.     static const struct
  474.     {
  475.         char filter[24];
  476.         char module[12];
  477.     } types[] = {
  478.         { N_("XSPF playlist (*.xspf)"), "export-xspf", },
  479.         { N_("M3U playlist (*.m3u)"), "export-m3u", },
  480.         { N_("HTML playlist (*.html)"), "export-html", },
  481.     };
  482.     QString filters, selected;
  483.     for( size_t i = 0; i < sizeof (types) / sizeof (types[0]); i++ )
  484.     {
  485.         if( !filters.isEmpty() )
  486.             filters += ";;";
  487.         filters += qfu( vlc_gettext( types[i].filter ) );
  488.     }
  489.     QString file = QFileDialog::getSaveFileName( NULL,
  490.                                   qtr( "Save playlist as..." ),
  491.                                   p_intf->p_sys->filepath, filters, &selected );
  492.     if( file.isEmpty() )
  493.         return;
  494.     for( size_t i = 0; i < sizeof (types) / sizeof (types[0]); i++)
  495.         if( selected == qfu( vlc_gettext( types[i].filter ) ) )
  496.         {
  497.             playlist_Export( THEPL, qtu( toNativeSeparators( file ) ),
  498.                              THEPL->p_local_category, types[i].module );
  499.             break;
  500.         }
  501. }
  502. /****************************************************************************
  503.  * Sout emulation
  504.  ****************************************************************************/
  505. void DialogsProvider::streamingDialog( QWidget *parent,
  506.                                        QString mrl,
  507.                                        bool b_transcode_only,
  508.                                        QStringList options )
  509. {
  510.     QString soutoption;
  511.     /* Stream */
  512.     if( !b_transcode_only )
  513.     {
  514.         SoutDialog *s = new SoutDialog( parent, p_intf, mrl );
  515.         if( s->exec() == QDialog::Accepted )
  516.         {
  517.             soutoption = s->getMrl();
  518.             delete s;
  519.         }
  520.         else
  521.         {
  522.             delete s; return;
  523.         }
  524.     } else {
  525.     /* Convert */
  526.         ConvertDialog *s = new ConvertDialog( parent, p_intf, mrl );
  527.         if( s->exec() == QDialog::Accepted )
  528.         {
  529.             soutoption = s->getMrl();
  530.             delete s;
  531.         }
  532.         else
  533.         {
  534.             delete s; return;
  535.         }
  536.     }
  537.     /* Get SoutMRL */
  538.     if( !soutoption.isEmpty() )
  539.     {
  540.         options += soutoption.split( " :");
  541.         /* Create Input */
  542.         input_item_t *p_input;
  543.         p_input = input_item_New( p_intf, qtu( mrl ), _("Streaming") );
  544.         /* Add normal Options */
  545.         for( int j = 0; j < options.size(); j++ )
  546.         {
  547.             QString qs = colon_unescape( options[j] );
  548.             if( !qs.isEmpty() )
  549.             {
  550.                 input_item_AddOption( p_input, qtu( qs ),
  551.                         VLC_INPUT_OPTION_TRUSTED );
  552.                 msg_Dbg( p_intf, "Adding option: %s", qtu( qs ) );
  553.             }
  554.         }
  555.         /* Switch between enqueuing and starting the item */
  556.         /* FIXME: playlist_AddInput() can fail */
  557.         playlist_AddInput( THEPL, p_input,
  558.                 PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END, true, pl_Unlocked );
  559.         vlc_gc_decref( p_input );
  560.         RecentsMRL::getInstance( p_intf )->addRecent( mrl );
  561.     }
  562. }
  563. void DialogsProvider::openAndStreamingDialogs()
  564. {
  565.     OpenDialog::getInstance( p_intf->p_sys->p_mi, p_intf, false, OPEN_AND_STREAM )
  566.                                 ->showTab( OPEN_FILE_TAB );
  567. }
  568. void DialogsProvider::openAndTranscodingDialogs()
  569. {
  570.     OpenDialog::getInstance( p_intf->p_sys->p_mi , p_intf, false, OPEN_AND_SAVE )
  571.                                 ->showTab( OPEN_FILE_TAB );
  572. }
  573. void DialogsProvider::loadSubtitlesFile()
  574. {
  575.     input_thread_t *p_input = THEMIM->getInput();
  576.     if( !p_input ) return;
  577.     input_item_t *p_item = input_GetItem( p_input );
  578.     if( !p_item ) return;
  579.     char *path = input_item_GetURI( p_item );
  580.     if( !path ) path = strdup( "" );
  581.     char *sep = strrchr( path, DIR_SEP_CHAR );
  582.     if( sep ) *sep = '';
  583.     QStringList qsl = showSimpleOpen( qtr( "Open subtitles..." ),
  584.                                       EXT_FILTER_SUBTITLE,
  585.                                       qfu( path ) );
  586.     free( path );
  587.     foreach( const QString &qsFile, qsl )
  588.     {
  589.         if( input_AddSubtitle( p_input, qtu( toNativeSeparators( qsFile ) ),
  590.                     true ) )
  591.             msg_Warn( p_intf, "unable to load subtitles from '%s'",
  592.                       qtu( qsFile ) );
  593.     }
  594. }
  595. /****************************************************************************
  596.  * Menus
  597.  ****************************************************************************/
  598. void DialogsProvider::menuAction( QObject *data )
  599. {
  600.     QVLCMenu::DoAction( data );
  601. }
  602. void DialogsProvider::menuUpdateAction( QObject *data )
  603. {
  604.     MenuFunc *func = qobject_cast<MenuFunc *>(data);
  605.     assert( func );
  606.     func->doFunc( p_intf );
  607. }
  608. void DialogsProvider::SDMenuAction( QString data )
  609. {
  610.     char *psz_sd = strdup( qtu( data ) );
  611.     if( !playlist_IsServicesDiscoveryLoaded( THEPL, psz_sd ) )
  612.         playlist_ServicesDiscoveryAdd( THEPL, psz_sd );
  613.     else
  614.         playlist_ServicesDiscoveryRemove( THEPL, psz_sd );
  615.     free( psz_sd );
  616. }
  617. /**
  618.  * Play the MRL contained in the Recently played menu.
  619.  **/
  620. void DialogsProvider::playMRL( const QString &mrl )
  621. {
  622.     playlist_Add( THEPL, qtu( mrl ) , NULL,
  623.            PLAYLIST_APPEND | PLAYLIST_GO , PLAYLIST_END, true, false );
  624.     RecentsMRL::getInstance( p_intf )->addRecent( mrl );
  625. }