From 3e09fb0d357e2a12c258b115dde29f77ba72886c Mon Sep 17 00:00:00 2001 From: Richard Leek Date: Fri, 18 Oct 2024 21:12:12 +0000 Subject: [PATCH] Modify guild description (#366) * Add InGuild ReadOnly property to ICharacterProvider * Add GuildEventNotifer and Subscriber * Add GuildReply handler * Add GuildTake handler * Add Dialog and Resource IDs * Provider MessageBoxFactory and GuildSessionProvider to dialog * Add Get/Set GuildDescription to GuildActions * Add GuildDescription to GuildSessionRepository * Add Modify guild state Looks up guild description Added modify description box that updates description * Make link underlined and remove `*` from start of line * cleanup * remove InGuild * Fix back action * formatting * Refactor from PR * Change list style to `Small` for modify state * Fix code formatting violations * Modify state transition mechanism to use well-named static instances of State class with more explicit default values --------- Co-authored-by: Ethan Moffat --- EOLib.Localization/DialogResourceID.cs | 3 +- EOLib.Localization/EOResourceID.cs | 3 + EOLib/Domain/Interact/Guild/GuildActions.cs | 27 ++ .../Interact/Guild/GuildSessionRepository.cs | 6 + EOLib/Domain/Notifiers/IGuildNotifier.cs | 2 + .../PacketHandlers/Guild/GuildReplyHandler.cs | 11 +- .../PacketHandlers/Guild/GuildTakeHandler.cs | 38 ++ .../Dialogs/Factories/GuildDialogFactory.cs | 31 +- EndlessClient/Dialogs/GuildDialog.cs | 427 +++++++++++------- EndlessClient/Dialogs/ScrollingListDialog.cs | 4 +- .../Subscribers/GuildEventSubscriber.cs | 10 + 11 files changed, 384 insertions(+), 178 deletions(-) create mode 100644 EOLib/PacketHandlers/Guild/GuildTakeHandler.cs diff --git a/EOLib.Localization/DialogResourceID.cs b/EOLib.Localization/DialogResourceID.cs index 8dcf8c2fd..c39c4a517 100644 --- a/EOLib.Localization/DialogResourceID.cs +++ b/EOLib.Localization/DialogResourceID.cs @@ -98,7 +98,8 @@ public enum DialogResourceID GUILD_MEMBER_HAS_BEEN_ACCEPTED = 174, GUILD_DOES_NOT_EXIST = 176, GUILD_YOU_HAVE_BEEN_ACCEPTED = 178, - GUILD_DETAILS_HAVE_BEEN_UPDATED = 180, + GUILD_ACCEPTED = 180, + GUILD_DETAILS_HAVE_BEEN_UPDATED = 181, GUILD_PROMPT_DISBAND_GUILD = 182, GUILD_REMOVE_MEMBER_WHO = 184, GUILD_REMOVE_PLAYER_NOT_MEMBER = 186, diff --git a/EOLib.Localization/EOResourceID.cs b/EOLib.Localization/EOResourceID.cs index 2adad81d9..a2f112fb2 100644 --- a/EOLib.Localization/EOResourceID.cs +++ b/EOLib.Localization/EOResourceID.cs @@ -195,10 +195,13 @@ public enum EOResourceID GUILD_REMOVE_A_MEMBER_FROM_GUILD = 203, GUILD_JOINING_A_GUILD_IS_FREE = 205, GUILD_PLEASE_CONSIDER_CAREFULLY = 207, + GUILD_DESCRIPTION = 219, GUILD_DO_YOU_ACCEPT = 223, GUILD_YOUR_ACCOUNT_WILL_BE_CHARGED = 225, GUILD_PLEASE_CONSIDER_CAREFULLY_RECRUIT = 226, GUILD_ASSIGN_RANK_TO_MEMBER = 233, + GUILD_CURRENT_DESCRIPTION = 234, + GUILD_CLICK_HERE_TO_CHANGE_THE_DESCRIPTION = 235, SETTING_KEYBOARD_ENGLISH = 253, SETTING_KEYBOARD_DUTCH = 254, diff --git a/EOLib/Domain/Interact/Guild/GuildActions.cs b/EOLib/Domain/Interact/Guild/GuildActions.cs index c1e43f1f3..ca1aeab8c 100644 --- a/EOLib/Domain/Interact/Guild/GuildActions.cs +++ b/EOLib/Domain/Interact/Guild/GuildActions.cs @@ -26,6 +26,29 @@ public void ViewMembers(string identity) { _packetSendService.SendPacket(new GuildTellClientPacket { SessionId = _guildSessionProvider.SessionID, GuildIdentity = identity }); } + + public void GetGuildDescription(string guildTag) + { + _packetSendService.SendPacket(new GuildTakeClientPacket + { + SessionId = _guildSessionProvider.SessionID, + InfoType = GuildInfoType.Description, + GuildTag = guildTag + }); + } + + public void SetGuildDescription(string description) + { + _packetSendService.SendPacket(new GuildAgreeClientPacket() + { + SessionId = _guildSessionProvider.SessionID, + InfoType = GuildInfoType.Description, + InfoTypeData = new GuildAgreeClientPacket.InfoTypeDataDescription() + { + Description = description + } + }); + } } public interface IGuildActions @@ -33,5 +56,9 @@ public interface IGuildActions void Lookup(string identity); void ViewMembers(string identity); + + void GetGuildDescription(string guildTag); + + void SetGuildDescription(string description); } } diff --git a/EOLib/Domain/Interact/Guild/GuildSessionRepository.cs b/EOLib/Domain/Interact/Guild/GuildSessionRepository.cs index bc4cfd76b..07fffd3d7 100644 --- a/EOLib/Domain/Interact/Guild/GuildSessionRepository.cs +++ b/EOLib/Domain/Interact/Guild/GuildSessionRepository.cs @@ -5,21 +5,27 @@ namespace EOLib.Domain.Interact.Guild public interface IGuildSessionProvider { int SessionID { get; } + + string GuildDescription { get; } } public interface IGuildSessionRepository { int SessionID { get; set; } + + string GuildDescription { get; set; } } [AutoMappedType(IsSingleton = true)] public class GuildSessionRepository : IGuildSessionRepository, IGuildSessionProvider { public int SessionID { get; set; } + public string GuildDescription { get; set; } public GuildSessionRepository() { SessionID = 0; + GuildDescription = ""; } } } diff --git a/EOLib/Domain/Notifiers/IGuildNotifier.cs b/EOLib/Domain/Notifiers/IGuildNotifier.cs index e4d4c054f..d0ee07bfc 100644 --- a/EOLib/Domain/Notifiers/IGuildNotifier.cs +++ b/EOLib/Domain/Notifiers/IGuildNotifier.cs @@ -6,6 +6,7 @@ public interface IGuildNotifier { void NotifyGuildCreationRequest(int creatorPlayerID, string guildIdentity); void NotifyRequestToJoinGuild(int playerId, string name); + void NotifyGuildDetailsUpdated(); } [AutoMappedType] @@ -13,5 +14,6 @@ public class NoOpGuildNotifier : IGuildNotifier { public void NotifyGuildCreationRequest(int creatorPlayerID, string guildIdentity) { } public void NotifyRequestToJoinGuild(int playerId, string name) { } + public void NotifyGuildDetailsUpdated() { } } } diff --git a/EOLib/PacketHandlers/Guild/GuildReplyHandler.cs b/EOLib/PacketHandlers/Guild/GuildReplyHandler.cs index 010addc02..29f627035 100644 --- a/EOLib/PacketHandlers/Guild/GuildReplyHandler.cs +++ b/EOLib/PacketHandlers/Guild/GuildReplyHandler.cs @@ -9,7 +9,6 @@ namespace EOLib.PacketHandlers.Guild { [AutoMappedType] - public class GuildReplyHandler : InGameOnlyPacketHandler { private readonly IEnumerable _guildNotifiers; @@ -19,7 +18,7 @@ public class GuildReplyHandler : InGameOnlyPacketHandler public override PacketAction Action => PacketAction.Reply; public GuildReplyHandler(IPlayerInfoProvider playerInfoProvider, - IEnumerable guildNotifiers) + IEnumerable guildNotifiers) : base(playerInfoProvider) { _guildNotifiers = guildNotifiers; @@ -30,9 +29,13 @@ public override bool HandlePacket(GuildReplyServerPacket packet) switch (packet.ReplyCode) { case GuildReply.JoinRequest: - var data = (GuildReplyServerPacket.ReplyCodeDataJoinRequest)(packet.ReplyCodeData); + var joinRequestData = (GuildReplyServerPacket.ReplyCodeDataJoinRequest)(packet.ReplyCodeData); + foreach (var notifier in _guildNotifiers) + notifier.NotifyRequestToJoinGuild(joinRequestData.PlayerId, joinRequestData.Name); + break; + case GuildReply.Updated: foreach (var notifier in _guildNotifiers) - notifier.NotifyRequestToJoinGuild(data.PlayerId, data.Name); + notifier.NotifyGuildDetailsUpdated(); break; } diff --git a/EOLib/PacketHandlers/Guild/GuildTakeHandler.cs b/EOLib/PacketHandlers/Guild/GuildTakeHandler.cs new file mode 100644 index 000000000..a9fc86f82 --- /dev/null +++ b/EOLib/PacketHandlers/Guild/GuildTakeHandler.cs @@ -0,0 +1,38 @@ +using AutomaticTypeMapper; +using EOLib.Domain.Interact; +using EOLib.Domain.Interact.Guild; +using EOLib.Domain.Login; +using EOLib.Domain.Map; +using EOLib.Net.Handlers; +using Moffat.EndlessOnline.SDK.Protocol.Net; +using Moffat.EndlessOnline.SDK.Protocol.Net.Server; +using Optional; +using System.Collections.Generic; + +namespace EOLib.PacketHandlers.Guild +{ + [AutoMappedType] + + public class GuildTakeHandler : InGameOnlyPacketHandler + { + private readonly IGuildSessionRepository _guildSessionRepository; + + public override PacketFamily Family => PacketFamily.Guild; + + public override PacketAction Action => PacketAction.Take; + + public GuildTakeHandler(IPlayerInfoProvider playerInfoProvider, + IGuildSessionRepository guildSessionRepository) + : base(playerInfoProvider) + { + _guildSessionRepository = guildSessionRepository; + } + + public override bool HandlePacket(GuildTakeServerPacket packet) + { + _guildSessionRepository.GuildDescription = packet.Description; + + return true; + } + } +} diff --git a/EndlessClient/Dialogs/Factories/GuildDialogFactory.cs b/EndlessClient/Dialogs/Factories/GuildDialogFactory.cs index a01d47c04..943713532 100644 --- a/EndlessClient/Dialogs/Factories/GuildDialogFactory.cs +++ b/EndlessClient/Dialogs/Factories/GuildDialogFactory.cs @@ -1,6 +1,8 @@ using AutomaticTypeMapper; +using EndlessClient.Content; using EndlessClient.Dialogs.Services; using EOLib.Domain.Character; +using EOLib.Domain.Interact.Guild; using EOLib.Graphics; using EOLib.Localization; @@ -15,13 +17,21 @@ public class GuildDialogFactory : IGuildDialogFactory private readonly ILocalizedStringFinder _localizedStringFinder; private readonly ICharacterProvider _characterProvider; private readonly IEOMessageBoxFactory _messageBoxFactory; + private readonly IGuildSessionProvider _guildSessionProvider; + private readonly IGuildActions _guildActions; + private readonly ITextInputDialogFactory _textInputDialogFactory; + private readonly IContentProvider _contentProvider; public GuildDialogFactory(INativeGraphicsManager nativeGraphicsManager, IEODialogButtonService dialogButtonService, IEODialogIconService dialogIconService, ILocalizedStringFinder localizedStringFinder, ICharacterProvider characterProvider, - IEOMessageBoxFactory messageBoxFactory) + IEOMessageBoxFactory messageBoxFactory, + IGuildSessionProvider guildSessionProvider, + IGuildActions guildActions, + ITextInputDialogFactory textInputDialogFactory, + IContentProvider contentProvider) { _nativeGraphicsManager = nativeGraphicsManager; _dialogButtonService = dialogButtonService; @@ -29,17 +39,24 @@ public GuildDialogFactory(INativeGraphicsManager nativeGraphicsManager, _localizedStringFinder = localizedStringFinder; _characterProvider = characterProvider; _messageBoxFactory = messageBoxFactory; + _guildSessionProvider = guildSessionProvider; + _guildActions = guildActions; + _textInputDialogFactory = textInputDialogFactory; + _contentProvider = contentProvider; } public GuildDialog Create() { return new GuildDialog(_nativeGraphicsManager, - _dialogButtonService, - _dialogIconService, - _localizedStringFinder, - _characterProvider, - _messageBoxFactory - ); + _dialogButtonService, + _dialogIconService, + _localizedStringFinder, + _characterProvider, + _messageBoxFactory, + _guildSessionProvider, + _guildActions, + _textInputDialogFactory, + _contentProvider); } } diff --git a/EndlessClient/Dialogs/GuildDialog.cs b/EndlessClient/Dialogs/GuildDialog.cs index 9d835d349..76e441834 100644 --- a/EndlessClient/Dialogs/GuildDialog.cs +++ b/EndlessClient/Dialogs/GuildDialog.cs @@ -1,12 +1,17 @@ -using EndlessClient.Content; +using System; +using System.Collections.Generic; +using System.Linq; +using EndlessClient.Content; using EndlessClient.Dialogs.Factories; using EndlessClient.Dialogs.Services; +using EOLib; using EOLib.Domain.Character; using EOLib.Domain.Interact.Guild; -using EOLib.Domain.Map; using EOLib.Graphics; -using EOLib.IO.Repositories; using EOLib.Localization; +using Microsoft.Xna.Framework; +using Optional; +using XNAControls; namespace EndlessClient.Dialogs { @@ -14,7 +19,6 @@ public class GuildDialog : ScrollingListDialog { private enum GuildDialogState { - // initial menu Initial, Management, Modify, @@ -22,203 +26,282 @@ private enum GuildDialogState AssignRank, RemoveMember, Disband, + } + + private class State + { + public GuildDialogState DialogState { get; } + public ListDialogItem.ListItemStyle ListItemStyle { get; } = ListDialogItem.ListItemStyle.Large; + public ScrollingListDialogButtons Buttons { get; } = ScrollingListDialogButtons.BackCancel; + + public static State Initial => new(GuildDialogState.Initial); + + public static State Management => new(GuildDialogState.Management); + + public static State Modify => new(GuildDialogState.Modify); + + public static State ManageRankings => new(GuildDialogState.ManageRankings); + + public static State AssignRank => new(GuildDialogState.AssignRank); + + public static State RemoveMember => new(GuildDialogState.RemoveMember); + + public static State Disband => new(GuildDialogState.Disband); + + private State(GuildDialogState dialogState) + { + DialogState = dialogState; + switch (dialogState) + { + case GuildDialogState.Initial: + Buttons = ScrollingListDialogButtons.Cancel; + break; + case GuildDialogState.Modify: + ListItemStyle = ListDialogItem.ListItemStyle.Small; + break; + } + } + + public override bool Equals(object obj) + { + return obj is State st && st.DialogState == DialogState; + } + + public override int GetHashCode() + { + return DialogState.GetHashCode(); + } + public override string ToString() => $"{DialogState}"; } + private readonly IReadOnlyDictionary _stateTransitions; + private readonly IEODialogIconService _dialogIconService; private readonly ILocalizedStringFinder _localizedStringFinder; private readonly ICharacterProvider _characterProvider; private readonly IEOMessageBoxFactory _messageBoxFactory; + private readonly IGuildSessionProvider _guildSessionProvider; + private readonly IGuildActions _guildActions; + private readonly ITextInputDialogFactory _textInputDialogFactory; + private readonly IContentProvider _contentProvider; + private readonly Stack _stateStack; - private GuildDialogState _state; + private State _state; + private Option _modifyGuildDescriptionListItem; public GuildDialog(INativeGraphicsManager nativeGraphicsManager, - IEODialogButtonService dialogButtonService, - IEODialogIconService dialogIconService, - ILocalizedStringFinder localizedStringFinder, - ICharacterProvider characterProvider, - IEOMessageBoxFactory messageBoxFactory) + IEODialogButtonService dialogButtonService, + IEODialogIconService dialogIconService, + ILocalizedStringFinder localizedStringFinder, + ICharacterProvider characterProvider, + IEOMessageBoxFactory messageBoxFactory, + IGuildSessionProvider guildSessionProvider, + IGuildActions guildActions, + ITextInputDialogFactory textInputDialogFactory, + IContentProvider contentProvider) : base(nativeGraphicsManager, dialogButtonService, DialogType.Guild) { _dialogIconService = dialogIconService; _localizedStringFinder = localizedStringFinder; _characterProvider = characterProvider; _messageBoxFactory = messageBoxFactory; + _guildSessionProvider = guildSessionProvider; + _guildActions = guildActions; + _textInputDialogFactory = textInputDialogFactory; + _contentProvider = contentProvider; - SetState(GuildDialogState.Initial); + _stateStack = new Stack(); + _modifyGuildDescriptionListItem = Option.None(); - BackAction += (_, _) => + _stateTransitions = new Dictionary { - switch (_state) - { - case GuildDialogState.Management: - SetState(GuildDialogState.Initial); - break; - default: - // no-op - break; - } + { State.Initial, SetupInitialState }, + { State.Management, SetupManagementState }, + { State.Modify, SetupModifyState }, + { State.ManageRankings, () => { } }, + { State.AssignRank, () => { } }, + { State.RemoveMember, () => { } }, + { State.Disband, () => { } }, }; + SetState(State.Initial); + + BackAction += BackButton_Click; + Title = _localizedStringFinder.GetString(EOResourceID.GUILD_GUILD_MASTER); } - private void SetState(GuildDialogState state) + protected override void OnUpdateControl(GameTime gameTime) { - if (state != GuildDialogState.Initial && _state == state) - return; + if (_state.DialogState == GuildDialogState.Modify) + { + _modifyGuildDescriptionListItem.MatchSome(item => + { + if (item.PrimaryText != _guildSessionProvider.GuildDescription) + { + item.PrimaryText = _guildSessionProvider.GuildDescription; + } + }); + } + + base.OnUpdateControl(gameTime); + } - _state = state; + private void BackButton_Click(object sender, EventArgs e) => GoBack(); + private void GoBack() + { + _modifyGuildDescriptionListItem = Option.None(); + SetState(_stateStack.Count > 0 ? _stateStack.Pop() : State.Initial, pushState: false); + } + + private void SetState(State newState, bool pushState = true) + { ClearItemList(); + if (pushState && _state != newState && _state != null) + { + _stateStack.Push(_state); + } + + _state = newState; - switch (_state) + ListItemType = _state.ListItemStyle; + Buttons = _state.Buttons; + + _stateTransitions[_state].Invoke(); + } + + private void SetupInitialState() + { + var informationItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) { - case GuildDialogState.Initial: - { - ListItemType = ListDialogItem.ListItemStyle.Large; - Buttons = ScrollingListDialogButtons.Cancel; + ShowIconBackGround = false, + IconGraphic = _dialogIconService.IconSheet, + IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildInformation), + PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_INFORMATION), + SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_LEARN_MORE), + OffsetY = 45, + }; - var informationItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) - { - ShowIconBackGround = false, - IconGraphic = _dialogIconService.IconSheet, - IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildInformation), - PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_INFORMATION), - SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_LEARN_MORE), - OffsetY = 45, - }; - //registrationItem.LeftClick += (_, _) => SetState(GuildDialogState.Registration); - //registrationItem.RightClick += (_, _) => SetState(GuildDialogState.Registration); - - AddItemToList(informationItem, sortList: false); - - var administrationItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 1) - { - ShowIconBackGround = false, - IconGraphic = _dialogIconService.IconSheet, - IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildAdministration), - PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_ADMINISTRATION), - SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_JOIN_LEAVE_REGISTER), - OffsetY = 45, - }; - //registrationItem.LeftClick += (_, _) => SetState(GuildDialogState.Registration); - //registrationItem.RightClick += (_, _) => SetState(GuildDialogState.Registration); - - AddItemToList(administrationItem, sortList: false); - - var managementItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 2) - { - ShowIconBackGround = false, - IconGraphic = _dialogIconService.IconSheet, - IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildManagement), - PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_MANAGEMENT), - SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_MODIFY_RANKING_DISBAND), - OffsetY = 45, - }; - managementItem.LeftClick += (_, _) => SetState(GuildDialogState.Management); - managementItem.RightClick += (_, _) => SetState(GuildDialogState.Management); - - AddItemToList(managementItem, sortList: false); - - var bankAccountItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 3) - { - ShowIconBackGround = false, - IconGraphic = _dialogIconService.IconSheet, - IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildBankAccount), - PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_BANK_ACCOUNT), - SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_DEPOSIT_TO_GUILD_ACCOUNT), - OffsetY = 45, - }; - //registrationItem.LeftClick += (_, _) => SetState(GuildDialogState.Registration); - //registrationItem.RightClick += (_, _) => SetState(GuildDialogState.Registration); - - AddItemToList(bankAccountItem, sortList: false); - } - break; + var administrationItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 1) + { + ShowIconBackGround = false, + IconGraphic = _dialogIconService.IconSheet, + IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildAdministration), + PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_ADMINISTRATION), + SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_JOIN_LEAVE_REGISTER), + OffsetY = 45, + }; - case GuildDialogState.Management: - { - ListItemType = ListDialogItem.ListItemStyle.Large; - Buttons = ScrollingListDialogButtons.BackCancel; - - var modifyGuildItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) - { - ShowIconBackGround = false, - IconGraphic = _dialogIconService.IconSheet, - IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildModify), - PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_MODIFY_GUILD), - SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_CHANGE_YOUR_GUILD_DETAILS), - OffsetY = 45, - }; - modifyGuildItem.LeftClick += (_, _) => SetStateIfGuildMember(GuildDialogState.Modify); - modifyGuildItem.RightClick += (_, _) => SetStateIfGuildMember(GuildDialogState.Modify); - - AddItemToList(modifyGuildItem, sortList: false); - - var manageRankingItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) - { - ShowIconBackGround = false, - IconGraphic = _dialogIconService.IconSheet, - IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildRanking), - PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_RANKING), - SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_MANAGE_MEMBER_RANKINGS), - OffsetY = 45, - }; - manageRankingItem.LeftClick += (_, _) => SetStateIfGuildMember(GuildDialogState.ManageRankings); - manageRankingItem.RightClick += (_, _) => SetStateIfGuildMember(GuildDialogState.ManageRankings); - - AddItemToList(manageRankingItem, sortList: false); - - var assignRankItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) - { - ShowIconBackGround = false, - IconGraphic = _dialogIconService.IconSheet, - IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildRanking), - PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_RANKING), - SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_ASSIGN_RANK_TO_MEMBER), - OffsetY = 45, - }; - assignRankItem.LeftClick += (_, _) => SetStateIfGuildMember(GuildDialogState.AssignRank); - assignRankItem.RightClick += (_, _) => SetStateIfGuildMember(GuildDialogState.AssignRank); - - AddItemToList(assignRankItem, sortList: false); - - var removeMemberItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) - { - ShowIconBackGround = false, - IconGraphic = _dialogIconService.IconSheet, - IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildRemoveMember), - PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_REMOVE_MEMBER), - SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_REMOVE_A_MEMBER_FROM_GUILD), - OffsetY = 45, - }; - removeMemberItem.LeftClick += (_, _) => SetStateIfGuildMember(GuildDialogState.RemoveMember); - removeMemberItem.RightClick += (_, _) => SetStateIfGuildMember(GuildDialogState.RemoveMember); - - AddItemToList(removeMemberItem, sortList: false); - - var disbandItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) - { - ShowIconBackGround = false, - IconGraphic = _dialogIconService.IconSheet, - IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildDisband), - PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_DISBAND), - SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_DISBAND_YOUR_GUILD), - OffsetY = 45, - }; - disbandItem.LeftClick += (_, _) => SetStateIfGuildMember(GuildDialogState.Disband); - disbandItem.RightClick += (_, _) => SetStateIfGuildMember(GuildDialogState.Disband); - - AddItemToList(disbandItem, sortList: false); - } - break; + var managementItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 2) + { + ShowIconBackGround = false, + IconGraphic = _dialogIconService.IconSheet, + IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildManagement), + PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_MANAGEMENT), + SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_MODIFY_RANKING_DISBAND), + OffsetY = 45, + }; + managementItem.LeftClick += (_, _) => SetState(State.Management); + managementItem.RightClick += (_, _) => SetState(State.Management); - } + var bankAccountItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 3) + { + ShowIconBackGround = false, + IconGraphic = _dialogIconService.IconSheet, + IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildBankAccount), + PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_BANK_ACCOUNT), + SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_DEPOSIT_TO_GUILD_ACCOUNT), + OffsetY = 45, + }; + SetItemList(new List { informationItem, administrationItem, managementItem, bankAccountItem }); } - private void SetStateIfGuildMember(GuildDialogState state) + private void SetupManagementState() + { + var modifyGuildItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) + { + ShowIconBackGround = false, + IconGraphic = _dialogIconService.IconSheet, + IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildModify), + PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_MODIFY_GUILD), + SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_CHANGE_YOUR_GUILD_DETAILS), + OffsetY = 45, + }; + modifyGuildItem.LeftClick += (_, _) => SetStateIfGuildMember(State.Modify); + modifyGuildItem.RightClick += (_, _) => SetStateIfGuildMember(State.Modify); + + var manageRankingItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) + { + ShowIconBackGround = false, + IconGraphic = _dialogIconService.IconSheet, + IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildRanking), + PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_RANKING), + SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_MANAGE_MEMBER_RANKINGS), + OffsetY = 45, + }; + manageRankingItem.LeftClick += (_, _) => SetStateIfGuildMember(State.ManageRankings); + manageRankingItem.RightClick += (_, _) => SetStateIfGuildMember(State.ManageRankings); + + var assignRankItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) + { + ShowIconBackGround = false, + IconGraphic = _dialogIconService.IconSheet, + IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildRanking), + PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_RANKING), + SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_ASSIGN_RANK_TO_MEMBER), + OffsetY = 45, + }; + assignRankItem.LeftClick += (_, _) => SetStateIfGuildMember(State.AssignRank); + assignRankItem.RightClick += (_, _) => SetStateIfGuildMember(State.AssignRank); + + var removeMemberItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) + { + ShowIconBackGround = false, + IconGraphic = _dialogIconService.IconSheet, + IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildRemoveMember), + PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_REMOVE_MEMBER), + SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_REMOVE_A_MEMBER_FROM_GUILD), + OffsetY = 45, + }; + removeMemberItem.LeftClick += (_, _) => SetStateIfGuildMember(State.RemoveMember); + removeMemberItem.RightClick += (_, _) => SetStateIfGuildMember(State.RemoveMember); + + var disbandItem = new ListDialogItem(this, ListDialogItem.ListItemStyle.Large, 0) + { + ShowIconBackGround = false, + IconGraphic = _dialogIconService.IconSheet, + IconGraphicSource = _dialogIconService.GetDialogIconSource(DialogIcon.GuildDisband), + PrimaryText = _localizedStringFinder.GetString(EOResourceID.GUILD_DISBAND), + SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_DISBAND_YOUR_GUILD), + OffsetY = 45, + }; + disbandItem.LeftClick += (_, _) => SetStateIfGuildMember(State.Disband); + disbandItem.RightClick += (_, _) => SetStateIfGuildMember(State.Disband); + + SetItemList(new List { modifyGuildItem, manageRankingItem, assignRankItem, removeMemberItem, disbandItem }); + } + + private void SetupModifyState() + { + _guildActions.GetGuildDescription(_characterProvider.MainCharacter.GuildTag); + + AddTextAsListItems( + _contentProvider.Fonts[Constants.FontSize08pt5], + insertLineBreaks: false, + new List { ShowChangeDescriptionMessageBox }, + _localizedStringFinder.GetString(EOResourceID.GUILD_CURRENT_DESCRIPTION), + _guildSessionProvider.GuildDescription, + " ", + _localizedStringFinder.GetString(EOResourceID.GUILD_CLICK_HERE_TO_CHANGE_THE_DESCRIPTION) + ); + + _modifyGuildDescriptionListItem = Option.Some(ChildControls.OfType().ToList()[1]); + } + + private void SetStateIfGuildMember(State state) { if (!_characterProvider.MainCharacter.InGuild) { @@ -229,5 +312,19 @@ private void SetStateIfGuildMember(GuildDialogState state) SetState(state); } + + private void ShowChangeDescriptionMessageBox() + { + var dlg = _textInputDialogFactory.Create(_localizedStringFinder.GetString(EOResourceID.GUILD_DESCRIPTION), 240); + dlg.DialogClosing += (_, e) => + { + if (e.Result == XNADialogResult.OK) + { + _guildActions.SetGuildDescription(dlg.ResponseText); + GoBack(); + } + }; + dlg.ShowDialog(); + } } } diff --git a/EndlessClient/Dialogs/ScrollingListDialog.cs b/EndlessClient/Dialogs/ScrollingListDialog.cs index aa2123a2a..f135da37a 100644 --- a/EndlessClient/Dialogs/ScrollingListDialog.cs +++ b/EndlessClient/Dialogs/ScrollingListDialog.cs @@ -392,7 +392,10 @@ public void ClearHighlightedText() public void ClearItemList() { foreach (var item in _listItems) + { + item.SetControlUnparented(); item.Dispose(); + } _listItems.Clear(); _scrollBar.UpdateDimensions(0); @@ -433,7 +436,6 @@ public void AddTextAsListItems(BitmapFont font, bool insertLineBreaks, List