private void LoadDirectory(string newFolderName, bool useCache, HashSet<string> watchedFiles) { if (newFolderName == null) { Log.Warn("GUIVideoFiles::LoadDirectory called with invalid argument. newFolderName is null!"); return; } if (facadeLayout == null) { return; } GUIWaitCursor.Show(); GUIListItem selectedListItem = null; if (facadeLayout != null) { selectedListItem = facadeLayout.SelectedListItem; } if (selectedListItem != null) { if (selectedListItem.IsFolder && selectedListItem.Label != "..") { _history.Set(selectedListItem.Label, _currentFolder); } } if (newFolderName != _currentFolder && _mapSettings != null) { SaveFolderSettings(_currentFolder); } if (newFolderName != _currentFolder || _mapSettings == null) { LoadFolderSettings(newFolderName); } // Image file is not listed as a valid movie so we need to handle it // as a folder and enable browsing for it if (VirtualDirectory.IsImageFile(Path.GetExtension(newFolderName))) { if (!MountImageFile(GetID, newFolderName, true)) return; _currentFolder = DaemonTools.GetVirtualDrive(); } else { _currentFolder = newFolderName; } string objectCount = string.Empty; if (facadeLayout != null) { GUIControl.ClearControl(GetID, facadeLayout.GetID); } List<GUIListItem> itemlist = null; //Tweak to boost performance when starting/stopping playback //For further details see comment in Core\Util\VirtualDirectory.cs if (useCache && _cachedDir == _currentFolder) { itemlist = _cachedItems; SelectDVDHandler selectDvdHandler = new SelectDVDHandler(); foreach (GUIListItem item in itemlist) { if (watchedFiles != null && watchedFiles.Contains(item.Path)) { item.IsPlayed = true; } else if (_markWatchedFiles && (item.IsFolder && selectDvdHandler.IsDvdDirectory(item.Path) || Util.Utils.IsVideo(item.Path))) { string file = item.Path; if (item.IsFolder) file = selectDvdHandler.GetFolderVideoFile(item.Path); // Check db for watched status for played movie or changed status in movie info window item.IsPlayed = VideoDatabase.GetmovieWatchedStatus(VideoDatabase.GetMovieId(file)); } //Do NOT add OnItemSelected event handler here, because its still there... facadeLayout.Add(item); } } else { // here we get ALL files in every subdir, look for folderthumbs, defaultthumbs, etc itemlist = _virtualDirectory.GetDirectoryExt(_currentFolder); if (_mapSettings.Stack) { Dictionary<string, List<GUIListItem>> stackings = new Dictionary<string, List<GUIListItem>>(itemlist.Count); for (int i = 0; i < itemlist.Count; ++i) { GUIListItem item1 = itemlist[i]; string cleanFilename = item1.Label; Util.Utils.RemoveStackEndings(ref cleanFilename); List<GUIListItem> innerList; if (stackings.TryGetValue(cleanFilename, out innerList)) { for (int j = 0; j < innerList.Count; j++) { GUIListItem item2 = innerList[j]; if ((!item1.IsFolder || !item2.IsFolder) && (!item1.IsRemote && !item2.IsRemote) && Util.Utils.ShouldStack(item1.Path, item2.Path)) { if (String.Compare(item1.Path, item2.Path, true) > 0) { item2.FileInfo.Length += item1.FileInfo.Length; } else { // keep item1, it's path is lexicographically before item2 path item1.FileInfo.Length += item2.FileInfo.Length; innerList[j] = item1; } item1 = null; break; } } if (item1 != null) // not stackable { innerList.Add(item1); } } else { innerList = new List<GUIListItem> {item1}; stackings.Add(cleanFilename, innerList); } } List<GUIListItem> itemfiltered = new List<GUIListItem>(itemlist.Count); foreach (KeyValuePair<string, List<GUIListItem>> pair in stackings) { List<GUIListItem> innerList = pair.Value; for (int i = 0; i < innerList.Count; i++) { GUIListItem item = innerList[i]; if ((VirtualDirectory.IsValidExtension(item.Path, Util.Utils.VideoExtensions, false))) item.Label = pair.Key; itemfiltered.Add(item); } } itemlist = itemfiltered; } ISelectDVDHandler selectDVDHandler; if (GlobalServiceProvider.IsRegistered<ISelectDVDHandler>()) { selectDVDHandler = GlobalServiceProvider.Get<ISelectDVDHandler>(); } else { selectDVDHandler = new SelectDVDHandler(); GlobalServiceProvider.Add<ISelectDVDHandler>(selectDVDHandler); } // folder.jpg will already be assigned from "itemlist = virtualDirectory.GetDirectory(_currentFolder);" here selectDVDHandler.SetIMDBThumbs(itemlist, _markWatchedFiles, _eachFolderIsMovie); foreach (GUIListItem item in itemlist) { item.OnItemSelected += new GUIListItem.ItemSelectedHandler(item_OnItemSelected); facadeLayout.Add(item); } _cachedItems = itemlist; _cachedDir = _currentFolder; } OnSort(); bool itemSelected = false; //Sometimes the last selected item wasn't restored correcly after playback stop //The !useCache fixes this if (selectedListItem != null && !useCache) { string selectedItemLabel = _history.Get(_currentFolder); for (int i = 0; i < facadeLayout.Count; ++i) { GUIListItem item = facadeLayout[i]; if (item.Label == selectedItemLabel) { GUIControl.SelectItemControl(GetID, facadeLayout.GetID, i); itemSelected = true; break; } } } int totalItems = itemlist.Count; if (itemlist.Count > 0) { GUIListItem rootItem = (GUIListItem)itemlist[0]; if (rootItem.Label == "..") { totalItems--; } } //set object count label GUIPropertyManager.SetProperty("#itemcount", Util.Utils.GetObjectCountLabel(totalItems)); if (!itemSelected) { UpdateButtonStates(); SelectCurrentItem(); } GUIWaitCursor.Hide(); }
private void SetMovieUnwatched(string movieFileName, bool isFolder) { SelectDVDHandler isDvdFolder = new SelectDVDHandler(); if (isFolder && isDvdFolder.IsDvdDirectory(movieFileName)) movieFileName = isDvdFolder.GetFolderVideoFile(movieFileName); if (VideoDatabase.HasMovieInfo(movieFileName)) { IMDBMovie movieDetails = new IMDBMovie(); int idMovie = VideoDatabase.GetMovieInfo(movieFileName, ref movieDetails); movieDetails.Watched = 0; VideoDatabase.SetWatched(movieDetails); } int idFile = VideoDatabase.GetFileId(movieFileName); VideoDatabase.DeleteMovieStopTime(idFile); VideoDatabase.SetMovieWatchedStatus(VideoDatabase.GetMovieId(movieFileName), false); }