/cui/application.d

http://github.com/wilkie/djehuty · D · 271 lines · 239 code · 30 blank · 2 comment · 82 complexity · 26194353b787019d378e8ac2e2453141 MD5 · raw file

  1. module cui.application;
  2. import cui.window;
  3. import core.application;
  4. import core.string;
  5. import core.event;
  6. import core.main;
  7. import core.definitions;
  8. import scaffold.cui;
  9. import platform.vars.cui;
  10. import io.console;
  11. // Description: This class represents a Text User Interface application (TUI).
  12. class CuiApplication : Application {
  13. public:
  14. this() {
  15. CuiStart(&_pfvars);
  16. super();
  17. }
  18. this(string appName) {
  19. CuiStart(&_pfvars);
  20. super(appName);
  21. }
  22. override void push(Dispatcher dsp) {
  23. super.push(dsp);
  24. if (cast(CuiWindow)dsp !is null) {
  25. setWindow(cast(CuiWindow)dsp);
  26. }
  27. }
  28. CuiWindow window() {
  29. return _curConsoleWindow;
  30. }
  31. override bool isZombie() {
  32. return (_curConsoleWindow is null);
  33. }
  34. protected:
  35. CuiWindow _curConsoleWindow;
  36. CuiPlatformVars _pfvars;
  37. override void shutdown() {
  38. CuiEnd(&_pfvars);
  39. }
  40. override void start() {
  41. eventLoop();
  42. }
  43. override void end(uint exitCode) {
  44. _running = false;
  45. }
  46. private:
  47. void setWindow(CuiWindow window) {
  48. _curConsoleWindow = window;
  49. // Draw Window
  50. window.onInitialize();
  51. }
  52. bool _running = true;
  53. void eventLoop() {
  54. while(_running) {
  55. CuiEvent evt;
  56. if (_curConsoleWindow is null) {
  57. continue;
  58. }
  59. CuiNextEvent(&evt, &_pfvars);
  60. switch(evt.type) {
  61. case CuiEvent.Type.KeyDown:
  62. _curConsoleWindow.onKeyDown(evt.info.key);
  63. dchar chr;
  64. if (isPrintable(evt.info.key, chr)) {
  65. _curConsoleWindow.onKeyChar(chr);
  66. }
  67. break;
  68. case CuiEvent.Type.MouseDown:
  69. break;
  70. case CuiEvent.Type.MouseUp:
  71. break;
  72. case CuiEvent.Type.MouseMove:
  73. break;
  74. case CuiEvent.Type.Close:
  75. this.exit(evt.aux);
  76. break;
  77. case CuiEvent.Type.Size:
  78. _curConsoleWindow._onResize();
  79. break;
  80. default:
  81. break;
  82. }
  83. }
  84. }
  85. bool _inited;
  86. bool isPrintable(Key key, out dchar chr) {
  87. if (key.ctrl || key.alt) {
  88. return false;
  89. }
  90. if (key.code >= Key.A && key.code <= Key.Z) {
  91. if (key.shift) {
  92. chr = (key.code - Key.A) + 'A';
  93. }
  94. else {
  95. chr = (key.code - Key.A) + 'a';
  96. }
  97. }
  98. else if (key.code >= Key.Zero && key.code <= Key.Nine) {
  99. if (key.shift) {
  100. switch (key.code) {
  101. case Key.Zero:
  102. chr = ')';
  103. break;
  104. case Key.One:
  105. chr = '!';
  106. break;
  107. case Key.Two:
  108. chr = '@';
  109. break;
  110. case Key.Three:
  111. chr = '#';
  112. break;
  113. case Key.Four:
  114. chr = '$';
  115. break;
  116. case Key.Five:
  117. chr = '%';
  118. break;
  119. case Key.Six:
  120. chr = '^';
  121. break;
  122. case Key.Seven:
  123. chr = '&';
  124. break;
  125. case Key.Eight:
  126. chr = '*';
  127. break;
  128. case Key.Nine:
  129. chr = '(';
  130. break;
  131. default:
  132. return false;
  133. }
  134. }
  135. else {
  136. chr = (key.code - Key.Zero) + '0';
  137. }
  138. }
  139. else if (key.code == Key.SingleQuote) {
  140. if (key.shift) {
  141. chr = '~';
  142. }
  143. else {
  144. chr = '`';
  145. }
  146. }
  147. else if (key.code == Key.Minus) {
  148. if (key.shift) {
  149. chr = '_';
  150. }
  151. else {
  152. chr = '-';
  153. }
  154. }
  155. else if (key.code == Key.Equals) {
  156. if (key.shift) {
  157. chr = '+';
  158. }
  159. else {
  160. chr = '=';
  161. }
  162. }
  163. else if (key.code == Key.LeftBracket) {
  164. if (key.shift) {
  165. chr = '{';
  166. }
  167. else {
  168. chr = '[';
  169. }
  170. }
  171. else if (key.code == Key.RightBracket) {
  172. if (key.shift) {
  173. chr = '}';
  174. }
  175. else {
  176. chr = '}';
  177. }
  178. }
  179. else if (key.code == Key.Semicolon) {
  180. if (key.shift) {
  181. chr = ':';
  182. }
  183. else {
  184. chr = ';';
  185. }
  186. }
  187. else if (key.code == Key.Comma) {
  188. if (key.shift) {
  189. chr = '<';
  190. }
  191. else {
  192. chr = ',';
  193. }
  194. }
  195. else if (key.code == Key.Period) {
  196. if (key.shift) {
  197. chr = '>';
  198. }
  199. else {
  200. chr = '.';
  201. }
  202. }
  203. else if (key.code == Key.Foreslash) {
  204. if (key.shift) {
  205. chr = '?';
  206. }
  207. else {
  208. chr = '/';
  209. }
  210. }
  211. else if (key.code == Key.Backslash) {
  212. if (key.shift) {
  213. chr = '|';
  214. }
  215. else {
  216. chr = '\\';
  217. }
  218. }
  219. else if (key.code == Key.Quote) {
  220. if (key.shift) {
  221. chr = '"';
  222. }
  223. else {
  224. chr = '\'';
  225. }
  226. }
  227. else if (key.code == Key.Tab && !key.shift) {
  228. chr = '\t';
  229. }
  230. else if (key.code == Key.Space) {
  231. chr = ' ';
  232. }
  233. else if (key.code == Key.Return && !key.shift) {
  234. chr = '\r';
  235. }
  236. else {
  237. return false;
  238. }
  239. return true;
  240. }
  241. }