DMS/DMS/gui.h

142 lines
3.7 KiB
C++

#pragma once
#include "window.h"
#include "pch.h"
#include "dms_state.h"
namespace gui {
using namespace std;
using namespace dms;
int __ElementCount = 0;
void init(dms_state* state) {
// While very unlikely it is possible multiple windows to be created! It might be a good idea to support it sometime down the line
window::OnWindowCreated += [](sf::RenderWindow* window) {
};
}
/*
textbox
textbutton
textlabel
frame
imagelabel
imagebutton
anim/sprite
video
*/
enum class gui_types{frame,text,text,image,sprite,video};
struct Dim {
float x;
float y;
Dim() {x = 0;y = 0;}
Dim(const Dim &d) { x = d.x; y = d.y;}
Dim(float x, float y) { this->x = x; this->y = y;}
inline void Set(Dim d) {x = d.x; y = d.y;}
inline void Set(float x, float y) { this->x = x; this->y = y;}
};
struct DualDim {
Dim Position;
Dim Size;
DualDim() {Position.x = 0;Position.y = 0;Size.x = 0;Size.y = 0;}
DualDim(const DualDim& d) { Position = d.Position; Size = d.Size;}
DualDim(Dim pos, Dim size) { Position = pos; Size = size;}
DualDim(float x, float y, float x2, float y2) { Position.x = x; Position.y = y; Size.x = x2; Size.y = y2; }
inline void Set(DualDim d){ Position = d.Position; Size = d.Size;}
inline void Set(Dim pos, Dim size) {Position.x = pos.x;Position.y = pos.y;Size.x = size.x;Size.y = size.y;}
inline void Set(float x, float y, float x2, float y2) { Position.x = x; Position.y = y; Size.x = x2; Size.y = y2;}
};
struct MouseStats {
float x;
float y;
float dx;
float dy;
char button;
MouseStats(Dim pos, char b) {
x = pos.x;
y = pos.y;
button = b;
}
MouseStats(float xx, float yy, char b) {
x = xx;
y = yy;
button = b;
}
MouseStats(float xx, float yy, float dxx, float dyy) {
x = xx;
y = yy;
dx = dxx;
dy = dyy;
button = 0;
}
};
struct Keyboard {
//
};
struct guibase {
//Connections and objects to inheret
multi::connection<MouseStats> OnPressed;
multi::connection<MouseStats> OnReleased;
multi::connection<MouseStats> OnPressedOuter;
multi::connection<MouseStats> OnReleasedOuter;
multi::connection<MouseStats> OnMousedMoved;
multi::connection<MouseStats> WhileHovering;
multi::connection<MouseStats> OnMouseEnter;
multi::connection<MouseStats> OnMouseExit;
multi::connection<gui*> OnUpdate;
};
class gui : guibase {
public:
gui_types Type;
DualDim Offset;
DualDim Scale;
DualDim Absolute;
vector<gui> Children;
bool Visible = true;
//map<string, gui*> Named;
gui() {__ElementCount++;}
gui(DualDim offset, DualDim scale) { Offset = offset; Scale = scale;}
gui(float x,float y,float w,float h,float sx,float sy,float sw,float sh){Offset.Position.x = x;Offset.Position.y = y;Offset.Size.x = w;Offset.Size.y = h;Scale.Position.x = sx;Scale.Position.y = sy;Scale.Size.x = sw;Scale.Size.y = sh;}
void SetDualDim(DualDim offset,DualDim scale) {Offset = offset;Scale = scale;}
virtual void Draw() {
return; // Override this.
}
inline vector<gui>& GetChildren() {return Children;}
inline void GetAllChildren(vector<gui*>& ref) {
auto temp = GetChildren();
for (int i = 0; i < temp.size(); i++) {
ref.push_back(&temp[i]);
temp[i].GetAllChildren(ref);
}
}
inline vector<gui*> GetAllChildren() {
auto temp = GetChildren();
vector<gui*> everything;
everything.reserve(__ElementCount); // Reserve all the current elements that exist
for (int i = 0; i < temp.size(); i++) {
everything.push_back(&temp[i]);
temp[i].GetAllChildren(everything);
}
return everything;
}
};
// Draw Everything
gui _Root;
void Draw() {
auto childs = _Root.GetAllChildren();
for (int i = 0; i < childs.size(); i++) {
childs[i]->Draw();
}
}
}