forked from nique_372/TelegramByLeo
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
|