1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
4 #include "IPropertyTreeWidget.h"
6 #include "Controls/QNumericBox.h"
7 #include "Controls/ColorButton.h"
10 namespace PropertyTree2
12 class CTextWidget
: public QLineEdit
, public IPropertyTreeWidget
15 Q_INTERFACES(IPropertyTreeWidget
)
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
;
27 QString m_previousValue
;
30 class CBoolWidget
: public QCheckBox
, public IPropertyTreeWidget
33 Q_INTERFACES(IPropertyTreeWidget
)
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
47 Q_INTERFACES(IPropertyTreeWidget
)
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; }
57 virtual void Call() = 0;
60 class CPtrTypeSelectWidget
: public QMenuComboBox
, public IPropertyTreeWidget
63 Q_INTERFACES(IPropertyTreeWidget
)
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
;
76 const yasli::ClassFactoryBase
* m_factory
;
77 yasli::TypeID m_baseTypeId
;
80 class CArrayWidget
: public QWidget
, public IPropertyTreeWidget
83 Q_INTERFACES(IPropertyTreeWidget
)
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
;
102 void ExecuteAction(yasli::ContainerInterface
* ci
) const;
103 bool IsArrayMutable() const;
108 QToolButton
* m_addElementButton
;
123 Action(ActionType t
= ActionType::None
, int a1
= -1, int a2
= -1) : type(t
), arg1(a1
), arg2(a2
) {}
126 int arg2
; //some actions use two indices, such as move(from,to)
128 void Serialize(Serialization::IArchive
& ar
);
134 class CStringListWidget
: public QMenuComboBox
, public IPropertyTreeWidget
137 Q_INTERFACES(IPropertyTreeWidget
)
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
;
148 template<typename List
>
149 void SetupCombo(const List
& list
);
152 class CColorwidget
: public CColorButton
, public IPropertyTreeWidget
155 Q_INTERFACES(IPropertyTreeWidget
)
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
;
170 //////////////////////////////////////////////////////////////////////////
172 class CNumberWidgetBase
: public QNumericBox
, public IPropertyTreeWidget
175 Q_INTERFACES(IPropertyTreeWidget
)
179 class CNumberWidget
: public CNumberWidgetBase
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
;
191 double m_previousValue
;
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
)
208 if (std::is_integral
<T
>::value
)
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
;
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
);
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())
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();
254 void CNumberWidget
<T
>::SetMultiEditValue()
257 setPlaceholderText("Multiple Values");
261 void CNumberWidget
<T
>::Serialize(Serialization::IArchive
& ar
)
263 //value() cannot be called with empty text, so it must be avoided
266 if (text() != QString())
268 double val
= value();
269 const double oldVal
= val
;
270 ar(val
, "value", "Value");
273 else if (ar
.isInput())
276 const bool found
= ar(val
, "value", "Value");
278 if (found
&& (text() == QString() || val
!= value()))