Adding new simple label control and example
This commit is contained in:
parent
105ac9fa5b
commit
243c9c82a8
BIN
.github/images/label.gif
vendored
Normal file
BIN
.github/images/label.gif
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 658 KiB |
@ -44,6 +44,7 @@ BitTorrent: `TYVZSykaVT1nKZnz9hjDgBRNB9VavU1bpW`
|
|||||||
* [PromptDialog](#prompt-dialog)
|
* [PromptDialog](#prompt-dialog)
|
||||||
* [ConfirmDialog](#confirm-dialog)
|
* [ConfirmDialog](#confirm-dialog)
|
||||||
- [Controls](#controls)
|
- [Controls](#controls)
|
||||||
|
* [Label](#label)
|
||||||
* [ProgressBar](#progress-bar)
|
* [ProgressBar](#progress-bar)
|
||||||
* [CalendarPicker](#calendar-picker)
|
* [CalendarPicker](#calendar-picker)
|
||||||
* [MonthPicker](#month-picker)
|
* [MonthPicker](#month-picker)
|
||||||
@ -633,6 +634,13 @@ await this.NavigateTo(cd);
|
|||||||
|
|
||||||
## Controls
|
## 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.
|
||||||
|
|
||||||
|
<img src=".github/images/label.gif?raw=true" />
|
||||||
|
|
||||||
|
|
||||||
### Progress Bar
|
### Progress Bar
|
||||||
|
|
||||||
<img src=".github/images/progressbar.PNG?raw=true" />
|
<img src=".github/images/progressbar.PNG?raw=true" />
|
||||||
|
|||||||
84
TelegramBotBase.Test/Tests/Controls/LabelForm.cs
Normal file
84
TelegramBotBase.Test/Tests/Controls/LabelForm.cs
Normal file
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -207,6 +207,14 @@ public class Menu : AutoCleanForm
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "label":
|
||||||
|
|
||||||
|
var lf = new LabelForm();
|
||||||
|
|
||||||
|
await NavigateTo(lf);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
message.Handled = false;
|
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("#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);
|
await Device.Send("Choose your test:", btn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
110
TelegramBotBase/Controls/Inline/Label.cs
Normal file
110
TelegramBotBase/Controls/Inline/Label.cs
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user