Пример #1
0
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);
}
Пример #2
0
int main() {
  int a[12], b[20];
  const int sz1 = asz(a);
  const int sz2 = asz(b);
  int c[sz1], d[sz2];
} ///:~
Пример #3
0
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;
}