diff options
Diffstat (limited to 'gui/scrolllist.cpp')
-rw-r--r-- | gui/scrolllist.cpp | 106 |
1 files changed, 52 insertions, 54 deletions
diff --git a/gui/scrolllist.cpp b/gui/scrolllist.cpp index 70a54e5ac..aa9623c68 100644 --- a/gui/scrolllist.cpp +++ b/gui/scrolllist.cpp @@ -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()) |