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.0KB

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