WidgetManager

照例列出WidgetManager的全部家當:


mDelegates 用來存儲parse XML的delegate

重頭在於

mFactoryList  obsolete

mVectorIUnlinkWidget

mUnlinkWidgets

這裏只是大戰前的猜測:

mFactoryList 中存放的是IWidgetFactory


重點分析:

引入代碼:


這種模式在MyGUI中應該是過時的:

因爲關於IWidgetFactory的操作都是

//TODO

正如FactoryManager中提到的Manager類之溝通與子類的協調者,

負責employer之間的註冊於與離退,

對於:mUnlinkWidgets 註冊,

	void WidgetManager::addWidgetToUnlink(Widget* _widget)
	{
		if (_widget) mUnlinkWidgets.push_back(_widget);
	}

離退:

	void WidgetManager::unlinkFromUnlinkers(Widget* _widget)
	{
		for (VectorIUnlinkWidget::iterator iter = mVectorIUnlinkWidget.begin(); iter!=mVectorIUnlinkWidget.end(); ++iter)
		{
			(*iter)->_unlinkWidget(_widget);
		}
		// вызывать последним, обнулится
		removeWidgetFromUnlink(_widget);
	}


	void WidgetManager::removeWidgetFromUnlink(Widget*& _widget)
	{
		VectorWidgetPtr::iterator iter = std::find(mUnlinkWidgets.begin(), mUnlinkWidgets.end(), _widget);
		if (iter != mUnlinkWidgets.end())
		{
			(*iter) = mUnlinkWidgets.back();
			mUnlinkWidgets.pop_back();
		}
		else
		{
			_widget = nullptr;
		}
	}
對於:mVectorIUnlinkWidget

這個有點兒複雜,是說,對於Widget向每個IUnlinkWidget manager 註冊的控件而言,

Widget Manager 使得其退註冊。

	void WidgetManager::registerUnlinker(IUnlinkWidget * _unlink)
	{
		unregisterUnlinker(_unlink);
		mVectorIUnlinkWidget.push_back(_unlink);
	}
    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;
			}
		}
	}

離退:

createWidget  創建Widget分兩步:

    1)通過FacotryManager 創建Widget

    2)然後再初始化:

        _style, _coord, _align, skin, _parent, _cropeedParent, _creator, _name

    返回 widget

 Widget* WidgetManager::createWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, Widget* _parent, ICroppedRectangle * _cropeedParent, IWidgetCreator * _creator, const std::string& _name)

	{
		IObject* object = FactoryManager::getInstance().createObject("Widget", _type);
		if (object != nullptr)
		{
			Widget* widget = object->castType<Widget>();
			ResourceSkin* skin = SkinManager::getInstance().getByName(_skin);
			widget->_initialise(_style, _coord, _align, skin, _parent, _cropeedParent, _creator, _name);

			return widget;
		}

		// старый вариант создания這句的意思是Obsolete 
		for (SetWidgetFactory::iterator factory = mFactoryList.begin(); factory != mFactoryList.end(); ++factory)
		{
			if ((*factory)->getTypeName() == _type)
			{
				Widget* widget = (*factory)->createWidget(_style, _skin, _coord, _align, _parent, _cropeedParent, _creator, _name);
				return widget;
			}
		}

		MYGUI_EXCEPT("factory '" << _type << "' not found");
		return nullptr;
	}

根據以上三點分析:

Widget  至少完成三種職能:

1,被調用來創建Widget 並對其初始化, skin之類的操作

2,被其他Manager(//TODO 在後續拔出後幕)所調用

      來註冊,Widget 和 IUnlinkWidget(對於每個manager 而言)



對於Initialize

	void WidgetManager::initialise()
	{
		MYGUI_ASSERT(!mIsInitialise, INSTANCE_TYPE_NAME << " initialised twice");
		MYGUI_LOG(Info, "* Initialise: " << INSTANCE_TYPE_NAME);

		//registerUnlinker(this);

		FactoryManager& factory = FactoryManager::getInstance();

		factory.registerFactory<Button>("Widget");
		factory.registerFactory<Canvas>("Widget");
		factory.registerFactory<ComboBox>("Widget");
		factory.registerFactory<DDContainer>("Widget");
		factory.registerFactory<Edit>("Widget");
		factory.registerFactory<HScroll>("Widget");
		factory.registerFactory<ItemBox>("Widget");
		factory.registerFactory<List>("Widget");
		factory.registerFactory<ListBox>("Widget");
		factory.registerFactory<ListCtrl>("Widget");
		factory.registerFactory<MenuBar>("Widget");
		factory.registerFactory<MenuCtrl>("Widget");
		factory.registerFactory<MenuItem>("Widget");
		factory.registerFactory<Message>("Widget");
		factory.registerFactory<MultiList>("Widget");
		factory.registerFactory<PopupMenu>("Widget");
		factory.registerFactory<Progress>("Widget");
		factory.registerFactory<ScrollView>("Widget");
		factory.registerFactory<StaticImage>("Widget");
		factory.registerFactory<StaticText>("Widget");
		factory.registerFactory<Tab>("Widget");
		factory.registerFactory<TabItem>("Widget");
		factory.registerFactory<VScroll>("Widget");
		factory.registerFactory<Widget>("Widget");
		factory.registerFactory<Window>("Widget");

#ifndef MYGUI_DONT_USE_OBSOLETE

		factory.registerFactory<RenderBox>("Widget");
		factory.registerFactory<Sheet>("Widget");

#endif // MYGUI_DONT_USE_OBSOLETE

		MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully initialized");
		mIsInitialise = true;
	}
FactoryManager 類覺得應該叫WidgetCreateFactoryManager
因爲它的職能是用來註冊MyGUI 所支持Widget的所用種類:
覺得這裏是個亮點,因爲全部都是hard code 將來MyGUI插件化肯定是要用來動態加載。
值得一提的是MyGUI 將一些控件該成更人性化。
摘自MyGUI 官網:
http://redmine.mygui.info/repositories/entry/mygui/tags/MyGUI3.2/ChangeLog.txt
78
-- Widgets --
79
- VScroll and HScroll replaced with single ScrollBar class.
80
- Edit renamed into EditBox.
81
- List renamed into ListBox.
82
- MenuCtrl renamed into MenuControl.
83
- MultiList renamed into MultiListBox.
84
- Progress renamed into ProgressBar.
85
- StaticImage renamed into ImageBox.
86
- StaticText renamed into TextBox.
87
- Tab renamed into TabControl.
88
- New Window property Moveable.
89
- Message moved from Core to Common.
90
- MultiListBox now support different modes of columns resizing.
91
- Button properties StateCheck and ButtonPressed replaced with single property StateSelected.
92
- ListBox and ComboBox now support ToolTip.
93
- Menu items can be checked now, tick icon appears.
94
- Property AlignVert renamed into VerticalAlignment.
95
- Hidden widget lose input and focus.
96
- Active elements visualisation in list now properly respond to changes in the list.
97
- All text related properties was moved from Widget to TextBox.



發佈了71 篇原創文章 · 獲贊 2 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章