You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.9 KiB
168 lines
4.9 KiB
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#pragma once
|
|
|
|
#include "QCMake.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(const QString&);
|
|
|
|
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(const QCMakePropertyList& 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, const QString& name,
|
|
const QString& description, const QVariant& value,
|
|
bool advanced);
|
|
|
|
public:
|
|
// get the properties
|
|
QCMakePropertyList properties() const;
|
|
|
|
// editing enabled
|
|
bool editEnabled() const;
|
|
|
|
// returns how many new properties there are
|
|
int newPropertyCount() const;
|
|
|
|
// return flags (overloaded to modify flag based on EditEnabled flag)
|
|
Qt::ItemFlags flags(const QModelIndex& index) const;
|
|
QModelIndex buddy(const QModelIndex& idx) const;
|
|
|
|
// get the data in the model for this property
|
|
void getPropertyData(const QModelIndex& idx1, QCMakeProperty& prop) const;
|
|
|
|
// set the view type
|
|
void setViewType(ViewType t);
|
|
ViewType viewType() const;
|
|
|
|
protected:
|
|
bool EditEnabled;
|
|
int NewPropertyCount;
|
|
bool ShowNewProperties;
|
|
ViewType View;
|
|
|
|
// set the data in the model for this property
|
|
void setPropertyData(const QModelIndex& idx1, const QCMakeProperty& 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(const QSet<QCMakeProperty>& props,
|
|
QMap<QString, QCMakePropertyList>& result);
|
|
|
|
// gets the prefix of a string up to the first _
|
|
static QString prefix(const QString& 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, const QStyleOptionViewItem& option,
|
|
const QModelIndex& index) const;
|
|
bool editorEvent(QEvent* event, QAbstractItemModel* model,
|
|
const QStyleOptionViewItem& option,
|
|
const QModelIndex& index);
|
|
bool eventFilter(QObject* object, QEvent* event);
|
|
void setModelData(QWidget* editor, QAbstractItemModel* model,
|
|
const QModelIndex& index) const;
|
|
QSize sizeHint(const QStyleOptionViewItem& option,
|
|
const QModelIndex& 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, const QModelIndex& index);
|
|
|
|
// properties changed by user via this delegate
|
|
QSet<QCMakeProperty> mChanges;
|
|
};
|