bool List::MouseUpdate(int x, int y) { int nCurIndex = 0; // The item we're on int nDrawOffset = 0; // The offset to the first draw item GuiElement b; b.SetPos(pos[0] + borderSpacing, pos[1] + size[1] - borderSpacing - itemHeight); b.SetSize(size[0] - 2.0f * borderSpacing - ((scrollbar.GetSize()[0] < 0) ? 0 : (itemHeight + itemSpacing)), itemHeight); // Get list started up here std::vector<std::string>::iterator ii = filteredItems->begin(); UpdateTopIndex(); while (nCurIndex < topIndex) { ++ii; ++nCurIndex; } const int numDisplay = NumDisplay(); float sbX = b.GetPos()[0]; float sbY1 = b.GetPos()[1] + (itemHeight + itemSpacing); for (/*ii = items.begin()*/; ii != filteredItems->end() && nDrawOffset < numDisplay; ++ii) { if (b.MouseOver(mx, my)) { if (nCurIndex == place && clickedTime + 250 > SDL_GetTicks()) { FinishSelection(); } clickedTime = SDL_GetTicks(); place = nCurIndex; return true; } // Up our index's nCurIndex++; nDrawOffset++; b.Move(0.0, - (itemHeight + itemSpacing)); } if(nDrawOffset < filteredItems->size()) { if (scrollbar.MouseOver(mx, my)) { activeScrollbar = true; scrollbarGrabPos = my - scrollbar.GetPos()[1]; } else { float sbY2 = b.GetPos()[1] + (itemHeight + itemSpacing); float sbHeight = sbY1 - sbY2; b.SetPos(sbX + (size[0] - 2.0f * borderSpacing) - (itemHeight + itemSpacing), sbY2); b.SetSize(itemHeight + itemSpacing, sbHeight); if (b.MouseOver(mx, my)) { if(my > scrollbar.GetPos()[1] + scrollbar.GetSize()[1]) topIndex = std::max(0, std::min(topIndex - NumDisplay(), (int)filteredItems->size() - NumDisplay())); else if(my < scrollbar.GetPos()[1]) topIndex = std::max(0, std::min(topIndex + NumDisplay(), (int)filteredItems->size() - NumDisplay())); } } } return false; }
void List::DrawSelf() { const float opacity = Opacity(); font->Begin(); float hf = font->GetSize() / ScaleFactor(); font->SetTextColor(1,1,0.4f,opacity); int nCurIndex = 0; // The item we're on int nDrawOffset = 0; // The offset to the first draw item GuiElement b; b.SetPos(pos[0] + borderSpacing, pos[1] + size[1] - borderSpacing - itemHeight); b.SetSize(size[0] - 2.0f * borderSpacing - ((scrollbar.GetSize()[0] < 0) ? 0 : (itemHeight + itemSpacing)), itemHeight); // Get list started up here std::vector<std::string>::iterator ii = filteredItems->begin(); // Skip to current selection - 3; ie: scroll UpdateTopIndex(); while (nCurIndex < topIndex) { ++ii; nCurIndex++; } const int numDisplay = NumDisplay(); font->SetTextColor(1.0f, 1.0f, 1.0f, opacity); //default font->SetOutlineColor(0.0f, 0.0f, 0.0f, opacity); glLineWidth(1.0f); float sbX = b.GetPos()[0]; float sbY1 = b.GetPos()[1] + (itemHeight + itemSpacing); for (/*ii = items.begin()*/; ii != filteredItems->end() && nDrawOffset < numDisplay; ++ii) { glColor4f(1,1,1,opacity/4.f); b.DrawBox(GL_LINE_LOOP); if (nCurIndex == place) { glBlendFunc(GL_ONE, GL_ONE); // additive blending glColor4f(0.2f,0,0,opacity); b.DrawBox(GL_QUADS); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1,0,0,opacity/2.f); glLineWidth(1.49f); b.DrawBox(GL_LINE_LOOP); glLineWidth(1.0f); } else if (b.MouseOver(mx, my)) { glBlendFunc(GL_ONE, GL_ONE); // additive blending glColor4f(0,0,0.2f,opacity); b.DrawBox(GL_QUADS); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1,1,1,opacity/2.f); glLineWidth(1.49f); b.DrawBox(GL_LINE_LOOP); glLineWidth(1.0f); } font->glPrint(pos[0]+borderSpacing + 0.002f, b.GetMidY() - hf * 0.15f, itemFontScale, FONT_BASELINE | FONT_SHADOW | FONT_SCALE | FONT_NORM, *ii); // Up our index's nCurIndex++; nDrawOffset++; b.Move(0.0, - (itemHeight + itemSpacing)); } //scrollbar if(nDrawOffset < filteredItems->size()) { float sbY2 = b.GetPos()[1] + (itemHeight + itemSpacing); float sbHeight = sbY1 - sbY2; float sbSize = ((float)nDrawOffset / (float)filteredItems->size()) * sbHeight; if(activeScrollbar) { topIndex = std::max(0, std::min((int)(((float)filteredItems->size() * ((sbY1 - sbSize) - (my - std::min(scrollbarGrabPos, sbSize))) / sbHeight) + 0.5f), (int)filteredItems->size() - numDisplay)); } scrollbar.SetPos(sbX + (size[0] - 2.0f * borderSpacing) - (itemHeight + itemSpacing), sbY1 - sbSize - ((float)topIndex / (float)filteredItems->size()) * sbHeight); scrollbar.SetSize((itemHeight + itemSpacing) , sbSize); b.SetPos(scrollbar.GetPos()[0], sbY2); b.SetSize(itemHeight + itemSpacing, sbHeight); glColor4f(1,1,1,opacity/4.f); b.DrawBox(GL_LINE_LOOP); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(0.8f,0.8f,0.8f,opacity); scrollbar.DrawBox(GL_QUADS); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1,1,1,opacity/2.f); glLineWidth(1.49f); scrollbar.DrawBox(GL_LINE_LOOP); glLineWidth(1.0f); } else scrollbar.SetSize(-1,-1); /************** * End insert * **************/ font->End(); }