Collection of DPF-based plugins for packaging
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

382 lines
10KB

  1. /**
  2. * projectM -- Milkdrop-esque visualisation SDK
  3. * Copyright (C)2003-2004 projectM Team
  4. *
  5. * This library is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU Lesser General Public
  7. * License as published by the Free Software Foundation; either
  8. * version 2.1 of the License, or (at your option) any later version.
  9. *
  10. * This library is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * Lesser General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Lesser General Public
  16. * License along with this library; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. * See 'LICENSE.txt' included within this release
  19. *
  20. */
  21. #include <stdio.h>
  22. #include "Common.hpp"
  23. #include "fatal.h"
  24. #include "KeyHandler.hpp"
  25. #include "event.h"
  26. #include "BeatDetect.hpp"
  27. #include "PresetChooser.hpp"
  28. #include "Renderer.hpp"
  29. #include "projectM.hpp"
  30. #include <iostream>
  31. #include "TimeKeeper.hpp"
  32. class Preset;
  33. interface_t current_interface = DEFAULT_INTERFACE;
  34. void selectRandom(const bool hardCut);
  35. void selectNext(const bool hardCut);
  36. void selectPrevious(const bool hardCut);
  37. std::string round_float(float number)
  38. {
  39. std::string num_text = std::to_string(number);
  40. std::string rounded = num_text.substr(0, num_text.find(".")+3);
  41. return rounded;
  42. }
  43. void refreshConsole() {
  44. switch (current_interface) {
  45. case MENU_INTERFACE:
  46. // unimplemented
  47. break;
  48. case SHELL_INTERFACE:
  49. // unimplemented
  50. break;
  51. case EDITOR_INTERFACE:
  52. // unimplemented
  53. break;
  54. case DEFAULT_INTERFACE:
  55. break;
  56. case BROWSER_INTERFACE:
  57. // unimplemented
  58. break;
  59. default:
  60. break;
  61. }
  62. }
  63. void projectM::key_handler( projectMEvent event,
  64. projectMKeycode keycode, projectMModifier modifier ) {
  65. switch( event ) {
  66. case PROJECTM_KEYDOWN:
  67. //default_key_handler();
  68. switch (current_interface)
  69. {
  70. case MENU_INTERFACE:
  71. // menu_key_handler(this, event, keycode);
  72. break;
  73. case SHELL_INTERFACE:
  74. //shell_key_handler();
  75. break;
  76. case EDITOR_INTERFACE:
  77. // editor_key_handler(event,keycode);
  78. break;
  79. case BROWSER_INTERFACE:
  80. // browser_key_handler(event,keycode,modifier);
  81. break;
  82. case DEFAULT_INTERFACE:
  83. default_key_handler(event,keycode);
  84. break;
  85. default:
  86. default_key_handler(event,keycode);
  87. break;
  88. }
  89. break;
  90. default:
  91. break;
  92. }
  93. }
  94. void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode) {
  95. switch( event ) {
  96. case PROJECTM_KEYDOWN:
  97. switch (keycode)
  98. {
  99. case PROJECTM_K_HOME:
  100. if (renderer->showmenu) {
  101. if (!isTextInputActive()) {
  102. selectPreset(0); // jump to top of presets.
  103. }
  104. else {
  105. renderer->m_activePresetID = 1; // jump to top of search results.
  106. selectPresetByName(renderer->m_presetList[0].name,true);
  107. }
  108. }
  109. break;
  110. case PROJECTM_K_END:
  111. if (renderer->showmenu) {
  112. if (!isTextInputActive()) {
  113. selectPreset(m_presetLoader->size() - 1); // jump to bottom of presets.
  114. }
  115. else {
  116. renderer->m_activePresetID = renderer->m_presetList.size(); // jump to top of search results.
  117. selectPresetByName(renderer->m_presetList[renderer->m_activePresetID - 1].name,true);
  118. }
  119. }
  120. break;
  121. case PROJECTM_K_PAGEUP:
  122. if (isTextInputActive()) break; // don't handle this key if search menu is up.
  123. if (renderer->showmenu) {
  124. int upPreset = m_presetPos->lastIndex() - (renderer->textMenuPageSize / 2.0f); // jump up by page size / 2
  125. if (upPreset < 0) // handle lower boundary
  126. upPreset = m_presetLoader->size() - 1;
  127. selectPreset(upPreset); // jump up menu half a page.
  128. }
  129. break;
  130. case PROJECTM_K_PAGEDOWN:
  131. if (isTextInputActive()) break; // don't handle this key if search menu is up.
  132. if (renderer->showmenu) {
  133. int downPreset = m_presetPos->lastIndex() + (renderer->textMenuPageSize / 2.0f); // jump down by page size / 2
  134. if (static_cast<std::size_t>(downPreset) >= (m_presetLoader->size() - 1)) // handle upper boundary
  135. downPreset = 0;
  136. selectPreset(downPreset); // jump down menu half a page.
  137. }
  138. break;
  139. case PROJECTM_K_UP:
  140. if (renderer->showmenu) {
  141. selectPrevious(true);
  142. }
  143. else {
  144. beatDetect->beatSensitivity += 0.01;
  145. if (beatDetect->beatSensitivity > 5.0) beatDetect->beatSensitivity = 5.0;
  146. renderer->setToastMessage("Beat Sensitivity: " + round_float(beatDetect->beatSensitivity));
  147. }
  148. break;
  149. case PROJECTM_K_DOWN:
  150. if (renderer->showmenu) {
  151. selectNext(true);
  152. }
  153. else {
  154. beatDetect->beatSensitivity -= 0.01;
  155. if (beatDetect->beatSensitivity < 0) beatDetect->beatSensitivity = 0;
  156. renderer->setToastMessage("Beat Sensitivity: " + round_float(beatDetect->beatSensitivity));
  157. }
  158. break;
  159. case PROJECTM_K_h:
  160. if (isTextInputActive(true)) break; // disable when searching.
  161. renderer->showhelp = !renderer->showhelp;
  162. renderer->showstats = false;
  163. renderer->showmenu = false;
  164. break;
  165. case PROJECTM_K_F1:
  166. if (isTextInputActive(true)) break; // disable when searching.
  167. renderer->showhelp = !renderer->showhelp;
  168. renderer->showstats = false;
  169. renderer->showmenu = false;
  170. break;
  171. case PROJECTM_K_y:
  172. if (isTextInputActive(true)) break; // disable when searching.
  173. this->setShuffleEnabled(!this->isShuffleEnabled());
  174. if (this->isShuffleEnabled()) {
  175. renderer->setToastMessage("Shuffle Enabled");
  176. }
  177. else {
  178. renderer->setToastMessage("Shuffle Disabled");
  179. }
  180. break;
  181. case PROJECTM_K_F5:
  182. if (isTextInputActive(true)) break; // disable when searching.
  183. renderer->showfps = !renderer->showfps;
  184. // Initialize counters and reset frame count.
  185. renderer->lastTimeFPS = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
  186. renderer->currentTimeFPS = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
  187. renderer->totalframes = 0;
  188. // Hide preset name from screen and replace it with FPS counter.
  189. if (renderer->showfps)
  190. {
  191. renderer->showpreset = false;
  192. }
  193. break;
  194. case PROJECTM_K_F4:
  195. if (isTextInputActive(true)) break; // disable when searching.
  196. renderer->showstats = !renderer->showstats;
  197. if (renderer->showstats) {
  198. renderer->showhelp = false;
  199. renderer->showmenu = false;
  200. }
  201. break;
  202. case PROJECTM_K_F3: {
  203. if (isTextInputActive(true)) break; // disable when searching.
  204. renderer->showpreset = !renderer->showpreset;
  205. // Hide FPS from screen and replace it with preset name.
  206. if (renderer->showpreset)
  207. {
  208. renderer->showsearch = false;
  209. renderer->showfps = false;
  210. }
  211. break;
  212. }
  213. case PROJECTM_K_F2:
  214. renderer->showtitle = !renderer->showtitle;
  215. break;
  216. #ifndef MACOS
  217. case PROJECTM_K_F9:
  218. #else
  219. case PROJECTM_K_F8:
  220. #endif
  221. renderer->studio = !renderer->studio;
  222. break;
  223. case PROJECTM_K_ESCAPE: {
  224. renderer->showsearch = false; // hide input menu
  225. setShuffleEnabled(renderer->shuffletrack); // restore shuffle
  226. renderer->showmenu = false; // hide input
  227. break;
  228. }
  229. case PROJECTM_K_f:
  230. break;
  231. case PROJECTM_K_a:
  232. renderer->correction = !renderer->correction;
  233. break;
  234. case PROJECTM_K_b:
  235. break;
  236. case PROJECTM_K_H:
  237. case PROJECTM_K_m:
  238. if (isTextInputActive(true)) break; // disable when searching.
  239. renderer->showmenu = !renderer->showmenu;
  240. if (renderer->showmenu) {
  241. renderer->showfps = false;
  242. renderer->showhelp = false;
  243. renderer->showstats = false;
  244. populatePresetMenu();
  245. }
  246. break;
  247. case PROJECTM_K_M:
  248. if (isTextInputActive(true)) break; // disable when searching.
  249. renderer->showmenu = !renderer->showmenu;
  250. if (renderer->showmenu)
  251. {
  252. renderer->showhelp = false;
  253. renderer->showstats = false;
  254. populatePresetMenu();
  255. }
  256. break;
  257. case PROJECTM_K_n:
  258. if (isTextInputActive(true)) break; // disable when searching.
  259. selectNext(true);
  260. break;
  261. case PROJECTM_K_N:
  262. if (isTextInputActive(true)) break; // disable when searching.
  263. selectNext(false);
  264. break;
  265. case PROJECTM_K_r:
  266. if (isTextInputActive(true)) break; // disable when searching.
  267. selectRandom(true);
  268. break;
  269. case PROJECTM_K_R:
  270. if (isTextInputActive(true)) break; // disable when searching.
  271. selectRandom(false);
  272. break;
  273. case PROJECTM_K_p:
  274. selectPrevious(true);
  275. break;
  276. case PROJECTM_K_P:
  277. case PROJECTM_K_BACKSPACE:
  278. selectPrevious(false);
  279. break;
  280. case PROJECTM_K_l:
  281. if (isTextInputActive(true)) break; // disable when searching.
  282. setPresetLock(!isPresetLocked());
  283. break;
  284. case PROJECTM_K_s:
  285. renderer->studio = !renderer->studio;
  286. case PROJECTM_K_i:
  287. break;
  288. case PROJECTM_K_RETURN:
  289. renderer->toggleSearchText();
  290. if (renderer->showsearch) {
  291. renderer->shuffletrack = this->isShuffleEnabled(); // track previous shuffle state.
  292. setShuffleEnabled(false); // disable shuffle
  293. renderer->showhelp = false;
  294. renderer->showstats = false;
  295. renderer->showtitle = false;
  296. renderer->showpreset = false;
  297. renderer->showmenu = true;
  298. populatePresetMenu();
  299. } else {
  300. setShuffleEnabled(renderer->shuffletrack); // restore shuffle
  301. renderer->showmenu = false;
  302. }
  303. break;
  304. case PROJECTM_K_0:
  305. // nWaveMode=0;
  306. break;
  307. case PROJECTM_K_6:
  308. // nWaveMode=6;
  309. break;
  310. case PROJECTM_K_7:
  311. // nWaveMode=7;
  312. break;
  313. case PROJECTM_K_t:
  314. break;
  315. case PROJECTM_K_EQUALS:
  316. case PROJECTM_K_PLUS:
  317. unsigned int index;
  318. if (selectedPresetIndex(index)) {
  319. const int oldRating = getPresetRating(index, HARD_CUT_RATING_TYPE);
  320. if (oldRating >= 6)
  321. break;
  322. const int rating = oldRating + 1;
  323. changePresetRating(index, rating, HARD_CUT_RATING_TYPE);
  324. }
  325. break;
  326. case PROJECTM_K_MINUS:
  327. if (selectedPresetIndex(index)) {
  328. const int oldRating = getPresetRating(index, HARD_CUT_RATING_TYPE);
  329. if (oldRating <= 1)
  330. break;
  331. const int rating = oldRating - 1;
  332. changePresetRating(index, rating, HARD_CUT_RATING_TYPE);
  333. }
  334. break;
  335. default:
  336. break;
  337. }
  338. default:
  339. break;
  340. }
  341. }