Selaa lähdekoodia

Delete in ResourceTreeView added
Fixed an issue with ProjectLibrary loading where entry parents weren't set

Marko Pintera 11 vuotta sitten
vanhempi
sitoutus
b6803f67fc

+ 1 - 0
CamelotClient/Include/BsGUIResourceTreeView.h

@@ -71,6 +71,7 @@ namespace BansheeEditor
 		virtual const TreeElement& getRootElementConst() const { return mRootElement; }
 		virtual const TreeElement& getRootElementConst() const { return mRootElement; }
 		virtual void updateTreeElementHierarchy();
 		virtual void updateTreeElementHierarchy();
 		virtual void renameTreeElement(TreeElement* element, const CM::WString& name);
 		virtual void renameTreeElement(TreeElement* element, const CM::WString& name);
+		virtual void deleteTreeElement(TreeElement* element);
 		virtual bool acceptDragAndDrop() const;
 		virtual bool acceptDragAndDrop() const;
 		virtual void dragAndDropStart();
 		virtual void dragAndDropStart();
 		virtual void dragAndDropEnded(TreeElement* overTreeElement);
 		virtual void dragAndDropEnded(TreeElement* overTreeElement);

+ 2 - 1
CamelotClient/Include/BsGUISceneTreeView.h

@@ -59,11 +59,12 @@ namespace BansheeEditor
 		virtual const TreeElement& getRootElementConst() const { return mRootElement; }
 		virtual const TreeElement& getRootElementConst() const { return mRootElement; }
 		virtual void updateTreeElementHierarchy();
 		virtual void updateTreeElementHierarchy();
 		virtual void renameTreeElement(TreeElement* element, const CM::WString& name);
 		virtual void renameTreeElement(TreeElement* element, const CM::WString& name);
+		virtual void deleteTreeElement(TreeElement* element);
 		virtual bool acceptDragAndDrop() const;
 		virtual bool acceptDragAndDrop() const;
 		virtual void dragAndDropStart();
 		virtual void dragAndDropStart();
 		virtual void dragAndDropEnded(TreeElement* overTreeElement);
 		virtual void dragAndDropEnded(TreeElement* overTreeElement);
 		virtual void dragAndDropFinalize();
 		virtual void dragAndDropFinalize();
 
 
-		void deleteTreeElement(TreeElement* element);
+		void deleteTreeElementInternal(TreeElement* element);
 	};
 	};
 }
 }

+ 2 - 0
CamelotClient/Include/BsGUITreeView.h

@@ -120,6 +120,7 @@ namespace BansheeEditor
 		float mMouseOverDragElementTime;
 		float mMouseOverDragElementTime;
 
 
 		static BS::VirtualButton mRenameVB;
 		static BS::VirtualButton mRenameVB;
+		static BS::VirtualButton mDeleteVB;
 
 
 		GUITreeView(BS::GUIWidget& parent, BS::GUIElementStyle* backgroundStyle, BS::GUIElementStyle* elementBtnStyle, 
 		GUITreeView(BS::GUIWidget& parent, BS::GUIElementStyle* backgroundStyle, BS::GUIElementStyle* elementBtnStyle, 
 			BS::GUIElementStyle* foldoutBtnStyle, BS::GUIElementStyle* selectionBackgroundStyle, BS::GUIElementStyle* editBoxStyle, 
 			BS::GUIElementStyle* foldoutBtnStyle, BS::GUIElementStyle* selectionBackgroundStyle, BS::GUIElementStyle* editBoxStyle, 
@@ -141,6 +142,7 @@ namespace BansheeEditor
 		virtual const TreeElement& getRootElementConst() const = 0;
 		virtual const TreeElement& getRootElementConst() const = 0;
 		virtual void updateTreeElementHierarchy() = 0;
 		virtual void updateTreeElementHierarchy() = 0;
 		virtual void renameTreeElement(TreeElement* element, const CM::WString& name) = 0;
 		virtual void renameTreeElement(TreeElement* element, const CM::WString& name) = 0;
+		virtual void deleteTreeElement(TreeElement* element) = 0;
 		virtual bool acceptDragAndDrop() const = 0;
 		virtual bool acceptDragAndDrop() const = 0;
 		virtual void dragAndDropStart() = 0;
 		virtual void dragAndDropStart() = 0;
 		virtual void dragAndDropEnded(TreeElement* overTreeElement) = 0;
 		virtual void dragAndDropEnded(TreeElement* overTreeElement) = 0;

+ 3 - 3
CamelotClient/Include/BsProjectLibrary.h

@@ -20,7 +20,7 @@ namespace BansheeEditor
 
 
 		struct LibraryEntry
 		struct LibraryEntry
 		{
 		{
-			LibraryEntry() {}
+			LibraryEntry();
 			LibraryEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent, LibraryEntryType type);
 			LibraryEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent, LibraryEntryType type);
 
 
 			LibraryEntryType type;
 			LibraryEntryType type;
@@ -32,7 +32,7 @@ namespace BansheeEditor
 
 
 		struct ResourceEntry : public LibraryEntry
 		struct ResourceEntry : public LibraryEntry
 		{
 		{
-			ResourceEntry() {}
+			ResourceEntry();
 			ResourceEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent);
 			ResourceEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent);
 
 
 			ResourceMetaPtr meta;
 			ResourceMetaPtr meta;
@@ -41,7 +41,7 @@ namespace BansheeEditor
 
 
 		struct DirectoryEntry : public LibraryEntry
 		struct DirectoryEntry : public LibraryEntry
 		{
 		{
-			DirectoryEntry() {}
+			DirectoryEntry();
 			DirectoryEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent);
 			DirectoryEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent);
 
 
 			CM::Vector<LibraryEntry*>::type mChildren;
 			CM::Vector<LibraryEntry*>::type mChildren;

+ 2 - 0
CamelotClient/Include/BsProjectLibraryEntriesRTTI.h

@@ -149,6 +149,7 @@ namespace CamelotFramework
 					BansheeEditor::ProjectLibrary::ResourceEntry* childResEntry = cm_new<BansheeEditor::ProjectLibrary::ResourceEntry>(); // Note: Assumes that ProjectLibrary takes care of the cleanup
 					BansheeEditor::ProjectLibrary::ResourceEntry* childResEntry = cm_new<BansheeEditor::ProjectLibrary::ResourceEntry>(); // Note: Assumes that ProjectLibrary takes care of the cleanup
 					memory = rttiReadElem(*childResEntry, memory);
 					memory = rttiReadElem(*childResEntry, memory);
 
 
+					childResEntry->parent = &data;
 					data.mChildren.push_back(childResEntry);
 					data.mChildren.push_back(childResEntry);
 				}
 				}
 				else if(childType == BansheeEditor::ProjectLibrary::LibraryEntryType::Directory)
 				else if(childType == BansheeEditor::ProjectLibrary::LibraryEntryType::Directory)
@@ -156,6 +157,7 @@ namespace CamelotFramework
 					BansheeEditor::ProjectLibrary::DirectoryEntry* childDirEntry = cm_new<BansheeEditor::ProjectLibrary::DirectoryEntry>(); // Note: Assumes that ProjectLibrary takes care of the cleanup
 					BansheeEditor::ProjectLibrary::DirectoryEntry* childDirEntry = cm_new<BansheeEditor::ProjectLibrary::DirectoryEntry>(); // Note: Assumes that ProjectLibrary takes care of the cleanup
 					memory = rttiReadElem(*childDirEntry, memory);
 					memory = rttiReadElem(*childDirEntry, memory);
 
 
+					childDirEntry->parent = &data;
 					data.mChildren.push_back(childDirEntry);
 					data.mChildren.push_back(childDirEntry);
 				}
 				}
 			}
 			}

+ 1 - 0
CamelotClient/Source/BsEditorApplication.cpp

@@ -54,6 +54,7 @@ namespace BansheeEditor
 			inputConfig->registerButton("Copy", BC_C, VButtonModifier::Ctrl);
 			inputConfig->registerButton("Copy", BC_C, VButtonModifier::Ctrl);
 			inputConfig->registerButton("Cut", BC_X, VButtonModifier::Ctrl);
 			inputConfig->registerButton("Cut", BC_X, VButtonModifier::Ctrl);
 			inputConfig->registerButton("Paste", BC_V, VButtonModifier::Ctrl);
 			inputConfig->registerButton("Paste", BC_V, VButtonModifier::Ctrl);
+			inputConfig->registerButton("Delete", BC_DELETE);
 		}
 		}
 
 
 		ProjectLibrary::startUp(cm_new<ProjectLibrary>(getActiveProjectPath()));
 		ProjectLibrary::startUp(cm_new<ProjectLibrary>(getActiveProjectPath()));

+ 7 - 0
CamelotClient/Source/BsGUIResourceTreeView.cpp

@@ -99,6 +99,13 @@ namespace BansheeEditor
 		ProjectLibrary::instance().moveEntry(oldPath, findUniquePath(newPath));
 		ProjectLibrary::instance().moveEntry(oldPath, findUniquePath(newPath));
 	}
 	}
 
 
+	void GUIResourceTreeView::deleteTreeElement(TreeElement* element) 
+	{
+		ResourceTreeElement* resourceTreeElement = static_cast<ResourceTreeElement*>(element);
+
+		ProjectLibrary::instance().deleteEntry(resourceTreeElement->mFullPath);
+	}
+
 	void GUIResourceTreeView::updateFromProjectLibraryEntry(ResourceTreeElement* treeElement, const ProjectLibrary::LibraryEntry* libraryEntry)
 	void GUIResourceTreeView::updateFromProjectLibraryEntry(ResourceTreeElement* treeElement, const ProjectLibrary::LibraryEntry* libraryEntry)
 	{
 	{
 		struct StackElem
 		struct StackElem

+ 7 - 2
CamelotClient/Source/BsGUISceneTreeView.cpp

@@ -129,7 +129,7 @@ namespace BansheeEditor
 				if(!tempToDelete[i])
 				if(!tempToDelete[i])
 					continue;
 					continue;
 
 
-				deleteTreeElement(element->mChildren[i]);
+				deleteTreeElementInternal(element->mChildren[i]);
 			}
 			}
 
 
 			stackDeallocLast(tempToDelete);
 			stackDeallocLast(tempToDelete);
@@ -193,7 +193,12 @@ namespace BansheeEditor
 		CmdEditPlainFieldGO<String>::execute(sceneTreeElement->mSceneObject, "mName", toString(name));
 		CmdEditPlainFieldGO<String>::execute(sceneTreeElement->mSceneObject, "mName", toString(name));
 	}
 	}
 
 
-	void GUISceneTreeView::deleteTreeElement(GUITreeView::TreeElement* element)
+	void GUISceneTreeView::deleteTreeElement(TreeElement* element)
+	{
+		// TODO - Actually delete the scene object
+	}
+
+	void GUISceneTreeView::deleteTreeElementInternal(GUITreeView::TreeElement* element)
 	{
 	{
 		closeTemporarilyExpandedElements(); // In case this element is one of them
 		closeTemporarilyExpandedElements(); // In case this element is one of them
 
 

+ 40 - 0
CamelotClient/Source/BsGUITreeView.cpp

@@ -30,6 +30,7 @@ namespace BansheeEditor
 	const UINT32 GUITreeView::SCROLL_SPEED_PX_PER_SEC = 25;
 	const UINT32 GUITreeView::SCROLL_SPEED_PX_PER_SEC = 25;
 
 
 	VirtualButton GUITreeView::mRenameVB = VirtualButton("Rename");
 	VirtualButton GUITreeView::mRenameVB = VirtualButton("Rename");
+	VirtualButton GUITreeView::mDeleteVB = VirtualButton("Delete");
 
 
 	GUITreeView::TreeElement::TreeElement()
 	GUITreeView::TreeElement::TreeElement()
 		:mParent(nullptr), mFoldoutBtn(nullptr), mElement(nullptr), mIsSelected(false),
 		:mParent(nullptr), mFoldoutBtn(nullptr), mElement(nullptr), mIsSelected(false),
@@ -441,6 +442,45 @@ namespace BansheeEditor
 
 
 			return true;
 			return true;
 		}
 		}
+		else if(ev.getButton() == mDeleteVB)
+		{
+			if(isSelectionActive())
+			{
+				auto isChildOf = [&] (const TreeElement* parent, const TreeElement* child)
+				{
+					const TreeElement* elem = child;
+
+					while(elem != nullptr && elem != parent)
+						elem = child->mParent;
+
+					return elem == parent;
+				};
+
+				// Ensure we don't unnecessarily try to delete children if their
+				// parent is getting deleted anyway
+				Vector<TreeElement*>::type elementsToDelete;
+				for(UINT32 i = 0; i < (UINT32)mSelectedElements.size(); i++)
+				{
+					bool hasDeletedParent = false;
+					for(UINT32 j = i + 1; j < (UINT32)mSelectedElements.size(); j++)
+					{
+						if(isChildOf(mSelectedElements[j].element, mSelectedElements[i].element))
+						{
+							hasDeletedParent = true;
+							break;
+						}
+					}
+
+					if(!hasDeletedParent)
+						elementsToDelete.push_back(mSelectedElements[i].element);
+				}
+
+				unselectAll();
+
+				for(auto& elem : elementsToDelete)
+					deleteTreeElement(elem);
+			}
+		}
 
 
 		return false;
 		return false;
 	}
 	}

+ 16 - 1
CamelotClient/Source/BsProjectLibrary.cpp

@@ -24,14 +24,25 @@ namespace BansheeEditor
 	const WString ProjectLibrary::LIBRARY_ENTRIES_FILENAME = L"ProjectLibrary.asset";
 	const WString ProjectLibrary::LIBRARY_ENTRIES_FILENAME = L"ProjectLibrary.asset";
 	const WString ProjectLibrary::RESOURCE_MANIFEST_FILENAME = L"ResourceManifest.asset";
 	const WString ProjectLibrary::RESOURCE_MANIFEST_FILENAME = L"ResourceManifest.asset";
 
 
+	ProjectLibrary::LibraryEntry::LibraryEntry()
+		:parent(nullptr), type(LibraryEntryType::Directory)
+	{ }
+
 	ProjectLibrary::LibraryEntry::LibraryEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent, LibraryEntryType type)
 	ProjectLibrary::LibraryEntry::LibraryEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent, LibraryEntryType type)
 		:path(path), parent(parent), type(type), elementName(name)
 		:path(path), parent(parent), type(type), elementName(name)
 	{ }
 	{ }
 
 
+	ProjectLibrary::ResourceEntry::ResourceEntry()
+		:lastUpdateTime(0)
+	{ }
+
 	ProjectLibrary::ResourceEntry::ResourceEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent)
 	ProjectLibrary::ResourceEntry::ResourceEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent)
 		:LibraryEntry(path, name, parent, LibraryEntryType::File), lastUpdateTime(0)
 		:LibraryEntry(path, name, parent, LibraryEntryType::File), lastUpdateTime(0)
 	{ }
 	{ }
 
 
+	ProjectLibrary::DirectoryEntry::DirectoryEntry()
+	{ }
+
 	ProjectLibrary::DirectoryEntry::DirectoryEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent)
 	ProjectLibrary::DirectoryEntry::DirectoryEntry(const CM::WString& path, const CM::WString& name, DirectoryEntry* parent)
 		:LibraryEntry(path, name, parent, LibraryEntryType::Directory)
 		:LibraryEntry(path, name, parent, LibraryEntryType::Directory)
 	{ }
 	{ }
@@ -547,7 +558,7 @@ namespace BansheeEditor
 
 
 	void ProjectLibrary::deleteEntry(const CM::WString& path)
 	void ProjectLibrary::deleteEntry(const CM::WString& path)
 	{
 	{
-		if(FileSystem::isFile(path))
+		if(FileSystem::exists(path))
 			FileSystem::remove(path);
 			FileSystem::remove(path);
 
 
 		LibraryEntry* entry = findEntry(path);
 		LibraryEntry* entry = findEntry(path);
@@ -671,6 +682,10 @@ namespace BansheeEditor
 			std::shared_ptr<ProjectLibraryEntries> libEntries = std::static_pointer_cast<ProjectLibraryEntries>(fs.decode(libraryEntriesPath));
 			std::shared_ptr<ProjectLibraryEntries> libEntries = std::static_pointer_cast<ProjectLibraryEntries>(fs.decode(libraryEntriesPath));
 
 
 			*mRootEntry = libEntries->getRootEntry();
 			*mRootEntry = libEntries->getRootEntry();
+			for(auto& child : mRootEntry->mChildren)
+				child->parent = mRootEntry;
+
+			mRootEntry->parent = nullptr;
 		}
 		}
 
 
 		// Load all meta files
 		// Load all meta files