TelegramByLeo/Src/Bottons/KeyboardBase.mqh

120 lines
3.9 KiB
MQL5

2026-09-26 16:42:14 -05:00
//+------------------------------------------------------------------+
//| KeyboardBase.mqh |
//| Copyright 2026, Niquel Mendoza. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, Niquel Mendoza."
#property link "https://www.mql5.com"
#property strict
#ifndef TELEGRAMBYLEO_SRC_BOTTONS_KEYBOARDBASE_MQH
#define TELEGRAMBYLEO_SRC_BOTTONS_KEYBOARDBASE_MQH
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "..\\Base\\Def.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
namespace TSN
{
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#define TLGBYLEO_KEYBORAD_RESERVE(N) if(m_pos + (N) >= m_cap) { m_cap = (m_pos + (N)) << 1; ArrayResize(m_buf, m_cap, m_cap); }
//---
struct TlgKeyboardSnapshot
{
int pos;
bool in_row;
bool in_boton;
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CTlgKeyboardBase
{
public:
//---
uchar m_buf[];
int m_pos;
protected:
//---
int m_cap;
//---
bool m_in_row;
bool m_in_boton;
//---
void AddRowImpl();
void EndRowImpl();
public:
CTlgKeyboardBase(uint initial_cap = 256);
~CTlgKeyboardBase(void) {}
//--- snapshot
__forceinline void GetSnapshot(TlgKeyboardSnapshot& snap) const;
__forceinline void ApplySnapshot(const TlgKeyboardSnapshot& snap);
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CTlgKeyboardBase::CTlgKeyboardBase(uint initial_cap)
: m_cap((int)initial_cap), m_in_row(false), m_in_boton(false)
{
ArrayResize(m_buf, m_cap, m_cap);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CTlgKeyboardBase::AddRowImpl(void)
{
//---
TLGBYLEO_KEYBORAD_RESERVE(2)
//--- coma si ya hay una fila antes
if(m_in_row)
m_buf[m_pos++] = ',';
//---
m_buf[m_pos++] = '[';
m_in_row = true;
m_in_boton = false;
}
//+------------------------------------------------------------------+
void CTlgKeyboardBase::EndRowImpl(void)
{
//---
TLGBYLEO_KEYBORAD_RESERVE(1)
m_buf[m_pos++] = ']';
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
__forceinline void CTlgKeyboardBase::GetSnapshot(TlgKeyboardSnapshot& snap) const
{
snap.pos = m_pos;
snap.in_row = m_in_row;
snap.in_boton = m_in_boton;
}
__forceinline void CTlgKeyboardBase::ApplySnapshot(const TlgKeyboardSnapshot& snap)
{
m_pos = snap.pos;
m_in_row = snap.in_row;
m_in_boton = snap.in_boton;
}
}
//+------------------------------------------------------------------+
#endif // TELEGRAMBYLEO_SRC_BOTTONS_KEYBOARDBASE_MQH