예제 #1
0
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();
        }
    }
}
예제 #2
0
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++;
}
예제 #3
0
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();
        }
    }
}