UBFeaturesWidget.h 13.6 KB
Newer Older
1
/*
2
 * Copyright (C) 2015-2018 Département de l'Instruction Publique (DIP-SEM)
Craig Watson's avatar
Craig Watson committed
3
 *
Claudio Valerio's avatar
Claudio Valerio committed
4
 * Copyright (C) 2013 Open Education Foundation
5
 *
Claudio Valerio's avatar
Claudio Valerio committed
6 7
 * Copyright (C) 2010-2013 Groupement d'Intérêt Public pour
 * l'Education Numérique en Afrique (GIP ENA)
8
 *
Claudio Valerio's avatar
Claudio Valerio committed
9 10 11
 * This file is part of OpenBoard.
 *
 * OpenBoard is free software: you can redistribute it and/or modify
Claudio Valerio's avatar
Claudio Valerio committed
12 13
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3 of the License,
14 15 16 17
 * with a specific linking exception for the OpenSSL project's
 * "OpenSSL" library (or with modified versions of it that use the
 * same license as the "OpenSSL" library).
 *
Claudio Valerio's avatar
Claudio Valerio committed
18
 * OpenBoard is distributed in the hope that it will be useful,
19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Claudio Valerio's avatar
Claudio Valerio committed
20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Claudio Valerio's avatar
Claudio Valerio committed
21
 * GNU General Public License for more details.
22
 *
Claudio Valerio's avatar
Claudio Valerio committed
23
 * You should have received a copy of the GNU General Public License
Claudio Valerio's avatar
Claudio Valerio committed
24
 * along with OpenBoard. If not, see <http://www.gnu.org/licenses/>.
25 26 27
 */


Claudio Valerio's avatar
Claudio Valerio committed
28

Claudio Valerio's avatar
Claudio Valerio committed
29

Anna Udovichenko's avatar
Anna Udovichenko committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
#ifndef UBFEATURESWIDGET_H
#define UBFEATURESWIDGET_H

#include <QWidget>
#include <QListView>
#include <QGraphicsView>
#include <QAbstractListModel>
#include <QPixmap>
#include <QVBoxLayout>
#include <QSlider>
#include <QUrl>
#include <QStyledItemDelegate>
#include <QLocale>
#include <QGraphicsLinearLayout>
#include <QStackedWidget>
45
#include <QDropEvent>
46 47 48 49
#include <QPushButton>
#include <QProgressBar>
#include <QLabel>
#include <QTreeWidget>
Anna Udovichenko's avatar
Anna Udovichenko committed
50 51

#include "UBDockPaletteWidget.h"
52
#include "core/UBSettings.h"
Anna Udovichenko's avatar
Anna Udovichenko committed
53
#include "board/UBFeaturesController.h"
54
#include "api/UBWidgetUniboardAPI.h"
55
#include "UBFeaturesActionBar.h"
Anna Udovichenko's avatar
Anna Udovichenko committed
56
#include "UBRubberBand.h"
57 58 59
#include <QtWebKit>
#include <QWebView>
#include <QWebSettings>
Anna Udovichenko's avatar
Anna Udovichenko committed
60 61 62 63

#define THUMBNAIL_WIDTH 400
#define ID_LISTVIEW 0
#define ID_PROPERTIES 1
64
#define ID_WEBVIEW 2
Anna Udovichenko's avatar
Anna Udovichenko committed
65 66 67 68 69 70 71 72 73 74 75 76

class UBListModel;

class UBFeaturesModel;
class UBFeaturesItemDelegate;
class UBFeaturesPathItemDelegate;
class UBFeaturesProxyModel;
class UBFeaturesSearchProxyModel;
class UBFeaturesPathProxyModel;
class UBFeaturesPathViewer;
class UBFeatureProperties;
class UBFeatureItemButton;
77
class UBFeaturesListView;
78
class UBFeaturesWebView;
79 80
class UBFeaturesNavigatorWidget;
class UBFeaturesMimeData;
81 82
class UBFeaturesCentralWidget;
class UBFeaturesNewFolderDialog;
83
class UBFeaturesProgressBar;
Anna Udovichenko's avatar
Anna Udovichenko committed
84 85 86 87 88

class UBFeaturesWidget : public UBDockPaletteWidget
{
    Q_OBJECT
public:
Claudio Valerio's avatar
Claudio Valerio committed
89
    UBFeaturesWidget(QWidget* parent=0, const char* name="UBFeaturesWidget");
Anna Udovichenko's avatar
Anna Udovichenko committed
90 91
    virtual ~UBFeaturesWidget();

Claudio Valerio's avatar
Claudio Valerio committed
92
    bool visibleInMode(eUBDockPaletteWidgetMode mode)
Anna Udovichenko's avatar
Anna Udovichenko committed
93 94 95 96
    {
        return mode == eUBDockPaletteWidget_BOARD
            || mode == eUBDockPaletteWidget_DESKTOP;
    }
97
    UBFeaturesController * getFeaturesController() const { return controller; }
98
    void importImage(const QImage &image, const QString &fileName = QString());
99

Claudio Valerio's avatar
Claudio Valerio committed
100 101 102
    static const int minThumbnailSize = 20;
    static const int maxThumbnailSize = 100;
    static const int defaultThumbnailSize = 40;
103

104 105 106
    static const char *objNamePathList;
    static const char *objNameFeatureList;

107 108 109 110
public:
    int scrollbarHorisontalPadding() const { return 10;}
    int scrollbarVerticalIndent() const { return 0;}

111 112 113
signals:
    void sendFileNameList(const QStringList lst);

Anna Udovichenko's avatar
Anna Udovichenko committed
114
private slots:
115
    void onPreviewLoaded(int id, bool pSuccess, QUrl sourceUrl, QUrl originalUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
116 117 118 119 120 121 122
    void currentSelected( const QModelIndex & );
    void searchStarted( const QString & );
    void createNewFolder();
    void deleteElements( const UBFeaturesMimeData * );
    void addToFavorite( const UBFeaturesMimeData  *);
    void removeFromFavorite( const UBFeaturesMimeData * );
    void onDisplayMetadata( QMap<QString,QString> );
123
    void onAddDownloadedFileToLibrary(bool, QUrl, QString, QByteArray, QString pTitle);
124
    void addElementsToFavorite();
125
    void removeElementsFromFavorite();
126
    void deleteSelectedElements();
127
    void rescanModel();
128
    void lockIt(bool pLock);
129 130 131 132 133 134 135 136 137 138 139

private:
    void switchToListView();
    void switchToProperties();
    void switchToWebView();

private:
    UBFeaturesController *controller;
    UBFeaturesListView *pathListView;
    QVBoxLayout *layout;
    UBFeaturesActionBar *mActionBar;
Ilia Ryabokon's avatar
Ilia Ryabokon committed
140
    UBDownloadHttpFile* imageGatherer;
141
    UBFeaturesCentralWidget *centralWidget;
142 143 144 145 146 147 148 149 150 151 152 153 154 155
};


class UBFeaturesMimeData : public QMimeData
{
    Q_OBJECT

public:
    virtual QStringList formats() const;
    QList<UBFeature> features() const {return mFeatures;}
    void setFeatures(const QList<UBFeature> &fList) {mFeatures = fList;}

private:
    QList<UBFeature> mFeatures;
Anna Udovichenko's avatar
Anna Udovichenko committed
156 157
};

158

159 160
class UBFeaturesListView : public QListView
{
Claudio Valerio's avatar
Claudio Valerio committed
161
    Q_OBJECT
162

163
public:
164
    UBFeaturesListView( QWidget* parent=0, const char* name="UBFeaturesListView" );
Ivan Ilin's avatar
Ivan Ilin committed
165
    virtual ~UBFeaturesListView() {;}
166

167
protected:
168
    virtual void dragEnterEvent( QDragEnterEvent *event );
169
    virtual void dropEvent( QDropEvent *event );
170
    virtual void dragMoveEvent( QDragMoveEvent *event );
171 172 173

private slots:
    void thumbnailSizeChanged(int);
174

175 176
};

177 178 179 180 181 182 183 184 185 186 187 188 189

// class created to have the same style for slider and QListView itself
class UBFeaturesNavigatorWidget: public QWidget
{
    Q_OBJECT

public:
    UBFeaturesNavigatorWidget(QWidget *parent, const char* name = "");
    UBFeaturesListView *listView() {return mListView;}
    void setSliderPosition(int pValue);

private:
    UBFeaturesListView *mListView;
Claudio Valerio's avatar
Claudio Valerio committed
190
    QSlider *mListSlider;
191 192 193

};

194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
class UBFeaturesCentralWidget : public QWidget
{
  Q_OBJECT

public:
    enum StackElement{
        MainList = 0,
        FeaturePropertiesList,
        FeaturesWebView
    };

    enum AddWidget {
        NewFolderDialog = 0,
        ProgressBarWidget
    };

    enum AddWidgetState {
        NonModal = 0,
        Modal
    };

    UBFeaturesCentralWidget(QWidget *parent = 0);
    void setSliderPosition(int pValue) {mNavigator->setSliderPosition(pValue);}

    UBFeaturesListView *listView() {return mNavigator->listView();}
    void showElement(const UBFeature &feature, StackElement pView);
    void switchTo(StackElement pView);
    void setPropertiesPixmap(const QPixmap &pix);
    void setPropertiesThumbnail(const QPixmap &pix);
    StackElement currentView() const {return static_cast<StackElement>(mStackedWidget->currentIndex());}
    UBFeature getCurElementFromProperties();

    void setLockedExcludingAdditional(bool pLock);

    QStackedWidget *mStackedWidget;
229 230 231
    UBFeaturesNavigatorWidget *mNavigator;
    UBFeatureProperties *mFeatureProperties;
    UBFeaturesWebView *webView;
232 233 234 235 236 237

    QStackedWidget *mAdditionalDataContainer;

signals:
    void lockMainWidget(bool pLock);
    void createNewFolderSignal(QString pStr);
238
    void sendFileNameList(const QStringList lst);
239 240 241

//    progressbar widget related signals
    void maxFilesCountEvaluated(int pValue);
242 243 244 245 246 247
    void increaseStatusBarValue();
    void scanCategory(const QString &);
    void scanPath(const QString &);

public slots:
    void showAdditionalData(AddWidget pWidgetType, AddWidgetState pState = NonModal);
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263

private slots:
    void createNewFolderSlot(QString pStr);
    void hideAdditionalData();

    void scanStarted();
    void scanFinished();
};

class UBFeaturesNewFolderDialog : public QWidget
{
    Q_OBJECT

public:
    UBFeaturesNewFolderDialog(QWidget *parent = 0);
    void setRegexp(const QRegExp pRegExp);
264
    bool validString(const QString &pStr);
265 266 267 268 269 270 271 272

signals:
    void createNewFolder(QString str);
    void closeDialog();

private slots:
    void accept();
    void reject();
273 274 275
    void setFileNameList(const QStringList &pLst);
    void reactOnTextChanged(const QString &pStr);

276 277 278
private:
    QLineEdit *mLineEdit;
    QRegExpValidator *mValidator;
279 280
    QStringList mFileNameList;
    QPushButton *acceptButton;
281 282 283
    const QString acceptText;
    const QString cancelText;
    const QString labelText;
284
};
285

286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306
class UBFeaturesProgressInfo: public QWidget {
    Q_OBJECT

public:
    UBFeaturesProgressInfo(QWidget *parent = 0);

private slots:
    void setCommmonInfoText(const QString &str);
    void setDetailedInfoText(const QString &str);
    void setProgressMin(int pValue);
    void setProgressMax(int pValue);
    void increaseProgressValue();
    void sendFeature(UBFeature pFeature);


private:
    QProgressBar *mProgressBar;
    QLabel *mCommonInfoLabel;
    QLabel *mDetailedInfoLabel;
};

307 308 309 310 311
class UBFeaturesWebView : public QWidget
{
    Q_OBJECT
public:
    UBFeaturesWebView(QWidget* parent = 0, const char* name = "UBFeaturesWebView");
312
    virtual ~UBFeaturesWebView();
313 314 315 316 317

    void showElement(const UBFeature &elem);

private slots:
    void onLoadFinished(bool ok);
Claudio Valerio's avatar
Claudio Valerio committed
318
    void javaScriptWindowObjectCleared();
319 320 321 322 323 324 325

private:
    QWebView* mpView;
    QWebSettings* mpWebSettings;
    QVBoxLayout* mpLayout;
    UBWidgetUniboardAPI* mpSankoreAPI;
};
Anna Udovichenko's avatar
Anna Udovichenko committed
326 327 328 329 330 331 332 333 334

class UBFeatureProperties : public QWidget
{
    Q_OBJECT
public:
    UBFeatureProperties(QWidget* parent=0, const char* name="UBFeatureProperties");
    ~UBFeatureProperties();

    void showElement(const UBFeature &elem);
335
    UBFeature getCurrentElement() const;
336 337
    void setOrigPixmap(const QPixmap &pix);
    void setThumbnail(const QPixmap &pix);
338

Anna Udovichenko's avatar
Anna Udovichenko committed
339
protected:
340 341
    void resizeEvent(QResizeEvent *event);
    void showEvent(QShowEvent *event);
Anna Udovichenko's avatar
Anna Udovichenko committed
342 343 344

private slots:
    void onAddToPage();
345
    void onAddToLib();
346
    void onSetAsBackground();
Anna Udovichenko's avatar
Anna Udovichenko committed
347 348 349
    //void onBack();

private:
Claudio Valerio's avatar
Claudio Valerio committed
350
    void populateMetadata();
351
    void adaptSize();
352

Anna Udovichenko's avatar
Anna Udovichenko committed
353 354
    QVBoxLayout* mpLayout;
    QHBoxLayout* mpButtonLayout;
355 356 357
    UBFeatureItemButton *mpAddPageButton;
    UBFeatureItemButton *mpAddToLibButton;
    UBFeatureItemButton *mpSetAsBackgroundButton;
Anna Udovichenko's avatar
Anna Udovichenko committed
358
    QLabel* mpObjInfoLabel;
359
    QTreeWidget* mpObjInfos;
Anna Udovichenko's avatar
Anna Udovichenko committed
360 361 362 363
    QLabel* mpThumbnail;
    QPixmap* mpOrigPixmap;
    int maxThumbHeight;
    UBFeature *mpElement;
364
    QTreeWidgetItem* mpItem;
Anna Udovichenko's avatar
Anna Udovichenko committed
365 366 367 368 369 370 371 372 373 374 375
};

class UBFeatureItemButton : public QPushButton
{
public:
    UBFeatureItemButton(QWidget* parent=0, const char* name="UBFeatureItemButton");
    ~UBFeatureItemButton();
};

class UBFeaturesModel : public QAbstractListModel
{
Claudio Valerio's avatar
Claudio Valerio committed
376
    Q_OBJECT
377 378 379 380

signals:
    void dataRestructured();

Anna Udovichenko's avatar
Anna Udovichenko committed
381
public:
382
    UBFeaturesModel(QList<UBFeature> *pFeaturesList, QObject *parent = 0) : QAbstractListModel(parent), featuresList(pFeaturesList) {;}
Ivan Ilin's avatar
Ivan Ilin committed
383
    virtual ~UBFeaturesModel(){;}
Anna Udovichenko's avatar
Anna Udovichenko committed
384

Claudio Valerio's avatar
Claudio Valerio committed
385
    void deleteFavoriteItem( const QString &path );
386
    void deleteItem( const QString &path );
387
    void deleteItem(const UBFeature &feature);
388

Claudio Valerio's avatar
Claudio Valerio committed
389 390 391 392 393
    QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const;
    QMimeData *mimeData( const QModelIndexList &indexes ) const;
    QStringList mimeTypes() const;
    int rowCount( const QModelIndex &parent ) const;
    Qt::ItemFlags flags( const QModelIndex &index ) const;
Anna Udovichenko's avatar
Anna Udovichenko committed
394
    bool dropMimeData(const QMimeData *mimeData, Qt::DropAction action, int row, int column, const QModelIndex &parent);
Claudio Valerio's avatar
Claudio Valerio committed
395 396
    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
    bool removeRow(int row, const QModelIndex &parent = QModelIndex());
397 398
    //bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
    //bool insertRow(int row, const QModelIndex &parent = QModelIndex());
399 400

    void moveData(const UBFeature &source, const UBFeature &destination, Qt::DropAction action, bool deleteManualy = false);
Ivan Ilin's avatar
Ivan Ilin committed
401
    Qt::DropActions supportedDropActions() const { return Qt::MoveAction | Qt::CopyAction; }
402 403
    Qt::DropActions supportedDragActions() const { return Qt::MoveAction | Qt::CopyAction; }

404
//    void setFeaturesList(QList <UBFeature> *flist ) { featuresList = flist; }
Anna Udovichenko's avatar
Anna Udovichenko committed
405

406 407 408
public slots:
    void addItem( const UBFeature &item );

Anna Udovichenko's avatar
Anna Udovichenko committed
409
private:
Claudio Valerio's avatar
Claudio Valerio committed
410
    QList <UBFeature> *featuresList;
Anna Udovichenko's avatar
Anna Udovichenko committed
411 412 413 414
};

class UBFeaturesProxyModel : public QSortFilterProxyModel
{
Claudio Valerio's avatar
Claudio Valerio committed
415
    Q_OBJECT
Anna Udovichenko's avatar
Anna Udovichenko committed
416
public:
Ivan Ilin's avatar
Ivan Ilin committed
417 418
    UBFeaturesProxyModel(QObject *parent = 0) : QSortFilterProxyModel(parent) {;}
    virtual ~UBFeaturesProxyModel() {}
Anna Udovichenko's avatar
Anna Udovichenko committed
419
protected:
Claudio Valerio's avatar
Claudio Valerio committed
420
    virtual bool filterAcceptsRow ( int sourceRow, const QModelIndex & sourceParent ) const;
Anna Udovichenko's avatar
Anna Udovichenko committed
421 422 423 424
};

class UBFeaturesSearchProxyModel : public QSortFilterProxyModel
{
Claudio Valerio's avatar
Claudio Valerio committed
425
    Q_OBJECT
Anna Udovichenko's avatar
Anna Udovichenko committed
426
public:
427
    UBFeaturesSearchProxyModel(QObject *parent = 0) : QSortFilterProxyModel(parent), mFilterPrefix() {;}
Ivan Ilin's avatar
Ivan Ilin committed
428
    virtual ~UBFeaturesSearchProxyModel() {}
429
    void setFilterPrefix(const QString &newPrefix) {mFilterPrefix = newPrefix;}
Anna Udovichenko's avatar
Anna Udovichenko committed
430
protected:
Claudio Valerio's avatar
Claudio Valerio committed
431
    virtual bool filterAcceptsRow ( int sourceRow, const QModelIndex & sourceParent ) const;
432 433
private:
    QString mFilterPrefix;
Anna Udovichenko's avatar
Anna Udovichenko committed
434 435 436 437
};

class UBFeaturesPathProxyModel : public QSortFilterProxyModel
{
Claudio Valerio's avatar
Claudio Valerio committed
438
    Q_OBJECT
Anna Udovichenko's avatar
Anna Udovichenko committed
439
public:
Ivan Ilin's avatar
Ivan Ilin committed
440 441 442
    UBFeaturesPathProxyModel(QObject *parent = 0) : QSortFilterProxyModel(parent) {;}
    virtual ~UBFeaturesPathProxyModel() {}
    void setPath( const QString &p ) { path = p; }
Anna Udovichenko's avatar
Anna Udovichenko committed
443
protected:
Claudio Valerio's avatar
Claudio Valerio committed
444
    virtual bool filterAcceptsRow ( int sourceRow, const QModelIndex & sourceParent ) const;
Anna Udovichenko's avatar
Anna Udovichenko committed
445
private:
Claudio Valerio's avatar
Claudio Valerio committed
446
    QString path;
Anna Udovichenko's avatar
Anna Udovichenko committed
447 448 449 450
};

class UBFeaturesItemDelegate : public QStyledItemDelegate
{
Claudio Valerio's avatar
Claudio Valerio committed
451
    Q_OBJECT
Anna Udovichenko's avatar
Anna Udovichenko committed
452
public:
453
    UBFeaturesItemDelegate(QObject *parent = 0, const QListView *lw = 0) : QStyledItemDelegate(parent) { listView = lw; }
Ivan Ilin's avatar
Ivan Ilin committed
454
    ~UBFeaturesItemDelegate() {}
Claudio Valerio's avatar
Claudio Valerio committed
455 456
    //UBFeaturesItemDelegate(const QListView *lw = 0) { listView = lw; };
    //void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
Anna Udovichenko's avatar
Anna Udovichenko committed
457
    //QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
Claudio Valerio's avatar
Claudio Valerio committed
458
    virtual QString    displayText ( const QVariant & value, const QLocale & locale ) const;
Anna Udovichenko's avatar
Anna Udovichenko committed
459
private:
Claudio Valerio's avatar
Claudio Valerio committed
460
    const QListView *listView;
Anna Udovichenko's avatar
Anna Udovichenko committed
461 462 463 464
};

class UBFeaturesPathItemDelegate : public QStyledItemDelegate
{
Claudio Valerio's avatar
Claudio Valerio committed
465
    Q_OBJECT
Anna Udovichenko's avatar
Anna Udovichenko committed
466
public:
467
    UBFeaturesPathItemDelegate(QObject *parent = 0);
Claudio Valerio's avatar
Claudio Valerio committed
468 469 470
    ~UBFeaturesPathItemDelegate();
    virtual QString    displayText ( const QVariant & value, const QLocale & locale ) const;
    void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
Anna Udovichenko's avatar
Anna Udovichenko committed
471
private:
Claudio Valerio's avatar
Claudio Valerio committed
472
    QPixmap *arrowPixmap;
Anna Udovichenko's avatar
Anna Udovichenko committed
473 474
};

475

Ivan Ilin's avatar
Ivan Ilin committed
476
#endif // UBFEATURESWIDGET_H