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 165 166 167 168
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#pragma once
#include "QCMake.h"
#include "QCMakeSizeType.h"
#include <QItemDelegate>
#include <QSet>
#include <QStandardItemModel>
#include <QTreeView>
class QSortFilterProxyModel;
class QCMakeCacheModel;
class QCMakeAdvancedFilter;
/// Qt view class for cache properties
class QCMakeCacheView : public QTreeView
{
Q_OBJECT
public:
QCMakeCacheView(QWidget* p);
// retrieve the QCMakeCacheModel storing all the pointers
// this isn't necessarily the model one would get from model()
QCMakeCacheModel* cacheModel() const;
// get whether to show advanced entries
bool showAdvanced() const;
QSize sizeHint() const { return QSize(200, 200); }
// set the search filter string. any property key or value not matching will
// be filtered out
bool setSearchFilter(QString const&);
public slots:
// set whether to show advanced entries
void setShowAdvanced(bool);
protected:
QModelIndex moveCursor(CursorAction, Qt::KeyboardModifiers);
bool event(QEvent* e);
QCMakeCacheModel* CacheModel;
QCMakeAdvancedFilter* AdvancedFilter;
QSortFilterProxyModel* SearchFilter;
};
/// Qt model class for cache properties
class QCMakeCacheModel : public QStandardItemModel
{
Q_OBJECT
public:
QCMakeCacheModel(QObject* parent = nullptr);
~QCMakeCacheModel();
// roles used to retrieve extra data such has help strings, types of
// properties, and the advanced flag
enum
{
HelpRole = Qt::ToolTipRole,
TypeRole = Qt::UserRole,
AdvancedRole,
StringsRole,
GroupRole
};
enum ViewType
{
FlatView,
GroupView
};
public slots:
// set a list of properties. This list will be sorted and grouped according
// to prefix. Any property that existed already and which is found in this
// list of properties to set will become an old property. All others will
// become new properties and be marked red.
void setProperties(QCMakePropertyList const& props);
// set whether to show new properties in red
void setShowNewProperties(bool);
// clear everything from the model
void clear();
// set flag whether the model can currently be edited.
void setEditEnabled(bool);
// insert a new property at a row specifying all the information about the
// property
bool insertProperty(QCMakeProperty::PropertyType t, QString const& name,
QString const& description, QVariant const& value,
bool advanced);
public:
// get the properties
QCMakePropertyList properties() const;
// editing enabled
bool editEnabled() const;
// returns how many new properties there are
cm_qsizetype newPropertyCount() const;
// return flags (overloaded to modify flag based on EditEnabled flag)
Qt::ItemFlags flags(QModelIndex const& index) const;
QModelIndex buddy(QModelIndex const& idx) const;
// get the data in the model for this property
void getPropertyData(QModelIndex const& idx1, QCMakeProperty& prop) const;
// set the view type
void setViewType(ViewType t);
ViewType viewType() const;
protected:
bool EditEnabled;
cm_qsizetype NewPropertyCount;
bool ShowNewProperties;
ViewType View;
// set the data in the model for this property
void setPropertyData(QModelIndex const& idx1, QCMakeProperty const& p,
bool isNew);
// breaks up he property list into groups
// where each group has the same prefix up to the first underscore
static void breakProperties(QSet<QCMakeProperty> const& props,
QMap<QString, QCMakePropertyList>& result);
// gets the prefix of a string up to the first _
static QString prefix(QString const& s);
};
/// Qt delegate class for interaction (or other customization)
/// with cache properties
class QCMakeCacheModelDelegate : public QItemDelegate
{
Q_OBJECT
public:
QCMakeCacheModelDelegate(QObject* p);
/// create our own editors for cache properties
QWidget* createEditor(QWidget* parent, QStyleOptionViewItem const& option,
QModelIndex const& index) const;
bool editorEvent(QEvent* event, QAbstractItemModel* model,
QStyleOptionViewItem const& option,
QModelIndex const& index);
bool eventFilter(QObject* object, QEvent* event);
void setModelData(QWidget* editor, QAbstractItemModel* model,
QModelIndex const& index) const;
QSize sizeHint(QStyleOptionViewItem const& option,
QModelIndex const& index) const;
QSet<QCMakeProperty> changes() const;
void clearChanges();
protected slots:
void setFileDialogFlag(bool);
protected:
bool FileDialogFlag;
// record a change to an item in the model.
// this simply saves the item in the set of changes
void recordChange(QAbstractItemModel* model, QModelIndex const& index);
// properties changed by user via this delegate
QSet<QCMakeProperty> mChanges;
};
|