bool CGUIWindowPVRGuideBase::OnMessage(CGUIMessage& message) { bool bReturn = false; switch (message.GetMessage()) { case GUI_MSG_CLICKED: { if (message.GetSenderId() == m_viewControl.GetCurrentControl()) { int iItem = m_viewControl.GetSelectedItem(); if (iItem >= 0 && iItem < m_vecItems->Size()) { CFileItemPtr pItem = m_vecItems->Get(iItem); /* process actions */ switch (message.GetParam1()) { case ACTION_SELECT_ITEM: case ACTION_MOUSE_LEFT_CLICK: switch(CServiceBroker::GetSettings().GetInt(CSettings::SETTING_EPG_SELECTACTION)) { case EPG_SELECT_ACTION_CONTEXT_MENU: OnPopupMenu(iItem); bReturn = true; break; case EPG_SELECT_ACTION_SWITCH: CServiceBroker::GetPVRManager().GUIActions()->SwitchToChannel(pItem, true); bReturn = true; break; case EPG_SELECT_ACTION_PLAY_RECORDING: CServiceBroker::GetPVRManager().GUIActions()->PlayRecording(pItem, true); bReturn = true; break; case EPG_SELECT_ACTION_INFO: CServiceBroker::GetPVRManager().GUIActions()->ShowEPGInfo(pItem); bReturn = true; break; case EPG_SELECT_ACTION_RECORD: CServiceBroker::GetPVRManager().GUIActions()->ToggleTimer(pItem); bReturn = true; break; case EPG_SELECT_ACTION_SMART_SELECT: { const CPVREpgInfoTagPtr tag(pItem->GetEPGInfoTag()); if (tag) { const CDateTime start(tag->StartAsUTC()); const CDateTime end(tag->EndAsUTC()); const CDateTime now(CDateTime::GetUTCDateTime()); if (start <= now && now <= end) { // current event CServiceBroker::GetPVRManager().GUIActions()->SwitchToChannel(pItem, true); } else if (now < start) { // future event if (tag->HasTimer()) CServiceBroker::GetPVRManager().GUIActions()->EditTimer(pItem); else CServiceBroker::GetPVRManager().GUIActions()->AddTimer(pItem, false); } else { // past event if (tag->HasRecording()) CServiceBroker::GetPVRManager().GUIActions()->PlayRecording(pItem, true); else if (tag->IsPlayable()) CServiceBroker::GetPVRManager().GUIActions()->PlayEpgTag(pItem); else CServiceBroker::GetPVRManager().GUIActions()->ShowEPGInfo(pItem); } bReturn = true; } break; } } break; case ACTION_SHOW_INFO: CServiceBroker::GetPVRManager().GUIActions()->ShowEPGInfo(pItem); bReturn = true; break; case ACTION_PLAY: CServiceBroker::GetPVRManager().GUIActions()->PlayRecording(pItem, true); bReturn = true; break; case ACTION_RECORD: CServiceBroker::GetPVRManager().GUIActions()->ToggleTimer(pItem); bReturn = true; break; case ACTION_PVR_SHOW_TIMER_RULE: CServiceBroker::GetPVRManager().GUIActions()->AddTimerRule(pItem, true); bReturn = true; break; case ACTION_CONTEXT_MENU: case ACTION_MOUSE_RIGHT_CLICK: OnPopupMenu(iItem); bReturn = true; break; } } else if (iItem == -1) { /* process actions */ switch (message.GetParam1()) { case ACTION_SELECT_ITEM: case ACTION_MOUSE_LEFT_CLICK: case ACTION_PLAY: { // EPG "gap" selected => switch to associated channel. CGUIEPGGridContainer *epgGridContainer = GetGridControl(); if (epgGridContainer) { const CFileItemPtr item(epgGridContainer->GetSelectedChannelItem()); if (item) { CServiceBroker::GetPVRManager().GUIActions()->SwitchToChannel(item, true); bReturn = true; } } break; } } } } else if (message.GetSenderId() == CONTROL_BTNVIEWASICONS) { // let's set the view mode first before update CGUIWindowPVRBase::OnMessage(message); Refresh(true); bReturn = true; } break; } case GUI_MSG_CHANGE_VIEW_MODE: { // let's set the view mode first before update CGUIWindowPVRBase::OnMessage(message); // force data update for the new view control { CSingleLock lock(m_critSection); m_bRefreshTimelineItems = true; } Init(); Refresh(true); bReturn = true; break; } case GUI_MSG_REFRESH_LIST: switch(message.GetParam1()) { case ObservableMessageChannelGroupsLoaded: { // late init InitChannelGroup(); Init(); break; } case ObservableMessageChannelGroupReset: case ObservableMessageChannelGroup: case ObservableMessageEpg: case ObservableMessageEpgContainer: { Refresh(true); break; } case ObservableMessageTimersReset: case ObservableMessageTimers: { SetInvalid(); break; } } break; } return bReturn || CGUIWindowPVRBase::OnMessage(message); }
bool CPVRGUIInfo::GetListItemAndPlayerBool(const CFileItem *item, const CGUIInfo &info, bool &bValue) const { switch (info.m_info) { case LISTITEM_ISRECORDING: if (item->IsPVRChannel()) { bValue = item->GetPVRChannelInfoTag()->IsRecording(); return true; } else if (item->IsEPG() || item->IsPVRTimer()) { const CPVRTimerInfoTagPtr timer = CPVRItem(item).GetTimerInfoTag(); if (timer) bValue = timer->IsRecording(); return true; } else if (item->IsPVRRecording()) { bValue = item->GetPVRRecordingInfoTag()->IsInProgress(); return true; } break; case LISTITEM_INPROGRESS: if (item->IsPVRChannel() || item->IsEPG()) { const CPVREpgInfoTagPtr epgTag = CPVRItem(item).GetEpgInfoTag(); if (epgTag) bValue = epgTag->IsActive(); return true; } break; case LISTITEM_HASTIMER: if (item->IsPVRChannel() || item->IsEPG()) { const CPVREpgInfoTagPtr epgTag = CPVRItem(item).GetEpgInfoTag(); if (epgTag) bValue = epgTag->HasTimer(); return true; } break; case LISTITEM_HASTIMERSCHEDULE: if (item->IsPVRChannel() || item->IsEPG() || item->IsPVRTimer()) { const CPVRTimerInfoTagPtr timer = CPVRItem(item).GetTimerInfoTag(); if (timer) bValue = timer->GetTimerRuleId() != PVR_TIMER_NO_PARENT; return true; } break; case LISTITEM_TIMERISACTIVE: if (item->IsPVRChannel() || item->IsEPG()) { const CPVRTimerInfoTagPtr timer = CPVRItem(item).GetTimerInfoTag(); if (timer) bValue = timer->IsActive(); break; } break; case LISTITEM_TIMERHASCONFLICT: if (item->IsPVRChannel() || item->IsEPG()) { const CPVRTimerInfoTagPtr timer = CPVRItem(item).GetTimerInfoTag(); if (timer) bValue = timer->HasConflict(); return true; } break; case LISTITEM_TIMERHASERROR: if (item->IsPVRChannel() || item->IsEPG()) { const CPVRTimerInfoTagPtr timer = CPVRItem(item).GetTimerInfoTag(); if (timer) bValue = (timer->IsBroken() && !timer->HasConflict()); return true; } break; case LISTITEM_HASRECORDING: if (item->IsPVRChannel() || item->IsEPG()) { const CPVREpgInfoTagPtr epgTag = CPVRItem(item).GetEpgInfoTag(); if (epgTag) bValue = epgTag->HasRecording(); return true; } break; case LISTITEM_HAS_EPG: if (item->IsPVRChannel() || item->IsEPG() || item->IsPVRTimer()) { const CPVREpgInfoTagPtr epgTag = CPVRItem(item).GetEpgInfoTag(); bValue = (epgTag != nullptr); return true; } break; case LISTITEM_ISENCRYPTED: if (item->IsPVRChannel() || item->IsEPG()) { const CPVRChannelPtr channel = CPVRItem(item).GetChannel(); if (channel) bValue = channel->IsEncrypted(); return true; } break; case MUSICPLAYER_CONTENT: case VIDEOPLAYER_CONTENT: if (item->IsPVRChannel()) { bValue = StringUtils::EqualsNoCase(info.GetData3(), "livetv"); return bValue; // if no match for this provider, other providers shall be asked. } break; case VIDEOPLAYER_HAS_INFO: if (item->IsPVRChannel()) { bValue = !item->GetPVRChannelInfoTag()->IsEmpty(); return true; } break; case VIDEOPLAYER_HAS_EPG: if (item->IsPVRChannel()) { bValue = (item->GetPVRChannelInfoTag()->GetEPGNow() != nullptr); return true; } break; case VIDEOPLAYER_CAN_RESUME_LIVE_TV: if (item->IsPVRRecording()) { const CPVRRecordingPtr recording = item->GetPVRRecordingInfoTag(); const CPVREpgInfoTagPtr epgTag = CServiceBroker::GetPVRManager().EpgContainer().GetTagById(recording->Channel(), recording->BroadcastUid()); bValue = (epgTag && epgTag->IsActive() && epgTag->Channel()); return true; } break; case PLAYER_IS_CHANNEL_PREVIEW_ACTIVE: if (item->IsPVRChannel()) { if (CServiceBroker::GetPVRManager().GUIActions()->GetChannelNavigator().IsPreviewAndShowInfo()) { bValue = true; } else { bValue = !m_videoInfo.valid; if (bValue && item->GetPVRChannelInfoTag()->IsRadio()) bValue = !m_audioInfo.valid; } return true; } break; } return false; }