UI.hx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * Copyright (C)2005-2019 Haxe Foundation
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  20. * DEALINGS IN THE SOFTWARE.
  21. */
  22. package hl;
  23. typedef SentinelHandle = hl.Abstract<"ui_sentinel">;
  24. abstract Sentinel(SentinelHandle) {
  25. public var pause(get, set):Bool;
  26. public function new(timeout, callback) {
  27. this = create_sentinel(timeout, callback);
  28. }
  29. function get_pause() {
  30. return is_paused(this);
  31. }
  32. function set_pause(p:Bool) {
  33. _pause(this, p);
  34. return p;
  35. }
  36. public function tick() {
  37. _tick(this);
  38. }
  39. @:hlNative("ui", "ui_start_sentinel") static function create_sentinel(timeout:Float, callb:Void->Void):SentinelHandle {
  40. return null;
  41. }
  42. @:hlNative("ui", "ui_sentinel_tick") static function _tick(h:SentinelHandle):Void {}
  43. @:hlNative("ui", "ui_sentinel_pause") static function _pause(h:SentinelHandle, b:Bool):Void {}
  44. @:hlNative("ui", "ui_sentinel_is_paused") static function is_paused(h:SentinelHandle):Bool {
  45. return false;
  46. }
  47. }
  48. typedef WinHandle = hl.Abstract<"ui_window">;
  49. class Window {
  50. var h:WinHandle;
  51. public function setText(text:String) {
  52. win_set_text(h, @:privateAccess text.bytes);
  53. }
  54. public function setEnable(b:Bool) {
  55. win_set_enable(h, b);
  56. }
  57. public function destroy() {
  58. win_destroy(h);
  59. }
  60. @:hlNative("ui", "ui_win_destroy")
  61. static function win_destroy(win:WinHandle):Void {}
  62. @:hlNative("ui", "ui_win_set_text")
  63. static function win_set_text(win:WinHandle, text:hl.Bytes):Void {}
  64. @:hlNative("ui", "ui_win_set_enable")
  65. static function win_set_enable(win:WinHandle, enable:Bool):Void {}
  66. }
  67. class Button extends Window {
  68. public function new(parent:Window, text:String) {
  69. h = button_new(parent.h, @:privateAccess text.bytes, function() this.onClick());
  70. }
  71. public dynamic function onClick() {}
  72. @:hlNative("ui", "ui_button_new")
  73. static function button_new(parent:WinHandle, text:hl.Bytes, onClick:Void->Void):WinHandle {
  74. return null;
  75. }
  76. }
  77. class WinLog extends Window {
  78. public function new(title:String, width, height) {
  79. h = winlog_new(@:privateAccess title.bytes, width, height);
  80. }
  81. public function setTextContent(text:String, autoScroll = false) {
  82. winlog_set_text(h, @:privateAccess text.bytes, autoScroll);
  83. }
  84. @:hlNative("ui", "ui_winlog_new")
  85. static function winlog_new(text:hl.Bytes, width:Int, height:Int):WinHandle {
  86. return null;
  87. }
  88. @:hlNative("ui", "ui_winlog_set_text")
  89. static function winlog_set_text(win:WinHandle, text:hl.Bytes, autoScroll:Bool):Void {}
  90. }
  91. enum DialogFlags {
  92. YesNo;
  93. IsError;
  94. }
  95. enum abstract LoopResult(Int) {
  96. var NoMessage = 0;
  97. var HandledMessage = 1;
  98. var Quit = 2;
  99. }
  100. typedef FileOptions = {
  101. var ?window:Window;
  102. var ?filters:Array<{name:String, exts:Array<String>}>;
  103. var ?filterIndex:Int;
  104. var ?fileName:String;
  105. var ?title:String;
  106. }
  107. /**
  108. These are the bindings for the HL `ui.hdll` library, which contains some low level system access.
  109. **/
  110. class UI {
  111. @:hlNative("ui", "ui_init") static function init() {}
  112. static function __init__() {
  113. init();
  114. }
  115. @:hlNative("ui", "ui_dialog")
  116. static function _dialog(title:hl.Bytes, text:hl.Bytes, flags:Int):Int {
  117. return 0;
  118. }
  119. public static function dialog(title:String, text:String, flags:haxe.EnumFlags<DialogFlags>) {
  120. @:privateAccess _dialog(title.bytes, text.bytes, flags.toInt());
  121. }
  122. @:hlNative("ui", "ui_loop")
  123. public static function loop(blocking:Bool):LoopResult {
  124. return Quit;
  125. }
  126. @:hlNative("ui", "ui_stop_loop")
  127. public static function stopLoop():Void {}
  128. @:hlNative("ui", "ui_close_console")
  129. public static function closeConsole():Void {}
  130. public static function loadFile(opts:FileOptions) {
  131. return chooseFile(false, opts);
  132. }
  133. public static function saveFile(opts:FileOptions) {
  134. return chooseFile(true, opts);
  135. }
  136. static function chooseFile(save:Bool, opts:FileOptions) @:privateAccess {
  137. var out:Dynamic = {};
  138. if (opts.fileName != null) {
  139. var file = sys.FileSystem.absolutePath(opts.fileName);
  140. if (Sys.systemName() == "Windows")
  141. file = file.split("/").join("\\");
  142. var dir = null;
  143. if (sys.FileSystem.isDirectory(file)) {
  144. dir = file;
  145. file = null;
  146. } else {
  147. var path = new haxe.io.Path(file);
  148. dir = path.dir;
  149. file = path.file + (path.ext == null ? "" : "." + path.ext);
  150. }
  151. if (file != null)
  152. out.fileName = file.bytes;
  153. if (dir != null)
  154. out.directory = dir.bytes;
  155. }
  156. if (opts.title != null)
  157. out.title = opts.title.bytes;
  158. if (opts.filters != null) {
  159. var filters = new hl.NativeArray<hl.Bytes>(opts.filters.length * 2);
  160. var i = 0;
  161. for (f in opts.filters) {
  162. filters[i++] = f.name.bytes;
  163. filters[i++] = [for (e in f.exts) "*." + e].join(";").bytes;
  164. }
  165. out.filters = filters;
  166. out.filterIndex = opts.filterIndex;
  167. }
  168. if (opts.window != null)
  169. out.window = opts.window.h;
  170. var str = _chooseFile(save, out);
  171. return str == null ? null : String.fromUCS2(str);
  172. }
  173. @:hlNative("ui", "ui_choose_file")
  174. static function _chooseFile(forSave:Bool, obj:Dynamic):hl.Bytes {
  175. return null;
  176. }
  177. }