#pragma once #include "lc_array.h" struct lcPartProperties; class lcQPropertiesTreeDelegate; enum lcPropertyWidgetMode { LC_PROPERTY_WIDGET_EMPTY, LC_PROPERTY_WIDGET_PIECE, LC_PROPERTY_WIDGET_CAMERA, LC_PROPERTY_WIDGET_LIGHT, LC_PROPERTY_WIDGET_MULTIPLE }; class lcQPropertiesTree : public QTreeWidget { Q_OBJECT public: lcQPropertiesTree(QWidget *parent = 0); QSize sizeHint() const override; QTreeWidgetItem *indexToItem(const QModelIndex &index) const { return itemFromIndex(index); } void Update(const lcArray& Selection, lcObject* Focus); QWidget *createEditor(QWidget *parent, QTreeWidgetItem *item) const; bool lastColumn(int column) const; enum { PropertyTypeRole = Qt::UserRole, PropertyValueRole }; enum PropertyType { PropertyGroup, PropertyBool, PropertyFloat, PropertyFloatReadOnly, PropertyFloatLightSpotSize, PropertyFloatLightSpotFalloff, PropertyStep, PropertyString, PropertyStringList, PropertyLightFormat, PropertyLightShape, PropertyLightColor, PropertyColor, PropertyPart }; protected slots: void slotToggled(bool value); void slotReturnPressed(); void slotSetValue(int value); void slotColorButtonClicked(); void LightColorButtonClicked(); protected: void keyPressEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void updateColorEditor(QPushButton *editor, int value) const; void UpdateLightColorEditor(QPushButton* Editor, QColor Color) const; QTreeWidgetItem *addProperty(QTreeWidgetItem *parent, const QString& label, PropertyType propertyType); void SetEmpty(); void SetPiece(const lcArray& Selection, lcObject* Focus); void SetCamera(lcObject* Focus); void SetLight(lcObject* Focus); void SetMultiple(); lcLightType mLightType; int mLightShape; bool mPOVRayLight; lcPropertyWidgetMode mWidgetMode; lcObject* mFocus; lcQPropertiesTreeDelegate* mDelegate; QIcon m_expandIcon; QIcon m_checkedIcon; QIcon m_uncheckedIcon; QTreeWidgetItem *partPosition; QTreeWidgetItem *partPositionX; QTreeWidgetItem *partPositionY; QTreeWidgetItem *partPositionZ; QTreeWidgetItem *partRotation; QTreeWidgetItem *partRotationX; QTreeWidgetItem *partRotationY; QTreeWidgetItem *partRotationZ; QTreeWidgetItem *partVisibility; QTreeWidgetItem *partShow; QTreeWidgetItem *partHide; QTreeWidgetItem *partAppearance; QTreeWidgetItem *partColor; QTreeWidgetItem *partID; QTreeWidgetItem *cameraPosition; QTreeWidgetItem *cameraPositionX; QTreeWidgetItem *cameraPositionY; QTreeWidgetItem *cameraPositionZ; QTreeWidgetItem *cameraTarget; QTreeWidgetItem *cameraTargetX; QTreeWidgetItem *cameraTargetY; QTreeWidgetItem *cameraTargetZ; QTreeWidgetItem *cameraUp; QTreeWidgetItem *cameraUpX; QTreeWidgetItem *cameraUpY; QTreeWidgetItem *cameraUpZ; QTreeWidgetItem *cameraSettings; QTreeWidgetItem *cameraOrtho; QTreeWidgetItem *cameraFOV; QTreeWidgetItem *cameraNear; QTreeWidgetItem *cameraFar; QTreeWidgetItem *cameraName; QTreeWidgetItem *lightConfiguration; QTreeWidgetItem *lightPosition; QTreeWidgetItem *lightPositionX; QTreeWidgetItem *lightPositionY; QTreeWidgetItem *lightPositionZ; QTreeWidgetItem *lightTarget; QTreeWidgetItem *lightTargetX; QTreeWidgetItem *lightTargetY; QTreeWidgetItem *lightTargetZ; QTreeWidgetItem *lightColor; QTreeWidgetItem *lightColorIcon; QTreeWidgetItem *lightColorR; QTreeWidgetItem *lightColorG; QTreeWidgetItem *lightColorB; QTreeWidgetItem *lightProperties; QTreeWidgetItem *lightDiffuse; QTreeWidgetItem *lightSpecular; QTreeWidgetItem *lightCutoff; QTreeWidgetItem *lightEnableCutoff; QTreeWidgetItem *lightExponent; QTreeWidgetItem *mLightTypeItem; QTreeWidgetItem *lightSpotSize; QTreeWidgetItem *lightShape; QTreeWidgetItem *lightFactorA; QTreeWidgetItem *lightFactorB; QTreeWidgetItem *lightName; QTreeWidgetItem *lightFormat; QTreeWidgetItem *lightShadowless; QTreeWidgetItem *lightAreaGridRows; QTreeWidgetItem *lightAreaGridColumns; QTreeWidgetItem *lightSpotFalloff; QTreeWidgetItem *lightSpotTightness; }; class lcQPropertiesTreeDelegate : public QItemDelegate { Q_OBJECT public: lcQPropertiesTreeDelegate(QObject *parent = 0) : QItemDelegate(parent), m_treeWidget(0), m_editedItem(0), m_editedWidget(0), m_disablePainting(false) {} void setTreeWidget(lcQPropertiesTree *treeWidget) { m_treeWidget = treeWidget; } QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &) const override {} void setEditorData(QWidget *, const QModelIndex &) const override {} bool eventFilter(QObject *object, QEvent *event) override; QTreeWidgetItem *editedItem() const { return m_editedItem; } QWidget *editor() const { return m_editedWidget; } protected: void drawDecoration(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect, const QPixmap &pixmap) const override; void drawDisplay(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect, const QString &text) const override; private slots: void slotEditorDestroyed(QObject *object); private: int indentation(const QModelIndex &index) const; lcQPropertiesTree *m_treeWidget; mutable QTreeWidgetItem *m_editedItem; mutable QWidget *m_editedWidget; mutable bool m_disablePainting; };