From 29b38bea45712c85a0c9f07bfa26524f3a35668f Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 20 Sep 2017 11:36:42 +0200 Subject: [PATCH] Polish the StorageView example Introduce nullptr and override. Change the ready/valid columns to use check marks. Right-align the numerical columns. Add a shortcut to refresh. Sort by path, making sure the root volume is first. Task-number: QTBUG-60635 Change-Id: I74cda7647f544902aaf4d2a0ab76986f1523aa6f Reviewed-by: Gatis Paeglis --- .../widgets/itemviews/storageview/main.cpp | 10 +++- .../itemviews/storageview/storagemodel.cpp | 53 +++++++++++++++++-- .../itemviews/storageview/storagemodel.h | 14 +++-- 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/examples/widgets/itemviews/storageview/main.cpp b/examples/widgets/itemviews/storageview/main.cpp index c8057186fc..f349e58fad 100644 --- a/examples/widgets/itemviews/storageview/main.cpp +++ b/examples/widgets/itemviews/storageview/main.cpp @@ -51,6 +51,7 @@ #include #include +#include #include #include "storagemodel.h" @@ -60,9 +61,16 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); QTreeView view; - view.setModel(new StorageModel(&view)); view.resize(640, 480); + view.setWindowTitle("Storage View"); view.setSelectionBehavior(QAbstractItemView::SelectRows); + + StorageModel *model = new StorageModel(&view); + model->refresh(); + QShortcut *refreshShortcut = new QShortcut(Qt::CTRL + Qt::Key_R, &view); + QObject::connect(refreshShortcut, &QShortcut::activated, model, &StorageModel::refresh); + view.setModel(model); + int columnCount = view.model()->columnCount(); for (int c = 0; c < columnCount; ++c) view.resizeColumnToContents(c); diff --git a/examples/widgets/itemviews/storageview/storagemodel.cpp b/examples/widgets/itemviews/storageview/storagemodel.cpp index 1395c9f208..063f126d86 100644 --- a/examples/widgets/itemviews/storageview/storagemodel.cpp +++ b/examples/widgets/itemviews/storageview/storagemodel.cpp @@ -54,14 +54,27 @@ #include #include #include +#include #include StorageModel::StorageModel(QObject *parent) : - QAbstractTableModel(parent), - m_volumes(QStorageInfo::mountedVolumes()) + QAbstractTableModel(parent) { } +void StorageModel::refresh() +{ + beginResetModel(); + m_volumes = QStorageInfo::mountedVolumes(); + std::sort(m_volumes.begin(), m_volumes.end(), + [](const QStorageInfo &st1, const QStorageInfo &st2) { + static const QString rootSortString = QStringLiteral(" "); + return (st1.isRoot() ? rootSortString : st1.rootPath()) + < (st2.isRoot() ? rootSortString : st2.rootPath()); + }); + endResetModel(); +} + int StorageModel::columnCount(const QModelIndex &/*parent*/) const { return ColumnCount; @@ -74,6 +87,22 @@ int StorageModel::rowCount(const QModelIndex &parent) const return m_volumes.count(); } +Qt::ItemFlags StorageModel::flags(const QModelIndex &index) const +{ + Qt::ItemFlags result = QAbstractTableModel::flags(index); + switch (index.column()) { + case ColumnAvailable: + case ColumnIsReady: + case ColumnIsReadOnly: + case ColumnIsValid: + result |= Qt::ItemIsUserCheckable; + break; + default: + break; + } + return result; +} + QVariant StorageModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) @@ -96,6 +125,12 @@ QVariant StorageModel::data(const QModelIndex &index, int role) const return QLocale().formattedDataSize(volume.bytesFree()); case ColumnAvailable: return QLocale().formattedDataSize(volume.bytesAvailable()); + default: + break; + } + } else if (role == Qt::CheckStateRole) { + const QStorageInfo &volume = m_volumes.at(index.row()); + switch (index.column()) { case ColumnIsReady: return volume.isReady(); case ColumnIsReadOnly: @@ -105,6 +140,16 @@ QVariant StorageModel::data(const QModelIndex &index, int role) const default: break; } + } else if (role == Qt::TextAlignmentRole) { + switch (index.column()) { + case ColumnTotal: + case ColumnFree: + case ColumnAvailable: + return Qt::AlignTrailing; + default: + break; + } + return Qt::AlignLeading; } else if (role == Qt::ToolTipRole) { QLocale locale; const QStorageInfo &volume = m_volumes.at(index.row()); @@ -147,13 +192,13 @@ QVariant StorageModel::headerData(int section, Qt::Orientation orientation, int switch (section) { case ColumnRootPath: - return tr("Root path"); + return tr("Root Path"); case ColumnName: return tr("Volume Name"); case ColumnDevice: return tr("Device"); case ColumnFileSystemName: - return tr("File system"); + return tr("File System"); case ColumnTotal: return tr("Total"); case ColumnFree: diff --git a/examples/widgets/itemviews/storageview/storagemodel.h b/examples/widgets/itemviews/storageview/storagemodel.h index 2b37414d8d..787b2f04de 100644 --- a/examples/widgets/itemviews/storageview/storagemodel.h +++ b/examples/widgets/itemviews/storageview/storagemodel.h @@ -74,13 +74,17 @@ public: ColumnCount }; - explicit StorageModel(QObject *parent = 0); + explicit StorageModel(QObject *parent = nullptr); - int columnCount(const QModelIndex &parent) const; - int rowCount(const QModelIndex &parent) const; + int columnCount(const QModelIndex &parent) const override; + int rowCount(const QModelIndex &parent) const override; - QVariant data(const QModelIndex &index, int role) const; - QVariant headerData(int section, Qt::Orientation orientation, int role) const; + QVariant data(const QModelIndex &index, int role) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + +public slots: + void refresh(); private: QList m_volumes;