Files
tessesframework/src/SDL2/Views/CheckView.cpp

134 lines
4.4 KiB
C++

#if defined(TESSESFRAMEWORK_ENABLE_SDL2)
#include "TessesFramework/SDL2/Views/CheckView.hpp"
namespace Tesses::Framework::SDL2::Views
{
void CheckView::OnCheckChanged(GUIEventArgs& event)
{
}
void CheckView::OnDraw(SDL_Renderer* renderer, SDL_Rect& r)
{
auto win = this->GetWindow();
const int checkSz=32;
SDL_Rect checkBoxRect={.x=r.x,.y=r.y+((r.h/2)-(checkSz/2)),.w=checkSz,.h=checkSz};
int textW;
int textH;
win->normal_font->CalculateSize(this->text,textW,textH);
//we only need the y
int x = r.x+checkSz+8;
int y = r.y+((r.h/2)-(textH/2));
win->normal_font->Render(renderer,x,y,text,win->palette.accent);
if(this->GetViewFlag(VIEWFLAG_CHECKED))
{
SDL_SetRenderDrawColor(renderer,win->palette.accent.r,win->palette.accent.g,win->palette.accent.b,win->palette.accent.a);
//x=0,y=0.5, x=0.5, y=1
int x1=checkBoxRect.x+4;
int y1=checkBoxRect.y+4+((checkSz-8)/2);
int x2=checkBoxRect.x+4+((checkSz-8)/2);
int y2=checkBoxRect.y+4+(checkSz-8);
int x3=checkBoxRect.x+4+(checkSz-8);
int y3=checkBoxRect.y+4;
for(int i = 0; i < 4; i++)
{
SDL_RenderDrawLine(renderer,x1,y1-i,x2,y2-i);
SDL_RenderDrawLine(renderer,x2-i,y2,x3-i,y3);
}
}
auto isHovering = this->GetViewFlag(VIEWFLAG_HOVER_STATE);
auto isActive = this->GetViewFlag(VIEWFLAG_ISACTIVE);
auto isMouseDown = this->GetViewFlag(VIEWFLAG_MOUSEDOWN_STATE);
SDL_Color& color = win->palette.GetBorderColor(isHovering,isActive,isMouseDown);
SDL_SetRenderDrawColor(renderer,color.r,color.g,color.b,color.a);
for(int i = 0; i < 4; i++)
{
SDL_RenderDrawRect(renderer,&checkBoxRect);
checkBoxRect.x++;
checkBoxRect.y++;
checkBoxRect.w-=2;
checkBoxRect.h-=2;
}
}
bool CheckView::OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds)
{
if(this->GetViewFlag(VIEWFLAG_ISACTIVE))
{
if(event.type == SDL_KEYUP)
{
switch(event.key.keysym.sym)
{
case SDL_KeyCode::SDLK_SPACE:
{
GUIEventArgs e;
this->SetViewFlag(VIEWFLAG_CHECKED,!this->GetViewFlag(VIEWFLAG_CHECKED));
this->OnClick(e);
this->Click.Invoke(this,e);
this->OnCheckChanged(e);
this->CheckChanged.Invoke(this,e);
} break;
}
}
}
if(event.type == SDL_FINGERUP)
{
auto pos = this->GetCordFromEvent(event);
if(pos.first >= visibleBounds.x && pos.first < visibleBounds.x+visibleBounds.w && pos.second >= visibleBounds.y && pos.second < visibleBounds.y+visibleBounds.h)
{
this->GetWindow()->MakeActive(this);
this->SetViewFlag(VIEWFLAG_CHECKED,!this->GetViewFlag(VIEWFLAG_CHECKED));
GUIEventArgs e;
this->OnCheckChanged(e);
this->CheckChanged.Invoke(this,e);
}
}
if(event.type == SDL_MOUSEBUTTONUP)
{
if(event.button.x >= visibleBounds.x && event.button.x < visibleBounds.x+visibleBounds.w && event.button.y >= visibleBounds.y && event.button.y < visibleBounds.y+visibleBounds.h)
{
this->GetWindow()->MakeActive(this);
this->SetViewFlag(VIEWFLAG_CHECKED,!this->GetViewFlag(VIEWFLAG_CHECKED));
GUIEventArgs e;
this->OnCheckChanged(e);
this->CheckChanged.Invoke(this,e);
}
}
return View::OnEvent(event,myBounds,visibleBounds);
}
CheckView::CheckView(bool checked, std::string label) : View(label)
{
this->SetViewFlag(VIEWFLAG_CHECKED,checked);
}
CheckView::CheckView() : View()
{
this->SetViewFlag(VIEWFLAG_CHECKED,false);
}
bool CheckView::GetChecked()
{
return this->GetViewFlag(VIEWFLAG_CHECKED);
}
void CheckView::SetChecked(bool value)
{
this->SetViewFlag(VIEWFLAG_CHECKED,true);
}
}
#endif