#region Copyright & License Information /* * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, * see COPYING. */ #endregion using System; using System.IO; using System.Linq; using OpenRA.Network; using OpenRA.Widgets; namespace OpenRA.Mods.RA.Widgets.Logic { public class ReplayBrowserLogic { Widget panel; [ObjectCreator.UseCtor] public ReplayBrowserLogic(Widget widget, Action onExit, Action onStart) { panel = widget; panel.Get("CANCEL_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); }; var rl = panel.Get("REPLAY_LIST"); var dir = new[] { Platform.SupportDir, "Replays", WidgetUtils.ActiveModId(), WidgetUtils.ActiveModVersion() }.Aggregate(Path.Combine); var template = panel.Get("REPLAY_TEMPLATE"); rl.RemoveChildren(); if (Directory.Exists(dir)) { var files = Directory.GetFiles(dir, "*.rep").Reverse(); foreach (var replayFile in files) AddReplay(rl, replayFile, template); SelectReplay(files.FirstOrDefault()); } var watch = panel.Get("WATCH_BUTTON"); watch.IsDisabled = () => currentReplay == null || currentMap == null || currentReplay.Duration == 0; watch.OnClick = () => { WatchReplay(); onStart(); }; panel.Get("REPLAY_INFO").IsVisible = () => currentReplay != null; } Replay currentReplay; Map currentMap; void SelectReplay(string filename) { if (filename == null) return; try { currentReplay = new Replay(filename); currentMap = currentReplay.Map(); panel.Get("DURATION").GetText = () => WidgetUtils.FormatTime(currentReplay.Duration); panel.Get("MAP_PREVIEW").Map = () => currentMap; panel.Get("MAP_TITLE").GetText = () => currentMap != null ? currentMap.Title : "(Unknown Map)"; var players = currentReplay.LobbyInfo.Slots .Count(s => currentReplay.LobbyInfo.ClientInSlot(s.Key) != null); panel.Get("PLAYERS").GetText = () => players.ToString(); } catch (Exception e) { Log.Write("debug", "Exception while parsing replay: {0}", e); currentReplay = null; currentMap = null; } } void WatchReplay() { if (currentReplay != null) { Game.JoinReplay(currentReplay.Filename); Ui.CloseWindow(); } } void AddReplay(ScrollPanelWidget list, string filename, ScrollItemWidget template) { var item = ScrollItemWidget.Setup(template, () => currentReplay != null && currentReplay.Filename == filename, () => SelectReplay(filename), () => WatchReplay()); var f = Path.GetFileName(filename); item.Get("TITLE").GetText = () => f; list.AddChild(item); } } }