//This is *actually* part of the GuiList header and not meant to be compiled. #include "GuiList.h" #include template GuiList::GuiList(int offsetX, int offsetY, Renderer::FontSize fontsize) { mSelection = 0; mScrollDir = 0; mScrolling = 0; mScrollAccumulator = 0; setOffsetX(offsetX); setOffsetY(offsetY); mTextOffsetX = 0; mFont = fontsize; mSelectorColor = 0x000000; mSelectedTextColorOverride = -1; mScrollSound = NULL; mDrawCentered = true; InputManager::registerComponent(this); } template GuiList::~GuiList() { InputManager::unregisterComponent(this); } template void GuiList::onRender() { const int cutoff = getOffsetY(); const int entrySize = Renderer::getFontHeight(mFont) + 5; int startEntry = 0; //number of entries that can fit on the screen simultaniously int screenCount = (Renderer::getScreenHeight() - cutoff) / entrySize; screenCount -= 1; if((int)mRowVector.size() >= screenCount) { startEntry = mSelection - (screenCount * 0.5); if(startEntry < 0) startEntry = 0; if(startEntry >= (int)mRowVector.size() - screenCount) startEntry = mRowVector.size() - screenCount; } int y = cutoff; if(mRowVector.size() == 0) { Renderer::drawCenteredText("The list is empty.", 0, y, 0x0000FF, mFont); return; } int listCutoff = startEntry + screenCount; if(listCutoff > (int)mRowVector.size()) listCutoff = mRowVector.size(); for(int i = startEntry; i < listCutoff; i++) { if(mSelection == i) { Renderer::drawRect(getOffsetX(), y, Renderer::getScreenWidth(), Renderer::getFontHeight(mFont), mSelectorColor); } ListRow row = mRowVector.at((unsigned int)i); if(mDrawCentered) Renderer::drawCenteredText(row.name, getOffsetX(), y, row.color, mFont); else Renderer::drawText(row.name, getOffsetX() + mTextOffsetX, y, (mSelectedTextColorOverride != -1 && mSelection == i ? mSelectedTextColorOverride : row.color), mFont); y += entrySize; } } template void GuiList::onInput(InputManager::InputButton button, bool keyDown) { if(mRowVector.size() > 0) { if(keyDown) { if(button == InputManager::DOWN) { mScrollDir = 1; scroll(); } if(button == InputManager::UP) { mScrollDir = -1; scroll(); } }else{ if((button == InputManager::DOWN && mScrollDir > 0) || (button == InputManager::UP && mScrollDir < 0)) { mScrollAccumulator = 0; mScrolling = false; mScrollDir = 0; } } } } template void GuiList::onTick(int deltaTime) { if(mScrollDir != 0) { mScrollAccumulator += deltaTime; if(!mScrolling) { if(mScrollAccumulator >= SCROLLDELAY) { mScrollAccumulator = SCROLLTIME; mScrolling = true; } } if(mScrolling) { mScrollAccumulator += deltaTime; while(mScrollAccumulator >= SCROLLTIME) { mScrollAccumulator -= SCROLLTIME; scroll(); } } } } template void GuiList::scroll() { mSelection += mScrollDir; if(mSelection < 0) mSelection += mRowVector.size(); if(mSelection >= (int)mRowVector.size()) mSelection -= mRowVector.size(); if(mScrollSound) mScrollSound->play(); } //list management stuff template void GuiList::addObject(std::string name, listType obj, int color) { ListRow row = {name, obj, color}; mRowVector.push_back(row); } template void GuiList::clear() { mRowVector.clear(); mSelection = 0; } template std::string GuiList::getSelectedName() { if((int)mRowVector.size() > mSelection) return mRowVector.at(mSelection).name; else return ""; } template listType GuiList::getSelectedObject() { if((int)mRowVector.size() > mSelection) return mRowVector.at(mSelection).object; else return NULL; } template int GuiList::getSelection() { return mSelection; } template bool GuiList::isScrolling() { return mScrolling; } template void GuiList::onPause() { InputManager::unregisterComponent(this); } template void GuiList::onResume() { InputManager::registerComponent(this); } template void GuiList::setSelectorColor(int selectorColor) { mSelectorColor = selectorColor; } template void GuiList::setSelectedTextColor(int selectedColor) { mSelectedTextColorOverride = selectedColor; } template void GuiList::setCentered(bool centered) { mDrawCentered = centered; } template void GuiList::setTextOffsetX(int textoffsetx) { mTextOffsetX = textoffsetx; } template int GuiList::getObjectCount() { return mRowVector.size(); } template listType GuiList::getObject(int i) { return mRowVector.at(i).object; } template void GuiList::setSelection(int i) { mSelection = i; } template void GuiList::setScrollSound(Sound* sound) { mScrollSound = sound; }