public ReplayBrowserLogic(Widget widget, ModData modData, Action onExit, Action onStart)
        {
            panel = widget;

            this.onStart = onStart;

            playerList     = panel.Get <ScrollPanelWidget>("PLAYER_LIST");
            playerHeader   = playerList.Get <ScrollItemWidget>("HEADER");
            playerTemplate = playerList.Get <ScrollItemWidget>("TEMPLATE");
            playerList.RemoveChildren();

            panel.Get <ButtonWidget>("CANCEL_BUTTON").OnClick = () => { cancelLoadingReplays = true; Ui.CloseWindow(); onExit(); };

            replayList = panel.Get <ScrollPanelWidget>("REPLAY_LIST");
            var template = panel.Get <ScrollItemWidget>("REPLAY_TEMPLATE");

            var mod = modData.Manifest.Mod;
            var dir = Platform.ResolvePath("^", "Replays", mod.Id, mod.Version);

            if (Directory.Exists(dir))
            {
                ThreadPool.QueueUserWorkItem(_ => LoadReplays(dir, template));
            }

            var watch = panel.Get <ButtonWidget>("WATCH_BUTTON");

            watch.IsDisabled = () => selectedReplay == null || selectedReplay.GameInfo.MapPreview.Status != MapStatus.Available;
            watch.OnClick    = () => { WatchReplay(); };

            panel.Get("REPLAY_INFO").IsVisible = () => selectedReplay != null;

            var preview = panel.Get <MapPreviewWidget>("MAP_PREVIEW");

            preview.SpawnOccupants = () => selectedSpawns;
            preview.Preview        = () => selectedReplay != null ? selectedReplay.GameInfo.MapPreview : null;

            var titleLabel = panel.GetOrNull <LabelWidget>("MAP_TITLE");

            if (titleLabel != null)
            {
                titleLabel.IsVisible = () => selectedReplay != null;

                var font  = Game.Renderer.Fonts[titleLabel.Font];
                var title = new CachedTransform <MapPreview, string>(m => WidgetUtils.TruncateText(m.Title, titleLabel.Bounds.Width, font));
                titleLabel.GetText = () => title.Update(selectedReplay.GameInfo.MapPreview);
            }

            var type = panel.GetOrNull <LabelWidget>("MAP_TYPE");

            if (type != null)
            {
                var mapType = new CachedTransform <MapPreview, string>(m => m.Categories.FirstOrDefault() ?? "");
                type.GetText = () => mapType.Update(selectedReplay.GameInfo.MapPreview);
            }

            panel.Get <LabelWidget>("DURATION").GetText = () => WidgetUtils.FormatTimeSeconds((int)selectedReplay.GameInfo.Duration.TotalSeconds);

            SetupFilters();
            SetupManagement();
        }
Exemple #2
0
        public ReplayBrowserLogic(Widget widget, ModData modData, Action onExit, Action onStart)
        {
            map   = MapCache.UnknownMap;
            panel = widget;

            services              = modData.Manifest.Get <WebServices>();
            this.modData          = modData;
            this.onStart          = onStart;
            Game.BeforeGameStart += OnGameStart;

            playerList     = panel.Get <ScrollPanelWidget>("PLAYER_LIST");
            playerHeader   = playerList.Get <ScrollItemWidget>("HEADER");
            playerTemplate = playerList.Get <ScrollItemWidget>("TEMPLATE");
            playerList.RemoveChildren();

            panel.Get <ButtonWidget>("CANCEL_BUTTON").OnClick = () => { cancelLoadingReplays = true; Ui.CloseWindow(); onExit(); };

            replayList = panel.Get <ScrollPanelWidget>("REPLAY_LIST");
            var template = panel.Get <ScrollItemWidget>("REPLAY_TEMPLATE");

            var mod = modData.Manifest;
            var dir = Platform.ResolvePath(Platform.SupportDirPrefix, "Replays", mod.Id, mod.Metadata.Version);

            if (Directory.Exists(dir))
            {
                ThreadPool.QueueUserWorkItem(_ => LoadReplays(dir, template));
            }

            var watch = panel.Get <ButtonWidget>("WATCH_BUTTON");

            watch.IsDisabled = () => selectedReplay == null || map.Status != MapStatus.Available;
            watch.OnClick    = () => { WatchReplay(); };

            var mapPreviewRoot = panel.Get("MAP_PREVIEW_ROOT");

            mapPreviewRoot.IsVisible           = () => selectedReplay != null;
            panel.Get("REPLAY_INFO").IsVisible = () => selectedReplay != null;

            Ui.LoadWidget("MAP_PREVIEW", mapPreviewRoot, new WidgetArgs
            {
                { "orderManager", null },
                { "getMap", (Func <MapPreview>)(() => map) },
                { "onMouseDown", (Action <MapPreviewWidget, MapPreview, MouseInput>)((preview, mapPreview, mi) => { }) },
                {
                    "getSpawnOccupants", (Func <MapPreview, Dictionary <CPos, SpawnOccupant> >)(mapPreview =>
                                                                                                LobbyUtils.GetSpawnOccupants(selectedReplay.GameInfo.Players, mapPreview))
                },
                { "showUnoccupiedSpawnpoints", false },
            });

            var replayDuration = new CachedTransform <ReplayMetadata, string>(r =>
                                                                              "Duration: {0}".F(WidgetUtils.FormatTimeSeconds((int)selectedReplay.GameInfo.Duration.TotalSeconds)));

            panel.Get <LabelWidget>("DURATION").GetText = () => replayDuration.Update(selectedReplay);

            SetupFilters();
            SetupManagement();
        }
Exemple #3
0
        public ReplayBrowserLogic(Widget widget, Action onExit, Action onStart)
        {
            panel = widget;

            playerList     = panel.Get <ScrollPanelWidget>("PLAYER_LIST");
            playerHeader   = playerList.Get <ScrollItemWidget>("HEADER");
            playerTemplate = playerList.Get <ScrollItemWidget>("TEMPLATE");
            playerList.RemoveChildren();

            panel.Get <ButtonWidget>("CANCEL_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); };

            replayList = panel.Get <ScrollPanelWidget>("REPLAY_LIST");
            var template = panel.Get <ScrollItemWidget>("REPLAY_TEMPLATE");

            var mod = Game.modData.Manifest.Mod;
            var dir = Platform.ResolvePath("^", "Replays", mod.Id, mod.Version);

            replayList.RemoveChildren();
            if (Directory.Exists(dir))
            {
                using (new Support.PerfTimer("Load replays"))
                {
                    replays = Directory
                              .GetFiles(dir, "*.rep")
                              .Select(ReplayMetadata.Read)
                              .Where(r => r != null)
                              .OrderByDescending(r => r.GameInfo.StartTimeUtc)
                              .ToList();
                }

                foreach (var replay in replays)
                {
                    AddReplay(replay, template);
                }

                ApplyFilter();
            }
            else
            {
                replays = new List <ReplayMetadata>();
            }

            var watch = panel.Get <ButtonWidget>("WATCH_BUTTON");

            watch.IsDisabled = () => selectedReplay == null || selectedReplay.GameInfo.MapPreview.Status != MapStatus.Available;
            watch.OnClick    = () => { WatchReplay(); onStart(); };

            panel.Get("REPLAY_INFO").IsVisible = () => selectedReplay != null;

            var preview = panel.Get <MapPreviewWidget>("MAP_PREVIEW");

            preview.SpawnOccupants = () => selectedSpawns;
            preview.Preview        = () => selectedReplay != null ? selectedReplay.GameInfo.MapPreview : null;

            var title = panel.GetOrNull <LabelWidget>("MAP_TITLE");

            if (title != null)
            {
                title.GetText = () => selectedReplay != null ? selectedReplay.GameInfo.MapPreview.Title : null;
            }

            var type = panel.GetOrNull <LabelWidget>("MAP_TYPE");

            if (type != null)
            {
                type.GetText = () => selectedReplay.GameInfo.MapPreview.Type;
            }

            panel.Get <LabelWidget>("DURATION").GetText = () => WidgetUtils.FormatTimeSeconds((int)selectedReplay.GameInfo.Duration.TotalSeconds);

            SetupFilters();
            SetupManagement();
        }
Exemple #4
0
        public MusicPlayerLogic(Action onExit)
        {
            bg          = Ui.Root.Get("MUSIC_MENU");
            CurrentSong = GetNextSong();

            bg.Get("BUTTON_PAUSE").IsVisible = () => Sound.MusicPlaying;
            bg.Get("BUTTON_PLAY").IsVisible  = () => !Sound.MusicPlaying;

            bg.Get <ButtonWidget>("BUTTON_CLOSE").OnClick =
                () => { Game.Settings.Save(); Ui.CloseWindow(); onExit(); };

            bg.Get("BUTTON_INSTALL").IsVisible = () => false;

            bg.Get <ButtonWidget>("BUTTON_PLAY").OnClick  = () => Play(CurrentSong);
            bg.Get <ButtonWidget>("BUTTON_PAUSE").OnClick = Sound.PauseMusic;
            bg.Get <ButtonWidget>("BUTTON_STOP").OnClick  = Sound.StopMusic;
            bg.Get <ButtonWidget>("BUTTON_NEXT").OnClick  = () => Play(GetNextSong());
            bg.Get <ButtonWidget>("BUTTON_PREV").OnClick  = () => Play(GetPrevSong());

            var shuffleCheckbox = bg.Get <CheckboxWidget>("SHUFFLE");

            shuffleCheckbox.IsChecked = () => Game.Settings.Sound.Shuffle;
            shuffleCheckbox.OnClick   = () => Game.Settings.Sound.Shuffle ^= true;

            var repeatCheckbox = bg.Get <CheckboxWidget>("REPEAT");

            repeatCheckbox.IsChecked = () => Game.Settings.Sound.Repeat;
            repeatCheckbox.OnClick   = () => Game.Settings.Sound.Repeat ^= true;

            bg.Get <LabelWidget>("TIME").GetText = () =>
            {
                if (CurrentSong == null)
                {
                    return("");
                }
                return("{0} / {1}".F(
                           WidgetUtils.FormatTimeSeconds((int)Sound.MusicSeekPosition),
                           WidgetUtils.FormatTimeSeconds(Rules.Music[CurrentSong].Length)));
            };

            var ml           = bg.Get <ScrollPanelWidget>("MUSIC_LIST");
            var itemTemplate = ml.Get <ScrollItemWidget>("MUSIC_TEMPLATE");

            if (!Rules.InstalledMusic.Any())
            {
                itemTemplate.IsVisible = () => true;
                itemTemplate.Get <LabelWidget>("TITLE").GetText = () => "No Music Installed";
                itemTemplate.Get <LabelWidget>("TITLE").Align   = TextAlign.Center;
            }

            foreach (var kv in Rules.InstalledMusic)
            {
                var song = kv.Key;
                var item = ScrollItemWidget.Setup(itemTemplate,
                                                  () => CurrentSong == song,
                                                  () => Play(song));
                item.Get <LabelWidget>("TITLE").GetText  = () => Rules.Music[song].Title;
                item.Get <LabelWidget>("LENGTH").GetText =
                    () => WidgetUtils.FormatTimeSeconds(Rules.Music[song].Length);
                ml.AddChild(item);
            }
        }