- added control id, for easier separating of controls in one form - added automatic event selection for specific controls, to not raise an event for other controls who has invoked it - changed Action method - added example
146 lines
3.3 KiB
C#
146 lines
3.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using TelegramBotBase.Base;
|
|
using TelegramBotBase.Form;
|
|
|
|
namespace TelegramBotBase.Controls
|
|
{
|
|
public class ToggleButton : ControlBase
|
|
{
|
|
|
|
public String UncheckedIcon { get; set; } = "⚪";
|
|
|
|
public String CheckedIcon { get; set; } = "⚫";
|
|
|
|
public String CheckedString { get; set; } = "On";
|
|
|
|
public String UncheckedString { get; set; } = "Off";
|
|
|
|
public String Title { get; set; } = "Toggle";
|
|
|
|
public int? MessageId { get; set; }
|
|
|
|
public bool Checked { get; set; }
|
|
|
|
private bool RenderNecessary = true;
|
|
|
|
private static readonly object __evToggled = new object();
|
|
|
|
private readonly EventHandlerList Events = new EventHandlerList();
|
|
|
|
|
|
public ToggleButton()
|
|
{
|
|
|
|
|
|
}
|
|
|
|
public ToggleButton(String CheckedString, String UncheckedString)
|
|
{
|
|
this.CheckedString = CheckedString;
|
|
this.UncheckedString = UncheckedString;
|
|
}
|
|
|
|
public event EventHandler Toggled
|
|
{
|
|
add
|
|
{
|
|
this.Events.AddHandler(__evToggled, value);
|
|
}
|
|
remove
|
|
{
|
|
this.Events.RemoveHandler(__evToggled, value);
|
|
}
|
|
}
|
|
|
|
public void OnToggled(EventArgs e)
|
|
{
|
|
(this.Events[__evToggled] as EventHandler)?.Invoke(this, e);
|
|
}
|
|
|
|
public override async Task Action(MessageResult result, String value = null)
|
|
{
|
|
|
|
if (result.Handled)
|
|
return;
|
|
|
|
await result.ConfirmAction();
|
|
|
|
switch (value ?? "unknown")
|
|
{
|
|
case "on":
|
|
|
|
if (this.Checked)
|
|
return;
|
|
|
|
RenderNecessary = true;
|
|
|
|
this.Checked = true;
|
|
|
|
OnToggled(new EventArgs());
|
|
|
|
break;
|
|
|
|
case "off":
|
|
|
|
if (!this.Checked)
|
|
return;
|
|
|
|
RenderNecessary = true;
|
|
|
|
this.Checked = false;
|
|
|
|
OnToggled(new EventArgs());
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
RenderNecessary = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
result.Handled = true;
|
|
|
|
}
|
|
|
|
public override async Task Render(MessageResult result)
|
|
{
|
|
if (!RenderNecessary)
|
|
return;
|
|
|
|
var bf = new ButtonForm(this);
|
|
|
|
ButtonBase bOn = new ButtonBase((this.Checked ? CheckedIcon : UncheckedIcon) + " " + CheckedString, "on");
|
|
|
|
ButtonBase bOff = new ButtonBase((!this.Checked ? CheckedIcon : UncheckedIcon) + " " + UncheckedString, "off");
|
|
|
|
bf.AddButtonRow(bOn, bOff);
|
|
|
|
if (this.MessageId != null)
|
|
{
|
|
var m = await this.Device.Edit(this.MessageId.Value, this.Title, bf);
|
|
}
|
|
else
|
|
{
|
|
var m = await this.Device.Send(this.Title, bf, disableNotification: true);
|
|
if (m != null)
|
|
{
|
|
this.MessageId = m.MessageId;
|
|
}
|
|
}
|
|
|
|
this.RenderNecessary = false;
|
|
|
|
|
|
}
|
|
|
|
}
|
|
}
|