125 lines
3.0 KiB
C++
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);
|
|
} |