// // Created by jedi on 11/5/18. // #include "node.h" #include "gfx/layout.h" void layout::render() { for (int j = 0; j < allocated_; j++) { node *node_ptr; if (node_ptr = slots[j].content) { slots[j].canvas_->clear(); node_ptr->render(*slots[j].canvas_); screen_.draw(slots[j].pos_, 0, *slots[j].canvas_); } } } int layout::apply(node* node) { int rootslot = allocate_(node, maxslots); int minsize = pack_(rootslot + 1); expand_(minsize); if (cursor == nullptr) cursor = slots[rootslot].content->getCursor(); return 0; } int layout::pack_(int usedslots) { int minsum = 0; int i; for (i = 0; i < usedslots; i++) { if (!slots[i].content) break; if (minsum + slots[i].content->minsize > maxwidth_) break; minsum += slots[i].content->minsize; } allocated_ = i; return minsum; } int layout::expand_(int packedsize) { int diff = maxwidth_ - packedsize; int pos = 0; for (int i = allocated_ - 1; i >= 0; i--) { slots[i].pos_ = pos; int size = slots[i].content->minsize + (diff * slots[i].content->minsize) / packedsize; if (size > slots[i].content->maxsize) size = slots[i].content->maxsize; slots[i].size_ = size; if(slots[i].canvas_) delete slots[i].canvas_; slots[i].canvas_ = new canvas(size, maxheight_); pos += size; } return 0; } int layout::allocate_(node* current, int depth) { if (node* next = current->getCursor()) { int i = allocate_(next, depth) + 1; slots[i].content = current; return i; } else { slots[0].content = current; return 0; } }