Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
 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();
         }
     }
 }
Exemplo n.º 6
0
        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));
 }
Exemplo n.º 12
0
 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);
        }
Exemplo n.º 15
0
        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);
                }
            }
        }
Exemplo n.º 16
0
        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);
        }
Exemplo n.º 18
0
        /// <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();
        }
Exemplo n.º 19
0
        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;
        }
Exemplo n.º 20
0
 void TasClient_UserStatusChanged(object sender, OldNewPair<User> oldNewPair) {
     RefreshUser(oldNewPair.New.Name);
 }
Exemplo n.º 21
0
 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();
     }
     
 }