public void LoadState(bool forcePickFolder = false) { LogDirectory = IOUtils.RetrieveLogDirectory(forcePickFolder, LogDirectory); LogWatcher?.Dispose(); LogWatcher = new LogWatcher(LogDirectory); var allLogs = LogWatcher.RetrieveAllLogs(); Commanders.Clear(); var entryDatas = JsonConvert.DeserializeObject <List <EntryData> >(IOUtils.GetEntryDatasJson()); foreach (var commander in allLogs.Keys) { // some file contains only one line unrelated to anything, could generate Dummy Commander if we don't skip if (allLogs[commander].Count <= 1) { continue; } var commanderState = new CommanderViewModel(commander, allLogs[commander], Languages, entryDatas); Commanders[commander] = commanderState; } if (Commanders.Count == 0) // we found absolutely nothing { Commanders[LogWatcher.DEFAULT_COMMANDER_NAME] = new CommanderViewModel(LogWatcher.DEFAULT_COMMANDER_NAME, new List <string>(), Languages, entryDatas); } if (Commanders.Any(k => k.Key == SettingsManager.SelectedCommander)) { CurrentCommander = Commanders.First(k => k.Key == SettingsManager.SelectedCommander); } else { CurrentCommander = Commanders.First(); } LogWatcher.InitiateWatch(logs => { Application.Current.Dispatcher.Invoke(() => { if (logs.Item2.Count == 0) { return; } if (Commanders.ContainsKey(logs.Item1)) { Commanders[logs.Item1].ApplyEventsToSate(logs.Item2); } else if (logs.Item1 != LogWatcher.DEFAULT_COMMANDER_NAME) { var commanderState = new CommanderViewModel(logs.Item1, logs.Item2, Languages, entryDatas); Commanders[logs.Item1] = commanderState; } }); }); }