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
|