Esempio n. 1
0
Surface* List::render(void)
{
	Surface *buffer = new Surface(width, height);
	buffer->fill(background);

    std::vector<ValueObject*>::iterator lit(values.begin()), lend(values.end());
	int i=0;
	int cy = 0;
	SDL_Rect *src = new SDL_Rect();
	SDL_Rect *dst = new SDL_Rect();
    PRect rect = PRect();
    rect.setX(0);
    rect.setWidth(width);
    rect.setHeight(lineHeight);

    if(_showScrollButtons)
    {
        rect.setWidth(width - upArrow->getWidth());
    }

	for(;lit!=lend;++lit)
	{
	    if(i >= viewIndex)
        {
            Surface *str_sur;
            ValueObject *vo = (*lit);
            bool free_str = false;
            if(i == selectedIndex)
            {
                free_str = true;
                str_sur = font->renderText(vo->getText(), highlightForeground);

                rect.setY(cy);

                rect.fill(buffer->getSDLSurface(), highlightBackground);

            }
            else
            {
                str_sur = strBuffers[vo->getId()];
            }

            str_sur->updateSDLRect(src);
            str_sur->updateSDLRect(dst, 0, cy);

            buffer->blit(str_sur, src, dst);

            if(free_str)
            {
                delete str_sur;
            }

            cy += lineHeight;
        }

		i++;

		if(cy > height - lineHeight && viewIndex == 0)
        {
            _showScrollButtons = true;
            break;
        }
	}

	if(cy < height && viewIndex == 0)
    {
        _showScrollButtons = false;
    }

	if(_showScrollButtons)
    {

        upArrow->updateSDLRect(src);
        upArrow->updateSDLRect(dst, width - upArrow->getWidth(), 0);

        buffer->blit(upArrow, src, dst);

        downArrow->updateSDLRect(src);
        downArrow->updateSDLRect(dst, width - downArrow->getWidth(), height - downArrow->getHeight());

        buffer->blit(downArrow, src, dst);

    }

    if(drawBorder)
    {
        PRect border = PRect(0, 0, width, height);
        buffer->draw(&border, foreground);
    }

	delete src;
	delete dst;

	return buffer;
}