/* 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 #include #include #include 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); // set the view type void setViewType(ViewType t); ViewType viewType() const; 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; 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& props, QMap& 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 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 mChanges; };