Extra2D/include/platform/window_module.h

154 lines
3.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <SDL.h>
#include <config/app_config.h>
#include <config/window_config.h>
#include <event/events.h>
#include <functional>
#include <memory>
#include <module/module.h>
#include <module/module_registry.h>
#include <types/math/size.h>
#include <types/math/vec2.h>
namespace extra2d {
/**
* @brief 窗口事件回调
*/
using ResizeCb = std::function<void(int32 w, int32 h)>;
using CloseCb = std::function<void()>;
/**
* @brief 窗口模块 - OpenGL ES 3.2 版本
*
* 管理 SDL2 窗口,支持 OpenGL ES 3.2 渲染
* 使用新的 Module 基类,支持自动注册
*/
class WindowModule : public Module {
// 自动注册到模块系统,优先级为 0最先初始化
E2D_REGISTER_MODULE(WindowModule, "Window", 0)
public:
WindowModule();
~WindowModule() override;
// 禁止拷贝和移动
WindowModule(const WindowModule &) = delete;
WindowModule &operator=(const WindowModule &) = delete;
WindowModule(WindowModule &&) = delete;
WindowModule &operator=(WindowModule &&) = delete;
// Module 接口实现
bool init() override;
void shutdown() override;
/**
* @brief 使用配置创建窗口
*/
bool create(const WindowCfg &cfg);
/**
* @brief 处理窗口事件
* @return true 继续运行false 应退出
*/
bool pollEvents();
/**
* @brief 获取 SDL 窗口句柄
*/
SDL_Window *handle() const { return window_; }
/**
* @brief 获取窗口尺寸
*/
Size getSize() const;
/**
* @brief 获取窗口位置
*/
Vec2 getPosition() const;
/**
* @brief 设置窗口尺寸
*/
void setSize(int32 w, int32 h);
/**
* @brief 设置窗口标题
*/
void setTitle(const std::string &title);
/**
* @brief 设置全屏模式
*/
void setFullscreen(bool fullscreen);
/**
* @brief 检查是否全屏
*/
bool isFullscreen() const;
/**
* @brief 显示/隐藏窗口
*/
void setVisible(bool visible);
/**
* @brief 检查窗口是否可见
*/
bool isVisible() const;
/**
* @brief 设置窗口关闭回调
*/
void setOnClose(CloseCb cb) { onClose_ = std::move(cb); }
/**
* @brief 设置窗口大小改变回调
*/
void setOnResize(ResizeCb cb) { onResize_ = std::move(cb); }
/**
* @brief 请求关闭窗口
*/
void requestClose() { shouldClose_ = true; }
/**
* @brief 检查是否应该关闭
*/
bool shouldClose() const { return shouldClose_; }
private:
void handleWindowEvent(const SDL_WindowEvent &evt);
/**
* @brief 监听模块配置事件
* @param config 应用配置对象
*
* 处理 AppConfig 类型的配置,创建窗口
*/
void onModuleConfig(const AppConfig &config);
/**
* @brief 监听渲染呈现事件
*
* 当渲染完成时调用 swapBuffers 呈现渲染结果
*/
void onRenderPresent();
SDL_Window *window_ = nullptr;
bool shouldClose_ = false;
CloseCb onClose_;
ResizeCb onResize_;
// 模块配置事件监听器
std::unique_ptr<events::OnModuleConfig<AppConfig>::Listener> configListener_;
// 渲染呈现事件监听器
std::unique_ptr<events::OnRenderPresent::Listener> renderPresentListener_;
};
} // namespace extra2d