GameMenu.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*
  2. * Copyright (c) 2011 Nokia Corporation.
  3. */
  4. #include <string.h>
  5. #include "GameMenu.h"
  6. GameMenu::GameMenu( GAMEMENU_RENDERFUNCTIONTYPE rfunc, void *dataToRFunc, char *menuTitle ) {
  7. itemList = 0;
  8. nextReturnAction = 0;
  9. destroyAnimation = 0.0f;
  10. renderFunction = rfunc;
  11. dataToRenderFunction = dataToRFunc;
  12. title = menuTitle;
  13. lifeTime = 0.0f;
  14. keyControlIndex = -1;
  15. }
  16. GameMenu::~GameMenu() {
  17. releaseItems();
  18. }
  19. void GameMenu::keyControlUp() {
  20. int ic = getItemCount();
  21. if (ic<1) return;
  22. if (keyControlIndex==-1)
  23. keyControlIndex = 0;
  24. else {
  25. if (keyControlIndex>0) keyControlIndex--;
  26. };
  27. }
  28. void GameMenu::keyControlDown() {
  29. int ic = getItemCount();
  30. if (ic<1) return;
  31. if (keyControlIndex==-1)
  32. keyControlIndex = ic-1;
  33. else {
  34. if (keyControlIndex<ic-1) keyControlIndex++;
  35. };
  36. }
  37. void GameMenu::keyControlSelect() {
  38. int ic = getItemCount();
  39. if (ic<1) return;
  40. if (keyControlIndex>=0) {
  41. click( keyControlIndex );
  42. } else keyControlIndex = 0;
  43. }
  44. void GameMenu::keyControlEnd() {
  45. keyControlIndex = -1;
  46. }
  47. MenuItem* GameMenu::addMenuItem( const char *label, const char *action, MENU_ITEM_TYPE type ) {
  48. MenuItem *ni = new MenuItem;
  49. ni->subMenu = 0;
  50. ni->type =type;
  51. ni->alpha = 1.0f;
  52. int labelLength = strlen( label );
  53. ni->selected = false;
  54. ni->label = new char[ labelLength+1 ];
  55. strcpy( ni->label, label );
  56. if (action) {
  57. int actionLength = strlen( action );
  58. ni->action = new char[ actionLength + 1 ];
  59. strcpy( ni->action, action );
  60. } else ni->action = 0;
  61. ni->next =0;
  62. if (itemList) {
  63. MenuItem *l = itemList;
  64. while (l->next) l = l->next;
  65. l->next = ni;
  66. } else itemList = ni;
  67. return ni;
  68. };
  69. int GameMenu::getItemCount() {
  70. int rval = 0;
  71. MenuItem *l = itemList;
  72. while (l) { rval++; l = l->next; }
  73. return rval;
  74. }
  75. void GameMenu::releaseItems() {
  76. MenuItem *l = itemList;
  77. while (l) {
  78. MenuItem *n = l->next;
  79. if (l->subMenu) delete l->subMenu;
  80. if (l->label) delete [] l->label;
  81. if (l->action) delete [] l->action;
  82. delete l;
  83. l = n;
  84. }
  85. itemList = 0;
  86. }
  87. void GameMenu::render() {
  88. int ind = 0;
  89. MenuItem *l = itemList;
  90. while (l) {
  91. if (keyControlIndex>-1) l->keysEnabled = true; else l->keysEnabled = false;
  92. if (ind==keyControlIndex)
  93. l->keyfocus = true;
  94. else
  95. l->keyfocus = false;
  96. (renderFunction)( dataToRenderFunction, this, l );
  97. l = l->next;
  98. ind++;
  99. }
  100. }
  101. MenuItem* GameMenu::getItemAt( int index ) {
  102. MenuItem *l = itemList;
  103. while (l) {
  104. if (index==0) return l;
  105. index--;
  106. l = l->next;
  107. }
  108. return 0;
  109. }
  110. bool GameMenu::click( int index ) {
  111. if (nextReturnAction) return false;
  112. if (index<0 || index>getItemCount()) return false;
  113. MenuItem *i = getItemAt(index);
  114. if (i) {
  115. i->selected = true;
  116. nextReturnAction = i->action;
  117. return true;
  118. }
  119. return false;
  120. }
  121. const char *GameMenu::run( float frameTime ) {
  122. lifeTime+=frameTime;
  123. int ind = 0;
  124. MenuItem *l = itemList;
  125. while (l) {
  126. l->index = ind;
  127. ind++;
  128. l = l->next;
  129. };
  130. if (nextReturnAction) {
  131. destroyAnimation += frameTime;
  132. if (destroyAnimation>1.0f) {
  133. char *rval = nextReturnAction;
  134. nextReturnAction = 0;
  135. return rval;
  136. //return nextReturnAction;
  137. }
  138. }
  139. return 0;
  140. }