Aucune description
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.

ui.ts 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. /// <reference path="./card.ts" />
  2. /// <reference path="./colors.ts" />
  3. /// <reference path="./icons.ts" />
  4. /// <reference path="./example_data.ts" />
  5. /// <reference path="./jquery.d.ts" />
  6. /// <reference path="./ace.d.ts" />
  7. module RpgCardsUI {
  8. var deck: RpgCards.CardDeck = null;
  9. var options: RpgCards.Options = null;
  10. var cardGenerator: RpgCards.CardHtmlGenerator = null;
  11. var pageGenerator: RpgCards.PageHtmlGenerator = null;
  12. var editor: AceAjax.Editor;
  13. // ============================================================================
  14. // Seleted card
  15. // ============================================================================
  16. function selected_card_index(): number {
  17. return parseInt($("#selected-card").val(), 10);
  18. }
  19. function selected_card(): RpgCards.Card {
  20. var index = selected_card_index();
  21. if (deck.cards.length > index) {
  22. return deck.cards[index];
  23. } else {
  24. return null;
  25. }
  26. }
  27. function select_card_by_index(index: number) {
  28. if (index > -1) {
  29. $("#selected-card").val("" + index);
  30. } else {
  31. $("#selected-card").val("" + (deck.cards.length - 1));
  32. }
  33. update_selected_card();
  34. }
  35. function select_card_by_card(card: RpgCards.Card) {
  36. var index = deck.cards.indexOf(card);
  37. select_card_by_index(index);
  38. }
  39. // ============================================================================
  40. // Rendering
  41. // ============================================================================
  42. function render_selected_card() {
  43. var card = selected_card();
  44. $('#preview-container').empty();
  45. if (card) {
  46. var front = cardGenerator.card_front(card, options, " ");
  47. var back = cardGenerator.card_back(card, options, " ");
  48. $('#preview-container').html(front + "\n" + back);
  49. }
  50. }
  51. function update_selected_card() {
  52. var card = selected_card();
  53. if (card) {
  54. $("#card-title").val(card.title);
  55. $("#card-title-size").val(card.title_size);
  56. $("#card-title-icon-text").val(card.title_icon_text);
  57. $("#card-count").val(""+card.count);
  58. $("#card-icon").val(card.icon);
  59. $("#card-icon-back").val(card.icon_back);
  60. //$("#card-contents").val(card.contents.join("\n"));
  61. editor.setValue(card.contents.join("\n"), -1);
  62. $("#card-tags").val(card.tags.join(", "));
  63. $("#card-color").val(card.color).change();
  64. } else {
  65. $("#card-title").val("");
  66. $("#card-title-size").val("");
  67. $("#card-title-icon-text").val("");
  68. $("#card-count").val("1");
  69. $("#card-icon").val("");
  70. $("#card-icon-back").val("");
  71. //$("#card-contents").val("");
  72. editor.setValue("");
  73. $("#card-tags").val("");
  74. $("#card-color").val("").change();
  75. }
  76. render_selected_card();
  77. }
  78. function update_card_list() {
  79. deck.commit();
  80. $("#total_card_count").text("Deck contains " + deck.cards.length + " unique cards.");
  81. $('#selected-card').empty();
  82. for (var i = 0; i < deck.cards.length; ++i) {
  83. var card = deck.cards[i];
  84. $('#selected-card')
  85. .append($("<option></option>")
  86. .attr("value", i)
  87. .text(card.title));
  88. }
  89. update_selected_card();
  90. }
  91. // ============================================================================
  92. // Color picker
  93. // ============================================================================
  94. function setup_color_selector() {
  95. // Insert colors
  96. $.each(card_colors, function (name, val) {
  97. $(".colorselector-data")
  98. .append($("<option></option>")
  99. .attr("value", name)
  100. .attr("data-color", val)
  101. .text(name));
  102. });
  103. // Callbacks for when the user picks a color
  104. (<any>$('#default_color_selector')).colorselector({
  105. callback: function (value, color, title) {
  106. $("#default-color").val(title);
  107. set_default_color(title);
  108. }
  109. });
  110. (<any>$('#card_color_selector')).colorselector({
  111. callback: function (value, color, title) {
  112. $("#card-color").val(title);
  113. set_card_color(value);
  114. }
  115. });
  116. (<any>$('#foreground_color_selector')).colorselector({
  117. callback: function (value, color, title) {
  118. $("#foreground-color").val(title);
  119. set_foreground_color(value);
  120. }
  121. });
  122. (<any>$('#background_color_selector')).colorselector({
  123. callback: function (value, color, title) {
  124. $("#background-color").val(title);
  125. set_background_color(value);
  126. }
  127. });
  128. // Styling
  129. $(".dropdown-colorselector").addClass("input-group-addon color-input-addon");
  130. }
  131. function set_card_color(value) {
  132. var card = selected_card();
  133. if (card) {
  134. card.color = value;
  135. render_selected_card();
  136. }
  137. }
  138. function set_default_color(color) {
  139. options.default_color = color;
  140. render_selected_card();
  141. }
  142. function set_foreground_color(color) {
  143. options.foreground_color = color;
  144. }
  145. function set_background_color(color) {
  146. options.background_color = color;
  147. }
  148. function update_card_color_selector(color, input, selector) {
  149. if ($(selector + " option[value='" + color + "']").length > 0) {
  150. // Update the color selector to the entered value
  151. (<any>$(selector)).colorselector("setValue", color);
  152. } else {
  153. // Unknown color - select a neutral color and reset the text value
  154. (<any>$(selector)).colorselector("setValue", "");
  155. input.val(color);
  156. }
  157. }
  158. // ============================================================================
  159. // Card values
  160. // ============================================================================
  161. function on_change_card_title() {
  162. var title = $("#card-title").val();
  163. var card = selected_card();
  164. if (card) {
  165. card.title = title;
  166. $("#selected-card option:selected").text(title);
  167. render_selected_card();
  168. }
  169. }
  170. function on_change_card_color() {
  171. var input = $(this);
  172. var color = input.val();
  173. update_card_color_selector(color, input, "#card_color_selector");
  174. set_card_color(color);
  175. }
  176. function on_change_card_property() {
  177. var property = $(this).attr("data-property");
  178. var value = $(this).val();
  179. var card = selected_card();
  180. if (card) {
  181. card[property] = value;
  182. render_selected_card();
  183. }
  184. }
  185. function on_change_card_contents() {
  186. // var value = $(this).val();
  187. var value = editor.getValue();
  188. var card = selected_card();
  189. if (card) {
  190. card.contents = value.split("\n");
  191. render_selected_card();
  192. }
  193. }
  194. function on_change_card_tags() {
  195. var value = $(this).val();
  196. var card = selected_card();
  197. if (card) {
  198. if (value.trim().length == 0) {
  199. card.tags = [];
  200. } else {
  201. card.tags = value.split(",").map(function (val) {
  202. return val.trim().toLowerCase();
  203. });
  204. }
  205. render_selected_card();
  206. }
  207. }
  208. // ============================================================================
  209. // Global default values
  210. // ============================================================================
  211. function on_change_option() {
  212. var property = $(this).attr("data-option");
  213. var value = $(this).val();
  214. options[property] = value;
  215. render_selected_card();
  216. }
  217. function on_change_default_color() {
  218. var input = $(this);
  219. var color = input.val();
  220. update_card_color_selector(color, input, "#default_color_selector");
  221. set_default_color(color);
  222. }
  223. function on_change_default_icon() {
  224. var value = $(this).val();
  225. options.default_icon = value;
  226. render_selected_card();
  227. }
  228. function on_change_default_title_size() {
  229. options.default_title_size = $(this).val();
  230. render_selected_card();
  231. }
  232. function on_change_default_icon_size() {
  233. options.icon_inline = $(this).is(':checked');
  234. render_selected_card();
  235. }
  236. // ============================================================================
  237. // Map/Filter
  238. // ============================================================================
  239. function apply_default_color() {
  240. deck.cards.forEach((card) => {
  241. card.color = options.default_color;
  242. });
  243. render_selected_card();
  244. }
  245. function apply_default_icon() {
  246. deck.cards.forEach((card) => {
  247. card.icon = options.default_icon;
  248. });
  249. render_selected_card();
  250. }
  251. function apply_default_icon_back() {
  252. deck.cards.forEach((card) => {
  253. card.icon_back = options.default_icon;
  254. });
  255. render_selected_card();
  256. }
  257. function sort() {
  258. showModal("#sort-modal");
  259. }
  260. function sort_execute() {
  261. hideModal("#sort-modal");
  262. var fn_code = $("#sort-function").val();
  263. var fn = new Function("card_a", "card_b", fn_code);
  264. deck.cards = deck.cards.sort(function (card_a, card_b) {
  265. var result = fn(card_a, card_b);
  266. return result;
  267. });
  268. update_card_list();
  269. }
  270. function filter() {
  271. showModal("#filter-modal");
  272. }
  273. function filter_execute() {
  274. hideModal("#filter-modal");
  275. var fn_code = $("#filter-function").val();
  276. var fn = new Function("card", "deck", fn_code);
  277. deck.cards.forEach((card) => {
  278. fn(card, deck);
  279. });
  280. deck.commit();
  281. update_card_list();
  282. }
  283. // ============================================================================
  284. // Modals
  285. // ============================================================================
  286. function showModal(id: string) {
  287. (<any>$(id)).modal('show');
  288. }
  289. function hideModal(id: string) {
  290. (<any>$(id)).modal('hide');
  291. }
  292. // ============================================================================
  293. // I/O
  294. // ============================================================================
  295. function save_file() {
  296. var str = JSON.stringify(deck.toJSON(), null, " ");
  297. var parts = [str];
  298. var blob = new Blob(parts, { type: 'application/json' });
  299. var url = URL.createObjectURL(blob);
  300. var a = <HTMLLinkElement>$("#file-save-link")[0];
  301. a.href = url;
  302. (<any>a).download = "rpg_cards.json";
  303. a.click();
  304. setTimeout(function () { URL.revokeObjectURL(url); }, 1000);
  305. }
  306. function load_sample() {
  307. deck = RpgCards.CardDeck.fromJSON(card_data_example);
  308. update_card_list();
  309. }
  310. function clear_all() {
  311. deck = new RpgCards.CardDeck();
  312. update_card_list();
  313. }
  314. function ui_load_files(evt) {
  315. // ui_clear_all();
  316. var files = evt.target.files;
  317. for (var i = 0, f; f = files[i]; i++) {
  318. var reader = new FileReader();
  319. reader.onload = function (reader) {
  320. var data = JSON.parse(this.result);
  321. var deck = RpgCards.CardDeck.fromJSON(data);
  322. add_cards(deck.cards);
  323. };
  324. reader.readAsText(f);
  325. }
  326. // Reset file input
  327. (<any>$("#file-load-form")[0]).reset();
  328. }
  329. function add_cards(cards: RpgCards.Card[]) {
  330. deck.addCards(cards);
  331. update_card_list();
  332. }
  333. function add_new_card() {
  334. deck.addNewCard();
  335. update_card_list();
  336. select_card_by_index(deck.cards.length - 1);
  337. }
  338. function duplicate_card() {
  339. var newCard = null;
  340. if (deck.cards.length > 0) {
  341. var old_card = selected_card();
  342. newCard = deck.duplicateCard(old_card);
  343. } else {
  344. newCard = deck.addNewCard();
  345. }
  346. update_card_list();
  347. select_card_by_card(newCard);
  348. }
  349. function delete_card() {
  350. var index = selected_card_index();
  351. var card = selected_card();
  352. deck.deleteCard(card);
  353. update_card_list();
  354. select_card_by_index(Math.min(index, deck.cards.length - 1));
  355. }
  356. // ============================================================================
  357. // Menu
  358. // ============================================================================
  359. function open_help() {
  360. showModal("#help-modal");
  361. }
  362. function select_icon() {
  363. window.open("http://game-icons.net/", "_blank");
  364. }
  365. var generate_modal_shown = false;
  366. function generate() {
  367. if (deck.cards.length === 0) {
  368. alert("Your deck is empty. Please define some cards first, or load the sample deck.");
  369. return;
  370. }
  371. // Generate output HTML
  372. var card_html = pageGenerator.generateHtml(deck.cards, options);
  373. // Open a new window for the output
  374. // Use a separate window to avoid CSS conflicts
  375. var tab = window.open("output.html", 'rpg-cards-output');
  376. if (generate_modal_shown == false) {
  377. showModal("#print-modal");
  378. generate_modal_shown = true;
  379. }
  380. // Send the generated HTML to the new window
  381. // Use a delay to give the new window time to set up a message listener
  382. setTimeout(function () { tab.postMessage(card_html, '*') }, 500);
  383. }
  384. export function collapse_menu() {
  385. $("#menu-column").hide();
  386. $("#card-column").removeClass("col-lg-5");
  387. $("#card-column").addClass("col-lg-8");
  388. }
  389. export function uncollapse_menu() {
  390. $("#menu-column").show();
  391. $("#card-column").removeClass("col-lg-8");
  392. $("#card-column").addClass("col-lg-5");
  393. }
  394. // ============================================================================
  395. // Initialization
  396. // ============================================================================
  397. function init() {
  398. deck = new RpgCards.CardDeck();
  399. options = new RpgCards.Options();
  400. cardGenerator = new RpgCards.CardHtmlGenerator;
  401. pageGenerator = new RpgCards.PageHtmlGenerator;
  402. editor = ace.edit("card-contents");
  403. editor.setShowInvisibles(true);
  404. editor.renderer.setShowGutter(false);
  405. (<any>editor).setOption("wrap", "free");
  406. editor.setTheme("ace/theme/chrome");
  407. editor.getSession().setMode("ace/mode/rpgcard");
  408. setup_color_selector();
  409. (<any>$('.icon-list')).typeahead({ source: icon_names });
  410. // Menu
  411. $("#sort-execute").click(sort_execute);
  412. $("#filter-execute").click(filter_execute);
  413. $("#button-generate").click(generate);
  414. $("#button-load").click(function () { $("#file-load").click(); });
  415. $("#file-load").change(ui_load_files);
  416. $("#button-clear").click(clear_all);
  417. $("#button-load-sample").click(load_sample);
  418. $("#button-save").click(save_file);
  419. $("#button-sort").click(sort);
  420. $("#button-filter").click(filter);
  421. $("#button-add-card").click(add_new_card);
  422. $("#button-duplicate-card").click(duplicate_card);
  423. $("#button-delete-card").click(delete_card);
  424. $("#button-help").click(open_help);
  425. $("#button-apply-color").click(apply_default_color);
  426. $("#button-apply-icon").click(apply_default_icon);
  427. $("#button-apply-icon-back").click(apply_default_icon_back);
  428. $("#selected-card").change(update_selected_card);
  429. $("#card-title").change(on_change_card_title);
  430. $("#card-title-size").change(on_change_card_property);
  431. $("#card-title-icon-text").change(on_change_card_property);
  432. $("#card-icon").change(on_change_card_property);
  433. $("#card-count").change(on_change_card_property);
  434. $("#card-icon-back").change(on_change_card_property);
  435. $("#card-color").change(on_change_card_color);
  436. editor.getSession().on('change', on_change_card_contents);
  437. //$("#card-contents").change(on_change_card_contents);
  438. $("#card-tags").change(on_change_card_tags);
  439. // Global options
  440. $("#page-size").change(on_change_option);
  441. $("#page-rows").change(on_change_option);
  442. $("#page-columns").change(on_change_option);
  443. $("#card-arrangement").change(on_change_option);
  444. $("#card-size").change(on_change_option);
  445. $("#background-color").change(on_change_option);
  446. $("#default-color").change(on_change_default_color);
  447. $("#default-icon").change(on_change_default_icon);
  448. $("#default-title-size").change(on_change_default_title_size);
  449. $("#small-icons").change(on_change_default_icon_size);
  450. $(".icon-select-button").click(select_icon);
  451. update_card_list();
  452. }
  453. $(document).ready(function () {
  454. init();
  455. });
  456. }