void CtrlTree::onUpdate( Subject<VarTree, tree_update> &rTree, tree_update *arg ) { if( arg->type == arg->UpdateItem ) // Item update { if( arg->b_active_item ) autoScroll(); if( isItemVisible( arg->i_id ) ) { makeImage(); notifyLayout(); } } else if ( arg->type == arg->ResetAll ) // Global change or deletion { m_firstPos = m_flat ? m_rTree.firstLeaf() : m_rTree.begin(); makeImage(); notifyLayout(); } else if ( arg->type == arg->AppendItem ) // Item-append { if( m_flat && m_firstPos->size() ) { m_firstPos = m_rTree.getNextLeaf( m_firstPos ); makeImage(); notifyLayout(); } else if( isItemVisible( arg->i_id ) ) { makeImage(); notifyLayout(); } } else if( arg->type == arg->DeleteItem ) // item-del { /* Make sure firstPos is valid */ VarTree::Iterator it_old = m_firstPos; while( m_firstPos->isDeleted() && m_firstPos != (m_flat ? m_rTree.firstLeaf() : m_rTree.begin()) ) { m_firstPos = m_flat ? m_rTree.getPrevLeaf( m_firstPos ) : m_rTree.getPrevVisibleItem( m_firstPos ); } if( m_firstPos->isDeleted() ) m_firstPos = m_rTree.begin(); if( m_firstPos != it_old || isItemVisible( arg->i_id ) ) { makeImage(); notifyLayout(); } } }
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++; }
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 CtrlTree::onUpdate( Subject<VarTree, tree_update> &rTree, tree_update *arg ) { (void)rTree; if( arg->type == arg->ItemInserted ) { if( isItemVisible( arg->it ) ) { makeImage(); notifyLayout(); } setSliderFromFirst(); } else if( arg->type == arg->ItemUpdated ) { if( arg->it->isPlaying() ) { m_rTree.ensureExpanded( arg->it ); ensureVisible( arg->it ); makeImage(); notifyLayout(); setSliderFromFirst(); } else if( isItemVisible( arg->it ) ) { makeImage(); notifyLayout(); } } else if( arg->type == arg->DeletingItem ) { if( isItemVisible( arg->it ) ) m_bRefreshOnDelete = true; // remove all references to arg->it // if it is the one about to be deleted if( m_firstPos == arg->it ) { m_firstPos = getNearestItem( arg->it ); } if( m_lastClicked == arg->it ) { m_lastClicked = getNearestItem( arg->it ); m_lastClicked->setSelected( arg->it->isSelected() ); } } else if( arg->type == arg->ItemDeleted ) { if( m_bRefreshOnDelete ) { m_bRefreshOnDelete = false; makeImage(); notifyLayout(); } setSliderFromFirst(); } else if( arg->type == arg->ResetAll ) { m_lastClicked = m_rTree.end(); m_firstPos = getFirstFromSlider(); makeImage(); notifyLayout(); setSliderFromFirst(); } else if( arg->type == arg->SliderChanged ) { Iterator it = getFirstFromSlider(); if( m_firstPos != it ) { m_firstPos = it; makeImage(); notifyLayout(); } } }