#pragma once #include "Menu.h" #include "MenuComponent.h" #include "Crawler.h" class ScrollableWindowComponent:public MenuComponent{ protected: Renderable r; std::vectorcomponents; vf2d scrollOffset{}; geom2d::rectbounds; public: inline ScrollableWindowComponent(MenuType parent,geom2d::rectrect,Decal*icon,MenuFunc onClick) :MenuComponent(parent,rect,"",onClick,false){ r.Create(rect.size.x,rect.size.y); } protected: virtual inline void Update(Crawler*game)override{ MenuComponent::Update(game); for(MenuComponent*component:components){ component->Update(game); } } virtual inline void Draw(Crawler*game,vf2d parentPos,bool focused)override{ MenuComponent::Draw(game,parentPos,focused); Sprite*prevDrawTarget=game->GetDrawTarget(); game->SetDrawTarget(r.Sprite()); game->Clear(BLANK); for(MenuComponent*component:components){ component->Draw(game,scrollOffset,focused); } game->SetDrawTarget(prevDrawTarget); game->DrawSprite(parentPos,r.Sprite()); } virtual inline void DrawDecal(Crawler*game,vf2d parentPos,bool focused)override{ MenuComponent::DrawDecal(game,parentPos,focused); game->DrawRectDecal(parentPos,rect.size); for(MenuComponent*component:components){ component->DrawDecal(game,parentPos+scrollOffset,focused); } } public: void inline AddComponent(Menu*parentMenu,std::string key,MenuComponent*button){ components.push_back(button); button->renderInMain=false; //Now we are in control! if(button->rect.pos.xrect.pos.x; bounds.size.x+=sizeIncrease; bounds.pos.x=button->rect.pos.x; } if(button->rect.right().start.x>bounds.right().start.x){ float sizeIncrease=button->rect.right().start.x-bounds.right().start.x; bounds.size.x+=sizeIncrease; } if(button->rect.pos.yrect.pos.y; bounds.size.y+=sizeIncrease; bounds.pos.y=button->rect.pos.y; } if(button->rect.bottom().start.y>bounds.bottom().start.y){ float sizeIncrease=button->rect.bottom().start.y-bounds.bottom().start.y; bounds.size.y+=sizeIncrease; } parentMenu->AddComponent(key,button); } };