menu selector now resizes smooth

This commit is contained in:
2021-08-30 12:39:11 +02:00
parent 384cfa7156
commit eb7f534b3b
5 changed files with 145 additions and 67 deletions

View File

@@ -38,14 +38,6 @@ void Menu::init(std::string name, int x, int y, int backgroundType)
mRectBG.r = 0;
mRectBG.g = 0;
mRectBG.b = 0;
mSelector.rect.x = 0;
mSelector.rect.y = 0;
mSelector.rect.w = 0;
mSelector.rect.h = 0;
mSelector.r = 0;
mSelector.g = 0;
mSelector.b = 0;
mSelector.a = 255;
mBackgroundType = backgroundType;
mIsCenteredOnX = false;
mIsCenteredOnY = false;
@@ -56,12 +48,24 @@ void Menu::init(std::string name, int x, int y, int backgroundType)
mColorGreyed = {128, 128, 128};
// Selector
mSelector.origin = 0;
mSelector.target = 0;
mSelector.originY = 0;
mSelector.targetY = 0;
mSelector.despY = 0;
mSelector.originH = 0;
mSelector.targetH = 0;
mSelector.incH = 0;
mSelector.y = 0;
mSelector.numJumps = 4;
mSelector.despY = 0;
mSelector.moving = false;
mSelector.resizing = false;
mSelector.rect.x = 0;
mSelector.rect.y = 0;
mSelector.rect.w = 0;
mSelector.rect.h = 0;
mSelector.r = 0;
mSelector.g = 0;
mSelector.b = 0;
mSelector.a = 255;
// Elementos del menu
for (int i = 0; i < MENU_MAX_ITEMS; i++)
@@ -109,20 +113,21 @@ void Menu::updateSelector()
{
if (mSelector.moving)
{
// Calcula el desplazamiento en Y
mSelector.y += mSelector.despY;
if (mSelector.despY > 0) // Va hacia abajo
{
if (mSelector.y > mSelector.target) // Ha llegado al destino
if (mSelector.y > mSelector.targetY) // Ha llegado al destino
{
mSelector.origin = mSelector.y = mSelector.target;
mSelector.originY = mSelector.y = mSelector.targetY;
mSelector.moving = false;
}
}
if (mSelector.despY < 0) // Va hacia abajo
if (mSelector.despY < 0) // Va hacia arriba
{
if (mSelector.y < mSelector.target) // Ha llegado al destino
if (mSelector.y < mSelector.targetY) // Ha llegado al destino
{
mSelector.origin = mSelector.y = mSelector.target;
mSelector.originY = mSelector.y = mSelector.targetY;
mSelector.moving = false;
}
}
@@ -132,18 +137,45 @@ void Menu::updateSelector()
{
mSelector.rect.y = int(mSelector.y) - 1;
}
if (mSelector.resizing)
{
// Calcula el incremento en H
mSelector.rect.h += mSelector.incH;
if (mSelector.incH > 0) // Crece
{
if (mSelector.rect.h > mSelector.targetH) // Ha llegado al destino
{
mSelector.originH = mSelector.rect.h = mSelector.targetH;
mSelector.resizing = false;
}
}
if (mSelector.incH < 0) // Decrece
{
if (mSelector.rect.h < mSelector.targetH) // Ha llegado al destino
{
mSelector.originH = mSelector.rect.h = mSelector.targetH;
mSelector.resizing = false;
}
}
//mSelector.rect.h = getSelectorHeight(mSelector.index);
}
else
{
mSelector.rect.h = getSelectorHeight(mSelector.index);
}
}
// Establece el origen del selector
void Menu::setSelectorOrigin(int value)
{
mSelector.origin = value;
mSelector.originY = value;
}
// Establece el destino del selector
void Menu::setSelectorTarget(int value)
{
mSelector.target = value;
mSelector.targetY = value;
}
// Coloca el selector en una posición específica
@@ -152,8 +184,9 @@ void Menu::setSelectorPos(Uint8 index)
if (index < mTotalItems)
{
mSelector.index = index;
mSelector.y = mSelector.origin = mSelector.target = mItem[mSelector.index].y;
mSelector.y = mSelector.originY = mSelector.targetY = mItem[mSelector.index].y;
mSelector.moving = false;
mSelector.resizing = false;
}
}
@@ -179,8 +212,11 @@ void Menu::reset()
{
mItemSelected = MENU_NO_OPTION;
mSelector.index = 0;
mSelector.origin = mSelector.target = mSelector.y = mItem[0].y;
mSelector.originY = mSelector.targetY = mSelector.y = mItem[0].y;
mSelector.originH = mSelector.targetH = mItem[0].h;
mSelector.moving = false;
mSelector.resizing = false;
}
// Deja el menu sin elemento seleccionado
@@ -205,7 +241,8 @@ void Menu::reorganize()
bool Menu::increaseSelectorIndex()
{
bool success = false;
mSelector.y = mSelector.origin = mItem[mSelector.index].y;
mSelector.y = mSelector.originY = mItem[mSelector.index].y;
mSelector.rect.h = mSelector.originH = getSelectorHeight(mSelector.index);
if (mSelector.index < (mTotalItems - 1))
{
@@ -215,10 +252,12 @@ bool Menu::increaseSelectorIndex()
success = true;
}
mSelector.target = mItem[mSelector.index].y;
mSelector.despY = (mSelector.target - mSelector.origin) / mSelector.numJumps;
mSelector.targetY = mItem[mSelector.index].y;
mSelector.despY = (mSelector.targetY - mSelector.originY) / mSelector.numJumps;
mSelector.targetH = getSelectorHeight(mSelector.index);
mSelector.incH = (mSelector.targetH - mSelector.originH) / mSelector.numJumps;
mSelector.moving = true;
updateSelectorHeight();
return success;
}
@@ -226,7 +265,8 @@ bool Menu::increaseSelectorIndex()
bool Menu::decreaseSelectorIndex()
{
bool success = false;
mSelector.y = mSelector.origin = mItem[mSelector.index].y;
mSelector.y = mSelector.originY = mItem[mSelector.index].y;
mSelector.rect.h = mSelector.originH = getSelectorHeight(mSelector.index);
if (mSelector.index > 0)
{
@@ -236,10 +276,11 @@ bool Menu::decreaseSelectorIndex()
success = true;
}
mSelector.target = mItem[mSelector.index].y;
mSelector.despY = (mSelector.target - mSelector.origin) / mSelector.numJumps;
mSelector.targetY = mItem[mSelector.index].y;
mSelector.despY = (mSelector.targetY - mSelector.originY) / mSelector.numJumps;
mSelector.targetH = getSelectorHeight(mSelector.index);
mSelector.incH = (mSelector.targetH - mSelector.originH) / mSelector.numJumps;
mSelector.moving = true;
updateSelectorHeight();
return success;
}
@@ -295,7 +336,7 @@ void Menu::render()
}
else // No enlazado con el de arriba
{
mText->write(mItem[i].x, mItem[i].y, mItem[i].label);
mText->write(mItem[i].x, mItem[i].y, mItem[i].label);
}
}
}
@@ -316,10 +357,10 @@ void Menu::setRectSize()
mRectBG.rect.y = mPosY - (mText->getCharacterWidth() / 2) - mVerticalPadding;
// Establecemos los valores del rectangulo del selector a partir de los valores del rectangulo de fondo
mSelector.rect.h = (mText->getCharacterWidth() * 1) + 1;
//mSelector.rect.h = (mText->getCharacterWidth() * 1) + 1;
mSelector.rect.h = getSelectorHeight(mSelector.index);
mSelector.rect.w = mRectBG.rect.w;
mSelector.rect.x = mRectBG.rect.x;
updateSelectorHeight();
}
// Establece el valor de la variable
@@ -381,8 +422,10 @@ void Menu::centerMenuOnX(int value)
setRectSize();
// Recoloca el selector
mSelector.origin = mSelector.target = mSelector.y = mItem[mSelector.index].y;
mSelector.originY = mSelector.targetY = mSelector.y = mItem[mSelector.index].y;
mSelector.moving = false;
mSelector.originH = mSelector.targetH = mSelector.rect.h = mItem[mSelector.index].h;
mSelector.resizing = false;
}
// Centra el menu respecto un punto en el eje Y
@@ -407,8 +450,10 @@ void Menu::centerMenuOnY(int value)
setRectSize();
// Recoloca el selector
mSelector.origin = mSelector.target = mSelector.y = mItem[mSelector.index].y;
mSelector.originY = mSelector.targetY = mSelector.y = mItem[mSelector.index].y;
mSelector.moving = false;
mSelector.originH = mSelector.targetH = mSelector.rect.h = mItem[mSelector.index].h;
mSelector.resizing = false;
}
// Centra los elementos del menu en el eje X
@@ -545,14 +590,14 @@ void Menu::setLinkedDown(Uint8 index, bool value)
}
// Calcula la altura del selector
void Menu::updateSelectorHeight()
int Menu::getSelectorHeight(int value)
{
if (mItem[mSelector.index].linkedDown)
if (mItem[value].linkedDown)
{
mSelector.rect.h = mItem[mSelector.index + 1].y + mItem[mSelector.index + 1].h - mItem[mSelector.index].y - 1;
return mItem[value + 1].y + mItem[value + 1].h - mItem[value].y - 1;
}
else
{
mSelector.rect.h = mItem[mSelector.index].h - 1;
return mItem[value].h - 1;
}
}