66 lines
No EOL
1.7 KiB
C++
66 lines
No EOL
1.7 KiB
C++
//
|
|
// 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;
|
|
}
|
|
} |