Merge pull request #6473 from obrakmann/fix6422

Add chat tab to end-game dialog
This commit is contained in:
Matthias Mailänder
2014-09-20 14:45:47 +02:00
7 changed files with 393 additions and 90 deletions

View File

@@ -8,7 +8,9 @@
*/
#endregion
using System;
using System.Linq;
using System.Drawing;
using OpenRA.Traits;
using OpenRA.Widgets;
@@ -16,26 +18,63 @@ namespace OpenRA.Mods.RA.Widgets
{
class LeaveMapLogic
{
enum Tab { Objectives, Chat };
Tab currentTab;
bool newChatMessage;
[ObjectCreator.UseCtor]
public LeaveMapLogic(Widget widget, World world)
{
widget.Get<LabelWidget>("VERSION_LABEL").Text = Game.modData.Manifest.Mod.Version;
var panelName = "LEAVE_MAP_SIMPLE";
var iop = world.WorldActor.TraitsImplementing<IObjectivesPanel>().FirstOrDefault();
var showObjectives = iop != null && iop.PanelName != null && world.LocalPlayer != null;
if (showObjectives)
panelName = "LEAVE_MAP_FULL";
var showStats = false;
var iop = world.WorldActor.TraitsImplementing<IObjectivesPanel>().FirstOrDefault();
var isMultiplayer = !world.LobbyInfo.IsSinglePlayer && !world.IsReplay;
var hasObjectives = iop != null && iop.PanelName != null && world.LocalPlayer != null;
var showTabs = hasObjectives && isMultiplayer;
currentTab = hasObjectives ? Tab.Objectives : Tab.Chat;
var panelName = hasObjectives || isMultiplayer ? "LEAVE_MAP_FULL" : "LEAVE_MAP_SIMPLE";
var dialog = widget.Get<ContainerWidget>(panelName);
dialog.IsVisible = () => !showStats;
widget.IsVisible = () => Ui.CurrentWindow() == null;
if (hasObjectives || isMultiplayer)
{
var titleText = dialog.Get<LabelWidget>("GAME_ENDED_LABEL");
var titleTextNoTabs = dialog.GetOrNull<LabelWidget>("GAME_ENDED_LABEL_NO_TABS");
titleText.IsVisible = () => showTabs || (!showTabs && titleTextNoTabs == null);
if (titleTextNoTabs != null)
titleTextNoTabs.IsVisible = () => !showTabs;
var bg = dialog.Get<BackgroundWidget>("LEAVE_MAP_BG");
var bgNoTabs = dialog.GetOrNull<BackgroundWidget>("LEAVE_MAP_BG_NO_TABS");
bg.IsVisible = () => showTabs || (!showTabs && bgNoTabs == null);
if (bgNoTabs != null)
bgNoTabs.IsVisible = () => !showTabs;
var objButton = dialog.Get<ButtonWidget>("OBJECTIVES_BUTTON");
objButton.IsVisible = () => showTabs;
objButton.OnClick = () => currentTab = Tab.Objectives;
objButton.IsHighlighted = () => currentTab == Tab.Objectives;
var chatButton = dialog.Get<ButtonWidget>("CHAT_BUTTON");
chatButton.IsVisible = () => showTabs;
chatButton.OnClick = () =>
{
currentTab = Tab.Chat;
newChatMessage = false;
};
chatButton.IsHighlighted = () => currentTab == Tab.Chat || (newChatMessage && Game.LocalTick % 50 < 25);
Game.BeforeGameStart += UnregisterChatNotification;
Game.AddChatLine += NotifyNewChatMessage;
}
var statsButton = dialog.Get<ButtonWidget>("STATS_BUTTON");
statsButton.IsVisible = () => !(world.Map.Type == "Mission" || world.Map.Type == "Campaign") || world.IsReplay;
statsButton.OnClick = () =>
{
showStats = true;
@@ -69,11 +108,30 @@ namespace OpenRA.Mods.RA.Widgets
});
};
if (showObjectives)
if (hasObjectives)
{
var objectivesContainer = dialog.Get<ContainerWidget>("OBJECTIVES");
var objectivesContainer = dialog.Get<ContainerWidget>("OBJECTIVES_PANEL");
Game.LoadWidget(world, iop.PanelName, objectivesContainer, new WidgetArgs());
objectivesContainer.IsVisible = () => currentTab == Tab.Objectives;
}
if (isMultiplayer)
{
var chatContainer = dialog.Get<ContainerWidget>("DIALOG_CHAT_PANEL");
chatContainer.IsVisible = () => currentTab == Tab.Chat;
}
}
void NotifyNewChatMessage(Color c, string s1, string s2)
{
if (currentTab != Tab.Chat)
newChatMessage = true;
}
void UnregisterChatNotification()
{
Game.AddChatLine -= NotifyNewChatMessage;
Game.BeforeGameStart -= UnregisterChatNotification;
}
}
}

View File

@@ -43,12 +43,16 @@ namespace OpenRA.Mods.RA.Widgets.Logic
Game.LoadWidget(world, "CHAT_PANEL", ingameRoot, new WidgetArgs());
Action ShowLeaveRestartDialog = () =>
var showLeaveMapWidget = false;
var leaveMapWidget = Game.LoadWidget(world, "LEAVE_MAP_WIDGET", Ui.Root, new WidgetArgs());
leaveMapWidget.IsVisible = () => showLeaveMapWidget;
Action ShowLeaveMapWidget = () =>
{
ingameRoot.RemoveChildren();
Game.LoadWidget(world, "LEAVE_MAP_WIDGET", Ui.Root, new WidgetArgs());
showLeaveMapWidget = true;
};
world.GameOver += ShowLeaveRestartDialog;
world.GameOver += ShowLeaveMapWidget;
}
}
}

View File

@@ -33,6 +33,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
readonly TabCompletionLogic tabCompletion = new TabCompletionLogic();
bool teamChat;
bool inDialog;
[ObjectCreator.UseCtor]
public IngameChatLogic(Widget widget, OrderManager orderManager, World world, Ruleset modRules)
@@ -49,9 +50,14 @@ namespace OpenRA.Mods.RA.Widgets.Logic
tabCompletion.Names = orderManager.LobbyInfo.Clients.Select(c => c.Name).Distinct().ToList();
var chatPanel = (ContainerWidget)widget;
chatOverlay = chatPanel.Get<ContainerWidget>("CHAT_OVERLAY");
chatOverlayDisplay = chatOverlay.Get<ChatDisplayWidget>("CHAT_DISPLAY");
chatOverlay.Visible = false;
chatOverlay = chatPanel.GetOrNull<ContainerWidget>("CHAT_OVERLAY");
if (chatOverlay != null)
{
chatOverlayDisplay = chatOverlay.Get<ChatDisplayWidget>("CHAT_DISPLAY");
chatOverlay.Visible = false;
}
else
inDialog = true;
chatChrome = chatPanel.Get<ContainerWidget>("CHAT_CHROME");
chatChrome.Visible = true;
@@ -82,6 +88,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
trait.OnChat(orderManager.LocalClient.Name, text);
}
chatText.Text = "";
CloseChat();
return true;
};
@@ -94,26 +101,29 @@ namespace OpenRA.Mods.RA.Widgets.Logic
chatText.OnEscKey = () => { CloseChat(); return true; };
var chatClose = chatChrome.Get<ButtonWidget>("CHAT_CLOSE");
chatClose.OnClick += CloseChat;
chatPanel.OnKeyPress = e =>
if (!inDialog)
{
if (e.Event == KeyInputEvent.Up)
return false;
var chatClose = chatChrome.Get<ButtonWidget>("CHAT_CLOSE");
chatClose.OnClick += CloseChat;
if (!chatChrome.IsVisible() && (e.Key == Keycode.RETURN || e.Key == Keycode.KP_ENTER))
chatPanel.OnKeyPress = e =>
{
OpenChat();
return true;
}
if (e.Event == KeyInputEvent.Up)
return false;
return false;
};
if (!chatChrome.IsVisible() && (e.Key == Keycode.RETURN || e.Key == Keycode.KP_ENTER))
{
OpenChat();
return true;
}
return false;
};
}
chatScrollPanel = chatChrome.Get<ScrollPanelWidget>("CHAT_SCROLLPANEL");
chatTemplate = chatScrollPanel.Get<ContainerWidget>("CHAT_TEMPLATE");
chatScrollPanel.RemoveChildren();
chatScrollPanel.ScrollToBottom();
Game.AddChatLine += AddChatLine;
Game.BeforeGameStart += UnregisterEvents;
@@ -130,22 +140,26 @@ namespace OpenRA.Mods.RA.Widgets.Logic
public void OpenChat()
{
chatText.Text = "";
chatOverlay.Visible = false;
chatChrome.Visible = true;
chatScrollPanel.ScrollToBottom();
chatText.TakeKeyboardFocus();
if (!inDialog)
chatOverlay.Visible = false;
}
public void CloseChat()
{
chatOverlay.Visible = true;
if (inDialog)
return;
chatChrome.Visible = false;
chatText.YieldKeyboardFocus();
chatOverlay.Visible = true;
}
public void AddChatLine(Color c, string from, string text)
{
chatOverlayDisplay.AddLine(c, from, text);
if (!inDialog)
chatOverlayDisplay.AddLine(c, from, text);
var template = chatTemplate.Clone();
var nameLabel = template.Get<LabelWidget>("NAME");