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