bool CGUIWindowPVRGuideBase::GetDirectory(const std::string &strDirectory, CFileItemList &items) { bool bRefreshTimelineItems = false; { CSingleLock lock(m_critSection); if (m_cachedChannelGroup && *m_cachedChannelGroup != *GetChannelGroup()) { // channel group change and not very first open of this window. force immediate update. m_bRefreshTimelineItems = true; bRefreshTimelineItems = true; } } // never call DoRefresh with locked mutex! if (bRefreshTimelineItems) m_refreshTimelineItemsThread->DoRefresh(); { CSingleLock lock(m_critSection); // Note: no need to do anything if no new data available. items always contains previous data. if (m_newTimeline) { items.RemoveDiscCache(GetID()); items.Assign(*m_newTimeline, false); m_newTimeline.reset(); } } return true; }
void CGUIWindowPVRGuide::GetViewTimelineItems(CFileItemList &items) { CGUIEPGGridContainer* epgGridContainer = dynamic_cast<CGUIEPGGridContainer*>(GetControl(m_viewControl.GetCurrentControl())); if (!epgGridContainer) return; CPVRChannelGroupPtr group; { CSingleLock lock(m_critSection); // group change detected reset grid coordinates and refresh grid items if (!m_bRefreshTimelineItems && *m_cachedChannelGroup != *GetGroup()) { epgGridContainer->ResetCoordinates(); m_bRefreshTimelineItems = true; RefreshTimelineItems(); } if (m_newTimeline != nullptr) { m_cachedTimeline = m_newTimeline; m_newTimeline.reset(); } items.Clear(); items.RemoveDiscCache(GetID()); items.Assign(*m_cachedTimeline, false); group = m_cachedChannelGroup; } CDateTime startDate(group->GetFirstEPGDate()); CDateTime endDate(group->GetLastEPGDate()); CDateTime currentDate = CDateTime::GetCurrentDateTime().GetAsUTCDateTime(); if (!startDate.IsValid()) startDate = currentDate; if (!endDate.IsValid() || endDate < startDate) endDate = startDate; // limit start to linger time CDateTime maxPastDate = currentDate - CDateTimeSpan(0, 0, g_advancedSettings.m_iEpgLingerTime, 0); if (startDate < maxPastDate) startDate = maxPastDate; epgGridContainer->SetStartEnd(startDate, endDate); }
void CGUIWindowPVRGuide::GetViewTimelineItems(CFileItemList &items) { CGUIEPGGridContainer* epgGridContainer = (CGUIEPGGridContainer*) GetControl(m_viewControl.GetCurrentControl()); if (!epgGridContainer) return; CPVRChannelGroupPtr group = GetGroup(); if (m_bUpdateRequired || m_cachedTimeline->IsEmpty() || *m_cachedChannelGroup != *group) { m_bUpdateRequired = false; m_cachedTimeline->Clear(); m_cachedChannelGroup = group; m_cachedChannelGroup->GetEPGAll(*m_cachedTimeline); } items.Clear(); items.RemoveDiscCache(GetID()); items.Assign(*m_cachedTimeline, false); CDateTime startDate(m_cachedChannelGroup->GetFirstEPGDate()); CDateTime endDate(m_cachedChannelGroup->GetLastEPGDate()); CDateTime currentDate = CDateTime::GetCurrentDateTime().GetAsUTCDateTime(); if (!startDate.IsValid()) startDate = currentDate; if (!endDate.IsValid() || endDate < startDate) endDate = startDate; // limit start to linger time CDateTime maxPastDate = currentDate - CDateTimeSpan(0, 0, g_advancedSettings.m_iEpgLingerTime, 0); if (startDate < maxPastDate) startDate = maxPastDate; epgGridContainer->SetStartEnd(startDate, endDate); SET_CONTROL_LABEL(CONTROL_LABEL_HEADER1, g_localizeStrings.Get(19032)); SET_CONTROL_LABEL(CONTROL_LABEL_HEADER2, GetGroup()->GroupName()); epgGridContainer->SetChannel(GetSelectedItemPath(m_bRadio)); }
void CGUIWindowPVRGuide::GetViewTimelineItems(CFileItemList &items) { CGUIEPGGridContainer* epgGridContainer = (CGUIEPGGridContainer*) GetControl(m_viewControl.GetCurrentControl()); if (!epgGridContainer) return; CPVRChannelGroupPtr group = GetGroup(); // group change detected reset grid coordinate if (*m_cachedChannelGroup != *group) epgGridContainer->ResetCoordinates(); if (m_bUpdateRequired || m_cachedTimeline->IsEmpty() || *m_cachedChannelGroup != *group) { m_bUpdateRequired = false; m_cachedTimeline->Clear(); m_cachedChannelGroup = group; m_cachedChannelGroup->GetEPGAll(*m_cachedTimeline, true); } items.Clear(); items.RemoveDiscCache(GetID()); items.Assign(*m_cachedTimeline, false); CDateTime startDate(m_cachedChannelGroup->GetFirstEPGDate()); CDateTime endDate(m_cachedChannelGroup->GetLastEPGDate()); CDateTime currentDate = CDateTime::GetCurrentDateTime().GetAsUTCDateTime(); if (!startDate.IsValid()) startDate = currentDate; if (!endDate.IsValid() || endDate < startDate) endDate = startDate; // limit start to linger time CDateTime maxPastDate = currentDate - CDateTimeSpan(0, 0, g_advancedSettings.m_iEpgLingerTime, 0); if (startDate < maxPastDate) startDate = maxPastDate; epgGridContainer->SetStartEnd(startDate, endDate); }
bool CGUIWindowPVRGuide::GetDirectory(const std::string &strDirectory, CFileItemList &items) { bool bRefresh = false; { CSingleLock lock(m_critSection); // group change detected reset grid coordinates and refresh grid items if (!m_bRefreshTimelineItems && *m_cachedChannelGroup != *GetChannelGroup()) { CGUIEPGGridContainer* epgGridContainer = GetGridControl(); if (!epgGridContainer) return true; epgGridContainer->ResetCoordinates(); m_bRefreshTimelineItems = true; bRefresh = true; } } // never call RefreshTimelineItems with locked mutex! if (bRefresh) RefreshTimelineItems(); { CSingleLock lock(m_critSection); // Note: no need to do anything if no new data available. items always contains previous data. if (m_newTimeline) { items.RemoveDiscCache(GetID()); items.Assign(*m_newTimeline, false); m_newTimeline.reset(); } } return true; }
void CGUIWindowPVRGuide::GetViewTimelineItems(CFileItemList &items) { CSingleLock lock(m_critSection); // group change detected reset grid coordinates and refresh grid items if (!m_bRefreshTimelineItems && *m_cachedChannelGroup != *GetChannelGroup()) { CGUIEPGGridContainer* epgGridContainer = GetGridControl(); if (!epgGridContainer) return; epgGridContainer->ResetCoordinates(); m_bRefreshTimelineItems = true; RefreshTimelineItems(); } // Note: no need to do anything if no new data available. items always contains previous data. if (m_newTimeline) { items.RemoveDiscCache(GetID()); items.Assign(*m_newTimeline, false); m_newTimeline.reset(); } }
bool CGUIMediaWindow::OnMessage(CGUIMessage& message) { switch ( message.GetMessage() ) { case GUI_MSG_WINDOW_DEINIT: { m_iSelectedItem = m_viewControl.GetSelectedItem(); m_iLastControl = GetFocusedControlID(); CGUIWindow::OnMessage(message); // Call ClearFileItems() after our window has finished doing any WindowClose // animations ClearFileItems(); return true; } break; case GUI_MSG_CLICKED: { int iControl = message.GetSenderId(); if (iControl == CONTROL_BTNVIEWASICONS) { // view as control could be a select button int viewMode = 0; const CGUIControl *control = GetControl(CONTROL_BTNVIEWASICONS); if (control && control->GetControlType() != CGUIControl::GUICONTROL_BUTTON) { CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_BTNVIEWASICONS); OnMessage(msg); viewMode = m_viewControl.GetViewModeNumber(msg.GetParam1()); } else viewMode = m_viewControl.GetNextViewMode(); if (m_guiState.get()) m_guiState->SaveViewAsControl(viewMode); UpdateButtons(); return true; } else if (iControl == CONTROL_BTNSORTASC) // sort asc { if (m_guiState.get()) m_guiState->SetNextSortOrder(); UpdateFileList(); return true; } else if (iControl == CONTROL_BTNSORTBY) // sort by { if (m_guiState.get()) m_guiState->SetNextSortMethod(); UpdateFileList(); return true; } else if (iControl == CONTROL_BTN_FILTER) { if (GetControl(iControl)->GetControlType() == CGUIControl::GUICONTROL_EDIT) { // filter updated CGUIMessage selected(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_BTN_FILTER); OnMessage(selected); OnFilterItems(selected.GetLabel()); return true; } if (GetProperty("filter").empty()) { CStdString filter = GetProperty("filter").asString(); CGUIDialogKeyboard::ShowAndGetFilter(filter, false); SetProperty("filter", filter); } else OnFilterItems(""); return true; } else if (m_viewControl.HasControl(iControl)) // list/thumb control { int iItem = m_viewControl.GetSelectedItem(); int iAction = message.GetParam1(); if (iItem < 0) break; if (iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK) { OnSelect(iItem); } else if (iAction == ACTION_CONTEXT_MENU || iAction == ACTION_MOUSE_RIGHT_CLICK) { OnPopupMenu(iItem); return true; } } } break; case GUI_MSG_SETFOCUS: { if (m_viewControl.HasControl(message.GetControlId()) && m_viewControl.GetCurrentControl() != message.GetControlId()) { m_viewControl.SetFocused(); return true; } } break; case GUI_MSG_NOTIFY_ALL: { // Message is received even if this window is inactive if (message.GetParam1() == GUI_MSG_WINDOW_RESET) { m_vecItems->SetPath("?"); return true; } else if ( message.GetParam1() == GUI_MSG_REFRESH_THUMBS ) { for (int i = 0; i < m_vecItems->Size(); i++) m_vecItems->Get(i)->FreeMemory(true); break; // the window will take care of any info images } else if (message.GetParam1() == GUI_MSG_REMOVED_MEDIA) { if ((m_vecItems->IsVirtualDirectoryRoot() || m_vecItems->IsSourcesPath()) && IsActive()) { int iItem = m_viewControl.GetSelectedItem(); Update(m_vecItems->GetPath()); m_viewControl.SetSelectedItem(iItem); } else if (m_vecItems->IsRemovable()) { // check that we have this removable share still if (!m_rootDir.IsInSource(m_vecItems->GetPath())) { // don't have this share any more if (IsActive()) Update(""); else { m_history.ClearPathHistory(); m_vecItems->SetPath(""); } } } return true; } else if (message.GetParam1()==GUI_MSG_UPDATE_SOURCES) { // State of the sources changed, so update our view if ((m_vecItems->IsVirtualDirectoryRoot() || m_vecItems->IsSourcesPath()) && IsActive()) { int iItem = m_viewControl.GetSelectedItem(); Update(m_vecItems->GetPath()); m_viewControl.SetSelectedItem(iItem); } return true; } else if (message.GetParam1()==GUI_MSG_UPDATE && IsActive()) { if (message.GetNumStringParams()) { m_vecItems->SetPath(message.GetStringParam()); if (message.GetParam2()) // param2 is used for resetting the history SetHistoryForPath(m_vecItems->GetPath()); } // clear any cached listing m_vecItems->RemoveDiscCache(GetID()); Update(m_vecItems->GetPath()); } else if (message.GetParam1()==GUI_MSG_UPDATE_ITEM && message.GetItem()) { CFileItemPtr newItem = boost::static_pointer_cast<CFileItem>(message.GetItem()); if (IsActive()) { if (m_vecItems->UpdateItem(newItem.get()) && message.GetParam2() == 1) { // need the list updated as well UpdateFileList(); } } else if (newItem) { // need to remove the disc cache CFileItemList items; CStdString path; URIUtils::GetDirectory(newItem->GetPath(), path); items.SetPath(path); items.RemoveDiscCache(GetID()); } } else if (message.GetParam1()==GUI_MSG_UPDATE_PATH) { if (IsActive()) { if((message.GetStringParam() == m_vecItems->GetPath()) || (m_vecItems->IsMultiPath() && XFILE::CMultiPathDirectory::HasPath(m_vecItems->GetPath(), message.GetStringParam()))) { Update(m_vecItems->GetPath()); } } } else if (message.GetParam1() == GUI_MSG_FILTER_ITEMS && IsActive()) { CStdString filter(GetProperty("filter").asString()); if (message.GetParam2() == 1) // append filter += message.GetStringParam(); else if (message.GetParam2() == 2) { // delete if (filter.size()) filter = filter.Left(filter.size() - 1); } else filter = message.GetStringParam(); OnFilterItems(filter); return true; } else return CGUIWindow::OnMessage(message); return true; } break; case GUI_MSG_PLAYBACK_STARTED: case GUI_MSG_PLAYBACK_ENDED: case GUI_MSG_PLAYBACK_STOPPED: case GUI_MSG_PLAYLIST_CHANGED: case GUI_MSG_PLAYLISTPLAYER_STOPPED: case GUI_MSG_PLAYLISTPLAYER_STARTED: case GUI_MSG_PLAYLISTPLAYER_CHANGED: { // send a notify all to all controls on this window CGUIMessage msg(GUI_MSG_NOTIFY_ALL, GetID(), 0, GUI_MSG_REFRESH_LIST); OnMessage(msg); break; } case GUI_MSG_CHANGE_VIEW_MODE: { int viewMode = 0; if (message.GetParam1()) // we have an id viewMode = m_viewControl.GetViewModeByID(message.GetParam1()); else if (message.GetParam2()) viewMode = m_viewControl.GetNextViewMode((int)message.GetParam2()); if (m_guiState.get()) m_guiState->SaveViewAsControl(viewMode); UpdateButtons(); return true; } break; case GUI_MSG_CHANGE_SORT_METHOD: { if (m_guiState.get()) { if (message.GetParam1()) m_guiState->SetCurrentSortMethod((int)message.GetParam1()); else if (message.GetParam2()) m_guiState->SetNextSortMethod((int)message.GetParam2()); } UpdateFileList(); return true; } break; case GUI_MSG_CHANGE_SORT_DIRECTION: { if (m_guiState.get()) m_guiState->SetNextSortOrder(); UpdateFileList(); return true; } break; case GUI_MSG_WINDOW_INIT: { if (m_vecItems->GetPath() == "?") m_vecItems->SetPath(""); CStdString dir = message.GetStringParam(0); const CStdString &ret = message.GetStringParam(1); bool returning = ret.CompareNoCase("return") == 0; if (!dir.IsEmpty()) { m_history.ClearPathHistory(); // ensure our directory is valid dir = GetStartFolder(dir); if (!returning || m_vecItems->GetPath().Left(dir.GetLength()) != dir) { // we're not returning to the same path, so set our directory to the requested path m_vecItems->SetPath(dir); } // check for network up if (URIUtils::IsRemote(m_vecItems->GetPath()) && !WaitForNetwork()) m_vecItems->SetPath(""); SetHistoryForPath(m_vecItems->GetPath()); } if (message.GetParam1() != WINDOW_INVALID) { // first time to this window - make sure we set the root path m_startDirectory = returning ? dir : ""; } } break; } return CGUIWindow::OnMessage(message); }
bool CGUIMediaWindow::OnMessage(CGUIMessage& message) { switch ( message.GetMessage() ) { case GUI_MSG_WINDOW_DEINIT: { m_iSelectedItem = m_viewControl.GetSelectedItem(); m_iLastControl = GetFocusedControlID(); CGUIWindow::OnMessage(message); // Call ClearFileItems() after our window has finished doing any WindowClose // animations ClearFileItems(); return true; } break; case GUI_MSG_CLICKED: { int iControl = message.GetSenderId(); if (iControl == CONTROL_BTNVIEWASICONS) { // view as control could be a select button int viewMode = 0; const CGUIControl *control = GetControl(CONTROL_BTNVIEWASICONS); if (control && control->GetControlType() != CGUIControl::GUICONTROL_BUTTON) { CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_BTNVIEWASICONS); OnMessage(msg); viewMode = m_viewControl.GetViewModeNumber(msg.GetParam1()); } else viewMode = m_viewControl.GetNextViewMode(); if (m_guiState.get()) m_guiState->SaveViewAsControl(viewMode); UpdateButtons(); return true; } else if (iControl == CONTROL_BTNSORTASC) // sort asc { if (m_guiState.get()) m_guiState->SetNextSortOrder(); UpdateFileList(); return true; } else if (iControl == CONTROL_BTNSORTBY) // sort by { if (m_guiState.get()) m_guiState->SetNextSortMethod(); UpdateFileList(); return true; } else if (m_viewControl.HasControl(iControl)) // list/thumb control { int iItem = m_viewControl.GetSelectedItem(); int iAction = message.GetParam1(); if (iItem < 0) break; if (iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK) { OnClick(iItem); } else if (iAction == ACTION_CONTEXT_MENU || iAction == ACTION_MOUSE_RIGHT_CLICK) { OnPopupMenu(iItem); return true; } } } break; case GUI_MSG_SETFOCUS: { if (m_viewControl.HasControl(message.GetControlId()) && (DWORD) m_viewControl.GetCurrentControl() != message.GetControlId()) { m_viewControl.SetFocused(); return true; } } break; case GUI_MSG_NOTIFY_ALL: { // Message is received even if this window is inactive if (message.GetParam1() == GUI_MSG_WINDOW_RESET) { m_vecItems->m_strPath = "?"; return true; } else if ( message.GetParam1() == GUI_MSG_REFRESH_THUMBS ) { for (int i = 0; i < m_vecItems->Size(); i++) m_vecItems->Get(i)->FreeMemory(); break; // the window will take care of any info images } else if (message.GetParam1() == GUI_MSG_REMOVED_MEDIA) { if (m_vecItems->IsVirtualDirectoryRoot() && IsActive()) { int iItem = m_viewControl.GetSelectedItem(); Update(m_vecItems->m_strPath); m_viewControl.SetSelectedItem(iItem); } else if (m_vecItems->IsRemovable()) { // check that we have this removable share still if (!m_rootDir.IsInSource(m_vecItems->m_strPath)) { // don't have this share any more if (IsActive()) Update(""); else { m_history.ClearPathHistory(); m_vecItems->m_strPath=""; } } } return true; } else if (message.GetParam1()==GUI_MSG_UPDATE_SOURCES) { // State of the sources changed, so update our view if (m_vecItems->IsVirtualDirectoryRoot() && IsActive()) { int iItem = m_viewControl.GetSelectedItem(); Update(m_vecItems->m_strPath); m_viewControl.SetSelectedItem(iItem); } return true; } else if (message.GetParam1()==GUI_MSG_UPDATE && IsActive()) { if (message.GetStringParam().size()) { m_vecItems->m_strPath = message.GetStringParam(); SetHistoryForPath(m_vecItems->m_strPath); } Update(m_vecItems->m_strPath); } else if (message.GetParam1()==GUI_MSG_UPDATE_ITEM && message.GetItem()) { CFileItemPtr newItem = boost::static_pointer_cast<CFileItem>(message.GetItem()); if (IsActive()) m_vecItems->UpdateItem(newItem.get()); else if (newItem) { // need to remove the disc cache CFileItemList items; CUtil::GetDirectory(newItem->m_strPath, items.m_strPath); items.RemoveDiscCache(); } } else if (message.GetParam1()==GUI_MSG_UPDATE_PATH) { if (message.GetStringParam() == m_vecItems->m_strPath && IsActive()) Update(m_vecItems->m_strPath); } else return CGUIWindow::OnMessage(message); return true; } break; case GUI_MSG_PLAYBACK_STARTED: case GUI_MSG_PLAYBACK_ENDED: case GUI_MSG_PLAYBACK_STOPPED: case GUI_MSG_PLAYLIST_CHANGED: case GUI_MSG_PLAYLISTPLAYER_STOPPED: case GUI_MSG_PLAYLISTPLAYER_STARTED: case GUI_MSG_PLAYLISTPLAYER_CHANGED: { // send a notify all to all controls on this window CGUIMessage msg(GUI_MSG_NOTIFY_ALL, GetID(), 0, GUI_MSG_REFRESH_LIST); OnMessage(msg); break; } case GUI_MSG_CHANGE_VIEW_MODE: { int viewMode = 0; if (message.GetParam1()) // we have an id viewMode = m_viewControl.GetViewModeByID(message.GetParam1()); else if (message.GetParam2()) viewMode = m_viewControl.GetNextViewMode((int)message.GetParam2()); if (m_guiState.get()) m_guiState->SaveViewAsControl(viewMode); UpdateButtons(); return true; } break; case GUI_MSG_CHANGE_SORT_METHOD: { if (m_guiState.get()) { if (message.GetParam1()) m_guiState->SetCurrentSortMethod((int)message.GetParam1()); else if (message.GetParam2()) m_guiState->SetNextSortMethod((int)message.GetParam2()); } UpdateFileList(); return true; } break; case GUI_MSG_CHANGE_SORT_DIRECTION: { if (m_guiState.get()) m_guiState->SetNextSortOrder(); UpdateFileList(); return true; } break; } return CGUIWindow::OnMessage(message); }