using System; using System.Collections.Generic; using System.ComponentModel; using System.Threading.Tasks; using TelegramBotBase.Base; using TelegramBotBase.Form; using TelegramBotBase.Localizations; namespace TelegramBotBase.Controls.Inline { public class MultiToggleButton : ControlBase { /// /// This contains the selected icon. /// public string SelectedIcon { get; set; } = Default.Language["MultiToggleButton_SelectedIcon"]; /// /// This will appear on the ConfirmAction message (if not empty) /// public string ChangedString { get; set; } = Default.Language["MultiToggleButton_Changed"]; /// /// This holds the title of the control. /// public string Title { get; set; } = Default.Language["MultiToggleButton_Title"]; public int? MessageId { get; set; } private bool _renderNecessary = true; private static readonly object EvToggled = new object(); private readonly EventHandlerList _events = new EventHandlerList(); /// /// This will hold all options available. /// public List Options { get; set; } /// /// This will set if an empty selection (null) is allowed. /// public bool AllowEmptySelection { get; set; } = true; public MultiToggleButton() { Options = new List(); } public event EventHandler Toggled { add => _events.AddHandler(EvToggled, value); remove => _events.RemoveHandler(EvToggled, value); } public void OnToggled(EventArgs e) { (_events[EvToggled] as EventHandler)?.Invoke(this, e); } public override async Task Action(MessageResult result, string value = null) { if (result.Handled) return; await result.ConfirmAction(ChangedString); switch (value ?? "unknown") { default: var s = value.Split('$'); if (s[0] == "check" && s.Length > 1) { var index = 0; if (!int.TryParse(s[1], out index)) { return; } if(SelectedOption== null || SelectedOption != Options[index]) { SelectedOption = Options[index]; OnToggled(EventArgs.Empty); } else if(AllowEmptySelection) { SelectedOption = null; OnToggled(EventArgs.Empty); } _renderNecessary = true; return; } _renderNecessary = false; break; } result.Handled = true; } public override async Task Render(MessageResult result) { if (!_renderNecessary) return; var bf = new ButtonForm(this); var lst = new List(); foreach (var o in Options) { var index = Options.IndexOf(o); if (o == SelectedOption) { lst.Add(new ButtonBase(SelectedIcon + " " + o.Text, "check$" + index)); continue; } lst.Add(new ButtonBase(o.Text, "check$" + index)); } bf.AddButtonRow(lst); if (MessageId != null) { var m = await Device.Edit(MessageId.Value, Title, bf); } else { var m = await Device.Send(Title, bf, disableNotification: true); if (m != null) { MessageId = m.MessageId; } } _renderNecessary = false; } public ButtonBase SelectedOption { get; set; } } }