using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Base;
using static TelegramBotBase.Base.Async;
namespace TelegramBotBase.Controls.Hybrid
{
///
/// This Control is for having a basic form content switching control.
///
public abstract class MultiView : Base.ControlBase
{
///
/// Index of the current View.
///
public int SelectedViewIndex
{
get
{
return m_iSelectedViewIndex;
}
set
{
m_iSelectedViewIndex = value;
//Already rendered? Re-Render
if (_Rendered)
ForceRender().Wait();
}
}
private int m_iSelectedViewIndex = 0;
///
/// Hold if the View has been rendered already.
///
private bool _Rendered = false;
private List Messages { get; set; }
public MultiView()
{
Messages = new List();
}
private void Device_MessageSent(object sender, MessageSentEventArgs e)
{
if (e.Origin == null || !e.Origin.IsSubclassOf(typeof(MultiView)))
return;
this.Messages.Add(e.MessageId);
}
public override void Init()
{
Device.MessageSent += Device_MessageSent;
}
public override async Task Load(MessageResult result)
{
_Rendered = false;
}
public override async Task Render(MessageResult result)
{
//When already rendered, skip rendering
if (_Rendered)
return;
await CleanUpView();
await RenderView(new RenderViewEventArgs(this.SelectedViewIndex));
_Rendered = true;
}
///
/// Will get invoked on rendering the current controls view.
///
///
public virtual async Task RenderView(RenderViewEventArgs e)
{
}
async Task CleanUpView()
{
var tasks = new List();
foreach (var msg in this.Messages)
{
tasks.Add(this.Device.DeleteMessage(msg));
}
await Task.WhenAll(tasks);
this.Messages.Clear();
}
///
/// Forces render of control contents.
///
public async Task ForceRender()
{
await CleanUpView();
await RenderView(new RenderViewEventArgs(this.SelectedViewIndex));
_Rendered = true;
}
public override async Task Cleanup()
{
Device.MessageSent -= Device_MessageSent;
await CleanUpView();
}
}
}