fix: reformat using C# rules
This commit is contained in:
@@ -10,254 +10,257 @@ using TelegramBotBase.Localizations;
|
||||
using static TelegramBotBase.Tools.Arrays;
|
||||
using static TelegramBotBase.Tools.Time;
|
||||
|
||||
namespace TelegramBotBase.Controls.Inline
|
||||
namespace TelegramBotBase.Controls.Inline;
|
||||
|
||||
public class CalendarPicker : ControlBase
|
||||
{
|
||||
public class CalendarPicker : ControlBase
|
||||
public CalendarPicker(CultureInfo culture)
|
||||
{
|
||||
SelectedDate = DateTime.Today;
|
||||
VisibleMonth = DateTime.Today;
|
||||
FirstDayOfWeek = DayOfWeek.Monday;
|
||||
Culture = culture;
|
||||
PickerMode = EMonthPickerMode.day;
|
||||
}
|
||||
|
||||
public DateTime SelectedDate { get; set; }
|
||||
public CalendarPicker() : this(new CultureInfo("en-en"))
|
||||
{
|
||||
}
|
||||
|
||||
public DateTime VisibleMonth { get; set; }
|
||||
public DateTime SelectedDate { get; set; }
|
||||
|
||||
public DayOfWeek FirstDayOfWeek { get; set; }
|
||||
public DateTime VisibleMonth { get; set; }
|
||||
|
||||
public CultureInfo Culture { get; set; }
|
||||
public DayOfWeek FirstDayOfWeek { get; set; }
|
||||
|
||||
public CultureInfo Culture { get; set; }
|
||||
|
||||
|
||||
private int? MessageId { get; set; }
|
||||
private int? MessageId { get; set; }
|
||||
|
||||
public string Title { get; set; } = Default.Language["CalendarPicker_Title"];
|
||||
public string Title { get; set; } = Default.Language["CalendarPicker_Title"];
|
||||
|
||||
public EMonthPickerMode PickerMode { get; set; }
|
||||
public EMonthPickerMode PickerMode { get; set; }
|
||||
|
||||
public bool EnableDayView { get; set; } = true;
|
||||
public bool EnableDayView { get; set; } = true;
|
||||
|
||||
public bool EnableMonthView { get; set; } = true;
|
||||
public bool EnableMonthView { get; set; } = true;
|
||||
|
||||
public bool EnableYearView { get; set; } = true;
|
||||
public bool EnableYearView { get; set; } = true;
|
||||
|
||||
public CalendarPicker(CultureInfo culture)
|
||||
|
||||
public override async Task Action(MessageResult result, string value = null)
|
||||
{
|
||||
await result.ConfirmAction();
|
||||
|
||||
switch (result.RawData)
|
||||
{
|
||||
SelectedDate = DateTime.Today;
|
||||
VisibleMonth = DateTime.Today;
|
||||
FirstDayOfWeek = DayOfWeek.Monday;
|
||||
Culture = culture;
|
||||
PickerMode = EMonthPickerMode.day;
|
||||
}
|
||||
case "$next$":
|
||||
|
||||
public CalendarPicker() : this(new CultureInfo("en-en")) { }
|
||||
VisibleMonth = PickerMode switch
|
||||
{
|
||||
EMonthPickerMode.day => VisibleMonth.AddMonths(1),
|
||||
EMonthPickerMode.month => VisibleMonth.AddYears(1),
|
||||
EMonthPickerMode.year => VisibleMonth.AddYears(10),
|
||||
_ => VisibleMonth
|
||||
};
|
||||
|
||||
break;
|
||||
case "$prev$":
|
||||
|
||||
VisibleMonth = PickerMode switch
|
||||
{
|
||||
EMonthPickerMode.day => VisibleMonth.AddMonths(-1),
|
||||
EMonthPickerMode.month => VisibleMonth.AddYears(-1),
|
||||
EMonthPickerMode.year => VisibleMonth.AddYears(-10),
|
||||
_ => VisibleMonth
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
public override async Task Action(MessageResult result, string value = null)
|
||||
{
|
||||
await result.ConfirmAction();
|
||||
case "$monthtitle$":
|
||||
|
||||
switch (result.RawData)
|
||||
{
|
||||
case "$next$":
|
||||
if (EnableMonthView)
|
||||
{
|
||||
PickerMode = EMonthPickerMode.month;
|
||||
}
|
||||
|
||||
VisibleMonth = PickerMode switch
|
||||
{
|
||||
EMonthPickerMode.day => VisibleMonth.AddMonths(1),
|
||||
EMonthPickerMode.month => VisibleMonth.AddYears(1),
|
||||
EMonthPickerMode.year => VisibleMonth.AddYears(10),
|
||||
_ => VisibleMonth
|
||||
};
|
||||
break;
|
||||
|
||||
break;
|
||||
case "$prev$":
|
||||
case "$yeartitle$":
|
||||
|
||||
VisibleMonth = PickerMode switch
|
||||
{
|
||||
EMonthPickerMode.day => VisibleMonth.AddMonths(-1),
|
||||
EMonthPickerMode.month => VisibleMonth.AddYears(-1),
|
||||
EMonthPickerMode.year => VisibleMonth.AddYears(-10),
|
||||
_ => VisibleMonth
|
||||
};
|
||||
if (EnableYearView)
|
||||
{
|
||||
PickerMode = EMonthPickerMode.year;
|
||||
}
|
||||
|
||||
break;
|
||||
break;
|
||||
case "$yearstitle$":
|
||||
|
||||
case "$monthtitle$":
|
||||
if (EnableMonthView)
|
||||
{
|
||||
PickerMode = EMonthPickerMode.month;
|
||||
}
|
||||
|
||||
if (EnableMonthView)
|
||||
{
|
||||
PickerMode = EMonthPickerMode.month;
|
||||
}
|
||||
VisibleMonth = SelectedDate;
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
case "$yeartitle$":
|
||||
default:
|
||||
|
||||
if (EnableYearView)
|
||||
{
|
||||
PickerMode = EMonthPickerMode.year;
|
||||
}
|
||||
|
||||
break;
|
||||
case "$yearstitle$":
|
||||
|
||||
if (EnableMonthView)
|
||||
{
|
||||
PickerMode = EMonthPickerMode.month;
|
||||
}
|
||||
var day = 0;
|
||||
if (result.RawData.StartsWith("d-") &&
|
||||
TryParseDay(result.RawData.Split('-')[1], SelectedDate, out day))
|
||||
{
|
||||
SelectedDate = new DateTime(VisibleMonth.Year, VisibleMonth.Month, day);
|
||||
}
|
||||
|
||||
var month = 0;
|
||||
if (result.RawData.StartsWith("m-") && TryParseMonth(result.RawData.Split('-')[1], out month))
|
||||
{
|
||||
SelectedDate = new DateTime(VisibleMonth.Year, month, 1);
|
||||
VisibleMonth = SelectedDate;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
var day = 0;
|
||||
if (result.RawData.StartsWith("d-") && TryParseDay(result.RawData.Split('-')[1], SelectedDate, out day))
|
||||
if (EnableDayView)
|
||||
{
|
||||
SelectedDate = new DateTime(VisibleMonth.Year, VisibleMonth.Month, day);
|
||||
PickerMode = EMonthPickerMode.day;
|
||||
}
|
||||
}
|
||||
|
||||
var month = 0;
|
||||
if (result.RawData.StartsWith("m-") && TryParseMonth(result.RawData.Split('-')[1], out month))
|
||||
var year = 0;
|
||||
if (result.RawData.StartsWith("y-") && TryParseYear(result.RawData.Split('-')[1], out year))
|
||||
{
|
||||
SelectedDate = new DateTime(year, SelectedDate.Month, SelectedDate.Day);
|
||||
VisibleMonth = SelectedDate;
|
||||
|
||||
if (EnableMonthView)
|
||||
{
|
||||
SelectedDate = new DateTime(VisibleMonth.Year, month, 1);
|
||||
VisibleMonth = SelectedDate;
|
||||
|
||||
if (EnableDayView)
|
||||
{
|
||||
PickerMode = EMonthPickerMode.day;
|
||||
}
|
||||
PickerMode = EMonthPickerMode.month;
|
||||
}
|
||||
}
|
||||
|
||||
var year = 0;
|
||||
if (result.RawData.StartsWith("y-") && TryParseYear(result.RawData.Split('-')[1], out year))
|
||||
{
|
||||
SelectedDate = new DateTime(year, SelectedDate.Month, SelectedDate.Day);
|
||||
VisibleMonth = SelectedDate;
|
||||
|
||||
if (EnableMonthView)
|
||||
{
|
||||
PickerMode = EMonthPickerMode.month;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override async Task Render(MessageResult result)
|
||||
{
|
||||
|
||||
|
||||
|
||||
var bf = new ButtonForm();
|
||||
|
||||
switch (PickerMode)
|
||||
{
|
||||
case EMonthPickerMode.day:
|
||||
|
||||
var month = VisibleMonth;
|
||||
|
||||
var dayNamesNormal = Culture.DateTimeFormat.ShortestDayNames;
|
||||
var dayNamesShifted = Shift(dayNamesNormal, (int)FirstDayOfWeek);
|
||||
|
||||
bf.AddButtonRow(new ButtonBase(Default.Language["CalendarPicker_PreviousPage"], "$prev$"), new ButtonBase(Culture.DateTimeFormat.MonthNames[month.Month - 1] + " " + month.Year, "$monthtitle$"), new ButtonBase(Default.Language["CalendarPicker_NextPage"], "$next$"));
|
||||
|
||||
bf.AddButtonRow(dayNamesShifted.Select(a => new ButtonBase(a, a)).ToList());
|
||||
|
||||
//First Day of month
|
||||
var firstDay = new DateTime(month.Year, month.Month, 1);
|
||||
|
||||
//Last Day of month
|
||||
var lastDay = firstDay.LastDayOfMonth();
|
||||
|
||||
//Start of Week where first day of month is (left border)
|
||||
var start = firstDay.StartOfWeek(FirstDayOfWeek);
|
||||
|
||||
//End of week where last day of month is (right border)
|
||||
var end = lastDay.EndOfWeek(FirstDayOfWeek);
|
||||
|
||||
for (var i = 0; i <= ((end - start).Days / 7); i++)
|
||||
{
|
||||
var lst = new List<ButtonBase>();
|
||||
for (var id = 0; id < 7; id++)
|
||||
{
|
||||
var d = start.AddDays((i * 7) + id);
|
||||
if (d < firstDay | d > lastDay)
|
||||
{
|
||||
lst.Add(new ButtonBase("-", "m-" + d.Day));
|
||||
continue;
|
||||
}
|
||||
|
||||
var day = d.Day.ToString();
|
||||
|
||||
if (d == DateTime.Today)
|
||||
{
|
||||
day = "(" + day + ")";
|
||||
}
|
||||
|
||||
lst.Add(new ButtonBase((SelectedDate == d ? "[" + day + "]" : day), "d-" + d.Day));
|
||||
}
|
||||
bf.AddButtonRow(lst);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case EMonthPickerMode.month:
|
||||
|
||||
bf.AddButtonRow(new ButtonBase(Default.Language["CalendarPicker_PreviousPage"], "$prev$"), new ButtonBase(VisibleMonth.Year.ToString("0000"), "$yeartitle$"), new ButtonBase(Default.Language["CalendarPicker_NextPage"], "$next$"));
|
||||
|
||||
var months = Culture.DateTimeFormat.MonthNames;
|
||||
|
||||
var buttons = months.Select((a, b) => new ButtonBase((b == SelectedDate.Month - 1 && SelectedDate.Year == VisibleMonth.Year ? "[ " + a + " ]" : a), "m-" + (b + 1)));
|
||||
|
||||
bf.AddSplitted(buttons);
|
||||
|
||||
break;
|
||||
|
||||
case EMonthPickerMode.year:
|
||||
|
||||
bf.AddButtonRow(new ButtonBase(Default.Language["CalendarPicker_PreviousPage"], "$prev$"), new ButtonBase("Year", "$yearstitle$"), new ButtonBase(Default.Language["CalendarPicker_NextPage"], "$next$"));
|
||||
|
||||
var starti = Math.Floor(VisibleMonth.Year / 10f) * 10;
|
||||
|
||||
for (var i = 0; i < 10; i++)
|
||||
{
|
||||
var m = starti + (i * 2);
|
||||
bf.AddButtonRow(new ButtonBase((SelectedDate.Year == m ? "[ " + m + " ]" : m.ToString()), "y-" + m), new ButtonBase((SelectedDate.Year == (m + 1) ? "[ " + (m + 1) + " ]" : (m + 1).ToString()), "y-" + (m + 1)));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (MessageId != null)
|
||||
{
|
||||
var m = await Device.Edit(MessageId.Value, Title, bf);
|
||||
}
|
||||
else
|
||||
{
|
||||
var m = await Device.Send(Title, bf);
|
||||
MessageId = m.MessageId;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override async Task Cleanup()
|
||||
{
|
||||
|
||||
if (MessageId != null)
|
||||
{
|
||||
await Device.DeleteMessage(MessageId.Value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override async Task Render(MessageResult result)
|
||||
{
|
||||
var bf = new ButtonForm();
|
||||
|
||||
switch (PickerMode)
|
||||
{
|
||||
case EMonthPickerMode.day:
|
||||
|
||||
var month = VisibleMonth;
|
||||
|
||||
var dayNamesNormal = Culture.DateTimeFormat.ShortestDayNames;
|
||||
var dayNamesShifted = Shift(dayNamesNormal, (int)FirstDayOfWeek);
|
||||
|
||||
bf.AddButtonRow(new ButtonBase(Default.Language["CalendarPicker_PreviousPage"], "$prev$"),
|
||||
new ButtonBase(Culture.DateTimeFormat.MonthNames[month.Month - 1] + " " + month.Year,
|
||||
"$monthtitle$"),
|
||||
new ButtonBase(Default.Language["CalendarPicker_NextPage"], "$next$"));
|
||||
|
||||
bf.AddButtonRow(dayNamesShifted.Select(a => new ButtonBase(a, a)).ToList());
|
||||
|
||||
//First Day of month
|
||||
var firstDay = new DateTime(month.Year, month.Month, 1);
|
||||
|
||||
//Last Day of month
|
||||
var lastDay = firstDay.LastDayOfMonth();
|
||||
|
||||
//Start of Week where first day of month is (left border)
|
||||
var start = firstDay.StartOfWeek(FirstDayOfWeek);
|
||||
|
||||
//End of week where last day of month is (right border)
|
||||
var end = lastDay.EndOfWeek(FirstDayOfWeek);
|
||||
|
||||
for (var i = 0; i <= (end - start).Days / 7; i++)
|
||||
{
|
||||
var lst = new List<ButtonBase>();
|
||||
for (var id = 0; id < 7; id++)
|
||||
{
|
||||
var d = start.AddDays(i * 7 + id);
|
||||
if ((d < firstDay) | (d > lastDay))
|
||||
{
|
||||
lst.Add(new ButtonBase("-", "m-" + d.Day));
|
||||
continue;
|
||||
}
|
||||
|
||||
var day = d.Day.ToString();
|
||||
|
||||
if (d == DateTime.Today)
|
||||
{
|
||||
day = "(" + day + ")";
|
||||
}
|
||||
|
||||
lst.Add(new ButtonBase(SelectedDate == d ? "[" + day + "]" : day, "d-" + d.Day));
|
||||
}
|
||||
|
||||
bf.AddButtonRow(lst);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case EMonthPickerMode.month:
|
||||
|
||||
bf.AddButtonRow(new ButtonBase(Default.Language["CalendarPicker_PreviousPage"], "$prev$"),
|
||||
new ButtonBase(VisibleMonth.Year.ToString("0000"), "$yeartitle$"),
|
||||
new ButtonBase(Default.Language["CalendarPicker_NextPage"], "$next$"));
|
||||
|
||||
var months = Culture.DateTimeFormat.MonthNames;
|
||||
|
||||
var buttons = months.Select((a, b) =>
|
||||
new ButtonBase(
|
||||
b == SelectedDate.Month - 1 &&
|
||||
SelectedDate.Year == VisibleMonth.Year
|
||||
? "[ " + a + " ]"
|
||||
: a,
|
||||
"m-" + (b + 1)));
|
||||
|
||||
bf.AddSplitted(buttons);
|
||||
|
||||
break;
|
||||
|
||||
case EMonthPickerMode.year:
|
||||
|
||||
bf.AddButtonRow(new ButtonBase(Default.Language["CalendarPicker_PreviousPage"], "$prev$"),
|
||||
new ButtonBase("Year", "$yearstitle$"),
|
||||
new ButtonBase(Default.Language["CalendarPicker_NextPage"], "$next$"));
|
||||
|
||||
var starti = Math.Floor(VisibleMonth.Year / 10f) * 10;
|
||||
|
||||
for (var i = 0; i < 10; i++)
|
||||
{
|
||||
var m = starti + i * 2;
|
||||
bf.AddButtonRow(
|
||||
new ButtonBase(SelectedDate.Year == m ? "[ " + m + " ]" : m.ToString(), "y-" + m),
|
||||
new ButtonBase(SelectedDate.Year == m + 1 ? "[ " + (m + 1) + " ]" : (m + 1).ToString(),
|
||||
"y-" + (m + 1)));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (MessageId != null)
|
||||
{
|
||||
var m = await Device.Edit(MessageId.Value, Title, bf);
|
||||
}
|
||||
else
|
||||
{
|
||||
var m = await Device.Send(Title, bf);
|
||||
MessageId = m.MessageId;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override async Task Cleanup()
|
||||
{
|
||||
if (MessageId != null)
|
||||
{
|
||||
await Device.DeleteMessage(MessageId.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,12 @@
|
||||
using TelegramBotBase.Enums;
|
||||
|
||||
namespace TelegramBotBase.Controls.Inline
|
||||
namespace TelegramBotBase.Controls.Inline;
|
||||
|
||||
public class MonthPicker : CalendarPicker
|
||||
{
|
||||
public class MonthPicker : CalendarPicker
|
||||
public MonthPicker()
|
||||
{
|
||||
|
||||
|
||||
|
||||
public MonthPicker()
|
||||
{
|
||||
PickerMode = EMonthPickerMode.month;
|
||||
EnableDayView = false;
|
||||
}
|
||||
|
||||
|
||||
PickerMode = EMonthPickerMode.month;
|
||||
EnableDayView = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,152 +6,147 @@ using TelegramBotBase.Base;
|
||||
using TelegramBotBase.Form;
|
||||
using TelegramBotBase.Localizations;
|
||||
|
||||
namespace TelegramBotBase.Controls.Inline
|
||||
namespace TelegramBotBase.Controls.Inline;
|
||||
|
||||
public class MultiToggleButton : ControlBase
|
||||
{
|
||||
public class MultiToggleButton : ControlBase
|
||||
private static readonly object EvToggled = new();
|
||||
|
||||
private readonly EventHandlerList _events = new();
|
||||
|
||||
private bool _renderNecessary = true;
|
||||
|
||||
|
||||
public MultiToggleButton()
|
||||
{
|
||||
/// <summary>
|
||||
/// This contains the selected icon.
|
||||
/// </summary>
|
||||
public string SelectedIcon { get; set; } = Default.Language["MultiToggleButton_SelectedIcon"];
|
||||
Options = new List<ButtonBase>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This will appear on the ConfirmAction message (if not empty)
|
||||
/// </summary>
|
||||
public string ChangedString { get; set; } = Default.Language["MultiToggleButton_Changed"];
|
||||
/// <summary>
|
||||
/// This contains the selected icon.
|
||||
/// </summary>
|
||||
public string SelectedIcon { get; set; } = Default.Language["MultiToggleButton_SelectedIcon"];
|
||||
|
||||
/// <summary>
|
||||
/// This holds the title of the control.
|
||||
/// </summary>
|
||||
public string Title { get; set; } = Default.Language["MultiToggleButton_Title"];
|
||||
/// <summary>
|
||||
/// This will appear on the ConfirmAction message (if not empty)
|
||||
/// </summary>
|
||||
public string ChangedString { get; set; } = Default.Language["MultiToggleButton_Changed"];
|
||||
|
||||
public int? MessageId { get; set; }
|
||||
/// <summary>
|
||||
/// This holds the title of the control.
|
||||
/// </summary>
|
||||
public string Title { get; set; } = Default.Language["MultiToggleButton_Title"];
|
||||
|
||||
private bool _renderNecessary = true;
|
||||
public int? MessageId { get; set; }
|
||||
|
||||
private static readonly object EvToggled = new object();
|
||||
/// <summary>
|
||||
/// This will hold all options available.
|
||||
/// </summary>
|
||||
public List<ButtonBase> Options { get; set; }
|
||||
|
||||
private readonly EventHandlerList _events = new EventHandlerList();
|
||||
/// <summary>
|
||||
/// This will set if an empty selection (null) is allowed.
|
||||
/// </summary>
|
||||
public bool AllowEmptySelection { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// This will hold all options available.
|
||||
/// </summary>
|
||||
public List<ButtonBase> Options { get; set; }
|
||||
public ButtonBase SelectedOption { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// This will set if an empty selection (null) is allowed.
|
||||
/// </summary>
|
||||
public bool AllowEmptySelection { get; set; } = true;
|
||||
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 MultiToggleButton()
|
||||
public override async Task Action(MessageResult result, string value = null)
|
||||
{
|
||||
if (result.Handled)
|
||||
{
|
||||
Options = new List<ButtonBase>();
|
||||
return;
|
||||
}
|
||||
|
||||
public event EventHandler Toggled
|
||||
await result.ConfirmAction(ChangedString);
|
||||
|
||||
switch (value ?? "unknown")
|
||||
{
|
||||
add => _events.AddHandler(EvToggled, value);
|
||||
remove => _events.RemoveHandler(EvToggled, value);
|
||||
}
|
||||
default:
|
||||
|
||||
public void OnToggled(EventArgs e)
|
||||
{
|
||||
(_events[EvToggled] as EventHandler)?.Invoke(this, e);
|
||||
}
|
||||
var s = value.Split('$');
|
||||
|
||||
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)
|
||||
if (s[0] == "check" && s.Length > 1)
|
||||
{
|
||||
var index = 0;
|
||||
if (!int.TryParse(s[1], out index))
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
if (SelectedOption == null || SelectedOption != Options[index])
|
||||
{
|
||||
SelectedOption = Options[index];
|
||||
OnToggled(EventArgs.Empty);
|
||||
}
|
||||
else if (AllowEmptySelection)
|
||||
{
|
||||
SelectedOption = null;
|
||||
OnToggled(EventArgs.Empty);
|
||||
}
|
||||
|
||||
_renderNecessary = false;
|
||||
_renderNecessary = true;
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
result.Handled = true;
|
||||
|
||||
}
|
||||
|
||||
public override async Task Render(MessageResult result)
|
||||
{
|
||||
if (!_renderNecessary)
|
||||
return;
|
||||
|
||||
var bf = new ButtonForm(this);
|
||||
|
||||
var lst = new List<ButtonBase>();
|
||||
foreach (var o in Options)
|
||||
{
|
||||
var index = Options.IndexOf(o);
|
||||
if (o == SelectedOption)
|
||||
{
|
||||
lst.Add(new ButtonBase(SelectedIcon + " " + o.Text, "check$" + index));
|
||||
continue;
|
||||
return;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
_renderNecessary = false;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
public ButtonBase SelectedOption
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
result.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
public override async Task Render(MessageResult result)
|
||||
{
|
||||
if (!_renderNecessary)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var bf = new ButtonForm(this);
|
||||
|
||||
var lst = new List<ButtonBase>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -2,266 +2,255 @@
|
||||
using System.Threading.Tasks;
|
||||
using TelegramBotBase.Base;
|
||||
|
||||
namespace TelegramBotBase.Controls.Inline
|
||||
namespace TelegramBotBase.Controls.Inline;
|
||||
|
||||
/// <summary>
|
||||
/// A simple control for show and managing progress.
|
||||
/// </summary>
|
||||
public class ProgressBar : ControlBase
|
||||
{
|
||||
/// <summary>
|
||||
/// A simple control for show and managing progress.
|
||||
/// </summary>
|
||||
public class ProgressBar : ControlBase
|
||||
public enum EProgressStyle
|
||||
{
|
||||
public enum EProgressStyle
|
||||
{
|
||||
standard = 0,
|
||||
squares = 1,
|
||||
circles = 2,
|
||||
lines = 3,
|
||||
squaredLines = 4,
|
||||
custom = 10
|
||||
}
|
||||
|
||||
public EProgressStyle ProgressStyle
|
||||
{
|
||||
get => _mEStyle;
|
||||
set
|
||||
{
|
||||
_mEStyle = value;
|
||||
LoadStyle();
|
||||
}
|
||||
}
|
||||
|
||||
private EProgressStyle _mEStyle = EProgressStyle.standard;
|
||||
|
||||
|
||||
public int Value
|
||||
{
|
||||
get => _mIValue;
|
||||
set
|
||||
{
|
||||
if (value > Max)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (_mIValue != value)
|
||||
{
|
||||
RenderNecessary = true;
|
||||
}
|
||||
_mIValue = value;
|
||||
}
|
||||
}
|
||||
|
||||
private int _mIValue;
|
||||
|
||||
public int Max
|
||||
{
|
||||
get => _mIMax;
|
||||
set
|
||||
{
|
||||
if (_mIMax != value)
|
||||
{
|
||||
RenderNecessary = true;
|
||||
}
|
||||
_mIMax = value;
|
||||
}
|
||||
}
|
||||
|
||||
private int _mIMax = 100;
|
||||
|
||||
public int? MessageId { get; set; }
|
||||
|
||||
private bool RenderNecessary { get; set; }
|
||||
|
||||
public int Steps
|
||||
{
|
||||
get
|
||||
{
|
||||
return ProgressStyle switch
|
||||
{
|
||||
EProgressStyle.standard => 1,
|
||||
EProgressStyle.squares => 10,
|
||||
EProgressStyle.circles => 10,
|
||||
EProgressStyle.lines => 5,
|
||||
EProgressStyle.squaredLines => 5,
|
||||
_ => 1
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Filled block (reached percentage)
|
||||
/// </summary>
|
||||
public string BlockChar
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unfilled block (not reached yet)
|
||||
/// </summary>
|
||||
public string EmptyBlockChar
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// String at the beginning of the progress bar
|
||||
/// </summary>
|
||||
public string StartChar
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// String at the end of the progress bar
|
||||
/// </summary>
|
||||
public string EndChar
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public ProgressBar()
|
||||
{
|
||||
ProgressStyle = EProgressStyle.standard;
|
||||
|
||||
Value = 0;
|
||||
Max = 100;
|
||||
|
||||
RenderNecessary = true;
|
||||
}
|
||||
|
||||
public ProgressBar(int value, int max, EProgressStyle style)
|
||||
{
|
||||
this.Value = value;
|
||||
this.Max = max;
|
||||
ProgressStyle = style;
|
||||
|
||||
RenderNecessary = true;
|
||||
}
|
||||
|
||||
public override async Task Cleanup()
|
||||
{
|
||||
if (MessageId == null || MessageId == -1)
|
||||
return;
|
||||
|
||||
|
||||
await Device.DeleteMessage(MessageId.Value);
|
||||
}
|
||||
|
||||
public void LoadStyle()
|
||||
{
|
||||
StartChar = "";
|
||||
EndChar = "";
|
||||
|
||||
switch (ProgressStyle)
|
||||
{
|
||||
case EProgressStyle.circles:
|
||||
|
||||
BlockChar = "⚫️ ";
|
||||
EmptyBlockChar = "⚪️ ";
|
||||
|
||||
break;
|
||||
case EProgressStyle.squares:
|
||||
|
||||
BlockChar = "⬛️ ";
|
||||
EmptyBlockChar = "⬜️ ";
|
||||
|
||||
break;
|
||||
case EProgressStyle.lines:
|
||||
|
||||
BlockChar = "█";
|
||||
EmptyBlockChar = "▁";
|
||||
|
||||
break;
|
||||
case EProgressStyle.squaredLines:
|
||||
|
||||
BlockChar = "▇";
|
||||
EmptyBlockChar = "—";
|
||||
|
||||
StartChar = "[";
|
||||
EndChar = "]";
|
||||
|
||||
break;
|
||||
case EProgressStyle.standard:
|
||||
case EProgressStyle.custom:
|
||||
|
||||
BlockChar = "";
|
||||
EmptyBlockChar = "";
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public override async Task Render(MessageResult result)
|
||||
{
|
||||
if (!RenderNecessary)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Device == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var message = "";
|
||||
var blocks = 0;
|
||||
var maxBlocks = 0;
|
||||
|
||||
switch (ProgressStyle)
|
||||
{
|
||||
case EProgressStyle.standard:
|
||||
|
||||
message = Value.ToString("0") + "%";
|
||||
|
||||
break;
|
||||
|
||||
case EProgressStyle.squares:
|
||||
case EProgressStyle.circles:
|
||||
case EProgressStyle.lines:
|
||||
case EProgressStyle.squaredLines:
|
||||
case EProgressStyle.custom:
|
||||
|
||||
blocks = (int)Math.Floor((decimal)Value / Steps);
|
||||
|
||||
maxBlocks = (Max / Steps);
|
||||
|
||||
message += StartChar;
|
||||
|
||||
for (var i = 0; i < blocks; i++)
|
||||
{
|
||||
message += BlockChar;
|
||||
}
|
||||
|
||||
for (var i = 0; i < (maxBlocks - blocks); i++)
|
||||
{
|
||||
message += EmptyBlockChar;
|
||||
}
|
||||
|
||||
message += EndChar;
|
||||
|
||||
message += " " + Value.ToString("0") + "%";
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (MessageId == null)
|
||||
{
|
||||
var m = await Device.Send(message);
|
||||
|
||||
MessageId = m.MessageId;
|
||||
}
|
||||
else
|
||||
{
|
||||
await Device.Edit(MessageId.Value, message);
|
||||
}
|
||||
|
||||
RenderNecessary = false;
|
||||
}
|
||||
|
||||
standard = 0,
|
||||
squares = 1,
|
||||
circles = 2,
|
||||
lines = 3,
|
||||
squaredLines = 4,
|
||||
custom = 10
|
||||
}
|
||||
}
|
||||
|
||||
private EProgressStyle _mEStyle = EProgressStyle.standard;
|
||||
|
||||
private int _mIMax = 100;
|
||||
|
||||
private int _mIValue;
|
||||
|
||||
public ProgressBar()
|
||||
{
|
||||
ProgressStyle = EProgressStyle.standard;
|
||||
|
||||
Value = 0;
|
||||
Max = 100;
|
||||
|
||||
RenderNecessary = true;
|
||||
}
|
||||
|
||||
public ProgressBar(int value, int max, EProgressStyle style)
|
||||
{
|
||||
Value = value;
|
||||
Max = max;
|
||||
ProgressStyle = style;
|
||||
|
||||
RenderNecessary = true;
|
||||
}
|
||||
|
||||
public EProgressStyle ProgressStyle
|
||||
{
|
||||
get => _mEStyle;
|
||||
set
|
||||
{
|
||||
_mEStyle = value;
|
||||
LoadStyle();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public int Value
|
||||
{
|
||||
get => _mIValue;
|
||||
set
|
||||
{
|
||||
if (value > Max)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (_mIValue != value)
|
||||
{
|
||||
RenderNecessary = true;
|
||||
}
|
||||
|
||||
_mIValue = value;
|
||||
}
|
||||
}
|
||||
|
||||
public int Max
|
||||
{
|
||||
get => _mIMax;
|
||||
set
|
||||
{
|
||||
if (_mIMax != value)
|
||||
{
|
||||
RenderNecessary = true;
|
||||
}
|
||||
|
||||
_mIMax = value;
|
||||
}
|
||||
}
|
||||
|
||||
public int? MessageId { get; set; }
|
||||
|
||||
private bool RenderNecessary { get; set; }
|
||||
|
||||
public int Steps
|
||||
{
|
||||
get
|
||||
{
|
||||
return ProgressStyle switch
|
||||
{
|
||||
EProgressStyle.standard => 1,
|
||||
EProgressStyle.squares => 10,
|
||||
EProgressStyle.circles => 10,
|
||||
EProgressStyle.lines => 5,
|
||||
EProgressStyle.squaredLines => 5,
|
||||
_ => 1
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Filled block (reached percentage)
|
||||
/// </summary>
|
||||
public string BlockChar { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Unfilled block (not reached yet)
|
||||
/// </summary>
|
||||
public string EmptyBlockChar { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// String at the beginning of the progress bar
|
||||
/// </summary>
|
||||
public string StartChar { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// String at the end of the progress bar
|
||||
/// </summary>
|
||||
public string EndChar { get; set; }
|
||||
|
||||
public override async Task Cleanup()
|
||||
{
|
||||
if (MessageId == null || MessageId == -1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
await Device.DeleteMessage(MessageId.Value);
|
||||
}
|
||||
|
||||
public void LoadStyle()
|
||||
{
|
||||
StartChar = "";
|
||||
EndChar = "";
|
||||
|
||||
switch (ProgressStyle)
|
||||
{
|
||||
case EProgressStyle.circles:
|
||||
|
||||
BlockChar = "⚫️ ";
|
||||
EmptyBlockChar = "⚪️ ";
|
||||
|
||||
break;
|
||||
case EProgressStyle.squares:
|
||||
|
||||
BlockChar = "⬛️ ";
|
||||
EmptyBlockChar = "⬜️ ";
|
||||
|
||||
break;
|
||||
case EProgressStyle.lines:
|
||||
|
||||
BlockChar = "█";
|
||||
EmptyBlockChar = "▁";
|
||||
|
||||
break;
|
||||
case EProgressStyle.squaredLines:
|
||||
|
||||
BlockChar = "▇";
|
||||
EmptyBlockChar = "—";
|
||||
|
||||
StartChar = "[";
|
||||
EndChar = "]";
|
||||
|
||||
break;
|
||||
case EProgressStyle.standard:
|
||||
case EProgressStyle.custom:
|
||||
|
||||
BlockChar = "";
|
||||
EmptyBlockChar = "";
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public override async Task Render(MessageResult result)
|
||||
{
|
||||
if (!RenderNecessary)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Device == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var message = "";
|
||||
var blocks = 0;
|
||||
var maxBlocks = 0;
|
||||
|
||||
switch (ProgressStyle)
|
||||
{
|
||||
case EProgressStyle.standard:
|
||||
|
||||
message = Value.ToString("0") + "%";
|
||||
|
||||
break;
|
||||
|
||||
case EProgressStyle.squares:
|
||||
case EProgressStyle.circles:
|
||||
case EProgressStyle.lines:
|
||||
case EProgressStyle.squaredLines:
|
||||
case EProgressStyle.custom:
|
||||
|
||||
blocks = (int)Math.Floor((decimal)Value / Steps);
|
||||
|
||||
maxBlocks = Max / Steps;
|
||||
|
||||
message += StartChar;
|
||||
|
||||
for (var i = 0; i < blocks; i++)
|
||||
{
|
||||
message += BlockChar;
|
||||
}
|
||||
|
||||
for (var i = 0; i < maxBlocks - blocks; i++)
|
||||
{
|
||||
message += EmptyBlockChar;
|
||||
}
|
||||
|
||||
message += EndChar;
|
||||
|
||||
message += " " + Value.ToString("0") + "%";
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (MessageId == null)
|
||||
{
|
||||
var m = await Device.Send(message);
|
||||
|
||||
MessageId = m.MessageId;
|
||||
}
|
||||
else
|
||||
{
|
||||
await Device.Edit(MessageId.Value, message);
|
||||
}
|
||||
|
||||
RenderNecessary = false;
|
||||
}
|
||||
}
|
||||
@@ -5,135 +5,133 @@ using TelegramBotBase.Base;
|
||||
using TelegramBotBase.Form;
|
||||
using TelegramBotBase.Localizations;
|
||||
|
||||
namespace TelegramBotBase.Controls.Inline
|
||||
namespace TelegramBotBase.Controls.Inline;
|
||||
|
||||
public class ToggleButton : ControlBase
|
||||
{
|
||||
public class ToggleButton : ControlBase
|
||||
private static readonly object EvToggled = new();
|
||||
|
||||
private readonly EventHandlerList _events = new();
|
||||
|
||||
private bool _renderNecessary = true;
|
||||
|
||||
|
||||
public ToggleButton()
|
||||
{
|
||||
|
||||
public string UncheckedIcon { get; set; } = Default.Language["ToggleButton_OffIcon"];
|
||||
|
||||
public string CheckedIcon { get; set; } = Default.Language["ToggleButton_OnIcon"];
|
||||
|
||||
public string CheckedString { get; set; } = Default.Language["ToggleButton_On"];
|
||||
|
||||
public string UncheckedString { get; set; } = Default.Language["ToggleButton_Off"];
|
||||
|
||||
public string ChangedString { get; set; } = Default.Language["ToggleButton_Changed"];
|
||||
|
||||
public string Title { get; set; } = Default.Language["ToggleButton_Title"];
|
||||
|
||||
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 => _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")
|
||||
{
|
||||
case "on":
|
||||
|
||||
if (Checked)
|
||||
return;
|
||||
|
||||
_renderNecessary = true;
|
||||
|
||||
Checked = true;
|
||||
|
||||
OnToggled(EventArgs.Empty);
|
||||
|
||||
break;
|
||||
|
||||
case "off":
|
||||
|
||||
if (!Checked)
|
||||
return;
|
||||
|
||||
_renderNecessary = true;
|
||||
|
||||
Checked = false;
|
||||
|
||||
OnToggled(EventArgs.Empty);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
_renderNecessary = false;
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
result.Handled = true;
|
||||
|
||||
}
|
||||
|
||||
public override async Task Render(MessageResult result)
|
||||
{
|
||||
if (!_renderNecessary)
|
||||
return;
|
||||
|
||||
var bf = new ButtonForm(this);
|
||||
|
||||
var bOn = new ButtonBase((Checked ? CheckedIcon : UncheckedIcon) + " " + CheckedString, "on");
|
||||
|
||||
var bOff = new ButtonBase((!Checked ? CheckedIcon : UncheckedIcon) + " " + UncheckedString, "off");
|
||||
|
||||
bf.AddButtonRow(bOn, bOff);
|
||||
|
||||
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 ToggleButton(string checkedString, string uncheckedString)
|
||||
{
|
||||
CheckedString = checkedString;
|
||||
UncheckedString = uncheckedString;
|
||||
}
|
||||
|
||||
public string UncheckedIcon { get; set; } = Default.Language["ToggleButton_OffIcon"];
|
||||
|
||||
public string CheckedIcon { get; set; } = Default.Language["ToggleButton_OnIcon"];
|
||||
|
||||
public string CheckedString { get; set; } = Default.Language["ToggleButton_On"];
|
||||
|
||||
public string UncheckedString { get; set; } = Default.Language["ToggleButton_Off"];
|
||||
|
||||
public string ChangedString { get; set; } = Default.Language["ToggleButton_Changed"];
|
||||
|
||||
public string Title { get; set; } = Default.Language["ToggleButton_Title"];
|
||||
|
||||
public int? MessageId { get; set; }
|
||||
|
||||
public bool Checked { get; set; }
|
||||
|
||||
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")
|
||||
{
|
||||
case "on":
|
||||
|
||||
if (Checked)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_renderNecessary = true;
|
||||
|
||||
Checked = true;
|
||||
|
||||
OnToggled(EventArgs.Empty);
|
||||
|
||||
break;
|
||||
|
||||
case "off":
|
||||
|
||||
if (!Checked)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_renderNecessary = true;
|
||||
|
||||
Checked = false;
|
||||
|
||||
OnToggled(EventArgs.Empty);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
_renderNecessary = false;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
result.Handled = true;
|
||||
}
|
||||
|
||||
public override async Task Render(MessageResult result)
|
||||
{
|
||||
if (!_renderNecessary)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var bf = new ButtonForm(this);
|
||||
|
||||
var bOn = new ButtonBase((Checked ? CheckedIcon : UncheckedIcon) + " " + CheckedString, "on");
|
||||
|
||||
var bOff = new ButtonBase((!Checked ? CheckedIcon : UncheckedIcon) + " " + UncheckedString, "off");
|
||||
|
||||
bf.AddButtonRow(bOn, bOff);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -5,117 +5,117 @@ using TelegramBotBase.Base;
|
||||
using TelegramBotBase.Form;
|
||||
using TelegramBotBase.Localizations;
|
||||
|
||||
namespace TelegramBotBase.Controls.Inline
|
||||
namespace TelegramBotBase.Controls.Inline;
|
||||
|
||||
public class TreeView : ControlBase
|
||||
{
|
||||
public class TreeView : ControlBase
|
||||
public TreeView()
|
||||
{
|
||||
public List<TreeViewNode> Nodes { get; set; }
|
||||
Nodes = new List<TreeViewNode>();
|
||||
Title = Default.Language["TreeView_Title"];
|
||||
}
|
||||
|
||||
public TreeViewNode SelectedNode { get; set; }
|
||||
public List<TreeViewNode> Nodes { get; set; }
|
||||
|
||||
public TreeViewNode VisibleNode { get; set; }
|
||||
public TreeViewNode SelectedNode { get; set; }
|
||||
|
||||
public string Title { get; set; }
|
||||
public TreeViewNode VisibleNode { get; set; }
|
||||
|
||||
private int? MessageId { get; set; }
|
||||
public string Title { get; set; }
|
||||
|
||||
public string MoveUpIcon { get; set; } = Default.Language["TreeView_LevelUp"];
|
||||
private int? MessageId { get; set; }
|
||||
|
||||
public TreeView()
|
||||
public string MoveUpIcon { get; set; } = Default.Language["TreeView_LevelUp"];
|
||||
|
||||
|
||||
public override async Task Action(MessageResult result, string value = null)
|
||||
{
|
||||
await result.ConfirmAction();
|
||||
|
||||
if (result.Handled)
|
||||
{
|
||||
Nodes = new List<TreeViewNode>();
|
||||
Title = Default.Language["TreeView_Title"];
|
||||
return;
|
||||
}
|
||||
|
||||
var val = result.RawData;
|
||||
|
||||
public override async Task Action(MessageResult result, string value = null)
|
||||
switch (val)
|
||||
{
|
||||
await result.ConfirmAction();
|
||||
case "up":
|
||||
case "parent":
|
||||
|
||||
if (result.Handled)
|
||||
return;
|
||||
VisibleNode = VisibleNode?.ParentNode;
|
||||
|
||||
var val = result.RawData;
|
||||
result.Handled = true;
|
||||
|
||||
switch (val)
|
||||
{
|
||||
case "up":
|
||||
case "parent":
|
||||
break;
|
||||
default:
|
||||
|
||||
VisibleNode = (VisibleNode?.ParentNode);
|
||||
var n = VisibleNode != null
|
||||
? VisibleNode.FindNodeByValue(val)
|
||||
: Nodes.FirstOrDefault(a => a.Value == val);
|
||||
|
||||
result.Handled = true;
|
||||
|
||||
break;
|
||||
default:
|
||||
|
||||
var n = (VisibleNode != null ? VisibleNode.FindNodeByValue(val) : Nodes.FirstOrDefault(a => a.Value == val));
|
||||
|
||||
if (n == null)
|
||||
return;
|
||||
|
||||
|
||||
if (n.ChildNodes.Count > 0)
|
||||
{
|
||||
VisibleNode = n;
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedNode = (SelectedNode != n ? n : null);
|
||||
}
|
||||
|
||||
result.Handled = true;
|
||||
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override async Task Render(MessageResult result)
|
||||
{
|
||||
var startnode = VisibleNode;
|
||||
|
||||
var nodes = (startnode?.ChildNodes ?? Nodes);
|
||||
|
||||
var bf = new ButtonForm();
|
||||
|
||||
if (startnode != null)
|
||||
{
|
||||
bf.AddButtonRow(new ButtonBase(MoveUpIcon, "up"), new ButtonBase(startnode.Text, "parent"));
|
||||
}
|
||||
|
||||
foreach (var n in nodes)
|
||||
{
|
||||
var s = n.Text;
|
||||
if (SelectedNode == n)
|
||||
if (n == null)
|
||||
{
|
||||
s = "[ " + s + " ]";
|
||||
return;
|
||||
}
|
||||
|
||||
bf.AddButtonRow(new ButtonBase(s, n.Value, n.Url));
|
||||
}
|
||||
|
||||
if (n.ChildNodes.Count > 0)
|
||||
{
|
||||
VisibleNode = n;
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedNode = SelectedNode != n ? n : null;
|
||||
}
|
||||
|
||||
result.Handled = true;
|
||||
|
||||
|
||||
|
||||
if (MessageId != null)
|
||||
{
|
||||
var m = await Device.Edit(MessageId.Value, Title, bf);
|
||||
}
|
||||
else
|
||||
{
|
||||
var m = await Device.Send(Title, bf);
|
||||
MessageId = m.MessageId;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
public string GetPath()
|
||||
{
|
||||
return (VisibleNode?.GetPath() ?? "\\");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override async Task Render(MessageResult result)
|
||||
{
|
||||
var startnode = VisibleNode;
|
||||
|
||||
var nodes = startnode?.ChildNodes ?? Nodes;
|
||||
|
||||
var bf = new ButtonForm();
|
||||
|
||||
if (startnode != null)
|
||||
{
|
||||
bf.AddButtonRow(new ButtonBase(MoveUpIcon, "up"), new ButtonBase(startnode.Text, "parent"));
|
||||
}
|
||||
|
||||
foreach (var n in nodes)
|
||||
{
|
||||
var s = n.Text;
|
||||
if (SelectedNode == n)
|
||||
{
|
||||
s = "[ " + s + " ]";
|
||||
}
|
||||
|
||||
bf.AddButtonRow(new ButtonBase(s, n.Value, n.Url));
|
||||
}
|
||||
|
||||
|
||||
if (MessageId != null)
|
||||
{
|
||||
var m = await Device.Edit(MessageId.Value, Title, bf);
|
||||
}
|
||||
else
|
||||
{
|
||||
var m = await Device.Send(Title, bf);
|
||||
MessageId = m.MessageId;
|
||||
}
|
||||
}
|
||||
|
||||
public string GetPath()
|
||||
{
|
||||
return VisibleNode?.GetPath() ?? "\\";
|
||||
}
|
||||
}
|
||||
@@ -1,62 +1,61 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace TelegramBotBase.Controls.Inline
|
||||
namespace TelegramBotBase.Controls.Inline;
|
||||
|
||||
public class TreeViewNode
|
||||
{
|
||||
public class TreeViewNode
|
||||
public TreeViewNode(string text, string value)
|
||||
{
|
||||
public string Text { get; set; }
|
||||
|
||||
public string Value { get; set; }
|
||||
|
||||
public string Url { get; set; }
|
||||
|
||||
public List<TreeViewNode> ChildNodes { get; set; } = new List<TreeViewNode>();
|
||||
|
||||
public TreeViewNode ParentNode { get; set; }
|
||||
|
||||
public TreeViewNode(string text, string value)
|
||||
{
|
||||
this.Text = text;
|
||||
this.Value = value;
|
||||
}
|
||||
|
||||
public TreeViewNode(string text, string value, string url) : this(text, value)
|
||||
{
|
||||
this.Url = url;
|
||||
}
|
||||
|
||||
public TreeViewNode(string text, string value, params TreeViewNode[] childnodes) : this(text, value)
|
||||
{
|
||||
foreach(var c in childnodes)
|
||||
{
|
||||
AddNode(c);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void AddNode(TreeViewNode node)
|
||||
{
|
||||
node.ParentNode = this;
|
||||
ChildNodes.Add(node);
|
||||
}
|
||||
|
||||
public TreeViewNode FindNodeByValue(string value)
|
||||
{
|
||||
return ChildNodes.FirstOrDefault(a => a.Value == value);
|
||||
}
|
||||
|
||||
public string GetPath()
|
||||
{
|
||||
var s = "\\" + Value;
|
||||
var p = this;
|
||||
while (p.ParentNode != null)
|
||||
{
|
||||
s = "\\" + p.ParentNode.Value + s;
|
||||
p = p.ParentNode;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
Text = text;
|
||||
Value = value;
|
||||
}
|
||||
}
|
||||
|
||||
public TreeViewNode(string text, string value, string url) : this(text, value)
|
||||
{
|
||||
Url = url;
|
||||
}
|
||||
|
||||
public TreeViewNode(string text, string value, params TreeViewNode[] childnodes) : this(text, value)
|
||||
{
|
||||
foreach (var c in childnodes)
|
||||
{
|
||||
AddNode(c);
|
||||
}
|
||||
}
|
||||
|
||||
public string Text { get; set; }
|
||||
|
||||
public string Value { get; set; }
|
||||
|
||||
public string Url { get; set; }
|
||||
|
||||
public List<TreeViewNode> ChildNodes { get; set; } = new();
|
||||
|
||||
public TreeViewNode ParentNode { get; set; }
|
||||
|
||||
|
||||
public void AddNode(TreeViewNode node)
|
||||
{
|
||||
node.ParentNode = this;
|
||||
ChildNodes.Add(node);
|
||||
}
|
||||
|
||||
public TreeViewNode FindNodeByValue(string value)
|
||||
{
|
||||
return ChildNodes.FirstOrDefault(a => a.Value == value);
|
||||
}
|
||||
|
||||
public string GetPath()
|
||||
{
|
||||
var s = "\\" + Value;
|
||||
var p = this;
|
||||
while (p.ParentNode != null)
|
||||
{
|
||||
s = "\\" + p.ParentNode.Value + s;
|
||||
p = p.ParentNode;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user