| 
									
										
										
										
											2019-08-14 21:52:49 +08:00
										 |  |  |  | // Copyright (c) 2016-2018 Kiwano - Nomango
 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2019-08-14 21:52:49 +08:00
										 |  |  |  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
					
						
							|  |  |  |  | // of this software and associated documentation files (the "Software"), to deal
 | 
					
						
							|  |  |  |  | // in the Software without restriction, including without limitation the rights
 | 
					
						
							|  |  |  |  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
					
						
							|  |  |  |  | // copies of the Software, and to permit persons to whom the Software is
 | 
					
						
							|  |  |  |  | // furnished to do so, subject to the following conditions:
 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2019-08-14 21:52:49 +08:00
										 |  |  |  | // The above copyright notice and this permission notice shall be included in
 | 
					
						
							|  |  |  |  | // all copies or substantial portions of the Software.
 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2019-08-14 21:52:49 +08:00
										 |  |  |  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
					
						
							|  |  |  |  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
					
						
							|  |  |  |  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
					
						
							|  |  |  |  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
					
						
							|  |  |  |  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
					
						
							|  |  |  |  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
					
						
							|  |  |  |  | // THE SOFTWARE.
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2020-01-17 16:55:47 +08:00
										 |  |  |  | #include <kiwano/core/Common.h>
 | 
					
						
							| 
									
										
										
										
											2020-01-16 18:33:42 +08:00
										 |  |  |  | #include <kiwano/core/event/Event.h>
 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  | #include <kiwano/macros.h>
 | 
					
						
							| 
									
										
										
										
											2020-02-06 16:54:47 +08:00
										 |  |  |  | #include <kiwano/math/Math.h>
 | 
					
						
							| 
									
										
										
										
											2019-08-14 21:52:49 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace kiwano | 
					
						
							|  |  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-02-02 15:47:48 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  | /**
 | 
					
						
							|  |  |  |  |  * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |  * @brief 鼠标指针类型 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |  */ | 
					
						
							|  |  |  |  | enum class CursorType | 
					
						
							|  |  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |     Arrow,      ///< 指针
 | 
					
						
							|  |  |  |  |     TextInput,  ///< 文本
 | 
					
						
							|  |  |  |  |     Hand,       ///< 手
 | 
					
						
							|  |  |  |  |     SizeAll,    ///< 指向四个方向的箭头
 | 
					
						
							|  |  |  |  |     SizeWE,     ///< 指向左右方向的箭头
 | 
					
						
							|  |  |  |  |     SizeNS,     ///< 指向上下方向的箭头
 | 
					
						
							|  |  |  |  |     SizeNESW,   ///< 指向左下到右上方向的箭头
 | 
					
						
							|  |  |  |  |     SizeNWSE,   ///< 指向左上到右下方向的箭头
 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 15:47:48 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  | /**
 | 
					
						
							|  |  |  |  |  * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |  * @brief 窗口类,控制窗口标题、大小、图标等 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |  */ | 
					
						
							|  |  |  |  | class KGE_API Window : protected Noncopyable | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | public: | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 获取窗口实例 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-02-08 09:59:17 +08:00
										 |  |  |  |     static Window& GetInstance(); | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 初始化窗口 | 
					
						
							|  |  |  |  |      * @param title 标题 | 
					
						
							|  |  |  |  |      * @param width 宽度 | 
					
						
							|  |  |  |  |      * @param height 高度 | 
					
						
							|  |  |  |  |      * @param icon 图标资源ID | 
					
						
							|  |  |  |  |      * @param resizable 窗口大小可拉伸 | 
					
						
							|  |  |  |  |      * @param fullscreen 全屏模式 | 
					
						
							|  |  |  |  |      * @throw kiwano::SystemException 窗口创建失败时抛出 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-02-02 15:47:48 +08:00
										 |  |  |  |     virtual void Create(String const& title, uint32_t width, uint32_t height, uint32_t icon = 0, bool resizable = false, | 
					
						
							|  |  |  |  |                         bool fullscreen = false) = 0; | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 获取窗口标题 | 
					
						
							|  |  |  |  |      * @return 窗口标题 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     String GetTitle() const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 获取窗口大小 | 
					
						
							|  |  |  |  |      * @return 窗口大小 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     Size GetSize() const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 获取窗口宽度 | 
					
						
							|  |  |  |  |      * @return 窗口宽度 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     uint32_t GetWidth() const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 获取窗口高度 | 
					
						
							|  |  |  |  |      * @return 窗口高度 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     uint32_t GetHeight() const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 设置标题 | 
					
						
							|  |  |  |  |      * @param title 标题 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     virtual void SetTitle(String const& title) = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 设置窗口图标 | 
					
						
							|  |  |  |  |      * @param icon_resource 图标资源ID | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     virtual void SetIcon(uint32_t icon_resource) = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 重设窗口大小 | 
					
						
							|  |  |  |  |      * @param width 窗口宽度 | 
					
						
							|  |  |  |  |      * @param height 窗口高度 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     virtual void Resize(uint32_t width, uint32_t height) = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 设置全屏模式 | 
					
						
							|  |  |  |  |      * @param fullscreen 是否全屏 | 
					
						
							|  |  |  |  |      * @param width 窗口宽度 | 
					
						
							|  |  |  |  |      * @param height 窗口高度 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     virtual void SetFullscreen(bool fullscreen) = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 设置鼠标指针类型 | 
					
						
							|  |  |  |  |      * @param cursor 鼠标指针类型 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     virtual void SetCursor(CursorType cursor) = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 轮询窗口事件 | 
					
						
							|  |  |  |  |      * @return 返回事件队列中的第一个事件并将其从队列中移除\n | 
					
						
							|  |  |  |  |      *         若事件队列为空则返回空指针 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     EventPtr PollEvent(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 15:47:48 +08:00
										 |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 将窗口事件放入队列 | 
					
						
							|  |  |  |  |      * @param evt 窗口事件 | 
					
						
							| 
									
										
										
										
											2020-02-02 15:47:48 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     void PushEvent(EventPtr evt); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 窗口是否需要关闭 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     bool ShouldClose(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /**
 | 
					
						
							|  |  |  |  |      * \~chinese | 
					
						
							| 
									
										
										
										
											2020-02-10 17:32:04 +08:00
										 |  |  |  |      * @brief 销毁窗口 | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     virtual void Destroy(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | protected: | 
					
						
							|  |  |  |  |     Window(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     ~Window(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     virtual void PumpEvents() = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 15:47:48 +08:00
										 |  |  |  | protected: | 
					
						
							| 
									
										
										
										
											2020-01-21 10:09:55 +08:00
										 |  |  |  |     bool                 should_close_; | 
					
						
							|  |  |  |  |     uint32_t             width_; | 
					
						
							|  |  |  |  |     uint32_t             height_; | 
					
						
							|  |  |  |  |     String               title_; | 
					
						
							|  |  |  |  |     std::queue<EventPtr> event_queue_; | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | }  // namespace kiwano
 |