#pragma once #include "Menu.h" #include "MenuComponent.h" #include "Crawler.h" class ScrollableWindowComponent:public MenuComponent{ protected: Renderable r; std::vectorcomponents; vf2d scrollOffset{}; geom2d::rectbounds; //It's for the scrollbar. private: inline bool OnScreen(MenuComponent*component){ return geom2d::overlaps(rect,geom2d::rect{component->rect.pos+scrollOffset,component->rect.size}); } 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); if(game->GetMouseWheel()!=0){ if(game->GetMouseWheel()>0){ scrollOffset.y+="ThemeGlobal.MenuScrollWheelSpeed"_I; }else{ scrollOffset.y-="ThemeGlobal.MenuScrollWheelSpeed"_I; } } for(MenuComponent*component:components){ component->disabled=!OnScreen(component); 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); } } virtual bool GetHoverState(Crawler*game,MenuComponent*child)override{ return geom2d::overlaps(geom2d::rect{Menu::menus[parentMenu]->pos+child->rect.pos+scrollOffset,child->rect.size},game->GetMousePos()); } public: void inline AddComponent(Menu*parentMenu,std::string key,MenuComponent*button){ components.push_back(button); button->renderInMain=false; //Now we are in control! button->parentComponent=this; 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); } virtual inline bool PointWithinParent(MenuComponent*child,vi2d drawPos)override{ return geom2d::overlaps(geom2d::rect{Menu::menus[parentMenu]->pos+rect.pos,rect.size},drawPos); } };