//+------------------------------------------------------------------+ //| 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