/// <inheritdoc/> /// <exception cref="InvalidOperationException">Nejsouli pro daný časový interval dostupná žádná data</exception> public async Task Update(DateTime novyPocatek, DateTime novyKonec) { LogDataCollection dataToBeUpdated = sessionManager.Current?.Data; DateTime staryPocatek = dataToBeUpdated?.Pocatek ?? DateTime.Now; DateTime staryKonec = dataToBeUpdated?.Konec ?? DateTime.Now; if (dataToBeUpdated == null || novyKonec <= staryPocatek || staryKonec <= novyPocatek) { // Nejsou-li dostupná žádná data, tak budou všechna načtena podla pozadavků. LogDataCollection loadedData = await logLoader.LoadAsyncData(novyPocatek, novyKonec); sessionManager.Current.Data = loadedData.Count != 0 ? loadedData : throw new InvalidOperationException($"Pro zvolený časový interval nejsou k dispozici žádná data."); return; } if (novyPocatek < staryPocatek) { LogDataCollection extraBottomData = await logLoader.LoadAsyncData(novyPocatek, staryPocatek); sessionManager.Current.Data = extraBottomData.AddRange(dataToBeUpdated.ToList()); } if (staryKonec < novyKonec) { LogDataCollection extraTopData = await logLoader.LoadAsyncData(staryKonec, novyKonec); sessionManager.Current.Data = dataToBeUpdated.AddRange(extraTopData.ToList()); } }
/// <summary> /// Asynchronně načte všechna dostupná data, která jsou ohraničená <paramref name="pocatek"/> a <paramref name="pocatek"/>. /// </summary> /// <param name="pocatek"></param> /// <param name="konec"></param> /// <returns>Kolekce načtených dat typu <see cref="LogDataCollection"/>.</returns> /// <exception cref="ProcesEndedByUserException">V případě, že je proces předčasně ukončen uživatelem.</exception> public async Task <LogDataCollection> LoadAsyncData(DateTime pocatek, DateTime konec) { // Upozorní uživatele, že se pokouší načíst velké množství dat a požádá o potvrzení. if ((int)(konec - pocatek).TotalSeconds > POCET_RADKU_THRESHOLD && !errorDisplayService.ShowAsYesNo($"Počet potřebných řádků k načtení ze souboru přesahuje hodnotu {POCET_RADKU_THRESHOLD}" + $". Z toho může plynout dlouhá načítací doba. Chcete i přesto pokračovat? ")) { throw new ProcesEndedByUserException("Too many data rows."); } IEnumerable <string> vybraneSoubory = fileBrowser.GetOrderedFiles(pocatek, konec) ?? new List <string>(); var output = new LogDataCollection(template); foreach (var soubor in vybraneSoubory) { ILogLoader loader = logLoaderFactory.Create(soubor); output.AddRange((await loader.LoadAsyncData(pocatek, konec)).ToList()); // V případě, že loader již načetl veškeré soubory, tak je z této metody vyskočeno. if (loader.IsCompleted) { break; } } IsCompleted = true; return(output); }
public ZobrazovacDatPresenter(IZobrazovacDatView view, IEventAggregator events, ISessionManager sessionManager) : base(view) { this.events = events; this.sessionManager = sessionManager; events.Subscribe <ZobrazDataRequest>(e => { LogDataCollection data = sessionManager.Current?.Data; if (data != null) { View.xdata = data.Times; view.ydata = data.Columns; View.Sloupce = data?.Template.NazvySloupcu.Skip(1).ToArray() ?? new string[0]; View.Jednotky = data?.Template.Jednotky.Skip(1).ToArray() ?? new string[0]; View.UpdateData(e.Pocatek, e.Konec); // Při načtení nových dát schová všechny veličiny, které mají být schovány (z cache). seznamVypnutychSloupcu.ForEach((col) => View.SetYValVisibility(col, false)); } }); // Pokaždé když (z Toolbaru) dorazí zpráva o změně zobrazených hodnot, tak je zobrzaovac skryje a zároveň si pamatuje, že je nemá zobrazovat. events.Subscribe <ChangeYValueDisplayStatusRequest>(e => { View.SetYValVisibility(e.Name, e.IsOn); if (!e.IsOn && !seznamVypnutychSloupcu.Contains(e.Name)) { seznamVypnutychSloupcu.Add(e.Name); } else if (e.IsOn && seznamVypnutychSloupcu.Contains(e.Name)) { seznamVypnutychSloupcu.Remove(e.Name); } }); // Když dojde k vytvoření nového "Session" tak se cache pamatovaných nezobzraovaných sloupců zrestartuje events.Subscribe <NewSessionRequest>(e => { seznamVypnutychSloupcu = new List <string>(); }); }