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; }