LayerManager

疑问为何LayerManager作为IUnlinkWidget 的derived class

而且在initialise()中将自己的this指针传递给WidgetManager

	void LayerManager::initialise()
	{
		MYGUI_ASSERT(!mIsInitialise, INSTANCE_TYPE_NAME << " initialised twice");
		MYGUI_LOG(Info, "* Initialise: " << INSTANCE_TYPE_NAME);
		
		WidgetManager::getInstance().registerUnlinker(this);
		ResourceManager::getInstance().registerLoadXmlDelegate(XML_TYPE) = newDelegate(this, &LayerManager::_load);

		FactoryManager::getInstance().registerFactory<SharedLayer>(XML_TYPE);
		FactoryManager::getInstance().registerFactory<OverlappedLayer>(XML_TYPE);

		MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully initialized");
		mIsInitialise = true;
	}

对应于WidgetManager 中的成员函数

	void WidgetManager::registerUnlinker(IUnlinkWidget * _unlink)
	{
		unregisterUnlinker(_unlink);
		mVectorIUnlinkWidget.push_back(_unlink);
	}

registerUnlinker 与 unregisterUnlinker 对应的事件逻辑是什么?

	void WidgetManager::unregisterUnlinker(IUnlinkWidget * _unlink)
	{
		for (size_t pos=0; pos<mVectorIUnlinkWidget.size(); pos++)
		{
			if (mVectorIUnlinkWidget[pos] == _unlink)
			{
				mVectorIUnlinkWidget[pos] = mVectorIUnlinkWidget[mVectorIUnlinkWidget.size()-1];
				mVectorIUnlinkWidget.pop_back();
				break;
			}
		}
	}

Widget 与node 建立起关系的函数:??

	void LayerManager::attachToLayerNode(const std::string& _name, Widget* _item)
	{
		MYGUI_ASSERT(nullptr != _item, "pointer must be valid");
		MYGUI_ASSERT(_item->isRootWidget(), "attached widget must be root");

		// сначала отсоединяем??  先断开连接
		_item->detachFromLayer();

		// а теперь аттачим遍历layer 找到widget 所在的layer 将widget的layer item 添加到相应的layer中
		for (VectorLayer::iterator iter=mLayerNodes.begin(); iter!=mLayerNodes.end(); ++iter)
		{
			if (_name == (*iter)->getName())
			{
				ILayerNode* node = (*iter)->createChildItemNode();
				node->attachLayerItem(_item);

				return;
			}
		}
		MYGUI_LOG(Error, "Layer '" << _name << "' is not found");
		//MYGUI_EXCEPT("Layer '" << _name << "' is not found");
	}

**** 重点,


LayerItem 多重继承的Widget 如图:

分析下列函数的作用:

	void LayerItem::detachFromLayer()
	{
		// 禧 箧?铗溴蜞麇睇 ?漕耜?
		if (nullptr == mLayer) return;

		// 蜞觐泐 猁螯 礤 漕腈眍
		MYGUI_ASSERT(mLayerNode, "_item->mLayerNode == nullptr");

		// 铗镨覃忄屐? 铗 镨觋桧汔
		mLayerNode->detachLayerItem(this);

		// 镳?溴蜞麇 钺眢腓螯?
		ILayerNode * save = mLayerNode;

		// 翳玷麇耜?铗耦邃桧屐
		detachFromLayerItemNode(true);

		// 铗耦邃桧屐 脲屦 ?钺眢?屐 ?痼蝾忸泐 忤滏弪?
		mLayer->destroyChildItemNode(save);
		mLayerNode = nullptr;
		mLayer = nullptr;
	}


还是先分析 怎么attach上 layer的 吧;)

LayerItem attach



Widget 与LayerManger的关系很近因为Widget所需要的render item 都被组织在layer中进行集中渲染管理

从MyGui 中的widget的可以看懂的注释。

		/** Set widget style.
			@param _layer Attach to specified layer (if any)
			@note When choosing WidgetStyle::Popup style you also need attach widget to layer
			see LayerManager::attachToLayerNode
		*/
		void setWidgetStyle(WidgetStyle _style, const std::string& _layer = "");

足见关系密切!

从工程项目的搜索中得到:

Find all "attachToLayerNode", Subfolders, Find Results 1, "Entire Solution"
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\include\MyGUI_LayerManager.h(54):		void attachToLayerNode(const std::string& _name, Widget* _item);
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\include\MyGUI_Widget.h(282):			see LayerManager::attachToLayerNode
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\src\MyGUI_Gui.cpp(196):		if (!_layer.empty()) LayerManager::getInstance().attachToLayerNode(_layer, widget);
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\src\MyGUI_LayerManager.cpp(135):	void LayerManager::attachToLayerNode(const std::string& _name, Widget* _item)
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\src\MyGUI_PointerManager.cpp(247):			LayerManager::getInstance().attachToLayerNode(_layer, widget);
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\src\MyGUI_PointerManager.cpp(310):			LayerManager::getInstance().attachToLayerNode(mLayerName, mMousePointer);
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\src\MyGUI_Message.cpp(333):		if (_layer.empty()) LayerManager::getInstance().attachToLayerNode(mess->getDefaultLayer(), mess);
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\src\MyGUI_Widget.cpp(367):		if (!_layer.empty() && widget->isRootWidget()) LayerManager::getInstance().attachToLayerNode(_layer, widget);
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\src\MyGUI_Widget.cpp(1287):			LayerManager::getInstance().attachToLayerNode(_layer, this);
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\src\MyGUI_Widget.cpp(1291):			LayerManager::getInstance().attachToLayerNode(oldlayer, this);
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\src\MyGUI_Widget.cpp(1333):				LayerManager::getInstance().attachToLayerNode(_layer, this);
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\MyGUIEngine\src\MyGUI_Widget.cpp(1476):			LayerManager::getInstance().attachToLayerNode(layername, root);
  H:\MyGui\MyGUI_3.0.1_source\MyGUI3.0\UnitTests\UnitTest_AttachDetach\DemoKeeper.cpp(93):				MyGUI::LayerManager::getInstance().attachToLayerNode(layername, widget);
  Matching lines: 13    Matching files: 8    Total files searched: 620


下面把,Ilayer,ILayerNode类的静态关系,






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值