AquariaGuiElement *AquariaGuiElement::getClosestGuiElement(const Vector& pos) { AquariaGuiElement *gui = 0, *closest = 0; float minlen = 0; for (GuiElements::iterator i = guiElements.begin(); i != guiElements.end(); i++) { gui = (*i); if (gui->isGuiVisible() && gui->hasInput()) { Vector dist = gui->getGuiPosition() - pos; float len = dist.getSquaredLength2D(); if(!closest || len < minlen) { closest = gui; minlen = len; } } } return closest; }
void AquariaGuiElement::updateMovement(float dt) { //debugLog("in update movement"); if (hasFocus && isGuiVisible() && canDirMove && canDirMoveGlobal && hasInput()) { //debugLog("has focus"); /* if (alpha.x <= 0 || alphaMod <= 0) { setFocus(false); return; } */ if (guiMoveTimer > 0) { guiMoveTimer -= dt; if (guiMoveTimer < 0) guiMoveTimer = 0; } if (guiMoveTimer==0) { Direction dir = DIR_NONE; Vector p = core->joystick.position; if (!p.isLength2DIn(0.4)) { if (fabsf(p.x) > fabsf(p.y)) { if (p.x > 0) dir = DIR_RIGHT; else dir = DIR_LEFT; } else { if (p.y > 0) dir = DIR_DOWN; else dir = DIR_UP; } } else { StateObject *obj = dsq->getTopStateObject(); if (obj) { if (obj->isActing(ACTION_MENULEFT)) dir = DIR_LEFT; else if (obj->isActing(ACTION_MENURIGHT)) dir = DIR_RIGHT; else if (obj->isActing(ACTION_MENUUP)) dir = DIR_UP; else if (obj->isActing(ACTION_MENUDOWN)) dir = DIR_DOWN; } } if (dir == DIR_NONE) return; const float moveDelay = 0.2; AquariaGuiElement *gui = 0; if (dir > DIR_NONE && dir < DIR_MAX) { gui = dirMove[dir]; if (gui) { gui->setFocus(true); //this->setFocus(false); guiMoveTimer = moveDelay; } } if (!gui) { debugLog("updating closest"); int smallDist = -1, dist = 0; AquariaGuiElement *gui = 0, *closest = 0; int ch = 64; for (GuiElements::iterator i = guiElements.begin(); i != guiElements.end(); i++) { gui = (*i); if (gui != this && gui->isGuiVisible() && gui->canDirMove) { int go = 0; Vector p1 = getGuiPosition(); Vector p2 = gui->getGuiPosition(); if (dir == DIR_DOWN) { if (fabsf(p1.x - p2.x) < ch) { if (p2.y > p1.y) go = 1; p1.x = p2.x = 0; } } else if (dir == DIR_UP) { if (fabsf(p1.x - p2.x) < ch) { if (p2.y < p1.y) go = 1; p1.x = p2.x = 0; } } else if (dir == DIR_RIGHT) { if (fabsf(p1.y - p2.y) < ch) { if (p2.x > p1.x) go = 1; p1.y = p2.y = 0; } } else if (dir == DIR_LEFT) { if (fabsf(p1.y - p2.y) < ch) { if (p2.x < p1.x) go = 1; p1.y = p2.y = 0; } } else { continue; } if (go) { dist = (p1 - p2).getSquaredLength2D(); if (smallDist == -1 || dist < smallDist) { closest = gui; smallDist = dist; } } else { continue; } } } if (closest) { closest->setFocus(true); guiMoveTimer = moveDelay; } } } } }