private void ListBackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { SearchErrorArg errorArg = e.UserState as SearchErrorArg; if (errorArg != null) { if (!string.IsNullOrEmpty(WebBrowser.DocumentText)) { WebBrowser.Document?.InvokeScript("__onSearchError", errorArg.ToObjectArray()); } return; } SearchProgressArg searchProgressArg = e.UserState as SearchProgressArg; if (searchProgressArg != null) { SearchResult searchResult = searchProgressArg.SearchResult; if (searchResult == null) { MessageBox.Show("Couldn't get search results for page " + (searchProgressArg.PageIndex + 1) + "!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // TODO: should this be done in DoWork instead? for (int i = 0; i < searchResult.Result.Count; ++i) { Metadata metadata = searchResult.Result[i]; string cachedMetadataPath; if (PathFormatter.IsEnabled) { cachedMetadataPath = PathFormatter.GetMetadata(metadata.Id); } else { cachedMetadataPath = string.Format(CultureInfo.InvariantCulture, "{0}{1}{2}", PathFormatter.GetCacheDirectory(), metadata.Id.ToString(CultureInfo.InvariantCulture), ".json"); } if (!File.Exists(cachedMetadataPath)) { try { Directory.CreateDirectory(Path.GetDirectoryName(cachedMetadataPath)); File.WriteAllText(cachedMetadataPath, JsonConvert.SerializeObject(metadata, Formatting.Indented)); } catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } // TODO: the progress should be multiple searchresult, not individual metadata in the first searchresult. if (!string.IsNullOrEmpty(WebBrowser.DocumentText)) { // TODO: invoke an event instead of directly invoking a script function. WebBrowser.Document?.InvokeScript("__onSearchResultLoaded", new object[] { searchProgressArg.SearchArg.PageIndex, searchProgressArg.SearchArg.TagId, searchProgressArg.SearchArg.Query ?? "", searchProgressArg.SearchArg.Target.ToString().ToLowerInvariant(), e.ProgressPercentage, i + 1, searchResult.Result.Count, JsonConvert.SerializeObject(metadata) }); } } if (searchProgressArg.PageIndex == searchProgressArg.SearchArg.PageIndex) { if (searchResult.Result != null && searchProgressArg.SortType != GallerySortType.None) { SearchResult customSearchResult = new SearchResult(); customSearchResult.NumPages = searchProgressArg.SearchResult.NumPages; customSearchResult.PerPage = searchProgressArg.SearchResult.PerPage; /* * IEnumerable<Metadata> customResult; * * customResult = searchProgressArg.SearchResult.Result.GetFilteredSearchResult(searchProgressArg.MetadataKeywordLists); * customResult = customResult.GetSortedSearchResult(searchProgressArg.SortType, searchProgressArg.SortOrder); */ IEnumerable <Metadata> customResult = searchProgressArg.SearchResult.Result.GetSortedSearchResult(searchProgressArg.SortType, searchProgressArg.SortOrder); customSearchResult.Result = customResult.ToList(); SearchProgressArg customSearchProgressArg = new SearchProgressArg(searchProgressArg.SearchArg, customSearchResult, searchProgressArg.PageIndex, searchProgressArg.MetadataKeywordLists, searchProgressArg.SortType, searchProgressArg.SortOrder); GalleryModel.SearchProgressArg = customSearchProgressArg; } else { GalleryModel.SearchProgressArg = searchProgressArg; } } // // TODO notify javascript to add one page of items // //galleryBrowserView.WebBrowser.Document.InvokeScript("__onProgressChanged", new object[] { searchProgressArg.PageIndex, JsonConvert.SerializeObject(searchProgressArg.SearchResult) }); } }
private static void ListBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker backgroundWorker = sender as BackgroundWorker; SearchDoArg searchDoArg = e.Argument as SearchDoArg; if (searchDoArg == null) { return; } SearchArg searchArg = searchDoArg.SearchArg; SearchProgressArg searchProgressArg = null; int currentPage = searchArg.PageIndex; SearchResult searchResult = null; /* * bool loadAll = false; // TODO: read this from settings.Download.LoadAll * * do * { */ try { if (searchArg.Target == SearchTarget.Query) { searchResult = searchDoArg.SearchHandler.Search(searchArg.Query, currentPage); } else if (searchArg.Target == SearchTarget.Tagged) { searchResult = searchDoArg.SearchHandler.TaggedSearch(searchArg.TagId, currentPage); } else if (searchArg.Target == SearchTarget.Recent) { searchResult = searchDoArg.SearchHandler.RecentSearch(currentPage); } if (searchResult == null) { e.Cancel = true; return; } searchDoArg.TagsModel.CollectTags(searchResult); searchProgressArg = new SearchProgressArg(searchArg, searchResult, currentPage, searchDoArg.MetadataKeywordLists, searchDoArg.SortType, searchDoArg.SortOrder); backgroundWorker.ReportProgress(searchResult.NumPages > 0 ? (int)(currentPage / (float)searchResult.NumPages * 100) : 100, searchProgressArg); } catch (Exception ex) { SearchErrorArg errorArg = new SearchErrorArg(searchArg, currentPage, (ex.InnerException != null) ? string.Format(CultureInfo.InvariantCulture, "{0}{1}{2}", ex.Message, Environment.NewLine, ex.InnerException.Message) : ex.Message); backgroundWorker.ReportProgress(0, errorArg); } /* * } while (loadAll * && searchResult != null * && ++currentPage < searchResult.NumPages); */ if (searchResult != null && searchResult.Result != null) { /*if (searchDoArg.SortType != GallerySortType.None) * { * searchResult = OrderByMetadata(searchResult, searchDoArg.SortType, searchDoArg.SortOrder); * }*/ e.Result = new SearchResultArg(searchArg, searchResult); } }