25 #ifndef MFDButtonPage_H
26 #define MFDButtonPage_H
28 #include <OrbiterSDK.h>
42 template <
class MFDClass>
71 void SwitchPage( MFDClass * mfdInstance )
const;
85 void SelectPage( MFDClass * mfdInstance,
int pageIndex )
const;
100 bool ConsumeButton( MFDClass * mfdInstance,
int button,
int event )
const;
146 int ButtonMenu (
const MFDBUTTONMENU **menu)
const;
223 void RegisterPage(
const MFDBUTTONMENU * menu,
int size );
230 const MFDBUTTONMENU * m_menu;
232 std::vector<std::string> m_labels;
233 std::vector<bool> m_continuousClick;
234 std::vector<MFDFunctionPtr> m_buttonsLeftClick;
235 std::vector<MFDFunctionPtr> m_buttonsRightClick;
236 std::map<DWORD, MFDFunctionPtr> m_keys;
237 std::map<DWORD, bool> m_continuousKey;
240 bool PressKey( MFDClass * mfdInstance, DWORD key )
const;
241 void RegisterFuncPriv(
bool continuous,
const std::string & label, DWORD key,
244 std::vector<Page> m_pages;
249 template <
class MFDClass>
255 template <
class MFDClass>
258 template <
class MFDClass>
261 m_i = (++m_i) % m_pages.size();
262 mfdInstance->InvalidateButtons();
265 template <
class MFDClass>
268 if (pageIndex >= 0 && pageIndex < (
int)m_pages.size())
271 mfdInstance->InvalidateButtons();
274 sprintf_s(oapiDebugString(), 512,
"MFDButtonPage::SwitchPage():"
275 " Page index %d is beyond pages size %d!", pageIndex, m_pages.size());
278 template <
class MFDClass>
281 if ( button >= (
int)m_pages.at(m_i).m_buttonsLeftClick.size())
284 if (event & PANEL_MOUSE_LBDOWN ||
285 (event & PANEL_MOUSE_LBPRESSED && m_pages.at(m_i).m_continuousClick[button]) )
287 (mfdInstance->*(m_pages.at(m_i).m_buttonsLeftClick[button]))();
290 else if ( event & PANEL_MOUSE_RBDOWN ||
291 ( event & PANEL_MOUSE_RBPRESSED && m_pages.at(m_i).m_continuousClick[button] ) )
293 MFDFunctionPtr fun = m_pages.at(m_i).m_buttonsRightClick[button];
296 (mfdInstance->*(fun))();
303 template <
class MFDClass>
307 std::map<DWORD, bool>::const_iterator it = m_pages.at(m_i).m_continuousKey.find(key);
308 if (it != m_pages.at(m_i).m_continuousKey.end() && ! it->second )
309 return PressKey(mfdInstance, key);
311 if ( SearchForKeysInOtherPages() )
314 for (
size_t j = 0; j < m_pages.size(); ++j )
318 std::map<DWORD, bool>::const_iterator it = m_pages.at(j).m_continuousKey.find(key);
319 if (it != m_pages.at(j).m_continuousKey.end() && ! it->second )
320 return PressKey(mfdInstance, key);
326 template <
class MFDClass>
329 for (std::map<DWORD, bool>::const_iterator it = m_pages.at(m_i).m_continuousKey.begin();
330 it != m_pages.at(m_i).m_continuousKey.end(); ++it)
332 if ( KEYDOWN(kstate, it->first ) && it->second )
333 return PressKey(mfdInstance, it->first);
336 if ( SearchForKeysInOtherPages() )
338 for (
size_t j = 0; j < m_pages.size(); ++j )
343 for (std::map<DWORD, bool>::const_iterator it = m_pages.at(j).m_continuousKey.begin();
344 it != m_pages.at(j).m_continuousKey.end(); ++it)
346 if ( KEYDOWN(kstate, it->first ) && it->second )
347 return PressKey(mfdInstance, it->first);
354 template <
class MFDClass>
357 if ( menu ) *menu = m_pages.at(m_i).m_menu;
358 return m_pages.at(m_i).m_menuSize;
361 template <
class MFDClass>
364 return (bt < (
int)m_pages.at(m_i).m_labels.size() ?
365 (
char*)m_pages.at(m_i).m_labels[bt].c_str() : NULL);
369 template <
class MFDClass>
371 MFDFunctionPtr funLClick, MFDFunctionPtr funRClick )
373 RegisterFuncPriv(
false, label, key, funLClick, funRClick);
376 template <
class MFDClass>
378 MFDFunctionPtr funLClick, MFDFunctionPtr funRClick )
380 RegisterFuncPriv(
true, label, key, funLClick, funRClick);
383 template <
class MFDClass>
389 m_pages.push_back(p);
393 template <
class MFDClass>
397 std::map<DWORD, MFDFunctionPtr>::const_iterator it = m_pages.at(m_i).m_keys.find(key);
398 if (it != m_pages.at(m_i).m_keys.end() )
400 (mfdInstance->*(it->second))();
404 if ( SearchForKeysInOtherPages() )
407 for (
size_t j = 0; j < m_pages.size(); ++j )
411 std::map<DWORD, MFDFunctionPtr>::const_iterator it = m_pages.at(j).m_keys.find(key);
412 if (it != m_pages.at(j).m_keys.end() )
414 (mfdInstance->*(it->second))();
422 template <
class MFDClass>
423 void MFDButtonPage<MFDClass>::RegisterFuncPriv(
bool continuous,
const std::string & label, DWORD key,
424 MFDFunctionPtr funLClick, MFDFunctionPtr funRClick)
426 if ( m_pages.empty() )
428 sprintf_s(oapiDebugString(), 512,
"MFDButtonPage::RegisterFuncPriv(): No pages registered yet!");
431 Page & p = m_pages.back();
432 p.m_labels.push_back(label);
433 p.m_continuousClick.push_back(continuous);
434 p.m_buttonsLeftClick.push_back(funLClick);
435 p.m_buttonsRightClick.push_back(funRClick);
436 p.m_keys[key] = funLClick;
437 p.m_continuousKey[key] = continuous;
442 #endif // MFDButtonPage_H