125 lines
3.0 KiB
C++

#include "FiestaOnlineEditor.h"
Window*Window::focusedWindow=nullptr;
Window::Window(FiestaOnlineEditor*pge,std::string windowTitle,vi2d pos,vi2d size)
:pos(pos),size(size),windowTitle(windowTitle){
focusedWindow=this;
sprWindow=new Sprite(size.x,size.y+headerHeight);
decWindow=new Decal(sprWindow);
//InternalRefresh(pge);
}
Window::~Window(){};
void Window::InternalUpdate(FiestaOnlineEditor*pge,float fElapsedTime){
if(this==focusedWindow){
Update(pge,fElapsedTime);
}
if(dragging){
pos=pge->GetMousePos()-dragPoint;
}
if(pge->GetMouseX()>=pos.x+size.x||pge->GetMouseX()<pos.x+size.x-64||pge->GetMouseY()>=pos.y+headerHeight||pge->GetMouseY()<pos.y){
if(canClose){
canClose=false;
InternalRefresh(pge);
}
}
}
void Window::InternalRefresh(FiestaOnlineEditor*pge){
Sprite*prevDrawTarget=pge->GetDrawTarget();
pge->SetDrawTarget(sprWindow);
//Window background drawing
if(focusedWindow==this){
if(canClose){
pge->FillRect({0,headerHeight},size,VERY_DARK_RED);
} else {
pge->FillRect({0,headerHeight},size,VERY_DARK_BLUE);
}
} else {
if(canClose){
pge->FillRect({0,headerHeight},size,DARK_GREY);
} else {
pge->FillRect({0,headerHeight},size,VERY_DARK_GREY);
}
}
//All other drawing functions should go here.
pos.y+=headerHeight;
Refresh(pge);
pos.y-=headerHeight;
if(focusedWindow==this){
if(canClose){
pge->FillRect({0,0},{size.x,headerHeight},VERY_DARK_RED);
} else {
pge->FillRect({0,0},{size.x,headerHeight},VERY_DARK_BLUE);
}
} else {
if(canClose){
pge->FillRect({0,0},{size.x,headerHeight},DARK_GREY);
} else {
pge->FillRect({0,0},{size.x,headerHeight},VERY_DARK_GREY);
}
}
pge->DrawString({2,2},windowTitle,CYAN);
pge->DrawLine({1,10},{size.x-2,10},DARK_CYAN,0xFFFFFF00);
decWindow->Update();
pge->SetDrawTarget(prevDrawTarget);
}
bool Window::IsFocusedWindow(){
return focusedWindow==this;
}
void Window::Draw(FiestaOnlineEditor*pge){
pge->DrawDecal(pos,decWindow);
}
void Window::Cleanup(){
delete sprWindow;
delete decWindow;
}
bool Window::IsInBounds(vf2d point){
return point.x>=pos.x&&point.x<=pos.x+size.x&&point.y>=pos.y&&point.y<=pos.y+size.y+headerHeight;
}
void Window::InternalMouseFocus(FiestaOnlineEditor*pge){
if(pge->GetMouse(0).bPressed){
if(pge->GetMouseY()<pos.y+headerHeight){
dragging=true;
dragPoint=pge->GetMousePos()-pos;
}
if(focusedWindow!=this){
Window*prevFocusedWindow=focusedWindow;
focusedWindow=this;
InternalRefresh(pge);
prevFocusedWindow->InternalRefresh(pge);
}
}
if(pge->GetMouse(0).bReleased){
dragging=false;
}
if(pge->GetMouse(1).bPressed&&canClose){
closed=true;
}
if(pge->GetMouseX()>=pos.x+size.x-64&&pge->GetMouseY()<pos.y+headerHeight&&pge->GetMouseY()>=pos.y){
if(!canClose){
canClose=true;
InternalRefresh(pge);
}
}
}
void Window::MouseFocus(FiestaOnlineEditor*pge){}
bool Window::IsClosed(){
return closed;
}
void Window::SetFocusedWindow(FiestaOnlineEditor*pge,Window*w){
focusedWindow=w;
w->InternalRefresh(pge);
}