forked from Mirror/libstarlight
96 lines
3.0 KiB
C++
96 lines
3.0 KiB
C++
#pragma once
|
|
#include "starlight/_global.h"
|
|
|
|
#include <memory>
|
|
#include <list>
|
|
#include <functional>
|
|
#include <type_traits>
|
|
|
|
#include "starlight/datatypes/Vector2.h"
|
|
#include "starlight/datatypes/VRect.h"
|
|
|
|
#include "starlight/ui/UIContainer.h"
|
|
|
|
// Form subclasses should also derive from FormCreator, with their own typename as the template argument
|
|
// class WhateverForm : public Form, public FormCreator<WhateverForm>
|
|
|
|
namespace starlight {
|
|
namespace ui {
|
|
enum class FormFlags : unsigned int {
|
|
visible = 1 << 0,
|
|
canOcclude = 1 << 1,
|
|
occludeTouch = 1 << 2,
|
|
occludeTop = 1 << 3,
|
|
|
|
open = 1 << 30
|
|
};
|
|
typedef std::underlying_type<FormFlags>::type FormFlags_t;
|
|
|
|
class Form;
|
|
template<class F>
|
|
class FormCreator {
|
|
public:
|
|
template<typename ... Args>
|
|
static std::shared_ptr<F> New(Args... args) {
|
|
auto f = std::make_shared<F>(args...);
|
|
// ... hmm. do I "make live" here, or have a distinct Open call to insert it into the Application's list?
|
|
return f;
|
|
}
|
|
};
|
|
|
|
class Form : public std::enable_shared_from_this<Form> {
|
|
////////////////////
|
|
// STATIC MEMBERS //
|
|
////////////////////
|
|
private:
|
|
static unsigned int nextShowCounter; // you're not going to end up showing forms 4.3 billion times in a single session
|
|
|
|
public:
|
|
static bool OrderedCompare(std::shared_ptr<Form>& f1, std::shared_ptr<Form>& f2);
|
|
|
|
//////////////////////
|
|
// INSTANCE MEMBERS //
|
|
//////////////////////
|
|
private:
|
|
unsigned int showCounter;
|
|
|
|
protected:
|
|
//
|
|
|
|
public:
|
|
int priority;
|
|
unsigned int flags;
|
|
|
|
std::shared_ptr<UIContainer> touchScreen = nullptr;
|
|
std::shared_ptr<UIContainer> topScreen = nullptr;
|
|
|
|
Form() { }
|
|
virtual ~Form() { }
|
|
|
|
void Open();
|
|
void Close();
|
|
void Show();
|
|
void Hide();
|
|
|
|
//virtual void Init() { }
|
|
virtual void Update(bool focused) { }
|
|
//virtual void PostUpdate(bool focused) { }
|
|
//virtual void Draw() { }
|
|
//virtual void PostDraw() { }
|
|
//virtual void End() { }
|
|
virtual void OnShow() { }
|
|
virtual void OnHide() { }
|
|
|
|
// convenience
|
|
inline bool GetFlag(FormFlags f) { return flags & static_cast<unsigned int>(f); }
|
|
inline void SetFlag(FormFlags f, bool b) {
|
|
auto ff = static_cast<unsigned int>(f);
|
|
flags &= ~ff; if (b) flags |= ff;
|
|
}
|
|
|
|
inline bool IsVisible() { return GetFlag(FormFlags::visible); }
|
|
|
|
};
|
|
}
|
|
}
|