void tas_MyBattleMapChanged(object sender, OldNewPair <Battle> oldNewPair) { lastMapChange = DateTime.Now; Battle b = tas.MyBattle; if (b != null) { string mapName = b.MapName.ToLower(); if (SpawnConfig == null) { ComResetOptions(TasSayEventArgs.Default, new string[] { }); ComClearBox(TasSayEventArgs.Default, new string[] { }); } try { var serv = GlobalConst.GetSpringieService(); string commands = serv.GetMapCommands(mapName); if (!string.IsNullOrEmpty(commands)) { foreach (string c in commands.Split('\n').Where(x => !string.IsNullOrEmpty(x))) { RunCommand(c); } } } catch (Exception ex) { Trace.TraceError("Error procesing map commands: {0}", ex); } } }
void TasClient_BattleMapChanged(object sender, OldNewPair <Battle> pair) { var tas = (TasClient)sender; if (tas.MyBattle == pair.New) { SetMapImages(pair.New.MapName); } }
void TasClient_BattleInfoChanged(object sender, OldNewPair <Battle> pair) { var battle = pair.New; var battleIcon = GetBattleIcon(battle.BattleID); battleIcon.SetPlayers(); battleIcon.IsInGame = battle.IsInGame; BattleChanged(this, new EventArgs <BattleIcon>(battleIcon)); }
/// <summary> /// ビューア用データベースアクセス /// </summary> /// <param name="index"></param> private void SearchForViewer(OldNewPair <long> index, bool wait) { var direction = (index.NewItem == 0) ? 0 : (index.OldItem == 0 && index.NewItem == this.front.Length.Value - 1) ? -1 : (int)(index.NewItem - index.OldItem); this.front.GetRecords(index.NewItem - viewerDatabaseLoadLength / 2, viewerDatabaseLoadLength, direction, wait); }
void tas_UserStatusChanged(object sender, OldNewPair <User> oldNewPair) { if (spring.IsRunning) { Battle b = tas.MyBattle; var name = oldNewPair.New.Name; if (name != tas.UserName && b.Users.ContainsKey(name)) { CheckForBattleExit(); } } }
void TasClient_UserStatusChanged(object sender, OldNewPair <User> p) { var battle = Program.TasClient.ExistingBattles.Values.FirstOrDefault(b => b.Founder.Name == p.New.Name); if (battle == null) { return; } var founder = battle.Founder; var battleIcon = GetBattleIcon(battle); battleIcon.IsInGame = founder.IsInGame; BattleChanged(this, new EventArgs <BattleIcon>(battleIcon)); }
void TasClient_UserStatusChanged(object sender, OldNewPair <User> p) { if (p == null || p.New == null) { return; // paranoid safety; see http://zero-k.info/Forum/Post/142284#142284 } var battle = Program.TasClient.ExistingBattles.Values.FirstOrDefault(b => b.FounderName == p.New.Name); if (battle == null) { return; } var battleIcon = GetBattleIcon(battle); battleIcon.IsInGame = battle.IsInGame; BattleChanged(this, new EventArgs <BattleIcon>(battleIcon)); }
void TasClient_UserStatusChanged(object sender, OldNewPair<User> p) { var battle = Program.TasClient.ExistingBattles.Values.FirstOrDefault(b => b.Founder.Name == p.New.Name); if (battle == null) return; var founder = battle.Founder; var battleIcon = GetBattleIcon(battle); battleIcon.IsInGame = founder.IsInGame; BattleChanged(this, new EventArgs<BattleIcon>(battleIcon)); }
void TasClient_UserStatusChanged(object sender, OldNewPair<User> p) { if (p == null || p.New == null) return; // paranoid safety; see http://zero-k.info/Forum/Post/142284#142284 var battle = Program.TasClient.ExistingBattles.Values.FirstOrDefault(b => b.FounderName == p.New.Name); if (battle == null) return; var battleIcon = GetBattleIcon(battle); battleIcon.IsInGame = battle.IsInGame; BattleChanged(this, new EventArgs<BattleIcon>(battleIcon)); }
void TasClient_BattleMapChanged(object sender, OldNewPair<Battle> pair) { var battleIcon = GetBattleIcon(pair.New.BattleID); LoadMinimap(pair.New.MapName, battleIcon); }
void TasClient_BattleInfoChanged(object sender, OldNewPair<Battle> pair) { var battle = pair.New; var battleIcon = GetBattleIcon(battle.BattleID); battleIcon.SetPlayers(); battleIcon.IsInGame = battle.IsInGame; BattleChanged(this, new EventArgs<BattleIcon>(battleIcon)); }
void TasClient_UserStatusChanged(object sender, OldNewPair <User> oldNewPair) { RefreshUser(oldNewPair.New.Name); }
void TasClient_BattleMapChanged(object sender, OldNewPair<Battle> pair) { var tas = (TasClient)sender; if (tas.MyBattle == pair.New) { SetMapImages(pair.New.MapName); } }
void TasClient_BattleMapChanged(object sender, OldNewPair <Battle> pair) { var battleIcon = GetBattleIcon(pair.New.BattleID); LoadMinimap(pair.New.MapName, battleIcon); }
void tas_MyBattleMapChanged(object sender, OldNewPair<Battle> oldNewPair) { lastMapChange = DateTime.Now; Battle b = tas.MyBattle; if (b != null) { string mapName = b.MapName.ToLower(); if (SpawnConfig == null) { ComResetOptions(TasSayEventArgs.Default, new string[] { }); ComClearBox(TasSayEventArgs.Default, new string[] { }); } try { var serv = GlobalConst.GetSpringieService(); string commands = serv.GetMapCommands(mapName); if (!string.IsNullOrEmpty(commands)) foreach (string c in commands.Split('\n').Where(x => !string.IsNullOrEmpty(x))) RunCommand(c); } catch (Exception ex) { Trace.TraceError("Error procesing map commands: {0}", ex); } } }
public override bool Evaluate(object item) { OldNewPair <Customer> oldNewCustomer = (OldNewPair <Customer>)item; return(oldNewCustomer.NewValue.CurrentBalance == oldNewCustomer.OldValue.CurrentBalance); }
public override bool Evaluate(object item) { OldNewPair <Customer> oldNewCustomer = (OldNewPair <Customer>)item; return(!oldNewCustomer.NewValue.Deleted && !oldNewCustomer.NewValue.Deleted); }
/// <summary> /// アプリ外から渡されたファイルリストを使用して起動 /// </summary> /// <param name="list"></param> public void ActivateFiles(IEnumerable <string> list) { var files = list?.Where(x => x.HasText()).ToArray(); if (files.IsNullOrEmpty()) { return; } var records = this.front.ActivateFiles(files); var state = new ViewState() { Search = null, GroupKey = null, CatalogIndex = 0, ViewerIndex = 0, Type = PageType.Catalog, }; this.History.MoveNew(state); this.ChangePage(PageType.Viewer, 0, 0); var record = records[0]; //画像ロード this.core.ImageBuffer.RequestLoading (record, this.GenerateImageLoadOption(ImageQuality.Resized), null, true, default(CancellationToken)); if (records.Length != 1) { return; } string directory; string tmpDir; try { directory = System.IO.Path.GetDirectoryName(record.FullPath); tmpDir = System.IO.Path.GetDirectoryName(System.IO.Path.GetTempPath()); } catch { return; } //一時フォルダ内のファイル if (directory.ToLower().StartsWith(tmpDir.ToLower())) { return; } //ファイルが一つだけ、かつ一時フォルダでない Task.Run(async() => { //同じフォルダ内のファイルをライブラリに登録 await this.front.ActivateFolderAsync(directory).ConfigureAwait(false); var search = new SearchInformation(new ComplexSearch(false)); search.Root.Add(new UnitSearch() { Property = FileProperty.DirectoryPathStartsWith, Reference = record.Directory, Mode = CompareMode.Equal, }); search.SetSort(new[] { new SortSetting() { Property = FileProperty.FileName, IsDescending = false } }, false); var index = await core.Library.FindIndexAsync(search, record).ConfigureAwait(false); this.lastViewerImageIndex = new OldNewPair <long>(index, index); this.front.Length .Where(x => x > index) .Take(1) .Subscribe(x => { this.viewerImageChangeGate = false; this.ViewerIndexInner = index; this.viewerImageChangeGate = true; }); state.Search = search; this.History.Current.Search = search; await Application.Current.Dispatcher.InvokeAsync(() => { this.front.SetSearch(search, true); }); }) .FireAndForget(); }
public Client(LibraryFront front, ApplicationCore core) { this.core = core; this.front = front; front.AddTo(this.Disposables); this.SelectedItems = new SelectionManager(core.Library).AddTo(this.Disposables); this.SelectedItemsCount = this.SelectedItems .ObserveProperty(x => x.Count) .ToReadOnlyReactiveProperty() .AddTo(this.Disposables); this.History = new History <ViewState>(new ViewState()).AddTo(this.Disposables); this.PageChangeRequestSubject = new Subject <PageType>().AddTo(this.Disposables); this.SelectedPage = this.PageChangeRequestSubject .ToReadOnlyReactiveProperty(PageType.Search) .AddTo(this.Disposables); this.IsStateChangingSubject = new BehaviorSubject <bool>(false).AddTo(this.Disposables); this.IsCatalogRenderingEnabledSubject = new Subject <bool>().AddTo(this.Disposables); this.CatalogScrollIndexSubject = new Subject <long>().AddTo(this.Disposables); this.ViewerDisplayingInner = new ReactiveProperty <Record>().AddTo(this.Disposables); this.ViewerDisplaying = this.ViewerDisplayingInner .ToReadOnlyReactiveProperty().AddTo(this.Disposables); this.SelectedPage.Subscribe(x => { if (x != PageType.None) { this.History.Current.Type = x; } if (x == PageType.Viewer) { this.SetRecord(false); } }) .AddTo(this.Disposables); this.Length = this.front.Length .ToReadOnlyReactiveProperty() .AddTo(this.Disposables); this.StateChanged = this.front.Length.Select(_ => Unit.Default) .Merge(this.front.CacheCleared.Select(_ => Unit.Default)) .Publish().RefCount(); this.front.CacheCleared.Subscribe(x => { if (x.Action == CacheClearAction.SearchChanged || x.Action == CacheClearAction.GroupUpdated) { this.SelectedItems.Clear(); } if (x.Action == CacheClearAction.SortChanged) { //this.History.Current.ViewerIndex = 0; //this.History.Current.CatalogIndex = 0; } else { this.SelectedItems.ClearCache(); } }) .AddTo(this.Disposables); this.ColumnLength = new ReactiveProperty <int>(-1).AddTo(this.Disposables); this.RowLength = new ReactiveProperty <int>(-1).AddTo(this.Disposables); this.CatalogIndex = this.ToReactivePropertyAsSynchronized(x => x.CatalogIndexInner) .AddTo(this.Disposables); this.ViewerIndex = this.ToReactivePropertyAsSynchronized(x => x.ViewerIndexInner) .AddTo(this.Disposables); this.SearchCompleted .Where(x => (this.SelectedPage.Value == PageType.Viewer && x.Takes > 0)) .ObserveOnUIDispatcher() .Subscribe(_ => this.SetRecord(true)) .AddTo(this.Disposables); //Viewerで表示中のRecord var viewerDisplaying = this.ViewerDisplayingInner .CombineLatest(this.SelectedPage, (r, p) => p == PageType.Viewer ? r : null) .Where(x => x != null); //Catalogで選択数が1になったとき、Recordの実体がわからない var selectedChangedTrigger = this.SelectedItemsCount .Pairwise() .Where(x => x.OldItem > 1 && x.NewItem == 1 && this.SelectedRecord.Value == null && this.SelectedPage.Value == PageType.Catalog) .Select(_ => this.SelectedItems.GetAll().FirstOrDefault()) .Where(x => x.Key != null) .Publish().RefCount(); //DBに問い合わせ var selectedChanged = selectedChangedTrigger .Where(x => x.Value == null) .SelectMany(x => core.Library.GetRecordAsync(x.Key)) .Merge(selectedChangedTrigger.Where(x => x.Value != null).Select(x => x.Value)); //Catalogで選択中のRecord var catalogDisplaying = this.SelectedItems.SelectedItemChanged .CombineLatest(this.front.FeaturedGroupChanged, (s, g) => s ?? g) .Merge(selectedChanged) .Where(_ => this.SelectedPage.Value == PageType.Catalog) .CombineLatest(this.SelectedPage.Where(x => x == PageType.Catalog), (x, p) => x); //情報を表示すべきRecord this.SelectedRecord = viewerDisplaying .Merge(catalogDisplaying) .ToReadOnlyReactiveProperty() .AddTo(this.Disposables); //Exif this.SelectedRecord .CombineLatest(this.core.Library.ExifManager.HasVisibleItem, (r, h) => h ? r : null) .Throttle(TimeSpan.FromMilliseconds(300)) .Where(x => x != null && !x.IsGroup && x.Exif == null) .Select(x => new { R = x, E = this.core.Library.ExifManager.LoadExif(x.FullPath) }) .ObserveOnUIDispatcher() .Subscribe(x => x.R.Exif = x.E) .AddTo(this.Disposables); this.PageSize = this.ColumnLength.Where(x => x > 0) .CombineLatest(this.RowLength.Where(x => x > 0), (c, r) => c * r) .ToReadOnlyReactiveProperty() .AddTo(this.Disposables); this.PageSize .Subscribe(x => core.ImageBuffer.ThumbnailRequestCapacity = Math.Max(x * 2, 32)) .AddTo(this.Disposables); //データベース更新 var databaseUpdatedForCatalog = this.front.CacheCleared .Where(x => x.Action == CacheClearAction.DatabaseUpdated) .Buffer(this.SelectedPage.Where(x => x == PageType.Catalog)) .Where(x => x.Count > 0) .Select(_ => this.CatalogIndex.Value); //キャッシュクリア var catalogReset = this.front.CacheCleared .Where(x => this.SelectedPage.Value == PageType.Catalog) .Select(_ => this.CatalogIndex.Value); //Catalog用DB問い合わせ this.CatalogIndex .Restrict(TimeSpan.FromMilliseconds(100)) .Merge(catalogReset) .Merge(databaseUpdatedForCatalog) .Pairwise(0) .CombineLatest(this.PageSize, (Index, ViewSize) => new { ViewSize, Index }) .Subscribe(x => { if (x.ViewSize > 0 && !this.IsStateChangingSubject.Value) { this.SearchForCatalog(x.Index.NewItem, x.ViewSize, (int)(x.Index.NewItem - x.Index.OldItem)); } }) .AddTo(this.Disposables); //Viewerインデックス変更時のデータベース問い合わせ var viewerImage = this.ViewerIndex .Skip(1) .Where(_ => this.viewerImageChangeGate && this.SelectedPage.Value == PageType.Viewer) .Pairwise(0) .Merge(this.SelectedPage.Where(x => x == PageType.Viewer) .Select(_ => new OldNewPair <long>(this.ViewerIndex.Value, this.ViewerIndex.Value))) .Publish() .RefCount(); viewerImage .Subscribe(x => { this.SearchForViewer(x, false); this.SetRecord(false); }) .AddTo(this.Disposables); viewerImage .Throttle(TimeSpan.FromMilliseconds(200)) .Subscribe(x => this.SearchForViewer(x, true)) .AddTo(this.Disposables); //キャッシュクリア時のViewer再読み込み this.lastViewerImageIndex = new OldNewPair <long>(0, 0); viewerImage.Subscribe(x => this.lastViewerImageIndex = x).AddTo(this.Disposables); this.ViewerCacheClearedTrigger = this.front.CacheCleared .Where(x => x.Action != CacheClearAction.SearchChanged && this.SelectedPage.Value == PageType.Viewer) .Publish().RefCount(); this.ViewerCacheClearedTrigger .Select(_ => this.lastViewerImageIndex) .Subscribe(x => { this.SearchForViewer(x, true); }) .AddTo(this.Disposables); front.DatabaseAddedOrRemoved .Subscribe(async _ => { var criteria = front.GetActiveSearch(); var record = this.ViewerDisplayingInner.Value; if (criteria != null && record != null) { var index = await core.Library.FindIndexAsync(criteria, record); await Application.Current.Dispatcher.InvokeAsync(() => { this.viewerImageChangeGate = false; this.ViewerIndexInner = index; this.viewerImageChangeGate = true; }); } }) .AddTo(this.Disposables); //画像読み込みリクエスト this.ChangeToViewerSubject = new Subject <long>().AddTo(this.Disposables); var cacheUpdated = front.CacheUpdated .Where(x => this.ViewerIndex.Value >= x.Start && this.ViewerIndex.Value < x.Start + x.Length) .Select(_ => this.ViewerIndex.Value); var viewerIndexChanged = ChangeToViewerSubject .Merge(this.ViewerIndex.Where(_ => this.SelectedPage.Value == PageType.Viewer)) .Merge(cacheUpdated) .Publish() .RefCount(); viewerIndexChanged .Subscribe(x => LoadImagesMain(x, ImageQuality.LowQuality, ListOrderFlags.Current | ListOrderFlags.Next | ListOrderFlags.Previous)) .AddTo(this.Disposables); viewerIndexChanged .Throttle(TimeSpan.FromMilliseconds(resizedImageLoadDelayMillisec)) .ObserveOn(SynchronizationContext.Current) .Subscribe(x => LoadImagesMain(x, ImageQuality.Resized, ListOrderFlags.Current | ListOrderFlags.Next | ListOrderFlags.Previous)) .AddTo(this.Disposables); //表示中の画像のみ最高画質ロード var viewerIndexChangedFiltered = core.LoadingOriginalQualityQuick ? viewerIndexChanged.Restrict(TimeSpan.FromMilliseconds(originalImageLoadDelayMillisec)) : viewerIndexChanged.Throttle(TimeSpan.FromMilliseconds(originalImageLoadDelayMillisec)); viewerIndexChangedFiltered .ObserveOn(SynchronizationContext.Current) .Subscribe(x => LoadImagesMain(x, ImageQuality.OriginalSize, ListOrderFlags.Current)) .AddTo(this.Disposables); this.PrepareNextSubject = new Subject <long>().AddTo(this.Disposables); this.PrepareNextSubject .Throttle(TimeSpan.FromMilliseconds(resizedImageLoadDelayMillisec)) .ObserveOn(SynchronizationContext.Current) .Subscribe(async x => { await this.front.SearchAsync(x, 1, true); LoadImagesMain(x, ImageQuality.Resized, ListOrderFlags.Current); }) .AddTo(this.Disposables); //検索条件が変化したらライブラリに設定して最初の方を読み込む this.History.StateChanged .Where(x => x != null) .Subscribe(this.OnStateChanged) .AddTo(this.Disposables); //破棄時に設定を保存 Disposable.Create(() => core.Save()).AddTo(this.Disposables); this.History.Clear(); this.SetNewSearch(null); this.History.Current.Type = PageType.Search; this.viewerImageChangeGate = true; }
void TasClient_UserStatusChanged(object sender, OldNewPair<User> oldNewPair) { RefreshUser(oldNewPair.New.Name); }
void tas_UserStatusChanged(object sender, OldNewPair<User> oldNewPair) { if (spring.IsRunning) { Battle b = tas.MyBattle; var name = oldNewPair.New.Name; if (name != tas.UserName && b.Users.ContainsKey(name)) CheckForBattleExit(); } }