/* * Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifndef FM_FOLDERMODEL_H #define FM_FOLDERMODEL_H #include "libfmqtglobals.h" #include #include #include #include #include #include #include #include #include #include "foldermodelitem.h" #include "core/folder.h" #include "core/thumbnailjob.h" namespace Fm { class LIBFM_QT_API FolderModel : public QAbstractListModel { Q_OBJECT public: enum Role { FileInfoRole = Qt::UserRole, FileIsDirRole, FileIsCutRole }; enum ColumnId { ColumnFileName, ColumnFileType, ColumnFileSize, ColumnFileMTime, ColumnFileOwner, NumOfColumns }; public: explicit FolderModel(); virtual ~FolderModel(); const std::shared_ptr& folder() const { return folder_; } void setFolder(const std::shared_ptr& new_folder); Fm::FilePath path() { return folder_ ? folder_->path() : Fm::FilePath(); } int rowCount(const QModelIndex& parent = QModelIndex()) const; int columnCount(const QModelIndex& parent) const; QVariant data(const QModelIndex& index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const; QModelIndex parent(const QModelIndex& index) const; // void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); Qt::ItemFlags flags(const QModelIndex& index) const; virtual QStringList mimeTypes() const; virtual QMimeData* mimeData(const QModelIndexList& indexes) const; virtual Qt::DropActions supportedDropActions() const; virtual bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); std::shared_ptr fileInfoFromIndex(const QModelIndex& index) const; FolderModelItem* itemFromIndex(const QModelIndex& index) const; QImage thumbnailFromIndex(const QModelIndex& index, int size); void cacheThumbnails(int size); void releaseThumbnails(int size); void setCutFiles(const QItemSelection& selection); Q_SIGNALS: void thumbnailLoaded(const QModelIndex& index, int size); void fileSizeChanged(const QModelIndex& index); protected Q_SLOTS: void onStartLoading(); void onFinishLoading(); void onFilesAdded(const Fm::FileInfoList& files); void onFilesChanged(std::vector& files); void onFilesRemoved(const Fm::FileInfoList& files); void onThumbnailLoaded(const std::shared_ptr& file, int size, const QImage& image); void onThumbnailJobFinished(); void loadPendingThumbnails(); protected: void queueLoadThumbnail(const std::shared_ptr& file, int size); void insertFiles(int row, const Fm::FileInfoList& files); void removeAll(); QList::iterator findItemByPath(const Fm::FilePath& path, int* row); QList::iterator findItemByName(const char* name, int* row); QList::iterator findItemByFileInfo(const Fm::FileInfo* info, int* row); private: struct ThumbnailData { ThumbnailData(int size): size_{size}, refCount_{1} { } int size_; int refCount_; Fm::FileInfoList pendingThumbnails_; }; std::shared_ptr folder_; QList items; bool hasPendingThumbnailHandler_; std::vector pendingThumbnailJobs_; std::forward_list thumbnailData_; }; } #endif // FM_FOLDERMODEL_H