bool CGUIWindowHome::OnAction(const CAction &action) { static unsigned int min_hold_time = 1000; if (action.GetID() == ACTION_NAV_BACK && action.GetHoldTime() < min_hold_time && g_application.IsPlaying()) { g_application.SwitchToFullScreen(); return true; } return CGUIWindow::OnAction(action); }
bool CInputManager::OnAction(const CAction& action) { if (action.GetID() != ACTION_NONE) { if (action.IsAnalog()) { QueueAction(action); } else { // If button was pressed this frame, send action if (action.GetHoldTime() == 0) { QueueAction(action); } else { // Only send repeated actions for basic navigation commands bool bIsNavigation = false; switch (action.GetID()) { case ACTION_MOVE_LEFT: case ACTION_MOVE_RIGHT: case ACTION_MOVE_UP: case ACTION_MOVE_DOWN: case ACTION_PAGE_UP: case ACTION_PAGE_DOWN: bIsNavigation = true; break; default: break; } if (bIsNavigation) QueueAction(action); } } return true; } return false; }
bool CInputManager::ExecuteInputAction(const CAction &action) { bool bResult = false; // play sound before the action unless the button is held, // where we execute after the action as held actions aren't fired every time. if (action.GetHoldTime()) { bResult = g_application.OnAction(action); if (bResult) g_audioManager.PlayActionSound(action); } else { g_audioManager.PlayActionSound(action); bResult = g_application.OnAction(action); } return bResult; }
// OnMouseAction - called by OnAction() EVENT_RESULT CGUIWindow::OnMouseAction(const CAction &action) { g_graphicsContext.SetScalingResolution(m_coordsRes, m_needsScaling); CPoint mousePoint(action.GetAmount(0), action.GetAmount(1)); g_graphicsContext.InvertFinalCoords(mousePoint.x, mousePoint.y); // create the mouse event CMouseEvent event(action.GetID(), action.GetHoldTime(), action.GetAmount(2), action.GetAmount(3)); if (m_exclusiveMouseControl) { CGUIControl *child = (CGUIControl *)GetControl(m_exclusiveMouseControl); if (child) { CPoint renderPos = child->GetRenderPosition() - CPoint(child->GetXPosition(), child->GetYPosition()); return child->OnMouseEvent(mousePoint - renderPos, event); } } UnfocusFromPoint(mousePoint); return SendMouseEvent(mousePoint, event); }
bool CGUIBaseContainer::OnAction(const CAction &action) { if (action.GetID() >= KEY_ASCII) { OnJumpLetter((char)(action.GetID() & 0xff)); return true; } switch (action.GetID()) { case ACTION_MOVE_LEFT: case ACTION_MOVE_RIGHT: case ACTION_MOVE_DOWN: case ACTION_MOVE_UP: case ACTION_NAV_BACK: { if (!HasFocus()) return false; if (action.GetHoldTime() > HOLD_TIME_START && ((m_orientation == VERTICAL && (action.GetID() == ACTION_MOVE_UP || action.GetID() == ACTION_MOVE_DOWN)) || (m_orientation == HORIZONTAL && (action.GetID() == ACTION_MOVE_LEFT || action.GetID() == ACTION_MOVE_RIGHT)))) { // action is held down - repeat a number of times float speed = std::min(1.0f, (float)(action.GetHoldTime() - HOLD_TIME_START) / (HOLD_TIME_END - HOLD_TIME_START)); unsigned int itemsPerFrame = 1; if (m_lastHoldTime) // number of rows/10 items/second max speed itemsPerFrame = std::max((unsigned int)1, (unsigned int)(speed * 0.0001f * GetRows() * (CTimeUtils::GetFrameTime() - m_lastHoldTime))); m_lastHoldTime = CTimeUtils::GetFrameTime(); if (action.GetID() == ACTION_MOVE_LEFT || action.GetID() == ACTION_MOVE_UP) while (itemsPerFrame--) MoveUp(false); else while (itemsPerFrame--) MoveDown(false); return true; } else { m_lastHoldTime = 0; return CGUIControl::OnAction(action); } } break; case ACTION_FIRST_PAGE: SelectItem(0); return true; case ACTION_LAST_PAGE: if (m_items.size()) SelectItem(m_items.size() - 1); return true; case ACTION_NEXT_LETTER: { OnNextLetter(); return true; } break; case ACTION_PREV_LETTER: { OnPrevLetter(); return true; } break; case ACTION_JUMP_SMS2: case ACTION_JUMP_SMS3: case ACTION_JUMP_SMS4: case ACTION_JUMP_SMS5: case ACTION_JUMP_SMS6: case ACTION_JUMP_SMS7: case ACTION_JUMP_SMS8: case ACTION_JUMP_SMS9: { OnJumpSMS(action.GetID() - ACTION_JUMP_SMS2 + 2); return true; } break; default: if (action.GetID()) { return OnClick(action.GetID()); } } return false; }
bool CGUIBaseContainer::OnAction(const CAction &action) { if (action.GetID() >= KEY_ASCII) { OnJumpLetter((char)(action.GetID() & 0xff)); return true; } // stop the timer on any other action m_matchTimer.Stop(); switch (action.GetID()) { case ACTION_MOVE_LEFT: case ACTION_MOVE_RIGHT: case ACTION_MOVE_DOWN: case ACTION_MOVE_UP: case ACTION_NAV_BACK: case ACTION_PREVIOUS_MENU: { if (!HasFocus()) return false; if (action.GetHoldTime() > HOLD_TIME_START && ((m_orientation == VERTICAL && (action.GetID() == ACTION_MOVE_UP || action.GetID() == ACTION_MOVE_DOWN)) || (m_orientation == HORIZONTAL && (action.GetID() == ACTION_MOVE_LEFT || action.GetID() == ACTION_MOVE_RIGHT)))) { // action is held down - repeat a number of times float speed = std::min(1.0f, (float)(action.GetHoldTime() - HOLD_TIME_START) / (HOLD_TIME_END - HOLD_TIME_START)); unsigned int frameDuration = std::min(CTimeUtils::GetFrameTime() - m_lastHoldTime, 50u); // max 20fps // maximal scroll rate is at least 30 items per second, and at most (item_rows/7) items per second // i.e. timed to take 7 seconds to traverse the list at full speed. // minimal scroll rate is at least 10 items per second float maxSpeed = std::max(frameDuration * 0.001f * 30, frameDuration * 0.001f * GetRows() / 7); float minSpeed = frameDuration * 0.001f * 10; m_scrollItemsPerFrame += std::max(minSpeed, speed*maxSpeed); // accelerate to max speed m_lastHoldTime = CTimeUtils::GetFrameTime(); if(m_scrollItemsPerFrame < 1.0f)//not enough hold time accumulated for one step return true; while (m_scrollItemsPerFrame >= 1) { if (action.GetID() == ACTION_MOVE_LEFT || action.GetID() == ACTION_MOVE_UP) MoveUp(false); else MoveDown(false); m_scrollItemsPerFrame--; } return true; } else { //if HOLD_TIME_START is reached we need //a sane initial value for calculating m_scrollItemsPerPage m_lastHoldTime = CTimeUtils::GetFrameTime(); m_scrollItemsPerFrame = 0.0f; return CGUIControl::OnAction(action); } } break; case ACTION_FIRST_PAGE: SelectItem(0); return true; case ACTION_LAST_PAGE: if (m_items.size()) SelectItem(m_items.size() - 1); return true; case ACTION_NEXT_LETTER: { OnNextLetter(); return true; } break; case ACTION_PREV_LETTER: { OnPrevLetter(); return true; } break; case ACTION_JUMP_SMS2: case ACTION_JUMP_SMS3: case ACTION_JUMP_SMS4: case ACTION_JUMP_SMS5: case ACTION_JUMP_SMS6: case ACTION_JUMP_SMS7: case ACTION_JUMP_SMS8: case ACTION_JUMP_SMS9: { OnJumpSMS(action.GetID() - ACTION_JUMP_SMS2 + 2); return true; } break; default: if (action.GetID()) { return OnClick(action.GetID()); } } return false; }
bool CGUIBaseContainer::OnAction(const CAction &action) { if (action.GetID() >= KEY_ASCII) { OnJumpLetter((char)(action.GetID() & 0xff)); return true; } switch (action.GetID()) { case ACTION_MOVE_LEFT: case ACTION_MOVE_RIGHT: case ACTION_MOVE_DOWN: case ACTION_MOVE_UP: case ACTION_NAV_BACK: { if (!HasFocus()) return false; if (action.GetHoldTime() > HOLD_TIME_START && ((m_orientation == VERTICAL && (action.GetID() == ACTION_MOVE_UP || action.GetID() == ACTION_MOVE_DOWN)) || (m_orientation == HORIZONTAL && (action.GetID() == ACTION_MOVE_LEFT || action.GetID() == ACTION_MOVE_RIGHT)))) { // action is held down - repeat a number of times float speed = std::min(1.0f, (float)(action.GetHoldTime() - HOLD_TIME_START) / (HOLD_TIME_END - HOLD_TIME_START)); unsigned int frameDuration = CTimeUtils::GetFrameTime() - m_lastHoldTime; //scrollrate is minimum 4 items/sec and max rows/10 items/sec m_scrollItemsPerFrame += std::max(0.004f*(float)frameDuration, (float)(speed * 0.0001f * GetRows() * frameDuration)); m_lastHoldTime = CTimeUtils::GetFrameTime(); if(m_scrollItemsPerFrame < 1.0f)//not enough hold time accumulated for one step return false; if (action.GetID() == ACTION_MOVE_LEFT || action.GetID() == ACTION_MOVE_UP) while (m_scrollItemsPerFrame-- >= 1) MoveUp(false); else while (m_scrollItemsPerFrame-- >= 1) MoveDown(false); return true; } else { //if HOLD_TIME_START is reached we need //a sane initial value for calculating m_scrollItemsPerPage m_lastHoldTime = CTimeUtils::GetFrameTime(); m_scrollItemsPerFrame = 0.0f; return CGUIControl::OnAction(action); } } break; case ACTION_FIRST_PAGE: SelectItem(0); return true; case ACTION_LAST_PAGE: if (m_items.size()) SelectItem(m_items.size() - 1); return true; case ACTION_NEXT_LETTER: { OnNextLetter(); return true; } break; case ACTION_PREV_LETTER: { OnPrevLetter(); return true; } break; case ACTION_JUMP_SMS2: case ACTION_JUMP_SMS3: case ACTION_JUMP_SMS4: case ACTION_JUMP_SMS5: case ACTION_JUMP_SMS6: case ACTION_JUMP_SMS7: case ACTION_JUMP_SMS8: case ACTION_JUMP_SMS9: { OnJumpSMS(action.GetID() - ACTION_JUMP_SMS2 + 2); return true; } break; default: if (action.GetID()) { return OnClick(action.GetID()); } } return false; }