1 /*
2  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3  * Distributed under the MIT License
4  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5  */
6 
7 #ifndef MYGUI_LAYER_NODE_H_
8 #define MYGUI_LAYER_NODE_H_
9 
10 #include "MyGUI_Prerequest.h"
11 #include "MyGUI_ILayer.h"
12 #include "MyGUI_ILayerNode.h"
13 #include "MyGUI_RenderItem.h"
14 
15 namespace MyGUI
16 {
17 
18 	class LayerItem;
19 	typedef std::vector<RenderItem*> VectorRenderItem;
20 	typedef std::vector<ILayerItem*> VectorLayerItem;
21 
22 	class MYGUI_EXPORT LayerNode :
23 		public ILayerNode
24 	{
25 		MYGUI_RTTI_DERIVED( LayerNode )
26 
27 	public:
28 		explicit LayerNode(ILayer* _layer, ILayerNode* _parent = nullptr);
29 		~LayerNode() override;
30 
31 		// леер, которому мы принадлежим
32 		ILayer* getLayer() const override;
33 
34 		// возвращает отца или nullptr
35 		ILayerNode* getParent() const override;
36 
37 		// создаем дочерний нод
38 		ILayerNode* createChildItemNode() override;
39 		// удаляем дочерний нод
40 		void destroyChildItemNode(ILayerNode* _node) override;
41 
42 		// поднимаем дочерний нод
43 		void upChildItemNode(ILayerNode* _node) override;
44 
45 		// список детей
46 		EnumeratorILayerNode getEnumerator() const override;
47 
48 		size_t getLayerNodeCount() const override;
49 
50 		ILayerNode* getLayerNodeAt(size_t _index) const override;
51 
52 		// добавляем айтем к ноду
53 		void attachLayerItem(ILayerItem* _item) override;
54 		// удаляем айтем из нода
55 		void detachLayerItem(ILayerItem* _item) override;
56 
57 		// добавляет саб айтем и возвращает рендер айтем
58 		RenderItem* addToRenderItem(ITexture* _texture, bool _firstQueue, bool _manualRender) override;
59 		// необходимо обновление нода
60 		void outOfDate(RenderItem* _item) override;
61 
62 		// возвращает виджет по позиции
63 		ILayerItem* getLayerItemByPoint(int _left, int _top) const override;
64 
65 		// рисует леер
66 		void renderToTarget(IRenderTarget* _target, bool _update) override;
67 
68 		void resizeView(const IntSize& _viewSize) override;
69 
70 		float getNodeDepth() override;
71 
72 		bool isOutOfDate() const;
73 
74 	protected:
75 		// push all empty buffers to the end of buffers list
76 		void updateCompression();
77 		RenderItem* addToRenderItemFirstQueue(ITexture* _texture, bool _manualRender);
78 		RenderItem* addToRenderItemSecondQueue(ITexture* _texture, bool _manualRender);
79 	protected:
80 		// two render queues, for subskins and text
81 		// first queue keep render order based on order of creation
82 		// second queue ignore creation order and always merge render items with same texture
83 		VectorRenderItem mFirstRenderItems;
84 		VectorRenderItem mSecondRenderItems;
85 
86 		size_t mLastNotEmptyItem;
87 
88 		// root widgets list
89 		// overlapping layers have only one item here
90 		VectorLayerItem mLayerItems;
91 
92 		VectorILayerNode mChildItems;
93 
94 		ILayerNode* mParent;
95 		ILayer* mLayer;
96 		bool mOutOfDate;
97 		bool mOutOfDateCompression;
98 		float mDepth;
99 	};
100 
101 } // namespace MyGUI
102 
103 #endif // MYGUI_LAYER_NODE_H_
104