home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / XenonSource.exe / gamesystem / source / gs_menu.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-07-09  |  4.6 KB  |  224 lines

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    gsCMenu
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    12/03/00
  8. //
  9. // Base:    gsCObject
  10. //
  11. // Derived:    None
  12. //
  13. //-------------------------------------------------------------
  14.  
  15. #include "gamesystem.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. gsCMenu::gsCMenu()
  20. {
  21.     m_position = gsCPoint(0,0);
  22.     m_spacing = gsCPoint(0,0);
  23.     m_font = 0;
  24.     m_current_item = 0;
  25. }
  26.  
  27. //-------------------------------------------------------------
  28.  
  29. gsCMenu::~gsCMenu()
  30. {
  31.     destroy();
  32. }
  33.  
  34. //-------------------------------------------------------------
  35.  
  36. void gsCMenu::destroy()
  37. {
  38.     for (int i = 0; i < m_item_list.getSize(); i++)
  39.         delete m_item_list[i];
  40.  
  41.     m_item_list.clear();
  42. }
  43.  
  44. //-------------------------------------------------------------
  45.  
  46. void gsCMenu::clear()
  47. {
  48.     destroy();
  49. }
  50.  
  51. //-------------------------------------------------------------
  52.  
  53. void gsCMenu::setFont(gsCFont *font)
  54. {
  55.     m_font = font;
  56. }
  57.  
  58. //-------------------------------------------------------------
  59.  
  60. void gsCMenu::setPosition(const gsCPoint& position)
  61. {
  62.     m_position = position;
  63. }
  64.  
  65. //-------------------------------------------------------------
  66.  
  67. void gsCMenu::setSpacing(const gsCPoint& spacing)
  68. {
  69.     m_spacing = spacing;
  70. }
  71.  
  72. //-------------------------------------------------------------
  73.  
  74. void gsCMenu::setWrap(bool state)
  75. {
  76.     m_wrap = state;
  77. }
  78.  
  79. //-------------------------------------------------------------
  80.  
  81. void gsCMenu::addSelection(const char *name)
  82. {
  83.     addOptionList(name,0);
  84. }
  85.  
  86. //-------------------------------------------------------------
  87.  
  88. void __cdecl gsCMenu::addOptionList(const char *name,const char *option,...)
  89. {
  90.     gsCMenuOptionList *item = new gsCMenuOptionList(name);
  91.  
  92.     va_list arglist;
  93.     const char *op = option;
  94.  
  95.     va_start(arglist,option);
  96.  
  97.     while (op) {
  98.         item->addOption(op);
  99.         op = va_arg(arglist,const char *);
  100.         }
  101.  
  102.     va_end(arglist);
  103.  
  104.     m_item_list.addItem(item);
  105. }
  106.  
  107. //-------------------------------------------------------------
  108.  
  109. void gsCMenu::addSlider(const char *name,int size,int min,int max)
  110. {
  111.     m_item_list.addItem(new gsCMenuSlider(name,size,min,max));
  112. }
  113.  
  114. //-------------------------------------------------------------
  115.  
  116. void gsCMenu::addSeperator(const char *name)
  117. {
  118.     m_item_list.addItem(new gsCMenuSeperator(name));
  119. }
  120.  
  121. //-------------------------------------------------------------
  122.  
  123. int gsCMenu::getNumItems()
  124. {
  125.     return m_item_list.getSize();
  126. }
  127.  
  128. //-------------------------------------------------------------
  129.  
  130. void gsCMenu::setCurrentItem(int item)
  131. {
  132.     gsASSERT(item >= -1);
  133.     gsASSERT(item < m_item_list.getSize());
  134.     gsASSERT(m_item_list[item]->getType() != gsMENU_SEPERATOR);
  135.  
  136.     m_current_item = item;
  137. }
  138.  
  139. //-------------------------------------------------------------
  140.  
  141. int gsCMenu::getCurrentItem()
  142. {
  143.     return m_current_item;
  144. }
  145.  
  146. //-------------------------------------------------------------
  147.  
  148. void gsCMenu::scroll(int direction)
  149. {
  150.     do {
  151.         m_current_item += direction;
  152.  
  153.         if (m_wrap) {
  154.             if (m_current_item < 0)
  155.                 m_current_item = m_item_list.getSize() - 1;
  156.             if (m_current_item >= m_item_list.getSize())
  157.                 m_current_item = 0;
  158.             }
  159.         else {
  160.             if (m_current_item < 0)
  161.                 m_current_item = 0;
  162.             if (m_current_item >= m_item_list.getSize())
  163.                 m_current_item = m_item_list.getSize() - 1;
  164.             }
  165.         }
  166.     while (m_item_list[m_current_item]->getType() == gsMENU_SEPERATOR);
  167. }
  168.  
  169. //-------------------------------------------------------------
  170.  
  171. bool gsCMenu::setValue(int item,int value)
  172. {
  173.     gsASSERT(item >= 0);
  174.     gsASSERT(item < m_item_list.getSize());
  175.  
  176.     return m_item_list[item]->setValue(value);
  177. }
  178.  
  179. //-------------------------------------------------------------
  180.  
  181. int gsCMenu::getValue(int item)
  182. {
  183.     gsASSERT(item >= 0);
  184.     gsASSERT(item < m_item_list.getSize());
  185.  
  186.     return m_item_list[item]->getValue();
  187. }
  188.  
  189. //-------------------------------------------------------------
  190.  
  191. const char *gsCMenu::getName(int item)
  192. {
  193.     gsASSERT(item >= 0);
  194.     gsASSERT(item < m_item_list.getSize());
  195.  
  196.     return m_item_list[item]->getName();
  197. }
  198.  
  199. //-------------------------------------------------------------
  200.  
  201. bool gsCMenu::draw()
  202. {
  203.     if (!m_font)
  204.         return false;
  205.  
  206.     gsCScreen *screen = gsCApplication::getScreen();
  207.  
  208.     if (!screen)
  209.         return false;
  210.  
  211.  
  212.     for (int i = 0; i < m_item_list.getSize(); i++) {
  213.  
  214.         int y = m_position.getY() + m_spacing.getY() * i;
  215.         bool highlight = (i == m_current_item);
  216.  
  217.         m_item_list[i]->draw(screen,m_font,y,highlight);
  218.         }
  219.  
  220.     return true;
  221. }
  222.  
  223. //-------------------------------------------------------------
  224.