qt4: Replace redundant virtual with Q_DECL_OVERRIDE
[vlc.git] / modules / gui / qt4 / dialogs / plugins.hpp
1 /*****************************************************************************
2  * plugins.hpp : Plug-ins and extensions listing
3  ****************************************************************************
4  * Copyright (C) 2008 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Jean-Baptiste Kempf <jb (at) videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 #ifndef QVLC_PLUGIN_DIALOG_H_
25 #define QVLC_PLUGIN_DIALOG_H_ 1
26
27 #include "util/qvlcframe.hpp"
28 #include "util/singleton.hpp"
29
30 #include <vlc_extensions.h>
31 #include <vlc_addons.h>
32
33 #include <QStringList>
34 #include <QTreeWidgetItem>
35 #include <QPushButton>
36 #include <QAbstractListModel>
37 #include <QSortFilterProxyModel>
38 #include <QStyledItemDelegate>
39
40 class QLabel;
41 class QTabWidget;
42 class QComboBox;
43 class QTreeWidget;
44 class QLineEdit;
45 //class QTextBrowser;
46 class QListView;
47 class QStyleOptionViewItem;
48 class QPainter;
49 class QKeyEvent;
50 class PluginTab;
51 class ExtensionTab;
52 class AddonsTab;
53 class ExtensionListItem;
54 class SearchLineEdit;
55 class ExtensionCopy;
56 class ExtensionsManager;
57 class AddonsManager;
58 class PixmapAnimator;
59 class DelegateAnimationHelper;
60 class AddonsSortFilterProxyModel;
61
62 class PluginDialog : public QVLCFrame, public Singleton<PluginDialog>
63 {
64     Q_OBJECT
65
66 private:
67     PluginDialog( intf_thread_t * );
68     virtual ~PluginDialog();
69
70     QTabWidget *tabs;
71     PluginTab *pluginTab;
72     ExtensionTab *extensionTab;
73     AddonsTab *addonsTab;
74
75     friend class Singleton<PluginDialog>;
76 };
77
78 class PluginTab : public QVLCFrame
79 {
80     Q_OBJECT
81 public:
82     enum
83     {
84         NAME = 0,
85         CAPABILITY,
86         SCORE
87     };
88
89 protected:
90     void keyPressEvent( QKeyEvent *keyEvent ) Q_DECL_OVERRIDE;
91
92 private:
93     PluginTab( intf_thread_t *p_intf );
94     virtual ~PluginTab();
95
96     void FillTree();
97     QTreeWidget *treePlugins;
98     SearchLineEdit *edit;
99
100 private slots:
101     void search( const QString& );
102
103     friend class PluginDialog;
104 };
105
106 class ExtensionTab : public QVLCFrame
107 {
108     Q_OBJECT
109
110 protected:
111     void keyPressEvent( QKeyEvent *keyEvent ) Q_DECL_OVERRIDE;
112
113 private:
114     ExtensionTab( intf_thread_t *p_intf );
115     virtual ~ExtensionTab();
116
117 private slots:
118     void moreInformation();
119     void updateButtons();
120
121 private:
122     QListView *extList;
123     QPushButton *butMoreInfo;
124
125     friend class PluginDialog;
126 };
127
128 class AddonsTab : public QVLCFrame
129 {
130     Q_OBJECT
131     friend class PluginDialog;
132
133 private slots:
134     void moreInformation();
135     void installChecked( int );
136     void reposync();
137
138 private:
139     AddonsTab( intf_thread_t *p_intf );
140     virtual ~AddonsTab();
141     bool eventFilter ( QObject * watched, QEvent * event );
142
143     enum
144     {
145         ONLYLOCALADDONS = 0,
146         WITHONLINEADDONS
147     };
148     QListView *addonsView;
149     AddonsSortFilterProxyModel *addonsModel;
150     /* Wait spinner */
151     PixmapAnimator *spinnerAnimation;
152     bool b_localdone;
153 };
154
155 class PluginTreeItem : public QTreeWidgetItem
156 {
157 public:
158     PluginTreeItem(QStringList &qs_item, int Type = QTreeWidgetItem::Type)
159             : QTreeWidgetItem (qs_item, Type) {}
160     virtual ~PluginTreeItem() {}
161
162     virtual bool operator< ( const QTreeWidgetItem & other ) const;
163 };
164
165 class ExtensionListModel : public QAbstractListModel
166 {
167
168     Q_OBJECT
169
170 public:
171     /* Safe copy of the extension_t struct */
172     class ExtensionCopy
173     {
174
175     public:
176         ExtensionCopy( extension_t * );
177         ~ExtensionCopy();
178         QVariant data( int role ) const;
179
180     private:
181         QString name, title, description, shortdesc, author, version, url;
182         QPixmap *icon;
183     };
184
185     ExtensionListModel( QObject *parent, ExtensionsManager *EM );
186     ExtensionListModel( QObject *parent = 0 );
187     virtual ~ExtensionListModel();
188
189     enum
190     {
191         SummaryRole = Qt::UserRole,
192         VersionRole,
193         AuthorRole,
194         LinkRole,
195         FilenameRole
196     };
197
198     QVariant data( const QModelIndex& index, int role ) const Q_DECL_OVERRIDE;
199     QModelIndex index( int row, int column = 0,
200                        const QModelIndex& = QModelIndex() ) const Q_DECL_OVERRIDE;
201     int rowCount( const QModelIndex& = QModelIndex() ) const Q_DECL_OVERRIDE;
202
203 protected slots:
204     void updateList();
205
206 private:
207     ExtensionsManager *EM;
208     QList<ExtensionCopy*> extensions;
209 };
210
211 class AddonsListModel: public ExtensionListModel
212 {
213     Q_OBJECT
214
215 public:
216     AddonsListModel( AddonsManager *AM, QObject *parent = 0 );
217     QVariant data( const QModelIndex& index, int role ) const Q_DECL_OVERRIDE;
218     QModelIndex index( int row, int column = 0,
219                        const QModelIndex& = QModelIndex() ) const Q_DECL_OVERRIDE;
220     int rowCount( const QModelIndex& = QModelIndex() ) const Q_DECL_OVERRIDE;
221     Qt::ItemFlags flags( const QModelIndex &index ) const Q_DECL_OVERRIDE;
222     bool setData( const QModelIndex &index, const QVariant &value, int role ) Q_DECL_OVERRIDE;
223
224     enum
225     {
226         TypeRole = FilenameRole + 1,
227         DescriptionRole,
228         UUIDRole,
229         FlagsRole,
230         StateRole,
231         DownloadsCountRole,
232         ScoreRole
233     };
234
235     static QColor getColorByAddonType( int );
236
237 protected slots:
238     void addonAdded( addon_entry_t * );
239     void addonChanged( const addon_entry_t * );
240
241 protected:
242
243     class Addon
244     {
245     public:
246         Addon( addon_entry_t * );
247         ~Addon();
248         bool operator==( const Addon & other ) const;
249         bool operator==( const addon_entry_t * p_other ) const;
250         QVariant data( int ) const;
251     private:
252         addon_entry_t * p_entry;
253     };
254
255     QList<Addon*> addons;
256     AddonsManager *AM;
257 };
258
259 class AddonsSortFilterProxyModel : public QSortFilterProxyModel
260 {
261     Q_OBJECT
262
263 public:
264     AddonsSortFilterProxyModel( QObject *parent = 0 );
265
266 public slots:
267     virtual void setTypeFilter( int );
268     virtual void setStatusFilter( int );
269
270 protected:
271     bool filterAcceptsRow( int, const QModelIndex & ) const Q_DECL_OVERRIDE;
272
273 private:
274     int i_type_filter;
275     int i_status_filter;
276 };
277
278 class ExtensionItemDelegate : public QStyledItemDelegate
279 {
280     Q_OBJECT
281
282 public:
283     ExtensionItemDelegate( QObject *parent );
284     virtual ~ExtensionItemDelegate();
285
286     void paint( QPainter *painter,
287                 const QStyleOptionViewItem &option,
288                 const QModelIndex &index ) const Q_DECL_OVERRIDE;
289     QSize sizeHint( const QStyleOptionViewItem &option,
290                     const QModelIndex &index ) const Q_DECL_OVERRIDE;
291     void initStyleOption( QStyleOptionViewItem *option,
292                           const QModelIndex &index ) const Q_DECL_OVERRIDE;
293
294 protected:
295     QMargins margins;
296 };
297
298
299 class AddonItemDelegate : public ExtensionItemDelegate
300 {
301     Q_OBJECT
302
303 public:
304     AddonItemDelegate( QObject *parent );
305     ~AddonItemDelegate();
306
307     void paint( QPainter *painter,
308                 const QStyleOptionViewItem &option,
309                 const QModelIndex &index ) const Q_DECL_OVERRIDE;
310     QSize sizeHint( const QStyleOptionViewItem &option,
311                     const QModelIndex &index ) const Q_DECL_OVERRIDE;
312     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE;
313     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE;
314     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const Q_DECL_OVERRIDE;
315     void setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE;
316
317     void setAnimator( DelegateAnimationHelper *animator );
318
319 public slots:
320     void editButtonClicked();
321
322 signals:
323     void showInfo();
324
325 protected:
326     DelegateAnimationHelper *animator;
327     QWidget *progressbar;
328 };
329
330 class ExtensionInfoDialog : public QVLCDialog
331 {
332 public:
333     ExtensionInfoDialog( const QModelIndex &index,
334                          intf_thread_t *p_intf, QWidget *parent );
335 };
336
337 class AddonInfoDialog : public QVLCDialog
338 {
339 public:
340     AddonInfoDialog( const QModelIndex &index,
341                      intf_thread_t *p_intf, QWidget *parent );
342 };
343
344 #endif
345