UBFeaturesController.h 9.59 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
#ifndef UBFEATURESCONTROLLER_H
#define UBFEATURESCONTROLLER_H

#include <QMetaType>
#include <QObject>
#include <QWidget>
36
#include <QSet>
Anna Udovichenko's avatar
Anna Udovichenko committed
37 38 39
#include <QVector>
#include <QString>
#include <QPixmap>
40 41
#include <QMap>
#include <QUrl>
42
#include <QByteArray>
43
#include <QtGui>
44 45 46 47
#include <QImage>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
48
#include <QListView>
49 50 51 52 53 54 55 56

class UBFeaturesModel;
class UBFeaturesItemDelegate;
class UBFeaturesPathItemDelegate;
class UBFeaturesProxyModel;
class UBFeaturesSearchProxyModel;
class UBFeaturesPathProxyModel;
class UBFeaturesListView;
57 58 59 60 61 62 63 64 65
class UBFeature;


class UBFeaturesComputingThread : public QThread
{
    Q_OBJECT
public:
    explicit UBFeaturesComputingThread(QObject *parent = 0);
    virtual ~UBFeaturesComputingThread();
66
        void compute(const QList<QPair<QUrl, UBFeature> > &pScanningData, QSet<QUrl> *pFavoritesSet);
67 68 69 70 71 72 73 74 75 76

protected:
    void run();

signals:
    void sendFeature(UBFeature pFeature);
    void featureSent();
    void scanStarted();
    void scanFinished();
    void maxFilesCountEvaluated(int max);
77 78
    void scanCategory(const QString &str);
    void scanPath(const QString &str);
79 80 81 82

public slots:

private:
83
    void scanFS(const QUrl & currentPath, const QString & currVirtualPath, const QSet<QUrl> &pFavoriteSet);
84
    void scanAll(QList<QPair<QUrl, UBFeature> > pScanningData, const QSet<QUrl> &pFavoriteSet);
85
    int featuresCount(const QUrl &pPath);
86
    int featuresCountAll(QList<QPair<QUrl, UBFeature> > pScanningData);
87 88 89 90 91 92

private:
    QMutex mMutex;
    QWaitCondition mWaitCondition;
    QUrl mScanningPath;
    QString mScanningVirtualPath;
93
    QList<QPair<QUrl, UBFeature> > mScanningData;
94
    QSet<QUrl> mFavoriteSet;
95 96 97
    bool restart;
    bool abort;
};
Anna Udovichenko's avatar
Anna Udovichenko committed
98 99 100 101 102 103 104 105


enum UBFeatureElementType
{
    FEATURE_CATEGORY,
    FEATURE_VIRTUALFOLDER,
    FEATURE_FOLDER,
    FEATURE_INTERACTIVE,
Claudio Valerio's avatar
Claudio Valerio committed
106
    FEATURE_INTERNAL,
107
    FEATURE_ITEM,
108 109 110
    FEATURE_AUDIO,
    FEATURE_VIDEO,
    FEATURE_IMAGE,
111
    FEATURE_FLASH,
Claudio Valerio's avatar
Claudio Valerio committed
112 113
    FEATURE_TRASH,
    FEATURE_FAVORITE,
114 115
    FEATURE_SEARCH,
    FEATURE_INVALID
Anna Udovichenko's avatar
Anna Udovichenko committed
116 117 118 119 120
};

class UBFeature
{
public:
Ivan Ilin's avatar
Ivan Ilin committed
121
    UBFeature() {;}
122
    UBFeature(const QString &url, const QImage &icon, const QString &name, const QUrl &realPath, UBFeatureElementType type = FEATURE_CATEGORY);
123
    virtual ~UBFeature();
Ivan Ilin's avatar
Ivan Ilin committed
124
    QString getName() const { return mName; }
Ilia Ryabokon's avatar
Ilia Ryabokon committed
125
    QString getDisplayName() const {return mDisplayName;}
126
    QImage getThumbnail() const {return mThumbnail;}
127
    QString getVirtualPath() const { return virtualDir; }
128
    QUrl getFullPath() const { return mPath; }
129
    QString getFullVirtualPath() const { return  virtualDir + "/" + mName; }
Claudio Valerio's avatar
Claudio Valerio committed
130
    QString getUrl() const;
131 132
    void setFullPath(const QUrl &newPath) {mPath = newPath;}
    void setFullVirtualPath(const QString &newVirtualPath) {virtualDir = newVirtualPath;}
Ivan Ilin's avatar
Ivan Ilin committed
133
    UBFeatureElementType getType() const { return elementType; }
134

Claudio Valerio's avatar
Claudio Valerio committed
135
    bool isFolder() const;
136
    bool allowedCopy() const;
Claudio Valerio's avatar
Claudio Valerio committed
137
    bool isDeletable() const;
138
    bool inTrash() const;
Claudio Valerio's avatar
Claudio Valerio committed
139 140 141 142
    bool operator ==( const UBFeature &f )const;
    bool operator !=( const UBFeature &f )const;
    const QMap<QString,QString> & getMetadata() const { return metadata; }
    void setMetadata( const QMap<QString,QString> &data ) { metadata = data; }
143

Ilia Ryabokon's avatar
Ilia Ryabokon committed
144 145 146 147 148

private:
    QString getNameFromVirtualPath(const QString &pVirtPath);
    QString getVirtualDirFromVirtualPath(const QString &pVirtPath);

Anna Udovichenko's avatar
Anna Udovichenko committed
149
private:
150
    QString virtualDir;
151
    QString virtualPath;
152
    QImage mThumbnail;
Anna Udovichenko's avatar
Anna Udovichenko committed
153
    QString mName;
Ilia Ryabokon's avatar
Ilia Ryabokon committed
154
    QString mDisplayName;
Claudio Valerio's avatar
Claudio Valerio committed
155
    QUrl mPath;
Ivan Ilin's avatar
Ivan Ilin committed
156
    UBFeatureElementType elementType;
157
    QMap<QString,QString> metadata;
Anna Udovichenko's avatar
Anna Udovichenko committed
158 159 160 161 162
};
Q_DECLARE_METATYPE( UBFeature )

class UBFeaturesController : public QObject
{
163 164
friend class UBFeaturesWidget;

Anna Udovichenko's avatar
Anna Udovichenko committed
165
Q_OBJECT
166

Anna Udovichenko's avatar
Anna Udovichenko committed
167
public:
Claudio Valerio's avatar
Claudio Valerio committed
168
    UBFeaturesController(QWidget *parentWidget);
Anna Udovichenko's avatar
Anna Udovichenko committed
169 170
    virtual ~UBFeaturesController();

171
    QList <UBFeature>* getFeatures() const {return featuresList;}
-f's avatar
-f committed
172

173 174
    const QString& getRootPath()const {return rootPath;}
    void scanFS();
Anna Udovichenko's avatar
Anna Udovichenko committed
175

176 177 178 179
    void addItemToPage(const UBFeature &item);
    void addItemAsBackground(const UBFeature &item);
    const UBFeature& getCurrentElement()const {return currentElement;}
    void setCurrentElement( const UBFeature &elem ) {currentElement = elem;}
Claudio Valerio's avatar
Claudio Valerio committed
180
    const UBFeature & getTrashElement () const { return trashElement; }
181

182
    void addDownloadedFile( const QUrl &sourceUrl, const QByteArray &pData, const QString pContentSource, const QString pTitle );
183

Claudio Valerio's avatar
Claudio Valerio committed
184 185
    UBFeature moveItemToFolder( const QUrl &url, const UBFeature &destination );
    UBFeature copyItemToFolder( const QUrl &url, const UBFeature &destination );
186
    void moveExternalData(const QUrl &url, const UBFeature &destination);
187 188 189 190

    void rescanModel();
    void siftElements(const QString &pSiftValue);
    //TODO make less complicated for betteer maintainence
191
    UBFeature getFeature(const QModelIndex &index, const QString &listName);
192 193 194
    void searchStarted(const QString &pattern, QListView *pOnView);
    void refreshModels();

Claudio Valerio's avatar
Claudio Valerio committed
195
    void deleteItem( const QUrl &url );
196
    void deleteItem(const UBFeature &pFeature);
Claudio Valerio's avatar
Claudio Valerio committed
197
    bool isTrash( const QUrl &url );
198 199 200
    void moveToTrash(UBFeature feature, bool deleteManualy = false);
    void addToFavorite( const QUrl &path );
    void removeFromFavorite(const QUrl &path, bool deleteManualy = false);
201 202
    void importImage(const QImage &image, const QString &fileName = QString());
    void importImage( const QImage &image, const UBFeature &destination, const QString &fileName = QString() );
203
    QStringList getFileNamesInFolders();
204

205
    void fileSystemScan(const QUrl &currPath, const QString & currVirtualPath);
206
    int featuresCount(const QUrl &currPath);
207
    static UBFeatureElementType fileTypeFromUrl( const QString &path );
208

Claudio Valerio's avatar
Claudio Valerio committed
209
    static QString fileNameFromUrl( const QUrl &url );
210
    static QImage getIcon( const QString &path, UBFeatureElementType pFType );
Claudio Valerio's avatar
Claudio Valerio committed
211
    static bool isDeletable( const QUrl &url );
212
    static char featureTypeSplitter() {return ':';}
213
    static QString categoryNameForVirtualPath(const QString &str);
214 215 216

    static const QString virtualRootName;

Claudio Valerio's avatar
Claudio Valerio committed
217
    void assignFeaturesListView(UBFeaturesListView *pList);
218 219
    void assignPathListView(UBFeaturesListView *pList);

Ilia Ryabokon's avatar
Ilia Ryabokon committed
220 221 222 223 224 225 226 227 228 229 230 231 232
public:
    static const QString rootPath;
    static const QString audiosPath;
    static const QString moviesPath;
    static const QString picturesPath;
    static const QString appPath;
    static const QString flashPath;
    static const QString shapesPath;
    static const QString interactPath;
    static const QString trashPath;
    static const QString favoritePath;
    static const QString webSearchPath;

233 234 235 236 237
signals:
    void maxFilesCountEvaluated(int pLimit);
    void scanStarted();
    void scanFinished();
    void featureAddedFromThread();
238 239
    void scanCategory(const QString &);
    void scanPath(const QString &);
240 241 242 243

private slots:
    void addNewFolder(QString name);
    void startThread();
244
    void createNpApiFeature(const QString &str);
245

Anna Udovichenko's avatar
Anna Udovichenko committed
246
private:
247 248 249 250 251 252 253 254 255

    UBFeaturesItemDelegate *itemDelegate;
    UBFeaturesPathItemDelegate *pathItemDelegate;

    UBFeaturesModel *featuresModel;
    UBFeaturesProxyModel *featuresProxyModel;
    UBFeaturesSearchProxyModel *featuresSearchModel;
    UBFeaturesPathProxyModel *featuresPathModel;

256 257
    QAbstractItemModel *curListModel;
    UBFeaturesComputingThread mCThread;
258 259 260

private:

261
    static QImage createThumbnail(const QString &path);
Claudio Valerio's avatar
Claudio Valerio committed
262 263 264
    //void addImageToCurrentPage( const QString &path );
    void loadFavoriteList();
    void saveFavoriteList();
265 266
    QString uniqNameForFeature(const UBFeature &feature, const QString &pName = "Imported", const QString &pExtention = "") const;
    QString adjustName(const QString &str);
267

268
    QList <UBFeature> *featuresList;
Anna Udovichenko's avatar
Anna Udovichenko committed
269

Claudio Valerio's avatar
Claudio Valerio committed
270
    QUrl mUserAudioDirectoryPath;
271 272 273 274
    QUrl mUserVideoDirectoryPath;
    QUrl mUserPicturesDirectoryPath;
    QUrl mUserInteractiveDirectoryPath;
    QUrl mUserAnimationDirectoryPath;
Anna Udovichenko's avatar
Anna Udovichenko committed
275

Claudio Valerio's avatar
Claudio Valerio committed
276
    QString libraryPath;
277
    QUrl mLibPicturesDirectoryPath;
Claudio Valerio's avatar
Claudio Valerio committed
278 279
    QUrl mLibAudiosDirectoryPath;
    QUrl mLibVideosDirectoryPath;
280
    QUrl mLibInteractiveDirectoryPath;
281
    QUrl mLibAnimationsDirectoryPath;
Claudio Valerio's avatar
Claudio Valerio committed
282 283
    QUrl mLibApplicationsDirectoryPath;
    QUrl mLibShapesDirectoryPath;
284

Claudio Valerio's avatar
Claudio Valerio committed
285 286
    QUrl trashDirectoryPath;
    QUrl mLibSearchDirectoryPath;
Anna Udovichenko's avatar
Anna Udovichenko committed
287

Ilia Ryabokon's avatar
Ilia Ryabokon committed
288

Anna Udovichenko's avatar
Anna Udovichenko committed
289

Claudio Valerio's avatar
Claudio Valerio committed
290 291
    int mLastItemOffsetIndex;
    UBFeature currentElement;
292 293 294

    UBFeature rootElement;
    UBFeature favoriteElement;
Claudio Valerio's avatar
Claudio Valerio committed
295 296 297 298
    UBFeature audiosElement;
    UBFeature moviesElement;
    UBFeature picturesElement;
    UBFeature interactElement;
299
    UBFeature applicationsElement;
Claudio Valerio's avatar
Claudio Valerio committed
300 301 302
    UBFeature flashElement;
    UBFeature shapesElement;
    UBFeature webSearchElement;
303

Claudio Valerio's avatar
Claudio Valerio committed
304
    QSet <QUrl> *favoriteSet;
Anna Udovichenko's avatar
Anna Udovichenko committed
305

306 307
public:
    UBFeature trashElement;
308
    UBFeature getDestinationFeatureForUrl( const QUrl &url );
309
    UBFeature getDestinationFeatureForMimeType(const QString &pMmimeType);
Anna Udovichenko's avatar
Anna Udovichenko committed
310

311
};
Anna Udovichenko's avatar
Anna Udovichenko committed
312

Ivan Ilin's avatar
Ivan Ilin committed
313
#endif