Size BarPane::GetPaneSize(bool horz, int maxsize) const { int msz = maxsize; maxsize -= 2 * (horz ? hmargin : vmargin); Size asz(0, 0); int bmargin = horz ? vmargin : hmargin; VeHo(horz, asz) = bmargin; Array<Item>::ConstIterator q = item.Begin(); while(q < item.End()) { Size psz(0, 0); while(q < item.End()) { if(q->ctrl == NULL && IsNull(q->gapsize)) { q++; break; } int gapsize = q->gapsize; if(gapsize == INT_MAX && q->ctrl == NULL) { if(msz == INT_MAX) { q++; break; } gapsize = 0; Array<Item>::ConstIterator w = q + 1; while(w < item.End()) { if(!w->ctrl) break; Size sz = w->ctrl->GetMinSize(); if(HoVe(horz, psz) + gapsize + HoVe(horz, sz) > maxsize) break; gapsize += HoVe(horz, sz); w++; } gapsize = maxsize - gapsize - HoVe(horz, psz); } Size sz = q->ctrl ? q->ctrl->GetMinSize() : Size(horz ? gapsize : 0, horz ? 0 : gapsize); if(HoVe(horz, psz) + HoVe(horz, sz) >= maxsize && HoVe(horz, psz)) { while(q < item.End() && q->ctrl == NULL && !IsNull(q->gapsize)) q++; break; } VeHo(horz, psz) = max(VeHo(horz, psz), VeHo(horz, sz)); HoVe(horz, psz) += HoVe(horz, sz); q++; } int& bp = VeHo(horz, asz); if(bp > bmargin) bp += 2 + 2 * bmargin; bp += VeHo(horz, psz); HoVe(horz, asz) = max(HoVe(horz, asz), HoVe(horz, psz)); } VeHo(horz, asz) += bmargin; HoVe(horz, asz) += horz ? 2 * hmargin : 2 * vmargin; LLOG("Size " << Name() << " " << asz); return asz + Size(2 * hmargin, 2 * vmargin); }
int main() { int a[12], b[20]; const int sz1 = asz(a); const int sz2 = asz(b); int c[sz1], d[sz2]; } ///:~
Size BarPane::Repos(bool _horz, int maxsize) { horz = _horz; maxsize -= 2 * (horz ? hmargin : vmargin); int bmargin = horz ? vmargin : hmargin; breakpos.Clear(); Size asz(0, 0); VeHo(asz) = bmargin; Array<Item>::Iterator q = item.Begin(); while(q < item.End()) { Size psz(0, 0); Array<Item>::Iterator f = q; while(q < item.End()) { if(q->ctrl == NULL && IsNull(q->gapsize)) { q++; break; } int gapsize = q->gapsize; if(gapsize == INT_MAX && q->ctrl == NULL) { if(maxsize == INT_MAX) { q++; break; } gapsize = 0; Array<Item>::Iterator w = q + 1; while(w < item.End()) { if(!w->ctrl) break; Size sz = w->ctrl->GetMinSize(); if(HoVe(psz) + gapsize + HoVe(sz) > maxsize) break; gapsize += HoVe(sz); w++; } gapsize = maxsize - gapsize - HoVe(psz); } Size sz = q->ctrl ? q->ctrl->GetMinSize() : Size(horz ? gapsize : 0, horz ? 0 : gapsize); if(HoVe(sz) == INT_MAX) HoVe(sz) = maxsize - HoVe(psz); if(HoVe(psz) + HoVe(sz) > maxsize && HoVe(psz)) { while(q < item.End() && q->ctrl == NULL && !IsNull(q->gapsize)) q++; break; } VeHo(psz) = max(VeHo(psz), VeHo(sz)); if(q->ctrl) { if(horz) q->ctrl->LeftPos(psz.cx + hmargin, sz.cx); else q->ctrl->TopPos(psz.cy + vmargin, sz.cy); } HoVe(psz) += HoVe(sz); q++; } int& bp = VeHo(asz); if(bp > bmargin) { breakpos.Add(bp + bmargin); bp += 2 + 2 * bmargin; } while(f != q) { if(f->ctrl) { if(horz) f->ctrl->TopPos(bp, psz.cy); else f->ctrl->LeftPos(bp, psz.cx); } f++; } bp += VeHo(psz); HoVe(asz) = max(HoVe(asz), HoVe(psz)); } VeHo(asz) += bmargin; HoVe(asz) += horz ? 2 * hmargin : 2 * vmargin; LLOG("Repos " << Name() << " " << asz); return asz; }