1 /*
2     Copyright (C) 2011 Harald Sitter <sitter@kde.org>
3 
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Lesser General Public
6     License as published by the Free Software Foundation; either
7     version 2.1 of the License, or (at your option) version 3, or any
8     later version accepted by the membership of KDE e.V. (or its
9     successor approved by the membership of KDE e.V.), Nokia Corporation
10     (or its successors, if any) and the KDE Free Qt Foundation, which shall
11     act as a proxy defined in Section 6 of version 3 of the license.
12 
13     This library is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16     Lesser General Public License for more details.
17 
18     You should have received a copy of the GNU Lesser General Public
19     License along with this library.  If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 /****************************************************************************
23 **
24 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
25 ** All rights reserved.
26 ** Contact: Nokia Corporation (qt-info@nokia.com)
27 **
28 ** This file is part of the Qt Designer of the Qt Toolkit.
29 **
30 ** $QT_BEGIN_LICENSE:LGPL$
31 ** Commercial Usage
32 ** Licensees holding valid Qt Commercial licenses may use this file in
33 ** accordance with the Qt Commercial License Agreement provided with the
34 ** Software or, alternatively, in accordance with the terms contained in
35 ** a written agreement between you and Nokia.
36 **
37 ** GNU Lesser General Public License Usage
38 ** Alternatively, this file may be used under the terms of the GNU Lesser
39 ** General Public License version 2.1 as published by the Free Software
40 ** Foundation and appearing in the file LICENSE.LGPL included in the
41 ** packaging of this file.  Please review the following information to
42 ** ensure the GNU Lesser General Public License version 2.1 requirements
43 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
44 **
45 ** In addition, as a special exception, Nokia gives you certain additional
46 ** rights.  These rights are described in the Nokia Qt LGPL Exception
47 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
48 **
49 ** GNU General Public License Usage
50 ** Alternatively, this file may be used under the terms of the GNU
51 ** General Public License version 3.0 as published by the Free Software
52 ** Foundation and appearing in the file LICENSE.GPL included in the
53 ** packaging of this file.  Please review the following information to
54 ** ensure the GNU General Public License version 3.0 requirements will be
55 ** met: http://www.gnu.org/copyleft/gpl.html.
56 **
57 ** If you have questions regarding the use of this file, please contact
58 ** Nokia at qt-info@nokia.com.
59 ** $QT_END_LICENSE$
60 **
61 ****************************************************************************/
62 
63 #include "videoplayertaskmenu.h"
64 
65 #include <QtDesigner/QDesignerFormWindowInterface>
66 #include <QtDesigner/QDesignerFormWindowCursorInterface>
67 #include <QtDesigner/QDesignerFormEditorInterface>
68 #include <QtDesigner/QExtensionManager>
69 
70 #include <phonon/backendcapabilities.h>
71 #include <phonon/mediaobject.h>
72 #include <phonon/videoplayer.h>
73 
74 #include <QPlainTextEdit>
75 #include <QDialogButtonBox>
76 #include <QAction>
77 #include <QVBoxLayout>
78 #include <QFileDialog>
79 #include <QMessageBox>
80 
81 // -----------------  MimeTypeDialog: Display mime types in scrollable text
82 
83 class MimeTypeDialog : public QDialog {
84     Q_DISABLE_COPY(MimeTypeDialog)
85 public:
86     explicit MimeTypeDialog(QWidget *parent = 0);
87 
88     void setMimeTypes(const QStringList &);
89 
90 private:
91     QPlainTextEdit *m_plainTextEdit;
92 };
93 
MimeTypeDialog(QWidget * parent)94 MimeTypeDialog::MimeTypeDialog(QWidget *parent) :
95     QDialog(parent),
96     m_plainTextEdit(new QPlainTextEdit)
97 {
98     setModal(true);
99     setWindowTitle(VideoPlayerTaskMenu::tr("Available Mime Types"));
100     setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
101 
102     QVBoxLayout *layout = new QVBoxLayout;
103     m_plainTextEdit->setReadOnly(true);
104     layout->addWidget(m_plainTextEdit);
105 
106     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok);
107     connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
108     connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
109     layout->addWidget(buttonBox);
110 
111     setLayout(layout);
112 }
113 
setMimeTypes(const QStringList & l)114 void MimeTypeDialog::setMimeTypes(const QStringList &l)
115 {
116     m_plainTextEdit->setPlainText(l.join(QString(1, QLatin1Char('\n'))));
117 }
118 
119 // ----------------- VideoPlayerTaskMenu
VideoPlayerTaskMenu(Phonon::VideoPlayer * object,QObject * parent)120 VideoPlayerTaskMenu::VideoPlayerTaskMenu(Phonon::VideoPlayer *object, QObject *parent) :
121     QObject(parent),
122     m_widget(object),
123     m_displayMimeTypesAction(new QAction(tr("Display supported mime types..."), this)),
124     m_loadAction(new QAction(tr("Load..."), this)),
125     m_playAction(new QAction(tr("Play"), this)),
126     m_pauseAction(new QAction(tr("Pause"), this)),
127     m_stopAction(new QAction(tr("Stop"), this))
128 {
129     m_taskActions << m_displayMimeTypesAction << m_loadAction << m_playAction << m_pauseAction << m_stopAction;
130 
131     connect(m_widget->mediaObject(), SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(mediaObjectStateChanged(Phonon::State,Phonon::State)));
132     connect(m_displayMimeTypesAction, SIGNAL(triggered()), this, SLOT(slotMimeTypes()));
133     connect(m_loadAction, SIGNAL(triggered()), this, SLOT(slotLoad()));
134     connect(m_playAction, SIGNAL(triggered()), object, SLOT(play()));
135     connect(m_pauseAction, SIGNAL(triggered()), object, SLOT(pause()));
136     connect(m_stopAction, SIGNAL(triggered()), object, SLOT(stop()));
137 }
138 
taskActions() const139 QList<QAction*> VideoPlayerTaskMenu::taskActions() const
140 {
141     const bool isPlaying = m_widget->isPlaying();
142     const bool isPaused = m_widget->isPlaying();
143     m_loadAction->setEnabled(!isPlaying && !isPaused);
144     m_playAction->setEnabled(!isPlaying);
145     m_pauseAction->setEnabled(isPlaying);
146     m_stopAction->setEnabled(isPlaying || isPaused);
147     return m_taskActions;
148 }
149 
slotMimeTypes()150 void VideoPlayerTaskMenu::slotMimeTypes()
151 {
152     MimeTypeDialog mimeTypeDialog(m_widget->window());
153     mimeTypeDialog.setMimeTypes(Phonon::BackendCapabilities::availableMimeTypes());
154     mimeTypeDialog.exec();
155 }
156 
slotLoad()157 void VideoPlayerTaskMenu::slotLoad()
158 {
159     const QUrl fileName = QUrl::fromLocalFile(QFileDialog::getOpenFileName(m_widget->window(), tr("Choose Video Player Media Source")));
160     if (fileName.isEmpty())
161         return;
162     m_widget->load(Phonon::MediaSource(fileName));
163 
164 }
165 
mediaObjectStateChanged(Phonon::State newstate,Phonon::State)166 void VideoPlayerTaskMenu::mediaObjectStateChanged(Phonon::State newstate, Phonon::State /* oldstate */)
167 {
168     if (newstate == Phonon::ErrorState) {
169         const QString msg = tr("An error has occurred in '%1': %2").arg(m_widget->objectName(), m_widget->mediaObject()->errorString());
170         QMessageBox::warning(m_widget->window(), tr("Video Player Error"), msg);
171     }
172 }
173 
174 // ----------------- VideoPlayerTaskMenuFactory
VideoPlayerTaskMenuFactory(QExtensionManager * parent)175 VideoPlayerTaskMenuFactory::VideoPlayerTaskMenuFactory(QExtensionManager *parent) :
176     QExtensionFactory(parent)
177 {
178 }
179 
createExtension(QObject * object,const QString & iid,QObject * parent) const180 QObject *VideoPlayerTaskMenuFactory::createExtension(QObject *object,
181                          const QString &iid, QObject *parent) const
182 {
183     if (iid != Q_TYPEID(QDesignerTaskMenuExtension))
184         return 0;
185 
186     if (Phonon::VideoPlayer *widget = qobject_cast<Phonon::VideoPlayer *>(object))
187         return new VideoPlayerTaskMenu(widget, parent);
188 
189     return 0;
190 }
191