Commit 1c6b27d3 authored by Jean-Philippe Andre's avatar Jean-Philippe Andre

Qt: add a new "Open URL" dialog

Triggered by Ctrl+V, it automatically selects the clipboard content
parent 9b6f20a1
...@@ -33,6 +33,7 @@ nodist_SOURCES_qt4 = \ ...@@ -33,6 +33,7 @@ nodist_SOURCES_qt4 = \
dialogs/gototime.moc.cpp \ dialogs/gototime.moc.cpp \
dialogs/toolbar.moc.cpp \ dialogs/toolbar.moc.cpp \
dialogs/open.moc.cpp \ dialogs/open.moc.cpp \
dialogs/openurl.moc.cpp \
dialogs/podcast_configuration.moc.cpp \ dialogs/podcast_configuration.moc.cpp \
dialogs/vlm.moc.cpp \ dialogs/vlm.moc.cpp \
components/extended_panels.moc.cpp \ components/extended_panels.moc.cpp \
...@@ -199,6 +200,7 @@ SOURCES_qt4 = qt4.cpp \ ...@@ -199,6 +200,7 @@ SOURCES_qt4 = qt4.cpp \
dialogs/gototime.cpp \ dialogs/gototime.cpp \
dialogs/toolbar.cpp \ dialogs/toolbar.cpp \
dialogs/open.cpp \ dialogs/open.cpp \
dialogs/openurl.cpp \
dialogs/vlm.cpp \ dialogs/vlm.cpp \
dialogs/podcast_configuration.cpp \ dialogs/podcast_configuration.cpp \
components/extended_panels.cpp \ components/extended_panels.cpp \
...@@ -241,6 +243,7 @@ noinst_HEADERS = \ ...@@ -241,6 +243,7 @@ noinst_HEADERS = \
dialogs/gototime.hpp \ dialogs/gototime.hpp \
dialogs/toolbar.hpp \ dialogs/toolbar.hpp \
dialogs/open.hpp \ dialogs/open.hpp \
dialogs/openurl.hpp \
dialogs/vlm.hpp \ dialogs/vlm.hpp \
dialogs/podcast_configuration.hpp \ dialogs/podcast_configuration.hpp \
components/extended_panels.hpp \ components/extended_panels.hpp \
......
/*****************************************************************************
* openurl.cpp: Open a MRL or clipboard content
*****************************************************************************
* Copyright © 2009 the VideoLAN team
* $Id$
*
* Authors: Jean-Philippe André <jpeg@videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "dialogs/openurl.hpp"
#include "util/customwidgets.hpp"
#include <QPushButton>
#include <QDialogButtonBox>
#include <QApplication>
#include <QClipboard>
#include <QMimeData>
#include <QList>
#include <QUrl>
#include <QFile>
#include <QLabel>
OpenUrlDialog *OpenUrlDialog::instance = NULL;
OpenUrlDialog* OpenUrlDialog::getInstance( QWidget *parent,
intf_thread_t *p_intf,
bool bClipboard )
{
/* Creation */
if( !instance )
instance = new OpenUrlDialog( parent, p_intf, bClipboard );
else
instance->bClipboard = bClipboard;
return instance;
}
OpenUrlDialog::OpenUrlDialog( QWidget *parent,
intf_thread_t *_p_intf,
bool bClipboard ) : QVLCDialog( parent, _p_intf )
{
this->bClipboard = bClipboard;
this->setWindowTitle( qtr( "Open URL" ) );
/* Buttons */
QPushButton *but;
QDialogButtonBox *box = new QDialogButtonBox( this );
but = box->addButton( QDialogButtonBox::Ok );
CONNECT( but, clicked(), this, play() );
but = box->addButton( QDialogButtonBox::Cancel );
but = box->addButton( qtr( "&Enqueue" ), QDialogButtonBox::AcceptRole );
CONNECT( but, clicked(), this, enqueue() );
CONNECT( box, rejected(), this, reject() );
/* Info label and line edit */
edit = new ClickLineEdit( qtr( "Enter URL here..." ), this );
QLabel *info = new QLabel( qtr( "Please enter the URL or path "
"to the media you want to play"),
this );
this->setToolTip( qtr( "If your clipboard contains a valid URL\n"
"or the path to a file on your computer,\n"
"it will be automatically selected." ) );
/* Layout */
QVBoxLayout *vlay = new QVBoxLayout( this );
vlay->addWidget( info );
vlay->addWidget( edit );
vlay->addWidget( box );
}
void OpenUrlDialog::enqueue()
{
bShouldEnqueue = true;
lastUrl = edit->text();
accept();
}
void OpenUrlDialog::play()
{
lastUrl = edit->text();
accept();
}
QString OpenUrlDialog::url() const
{
return lastUrl;
}
bool OpenUrlDialog::shouldEnqueue() const
{
return bShouldEnqueue;
}
/** Show Event:
* When the dialog is shown, try to extract an URL from the clipboard
* and paste it in the Edit box.
* showEvent can happen not only on exec() but I think it's cool to
* actualize the URL on showEvent (eg. change virtual desktop...)
**/
void OpenUrlDialog::showEvent( QShowEvent *ev )
{
(void) ev;
bShouldEnqueue = false;
edit->setFocus( Qt::OtherFocusReason );
if( !lastUrl.isEmpty() && edit->text().isEmpty() )
{
/* The text should not have been changed, excepted if the user
has clicked Cancel before */
edit->setText( lastUrl );
}
else
edit->clear();
if( bClipboard )
{
QClipboard *clipboard = QApplication::clipboard();
const QMimeData *data = clipboard->mimeData( QClipboard::Selection );
QString txt = data->text().trimmed();
if( txt.isEmpty() || ( !txt.contains("://") && !QFile::exists(txt) ) )
txt = clipboard->mimeData()->text().trimmed();
if( txt.contains( "://" ) || QFile::exists( txt ) )
edit->setText( txt );
}
}
/*****************************************************************************
* openurl.hpp: Open a MRL or clipboard content
****************************************************************************
* Copyright © 2009 the VideoLAN team
* $Id$
*
* Authors: Jean-Philippe André <jpeg@videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
******************************************************************************/
#ifndef _OPEN_URL_H
#define _OPEN_URL_H_
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include "util/qvlcframe.hpp"
class ClickLineEdit;
class OpenUrlDialog : public QVLCDialog
{
Q_OBJECT
private:
OpenUrlDialog( QWidget *, intf_thread_t *, bool bClipboard = true );
QString lastUrl;
bool bClipboard, bShouldEnqueue;
ClickLineEdit *edit;
static OpenUrlDialog *instance;
private slots:
void enqueue();
void play();
public:
virtual ~OpenUrlDialog() {}
static OpenUrlDialog* getInstance( QWidget *parent,
intf_thread_t *p_intf,
bool bClipboard = true );
QString url() const;
bool shouldEnqueue() const;
void showEvent( QShowEvent *ev );
public slots:
virtual void close() { play(); };
};
#endif
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include "dialogs/vlm.hpp" #include "dialogs/vlm.hpp"
#include "dialogs/sout.hpp" #include "dialogs/sout.hpp"
#include "dialogs/open.hpp" #include "dialogs/open.hpp"
#include "dialogs/openurl.hpp"
#include "dialogs/help.hpp" #include "dialogs/help.hpp"
#include "dialogs/gototime.hpp" #include "dialogs/gototime.hpp"
#include "dialogs/podcast_configuration.hpp" #include "dialogs/podcast_configuration.hpp"
...@@ -423,6 +424,31 @@ void DialogsProvider::simpleMLAppendDialog() ...@@ -423,6 +424,31 @@ void DialogsProvider::simpleMLAppendDialog()
addFromSimple( false, false ); addFromSimple( false, false );
} }
/* Url & Clipboard */
/**
* Open a MRL.
* If the clipboard contains URLs, the first is automatically 'preselected'.
**/
void DialogsProvider::openUrlDialog()
{
OpenUrlDialog *oud = OpenUrlDialog::getInstance( p_intf->p_sys->p_mi,
p_intf );
if( oud->exec() == QDialog::Accepted )
{
QString url = oud->url();
if( !url.isEmpty() )
{
playlist_Add( THEPL, qtu( toNativeSeparators( url ) ),
NULL, !oud->shouldEnqueue() ?
( PLAYLIST_APPEND | PLAYLIST_GO )
: ( PLAYLIST_APPEND | PLAYLIST_PREPARSE ),
PLAYLIST_END, true, false );
RecentsMRL::getInstance( p_intf )->addRecent(
toNativeSeparators( url ) );
}
}
}
/* Directory */ /* Directory */
/** /**
* Open a directory, * Open a directory,
......
...@@ -165,6 +165,7 @@ public slots: ...@@ -165,6 +165,7 @@ public slots:
void openDialog(); void openDialog();
void openDiscDialog(); void openDiscDialog();
void openFileDialog(); void openFileDialog();
void openUrlDialog();
void openNetDialog(); void openNetDialog();
void openCaptureDialog(); void openCaptureDialog();
......
...@@ -314,6 +314,8 @@ QMenu *QVLCMenu::FileMenu( intf_thread_t *p_intf ) ...@@ -314,6 +314,8 @@ QMenu *QVLCMenu::FileMenu( intf_thread_t *p_intf )
#else #else
":/file-asym", SLOT( openFileDialog() ), "Ctrl+O" ); ":/file-asym", SLOT( openFileDialog() ), "Ctrl+O" );
#endif #endif
addDPStaticEntry( menu, qtr( "Open &URL" ),
NULL, SLOT( openUrlDialog() ), "Ctrl+V" );
addDPStaticEntry( menu, qtr( I_OPEN_FOLDER ), addDPStaticEntry( menu, qtr( I_OPEN_FOLDER ),
":/folder-grey", SLOT( PLOpenDir() ), "Ctrl+F" ); ":/folder-grey", SLOT( PLOpenDir() ), "Ctrl+F" );
addDPStaticEntry( menu, qtr( "Open &Disc..." ), addDPStaticEntry( menu, qtr( "Open &Disc..." ),
......
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