Files
OpenRA/OpenRA.Mods.Common/Widgets/Logic/LocalProfileLogic.cs

125 lines
4.5 KiB
C#

#region Copyright & License Information
/*
* Copyright (c) The OpenRA Developers and Contributors
* 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.Graphics;
using OpenRA.Widgets;
namespace OpenRA.Mods.Common.Widgets.Logic
{
public class LocalProfileLogic : ChromeLogic
{
readonly WorldRenderer worldRenderer;
readonly LocalPlayerProfile localProfile;
readonly Widget badgeContainer;
readonly Widget widget;
bool notFound;
bool badgesVisible;
[ObjectCreator.UseCtor]
public LocalProfileLogic(Widget widget, WorldRenderer worldRenderer, Func<bool> minimalProfile)
{
this.worldRenderer = worldRenderer;
this.widget = widget;
localProfile = Game.LocalPlayerProfile;
// Key registration
widget.Get("GENERATE_KEYS").IsVisible = () => localProfile.State == LocalPlayerProfile.LinkState.Uninitialized && !minimalProfile();
widget.Get("GENERATING_KEYS").IsVisible = () => localProfile.State == LocalPlayerProfile.LinkState.GeneratingKeys && !minimalProfile();
var lastProfileState = LocalPlayerProfile.LinkState.CheckingLink;
widget.Get("REGISTER_FINGERPRINT").IsVisible = () =>
{
// Take a copy of the state to avoid race conditions
var state = localProfile.State;
// Copy the key to the clipboard when displaying the link instructions
if (state != lastProfileState && state == LocalPlayerProfile.LinkState.Unlinked)
Game.SetClipboardText(localProfile.PublicKey);
lastProfileState = state;
return localProfile.State == LocalPlayerProfile.LinkState.Unlinked && !notFound && !minimalProfile();
};
widget.Get("CHECKING_FINGERPRINT").IsVisible = () => localProfile.State == LocalPlayerProfile.LinkState.CheckingLink && !minimalProfile();
widget.Get("FINGERPRINT_NOT_FOUND").IsVisible = () => localProfile.State == LocalPlayerProfile.LinkState.Unlinked && notFound && !minimalProfile();
widget.Get("CONNECTION_ERROR").IsVisible = () => localProfile.State == LocalPlayerProfile.LinkState.ConnectionFailed && !minimalProfile();
widget.Get<ButtonWidget>("GENERATE_KEY").OnClick = localProfile.GenerateKeypair;
widget.Get<ButtonWidget>("CHECK_KEY").OnClick = () => localProfile.RefreshPlayerData(() => RefreshComplete(true));
widget.Get<ButtonWidget>("DELETE_KEY").OnClick = () =>
{
localProfile.DeleteKeypair();
Game.RunAfterTick(Ui.ResetTooltips);
};
widget.Get<ButtonWidget>("FINGERPRINT_NOT_FOUND_CONTINUE").OnClick = () =>
{
notFound = false;
Game.RunAfterTick(Ui.ResetTooltips);
};
widget.Get<ButtonWidget>("CONNECTION_ERROR_RETRY").OnClick = () => localProfile.RefreshPlayerData(() => RefreshComplete(true));
// Profile view
widget.Get("PROFILE_HEADER").IsVisible = () => localProfile.State == LocalPlayerProfile.LinkState.Linked;
widget.Get<LabelWidget>("PROFILE_NAME").GetText = () => localProfile.ProfileData.ProfileName;
widget.Get<LabelWidget>("PROFILE_RANK").GetText = () => localProfile.ProfileData.ProfileRank;
var destroyKey = widget.Get<ButtonWidget>("DESTROY_KEY");
destroyKey.OnClick = localProfile.DeleteKeypair;
destroyKey.IsDisabled = minimalProfile;
badgeContainer = widget.Get("BADGES_CONTAINER");
badgeContainer.IsVisible = () => badgesVisible && !minimalProfile()
&& localProfile.State == LocalPlayerProfile.LinkState.Linked;
localProfile.RefreshPlayerData(() => RefreshComplete(false));
}
public void RefreshComplete(bool updateNotFound)
{
if (updateNotFound)
notFound = localProfile.State == LocalPlayerProfile.LinkState.Unlinked;
Game.RunAfterTick(() =>
{
badgesVisible = false;
if (localProfile.State == LocalPlayerProfile.LinkState.Linked && localProfile.ProfileData.Badges.Count > 0)
{
Func<int, int> negotiateWidth = _ => widget.Get("PROFILE_HEADER").Bounds.Width;
// Remove any stale badges that may be left over from a previous session
badgeContainer.RemoveChildren();
var badges = Ui.LoadWidget("PLAYER_PROFILE_BADGES_INSERT", badgeContainer, new WidgetArgs()
{
{ "worldRenderer", worldRenderer },
{ "profile", localProfile.ProfileData },
{ "negotiateWidth", negotiateWidth }
});
if (badges.Bounds.Height > 0)
{
badgeContainer.Bounds.Height = badges.Bounds.Height;
badgesVisible = true;
}
}
Ui.ResetTooltips();
});
}
}
}