Skip to content

Commit

Permalink
Add the StorageView example
Browse files Browse the repository at this point in the history
The StorageView example demonstrates the QStorageInfo API.

Change-Id: Ifaabadbe64fdf26d13a4ce4690e6b54514667c9f
Reviewed-by: Ivan Komissarov <[email protected]>
Reviewed-by: Shawn Rutledge <[email protected]>
  • Loading branch information
ABBAPOH committed Aug 14, 2014
1 parent 2635b94 commit b9d0116
Show file tree
Hide file tree
Showing 5 changed files with 327 additions and 1 deletion.
3 changes: 2 additions & 1 deletion examples/widgets/itemviews/itemviews.pro
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,6 @@ SUBDIRS = addressbook \
simplewidgetmapper \
spinboxdelegate \
spreadsheet \
stardelegate
stardelegate \
storageview
contains(DEFINES, QT_NO_DRAGANDDROP): SUBDIRS -= puzzle
62 changes: 62 additions & 0 deletions examples/widgets/itemviews/storageview/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Copyright (C) 2014 Ivan Komissarov
** Contact: http://www.qt-project.org/legal
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
** of its contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include <QtWidgets/QApplication>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QTreeView>

#include "storagemodel.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QTreeView view;
view.setModel(new StorageModel(&view));
view.resize(640, 480);
view.setSelectionBehavior(QAbstractItemView::SelectRows);
int columnCount = view.model()->columnCount();
for (int c = 0; c < columnCount; ++c)
view.resizeColumnToContents(c);
view.show();

return a.exec();
}
177 changes: 177 additions & 0 deletions examples/widgets/itemviews/storageview/storagemodel.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Copyright (C) 2014 Ivan Komissarov
** Contact: http://www.qt-project.org/legal
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
** of its contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "storagemodel.h"

#include <QDir>
#include <qmath.h>

static QString sizeToString(qint64 size)
{
static const char *const strings[] = { "b", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };

if (size <= 0)
return StorageModel::tr("0 b");

double power = log((double)size)/log(1024.0);
int intPower = (int)power;
intPower = intPower >= 8 ? 8 - 1 : intPower;

double normSize = size / pow(1024.0, intPower);
//: this should expand to "1.23 GB"
return StorageModel::tr("%1 %2").arg(normSize, 0, 'f', intPower > 0 ? 2 : 0).arg(strings[intPower]);
}

StorageModel::StorageModel(QObject *parent) :
QAbstractTableModel(parent),
m_volumes(QStorageInfo::mountedVolumes())
{
}

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();
}

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 sizeToString(volume.bytesTotal());
case ColumnFree:
return sizeToString(volume.bytesFree());
case ColumnAvailable:
return sizeToString(volume.bytesAvailable());
case ColumnIsReady:
return volume.isReady();
case ColumnIsReadOnly:
return volume.isReadOnly();
case ColumnIsValid:
return volume.isValid();
default:
break;
}
} else if (role == Qt::ToolTipRole) {
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(sizeToString(volume.bytesTotal())).
arg(sizeToString(volume.bytesFree())).
arg(sizeToString(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();
}
79 changes: 79 additions & 0 deletions examples/widgets/itemviews/storageview/storagemodel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Copyright (C) 2014 Ivan Komissarov
** Contact: http://www.qt-project.org/legal
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
** of its contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef STORAGEMODEL_H
#define STORAGEMODEL_H

#include <QAbstractTableModel>
#include <QStorageInfo>

class StorageModel : public QAbstractTableModel
{
Q_OBJECT
Q_DISABLE_COPY(StorageModel)
public:
enum Column {
ColumnRootPath = 0,
ColumnName,
ColumnDevice,
ColumnFileSystemName,
ColumnTotal,
ColumnFree,
ColumnAvailable,
ColumnIsReady,
ColumnIsReadOnly,
ColumnIsValid,
ColumnCount
};

explicit StorageModel(QObject *parent = 0);

int columnCount(const QModelIndex &parent) const;
int rowCount(const QModelIndex &parent) const;

QVariant data(const QModelIndex &index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;

private:
QList<QStorageInfo> m_volumes;
};

#endif // STORAGEMODEL_H
7 changes: 7 additions & 0 deletions examples/widgets/itemviews/storageview/storageview.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
QT += core gui widgets
TARGET = storageview
TEMPLATE = app
SOURCES += storagemodel.cpp \
main.cpp
HEADERS += \
storagemodel.h

0 comments on commit b9d0116

Please sign in to comment.