Open Source Tomb Raider Engine
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

MenuFolder.cpp 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /*!
  2. * \file src/MenuFolder.cpp
  3. * \brief File-Explorer like menu
  4. *
  5. * \author xythobuz
  6. */
  7. #include "global.h"
  8. #include "Console.h"
  9. #include "Font.h"
  10. #include "Game.h"
  11. #include "loader/Loader.h"
  12. #include "OpenRaider.h"
  13. #include "Window.h"
  14. #include "MenuFolder.h"
  15. MenuFolder::MenuFolder() {
  16. zPos = -1;
  17. mCursor = 0;
  18. mMin = 0;
  19. mapFolder = nullptr;
  20. hiddenState = false;
  21. dialogState = false;
  22. UI::addWindow(this);
  23. }
  24. MenuFolder::~MenuFolder() {
  25. delete mapFolder;
  26. mapFolder = nullptr;
  27. UI::removeWindow(this);
  28. }
  29. int MenuFolder::initialize() {
  30. return initialize(getOpenRaider().getPakDir());
  31. }
  32. int MenuFolder::initialize(std::string s) {
  33. return initialize(new Folder(s));
  34. }
  35. int MenuFolder::initialize(Folder *folder, bool filter) {
  36. if (mapFolder != nullptr)
  37. delete mapFolder;
  38. mapFolder = folder;
  39. mMin = mCursor = 0;
  40. if (filter) {
  41. mapFolder->executeRemoveFiles([](File &f) {
  42. // Filter files based on file name
  43. if ((f.getName().length() > 4)
  44. && (f.getName().compare(f.getName().length() - 4, 4, ".phd") != 0)
  45. && (f.getName().compare(f.getName().length() - 4, 4, ".tr2") != 0)
  46. && (f.getName().compare(f.getName().length() - 4, 4, ".tr4") != 0)
  47. && (f.getName().compare(f.getName().length() - 4, 4, ".trc") != 0)) {
  48. return true; // delete file from list
  49. }
  50. // Check maps for validity
  51. Loader::LoaderVersion version = Loader::checkFile(f.getPath());
  52. if (version == Loader::TR_UNKNOWN) {
  53. getConsole() << "Error: pak file '" << f.getName().c_str()
  54. << "' invalid" << Console::endl;
  55. return true; // delete file from list
  56. }
  57. return false; // keep file on list
  58. });
  59. }
  60. if ((mapFolder->fileCount() + mapFolder->folderCount()) > 0)
  61. mCursor = 1; // Don't select ".." by default
  62. return 0;
  63. }
  64. void MenuFolder::display() {
  65. ::getWindow().glEnter2D();
  66. // Draw half-transparent overlay
  67. glColor4f(0.0f, 0.0f, 0.0f, 0.75f);
  68. glDisable(GL_TEXTURE_2D);
  69. glRecti(0, 0, (GLint)::getWindow().getWidth(), (GLint)::getWindow().getHeight());
  70. glEnable(GL_TEXTURE_2D);
  71. // Draw heading
  72. getFont().drawTextCentered(0, 10, 1.2f, BLUE, ::getWindow().getWidth(), VERSION);
  73. // Estimate displayable number of items
  74. int items = (::getWindow().getHeight() - 60) / 25;
  75. // Print list of "..", folders, files
  76. for (long i = mMin; (i < (mMin + items))
  77. && (i < (mapFolder->folderCount() + mapFolder->fileCount() + 1)); i++) {
  78. if (i == 0) {
  79. getFont().drawText(25, 50, 0.75f, (mCursor == i) ? RED : BLUE, "..");
  80. } else {
  81. getFont().drawText(25, (unsigned int)(50 + (25 * (i - mMin))), 0.75f,
  82. (mCursor == i) ? RED : BLUE,
  83. ((i - 1) < mapFolder->folderCount()) ?
  84. (mapFolder->getFolder(i - 1).getName() + "/")
  85. : mapFolder->getFile(i - 1 - mapFolder->folderCount()).getName());
  86. }
  87. }
  88. displayDialog();
  89. ::getWindow().glExit2D();
  90. }
  91. void MenuFolder::loadOrOpen() {
  92. if (mCursor == 0) {
  93. if (initialize(mapFolder->getParent().getPath()) != 0) {
  94. showDialog("Error reading parent folder!", "OK", "");
  95. }
  96. } else if ((mCursor - 1) < mapFolder->folderCount()) {
  97. if (initialize(mapFolder->getFolder(mCursor - 1).getPath()) != 0) {
  98. showDialog("Error reading subfolder!", "OK", "");
  99. }
  100. } else {
  101. int error = getGame().loadLevel(mapFolder->getFile((unsigned long)mCursor
  102. - 1 - mapFolder->folderCount()).getPath().c_str());
  103. if (error == 0) {
  104. makeInvisible();
  105. } else {
  106. std::ostringstream err;
  107. err << "Error loading map: " << error << "!";
  108. showDialog(err.str(), "OK", "");
  109. }
  110. }
  111. }
  112. void MenuFolder::handleKeyboard(KeyboardButton key, bool pressed) {
  113. if (handleKeyboardDialog(key, pressed))
  114. return;
  115. if (!pressed)
  116. return;
  117. assert(mapFolder != nullptr);
  118. int items = (::getWindow().getHeight() - 60) / 25;
  119. if (key == upKey) {
  120. if (mCursor > 0)
  121. mCursor--;
  122. else
  123. mCursor = (long)(mapFolder->folderCount() + mapFolder->fileCount());
  124. } else if (key == downKey) {
  125. if (mCursor < (long)(mapFolder->folderCount() + mapFolder->fileCount()))
  126. mCursor++;
  127. else
  128. mCursor = 0;
  129. } else if (key == enterKey) {
  130. loadOrOpen();
  131. } else if (key == dotKey) {
  132. hiddenState = !hiddenState;
  133. initialize(mapFolder->getPath());
  134. }
  135. if (mCursor > (mMin + items - 1)) {
  136. mMin = mCursor - items + 1;
  137. } else if (mCursor < mMin) {
  138. mMin = mCursor;
  139. }
  140. }
  141. void MenuFolder::handleMouseClick(unsigned int x, unsigned int y, KeyboardButton button, bool released) {
  142. if (handleMouseClickDialog(x, y, button, released))
  143. return;
  144. int items = (::getWindow().getHeight() - 60) / 25;
  145. if (released || (button != leftmouseKey))
  146. return;
  147. if ((y >= 50) && (y <= (unsigned int)(50 + (25 * items)))
  148. && ((mMin + (y / 25)) <= (mapFolder->folderCount() + mapFolder->fileCount() + 2))) {
  149. y -= 50;
  150. if (mCursor == (mMin + (y / 25)))
  151. loadOrOpen();
  152. else
  153. mCursor = mMin + (y / 25);
  154. }
  155. }
  156. void MenuFolder::handleMouseScroll(int xrel, int yrel) {
  157. if (handleMouseScrollDialog(xrel, yrel))
  158. return;
  159. assert((xrel != 0) || (yrel != 0));
  160. assert(mapFolder != nullptr);
  161. int items = (::getWindow().getHeight() - 60) / 25;
  162. if ((mapFolder->folderCount() + mapFolder->fileCount() + 1) > items) {
  163. if (yrel < 0) {
  164. if (mMin < (mapFolder->folderCount() + mapFolder->fileCount() + 1 - items))
  165. mMin++;
  166. } else if (yrel > 0) {
  167. if (mMin > 0)
  168. mMin--;
  169. }
  170. if (mCursor < mMin) {
  171. mCursor = mMin;
  172. } else if (mCursor > (mMin + items - 1)) {
  173. mCursor = mMin + items - 1;
  174. }
  175. }
  176. }