File indexing completed on 2024-12-08 10:15:37
0001 /* This file is part of the KDE project 0002 Copyright (C) 2008-2018 JarosÅ‚aw Staniek <staniek@kde.org> 0003 0004 This library is free software; you can redistribute it and/or 0005 modify it under the terms of the GNU Library General Public 0006 License as published by the Free Software Foundation; either 0007 version 2 of the License, or (at your option) any later version. 0008 0009 This library is distributed in the hope that it will be useful, 0010 but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0012 Library General Public License for more details. 0013 0014 You should have received a copy of the GNU Library General Public License 0015 along with this library; see the file COPYING.LIB. If not, write to 0016 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0017 * Boston, MA 02110-1301, USA. 0018 */ 0019 0020 #ifndef KPROPERTY_EDITORVIEW_H 0021 #define KPROPERTY_EDITORVIEW_H 0022 0023 #include "kpropertywidgets_export.h" 0024 0025 #include <QTreeView> 0026 0027 class KProperty; 0028 class KPropertySet; 0029 class KPropertyEditorItemEvent; 0030 0031 //! @brief A widget for editing properties 0032 class KPROPERTYWIDGETS_EXPORT KPropertyEditorView : public QTreeView 0033 { 0034 Q_OBJECT 0035 public: 0036 /*! Creates an empty property editor with @a parent as parent widget. */ 0037 explicit KPropertyEditorView(QWidget *parent = nullptr); 0038 0039 ~KPropertyEditorView() override; 0040 0041 //! Options for changeSet() 0042 enum class SetOption { 0043 None = 0, 0044 PreservePreviousSelection = 1, //!< If used, previously selected editor item 0045 //!< will be kept selected. 0046 AlphabeticalOrder = 2 //!< Alphabetical order of properties. The default is order of insertion. 0047 }; 0048 Q_DECLARE_FLAGS(SetOptions, SetOption) 0049 0050 //! @return grid line color, defaultGridLineColor() by default 0051 QColor gridLineColor() const; 0052 0053 //! @return default grid line color - Qt::gray 0054 static QColor defaultGridLineColor() { return Qt::gray; } 0055 0056 //! Reimplemented to suggest widget size that is based on number of property items. 0057 QSize sizeHint() const override; 0058 0059 //! @return the property set object that is assigned to this view or nullptr is no set 0060 //! is currently assigned. 0061 KPropertySet* propertySet() const; 0062 0063 /*! @return @c true if items for parent composed properties are expanded so items for child 0064 properties are displayed. 0065 @since 3.1 */ 0066 bool childPropertyItemsExpanded() const; 0067 0068 /*! @return value of the valueSyncEnabled flag. 0069 @since 3.1 */ 0070 bool isValueSyncEnabled() const; 0071 0072 /*! @return @c true if the property groups should be visible. 0073 By default groups are visible. 0074 A group is visualized as a subtree displaying group caption and group icon at its root node 0075 (see KProperty::groupCaption and KProperty::groupIconName) and properties as children of this node. 0076 A property is assigned to a group while KPropertySet::addProperty() is called. 0077 0078 @note Regardless of this flag, no groups are displayed if there is only the default group 0079 "common". 0080 0081 When the group visibility flag is off or only the "common" group is present, all properties 0082 are displayed on the same (top) level. 0083 @since 3.1 */ 0084 bool groupsVisible() const; 0085 0086 /*! @return @c true if group items for newly added groups are exapanded so properties for these 0087 groups are displayed. 0088 @see setGroupItemsExpanded() 0089 @since 3.1 */ 0090 bool groupItemsExpanded() const; 0091 0092 /** 0093 * Returns @c true if the property editor widget has enabled visibility of tooltips 0094 * 0095 * Tooltips are displayed over each property item, both the name and value column, and are 0096 * equal to property descriptions (KProperty::description()). Tooltips are not displayed for 0097 * items having empty descriptions. 0098 * 0099 * Tooltips visibility is disabled by default. 0100 * @since 3.1 0101 */ 0102 bool toolTipsVisible() const; 0103 0104 public Q_SLOTS: 0105 /*! Populates the editor view with items for each property from the @a set set. 0106 Child items for composed properties are also created. 0107 See SetOption documentation for description of @a options options. 0108 If @a preservePreviousSelection is true, previously selected editor 0109 item will be kept selected, if present. */ 0110 void changeSet(KPropertySet *set, SetOptions options = SetOption::None); 0111 0112 /*! Populates the editor view with items for each property from the @a set set. 0113 Child items for composed properties are also created. 0114 If @a propertyToSelect is provided, item for this property name 0115 will be selected, if present. */ 0116 void changeSet(KPropertySet *set, const QByteArray& propertyToSelect, SetOptions options = SetOption::None); 0117 0118 /*! If @a set is @c true (the default), items for parent composed properties are expanded 0119 so items for child properties are displayed. 0120 If @a set is @c false, the items are collapsed. 0121 @note Appearance of the existing child items is not altered. This method can be typically called 0122 before a changeSet() call or before adding properties. 0123 @note Expansion of group items is not affected by this method. Use setGroupItemsExpanded() 0124 to control expansion of group items. 0125 @note To expand all items use expandAll(). To collapse all items use collapseAll(). 0126 @since 3.1 */ 0127 void setChildPropertyItemsExpanded(bool set); 0128 0129 /*! If @a set is @c true (the default), property values are automatically synchronized as 0130 soon as editor contents change (e.g. every time the user types a character) 0131 and the values are saved back to the assigned property set. 0132 If @a enable is false, property set is updated only when selection within the property editor 0133 or user presses Enter/Return key. 0134 Each property can override this policy by changing its own valueSyncPolicy flag. 0135 @see KProperty::setValueSyncPolicy() 0136 @since 3.1 */ 0137 void setValueSyncEnabled(bool set); 0138 0139 /*! Accepts the changes made to the current editor item (if any) 0140 (as if the user had pressed Enter key). */ 0141 void acceptInput(); 0142 0143 //! Sets color of grid lines. Use invalid color QColor() to hide grid lines. 0144 void setGridLineColor(const QColor& color); 0145 0146 /*! Shows the property groups if @a set is @c true. 0147 @see groupsVisible() 0148 @since 3.1 */ 0149 void setGroupsVisible(bool set); 0150 0151 /*! If @a set is @c true (the default), group items for newly added groups are exapanded 0152 so properties for these groups are displayed. 0153 If @a set is @c false, the items are collapsed. 0154 @note Appearance of the existing group items is not altered. This method can be typically called 0155 before a changeSet() call or before adding properties. 0156 @note Expansion of child items for composed properties is not affected by this method. 0157 Use setChildPropertyItemsExpanded() to control expansion child items for composed properties. 0158 @note To expand all items use expandAll(). To collapse all items use collapseAll(). 0159 @since 3.1 */ 0160 void setGroupItemsExpanded(bool set); 0161 0162 /** 0163 * If @a set is @c true tooltips are visible for property editor items 0164 * 0165 * See toolTipsVisible() for details. 0166 * @since 3.1 0167 */ 0168 void setToolTipsVisible(bool set); 0169 0170 Q_SIGNALS: 0171 /*! Emitted when current property set has been changed. May be 0. */ 0172 void propertySetChanged(KPropertySet *set); 0173 0174 /** 0175 * Emitted when active property editor widget offers overriding of its editing behavior. 0176 * 0177 * See KPropertyEditorItemEvent for usage details. 0178 * 0179 * @note @a event is owned by the KPropertyEditorView object. 0180 * 0181 * @since 3.2 0182 */ 0183 void handlePropertyEditorItemEvent(KPropertyEditorItemEvent *event); 0184 0185 protected: 0186 bool viewportEvent(QEvent * event) override; 0187 0188 protected Q_SLOTS: 0189 void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) override; 0190 void commitData(QWidget * editor) override; 0191 0192 /*! Called when current propertis of this set are about to be cleared. */ 0193 void slotSetWillBeCleared(); 0194 0195 /*! Called when current property set is about to be destroyed. */ 0196 void slotSetWillBeDeleted(); 0197 0198 /*! Called when property set's read-only flag has changed. 0199 Refreshes selection so editor is displayed again if needed. */ 0200 void slotReadOnlyFlagChanged(); 0201 0202 /*! Updates editor widget in the editor.*/ 0203 void slotPropertyChanged(KPropertySet& set, KProperty& property); 0204 0205 void slotPropertyReset(KPropertySet& set, KProperty& property); 0206 0207 private: 0208 /*! Used by changeSet(). */ 0209 void changeSetInternal(KPropertySet *set, SetOptions options, const QByteArray &propertyToSelect); 0210 bool edit(const QModelIndex &index, EditTrigger trigger, QEvent *event) override; 0211 void drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const override; 0212 0213 //! Reimplemented to draw group header text by hand. 0214 void drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 0215 0216 void mousePressEvent(QMouseEvent *event) override; 0217 0218 //! @return true if @a x is within the area of the revert button for @a index index. 0219 bool withinRevertButtonArea( int x, const QModelIndex& index ) const; 0220 0221 //! @return area of revert button, if it is displayed for @a index index. 0222 //! Otherwise invalid QRect is returned. 0223 QRect revertButtonArea( const QModelIndex& index ) const; 0224 0225 //! Updates item for @a index and all its children. 0226 void updateSubtree(const QModelIndex &index); 0227 0228 /*! Undoes the last change in the property editor.*/ 0229 void undo(); 0230 0231 Q_DISABLE_COPY(KPropertyEditorView) 0232 class Private; 0233 Private * const d; 0234 }; 0235 0236 Q_DECLARE_OPERATORS_FOR_FLAGS(KPropertyEditorView::SetOptions) 0237 0238 #endif