gui: introduce virtual RenderItem method in ScrollList

- so derived lists can draw whatever they want (multi-line etc.)
- replace GetListItem with RenderItem
- minor cleanup

Change-Id: I062e0a354f1c18ce0a5232b7542c4987b480e232
This commit is contained in:
that
2015-03-05 04:46:10 +01:00
committed by Dees Troy
parent e738da5e89
commit 0af7795690
5 changed files with 83 additions and 80 deletions
+52 -54
View File
@@ -42,7 +42,6 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
mHeaderIsStatic = false;
mBackground = mHeaderIcon = NULL;
mFont = NULL;
mBackgroundW = mBackgroundH = 0;
mFastScrollW = mFastScrollLineW = mFastScrollRectW = mFastScrollRectH = 0;
mFastScrollRectCurrentY = mFastScrollRectCurrentH = mFastScrollRectTouchY = 0;
lastY = last2Y = fastScroll = 0;
@@ -142,12 +141,6 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
if (actualItemHeight / 3 > 6)
touchDebounce = actualItemHeight / 3;
if (mBackground && mBackground->GetResource())
{
mBackgroundW = mBackground->GetWidth();
mBackgroundH = mBackground->GetHeight();
}
}
GUIScrollList::~GUIScrollList()
@@ -207,16 +200,18 @@ int GUIScrollList::Render(void)
// Next, render the background resource (if it exists)
if (mBackground && mBackground->GetResource())
{
int mBackgroundX = mRenderX + ((mRenderW - mBackgroundW) / 2);
int mBackgroundY = mRenderY + ((mRenderH - mBackgroundH) / 2);
gr_blit(mBackground->GetResource(), 0, 0, mBackgroundW, mBackgroundH, mBackgroundX, mBackgroundY);
int BackgroundW = mBackground->GetWidth();
int BackgroundH = mBackground->GetHeight();
int BackgroundX = mRenderX + ((mRenderW - BackgroundW) / 2);
int BackgroundY = mRenderY + ((mRenderH - BackgroundH) / 2);
gr_blit(mBackground->GetResource(), 0, 0, BackgroundW, BackgroundH, BackgroundX, BackgroundY);
}
// This tells us how many full lines we can actually render
size_t lines = GetDisplayItemCount();
size_t listSize = GetItemCount();
int listW = mRenderW;
int listW = mRenderW; // this is only used for the separators - the list items are rendered in the full width of the list
if (listSize <= lines) {
hasScroll = false;
@@ -231,11 +226,7 @@ int GUIScrollList::Render(void)
lines++;
}
void* fontResource = NULL;
if (mFont) fontResource = mFont->GetResource();
int yPos = mRenderY + mHeaderH + y_offset;
int fontOffsetY = (int)((actualItemHeight - mFontHeight) / 2);
// render all visible items
for (size_t line = 0; line < lines; line++)
@@ -244,38 +235,7 @@ int GUIScrollList::Render(void)
if (itemindex >= listSize)
break;
// get item data
ImageResource* icon;
std::string label;
if (GetListItem(itemindex, icon, label))
break;
if (hasHighlightColor && itemindex == selectedItem) {
// Highlight the item background of the selected item
gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha);
gr_fill(mRenderX, yPos, mRenderW, actualItemHeight);
}
if (itemindex == selectedItem) {
// Use the highlight color for the font
gr_color(mFontHighlightColor.red, mFontHighlightColor.green, mFontHighlightColor.blue, mFontHighlightColor.alpha);
} else {
// Set the color for the font
gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha);
}
// render icon
if (icon && icon->GetResource()) {
int currentIconHeight = icon->GetHeight();
int currentIconWidth = icon->GetWidth();
int currentIconOffsetY = (actualItemHeight - currentIconHeight) / 2;
int currentIconOffsetX = (maxIconWidth - currentIconWidth) / 2;
int image_y = (yPos + currentIconOffsetY);
gr_blit(icon->GetResource(), 0, 0, currentIconWidth, currentIconHeight, mRenderX + currentIconOffsetX, image_y);
}
// render label text
gr_textEx(mRenderX + maxIconWidth + 5, yPos + fontOffsetY, label.c_str(), fontResource);
RenderItem(itemindex, yPos, itemindex == selectedItem);
// Add the separator
gr_color(mSeparatorColor.red, mSeparatorColor.green, mSeparatorColor.blue, mSeparatorColor.alpha);
@@ -285,26 +245,25 @@ int GUIScrollList::Render(void)
yPos += actualItemHeight;
}
// Render the Header
// Render the Header (last so that it overwrites the top most row for per pixel scrolling)
yPos = mRenderY;
if (mHeaderH > 0) {
// First step, fill background
gr_color(mHeaderBackgroundColor.red, mHeaderBackgroundColor.green, mHeaderBackgroundColor.blue, mHeaderBackgroundColor.alpha);
gr_fill(mRenderX, mRenderY, mRenderW, mHeaderH);
int mIconOffsetX = 0;
int IconOffsetX = 0;
// render the icon if it exists
ImageResource* headerIcon = mHeaderIcon;
if (headerIcon && headerIcon->GetResource())
if (mHeaderIcon && mHeaderIcon->GetResource())
{
gr_blit(headerIcon->GetResource(), 0, 0, mHeaderIconWidth, mHeaderIconHeight, mRenderX + ((mHeaderIconWidth - maxIconWidth) / 2), (yPos + (int)((mHeaderH - mHeaderIconHeight) / 2)));
mIconOffsetX = maxIconWidth;
gr_blit(mHeaderIcon->GetResource(), 0, 0, mHeaderIconWidth, mHeaderIconHeight, mRenderX + ((mHeaderIconWidth - maxIconWidth) / 2), (yPos + (int)((mHeaderH - mHeaderIconHeight) / 2)));
IconOffsetX = maxIconWidth;
}
// render the text
gr_color(mHeaderFontColor.red, mHeaderFontColor.green, mHeaderFontColor.blue, mHeaderFontColor.alpha);
gr_textEx(mRenderX + mIconOffsetX + 5, yPos + (int)((mHeaderH - mFontHeight) / 2), mLastHeaderValue.c_str(), fontResource);
gr_textEx(mRenderX + IconOffsetX + 5, yPos + (int)((mHeaderH - mFontHeight) / 2), mLastHeaderValue.c_str(), mFont->GetResource());
// Add the separator
gr_color(mHeaderSeparatorColor.red, mHeaderSeparatorColor.green, mHeaderSeparatorColor.blue, mHeaderSeparatorColor.alpha);
@@ -349,6 +308,45 @@ int GUIScrollList::Render(void)
return 0;
}
void GUIScrollList::RenderItem(size_t itemindex, int yPos, bool selected)
{
RenderStdItem(yPos, selected, NULL, "implement RenderItem!");
}
void GUIScrollList::RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH)
{
if (hasHighlightColor && selected) {
// Highlight the item background of the selected item
gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha);
gr_fill(mRenderX, yPos, mRenderW, actualItemHeight);
}
if (selected) {
// Use the highlight color for the font
gr_color(mFontHighlightColor.red, mFontHighlightColor.green, mFontHighlightColor.blue, mFontHighlightColor.alpha);
} else {
// Set the color for the font
gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha);
}
if (!iconAndTextH)
iconAndTextH = actualItemHeight;
// render icon
if (icon && icon->GetResource()) {
int iconH = icon->GetHeight();
int iconW = icon->GetWidth();
int iconY = yPos + (iconAndTextH - iconH) / 2;
int iconX = mRenderX + (maxIconWidth - iconW) / 2;
gr_blit(icon->GetResource(), 0, 0, iconW, iconH, iconX, iconY);
}
// render label text
int textX = mRenderX + maxIconWidth + 5;
int textY = yPos + (iconAndTextH - mFontHeight) / 2;
gr_textEx(textX, textY, text, mFont->GetResource());
}
int GUIScrollList::Update(void)
{
if(!isConditionTrue())