!XT (Code) Update copyright headers in Code/Sandbox.
[CRYENGINE.git] / Code / Sandbox / Plugins / EditorCommon / Serialization / QPropertyTree2 / PropertyTreeWidgets.h
blob4e6777f6a5bfa627ebf1d9ced5030cca4ce12ef2
1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
2 #pragma once
4 #include "IPropertyTreeWidget.h"
6 #include "Controls/QNumericBox.h"
7 #include "Controls/ColorButton.h"
8 #include <QCheckBox>
10 namespace PropertyTree2
12 class CTextWidget : public QLineEdit, public IPropertyTreeWidget
14 Q_OBJECT
15 Q_INTERFACES(IPropertyTreeWidget)
16 public:
17 CTextWidget();
19 void focusInEvent(QFocusEvent* e) final;
20 virtual void SetValue(void* valuePtr, const yasli::TypeID& type, const yasli::Archive& ar) final;
21 virtual void GetValue(void* valuePtr, const yasli::TypeID& type) const final;
22 virtual void Serialize(Serialization::IArchive& ar) final;
23 virtual bool SupportsMultiEdit() const final { return true; }
24 virtual void SetMultiEditValue() final;
26 private:
27 QString m_previousValue;
30 class CBoolWidget : public QCheckBox, public IPropertyTreeWidget
32 Q_OBJECT
33 Q_INTERFACES(IPropertyTreeWidget)
34 public:
35 CBoolWidget();
37 virtual void SetValue(void* valuePtr, const yasli::TypeID& type, const yasli::Archive& ar) final;
38 virtual void GetValue(void* valuePtr, const yasli::TypeID& type) const final;
39 virtual void Serialize(Serialization::IArchive& ar) final;
40 virtual bool SupportsMultiEdit() const final { return true; }
41 virtual void SetMultiEditValue() final;
44 class CButtonWidget : public QPushButton, public IPropertyTreeWidget
46 Q_OBJECT
47 Q_INTERFACES(IPropertyTreeWidget)
48 public:
49 CButtonWidget();
51 virtual void SetValue(void* valuePtr, const yasli::TypeID& type, const yasli::Archive& ar) override;
52 virtual void GetValue(void* valuePtr, const yasli::TypeID& type) const override;
53 virtual void Serialize(Serialization::IArchive& ar) final {}
54 virtual bool SupportsMultiEdit() const final { return false; }
56 protected:
57 virtual void Call() = 0;
60 class CPtrTypeSelectWidget : public QMenuComboBox, public IPropertyTreeWidget
62 Q_OBJECT
63 Q_INTERFACES(IPropertyTreeWidget)
64 public:
65 CPtrTypeSelectWidget();
67 virtual void SetValue(void* valuePtr, const yasli::TypeID& type, const yasli::Archive& ar) final;
68 virtual void GetValue(void* valuePtr, const yasli::TypeID& type) const final;
69 virtual void Serialize(Serialization::IArchive& ar) final;
70 virtual bool SupportsMultiEdit() const final { return true; }
71 virtual void SetMultiEditValue() final;
73 private:
74 void SetupCombo();
76 const yasli::ClassFactoryBase* m_factory;
77 yasli::TypeID m_baseTypeId;
80 class CArrayWidget : public QWidget, public IPropertyTreeWidget
82 Q_OBJECT
83 Q_INTERFACES(IPropertyTreeWidget)
84 public:
85 CArrayWidget();
87 virtual void SetValue(void* valuePtr, const yasli::TypeID& type, const yasli::Archive& ar) final;
88 virtual void GetValue(void* valuePtr, const yasli::TypeID& type) const final;
90 //TODO: Nothing to serialize for this row, but perhaps we want to serialize the entire subobject when copy/pasting this row ?
91 virtual void Serialize(Serialization::IArchive& ar) final;
93 virtual bool CanMoveChildren() const final;
94 virtual void MoveChild(int oldIndex, int newIndex) final;
96 virtual void PopulateContextMenu(QMenu* menu, const PropertyTree2::CRowModel* row) final;
97 virtual void PopulateChildContextMenu(QMenu* menu, const PropertyTree2::CRowModel* row) final;
98 virtual bool SupportsMultiEdit() const final { return true; }
99 virtual void SetMultiEditValue() final;
101 private:
102 void ExecuteAction(yasli::ContainerInterface* ci) const;
103 bool IsArrayMutable() const;
105 void OnAddItem();
106 void OnClearAll();
108 QToolButton* m_addElementButton;
109 bool m_variableSize;
110 bool m_ordered;
112 enum ActionType
114 None,
115 InsertItem,
116 MoveItem,
117 DeleteItem,
118 Resize
121 struct Action
123 Action(ActionType t = ActionType::None, int a1 = -1, int a2 = -1) : type(t), arg1(a1), arg2(a2) {}
124 ActionType type;
125 int arg1;
126 int arg2; //some actions use two indices, such as move(from,to)
128 void Serialize(Serialization::IArchive& ar);
131 Action m_action;
134 class CStringListWidget : public QMenuComboBox, public IPropertyTreeWidget
136 Q_OBJECT
137 Q_INTERFACES(IPropertyTreeWidget)
138 public:
139 CStringListWidget();
141 virtual void SetValue(void* valuePtr, const yasli::TypeID& type, const yasli::Archive& ar) final;
142 virtual void GetValue(void* valuePtr, const yasli::TypeID& type) const final;
143 virtual void Serialize(Serialization::IArchive& ar) final;
144 virtual bool SupportsMultiEdit() const final { return true; }
145 virtual void SetMultiEditValue() final;
147 private:
148 template<typename List>
149 void SetupCombo(const List& list);
152 class CColorwidget : public CColorButton, public IPropertyTreeWidget
154 Q_OBJECT
155 Q_INTERFACES(IPropertyTreeWidget)
156 public:
157 CColorwidget();
159 virtual void SetValue(void* valuePtr, const yasli::TypeID& type, const yasli::Archive& ar) final;
160 virtual void GetValue(void* valuePtr, const yasli::TypeID& type) const final;
161 virtual void Serialize(Serialization::IArchive& ar) final;
162 virtual bool SupportsMultiEdit() const final { return true; }
163 virtual void SetMultiEditValue() final;
165 void paintEvent(QPaintEvent* paintEvent) override;
166 private:
167 bool m_multiEdit;
170 //////////////////////////////////////////////////////////////////////////
172 class CNumberWidgetBase : public QNumericBox, public IPropertyTreeWidget
174 Q_OBJECT
175 Q_INTERFACES(IPropertyTreeWidget)
178 template<typename T>
179 class CNumberWidget : public CNumberWidgetBase
181 public:
182 CNumberWidget();
184 virtual void SetValue(void* valuePtr, const yasli::TypeID& type, const yasli::Archive& ar) final;
185 virtual void GetValue(void* valuePtr, const yasli::TypeID& type) const final;
186 virtual void Serialize(Serialization::IArchive& ar) final;
187 virtual bool SupportsMultiEdit() const final { return true; }
188 virtual void SetMultiEditValue() final;
190 private:
191 double m_previousValue;
194 template<typename T>
195 CNumberWidget<T>::CNumberWidget()
197 connect(this, &CNumberWidget::valueChanged, [this](double value)
199 if (m_previousValue != value)
200 OnContinuousChanged();
202 connect(this, &CNumberWidget::valueSubmitted, [this](double value)
204 if (m_previousValue != value)
205 OnChanged();
208 if (std::is_integral<T>::value)
209 setRestrictToInt();
210 else
211 setPrecision(3);
214 template<typename T>
215 void CNumberWidget<T>::SetValue(void* valuePtr, const yasli::TypeID& type, const yasli::Archive& ar)
217 if (type == yasli::TypeID::get<T>())
219 const T val = *(T*)valuePtr;
220 m_previousValue = val;
221 setValue(val);
223 else if (type == yasli::TypeID::get<yasli::RangeDecorator<T>>())
225 const yasli::RangeDecorator<T>& decorator = *(yasli::RangeDecorator<T>*)valuePtr;
226 m_previousValue = *decorator.value;
227 setMaximum(decorator.hardMax);
228 setMinimum(decorator.hardMin);
229 setSingleStep(decorator.singleStep);
230 setValue(m_previousValue);
235 template<typename T>
236 void CNumberWidget<T>::GetValue(void* valuePtr, const yasli::TypeID& type) const
238 //Do nothing if we are in the "multiple values" state
239 if (text() == QString())
240 return;
242 if (type == yasli::TypeID::get<T>())
244 *(T*)valuePtr = value();
246 else if (type == yasli::TypeID::get<yasli::RangeDecorator<T>>())
248 const yasli::RangeDecorator<T>& decorator = *(yasli::RangeDecorator<T>*)valuePtr;
249 *decorator.value = value();
253 template<typename T>
254 void CNumberWidget<T>::SetMultiEditValue()
256 setText("");
257 setPlaceholderText("Multiple Values");
260 template<typename T>
261 void CNumberWidget<T>::Serialize(Serialization::IArchive& ar)
263 //value() cannot be called with empty text, so it must be avoided
264 if (ar.isOutput())
266 if (text() != QString())
268 double val = value();
269 const double oldVal = val;
270 ar(val, "value", "Value");
273 else if (ar.isInput())
275 double val = 0.f;
276 const bool found = ar(val, "value", "Value");
278 if (found && (text() == QString() || val != value()))
280 setValue(val);
281 OnChanged();