From 984b72d31b42f9457e17b7c093b80f88a6ffd29f Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 15 Jul 2015 14:44:59 +0200 Subject: Polish the new filesystembrowser example. Introduce a special model that provides more information. Replace numerical permissions column by a readable, ls-style string and add size/date columns. On activation, launch the file using Qt.openUrlExternally() with the local file URL. Change-Id: Ic0801e40cc3ad8498129da06670ba7e11bbf8003 Reviewed-by: Gabriel de Dietrich --- examples/quick/controls/filesystembrowser/main.cpp | 87 +++++++++++++++++++++- examples/quick/controls/filesystembrowser/main.qml | 16 +++- 2 files changed, 101 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/quick/controls/filesystembrowser/main.cpp b/examples/quick/controls/filesystembrowser/main.cpp index e64a9a22..176d334c 100644 --- a/examples/quick/controls/filesystembrowser/main.cpp +++ b/examples/quick/controls/filesystembrowser/main.cpp @@ -42,13 +42,98 @@ #include #include #include +#include +#include +#include + +static inline QString permissionString(const QFileInfo &fi) +{ + const QFile::Permissions permissions = fi.permissions(); + QString result = QLatin1String("----------"); + if (fi.isSymLink()) + result[0] = QLatin1Char('l'); + else if (fi.isDir()) + result[0] = QLatin1Char('d'); + if (permissions & QFileDevice::ReadUser) + result[1] = QLatin1Char('r'); + if (permissions & QFileDevice::WriteUser) + result[2] = QLatin1Char('w'); + if (permissions & QFileDevice::ExeUser) + result[3] = QLatin1Char('x'); + if (permissions & QFileDevice::ReadGroup) + result[4] = QLatin1Char('r'); + if (permissions & QFileDevice::WriteGroup) + result[5] = QLatin1Char('w'); + if (permissions & QFileDevice::ExeGroup) + result[6] = QLatin1Char('x'); + if (permissions & QFileDevice::ReadOther) + result[7] = QLatin1Char('r'); + if (permissions & QFileDevice::WriteOther) + result[8] = QLatin1Char('w'); + if (permissions & QFileDevice::ExeOther) + result[9] = QLatin1Char('x'); + return result; +} + +static inline QString sizeString(const QFileInfo &fi) +{ + if (!fi.isFile()) + return QString(); + const qint64 size = fi.size(); + if (size > 1024 * 1024 * 10) + return QString::number(size / (1024 * 1024)) + QLatin1Char('M'); + if (size > 1024 * 10) + return QString::number(size / 1024) + QLatin1Char('K'); + return QString::number(size); +} + +class DisplayFileSystemModel : public QFileSystemModel { +public: + explicit DisplayFileSystemModel(QObject *parent = Q_NULLPTR) + : QFileSystemModel(parent) {} + + enum { + SizeRole = Qt::UserRole + 4, + DisplayableFilePermissionsRole = Qt::UserRole + 5, + LastModifiedRole = Qt::UserRole + 6, + UrlStringRole = Qt::UserRole + 7 // 263 + }; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE + { + if (index.isValid() && role >= SizeRole) { + switch (role) { + case SizeRole: + return QVariant(sizeString(fileInfo(index))); + case DisplayableFilePermissionsRole: + return QVariant(permissionString(fileInfo(index))); + case LastModifiedRole: + return QVariant(fileInfo(index).lastModified().toString(Qt::SystemLocaleShortDate)); + case UrlStringRole: + return QVariant(QUrl::fromLocalFile(filePath(index)).toString()); + default: + break; + } + } + return QFileSystemModel::data(index, role); + } + + QHash roleNames() const Q_DECL_OVERRIDE + { + QHash result = QFileSystemModel::roleNames(); + result.insert(SizeRole, QByteArrayLiteral("size")); + result.insert(DisplayableFilePermissionsRole, QByteArrayLiteral("displayableFilePermissions")); + result.insert(LastModifiedRole, QByteArrayLiteral("lastModified")); + return result; + } +}; int main(int argc, char *argv[]) { QApplication app(argc, argv); QQmlApplicationEngine engine; - QFileSystemModel *fsm = new QFileSystemModel(&engine); + QFileSystemModel *fsm = new DisplayFileSystemModel(&engine); fsm->setRootPath(QDir::homePath()); fsm->setResolveSymlinks(true); engine.rootContext()->setContextProperty("fileSystemModel", fsm); diff --git a/examples/quick/controls/filesystembrowser/main.qml b/examples/quick/controls/filesystembrowser/main.qml index 454a9f31..abc3c20c 100644 --- a/examples/quick/controls/filesystembrowser/main.qml +++ b/examples/quick/controls/filesystembrowser/main.qml @@ -98,12 +98,26 @@ ApplicationWindow { resizable: true } + TableViewColumn { + title: "Size" + role: "size" + resizable: true + horizontalAlignment : Text.AlignRight + } + TableViewColumn { title: "Permissions" - role: "filePermissions" + role: "displayableFilePermissions" + resizable: true + } + + TableViewColumn { + title: "Date Modified" + role: "lastModified" resizable: true } onDoubleClicked: isExpanded(index) ? collapse(index) : expand(index) + onActivated : Qt.openUrlExternally(fileSystemModel.data(index, 263)) } } -- cgit v1.2.1