1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
5 #include "PluginUtils.h"
7 #include <IActionMapManager.h> // #SchematycTODO : Remove dependency on CryAction!
8 #include <IResourceSelectorHost.h>
9 #include <ISourceControl.h>
10 #include <CryEntitySystem/IEntityClass.h>
11 #include <CryEntitySystem/IEntitySystem.h>
12 #include <Cry3DEngine/I3DEngine.h>
13 #include <CryGame/IGameFramework.h>
14 #include <CryString/CryStringUtils.h>
15 #include <CrySchematyc/Utils/Assert.h>
17 #include <Controls/DictionaryWidget.h>
18 #include <Controls/QPopupWidget.h>
23 #include <QApplication>
25 namespace CrySchematycEditor
{
33 class CStringListDictionaryEntry
: public CAbstractDictionaryEntry
35 friend class CStringListDictionary
;
38 CStringListDictionaryEntry() {}
39 virtual ~CStringListDictionaryEntry() {}
41 // CAbstractDictionaryEntry
42 virtual uint32
GetType() const override
{ return CAbstractDictionaryEntry::Type_Entry
; }
44 virtual QVariant
GetColumnValue(int32 columnIndex
) const override
46 if (columnIndex
== Column_Name
)
52 // ~CAbstractDictionaryEntry
54 QString
GetName() const { return m_name
; }
60 class CStringListDictionary
: public CAbstractDictionary
63 CStringListDictionary(const Serialization::StringListStatic
& names
)
67 CStringListDictionary(const Serialization::StringList
& names
)
71 virtual ~CStringListDictionary() {}
73 // CryGraphEditor::CAbstractDictionary
74 virtual void ResetEntries() override
{ m_func(); }
75 virtual int32
GetNumEntries() const override
{ return m_names
.size(); }
76 virtual const CAbstractDictionaryEntry
* GetEntry(int32 index
) const override
{ return (m_names
.size() > index
) ? &m_names
[index
] : nullptr; }
78 virtual int32
GetNumColumns() const override
{ return Column_COUNT
; };
79 virtual QString
GetColumnName(int32 index
) const override
81 if (index
== Column_Name
)
82 return QString("Name");
86 virtual int32
GetDefaultFilterColumn() const override
{ return Column_Name
; }
87 // ~CryGraphEditor::CAbstractDictionary
89 template <class StringList
> void Load(const StringList
& names
)
91 m_func
= std::bind([this, names
]()
93 for (string name
: names
)
95 CStringListDictionaryEntry entry
;
97 m_names
.emplace_back(entry
);
103 m_func
= std::bind([]() {});
107 std::function
<void()> m_func
;
108 std::vector
<CStringListDictionaryEntry
> m_names
;
111 class CActionMapActionQuickSearchOptions
: public IActionMapPopulateCallBack
114 CActionMapActionQuickSearchOptions()
116 IActionMapManager
* pActionMapManager
= gEnv
->pGameFramework
->GetIActionMapManager();
117 if (pActionMapManager
&& (pActionMapManager
->GetActionsCount() > 0))
119 pActionMapManager
->EnumerateActions(this);
123 // IActionMapPopulateCallBack
124 virtual void AddActionName(const char* const szName
) override
126 m_names
.push_back(szName
);
128 // ~IActionMapPopulateCallBack
130 Serialization::StringListStatic
& GetNames() { return m_names
; }
133 Serialization::StringListStatic m_names
;
140 dll_string
EntityClassNameSelector(const SResourceSelectorContext
& context
, const char* szPreviousValue
, Serialization::StringListValue
* pStringListValue
)
142 Serialization::StringListStatic names
;
144 IEntityClassRegistry
& entityClassRegistry
= *gEnv
->pEntitySystem
->GetClassRegistry();
145 entityClassRegistry
.IteratorMoveFirst();
147 while (IEntityClass
* pClass
= entityClassRegistry
.IteratorNext())
149 if ((pClass
->GetFlags() & ECLF_INVISIBLE
) != 0)
152 names
.push_back(pClass
->GetName());
155 CrySchematycEditor::CStringListDictionary
dict(names
);
156 CModalPopupDictionary
dictionary("Entity Class", dict
);
158 const QPoint pos
= QCursor::pos();
159 dictionary
.ExecAt(pos
);
161 CrySchematycEditor::CStringListDictionaryEntry
* pEntry
= static_cast<CrySchematycEditor::CStringListDictionaryEntry
*>(dictionary
.GetResult());
164 return QtUtil::ToString(pEntry
->GetName()).c_str();
170 dll_string
ActionMapNameSelector(const SResourceSelectorContext
& context
, const char* szPreviousValue
, Serialization::StringListValue
* pStringListValue
)
172 Serialization::StringListStatic names
;
174 IActionMapIteratorPtr itActionMap
= gEnv
->pGameFramework
->GetIActionMapManager()->CreateActionMapIterator();
175 while (IActionMap
* pActionMap
= itActionMap
->Next())
177 const char* szName
= pActionMap
->GetName();
178 if (strcmp(szName
, "default"))
180 names
.push_back(szName
);
184 CrySchematycEditor::CStringListDictionary
dict(names
);
185 CModalPopupDictionary
dictionary("Action Map", dict
);
187 const QPoint pos
= QCursor::pos();
188 dictionary
.ExecAt(pos
);
190 CrySchematycEditor::CStringListDictionaryEntry
* pEntry
= static_cast<CrySchematycEditor::CStringListDictionaryEntry
*>(dictionary
.GetResult());
193 return QtUtil::ToString(pEntry
->GetName()).c_str();
199 dll_string
ActionMapActionNameSelector(const SResourceSelectorContext
& context
, const char* szPreviousValue
, Serialization::StringListValue
* pStringListValue
)
201 CrySchematycEditor::CActionMapActionQuickSearchOptions quickSearchOptions
;
203 CrySchematycEditor::CStringListDictionary
dict(quickSearchOptions
.GetNames());
204 CModalPopupDictionary
dictionary("Action Map Action", dict
);
206 const QPoint pos
= QCursor::pos();
207 dictionary
.ExecAt(pos
);
209 CrySchematycEditor::CStringListDictionaryEntry
* pEntry
= static_cast<CrySchematycEditor::CStringListDictionaryEntry
*>(dictionary
.GetResult());
212 return QtUtil::ToString(pEntry
->GetName()).c_str();
218 dll_string
SurfaceTypeNameSelector(const SResourceSelectorContext
& context
, const char* szPreviousValue
, Serialization::StringListValue
* pStringListValue
)
220 Serialization::StringListStatic names
;
222 ISurfaceTypeEnumerator
* pEnumerator
= gEnv
->p3DEngine
->GetMaterialManager()->GetSurfaceTypeManager()->GetEnumerator();
223 for (ISurfaceType
* pSurfaceType
= pEnumerator
->GetFirst(); pSurfaceType
!= nullptr; pSurfaceType
= pEnumerator
->GetNext())
225 cstr name
= pSurfaceType
->GetName();
226 if (strlen(name
) >= 4 && !strncmp(name
, "mat_", 4))
228 names
.push_back(name
);
231 CrySchematycEditor::CStringListDictionary
dict(names
);
232 CModalPopupDictionary
dictionary("Surface Type", dict
);
234 const QPoint pos
= QCursor::pos();
235 dictionary
.ExecAt(pos
);
237 CrySchematycEditor::CStringListDictionaryEntry
* pEntry
= static_cast<CrySchematycEditor::CStringListDictionaryEntry
*>(dictionary
.GetResult());
240 return QtUtil::ToString(pEntry
->GetName()).c_str();
246 static dll_string
MannequinScopeContextName(const SResourceSelectorContext
& context
, const char* szPreviousValue
, Serialization::StringListValue
* pStringListValue
)
248 if (std::shared_ptr
<Serialization::SMannequinControllerDefResourceParams
> pParams
= std::static_pointer_cast
<Serialization::SMannequinControllerDefResourceParams
>(context
.pCustomParams
))
250 if (pParams
->pControllerDef
!= nullptr)
252 Serialization::StringListStatic names
;
254 for (int i
= 0, n
= pParams
->pControllerDef
->m_scopeContexts
.GetNum(); i
< n
; ++i
)
256 names
.push_back(pParams
->pControllerDef
->m_scopeContexts
.GetTagName(i
));
259 CrySchematycEditor::CStringListDictionary
dict(names
);
260 CModalPopupDictionary
dictionary("Mannequin Scope Context", dict
);
262 const QPoint pos
= QCursor::pos();
263 dictionary
.ExecAt(pos
);
265 CrySchematycEditor::CStringListDictionaryEntry
* pEntry
= static_cast<CrySchematycEditor::CStringListDictionaryEntry
*>(dictionary
.GetResult());
268 return QtUtil::ToString(pEntry
->GetName()).c_str();
276 static dll_string
MannequinFragmentName(const SResourceSelectorContext
& context
, const char* szPreviousValue
, Serialization::StringListValue
* pStringListValue
)
278 if (std::shared_ptr
<Serialization::SMannequinControllerDefResourceParams
> pParams
= std::static_pointer_cast
<Serialization::SMannequinControllerDefResourceParams
>(context
.pCustomParams
))
280 if (pParams
->pControllerDef
!= nullptr)
282 Serialization::StringListStatic names
;
284 for (int i
= 0, n
= pParams
->pControllerDef
->m_fragmentIDs
.GetNum(); i
< n
; ++i
)
286 names
.push_back(pParams
->pControllerDef
->m_fragmentIDs
.GetTagName(i
));
289 CrySchematycEditor::CStringListDictionary
dict(names
);
290 CModalPopupDictionary
dictionary("Mannequin Fragment", dict
);
292 const QPoint pos
= QCursor::pos();
293 dictionary
.ExecAt(pos
);
295 CrySchematycEditor::CStringListDictionaryEntry
* pEntry
= static_cast<CrySchematycEditor::CStringListDictionaryEntry
*>(dictionary
.GetResult());
298 return QtUtil::ToString(pEntry
->GetName()).c_str();
306 REGISTER_RESOURCE_SELECTOR("EntityClass", EntityClassNameSelector
, "")
307 REGISTER_RESOURCE_SELECTOR("ActionMap", ActionMapNameSelector
, "")
308 REGISTER_RESOURCE_SELECTOR("ActionMapAction", ActionMapActionNameSelector
, "")
309 REGISTER_RESOURCE_SELECTOR("SurfaceTypeName", SurfaceTypeNameSelector
, "")
310 REGISTER_RESOURCE_SELECTOR("MannequinScopeContextName", MannequinScopeContextName
, "")
311 REGISTER_RESOURCE_SELECTOR("MannequinFragmentName", MannequinFragmentName
, "")
314 namespace CrySchematycEditor
{
317 void ConstructAbsolutePath(Schematyc::IString
& output
, const char* szFileName
)
319 char currentDirectory
[512] = "";
320 GetCurrentDirectory(sizeof(currentDirectory
) - 1, currentDirectory
);
322 Schematyc::CStackString temp
= currentDirectory
;
324 temp
.append(szFileName
);
325 temp
.replace("/", "\\");
330 bool WriteToClipboard(const char* szText
, const char* szPrefix
)
332 SCHEMATYC_EDITOR_ASSERT(szText
);
335 QMimeData
* pMimeData
= new QMimeData();
337 pMimeData
->setData(szPrefix
, szText
);
339 pMimeData
->setText(szText
);
341 QClipboard
* pClipboard
= QApplication::clipboard();
342 pClipboard
->setMimeData(pMimeData
);
349 bool ReadFromClipboard(string
& text
, const char* szPrefix
)
351 QClipboard
* pClipboard
= QApplication::clipboard();
354 const QMimeData
* pMimeData
= pClipboard
->mimeData();
357 QByteArray byteArray
= pMimeData
->data(szPrefix
);
358 if (byteArray
.length() > 0)
360 text
.reserve(byteArray
.length());
361 text
.assign(byteArray
.data(), byteArray
.length());
367 text
= pMimeData
->text().toUtf8();
368 return text
.length() > 0;
376 bool ValidateClipboardContents(const char* szPrefix
)
378 SCHEMATYC_EDITOR_ASSERT(szPrefix
);
380 QClipboard
* pClipboard
= QApplication::clipboard();
383 const QMimeData
* pMimeData
= pClipboard
->mimeData();
384 QByteArray byteArray
= pMimeData
->data(szPrefix
);
385 if (byteArray
.length() > 0)