dust3d/application/sources/part_tree_widget.h

123 lines
5.5 KiB
C++

#ifndef DUST3D_APPLICATION_PART_TREE_WIDGET_H_
#define DUST3D_APPLICATION_PART_TREE_WIDGET_H_
#include <QTreeWidget>
#include <QMouseEvent>
#include <QTreeWidgetItem>
#include <QTimer>
#include <set>
#include <dust3d/base/uuid.h>
#include <dust3d/base/part_target.h>
#include <dust3d/base/part_base.h>
#include <dust3d/base/combine_mode.h>
class Document;
class PartTreeWidget : public QTreeWidget
{
Q_OBJECT
signals:
void currentComponentChanged(dust3d::Uuid componentId);
void moveComponentUp(dust3d::Uuid componentId);
void moveComponentDown(dust3d::Uuid componentId);
void moveComponentToTop(dust3d::Uuid componentId);
void moveComponentToBottom(dust3d::Uuid componentId);
void checkPart(dust3d::Uuid partId);
void createNewComponentAndMoveThisIn(dust3d::Uuid componentId);
void createNewChildComponent(dust3d::Uuid parentComponentId);
void renameComponent(dust3d::Uuid componentId, QString name);
void setComponentExpandState(dust3d::Uuid componentId, bool expanded);
void setPartTarget(dust3d::Uuid partId, dust3d::PartTarget target);
void setPartBase(dust3d::Uuid partId, dust3d::PartBase base);
void moveComponent(dust3d::Uuid componentId, dust3d::Uuid toParentId);
void removeComponent(dust3d::Uuid componentId);
void hideOtherComponents(dust3d::Uuid componentId);
void lockOtherComponents(dust3d::Uuid componentId);
void hideAllComponents();
void showAllComponents();
void showOrHideAllComponents();
void collapseAllComponents();
void expandAllComponents();
void lockAllComponents();
void unlockAllComponents();
void setPartLockState(dust3d::Uuid partId, bool locked);
void setPartVisibleState(dust3d::Uuid partId, bool visible);
void setPartColorState(dust3d::Uuid partId, bool hasColor, QColor color);
void setComponentCombineMode(dust3d::Uuid componentId, dust3d::CombineMode combineMode);
void hideDescendantComponents(dust3d::Uuid componentId);
void showDescendantComponents(dust3d::Uuid componentId);
void lockDescendantComponents(dust3d::Uuid componentId);
void unlockDescendantComponents(dust3d::Uuid componentId);
void addPartToSelection(dust3d::Uuid partId);
void groupOperationAdded();
public:
PartTreeWidget(const Document *document, QWidget *parent);
QTreeWidgetItem *findComponentItem(dust3d::Uuid componentId);
public slots:
void componentNameChanged(dust3d::Uuid componentId);
void componentChildrenChanged(dust3d::Uuid componentId);
void componentRemoved(dust3d::Uuid componentId);
void componentAdded(dust3d::Uuid componentId);
void componentExpandStateChanged(dust3d::Uuid componentId);
void componentCombineModeChanged(dust3d::Uuid componentId);
void componentTargetChanged(dust3d::Uuid componentId);
void partRemoved(dust3d::Uuid partId);
void partPreviewChanged(dust3d::Uuid partid);
void partLockStateChanged(dust3d::Uuid partId);
void partVisibleStateChanged(dust3d::Uuid partId);
void partSubdivStateChanged(dust3d::Uuid partId);
void partDisableStateChanged(dust3d::Uuid partId);
void partXmirrorStateChanged(dust3d::Uuid partId);
void partDeformChanged(dust3d::Uuid partId);
void partRoundStateChanged(dust3d::Uuid partId);
void partChamferStateChanged(dust3d::Uuid partId);
void partColorStateChanged(dust3d::Uuid partId);
void partCutRotationChanged(dust3d::Uuid partId);
void partCutFaceChanged(dust3d::Uuid partId);
void partHollowThicknessChanged(dust3d::Uuid partId);
void partMaterialIdChanged(dust3d::Uuid partId);
void partColorSolubilityChanged(dust3d::Uuid partId);
void partMetalnessChanged(dust3d::Uuid partId);
void partRoughnessChanged(dust3d::Uuid partId);
void partCountershadeStateChanged(dust3d::Uuid partId);
void partSmoothStateChanged(dust3d::Uuid partId);
void partChecked(dust3d::Uuid partId);
void partUnchecked(dust3d::Uuid partId);
void partComponentChecked(dust3d::Uuid partId);
void groupChanged(QTreeWidgetItem *item, int column);
void groupExpanded(QTreeWidgetItem *item);
void groupCollapsed(QTreeWidgetItem *item);
void removeAllContent();
void showContextMenu(const QPoint &pos, bool shorted=false);
protected:
QSize sizeHint() const override;
void mousePressEvent(QMouseEvent *event) override;
void mouseDoubleClickEvent(QMouseEvent *event) override;
private:
void addComponentChildrenToItem(dust3d::Uuid componentId, QTreeWidgetItem *parentItem);
void deleteItemChildren(QTreeWidgetItem *item);
void selectComponent(dust3d::Uuid componentId, bool multiple=false);
void updateComponentSelectState(dust3d::Uuid componentId, bool selected);
void updateComponentAppearance(dust3d::Uuid componentId);
bool isComponentSelected(dust3d::Uuid componentId);
std::vector<dust3d::Uuid> collectSelectedComponentIds(const QPoint &pos);
void handleSingleClick(const QPoint &pos);
void reloadComponentChildren(const dust3d::Uuid &componentId);
void removeComponentDelayedTimer(const dust3d::Uuid &componentId);
private:
const Document *m_document = nullptr;
QTreeWidgetItem *m_rootItem = nullptr;
bool m_firstSelect = true;
std::map<dust3d::Uuid, QTreeWidgetItem *> m_partItemMap;
std::map<dust3d::Uuid, QTreeWidgetItem *> m_componentItemMap;
QFont m_normalFont;
QFont m_selectedFont;
dust3d::Uuid m_currentSelectedComponentId;
QBrush m_hightlightedPartBackground;
dust3d::Uuid m_shiftStartComponentId;
std::set<dust3d::Uuid> m_selectedComponentIds;
std::map<dust3d::Uuid, QTimer *> m_delayedComponentTimers;
};
#endif