diff --git a/.github/images/label.gif b/.github/images/label.gif new file mode 100644 index 0000000..c96e48a Binary files /dev/null and b/.github/images/label.gif differ diff --git a/README.md b/README.md index cf3022c..ef05fde 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,7 @@ BitTorrent: `TYVZSykaVT1nKZnz9hjDgBRNB9VavU1bpW` * [PromptDialog](#prompt-dialog) * [ConfirmDialog](#confirm-dialog) - [Controls](#controls) + * [Label](#label) * [ProgressBar](#progress-bar) * [CalendarPicker](#calendar-picker) * [MonthPicker](#month-picker) @@ -633,6 +634,13 @@ await this.NavigateTo(cd); ## Controls +### Label + +A minimal control which allows to manage a classic "text" message and update its later without having to keep track of the message id. + + + + ### Progress Bar diff --git a/TelegramBotBase.Test/Tests/Controls/LabelForm.cs b/TelegramBotBase.Test/Tests/Controls/LabelForm.cs new file mode 100644 index 0000000..577a4cd --- /dev/null +++ b/TelegramBotBase.Test/Tests/Controls/LabelForm.cs @@ -0,0 +1,84 @@ +using System; +using System.Threading.Tasks; +using TelegramBotBase.Args; +using TelegramBotBase.Controls.Hybrid; +using TelegramBotBase.Controls.Inline; +using TelegramBotBase.Enums; +using TelegramBotBase.Form; + +namespace TelegramBotBase.Example.Tests.Controls; + +public class LabelForm : AutoCleanForm +{ + + TelegramBotBase.Controls.Inline.LabelControl _label; + + ButtonGrid _buttonGrid; + + String[] string_options = new string[] { "My test label", "Here is a different text", "*And this looks completely different.*", "Aha! another one.", "_Gotcha!_" }; + + public LabelForm() + { + DeleteMode = EDeleteMode.OnLeavingForm; + + Init += LabelForm_Init; + } + + private Task LabelForm_Init(object sender, InitEventArgs e) + { + //The "label" control + _label = new LabelControl("My test label"); + + AddControl(_label); + + //Optional...just for experimentation... + var bf = new ButtonForm(); + + bf.AddButtonRow("Toggle text", "toggle"); + bf.AddButtonRow("Open menu", "menu"); + + _buttonGrid = new ButtonGrid(bf); + _buttonGrid.KeyboardType = EKeyboardType.ReplyKeyboard; + _buttonGrid.Title = "Choose your options:"; + _buttonGrid.ButtonClicked += _buttonGrid_ButtonClicked; + + AddControl(_buttonGrid); + + return Task.CompletedTask; + } + + private async Task _buttonGrid_ButtonClicked(object sender, ButtonClickedEventArgs e) + { + switch (e.Button.Value ?? "") + { + case "menu": + + var mn = new Menu(); + + await NavigateTo(mn); + + break; + + case "toggle": + + + //Pick random string from array + var r = new Random((int)DateTime.UtcNow.Ticks); + + String random_string; + do + { + random_string = string_options[r.Next(0, string_options.Length)]; + if (random_string == null) + continue; + + } while (random_string == _label.Text); + + + _label.Text = random_string; + + break; + + } + } +} \ No newline at end of file diff --git a/TelegramBotBase.Test/Tests/Menu.cs b/TelegramBotBase.Test/Tests/Menu.cs index 740cfd7..3746134 100644 --- a/TelegramBotBase.Test/Tests/Menu.cs +++ b/TelegramBotBase.Test/Tests/Menu.cs @@ -207,6 +207,14 @@ public class Menu : AutoCleanForm break; + case "label": + + var lf = new LabelForm(); + + await NavigateTo(lf); + + break; + default: message.Handled = false; @@ -260,6 +268,9 @@ public class Menu : AutoCleanForm btn.AddButtonRow(new ButtonBase("#19 Notifications", new CallbackData("a", "notifications").Serialize())); + + btn.AddButtonRow(new ButtonBase("#20 Label", new CallbackData("a", "label").Serialize())); + await Device.Send("Choose your test:", btn); } } diff --git a/TelegramBotBase/Controls/Inline/Label.cs b/TelegramBotBase/Controls/Inline/Label.cs new file mode 100644 index 0000000..7c12011 --- /dev/null +++ b/TelegramBotBase/Controls/Inline/Label.cs @@ -0,0 +1,110 @@ +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Threading.Tasks; +using Telegram.Bot; +using Telegram.Bot.Types; +using Telegram.Bot.Types.Enums; +using TelegramBotBase.Base; +using TelegramBotBase.Form; +using TelegramBotBase.Localizations; + +namespace TelegramBotBase.Controls.Inline; + +[DebuggerDisplay("{Text}")] +public class LabelControl : ControlBase +{ + private bool _renderNecessary = true; + + private string _text = string.Empty; + + public String Text + { + get + { + return _text; + } + set + { + if (_text == value) + return; + + + _text = value; + _renderNecessary = true; + + } + } + + private ParseMode _parseMode = ParseMode.Markdown; + + public ParseMode ParseMode + { + get + { + return _parseMode; + } + set + { + _parseMode = value; + _renderNecessary = true; + } + } + + + public LabelControl() + { + } + + public LabelControl(string text) + { + _text = text; + } + + public LabelControl(string text, ParseMode parseMode) + { + _text = text; + _parseMode = parseMode; + } + + public int? MessageId { get; set; } + + + + public override async Task Render(MessageResult result) + { + if (!_renderNecessary) + { + return; + } + + Message m; + + //Update ? + if (MessageId != null) + { + m = await Device.Raw(a => a.EditMessageTextAsync(Device.DeviceId, MessageId.Value, Text, _parseMode)); + _renderNecessary = false; + + return; + } + + //New Message + m = await Device.Raw(a => a.SendTextMessageAsync(Device.DeviceId, Text, disableNotification: true, parseMode: _parseMode)); + if (m != null) + { + MessageId = m.MessageId; + } + + _renderNecessary = false; + } + + public override async Task Cleanup() + { + if (this.MessageId == null) + return; + + + await Device.DeleteMessage(MessageId.Value); + } +} \ No newline at end of file