Split chat lines into pools
- Add a common class for passing around chat lines - Add wrapper methods for adding chat lines - Combine repeated chat lines in the display widget
This commit is contained in:
committed by
Paul Chote
parent
0a02bd524a
commit
6af354ff99
@@ -46,9 +46,9 @@ namespace OpenRA.Network
|
|||||||
readonly List<Order> localOrders = new List<Order>();
|
readonly List<Order> localOrders = new List<Order>();
|
||||||
readonly List<Order> localImmediateOrders = new List<Order>();
|
readonly List<Order> localImmediateOrders = new List<Order>();
|
||||||
|
|
||||||
readonly List<ChatLine> chatCache = new List<ChatLine>();
|
readonly List<TextNotification> notificationsCache = new List<TextNotification>();
|
||||||
|
|
||||||
public IReadOnlyList<ChatLine> ChatCache => chatCache;
|
public IReadOnlyList<TextNotification> NotificationsCache => notificationsCache;
|
||||||
|
|
||||||
bool disposed;
|
bool disposed;
|
||||||
bool generateSyncReport = false;
|
bool generateSyncReport = false;
|
||||||
@@ -94,7 +94,7 @@ namespace OpenRA.Network
|
|||||||
{
|
{
|
||||||
Connection = conn;
|
Connection = conn;
|
||||||
syncReport = new SyncReport(this);
|
syncReport = new SyncReport(this);
|
||||||
AddChatLine += CacheChatLine;
|
AddTextNotification += CacheTextNotification;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void IssueOrders(Order[] orders)
|
public void IssueOrders(Order[] orders)
|
||||||
@@ -111,10 +111,10 @@ namespace OpenRA.Network
|
|||||||
localOrders.Add(order);
|
localOrders.Add(order);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Action<string, Color, string, Color> AddChatLine = (n, nc, s, tc) => { };
|
public Action<TextNotification> AddTextNotification = (notification) => { };
|
||||||
void CacheChatLine(string name, Color nameColor, string text, Color textColor)
|
void CacheTextNotification(TextNotification notification)
|
||||||
{
|
{
|
||||||
chatCache.Add(new ChatLine(name, nameColor, text, textColor));
|
notificationsCache.Add(notification);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TickImmediate()
|
public void TickImmediate()
|
||||||
@@ -242,20 +242,4 @@ namespace OpenRA.Network
|
|||||||
Connection?.Dispose();
|
Connection?.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ChatLine
|
|
||||||
{
|
|
||||||
public readonly Color Color;
|
|
||||||
public readonly string Name;
|
|
||||||
public readonly string Text;
|
|
||||||
public readonly Color TextColor;
|
|
||||||
|
|
||||||
public ChatLine(string name, Color nameColor, string text, Color textColor)
|
|
||||||
{
|
|
||||||
Color = nameColor;
|
|
||||||
Name = name;
|
|
||||||
Text = text;
|
|
||||||
TextColor = textColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ namespace OpenRA.Network
|
|||||||
if (orderManager.LocalClient != null && client != orderManager.LocalClient && client.Team > 0 && client.Team == orderManager.LocalClient.Team)
|
if (orderManager.LocalClient != null && client != orderManager.LocalClient && client.Team > 0 && client.Team == orderManager.LocalClient.Team)
|
||||||
suffix += " (Ally)";
|
suffix += " (Ally)";
|
||||||
|
|
||||||
TextNotificationsManager.AddChatLine(client.Name + suffix, client.Color, message);
|
TextNotificationsManager.AddChatLine(client.Name + suffix, message, client.Color);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ namespace OpenRA.Network
|
|||||||
{
|
{
|
||||||
var prefix = order.ExtraData == uint.MaxValue ? "[Spectators] " : "[Team] ";
|
var prefix = order.ExtraData == uint.MaxValue ? "[Spectators] " : "[Team] ";
|
||||||
if (orderManager.LocalClient != null && client.Team == orderManager.LocalClient.Team)
|
if (orderManager.LocalClient != null && client.Team == orderManager.LocalClient.Team)
|
||||||
TextNotificationsManager.AddChatLine(prefix + client.Name, client.Color, message);
|
TextNotificationsManager.AddChatLine(prefix + client.Name, message, client.Color);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -93,7 +93,7 @@ namespace OpenRA.Network
|
|||||||
{
|
{
|
||||||
// Validate before adding the line
|
// Validate before adding the line
|
||||||
if (client.IsObserver || (player != null && player.WinState != WinState.Undefined))
|
if (client.IsObserver || (player != null && player.WinState != WinState.Undefined))
|
||||||
TextNotificationsManager.AddChatLine("[Spectators] " + client.Name, client.Color, message);
|
TextNotificationsManager.AddChatLine("[Spectators] " + client.Name, message, client.Color);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -103,7 +103,7 @@ namespace OpenRA.Network
|
|||||||
&& world.LocalPlayer != null && world.LocalPlayer.WinState == WinState.Undefined;
|
&& world.LocalPlayer != null && world.LocalPlayer.WinState == WinState.Undefined;
|
||||||
|
|
||||||
if (valid && (isSameTeam || world.IsReplay))
|
if (valid && (isSameTeam || world.IsReplay))
|
||||||
TextNotificationsManager.AddChatLine("[Team" + (world.IsReplay ? " " + order.ExtraData : "") + "] " + client.Name, client.Color, message);
|
TextNotificationsManager.AddChatLine("[Team" + (world.IsReplay ? " " + order.ExtraData : "") + "] " + client.Name, message, client.Color);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,12 @@ namespace OpenRA
|
|||||||
Incompatible = 16
|
Incompatible = 16
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum TextNotificationPoolFilters
|
||||||
|
{
|
||||||
|
None = 0
|
||||||
|
}
|
||||||
|
|
||||||
public enum WorldViewport { Native, Close, Medium, Far }
|
public enum WorldViewport { Native, Close, Medium, Far }
|
||||||
|
|
||||||
public class ServerSettings
|
public class ServerSettings
|
||||||
@@ -265,6 +271,8 @@ namespace OpenRA
|
|||||||
|
|
||||||
[Desc("Allow mods to enable the Discord service that can interact with a local Discord client.")]
|
[Desc("Allow mods to enable the Discord service that can interact with a local Discord client.")]
|
||||||
public bool EnableDiscordService = true;
|
public bool EnableDiscordService = true;
|
||||||
|
|
||||||
|
public TextNotificationPoolFilters TextNotificationPoolFilters = TextNotificationPoolFilters.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Settings
|
public class Settings
|
||||||
|
|||||||
56
OpenRA.Game/TextNotification.cs
Normal file
56
OpenRA.Game/TextNotification.cs
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2021 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, either version 3 of
|
||||||
|
* the License, or (at your option) any later version. For more
|
||||||
|
* information, see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using OpenRA.Primitives;
|
||||||
|
|
||||||
|
namespace OpenRA
|
||||||
|
{
|
||||||
|
public enum TextNotificationPool { System, Chat, Mission, Feedback }
|
||||||
|
|
||||||
|
public class TextNotification : IEquatable<TextNotification>
|
||||||
|
{
|
||||||
|
public readonly TextNotificationPool Pool;
|
||||||
|
public readonly string Prefix;
|
||||||
|
public readonly string Text;
|
||||||
|
public readonly Color PrefixColor;
|
||||||
|
public readonly Color TextColor;
|
||||||
|
|
||||||
|
public TextNotification(TextNotificationPool pool, string prefix, string text, Color prefixColor, Color textColor)
|
||||||
|
{
|
||||||
|
Pool = pool;
|
||||||
|
Prefix = prefix;
|
||||||
|
Text = text;
|
||||||
|
PrefixColor = prefixColor;
|
||||||
|
TextColor = textColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool CanIncrementOnDuplicate()
|
||||||
|
{
|
||||||
|
return Pool == TextNotificationPool.Feedback || Pool == TextNotificationPool.System;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Equals(TextNotification other)
|
||||||
|
{
|
||||||
|
return other != null && other.GetHashCode() == GetHashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
return obj is TextNotification && Equals((TextNotification)obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return string.Format("{0}{1}{2}", Prefix, Text, Pool).GetHashCode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,24 +28,43 @@ namespace OpenRA
|
|||||||
systemMessageLabel = "Battlefield Control";
|
systemMessageLabel = "Battlefield Control";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void AddFeedbackLine(string text)
|
||||||
|
{
|
||||||
|
AddTextNotification(TextNotificationPool.Feedback, systemMessageLabel, text, systemMessageColor, systemMessageColor);
|
||||||
|
}
|
||||||
|
|
||||||
public static void AddSystemLine(string text)
|
public static void AddSystemLine(string text)
|
||||||
{
|
{
|
||||||
AddSystemLine(systemMessageLabel, text);
|
AddSystemLine(systemMessageLabel, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AddSystemLine(string name, string text)
|
public static void AddSystemLine(string prefix, string text)
|
||||||
{
|
{
|
||||||
Game.OrderManager.AddChatLine(name, systemMessageColor, text, systemMessageColor);
|
AddTextNotification(TextNotificationPool.System, prefix, text, systemMessageColor, systemMessageColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AddChatLine(string name, Color nameColor, string text)
|
public static void AddChatLine(string prefix, string text, Color? prefixColor = null, Color? textColor = null)
|
||||||
{
|
{
|
||||||
Game.OrderManager.AddChatLine(name, nameColor, text, chatMessageColor);
|
AddTextNotification(TextNotificationPool.Chat, prefix, text, prefixColor, textColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Debug(string s, params object[] args)
|
public static void Debug(string s, params object[] args)
|
||||||
{
|
{
|
||||||
AddSystemLine("Debug", string.Format(s, args));
|
AddSystemLine("Debug", string.Format(s, args));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void AddTextNotification(TextNotificationPool pool, string prefix, string text, Color? prefixColor = null, Color? textColor = null)
|
||||||
|
{
|
||||||
|
if (IsPoolEnabled(pool))
|
||||||
|
Game.OrderManager.AddTextNotification(new TextNotification(pool, prefix, text, prefixColor ?? chatMessageColor, textColor ?? chatMessageColor));
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool IsPoolEnabled(TextNotificationPool pool)
|
||||||
|
{
|
||||||
|
return pool == TextNotificationPool.Chat ||
|
||||||
|
pool == TextNotificationPool.System ||
|
||||||
|
pool == TextNotificationPool.Mission ||
|
||||||
|
pool == TextNotificationPool.Feedback;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ namespace OpenRA.Mods.Common.Scripting
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
var c = color.HasValue ? color.Value : Color.White;
|
var c = color.HasValue ? color.Value : Color.White;
|
||||||
TextNotificationsManager.AddChatLine(prefix, c, text);
|
TextNotificationsManager.AddChatLine(prefix, text, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Desc("Display a system message to the player. If 'prefix' is nil the default system prefix is used.")]
|
[Desc("Display a system message to the player. If 'prefix' is nil the default system prefix is used.")]
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
public readonly int Space = 4;
|
public readonly int Space = 4;
|
||||||
|
|
||||||
const int LogLength = 9;
|
const int LogLength = 9;
|
||||||
List<ChatLine> recentLines = new List<ChatLine>();
|
List<TextNotification> recentLines = new List<TextNotification>();
|
||||||
|
List<int> lineExpirations = new List<int>();
|
||||||
|
|
||||||
public override Rectangle EventBounds => Rectangle.Empty;
|
public override Rectangle EventBounds => Rectangle.Empty;
|
||||||
|
|
||||||
@@ -47,9 +48,9 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
var inset = 0;
|
var inset = 0;
|
||||||
string name = null;
|
string name = null;
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(line.Name))
|
if (!string.IsNullOrEmpty(line.Prefix))
|
||||||
{
|
{
|
||||||
name = line.Name + ":";
|
name = line.Prefix + ":";
|
||||||
inset = font.Measure(name).X + 5;
|
inset = font.Measure(name).X + 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,12 +77,12 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
|
|
||||||
if (UseContrast)
|
if (UseContrast)
|
||||||
font.DrawTextWithContrast(name, namePos,
|
font.DrawTextWithContrast(name, namePos,
|
||||||
line.NameColor, BackgroundColorDark, BackgroundColorLight, 1);
|
line.PrefixColor, BackgroundColorDark, BackgroundColorLight, 1);
|
||||||
else if (UseShadow)
|
else if (UseShadow)
|
||||||
font.DrawTextWithShadow(name, namePos,
|
font.DrawTextWithShadow(name, namePos,
|
||||||
line.NameColor, BackgroundColorDark, BackgroundColorLight, 1);
|
line.PrefixColor, BackgroundColorDark, BackgroundColorLight, 1);
|
||||||
else
|
else
|
||||||
font.DrawText(name, namePos, line.NameColor);
|
font.DrawText(name, namePos, line.PrefixColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UseContrast)
|
if (UseContrast)
|
||||||
@@ -99,21 +100,34 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
Game.Renderer.DisableScissor();
|
Game.Renderer.DisableScissor();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddLine(string name, Color nameColor, string text, Color textColor)
|
public void AddLine(TextNotification chatLine)
|
||||||
{
|
{
|
||||||
recentLines.Add(new ChatLine(name, nameColor, text, textColor, Game.LocalTick + RemoveTime));
|
recentLines.Add(chatLine);
|
||||||
|
lineExpirations.Add(Game.LocalTick + RemoveTime);
|
||||||
|
|
||||||
if (Notification != null)
|
if (Notification != null)
|
||||||
Game.Sound.Play(SoundType.UI, Notification);
|
Game.Sound.Play(SoundType.UI, Notification);
|
||||||
|
|
||||||
while (recentLines.Count > LogLength)
|
while (recentLines.Count > LogLength)
|
||||||
recentLines.RemoveAt(0);
|
RemoveLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveMostRecentLine()
|
||||||
|
{
|
||||||
|
if (recentLines.Count == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
recentLines.RemoveAt(recentLines.Count - 1);
|
||||||
|
lineExpirations.RemoveAt(lineExpirations.Count - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveLine()
|
public void RemoveLine()
|
||||||
{
|
{
|
||||||
if (recentLines.Count > 0)
|
if (recentLines.Count == 0)
|
||||||
recentLines.RemoveAt(0);
|
return;
|
||||||
|
|
||||||
|
recentLines.RemoveAt(0);
|
||||||
|
lineExpirations.RemoveAt(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Tick()
|
public override void Tick()
|
||||||
@@ -122,25 +136,8 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// This takes advantage of the fact that recentLines is ordered by expiration, from sooner to later
|
// This takes advantage of the fact that recentLines is ordered by expiration, from sooner to later
|
||||||
while (recentLines.Count > 0 && Game.LocalTick >= recentLines[0].Expiration)
|
while (recentLines.Count > 0 && Game.LocalTick >= lineExpirations[0])
|
||||||
recentLines.RemoveAt(0);
|
RemoveLine();
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ChatLine
|
|
||||||
{
|
|
||||||
public readonly Color NameColor;
|
|
||||||
public readonly Color TextColor;
|
|
||||||
public readonly string Name, Text;
|
|
||||||
public readonly int Expiration;
|
|
||||||
|
|
||||||
public ChatLine(string name, Color nameColor, string text, Color textColor, int expiration)
|
|
||||||
{
|
|
||||||
Name = name;
|
|
||||||
Text = text;
|
|
||||||
Expiration = expiration;
|
|
||||||
NameColor = nameColor;
|
|
||||||
TextColor = textColor;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
|
|
||||||
readonly string chatLineSound = ChromeMetrics.Get<string>("ChatLineSound");
|
readonly string chatLineSound = ChromeMetrics.Get<string>("ChatLineSound");
|
||||||
|
|
||||||
|
TextNotification lastLine;
|
||||||
|
int repetitions;
|
||||||
|
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public IngameChatLogic(Widget widget, OrderManager orderManager, World world, ModData modData, bool isMenuChat, Dictionary<string, MiniYaml> logicArgs)
|
public IngameChatLogic(Widget widget, OrderManager orderManager, World world, ModData modData, bool isMenuChat, Dictionary<string, MiniYaml> logicArgs)
|
||||||
{
|
{
|
||||||
@@ -195,10 +198,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
chatScrollPanel.RemoveChildren();
|
chatScrollPanel.RemoveChildren();
|
||||||
chatScrollPanel.ScrollToBottom();
|
chatScrollPanel.ScrollToBottom();
|
||||||
|
|
||||||
foreach (var chatLine in orderManager.ChatCache)
|
foreach (var chatLine in orderManager.NotificationsCache)
|
||||||
AddChatLine(chatLine.Name, chatLine.Color, chatLine.Text, chatLine.TextColor, true);
|
AddChatLine(chatLine, true);
|
||||||
|
|
||||||
orderManager.AddChatLine += AddChatLineWrapper;
|
orderManager.AddTextNotification += AddChatLineWrapper;
|
||||||
|
|
||||||
chatText.IsDisabled = () => world.IsReplay && !Game.Settings.Debug.EnableDebugCommandsInReplays;
|
chatText.IsDisabled = () => world.IsReplay && !Game.Settings.Debug.EnableDebugCommandsInReplays;
|
||||||
|
|
||||||
@@ -245,38 +248,58 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
Ui.ResetTooltips();
|
Ui.ResetTooltips();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddChatLineWrapper(string name, Color nameColor, string text, Color textColor)
|
public void AddChatLineWrapper(TextNotification chatLine)
|
||||||
{
|
{
|
||||||
chatOverlayDisplay?.AddLine(name, nameColor, text, textColor);
|
var chatLineToDisplay = chatLine;
|
||||||
|
|
||||||
|
if (chatLine.CanIncrementOnDuplicate() && chatLine.Equals(lastLine))
|
||||||
|
{
|
||||||
|
repetitions++;
|
||||||
|
chatLineToDisplay = new TextNotification(
|
||||||
|
chatLine.Pool,
|
||||||
|
chatLine.Prefix,
|
||||||
|
$"{chatLine.Text} ({repetitions + 1})",
|
||||||
|
chatLine.PrefixColor,
|
||||||
|
chatLine.TextColor);
|
||||||
|
|
||||||
|
chatScrollPanel.RemoveChild(chatScrollPanel.Children[chatScrollPanel.Children.Count - 1]);
|
||||||
|
chatOverlayDisplay?.RemoveMostRecentLine();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
repetitions = 0;
|
||||||
|
|
||||||
|
lastLine = chatLine;
|
||||||
|
|
||||||
|
chatOverlayDisplay?.AddLine(chatLineToDisplay);
|
||||||
|
|
||||||
// HACK: Force disable the chat notification sound for the in-menu chat dialog
|
// HACK: Force disable the chat notification sound for the in-menu chat dialog
|
||||||
// This works around our inability to disable the sounds for the in-game dialog when it is hidden
|
// This works around our inability to disable the sounds for the in-game dialog when it is hidden
|
||||||
AddChatLine(name, nameColor, text, textColor, chatOverlay == null);
|
AddChatLine(chatLineToDisplay, chatOverlay == null);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddChatLine(string @from, Color nameColor, string text, Color textColor, bool suppressSound)
|
void AddChatLine(TextNotification chatLine, bool suppressSound)
|
||||||
{
|
{
|
||||||
var template = chatTemplate.Clone();
|
var template = chatTemplate.Clone();
|
||||||
var nameLabel = template.Get<LabelWidget>("NAME");
|
var nameLabel = template.Get<LabelWidget>("NAME");
|
||||||
var textLabel = template.Get<LabelWidget>("TEXT");
|
var textLabel = template.Get<LabelWidget>("TEXT");
|
||||||
|
|
||||||
var name = "";
|
var name = "";
|
||||||
if (!string.IsNullOrEmpty(from))
|
if (!string.IsNullOrEmpty(chatLine.Prefix))
|
||||||
name = from + ":";
|
name = chatLine.Prefix + ":";
|
||||||
|
|
||||||
var font = Game.Renderer.Fonts[nameLabel.Font];
|
var font = Game.Renderer.Fonts[nameLabel.Font];
|
||||||
var nameSize = font.Measure(from);
|
var nameSize = font.Measure(chatLine.Prefix);
|
||||||
|
|
||||||
nameLabel.GetColor = () => nameColor;
|
nameLabel.GetColor = () => chatLine.PrefixColor;
|
||||||
nameLabel.GetText = () => name;
|
nameLabel.GetText = () => name;
|
||||||
nameLabel.Bounds.Width = nameSize.X;
|
nameLabel.Bounds.Width = nameSize.X;
|
||||||
|
|
||||||
textLabel.GetColor = () => textColor;
|
textLabel.GetColor = () => chatLine.TextColor;
|
||||||
textLabel.Bounds.X += nameSize.X;
|
textLabel.Bounds.X += nameSize.X;
|
||||||
textLabel.Bounds.Width -= nameSize.X;
|
textLabel.Bounds.Width -= nameSize.X;
|
||||||
|
|
||||||
// Hack around our hacky wordwrap behavior: need to resize the widget to fit the text
|
// Hack around our hacky wordwrap behavior: need to resize the widget to fit the text
|
||||||
text = WidgetUtils.WrapText(text, textLabel.Bounds.Width, font);
|
var text = WidgetUtils.WrapText(chatLine.Text, textLabel.Bounds.Width, font);
|
||||||
textLabel.GetText = () => text;
|
textLabel.GetText = () => text;
|
||||||
var dh = font.Measure(text).Y - textLabel.Bounds.Height;
|
var dh = font.Measure(text).Y - textLabel.Bounds.Height;
|
||||||
if (dh > 0)
|
if (dh > 0)
|
||||||
@@ -299,7 +322,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
{
|
{
|
||||||
if (!disposed)
|
if (!disposed)
|
||||||
{
|
{
|
||||||
orderManager.AddChatLine -= AddChatLineWrapper;
|
orderManager.AddTextNotification -= AddChatLineWrapper;
|
||||||
disposed = true;
|
disposed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
|
|
||||||
services = modData.Manifest.Get<WebServices>();
|
services = modData.Manifest.Get<WebServices>();
|
||||||
|
|
||||||
orderManager.AddChatLine += AddChatLine;
|
orderManager.AddTextNotification += AddChatLine;
|
||||||
Game.LobbyInfoChanged += UpdateCurrentMap;
|
Game.LobbyInfoChanged += UpdateCurrentMap;
|
||||||
Game.LobbyInfoChanged += UpdatePlayerList;
|
Game.LobbyInfoChanged += UpdatePlayerList;
|
||||||
Game.LobbyInfoChanged += UpdateDiscordStatus;
|
Game.LobbyInfoChanged += UpdateDiscordStatus;
|
||||||
@@ -466,7 +466,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
if (disposing && !disposed)
|
if (disposing && !disposed)
|
||||||
{
|
{
|
||||||
disposed = true;
|
disposed = true;
|
||||||
orderManager.AddChatLine -= AddChatLine;
|
orderManager.AddTextNotification -= AddChatLine;
|
||||||
Game.LobbyInfoChanged -= UpdateCurrentMap;
|
Game.LobbyInfoChanged -= UpdateCurrentMap;
|
||||||
Game.LobbyInfoChanged -= UpdatePlayerList;
|
Game.LobbyInfoChanged -= UpdatePlayerList;
|
||||||
Game.LobbyInfoChanged -= UpdateDiscordStatus;
|
Game.LobbyInfoChanged -= UpdateDiscordStatus;
|
||||||
@@ -489,10 +489,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
panel = PanelType.Players;
|
panel = PanelType.Players;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddChatLine(string name, Color nameColor, string text, Color textColor)
|
void AddChatLine(TextNotification chatLine)
|
||||||
{
|
{
|
||||||
var template = (ContainerWidget)chatTemplate.Clone();
|
var template = (ContainerWidget)chatTemplate.Clone();
|
||||||
LobbyUtils.SetupChatLine(template, DateTime.Now, name, nameColor, text, textColor);
|
LobbyUtils.SetupChatLine(template, DateTime.Now, chatLine);
|
||||||
|
|
||||||
var scrolledToBottom = lobbyChatPanel.ScrolledToBottom;
|
var scrolledToBottom = lobbyChatPanel.ScrolledToBottom;
|
||||||
lobbyChatPanel.AddChild(template);
|
lobbyChatPanel.AddChild(template);
|
||||||
|
|||||||
@@ -651,28 +651,28 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
HideChildWidget(parent, "STATUS_IMAGE");
|
HideChildWidget(parent, "STATUS_IMAGE");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetupChatLine(ContainerWidget template, DateTime time, string name, Color nameColor, string text, Color textColor)
|
public static void SetupChatLine(ContainerWidget template, DateTime time, TextNotification chatLine)
|
||||||
{
|
{
|
||||||
var nameLabel = template.Get<LabelWidget>("NAME");
|
var nameLabel = template.Get<LabelWidget>("NAME");
|
||||||
var timeLabel = template.Get<LabelWidget>("TIME");
|
var timeLabel = template.Get<LabelWidget>("TIME");
|
||||||
var textLabel = template.Get<LabelWidget>("TEXT");
|
var textLabel = template.Get<LabelWidget>("TEXT");
|
||||||
|
|
||||||
var nameText = name + ":";
|
var nameText = chatLine.Prefix + ":";
|
||||||
var font = Game.Renderer.Fonts[nameLabel.Font];
|
var font = Game.Renderer.Fonts[nameLabel.Font];
|
||||||
var nameSize = font.Measure(nameText);
|
var nameSize = font.Measure(nameText);
|
||||||
|
|
||||||
timeLabel.GetText = () => $"{time.Hour:D2}:{time.Minute:D2}";
|
timeLabel.GetText = () => $"{time.Hour:D2}:{time.Minute:D2}";
|
||||||
|
|
||||||
nameLabel.GetColor = () => nameColor;
|
nameLabel.GetColor = () => chatLine.PrefixColor;
|
||||||
nameLabel.GetText = () => nameText;
|
nameLabel.GetText = () => nameText;
|
||||||
nameLabel.Bounds.Width = nameSize.X;
|
nameLabel.Bounds.Width = nameSize.X;
|
||||||
|
|
||||||
textLabel.GetColor = () => textColor;
|
textLabel.GetColor = () => chatLine.TextColor;
|
||||||
textLabel.Bounds.X += nameSize.X;
|
textLabel.Bounds.X += nameSize.X;
|
||||||
textLabel.Bounds.Width -= nameSize.X;
|
textLabel.Bounds.Width -= nameSize.X;
|
||||||
|
|
||||||
// Hack around our hacky wordwrap behavior: need to resize the widget to fit the text
|
// Hack around our hacky wordwrap behavior: need to resize the widget to fit the text
|
||||||
text = WidgetUtils.WrapText(text, textLabel.Bounds.Width, font);
|
var text = WidgetUtils.WrapText(chatLine.Text, textLabel.Bounds.Width, font);
|
||||||
textLabel.GetText = () => text;
|
textLabel.GetText = () => text;
|
||||||
var dh = font.Measure(text).Y - textLabel.Bounds.Height;
|
var dh = font.Measure(text).Y - textLabel.Bounds.Height;
|
||||||
if (dh > 0)
|
if (dh > 0)
|
||||||
|
|||||||
@@ -248,12 +248,12 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
|
|
||||||
// Check if selecting actors on the screen has selected new units
|
// Check if selecting actors on the screen has selected new units
|
||||||
if (ownUnitsOnScreen.Count > World.Selection.Actors.Count())
|
if (ownUnitsOnScreen.Count > World.Selection.Actors.Count())
|
||||||
TextNotificationsManager.AddSystemLine("Selected across screen");
|
TextNotificationsManager.AddFeedbackLine("Selected across screen");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Select actors in the world that have highest selection priority
|
// Select actors in the world that have highest selection priority
|
||||||
ownUnitsOnScreen = SelectActorsInWorld(World, null, eligiblePlayers).SubsetWithHighestSelectionPriority(e.Modifiers).ToList();
|
ownUnitsOnScreen = SelectActorsInWorld(World, null, eligiblePlayers).SubsetWithHighestSelectionPriority(e.Modifiers).ToList();
|
||||||
TextNotificationsManager.AddSystemLine("Selected across map");
|
TextNotificationsManager.AddFeedbackLine("Selected across map");
|
||||||
}
|
}
|
||||||
|
|
||||||
World.Selection.Combine(World, ownUnitsOnScreen, false, false);
|
World.Selection.Combine(World, ownUnitsOnScreen, false, false);
|
||||||
@@ -280,12 +280,12 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
|
|
||||||
// Check if selecting actors on the screen has selected new units
|
// Check if selecting actors on the screen has selected new units
|
||||||
if (newSelection.Count > World.Selection.Actors.Count())
|
if (newSelection.Count > World.Selection.Actors.Count())
|
||||||
TextNotificationsManager.AddSystemLine("Selected across screen");
|
TextNotificationsManager.AddFeedbackLine("Selected across screen");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Select actors in the world that have the same selection class as one of the already selected actors
|
// Select actors in the world that have the same selection class as one of the already selected actors
|
||||||
newSelection = SelectActorsInWorld(World, selectedClasses, eligiblePlayers).ToList();
|
newSelection = SelectActorsInWorld(World, selectedClasses, eligiblePlayers).ToList();
|
||||||
TextNotificationsManager.AddSystemLine("Selected across map");
|
TextNotificationsManager.AddFeedbackLine("Selected across map");
|
||||||
}
|
}
|
||||||
|
|
||||||
World.Selection.Combine(World, newSelection, true, false);
|
World.Selection.Combine(World, newSelection, true, false);
|
||||||
|
|||||||
Reference in New Issue
Block a user