Przeglądaj źródła

Widgets are properly activated even after their order is changed

Marko Pintera 12 lat temu
rodzic
commit
b114b8f8e9

+ 1 - 1
CamelotClient/Include/BsEditorWidgetContainer.h

@@ -32,7 +32,7 @@ namespace BansheeEditor
 		BS::GUIWidget* mParent;
 		BS::GUIWidget* mParent;
 		CM::INT32 mX, mY;
 		CM::INT32 mX, mY;
 		CM::UINT32 mWidth, mHeight;
 		CM::UINT32 mWidth, mHeight;
-		CM::Vector<EditorWidget*>::type mWidgets;
+		CM::UnorderedMap<CM::UINT32, EditorWidget*>::type mWidgets;
 		CM::INT32 mActiveWidget;
 		CM::INT32 mActiveWidget;
 
 
 		static const CM::UINT32 TitleBarHeight;
 		static const CM::UINT32 TitleBarHeight;

+ 5 - 3
CamelotClient/Include/BsGUITabbedTitleBar.h

@@ -22,9 +22,11 @@ namespace BansheeEditor
 			BS::GUIElementStyle* minBtnStyle = nullptr, BS::GUIElementStyle* closeBtnStyle = nullptr);
 			BS::GUIElementStyle* minBtnStyle = nullptr, BS::GUIElementStyle* closeBtnStyle = nullptr);
 
 
 		void addTab(const CM::HString& name);
 		void addTab(const CM::HString& name);
-		void insertTab(CM::UINT32 idx, const CM::HString& name);
-		void removeTab(CM::UINT32 idx);
-		void setActive(CM::UINT32 idx);
+		CM::UINT32 insertTab(CM::UINT32 position, const CM::HString& name);
+		void removeTab(CM::UINT32 uniqueIdx);
+		void setActive(CM::UINT32 uniqueIdx);
+		CM::UINT32 getTabIdx(CM::UINT32 position) const;
+		CM::UINT32 getNumTabs() const { return (CM::UINT32)mTabButtons.size(); }
 
 
 		boost::signal<void(CM::UINT32)> onTabActivated;
 		boost::signal<void(CM::UINT32)> onTabActivated;
 		boost::signal<void(CM::UINT32)> onTabClosed;
 		boost::signal<void(CM::UINT32)> onTabClosed;

+ 29 - 35
CamelotClient/Source/BsEditorWidgetContainer.cpp

@@ -38,7 +38,7 @@ namespace BansheeEditor
 
 
 		for(auto& widget : mWidgets)
 		for(auto& widget : mWidgets)
 		{
 		{
-			EditorWidget::destroy(widget);
+			EditorWidget::destroy(widget.second);
 		}
 		}
 	}
 	}
 
 
@@ -49,33 +49,29 @@ namespace BansheeEditor
 
 
 	void EditorWidgetContainer::remove(EditorWidget& widget)
 	void EditorWidgetContainer::remove(EditorWidget& widget)
 	{
 	{
-		INT32 widgetIdx = -1;
-		UINT32 curIdx = 0;
+		INT32 tabIdx = 0;
 		for(auto& curWidget : mWidgets)
 		for(auto& curWidget : mWidgets)
 		{
 		{
-			if(curWidget == &widget)
+			if(curWidget.second == &widget)
 			{
 			{
-				widgetIdx = curIdx;
+				tabIdx = curWidget.first;
 				break;
 				break;
 			}
 			}
-
-			curIdx++;
 		}
 		}
 
 
-		if(widgetIdx == -1)
+		if(tabIdx == -1)
 			return;
 			return;
 
 
-		mWidgets.erase(mWidgets.begin() + widgetIdx);
-		mTitleBar->removeTab((UINT32)widgetIdx);
+		mWidgets.erase((UINT32)tabIdx);
+		mTitleBar->removeTab((UINT32)tabIdx);
 		widget._changeParent(nullptr);
 		widget._changeParent(nullptr);
 
 
-		if(widgetIdx == mActiveWidget)
+		if(tabIdx == mActiveWidget)
 		{
 		{
-			if(mWidgets.size() > 0)
+			if(mTitleBar->getNumTabs() > 0)
 			{
 			{
 				mActiveWidget = -1;
 				mActiveWidget = -1;
-				setActiveWidget(0);
-				mTitleBar->setActive(0);
+				setActiveWidget(mTitleBar->getTabIdx(0));
 			}
 			}
 		}
 		}
 	}
 	}
@@ -84,18 +80,18 @@ namespace BansheeEditor
 	{
 	{
 		for(auto& curWidget : mWidgets)
 		for(auto& curWidget : mWidgets)
 		{
 		{
-			if(curWidget == &widget)
+			if(curWidget.second == &widget)
 				return;
 				return;
 		}
 		}
 
 
 		idx = Math::clamp(idx, 0U, (UINT32)mWidgets.size());
 		idx = Math::clamp(idx, 0U, (UINT32)mWidgets.size());
 
 
-		mTitleBar->insertTab(idx, widget.getName());
-		mWidgets.insert(mWidgets.begin() + idx, &widget);
+		UINT32 tabIdx = mTitleBar->insertTab(idx, widget.getName());
+		mWidgets[tabIdx] = &widget;
 		widget._changeParent(this);
 		widget._changeParent(this);
 
 
 		if(mActiveWidget == -1)
 		if(mActiveWidget == -1)
-			setActiveWidget((UINT32)mWidgets.size() - 1);
+			setActiveWidget(mTitleBar->getTabIdx(mTitleBar->getNumTabs() - 1));
 		else
 		else
 			widget._disable();
 			widget._disable();
 	}
 	}
@@ -139,29 +135,28 @@ namespace BansheeEditor
 
 
 		mActiveWidget = idx;
 		mActiveWidget = idx;
 
 
-		UINT32 curIdx = 0;
 		for(auto& curWidget : mWidgets)
 		for(auto& curWidget : mWidgets)
 		{
 		{
-			if(curIdx != (UINT32)mActiveWidget)
-				curWidget->_disable();
+			if(curWidget.first != (UINT32)mActiveWidget)
+				curWidget.second->_disable();
 			else
 			else
-				curWidget->_enable();
-
-			curIdx++;
+				curWidget.second->_enable();
 		}
 		}
 
 
+		mTitleBar->setActive(idx);
+
 		setPosition(mX, mY);
 		setPosition(mX, mY);
 		setSize(mWidth, mHeight);
 		setSize(mWidth, mHeight);
 	}
 	}
 
 
-	void EditorWidgetContainer::tabActivated(UINT32 idx)
+	void EditorWidgetContainer::tabActivated(UINT32 uniqueIdx)
 	{
 	{
-		setActiveWidget(idx);
+		setActiveWidget(uniqueIdx);
 	}
 	}
 
 
-	void EditorWidgetContainer::tabClosed(UINT32 idx)
+	void EditorWidgetContainer::tabClosed(UINT32 uniqueIdx)
 	{
 	{
-		EditorWidget* widget = mWidgets[idx];
+		EditorWidget* widget = mWidgets[uniqueIdx];
 		remove(*widget);
 		remove(*widget);
 		EditorWidget::destroy(widget);
 		EditorWidget::destroy(widget);
 
 
@@ -169,9 +164,9 @@ namespace BansheeEditor
 			onWidgetClosed();
 			onWidgetClosed();
 	}
 	}
 
 
-	void EditorWidgetContainer::tabDraggedOff(CM::UINT32 idx)
+	void EditorWidgetContainer::tabDraggedOff(CM::UINT32 uniqueIdx)
 	{
 	{
-		EditorWidget* widget = mWidgets[idx];
+		EditorWidget* widget = mWidgets[uniqueIdx];
 		remove(*widget);
 		remove(*widget);
 
 
 		// TODO - Hook up drag and drop texture
 		// TODO - Hook up drag and drop texture
@@ -182,7 +177,7 @@ namespace BansheeEditor
 			onWidgetClosed();
 			onWidgetClosed();
 	}
 	}
 
 
-	void EditorWidgetContainer::tabDraggedOn(CM::UINT32 idx)
+	void EditorWidgetContainer::tabDraggedOn(CM::UINT32 seqIdx)
 	{
 	{
 #if CM_DEBUG_MODE
 #if CM_DEBUG_MODE
 		if(!DragAndDropManager::instance().isDragInProgress())
 		if(!DragAndDropManager::instance().isDragInProgress())
@@ -194,9 +189,8 @@ namespace BansheeEditor
 
 
 		EditorWidget* draggedWidget = static_cast<EditorWidget*>(DragAndDropManager::instance().getDragData());
 		EditorWidget* draggedWidget = static_cast<EditorWidget*>(DragAndDropManager::instance().getDragData());
 
 
-		insert(idx, *draggedWidget);
-		setActiveWidget(idx);
-		mTitleBar->setActive(idx);
+		insert(seqIdx, *draggedWidget);
+		setActiveWidget(mTitleBar->getTabIdx(seqIdx));
 	}
 	}
 
 
 	void EditorWidgetContainer::tabDroppedCallback(bool wasDragProcessed)
 	void EditorWidgetContainer::tabDroppedCallback(bool wasDragProcessed)
@@ -225,7 +219,7 @@ namespace BansheeEditor
 	{
 	{
 		for(auto& curWidget : mWidgets)
 		for(auto& curWidget : mWidgets)
 		{
 		{
-			if(curWidget == widget)
+			if(curWidget.second == widget)
 			{
 			{
 				remove(*widget);
 				remove(*widget);
 
 

+ 28 - 28
CamelotClient/Source/BsGUITabbedTitleBar.cpp

@@ -86,27 +86,30 @@ namespace BansheeEditor
 		insertTab((UINT32)mTabButtons.size(), name);
 		insertTab((UINT32)mTabButtons.size(), name);
 	}
 	}
 
 
-	void GUITabbedTitleBar::insertTab(UINT32 idx, const CM::HString& name)
+	UINT32 GUITabbedTitleBar::insertTab(UINT32 position, const CM::HString& name)
 	{
 	{
 		GUITabButton* newTabToggle = GUITabButton::create(*mParent, mTabToggleGroup, mUniqueTabIdx, name, mTabBtnStyle);
 		GUITabButton* newTabToggle = GUITabButton::create(*mParent, mTabToggleGroup, mUniqueTabIdx, name, mTabBtnStyle);
 		_registerChildElement(newTabToggle);
 		_registerChildElement(newTabToggle);
 
 
-		idx = Math::clamp(idx, 0U, (UINT32)mTabButtons.size());
+		position = Math::clamp(position, 0U, (UINT32)mTabButtons.size());
 
 
-		newTabToggle->onToggled.connect(boost::bind(&GUITabbedTitleBar::tabToggled, this, mUniqueTabIdx, _1));
+		UINT32 uniqueIdx = mUniqueTabIdx++;
+
+		newTabToggle->onToggled.connect(boost::bind(&GUITabbedTitleBar::tabToggled, this, uniqueIdx, _1));
 		newTabToggle->onDragged.connect(boost::bind(&GUITabbedTitleBar::tabDragged, this, _1, _2));
 		newTabToggle->onDragged.connect(boost::bind(&GUITabbedTitleBar::tabDragged, this, _1, _2));
 		newTabToggle->onDragEnd.connect(boost::bind(&GUITabbedTitleBar::tabDragEnd, this, _1, _2));
 		newTabToggle->onDragEnd.connect(boost::bind(&GUITabbedTitleBar::tabDragEnd, this, _1, _2));
 
 
-		mTabButtons.insert(mTabButtons.begin() + idx, newTabToggle);
+		mTabButtons.insert(mTabButtons.begin() + position, newTabToggle);
 
 
-		mUniqueTabIdx++;
+		return uniqueIdx;
 	}
 	}
 
 
-	void GUITabbedTitleBar::removeTab(UINT32 idx)
+	void GUITabbedTitleBar::removeTab(UINT32 uniqueIdx)
 	{
 	{
 		if(mTabButtons.size() == 0)
 		if(mTabButtons.size() == 0)
 			return;
 			return;
 
 
+		UINT32 idx = uniqueIdxToSeqIdx(uniqueIdx);
 		idx = Math::clamp(idx, 0U, (UINT32)mTabButtons.size() - 1);
 		idx = Math::clamp(idx, 0U, (UINT32)mTabButtons.size() - 1);
 
 
 		GUIElement::destroy(mTabButtons[idx]);
 		GUIElement::destroy(mTabButtons[idx]);
@@ -114,9 +117,14 @@ namespace BansheeEditor
 		mTabButtons.erase(mTabButtons.begin() + idx);
 		mTabButtons.erase(mTabButtons.begin() + idx);
 	}
 	}
 
 
-	void GUITabbedTitleBar::setActive(UINT32 idx)
+	void GUITabbedTitleBar::setActive(UINT32 uniqueIdx)
+	{
+		mTabButtons[uniqueIdxToSeqIdx(uniqueIdx)]->toggleOn();
+	}
+
+	CM::UINT32 GUITabbedTitleBar::getTabIdx(CM::UINT32 position) const
 	{
 	{
-		mTabButtons[idx]->toggleOn();
+		return mTabButtons[position]->getIndex();
 	}
 	}
 
 
 	bool GUITabbedTitleBar::mouseEvent(const GUIMouseEvent& event)
 	bool GUITabbedTitleBar::mouseEvent(const GUIMouseEvent& event)
@@ -199,13 +207,13 @@ namespace BansheeEditor
 
 
 			if(mTempDraggedWidget != nullptr)
 			if(mTempDraggedWidget != nullptr)
 			{
 			{
-				UINT32 tabSeqIdx = uniqueIdxToSeqIdx(mTempDraggedTabIdx);
-				removeTab(tabSeqIdx);
+				UINT32 seqIdx = uniqueIdxToSeqIdx(mTempDraggedTabIdx);
+				removeTab(mTempDraggedTabIdx);
 
 
 				endDrag();
 				endDrag();
 
 
 				if(!onTabDraggedOn.empty())
 				if(!onTabDraggedOn.empty())
-					onTabDraggedOn(tabSeqIdx);
+					onTabDraggedOn(seqIdx);
 			}
 			}
 
 
 			return true;
 			return true;
@@ -214,7 +222,7 @@ namespace BansheeEditor
 		{
 		{
 			if(mTempDraggedWidget != nullptr)
 			if(mTempDraggedWidget != nullptr)
 			{
 			{
-				removeTab(uniqueIdxToSeqIdx(mTempDraggedTabIdx));
+				removeTab(mTempDraggedTabIdx);
 
 
 				endDrag();
 				endDrag();
 			}
 			}
@@ -330,29 +338,21 @@ namespace BansheeEditor
 		if(!toggledOn)
 		if(!toggledOn)
 			return;
 			return;
 
 
-		INT32 idx = uniqueIdxToSeqIdx(tabIdx);
-		if(idx != -1)
-		{
-			if(!onTabActivated.empty())
-				onTabActivated(idx);
-		}
+		if(!onTabActivated.empty())
+			onTabActivated(tabIdx);
 
 
 		mActiveTabIdx = tabIdx;
 		mActiveTabIdx = tabIdx;
 	}
 	}
 
 
 	void GUITabbedTitleBar::tabClosed()
 	void GUITabbedTitleBar::tabClosed()
 	{
 	{
-		INT32 idx = uniqueIdxToSeqIdx(mActiveTabIdx);
-		if(idx != -1)
-		{
-			removeTab(idx);
+		removeTab(mActiveTabIdx);
 
 
-			if(mTabButtons.size() > 0)
-				mActiveTabIdx = mTabButtons[0]->getIndex();
+		if(!onTabClosed.empty())
+			onTabClosed(mActiveTabIdx);
 
 
-			if(!onTabClosed.empty())
-				onTabClosed(idx);
-		}
+		if(mTabButtons.size() > 0)
+			mActiveTabIdx = mTabButtons[0]->getIndex();
 	}
 	}
 
 
 	void GUITabbedTitleBar::startDrag(CM::UINT32 seqIdx, const Vector2I& startDragPos)
 	void GUITabbedTitleBar::startDrag(CM::UINT32 seqIdx, const Vector2I& startDragPos)
@@ -432,7 +432,7 @@ namespace BansheeEditor
 				markContentAsDirty();
 				markContentAsDirty();
 
 
 				if(!onTabDraggedOff.empty())
 				if(!onTabDraggedOff.empty())
-					onTabDraggedOff(idx);
+					onTabDraggedOff(tabIdx);
 			}
 			}
 		}
 		}
 	}
 	}

+ 1 - 1
EditorWindowDock.txt

@@ -1,5 +1,5 @@
 TODO:
 TODO:
- - Dragging on new tabs doesn't seem to properly activate them
+ - Closing a widget causes problems
  - (Unrelated) Can't click and drag a scroll handle
  - (Unrelated) Can't click and drag a scroll handle
 
 
 Resize sliders
 Resize sliders