metaforce/Runtime/GuiSys/CGuiFrame.hpp

112 lines
4.0 KiB
C++
Raw Permalink Normal View History

2018-10-06 20:42:33 -07:00
#pragma once
2016-03-09 19:47:37 -08:00
2017-03-19 22:09:53 -07:00
#include <array>
#include <functional>
#include <memory>
#include <vector>
#include "Runtime/IObj.hpp"
#include "Runtime/GuiSys/CGuiHeadWidget.hpp"
#include "Runtime/GuiSys/CGuiWidgetIdDB.hpp"
#include "Runtime/GuiSys/CGuiWidget.hpp"
#include "Runtime/Graphics/CGraphics.hpp"
2021-04-10 01:42:06 -07:00
namespace metaforce {
2016-03-11 14:50:15 -08:00
class CGuiCamera;
class CGuiLight;
class CGuiSys;
class CLight;
class CObjectReference;
class CSimplePool;
class CVParamTransfer;
struct CFinalInput;
2016-03-11 14:50:15 -08:00
2018-12-07 21:30:43 -08:00
class CGuiFrame {
friend class CGuiSys;
2016-03-11 14:50:15 -08:00
private:
2018-12-07 21:30:43 -08:00
std::vector<CGuiLight*> m_indexedLights;
2018-05-06 16:47:55 -07:00
2018-12-07 21:30:43 -08:00
CAssetId x0_id;
u32 x4_ = 0;
CGuiSys& x8_guiSys;
std::shared_ptr<CGuiHeadWidget> xc_headWidget;
std::shared_ptr<CGuiWidget> x10_rootWidget;
std::shared_ptr<CGuiCamera> x14_camera;
CGuiWidgetIdDB x18_idDB;
std::vector<std::shared_ptr<CGuiWidget>> x2c_widgets;
std::vector<std::shared_ptr<CGuiLight>> x3c_lights;
int x4c_a;
int x50_b;
int x54_c;
mutable bool x58_24_loaded : 1 = false;
2016-03-14 16:32:44 -07:00
2018-12-07 21:30:43 -08:00
zeus::CTransform m_aspectTransform;
float m_aspectConstraint = -1.f;
float m_maxAspect = -1.f;
2017-01-29 20:16:20 -08:00
bool m_inMouseDown = false;
bool m_inCancel = false;
CGuiWidget* m_mouseDownWidget = nullptr;
CGuiWidget* m_lastMouseOverWidget = nullptr;
2019-01-19 22:43:11 -08:00
std::function<void(CGuiWidget*, CGuiWidget*)> m_mouseOverChangeCb;
2019-01-20 20:10:34 -08:00
std::function<void(CGuiWidget*, bool)> m_mouseDownCb;
std::function<void(CGuiWidget*, bool)> m_mouseUpCb;
std::function<void(CGuiWidget*, const SScrollDelta&, int, int)> m_mouseScrollCb;
2019-01-19 22:43:11 -08:00
2016-03-10 21:32:18 -08:00
public:
2018-12-07 21:30:43 -08:00
CGuiFrame(CAssetId id, CGuiSys& sys, int a, int b, int c, CSimplePool* sp);
~CGuiFrame();
2016-03-11 14:50:15 -08:00
2018-12-07 21:30:43 -08:00
CGuiSys& GetGuiSys() { return x8_guiSys; }
const CGuiSys& GetGuiSys() const { return x8_guiSys; }
2018-12-07 21:30:43 -08:00
CAssetId GetAssetId() const { return x0_id; }
2018-12-07 21:30:43 -08:00
CGuiLight* GetFrameLight(int idx) const { return m_indexedLights[idx]; }
CGuiCamera* GetFrameCamera() const { return x14_camera.get(); }
CGuiWidget* FindWidget(std::string_view name) const;
CGuiWidget* FindWidget(s16 id) const;
void SetFrameCamera(std::shared_ptr<CGuiCamera>&& camr) { x14_camera = std::move(camr); }
void SetHeadWidget(std::shared_ptr<CGuiHeadWidget>&& hwig) { xc_headWidget = std::move(hwig); }
CGuiHeadWidget* GetHeadWidget() const { return xc_headWidget.get(); }
void SortDrawOrder();
void EnableLights(ERglLight lights) const;
2018-12-07 21:30:43 -08:00
void DisableLights() const;
void RemoveLight(CGuiLight* light);
void AddLight(CGuiLight* light);
void RegisterLight(std::shared_ptr<CGuiLight>&& light);
bool GetIsFinishedLoading() const;
void Touch() const;
const zeus::CTransform& GetAspectTransform() const { return m_aspectTransform; }
void SetAspectConstraint(float c);
void SetMaxAspect(float c);
2019-01-19 22:43:11 -08:00
void SetMouseOverChangeCallback(std::function<void(CGuiWidget*, CGuiWidget*)>&& cb) {
m_mouseOverChangeCb = std::move(cb);
}
2021-06-07 12:29:18 -07:00
void SetMouseDownCallback(std::function<void(CGuiWidget*, bool)>&& cb) { m_mouseDownCb = std::move(cb); }
void SetMouseUpCallback(std::function<void(CGuiWidget*, bool)>&& cb) { m_mouseUpCb = std::move(cb); }
void SetMouseScrollCallback(std::function<void(CGuiWidget*, const SScrollDelta&, int, int)>&& cb) {
2019-01-21 20:23:51 -08:00
m_mouseScrollCb = std::move(cb);
}
2016-03-11 14:50:15 -08:00
void Reset();
2018-12-07 21:30:43 -08:00
void Update(float dt);
void Draw(const CGuiWidgetDrawParms& parms) const;
2019-01-19 22:43:11 -08:00
CGuiWidget* BestCursorHit(const zeus::CVector2f& point, const CGuiWidgetDrawParms& parms) const;
2018-12-07 21:30:43 -08:00
void Initialize();
void LoadWidgetsInGame(CInputStream& in, CSimplePool* sp, u32 version);
2018-12-07 21:30:43 -08:00
void ProcessUserInput(const CFinalInput& input) const;
bool ProcessMouseInput(const CFinalInput& input, const CGuiWidgetDrawParms& parms);
2019-01-22 23:52:19 -08:00
void ResetMouseState();
2016-03-11 14:50:15 -08:00
2018-12-07 21:30:43 -08:00
CGuiWidgetIdDB& GetWidgetIdDB() { return x18_idDB; }
const CGuiWidgetIdDB& GetWidgetIdDB() const { return x18_idDB; }
2016-03-11 14:50:15 -08:00
2018-12-07 21:30:43 -08:00
static std::unique_ptr<CGuiFrame> CreateFrame(CAssetId frmeId, CGuiSys& sys, CInputStream& in, CSimplePool* sp);
2016-03-10 21:32:18 -08:00
};
2016-03-09 19:47:37 -08:00
2018-12-07 21:30:43 -08:00
std::unique_ptr<IObj> RGuiFrameFactoryInGame(const SObjectTag& tag, CInputStream& in, const CVParamTransfer& vparms,
CObjectReference* selfRef);
2016-03-16 13:49:35 -07:00
2021-04-10 01:42:06 -07:00
} // namespace metaforce