WIP: GUI Toolkit
This commit is contained in:
77
LinearLayout.cc
Normal file
77
LinearLayout.cc
Normal file
@@ -0,0 +1,77 @@
|
||||
|
||||
#include "LinearLayout.hh"
|
||||
|
||||
LinearLayout::LinearLayout(int direction, int width, int height, std::string name)
|
||||
: View(width, height, std::move(name)), direction_(direction)
|
||||
{
|
||||
}
|
||||
|
||||
LinearLayout::~LinearLayout()
|
||||
{
|
||||
}
|
||||
|
||||
void LinearLayout::setChildPadding(int pad)
|
||||
{
|
||||
if (pad != padChildren_) {
|
||||
padChildren_ = pad;
|
||||
|
||||
layout();
|
||||
}
|
||||
}
|
||||
|
||||
void LinearLayout::layout()
|
||||
{
|
||||
// TODO: Respect parent padding
|
||||
if ((width_ == MATCH_PARENT) && parent_)
|
||||
realWidth_ = parent_->getRealWidth();
|
||||
|
||||
if ((height_ == MATCH_PARENT) && parent_)
|
||||
realHeight_ = parent_->getRealHeight();
|
||||
|
||||
if (direction_ == DIR_VERTICAL) {
|
||||
int contentWidth = 0;
|
||||
|
||||
if (width_ == WRAP_CONTENT) {
|
||||
// Determine content width
|
||||
for(auto& ent : children_) {
|
||||
auto& child = *(std::get<1>(ent));
|
||||
assert(child.getHeight() != MATCH_PARENT);
|
||||
if (child.getWidth() == MATCH_PARENT)
|
||||
continue;
|
||||
if (child.getWidth() == WRAP_CONTENT)
|
||||
_layout(child);
|
||||
contentWidth = std::max(contentWidth, child.getRealWidth());
|
||||
}
|
||||
assert(contentWidth > 0);
|
||||
realWidth_ = contentWidth + padLeft_ + padRight_;
|
||||
printf("Inner width: %d, outer width: %d\n", contentWidth, realWidth_);
|
||||
}
|
||||
|
||||
int currentY = padTop_;
|
||||
|
||||
// Layout children
|
||||
for(auto& ent : children_) {
|
||||
auto& child = *(std::get<1>(ent));
|
||||
if (child.getWidth() == MATCH_PARENT)
|
||||
_layout(child);
|
||||
|
||||
SDL_Rect cr;
|
||||
cr.x = padLeft_;
|
||||
cr.y = currentY;
|
||||
if ((realWidth_ - padLeft_ - padRight_) > child.getRealWidth())
|
||||
cr.w = child.getRealWidth();
|
||||
else
|
||||
cr.w = realWidth_ - padLeft_ - padRight_;
|
||||
cr.h = child.getRealHeight();
|
||||
|
||||
std::get<2>(ent) = cr;
|
||||
|
||||
currentY += child.getRealHeight() + padChildren_;
|
||||
}
|
||||
|
||||
if (height_ == WRAP_CONTENT)
|
||||
realHeight_ = currentY - padChildren_ + padBottom_;
|
||||
}
|
||||
|
||||
invalidateGL();
|
||||
}
|
||||
Reference in New Issue
Block a user