diff options
Diffstat (limited to 'examples/widgets/itemviews/editabletreemodel/treemodel.cpp')
-rw-r--r-- | examples/widgets/itemviews/editabletreemodel/treemodel.cpp | 162 |
1 files changed, 50 insertions, 112 deletions
diff --git a/examples/widgets/itemviews/editabletreemodel/treemodel.cpp b/examples/widgets/itemviews/editabletreemodel/treemodel.cpp index 9678e45be7..6511b06780 100644 --- a/examples/widgets/itemviews/editabletreemodel/treemodel.cpp +++ b/examples/widgets/itemviews/editabletreemodel/treemodel.cpp @@ -1,76 +1,26 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, 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 The Qt Company Ltd 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "treemodel.h" #include "treeitem.h" -#include <QtWidgets> +using namespace Qt::StringLiterals; //! [0] TreeModel::TreeModel(const QStringList &headers, const QString &data, QObject *parent) : QAbstractItemModel(parent) { - QVector<QVariant> rootData; + QVariantList rootData; for (const QString &header : headers) rootData << header; - rootItem = new TreeItem(rootData); - setupModelData(data.split('\n'), rootItem); + rootItem = std::make_unique<TreeItem>(rootData); + setupModelData(QStringView{data}.split(u'\n')); } //! [0] //! [1] -TreeModel::~TreeModel() -{ - delete rootItem; -} +TreeModel::~TreeModel() = default; //! [1] //! [2] @@ -84,10 +34,10 @@ int TreeModel::columnCount(const QModelIndex &parent) const QVariant TreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) - return QVariant(); + return {}; if (role != Qt::DisplayRole && role != Qt::EditRole) - return QVariant(); + return {}; TreeItem *item = getItem(index); @@ -108,39 +58,35 @@ Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const TreeItem *TreeModel::getItem(const QModelIndex &index) const { if (index.isValid()) { - TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); - if (item) + if (auto *item = static_cast<TreeItem*>(index.internalPointer())) return item; } - return rootItem; + return rootItem.get(); } //! [4] QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (orientation == Qt::Horizontal && role == Qt::DisplayRole) - return rootItem->data(section); - - return QVariant(); + return (orientation == Qt::Horizontal && role == Qt::DisplayRole) + ? rootItem->data(section) : QVariant{}; } //! [5] QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const { if (parent.isValid() && parent.column() != 0) - return QModelIndex(); + return {}; //! [5] //! [6] TreeItem *parentItem = getItem(parent); if (!parentItem) - return QModelIndex(); + return {}; - TreeItem *childItem = parentItem->child(row); - if (childItem) + if (auto *childItem = parentItem->child(row)) return createIndex(row, column, childItem); - return QModelIndex(); + return {}; } //! [6] @@ -172,15 +118,13 @@ bool TreeModel::insertRows(int position, int rows, const QModelIndex &parent) QModelIndex TreeModel::parent(const QModelIndex &index) const { if (!index.isValid()) - return QModelIndex(); + return {}; TreeItem *childItem = getItem(index); TreeItem *parentItem = childItem ? childItem->parent() : nullptr; - if (parentItem == rootItem || !parentItem) - return QModelIndex(); - - return createIndex(parentItem->childNumber(), 0, parentItem); + return (parentItem != rootItem.get() && parentItem != nullptr) + ? createIndex(parentItem->row(), 0, parentItem) : QModelIndex{}; } //! [7] @@ -212,6 +156,9 @@ bool TreeModel::removeRows(int position, int rows, const QModelIndex &parent) //! [8] int TreeModel::rowCount(const QModelIndex &parent) const { + if (parent.isValid() && parent.column() > 0) + return 0; + const TreeItem *parentItem = getItem(parent); return parentItem ? parentItem->childCount() : 0; @@ -246,55 +193,46 @@ bool TreeModel::setHeaderData(int section, Qt::Orientation orientation, return result; } -void TreeModel::setupModelData(const QStringList &lines, TreeItem *parent) +void TreeModel::setupModelData(const QList<QStringView> &lines) { - QVector<TreeItem*> parents; - QVector<int> indentations; - parents << parent; - indentations << 0; - - int number = 0; - - while (number < lines.count()) { - int position = 0; - while (position < lines[number].length()) { - if (lines[number].at(position) != ' ') - break; - ++position; - } + struct ParentIndentation + { + TreeItem *parent; + qsizetype indentation; + }; + + QList<ParentIndentation> state{{rootItem.get(), 0}}; - const QString lineData = lines[number].mid(position).trimmed(); + for (const auto &line : lines) { + qsizetype position = 0; + for ( ; position < line.length() && line.at(position).isSpace(); ++position) { + } + const QStringView lineData = line.sliced(position).trimmed(); if (!lineData.isEmpty()) { // Read the column data from the rest of the line. - const QStringList columnStrings = - lineData.split(QLatin1Char('\t'), Qt::SkipEmptyParts); - QVector<QVariant> columnData; - columnData.reserve(columnStrings.size()); - for (const QString &columnString : columnStrings) - columnData << columnString; - - if (position > indentations.last()) { + const auto columnStrings = lineData.split(u'\t', Qt::SkipEmptyParts); + QVariantList columnData; + columnData.reserve(columnStrings.count()); + for (const auto &columnString : columnStrings) + columnData << columnString.toString(); + + if (position > state.constLast().indentation) { // The last child of the current parent is now the new parent // unless the current parent has no children. - - if (parents.last()->childCount() > 0) { - parents << parents.last()->child(parents.last()->childCount()-1); - indentations << position; - } + auto *lastParent = state.constLast().parent; + if (lastParent->childCount() > 0) + state.append({lastParent->child(lastParent->childCount() - 1), position}); } else { - while (position < indentations.last() && parents.count() > 0) { - parents.pop_back(); - indentations.pop_back(); - } + while (position < state.constLast().indentation && !state.isEmpty()) + state.removeLast(); } // Append a new item to the current parent's list of children. - TreeItem *parent = parents.last(); + auto *parent = state.constLast().parent; parent->insertChildren(parent->childCount(), 1, rootItem->columnCount()); for (int column = 0; column < columnData.size(); ++column) - parent->child(parent->childCount() - 1)->setData(column, columnData[column]); + parent->child(parent->childCount() - 1)->setData(column, columnData.at(column)); } - ++number; } } |