120 lines
3.9 KiB
MQL5
120 lines
3.9 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| 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
|