bool CGUIWindowSettingsScreenCalibration::OnAction(const CAction &action) { switch (action.GetID()) { case ACTION_CALIBRATE_SWAP_ARROWS: { NextControl(); return true; } break; case ACTION_CALIBRATE_RESET: { CGUIDialogYesNo* pDialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogYesNo>(WINDOW_DIALOG_YES_NO); pDialog->SetHeading(CVariant{20325}); std::string strText = StringUtils::Format(g_localizeStrings.Get(20326).c_str(), CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(m_Res[m_iCurRes]).strMode.c_str()); pDialog->SetLine(0, CVariant{std::move(strText)}); pDialog->SetLine(1, CVariant{20327}); pDialog->SetChoice(0, CVariant{222}); pDialog->SetChoice(1, CVariant{186}); pDialog->Open(); if (pDialog->IsConfirmed()) { CServiceBroker::GetWinSystem()->GetGfxContext().ResetScreenParameters(m_Res[m_iCurRes]); ResetControls(); } return true; } break; case ACTION_CHANGE_RESOLUTION: // choose the next resolution in our list { m_iCurRes = (m_iCurRes+1) % m_Res.size(); CServiceBroker::GetWinSystem()->GetGfxContext().SetVideoResolution(m_Res[m_iCurRes], false); ResetControls(); return true; } break; // ignore all gesture meta actions case ACTION_GESTURE_BEGIN: case ACTION_GESTURE_END: case ACTION_GESTURE_ABORT: case ACTION_GESTURE_NOTIFY: case ACTION_GESTURE_PAN: case ACTION_GESTURE_ROTATE: case ACTION_GESTURE_ZOOM: return true; } // if we see a mouse move event without dx and dy (amount2 and amount3) these // are the focus actions which are generated on touch events and those should // be eaten/ignored here. Else we will switch to the screencalibration controls // which are at that x/y value on each touch/tap/swipe which makes the whole window // unusable for touch screens if (action.GetID() == ACTION_MOUSE_MOVE && action.GetAmount(2) == 0 && action.GetAmount(3) == 0) return true; return CGUIWindow::OnAction(action); // base class to handle basic movement etc. }
bool CSeekHandler::OnAction(const CAction &action) { if (!g_application.m_pPlayer->IsPlaying() || !g_application.m_pPlayer->CanSeek()) return false; SeekType type = g_application.CurrentFileItem().IsAudio() ? SEEK_TYPE_MUSIC : SEEK_TYPE_VIDEO; switch (action.GetID()) { case ACTION_SMALL_STEP_BACK: case ACTION_STEP_BACK: { Seek(false, action.GetAmount(), action.GetRepeat(), false, type); return true; } case ACTION_STEP_FORWARD: { Seek(true, action.GetAmount(), action.GetRepeat(), false, type); return true; } case ACTION_BIG_STEP_BACK: case ACTION_CHAPTER_OR_BIG_STEP_BACK: { g_application.m_pPlayer->Seek(false, true, action.GetID() == ACTION_CHAPTER_OR_BIG_STEP_BACK); return true; } case ACTION_BIG_STEP_FORWARD: case ACTION_CHAPTER_OR_BIG_STEP_FORWARD: { g_application.m_pPlayer->Seek(true, true, action.GetID() == ACTION_CHAPTER_OR_BIG_STEP_FORWARD); return true; } case ACTION_NEXT_SCENE: { g_application.m_pPlayer->SeekScene(true); return true; } case ACTION_PREV_SCENE: { g_application.m_pPlayer->SeekScene(false); return true; } case ACTION_ANALOG_SEEK_FORWARD: case ACTION_ANALOG_SEEK_BACK: { if (action.GetAmount()) Seek(action.GetID() == ACTION_ANALOG_SEEK_FORWARD, action.GetAmount(), action.GetRepeat(), true); return true; } default: break; } return false; }
bool CGUIResizeControl::OnAction(const CAction &action) { if (action.GetID() == ACTION_SELECT_ITEM) { // button selected - send message to parent CGUIMessage message(GUI_MSG_CLICKED, GetID(), GetParentID()); SendWindowMessage(message); return true; } if (action.GetID() == ACTION_ANALOG_MOVE) { Resize(m_fAnalogSpeed*action.GetAmount(), -m_fAnalogSpeed*action.GetAmount(1)); return true; } return CGUIControl::OnAction(action); }
bool CPeripherals::OnAction(const CAction &action) { if (action.GetID() == ACTION_MUTE) { return ToggleMute(); } if (SupportsCEC() && action.GetAmount() && (action.GetID() == ACTION_VOLUME_UP || action.GetID() == ACTION_VOLUME_DOWN)) { vector<CPeripheral *> peripherals; if (GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) { for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) { CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); if (cecDevice && cecDevice->HasConnectedAudioSystem()) { if (action.GetID() == ACTION_VOLUME_UP) cecDevice->ScheduleVolumeUp(); else cecDevice->ScheduleVolumeDown(); return true; } } } } return false; }
bool CPeripherals::OnAction(const CAction &action) { if (action.GetID() == ACTION_MUTE) { return ToggleMute(); } if (SupportsCEC() && action.GetAmount() && (action.GetID() == ACTION_VOLUME_UP || action.GetID() == ACTION_VOLUME_DOWN)) { PeripheralVector peripherals; if (GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) { for (auto& peripheral : peripherals) { std::shared_ptr<CPeripheralCecAdapter> cecDevice = std::static_pointer_cast<CPeripheralCecAdapter>(peripheral); if (cecDevice->HasAudioControl()) { if (action.GetID() == ACTION_VOLUME_UP) cecDevice->VolumeUp(); else cecDevice->VolumeDown(); return true; } } } } return false; }
bool CGUIFixedListContainer::OnAction(const CAction &action) { switch (action.GetID()) { case ACTION_PAGE_UP: { Scroll(-m_itemsPerPage); return true; } break; case ACTION_PAGE_DOWN: { Scroll(m_itemsPerPage); return true; } break; // smooth scrolling (for analog controls) case ACTION_SCROLL_UP: { m_analogScrollCount += action.GetAmount() * action.GetAmount(); bool handled = false; while (m_analogScrollCount > 0.4) { handled = true; m_analogScrollCount -= 0.4f; Scroll(-1); } return handled; } break; case ACTION_SCROLL_DOWN: { m_analogScrollCount += action.GetAmount() * action.GetAmount(); bool handled = false; while (m_analogScrollCount > 0.4) { handled = true; m_analogScrollCount -= 0.4f; Scroll(1); } return handled; } break; } return CGUIBaseContainer::OnAction(action); }
bool CGameWindowFullScreen::OnAction(const CAction &action) { switch (action.GetID()) { case ACTION_SHOW_OSD: { ToggleOSD(); return true; } case ACTION_TRIGGER_OSD: { TriggerOSD(); return true; } case ACTION_MOUSE_MOVE: { if (action.GetAmount(2) || action.GetAmount(3)) { TriggerOSD(); return true; } break; } case ACTION_MOUSE_LEFT_CLICK: { TriggerOSD(); return true; } case ACTION_SHOW_GUI: { // Switch back to the menu CServiceBroker::GetGUI()->GetWindowManager().PreviousWindow(); return true; } case ACTION_ASPECT_RATIO: { // Toggle the aspect ratio mode (only if the info is onscreen) //g_application.GetAppPlayer().SetRenderViewMode(CViewModeSettings::GetNextQuickCycleViewMode(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode)); return true; } default: break; } return CGUIWindow::OnAction(action); }
void Action::setFromCAction(const CAction& action) { TRACE; id = action.GetID(); buttonCode = action.GetButtonCode(); fAmount1 = action.GetAmount(0); fAmount2 = action.GetAmount(1); fRepeat = action.GetRepeat(); strAction = action.GetName(); }
bool CGUIDialogSeekBar::OnAction(const CAction &action) { if (action.GetID() == ACTION_ANALOG_SEEK_FORWARD || action.GetID() == ACTION_ANALOG_SEEK_BACK) { if (!m_bRequireSeek) { // start of seeking if (g_infoManager.GetTotalPlayTime()) m_fSeekPercentage = (float)g_infoManager.GetPlayTime() / g_infoManager.GetTotalPlayTime() * 0.1f; else m_fSeekPercentage = 0.0f; // tell info manager that we have started a seekbar operation m_bRequireSeek = true; g_infoManager.SetSeeking(true); } // calculate our seek amount if (g_application.m_pPlayer && !g_infoManager.m_performingSeek) { //100% over 1 second. float speed = 100.0f; if( action.GetRepeat() ) speed *= action.GetRepeat(); else speed /= g_infoManager.GetFPS(); if (action.GetID() == ACTION_ANALOG_SEEK_FORWARD) m_fSeekPercentage += action.GetAmount() * action.GetAmount() * speed; else m_fSeekPercentage -= action.GetAmount() * action.GetAmount() * speed; if (m_fSeekPercentage > 100.0f) m_fSeekPercentage = 100.0f; if (m_fSeekPercentage < 0.0f) m_fSeekPercentage = 0.0f; CGUISliderControl *pSlider = (CGUISliderControl*)GetControl(POPUP_SEEK_SLIDER); if (pSlider) pSlider->SetPercentage((int)m_fSeekPercentage); // Update our seek bar accordingly } ResetTimer(); return true; } return CGUIDialog::OnAction(action); }
// 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 CGUIMoverControl::OnAction(const CAction &action) { if (action.GetID() == ACTION_SELECT_ITEM) { // button selected - send message to parent CGUIMessage message(GUI_MSG_CLICKED, GetID(), GetParentID()); SendWindowMessage(message); return true; } if (action.GetID() == ACTION_ANALOG_MOVE) { // if (m_dwAllowedDirections == ALLOWED_DIRECTIONS_UPDOWN) // Move(0, (int)(-m_fAnalogSpeed*action.GetAmount(1))); // else if (m_dwAllowedDirections == ALLOWED_DIRECTIONS_LEFTRIGHT) // Move((int)(m_fAnalogSpeed*action.GetAmount()), 0); // else // ALLOWED_DIRECTIONS_ALL Move((int)(m_fAnalogSpeed*action.GetAmount()), (int)( -m_fAnalogSpeed*action.GetAmount(1))); return true; } // base class return CGUIControl::OnAction(action); }
bool CGUIWindowSlideShow::OnAction(const CAction &action) { switch (action.GetID()) { case ACTION_SHOW_INFO: { CGUIDialogPictureInfo *pictureInfo = (CGUIDialogPictureInfo *)g_windowManager.GetWindow(WINDOW_DIALOG_PICTURE_INFO); if (pictureInfo) { // no need to set the picture here, it's done in Render() pictureInfo->Open(); } } break; case ACTION_STOP: if (m_slides.size()) AnnouncePlayerStop(m_slides.at(m_iCurrentSlide)); if (g_application.m_pPlayer->IsPlayingVideo()) g_application.m_pPlayer->CloseFile(); Close(); break; case ACTION_NEXT_PICTURE: ShowNext(); break; case ACTION_PREV_PICTURE: ShowPrevious(); break; case ACTION_MOVE_RIGHT: if (m_iZoomFactor == 1 || !m_Image[m_iCurrentPic].m_bCanMoveHorizontally) ShowNext(); else Move(PICTURE_MOVE_AMOUNT, 0); break; case ACTION_MOVE_LEFT: if (m_iZoomFactor == 1 || !m_Image[m_iCurrentPic].m_bCanMoveHorizontally) ShowPrevious(); else Move( -PICTURE_MOVE_AMOUNT, 0); break; case ACTION_MOVE_DOWN: Move(0, PICTURE_MOVE_AMOUNT); break; case ACTION_MOVE_UP: Move(0, -PICTURE_MOVE_AMOUNT); break; case ACTION_PAUSE: case ACTION_PLAYER_PLAY: if (m_slides.size() == 0) break; if (m_slides.at(m_iCurrentSlide)->IsVideo()) { if (!m_bPlayingVideo) { if (m_bSlideShow) { SetDirection(1); m_bPause = false; } PlayVideo(); } } else if (!m_bSlideShow || m_bPause) { m_bSlideShow = true; m_bPause = false; SetDirection(1); if (m_Image[m_iCurrentPic].IsLoaded()) { CSlideShowPic::DISPLAY_EFFECT effect = GetDisplayEffect(m_iCurrentSlide); if (m_Image[m_iCurrentPic].DisplayEffectNeedChange(effect)) m_Image[m_iCurrentPic].Reset(effect); } AnnouncePlayerPlay(m_slides.at(m_iCurrentSlide)); } else if (action.GetID() == ACTION_PAUSE) { m_bPause = true; AnnouncePlayerPause(m_slides.at(m_iCurrentSlide)); } else if (m_iZoomFactor > 1) Zoom(1); //Back to normal zoom and continue slideshow break; case ACTION_ZOOM_OUT: Zoom(m_iZoomFactor - 1); break; case ACTION_ZOOM_IN: Zoom(m_iZoomFactor + 1); break; case ACTION_GESTURE_SWIPE_UP: case ACTION_GESTURE_SWIPE_DOWN: if (m_iZoomFactor == 1 || !m_Image[m_iCurrentPic].m_bCanMoveVertically) { bool swipeOnLeft = action.GetAmount() < g_graphicsContext.GetWidth() / 2.0f; bool swipeUp = action.GetID() == ACTION_GESTURE_SWIPE_UP; if (swipeUp == swipeOnLeft) Rotate(90.0f); else Rotate(-90.0f); } break; case ACTION_ROTATE_PICTURE_CW: Rotate(90.0f); break; case ACTION_ROTATE_PICTURE_CCW: Rotate(-90.0f); break; case ACTION_ZOOM_LEVEL_NORMAL: case ACTION_ZOOM_LEVEL_1: case ACTION_ZOOM_LEVEL_2: case ACTION_ZOOM_LEVEL_3: case ACTION_ZOOM_LEVEL_4: case ACTION_ZOOM_LEVEL_5: case ACTION_ZOOM_LEVEL_6: case ACTION_ZOOM_LEVEL_7: case ACTION_ZOOM_LEVEL_8: case ACTION_ZOOM_LEVEL_9: Zoom((action.GetID() - ACTION_ZOOM_LEVEL_NORMAL) + 1); break; case ACTION_ANALOG_MOVE: // this action is used and works, when CAction object provides both x and y coordinates Move(action.GetAmount()*PICTURE_MOVE_AMOUNT_ANALOG, -action.GetAmount(1)*PICTURE_MOVE_AMOUNT_ANALOG); break; case ACTION_ANALOG_MOVE_X: // this and following action are used and work, when CAction object provides either x of y coordinate Move(action.GetAmount()*PICTURE_MOVE_AMOUNT_ANALOG, 0.0f); break; case ACTION_ANALOG_MOVE_Y: Move(0.0f, action.GetAmount(0)*PICTURE_MOVE_AMOUNT_ANALOG); break; default: return CGUIDialog::OnAction(action); } return true; }
bool CGUIPanelContainer::OnAction(const CAction &action) { switch (action.GetID()) { case ACTION_PAGE_UP: { if (GetOffset() == 0) { // already on the first page, so move to the first item SetCursor(0); } else { // scroll up to the previous page Scroll( -m_itemsPerPage); } return true; } break; case ACTION_PAGE_DOWN: { if ((GetOffset() + m_itemsPerPage) * m_itemsPerRow >= (int)m_items.size() || (int)m_items.size() < m_itemsPerPage) { // already at the last page, so move to the last item. SetCursor(m_items.size() - GetOffset() * m_itemsPerRow - 1); } else { // scroll down to the next page Scroll(m_itemsPerPage); } return true; } break; // smooth scrolling (for analog controls) case ACTION_SCROLL_UP: { m_analogScrollCount += action.GetAmount() * action.GetAmount(); bool handled = false; while (m_analogScrollCount > AnalogScrollSpeed()) { handled = true; m_analogScrollCount -= AnalogScrollSpeed(); if (GetOffset() > 0)// && GetCursor() <= m_itemsPerPage * m_itemsPerRow / 2) { Scroll(-1); } else if (GetCursor() > 0) { SetCursor(GetCursor() - 1); } } return handled; } break; case ACTION_SCROLL_DOWN: { m_analogScrollCount += action.GetAmount() * action.GetAmount(); bool handled = false; while (m_analogScrollCount > AnalogScrollSpeed()) { handled = true; m_analogScrollCount -= AnalogScrollSpeed(); if ((GetOffset() + m_itemsPerPage) * m_itemsPerRow < (int)m_items.size())// && GetCursor() >= m_itemsPerPage * m_itemsPerRow / 2) { Scroll(1); } else if (GetCursor() < m_itemsPerPage * m_itemsPerRow - 1 && GetOffset() * m_itemsPerRow + GetCursor() < (int)m_items.size() - 1) { SetCursor(GetCursor() + 1); } } return handled; } break; } return CGUIBaseContainer::OnAction(action); }
bool CGUIWindowSlideShow::OnAction(const CAction &action) { if (m_bScreensaver) { g_windowManager.PreviousWindow(); return true; } switch (action.GetID()) { case ACTION_SHOW_CODEC: { CGUIDialogPictureInfo *pictureInfo = (CGUIDialogPictureInfo *)g_windowManager.GetWindow(WINDOW_DIALOG_PICTURE_INFO); if (pictureInfo) { // no need to set the picture here, it's done in Render() pictureInfo->DoModal(); } } break; case ACTION_PREVIOUS_MENU: case ACTION_NAV_BACK: case ACTION_STOP: g_windowManager.PreviousWindow(); break; case ACTION_NEXT_PICTURE: // if (m_iZoomFactor == 1) ShowNext(); break; case ACTION_PREV_PICTURE: // if (m_iZoomFactor == 1) ShowPrevious(); break; case ACTION_MOVE_RIGHT: if (m_iZoomFactor == 1) ShowNext(); else Move(PICTURE_MOVE_AMOUNT, 0); break; case ACTION_MOVE_LEFT: if (m_iZoomFactor == 1) ShowPrevious(); else Move( -PICTURE_MOVE_AMOUNT, 0); break; case ACTION_MOVE_DOWN: Move(0, PICTURE_MOVE_AMOUNT); break; case ACTION_MOVE_UP: Move(0, -PICTURE_MOVE_AMOUNT); break; case ACTION_PAUSE: if (m_bSlideShow) m_bPause = !m_bPause; break; case ACTION_PLAYER_PLAY: if (!m_bSlideShow) { m_bSlideShow = true; m_bPause = false; } else if (m_bPause) m_bPause = false; break; case ACTION_ZOOM_OUT: Zoom(m_iZoomFactor - 1); break; case ACTION_ZOOM_IN: Zoom(m_iZoomFactor + 1); break; case ACTION_ROTATE_PICTURE: Rotate(); break; case ACTION_ZOOM_LEVEL_NORMAL: case ACTION_ZOOM_LEVEL_1: case ACTION_ZOOM_LEVEL_2: case ACTION_ZOOM_LEVEL_3: case ACTION_ZOOM_LEVEL_4: case ACTION_ZOOM_LEVEL_5: case ACTION_ZOOM_LEVEL_6: case ACTION_ZOOM_LEVEL_7: case ACTION_ZOOM_LEVEL_8: case ACTION_ZOOM_LEVEL_9: Zoom((action.GetID() - ACTION_ZOOM_LEVEL_NORMAL) + 1); break; case ACTION_ANALOG_MOVE: Move(action.GetAmount()*PICTURE_MOVE_AMOUNT_ANALOG, -action.GetAmount(1)*PICTURE_MOVE_AMOUNT_ANALOG); break; default: return CGUIWindow::OnAction(action); } return true; }
bool CGUIFixedListContainer::OnAction(const CAction &action) { switch (action.GetID()) { case ACTION_PAGE_UP: { Scroll(-m_itemsPerPage); return true; } break; case ACTION_PAGE_DOWN: { Scroll(m_itemsPerPage); return true; } break; // smooth scrolling (for analog controls) case ACTION_SCROLL_UP: { m_analogScrollCount += action.GetAmount() * action.GetAmount(); bool handled = false; if (!g_guiSettings.GetBool("mygames.fastscrolling")) { while (m_analogScrollCount > 8.5) { handled = true; m_analogScrollCount -= 8.5f; Scroll(-1); } } else { while (m_analogScrollCount > 0.8) { handled = true; m_analogScrollCount -= 0.8f; Scroll(-1); } } } break; case ACTION_SCROLL_DOWN: { m_analogScrollCount += action.GetAmount() * action.GetAmount(); bool handled = false; if (!g_guiSettings.GetBool("mygames.fastscrolling")) { while (m_analogScrollCount > 8.5) { handled = true; m_analogScrollCount -= 8.5f; Scroll(1); } } else { while (m_analogScrollCount > 0.8) { handled = true; m_analogScrollCount -= 0.8f; Scroll(1); } } } break; } return CGUIBaseContainer::OnAction(action); }
bool CSeekHandler::OnAction(const CAction &action) { if (!g_application.m_pPlayer->IsPlaying() || !g_application.m_pPlayer->CanSeek()) return false; SeekType type = g_application.CurrentFileItem().IsAudio() ? SEEK_TYPE_MUSIC : SEEK_TYPE_VIDEO; if (SeekTimeCode(action)) return true; switch (action.GetID()) { case ACTION_SMALL_STEP_BACK: case ACTION_STEP_BACK: { Seek(false, action.GetAmount(), action.GetRepeat(), false, type); return true; } case ACTION_STEP_FORWARD: { Seek(true, action.GetAmount(), action.GetRepeat(), false, type); return true; } case ACTION_BIG_STEP_BACK: case ACTION_CHAPTER_OR_BIG_STEP_BACK: { g_application.m_pPlayer->Seek(false, true, action.GetID() == ACTION_CHAPTER_OR_BIG_STEP_BACK); return true; } case ACTION_BIG_STEP_FORWARD: case ACTION_CHAPTER_OR_BIG_STEP_FORWARD: { g_application.m_pPlayer->Seek(true, true, action.GetID() == ACTION_CHAPTER_OR_BIG_STEP_FORWARD); return true; } case ACTION_NEXT_SCENE: { g_application.m_pPlayer->SeekScene(true); return true; } case ACTION_PREV_SCENE: { g_application.m_pPlayer->SeekScene(false); return true; } case ACTION_ANALOG_SEEK_FORWARD: case ACTION_ANALOG_SEEK_BACK: { if (action.GetAmount()) Seek(action.GetID() == ACTION_ANALOG_SEEK_FORWARD, action.GetAmount(), action.GetRepeat(), true); return true; } case REMOTE_0: case REMOTE_1: case REMOTE_2: case REMOTE_3: case REMOTE_4: case REMOTE_5: case REMOTE_6: case REMOTE_7: case REMOTE_8: case REMOTE_9: 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: { if (!g_application.CurrentFileItem().IsLiveTV()) { ChangeTimeCode(action.GetID()); return true; } } break; default: break; } return false; }
bool CGUIWindowSlideShow::OnAction(const CAction &action) { switch (action.GetID()) { case ACTION_SHOW_CODEC: { CGUIDialogPictureInfo *pictureInfo = (CGUIDialogPictureInfo *)g_windowManager.GetWindow(WINDOW_DIALOG_PICTURE_INFO); if (pictureInfo) { // no need to set the picture here, it's done in Render() pictureInfo->DoModal(); } } break; case ACTION_PREVIOUS_MENU: case ACTION_NAV_BACK: case ACTION_STOP: if (m_slides->Size()) AnnouncePlayerStop(m_slides->Get(m_iCurrentSlide)); g_windowManager.PreviousWindow(); break; case ACTION_NEXT_PICTURE: ShowNext(); break; case ACTION_PREV_PICTURE: ShowPrevious(); break; case ACTION_MOVE_RIGHT: if (m_iZoomFactor == 1 || !m_Image[m_iCurrentPic].m_bCanMoveHorizontally) ShowNext(); else Move(PICTURE_MOVE_AMOUNT, 0); break; case ACTION_MOVE_LEFT: if (m_iZoomFactor == 1 || !m_Image[m_iCurrentPic].m_bCanMoveHorizontally) ShowPrevious(); else Move( -PICTURE_MOVE_AMOUNT, 0); break; case ACTION_MOVE_DOWN: Move(0, PICTURE_MOVE_AMOUNT); break; case ACTION_MOVE_UP: Move(0, -PICTURE_MOVE_AMOUNT); break; case ACTION_PAUSE: if (m_bSlideShow) { m_bPause = !m_bPause; if (m_slides->Size()) { if (m_bPause) AnnouncePlayerPause(m_slides->Get(m_iCurrentSlide)); else AnnouncePlayerPlay(m_slides->Get(m_iCurrentSlide)); } } break; case ACTION_PLAYER_PLAY: if (!m_bSlideShow) { m_bSlideShow = true; m_bPause = false; } else if (m_bPause) { m_bPause = false; if (m_slides->Size()) AnnouncePlayerPlay(m_slides->Get(m_iCurrentSlide)); } break; case ACTION_ZOOM_OUT: Zoom(m_iZoomFactor - 1); break; case ACTION_ZOOM_IN: Zoom(m_iZoomFactor + 1); break; case ACTION_GESTURE_SWIPE_UP: case ACTION_GESTURE_SWIPE_DOWN: if (m_iZoomFactor == 1 || !m_Image[m_iCurrentPic].m_bCanMoveVertically) { bool swipeOnLeft = action.GetAmount() < g_graphicsContext.GetWidth() / 2; bool swipeUp = action.GetID() == ACTION_GESTURE_SWIPE_UP; if (swipeUp == swipeOnLeft) Rotate(90.0f); else Rotate(-90.0f); } break; case ACTION_ROTATE_PICTURE_CW: Rotate(90.0f); break; case ACTION_ROTATE_PICTURE_CCW: Rotate(-90.0f); break; case ACTION_ZOOM_LEVEL_NORMAL: case ACTION_ZOOM_LEVEL_1: case ACTION_ZOOM_LEVEL_2: case ACTION_ZOOM_LEVEL_3: case ACTION_ZOOM_LEVEL_4: case ACTION_ZOOM_LEVEL_5: case ACTION_ZOOM_LEVEL_6: case ACTION_ZOOM_LEVEL_7: case ACTION_ZOOM_LEVEL_8: case ACTION_ZOOM_LEVEL_9: Zoom((action.GetID() - ACTION_ZOOM_LEVEL_NORMAL) + 1); break; case ACTION_ANALOG_MOVE: Move(action.GetAmount()*PICTURE_MOVE_AMOUNT_ANALOG, -action.GetAmount(1)*PICTURE_MOVE_AMOUNT_ANALOG); break; default: return CGUIWindow::OnAction(action); } return true; }