void StackLayout::doRelayout() { const List<DisplayItem *> &items = getItems(); DisplayItem *inputField = items.getAt(0); int bottom; if (isItemVisible(inputField)) { setItemSize(inputField, getWidth(), font->getLineHeight()); bottom = getHeight() - inputField->getHeight(); setItemPosition(inputField, 0, bottom); } else { bottom = getHeight(); } int i = 0; upperItemNr = 0; while (bottom > 0 && i + firstLevelVisible < stack->getLength()) { upperItemNr++; DisplayItem *item; if (items.getLength() <= upperItemNr) { item = stack->getAt(i + firstLevelVisible)->getDisplayItem(*font); addItem(item); } else { item = items.getAt(upperItemNr); if (item == NULL) { item = stack->getAt(i + firstLevelVisible)->getDisplayItem(*font); setItemAt(upperItemNr, item); } } if (item) { int nw = getNumberWidth(upperItemNr + firstLevelVisible); setItemSize(item, getWidth() - nw, -1); int h = item->getHeight(); if (h < font->getLineHeight()) h = font->getLineHeight(); bottom -= h; int w = item->getWidth(); if (w < getWidth() - nw) setItemPosition(item, getWidth() - w, bottom); else setItemPosition(item, nw, bottom); } else { bottom -= font->getLineHeight(); } i++; } while (items.getLength() > upperItemNr + 1) { removeItemAt(upperItemNr + 1); } while (bottom > 0) { upperItemNr++; bottom -= font->getLineHeight(); } upperItemScanStart = -bottom; }
void StackLayout::processLine(uint8_t *pixelData, int dataOffset) { if (itemNr < 0) return; if (itemScanLine >= getItemHeight(itemNr)) { itemScanLine = 0; if (--itemNr < 0) return; currentNumberWidth = getNumberWidth(itemNr + firstLevelVisible); } DisplayItem *item = NULL; if (itemNr < getItems().getLength()) item = getItems().getAt(itemNr); if (itemScanLine == 0 && item) { if (drawOffsetX <= item->getX()) item->initLineScanning(0, 0, drawWidth - item->getX()); else item->initLineScanning(0, drawOffsetX - item->getX(), drawWidth); } if (itemNr > 0) drawNumber(pixelData, dataOffset, itemNr + firstLevelVisible); if (item != NULL && isItemVisible(item)) { if (itemScanLine < item->getHeight()) { if (drawOffsetX <= item->getX()) item->processLine(pixelData, dataOffset + item->getX() - drawOffsetX); else item->processLine(pixelData, dataOffset); } } itemScanLine++; }
int StackLayout::getItemHeight(int i) { if (i >= getItems().getLength()) return font->getLineHeight(); int h = 0; DisplayItem *item = getItems().getAt(i); if (item) h = item->getHeight(); if (h < font->getLineHeight()) h = font->getLineHeight(); return h; }