Revision control

Copy as Markdown

// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef QTREEWIDGET_H
#define QTREEWIDGET_H
#include <QtWidgets/qtreeview.h>
#include <QtWidgets/qtreewidgetitemiterator.h>
#include <QtWidgets/qtwidgetsglobal.h>
#include <QtCore/qlist.h>
#include <QtCore/qvariant.h>
QT_REQUIRE_CONFIG(treewidget);
QT_BEGIN_NAMESPACE
class QTreeWidget;
class QTreeModel;
class QWidgetItemData;
class QTreeWidgetItemPrivate;
class Q_WIDGETS_EXPORT QTreeWidgetItem
{
friend class QTreeModel;
friend class QTreeWidget;
friend class QTreeWidgetPrivate;
friend class QTreeWidgetItemIterator;
friend class QTreeWidgetItemPrivate;
public:
enum ItemType { Type = 0, UserType = 1000 };
explicit QTreeWidgetItem(int type = Type);
explicit QTreeWidgetItem(const QStringList &strings, int type = Type);
explicit QTreeWidgetItem(QTreeWidget *treeview, int type = Type);
QTreeWidgetItem(QTreeWidget *treeview, const QStringList &strings, int type = Type);
QTreeWidgetItem(QTreeWidget *treeview, QTreeWidgetItem *after, int type = Type);
explicit QTreeWidgetItem(QTreeWidgetItem *parent, int type = Type);
QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &strings, int type = Type);
QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *after, int type = Type);
QTreeWidgetItem(const QTreeWidgetItem &other);
virtual ~QTreeWidgetItem();
virtual QTreeWidgetItem *clone() const;
inline QTreeWidget *treeWidget() const { return view; }
void setSelected(bool select);
bool isSelected() const;
void setHidden(bool hide);
bool isHidden() const;
void setExpanded(bool expand);
bool isExpanded() const;
void setFirstColumnSpanned(bool span);
bool isFirstColumnSpanned() const;
inline void setDisabled(bool disabled);
inline bool isDisabled() const;
enum ChildIndicatorPolicy { ShowIndicator, DontShowIndicator, DontShowIndicatorWhenChildless };
void setChildIndicatorPolicy(QTreeWidgetItem::ChildIndicatorPolicy policy);
QTreeWidgetItem::ChildIndicatorPolicy childIndicatorPolicy() const;
Qt::ItemFlags flags() const;
void setFlags(Qt::ItemFlags flags);
inline QString text(int column) const
{ return data(column, Qt::DisplayRole).toString(); }
inline void setText(int column, const QString &text);
inline QIcon icon(int column) const
{ return qvariant_cast<QIcon>(data(column, Qt::DecorationRole)); }
inline void setIcon(int column, const QIcon &icon);
inline QString statusTip(int column) const
{ return data(column, Qt::StatusTipRole).toString(); }
inline void setStatusTip(int column, const QString &statusTip);
#if QT_CONFIG(tooltip)
inline QString toolTip(int column) const
{ return data(column, Qt::ToolTipRole).toString(); }
inline void setToolTip(int column, const QString &toolTip);
#endif
#if QT_CONFIG(whatsthis)
inline QString whatsThis(int column) const
{ return data(column, Qt::WhatsThisRole).toString(); }
inline void setWhatsThis(int column, const QString &whatsThis);
#endif
inline QFont font(int column) const
{ return qvariant_cast<QFont>(data(column, Qt::FontRole)); }
inline void setFont(int column, const QFont &font);
#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
inline int textAlignment(int column) const
{ return data(column, Qt::TextAlignmentRole).toInt(); }
#else
inline Qt::Alignment textAlignment(int column) const
{ return qvariant_cast<Qt::Alignment>(data(column, Qt::TextAlignmentRole)); }
#endif
#if QT_DEPRECATED_SINCE(6, 4)
QT_DEPRECATED_VERSION_X_6_4("Use the overload taking Qt::Alignment")
inline void setTextAlignment(int column, int alignment)
{ setData(column, Qt::TextAlignmentRole, alignment); }
inline void setTextAlignment(int column, Qt::AlignmentFlag alignment)
{ setData(column, Qt::TextAlignmentRole, QVariant::fromValue(Qt::Alignment(alignment))); }
#endif
inline void setTextAlignment(int column, Qt::Alignment alignment)
{ setData(column, Qt::TextAlignmentRole, QVariant::fromValue(alignment)); }
inline QBrush background(int column) const
{ return qvariant_cast<QBrush>(data(column, Qt::BackgroundRole)); }
inline void setBackground(int column, const QBrush &brush)
{ setData(column, Qt::BackgroundRole, brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }
inline QBrush foreground(int column) const
{ return qvariant_cast<QBrush>(data(column, Qt::ForegroundRole)); }
inline void setForeground(int column, const QBrush &brush)
{ setData(column, Qt::ForegroundRole, brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }
inline Qt::CheckState checkState(int column) const
{ return qvariant_cast<Qt::CheckState>(data(column, Qt::CheckStateRole)); }
inline void setCheckState(int column, Qt::CheckState state)
{ setData(column, Qt::CheckStateRole, state); }
inline QSize sizeHint(int column) const
{ return qvariant_cast<QSize>(data(column, Qt::SizeHintRole)); }
inline void setSizeHint(int column, const QSize &size)
{ setData(column, Qt::SizeHintRole, size.isValid() ? QVariant(size) : QVariant()); }
virtual QVariant data(int column, int role) const;
virtual void setData(int column, int role, const QVariant &value);
virtual bool operator<(const QTreeWidgetItem &other) const;
#ifndef QT_NO_DATASTREAM
virtual void read(QDataStream &in);
virtual void write(QDataStream &out) const;
#endif
QTreeWidgetItem &operator=(const QTreeWidgetItem &other);
inline QTreeWidgetItem *parent() const { return par; }
inline QTreeWidgetItem *child(int index) const {
if (index < 0 || index >= children.size())
return nullptr;
executePendingSort();
return children.at(index);
}
inline int childCount() const { return int(children.size()); }
inline int columnCount() const { return int(values.size()); }
inline int indexOfChild(QTreeWidgetItem *child) const;
void addChild(QTreeWidgetItem *child);
void insertChild(int index, QTreeWidgetItem *child);
void removeChild(QTreeWidgetItem *child);
QTreeWidgetItem *takeChild(int index);
void addChildren(const QList<QTreeWidgetItem*> &children);
void insertChildren(int index, const QList<QTreeWidgetItem*> &children);
QList<QTreeWidgetItem*> takeChildren();
inline int type() const { return rtti; }
inline void sortChildren(int column, Qt::SortOrder order)
{ sortChildren(column, order, false); }
protected:
void emitDataChanged();
private:
void sortChildren(int column, Qt::SortOrder order, bool climb);
QVariant childrenCheckState(int column) const;
void itemChanged();
void executePendingSort() const;
QTreeModel *treeModel(QTreeWidget *v = nullptr) const;
int rtti;
// One item has a vector of column entries. Each column has a vector of (role, value) pairs.
QList<QList<QWidgetItemData>> values;
QTreeWidget *view = nullptr;
QTreeWidgetItemPrivate *d;
QTreeWidgetItem *par = nullptr;
// ### Qt7: Move children to d-pointer and replace QList by a suitable data structure.
// to fix QTBUG-94546
QList<QTreeWidgetItem*> children;
Qt::ItemFlags itemFlags = Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled
| Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
};
inline void QTreeWidgetItem::setText(int column, const QString &atext)
{ setData(column, Qt::DisplayRole, atext); }
inline void QTreeWidgetItem::setIcon(int column, const QIcon &aicon)
{ setData(column, Qt::DecorationRole, aicon); }
#if QT_CONFIG(statustip)
inline void QTreeWidgetItem::setStatusTip(int column, const QString &astatusTip)
{ setData(column, Qt::StatusTipRole, astatusTip); }
#endif
#if QT_CONFIG(tooltip)
inline void QTreeWidgetItem::setToolTip(int column, const QString &atoolTip)
{ setData(column, Qt::ToolTipRole, atoolTip); }
#endif
#if QT_CONFIG(whatsthis)
inline void QTreeWidgetItem::setWhatsThis(int column, const QString &awhatsThis)
{ setData(column, Qt::WhatsThisRole, awhatsThis); }
#endif
inline void QTreeWidgetItem::setFont(int column, const QFont &afont)
{ setData(column, Qt::FontRole, afont); }
inline int QTreeWidgetItem::indexOfChild(QTreeWidgetItem *achild) const
{ executePendingSort(); return int(children.indexOf(achild)); }
#ifndef QT_NO_DATASTREAM
Q_WIDGETS_EXPORT QDataStream &operator<<(QDataStream &out, const QTreeWidgetItem &item);
Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &in, QTreeWidgetItem &item);
#endif
class QTreeWidgetPrivate;
class Q_WIDGETS_EXPORT QTreeWidget : public QTreeView
{
Q_OBJECT
Q_PROPERTY(int columnCount READ columnCount WRITE setColumnCount)
Q_PROPERTY(int topLevelItemCount READ topLevelItemCount)
#if QT_CONFIG(draganddrop)
Q_PROPERTY(Qt::DropActions supportedDragActions READ supportedDragActions WRITE setSupportedDragActions)
#endif
friend class QTreeModel;
friend class QTreeWidgetItem;
public:
explicit QTreeWidget(QWidget *parent = nullptr);
~QTreeWidget();
int columnCount() const;
void setColumnCount(int columns);
QTreeWidgetItem *invisibleRootItem() const;
QTreeWidgetItem *topLevelItem(int index) const;
int topLevelItemCount() const;
void insertTopLevelItem(int index, QTreeWidgetItem *item);
void addTopLevelItem(QTreeWidgetItem *item);
QTreeWidgetItem *takeTopLevelItem(int index);
int indexOfTopLevelItem(QTreeWidgetItem *item) const;
void insertTopLevelItems(int index, const QList<QTreeWidgetItem*> &items);
void addTopLevelItems(const QList<QTreeWidgetItem*> &items);
QTreeWidgetItem *headerItem() const;
void setHeaderItem(QTreeWidgetItem *item);
void setHeaderLabels(const QStringList &labels);
inline void setHeaderLabel(const QString &label);
QTreeWidgetItem *currentItem() const;
int currentColumn() const;
void setCurrentItem(QTreeWidgetItem *item);
void setCurrentItem(QTreeWidgetItem *item, int column);
void setCurrentItem(QTreeWidgetItem *item, int column, QItemSelectionModel::SelectionFlags command);
QTreeWidgetItem *itemAt(const QPoint &p) const;
inline QTreeWidgetItem *itemAt(int x, int y) const;
QRect visualItemRect(const QTreeWidgetItem *item) const;
int sortColumn() const;
void sortItems(int column, Qt::SortOrder order);
void editItem(QTreeWidgetItem *item, int column = 0);
void openPersistentEditor(QTreeWidgetItem *item, int column = 0);
void closePersistentEditor(QTreeWidgetItem *item, int column = 0);
using QAbstractItemView::isPersistentEditorOpen;
bool isPersistentEditorOpen(QTreeWidgetItem *item, int column = 0) const;
QWidget *itemWidget(QTreeWidgetItem *item, int column) const;
void setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget);
inline void removeItemWidget(QTreeWidgetItem *item, int column);
QList<QTreeWidgetItem*> selectedItems() const;
QList<QTreeWidgetItem*> findItems(const QString &text, Qt::MatchFlags flags,
int column = 0) const;
QTreeWidgetItem *itemAbove(const QTreeWidgetItem *item) const;
QTreeWidgetItem *itemBelow(const QTreeWidgetItem *item) const;
QModelIndex indexFromItem(const QTreeWidgetItem *item, int column = 0) const;
QTreeWidgetItem *itemFromIndex(const QModelIndex &index) const;
void setSelectionModel(QItemSelectionModel *selectionModel) override;
#if QT_CONFIG(draganddrop)
Qt::DropActions supportedDragActions() const;
void setSupportedDragActions(Qt::DropActions actions);
#endif
public Q_SLOTS:
void scrollToItem(const QTreeWidgetItem *item,
QAbstractItemView::ScrollHint hint = EnsureVisible);
void expandItem(const QTreeWidgetItem *item);
void collapseItem(const QTreeWidgetItem *item);
void clear();
Q_SIGNALS:
void itemPressed(QTreeWidgetItem *item, int column);
void itemClicked(QTreeWidgetItem *item, int column);
void itemDoubleClicked(QTreeWidgetItem *item, int column);
void itemActivated(QTreeWidgetItem *item, int column);
void itemEntered(QTreeWidgetItem *item, int column);
void itemChanged(QTreeWidgetItem *item, int column);
void itemExpanded(QTreeWidgetItem *item);
void itemCollapsed(QTreeWidgetItem *item);
void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
void itemSelectionChanged();
protected:
bool event(QEvent *e) override;
virtual QStringList mimeTypes() const;
virtual QMimeData *mimeData(const QList<QTreeWidgetItem *> &items) const;
virtual bool dropMimeData(QTreeWidgetItem *parent, int index,
const QMimeData *data, Qt::DropAction action);
virtual Qt::DropActions supportedDropActions() const;
#if QT_CONFIG(draganddrop)
void dropEvent(QDropEvent *event) override;
#endif
private:
void setModel(QAbstractItemModel *model) override;
Q_DECLARE_PRIVATE(QTreeWidget)
Q_DISABLE_COPY(QTreeWidget)
};
inline void QTreeWidget::removeItemWidget(QTreeWidgetItem *item, int column)
{ setItemWidget(item, column, nullptr); }
inline QTreeWidgetItem *QTreeWidget::itemAt(int ax, int ay) const
{ return itemAt(QPoint(ax, ay)); }
inline void QTreeWidget::setHeaderLabel(const QString &alabel)
{ setHeaderLabels(QStringList(alabel)); }
inline void QTreeWidgetItem::setDisabled(bool disabled)
{ setFlags(disabled ? (flags() & ~Qt::ItemIsEnabled) : flags() | Qt::ItemIsEnabled); }
inline bool QTreeWidgetItem::isDisabled() const
{ return !(flags() & Qt::ItemIsEnabled); }
QT_END_NAMESPACE
#endif // QTREEWIDGET_H