!XT (BREAK-16) (Sandbox) Remove double-newlines at the end of files.
[CRYENGINE.git] / Code / Sandbox / Plugins / EditorSchematyc / PluginUtils.cpp
blob9f00ebccf8164e891060fec4687aff4bb15bd558
1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
3 #include "StdAfx.h"
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>
20 #include <QtUtil.h>
21 #include <QClipboard>
22 #include <QMimeData>
23 #include <QApplication>
25 namespace CrySchematycEditor {
27 enum EColumn : int32
29 Column_Name,
30 Column_COUNT
33 class CStringListDictionaryEntry : public CAbstractDictionaryEntry
35 friend class CStringListDictionary;
37 public:
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)
48 return m_name;
50 return QVariant();
52 // ~CAbstractDictionaryEntry
54 QString GetName() const { return m_name; }
56 private:
57 QString m_name;
60 class CStringListDictionary : public CAbstractDictionary
62 public:
63 CStringListDictionary(const Serialization::StringListStatic& names)
65 Load(names);
67 CStringListDictionary(const Serialization::StringList& names)
69 Load(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");
83 return QString();
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;
96 entry.m_name = name;
97 m_names.emplace_back(entry);
99 });
101 Reset();
103 m_func = std::bind([]() {});
106 private:
107 std::function<void()> m_func;
108 std::vector<CStringListDictionaryEntry> m_names;
111 class CActionMapActionQuickSearchOptions : public IActionMapPopulateCallBack
113 public:
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; }
132 private:
133 Serialization::StringListStatic m_names;
138 namespace {
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)
150 continue;
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());
162 if (pEntry)
164 return QtUtil::ToString(pEntry->GetName()).c_str();
167 return "";
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());
191 if (pEntry)
193 return QtUtil::ToString(pEntry->GetName()).c_str();
196 return "";
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());
210 if (pEntry)
212 return QtUtil::ToString(pEntry->GetName()).c_str();
215 return "";
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))
227 name += 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());
238 if (pEntry)
240 return QtUtil::ToString(pEntry->GetName()).c_str();
243 return "";
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());
266 if (pEntry)
268 return QtUtil::ToString(pEntry->GetName()).c_str();
273 return "";
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());
296 if (pEntry)
298 return QtUtil::ToString(pEntry->GetName()).c_str();
303 return "";
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 {
315 namespace Utils {
317 void ConstructAbsolutePath(Schematyc::IString& output, const char* szFileName)
319 char currentDirectory[512] = "";
320 GetCurrentDirectory(sizeof(currentDirectory) - 1, currentDirectory);
322 Schematyc::CStackString temp = currentDirectory;
323 temp.append("\\");
324 temp.append(szFileName);
325 temp.replace("/", "\\");
327 output.assign(temp);
330 bool WriteToClipboard(const char* szText, const char* szPrefix)
332 SCHEMATYC_EDITOR_ASSERT(szText);
333 if (szText)
335 QMimeData* pMimeData = new QMimeData();
336 if (szPrefix)
337 pMimeData->setData(szPrefix, szText);
338 else
339 pMimeData->setText(szText);
341 QClipboard* pClipboard = QApplication::clipboard();
342 pClipboard->setMimeData(pMimeData);
344 return true;
346 return false;
349 bool ReadFromClipboard(string& text, const char* szPrefix)
351 QClipboard* pClipboard = QApplication::clipboard();
352 if (pClipboard)
354 const QMimeData* pMimeData = pClipboard->mimeData();
355 if (szPrefix)
357 QByteArray byteArray = pMimeData->data(szPrefix);
358 if (byteArray.length() > 0)
360 text.reserve(byteArray.length());
361 text.assign(byteArray.data(), byteArray.length());
362 return true;
365 else
367 text = pMimeData->text().toUtf8();
368 return text.length() > 0;
372 text.clear();
373 return false;
376 bool ValidateClipboardContents(const char* szPrefix)
378 SCHEMATYC_EDITOR_ASSERT(szPrefix);
380 QClipboard* pClipboard = QApplication::clipboard();
381 if (pClipboard)
383 const QMimeData* pMimeData = pClipboard->mimeData();
384 QByteArray byteArray = pMimeData->data(szPrefix);
385 if (byteArray.length() > 0)
387 return true;
390 return false;