1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
// Copyright (C) 2016 The Qt Company Ltd.
// Copyright (C) 2016 Ivan Komissarov
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "storagemodel.h"
#include <QDir>
#include <QLocale>
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;
}
int StorageModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
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())
return QVariant();
if (role == Qt::DisplayRole) {
const QStorageInfo &volume = m_volumes.at(index.row());
switch (index.column()) {
case ColumnRootPath:
return QDir::toNativeSeparators(volume.rootPath());
case ColumnName:
return volume.name();
case ColumnDevice:
return volume.device();
case ColumnFileSystemName:
return volume.fileSystemType();
case ColumnTotal:
return QLocale().formattedDataSize(volume.bytesTotal());
case ColumnFree:
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:
return volume.isReadOnly();
case ColumnIsValid:
return volume.isValid();
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());
return tr("Root path : %1\n"
"Name: %2\n"
"Display Name: %3\n"
"Device: %4\n"
"FileSystem: %5\n"
"Total size: %6\n"
"Free size: %7\n"
"Available size: %8\n"
"Is Ready: %9\n"
"Is Read-only: %10\n"
"Is Valid: %11\n"
"Is Root: %12"
).
arg(QDir::toNativeSeparators(volume.rootPath())).
arg(volume.name()).
arg(volume.displayName()).
arg(QString::fromUtf8(volume.device())).
arg(QString::fromUtf8(volume.fileSystemType())).
arg(locale.formattedDataSize(volume.bytesTotal())).
arg(locale.formattedDataSize(volume.bytesFree())).
arg(locale.formattedDataSize(volume.bytesAvailable())).
arg(volume.isReady() ? tr("true") : tr("false")).
arg(volume.isReadOnly() ? tr("true") : tr("false")).
arg(volume.isValid() ? tr("true") : tr("false")).
arg(volume.isRoot() ? tr("true") : tr("false"));
}
return QVariant();
}
QVariant StorageModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (orientation != Qt::Horizontal)
return QVariant();
if (role != Qt::DisplayRole)
return QVariant();
switch (section) {
case ColumnRootPath:
return tr("Root Path");
case ColumnName:
return tr("Volume Name");
case ColumnDevice:
return tr("Device");
case ColumnFileSystemName:
return tr("File System");
case ColumnTotal:
return tr("Total");
case ColumnFree:
return tr("Free");
case ColumnAvailable:
return tr("Available");
case ColumnIsReady:
return tr("Ready");
case ColumnIsReadOnly:
return tr("Read-only");
case ColumnIsValid:
return tr("Valid");
default:
break;
}
return QVariant();
}
|