From a89f575be3a410a06165dc19961b1a260a67464d Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Fri, 9 Jun 2023 10:51:40 +0200 Subject: Move storageview example into tests/manual The code is mostly an implementation of a model based on QStorageInfo, shown in an otherwise uninteresting tree view. Pick-to: 6.5 6.6 Change-Id: Id6ce70d71ddc9bcd6e82a9ee12f5e1af159eac7a Reviewed-by: Richard Moe Gustavsen --- examples/widgets/itemviews/CMakeLists.txt | 1 - examples/widgets/itemviews/itemviews.pro | 3 +- .../widgets/itemviews/storageview/CMakeLists.txt | 37 ----- examples/widgets/itemviews/storageview/main.cpp | 32 ---- .../widgets/itemviews/storageview/storagemodel.cpp | 164 --------------------- .../widgets/itemviews/storageview/storagemodel.h | 46 ------ .../widgets/itemviews/storageview/storageview.pro | 12 -- .../widgets/itemviews/storageview/CMakeLists.txt | 37 +++++ .../widgets/itemviews/storageview/main.cpp | 32 ++++ .../widgets/itemviews/storageview/storagemodel.cpp | 164 +++++++++++++++++++++ .../widgets/itemviews/storageview/storagemodel.h | 46 ++++++ .../widgets/itemviews/storageview/storageview.pro | 12 ++ 12 files changed, 292 insertions(+), 294 deletions(-) delete mode 100644 examples/widgets/itemviews/storageview/CMakeLists.txt delete mode 100644 examples/widgets/itemviews/storageview/main.cpp delete mode 100644 examples/widgets/itemviews/storageview/storagemodel.cpp delete mode 100644 examples/widgets/itemviews/storageview/storagemodel.h delete mode 100644 examples/widgets/itemviews/storageview/storageview.pro create mode 100644 tests/manual/examples/widgets/itemviews/storageview/CMakeLists.txt create mode 100644 tests/manual/examples/widgets/itemviews/storageview/main.cpp create mode 100644 tests/manual/examples/widgets/itemviews/storageview/storagemodel.cpp create mode 100644 tests/manual/examples/widgets/itemviews/storageview/storagemodel.h create mode 100644 tests/manual/examples/widgets/itemviews/storageview/storageview.pro diff --git a/examples/widgets/itemviews/CMakeLists.txt b/examples/widgets/itemviews/CMakeLists.txt index 8a6a448924..4a30dc3729 100644 --- a/examples/widgets/itemviews/CMakeLists.txt +++ b/examples/widgets/itemviews/CMakeLists.txt @@ -18,7 +18,6 @@ qt_internal_add_example(simplewidgetmapper) qt_internal_add_example(spinboxdelegate) qt_internal_add_example(spreadsheet) qt_internal_add_example(stardelegate) -qt_internal_add_example(storageview) if(QT_FEATURE_draganddrop) qt_internal_add_example(puzzle) endif() diff --git a/examples/widgets/itemviews/itemviews.pro b/examples/widgets/itemviews/itemviews.pro index 68ffd21b74..3f941679c7 100644 --- a/examples/widgets/itemviews/itemviews.pro +++ b/examples/widgets/itemviews/itemviews.pro @@ -17,7 +17,6 @@ SUBDIRS = addressbook \ simplewidgetmapper \ spinboxdelegate \ spreadsheet \ - stardelegate \ - storageview + stardelegate !qtConfig(draganddrop): SUBDIRS -= puzzle !qtHaveModule(xml): SUBDIRS -= simpledommodel diff --git a/examples/widgets/itemviews/storageview/CMakeLists.txt b/examples/widgets/itemviews/storageview/CMakeLists.txt deleted file mode 100644 index a2ac260938..0000000000 --- a/examples/widgets/itemviews/storageview/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(storageview LANGUAGES CXX) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/itemviews/storageview") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) - -qt_standard_project_setup() - -qt_add_executable(storageview - main.cpp - storagemodel.cpp storagemodel.h -) - -set_target_properties(storageview PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(storageview PRIVATE - Qt6::Core - Qt6::Gui - Qt6::Widgets -) - -install(TARGETS storageview - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/itemviews/storageview/main.cpp b/examples/widgets/itemviews/storageview/main.cpp deleted file mode 100644 index 3bd5392736..0000000000 --- a/examples/widgets/itemviews/storageview/main.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// Copyright (C) 2016 Ivan Komissarov -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include -#include -#include - -#include "storagemodel.h" - -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - - QTreeView view; - view.resize(640, 480); - view.setWindowTitle("Storage View"); - view.setSelectionBehavior(QAbstractItemView::SelectRows); - - StorageModel *model = new StorageModel(&view); - model->refresh(); - QShortcut *refreshShortcut = new QShortcut(QKeySequence::Refresh, &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); - view.show(); - - return a.exec(); -} diff --git a/examples/widgets/itemviews/storageview/storagemodel.cpp b/examples/widgets/itemviews/storageview/storagemodel.cpp deleted file mode 100644 index 194f8723f6..0000000000 --- a/examples/widgets/itemviews/storageview/storagemodel.cpp +++ /dev/null @@ -1,164 +0,0 @@ -// 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 -#include - -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(); -} diff --git a/examples/widgets/itemviews/storageview/storagemodel.h b/examples/widgets/itemviews/storageview/storagemodel.h deleted file mode 100644 index f8cc3289c8..0000000000 --- a/examples/widgets/itemviews/storageview/storagemodel.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// Copyright (C) 2016 Ivan Komissarov -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef STORAGEMODEL_H -#define STORAGEMODEL_H - -#include -#include - -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 - }; - - using QAbstractTableModel::QAbstractTableModel; - - int columnCount(const QModelIndex &parent) const override; - int rowCount(const QModelIndex &parent) const override; - - 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; -}; - -#endif // STORAGEMODEL_H diff --git a/examples/widgets/itemviews/storageview/storageview.pro b/examples/widgets/itemviews/storageview/storageview.pro deleted file mode 100644 index 2fdb78e7b8..0000000000 --- a/examples/widgets/itemviews/storageview/storageview.pro +++ /dev/null @@ -1,12 +0,0 @@ -QT += core gui widgets -requires(qtConfig(treeview)) -TARGET = storageview -TEMPLATE = app -SOURCES += storagemodel.cpp \ - main.cpp -HEADERS += \ - storagemodel.h - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/itemviews/storageview -INSTALLS += target diff --git a/tests/manual/examples/widgets/itemviews/storageview/CMakeLists.txt b/tests/manual/examples/widgets/itemviews/storageview/CMakeLists.txt new file mode 100644 index 0000000000..a2ac260938 --- /dev/null +++ b/tests/manual/examples/widgets/itemviews/storageview/CMakeLists.txt @@ -0,0 +1,37 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) +project(storageview LANGUAGES CXX) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/itemviews/storageview") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) + +qt_standard_project_setup() + +qt_add_executable(storageview + main.cpp + storagemodel.cpp storagemodel.h +) + +set_target_properties(storageview PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(storageview PRIVATE + Qt6::Core + Qt6::Gui + Qt6::Widgets +) + +install(TARGETS storageview + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/tests/manual/examples/widgets/itemviews/storageview/main.cpp b/tests/manual/examples/widgets/itemviews/storageview/main.cpp new file mode 100644 index 0000000000..3bd5392736 --- /dev/null +++ b/tests/manual/examples/widgets/itemviews/storageview/main.cpp @@ -0,0 +1,32 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// Copyright (C) 2016 Ivan Komissarov +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include +#include +#include + +#include "storagemodel.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + QTreeView view; + view.resize(640, 480); + view.setWindowTitle("Storage View"); + view.setSelectionBehavior(QAbstractItemView::SelectRows); + + StorageModel *model = new StorageModel(&view); + model->refresh(); + QShortcut *refreshShortcut = new QShortcut(QKeySequence::Refresh, &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); + view.show(); + + return a.exec(); +} diff --git a/tests/manual/examples/widgets/itemviews/storageview/storagemodel.cpp b/tests/manual/examples/widgets/itemviews/storageview/storagemodel.cpp new file mode 100644 index 0000000000..194f8723f6 --- /dev/null +++ b/tests/manual/examples/widgets/itemviews/storageview/storagemodel.cpp @@ -0,0 +1,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 +#include + +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(); +} diff --git a/tests/manual/examples/widgets/itemviews/storageview/storagemodel.h b/tests/manual/examples/widgets/itemviews/storageview/storagemodel.h new file mode 100644 index 0000000000..f8cc3289c8 --- /dev/null +++ b/tests/manual/examples/widgets/itemviews/storageview/storagemodel.h @@ -0,0 +1,46 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// Copyright (C) 2016 Ivan Komissarov +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef STORAGEMODEL_H +#define STORAGEMODEL_H + +#include +#include + +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 + }; + + using QAbstractTableModel::QAbstractTableModel; + + int columnCount(const QModelIndex &parent) const override; + int rowCount(const QModelIndex &parent) const override; + + 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; +}; + +#endif // STORAGEMODEL_H diff --git a/tests/manual/examples/widgets/itemviews/storageview/storageview.pro b/tests/manual/examples/widgets/itemviews/storageview/storageview.pro new file mode 100644 index 0000000000..2fdb78e7b8 --- /dev/null +++ b/tests/manual/examples/widgets/itemviews/storageview/storageview.pro @@ -0,0 +1,12 @@ +QT += core gui widgets +requires(qtConfig(treeview)) +TARGET = storageview +TEMPLATE = app +SOURCES += storagemodel.cpp \ + main.cpp +HEADERS += \ + storagemodel.h + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/widgets/itemviews/storageview +INSTALLS += target -- cgit v1.2.3