OSDN Git Service

t#31144:add writing_format
[pettanr/pettanr.git] / app / assets / javascripts / panels.js.coffee
1 $ ->\r
2   confirm_confirm_confirm = () ->\r
3     confirm(  )\r
4   new_element_index = {}\r
5   new_element_index[pettanr_current_panel_id] = 0\r
6   \r
7   set_tree_value = (keys, last_attr, value) ->\r
8     key = keys.shift()\r
9     if keys.length <= 0\r
10       last_attr[key] = value\r
11     else\r
12       last_attr[key] = last_attr[key] || {}\r
13       set_tree_value(keys, last_attr[key], value)\r
14 \r
15   repeat_texts = ['repeat', 'repeat-x', 'repeat-y', 'no-repeat']\r
16   \r
17   is_editable = (p) ->\r
18     if p.parent().attr('editable')\r
19       return true\r
20     else\r
21       return false\r
22   is_var = (o) ->\r
23     if parseInt(o.attr('no_attr')) > 0\r
24       return false\r
25     else\r
26       if o.attr('column') \r
27         if o.attr('column') == '_destroy' and o.val().length < 1\r
28           return false\r
29         else\r
30           return true\r
31       else\r
32         return false\r
33   is_element = (o) ->\r
34     if o.attr('element_type')\r
35       return true\r
36     else\r
37       return false\r
38   is_element_part = (o) ->\r
39     if o.attr('element_part_type')\r
40       return true\r
41     else\r
42       return false\r
43   element_types  = {'panel_picture': 'panel_pictures', 'speech_balloon': 'speech_balloons', 'ground_picture': 'ground_pictures', 'ground_color': 'ground_colors'}\r
44   element_type_to_table = (element_type) ->\r
45     element_types[element_type]\r
46   make_tree = (attr, o) ->\r
47     if is_var(o)\r
48       tree = 'panels-' + o.attr('panel_id') + '-'\r
49       if is_element(o)\r
50         tree = tree + element_type_to_table(o.attr('element_type')) + '_attributes-' + o.attr('element_id') + '-'\r
51         if is_element_part(o)\r
52           tree = tree + o.attr('element_part_type') + '_attributes-'\r
53       tree = tree + o.attr('column')\r
54       keys = tree.split('-')\r
55       set_tree_value(keys, attr, o.val())\r
56   \r
57   panel_tag_id = (element) ->\r
58     '#panel' + element.attr('panel_id')\r
59   \r
60   element_tag_id = (element) ->\r
61     '#panel' + element.attr('panel_id') + element.attr('element_type') + element.attr('element_id')\r
62   \r
63   refresh_attribute = () ->\r
64     attr = {}\r
65     $('input').map ->\r
66       make_tree(attr, $(@))\r
67     $('textarea').map  ->\r
68       make_tree(attr, $(@))\r
69     $('select').map ->\r
70       make_tree(attr, $(@))\r
71     $('#pettanr-panel-json').val(JSON.stringify(attr['panels'][pettanr_current_panel_id.toString() ]))\r
72   \r
73   $('#tabs').tabs()\r
74   $('#elements-tabs').tabs()\r
75   $('#new-element-tabs').tabs()\r
76   $('#new-speech_balloon-tabs').tabs()\r
77   $('#elements-tabs').addClass( "ui-tabs-vertical ui-helper-clearfix" )\r
78   $("#elements-tabs li").removeClass("ui-corner-top")\r
79   $("#elements-tabs li").addClass("ui-corner-left")\r
80   $("#elements-tabs li").map ->\r
81     $(@).mouseover -> \r
82       switch $(@).attr('element_type')\r
83         when 'speech_balloon'\r
84           trace = element_tag_id($(@)) \r
85           t = $('img', $(trace))\r
86         when 'panel_picture'\r
87           trace = element_tag_id($(@)) + 'img'\r
88           t = $(trace)\r
89         else\r
90           t = null\r
91       if t\r
92         $('.ui-resizable-handle', t.parent()).map ->\r
93           $(@).css('display', 'block')\r
94     $(@).mouseout -> \r
95       switch $(@).attr('element_type')\r
96         when 'speech_balloon'\r
97           trace = element_tag_id($(@)) \r
98           t = $('img', $(trace))\r
99         when 'panel_picture'\r
100           trace = element_tag_id($(@)) + 'img'\r
101           t = $(trace)\r
102         else\r
103           t = null\r
104       if t\r
105         $('.ui-resizable-handle', t.parent()).map ->\r
106           $(@).css('display', 'none')\r
107   \r
108   #destroy button\r
109   $('.ui-icon-destroy').map ->\r
110     $(@).button {\r
111       icons: {\r
112         primary: 'ui-icon-close', \r
113         secondary: null\r
114       }, \r
115       text: false\r
116     }\r
117     $(@).click -> \r
118       if confirm('destroy ?')\r
119         trace = element_tag_id($(@))\r
120         $(trace + '_destroy').val('true')\r
121         panel_trace = panel_tag_id($(@))\r
122         update_t(panel_trace + 'tsort')\r
123         update_z(panel_trace + 'zsort')\r
124         # sync\r
125         $(trace + 'element_tab').css('display', 'none')\r
126         $(trace + 'tab_panel').css('display', 'none')\r
127         $(trace + 'zsort').css('display', 'none')\r
128         $(trace + 'tsort').css('display', 'none')\r
129         switch $(@).attr('element_type')\r
130           when 'panel_picture'\r
131             trace = trace + 'div'\r
132         $(trace).css('display', 'none')\r
133         \r
134   \r
135   $('#pettanr-panel-submit').focusin ->\r
136     refresh_attribute()\r
137   \r
138   # panel\r
139   $('.pettanr-comic-panel').map ->\r
140     if is_editable($(@))\r
141       $(@).resizable {\r
142         stop: ( event, ui ) ->\r
143           trace = panel_tag_id($(@))\r
144           w = parseInt($(@).width())\r
145           h = parseInt($(@).height())\r
146           $(trace + 'width').val(w)\r
147           $(trace + 'height').val(h)\r
148           $('.pettanr-comic-ground-picture').map ->\r
149             $(@).width(w)\r
150             $(@).height(h)\r
151           $('.pettanr-comic-ground-color').map ->\r
152             $(@).width(w)\r
153             $(@).height(h)\r
154         , autoHide: true\r
155       }\r
156   # sync view \r
157   $('#panel' + pettanr_current_panel_id.toString() +  'width').focusout ->\r
158     trace = '#panel' + $(@).attr('panel_id')\r
159     $(trace).width(parseInt( $(@).val()))\r
160   \r
161   $('#panel' + pettanr_current_panel_id.toString() + 'height').focusout ->\r
162     trace = '#panel' + $(@).attr('panel_id')\r
163     $(trace).height(parseInt( $(@).val()))\r
164   \r
165   $('#panel' + pettanr_current_panel_id.toString() + 'border').focusout ->\r
166     trace = '#panel' + $(@).attr('panel_id')\r
167     $(trace).css('border-width', parseInt($(@).val()).toString() + 'px')\r
168   \r
169   \r
170   # panel picture\r
171   $('.pettanr-panel-picture-wrapper').map ->\r
172     $(@).draggable {\r
173       stop: ( event, ui ) ->\r
174         trace = '#panel' + $(@).attr('panel_id') + 'panel_picture' + $(@).attr('element_id')\r
175         img = '#panel' + $(@).attr('panel_id') + 'panel_picture' + $(@).attr('element_id') + 'img'\r
176         left = $(img).parent().position().left + $(@).position().left\r
177         top = $(img ).parent().position().top + $(@).position().top\r
178         $(trace + 'x').val(parseInt(left))\r
179         $(trace + 'y').val(parseInt(top))\r
180     }\r
181   \r
182   $('.panel-picture').map ->\r
183     $(@).resizable {\r
184       stop: ( event, ui ) ->\r
185         trace = '#panel' + $(@).parent().attr('panel_id') + 'panel_picture' + $(@).parent().attr('element_id')\r
186         $(trace + 'width').val($(@).width())\r
187         $(trace + 'height').val($(@).height())\r
188       handles: 'all',\r
189       autoHide: true\r
190     }\r
191   \r
192   refresh_picture = (e, w, h)  ->\r
193     if w and h\r
194       sd = ''\r
195       if h < 0\r
196         sd += 'v'\r
197       if w < 0\r
198         sd += 'h'\r
199       if sd.length > 0\r
200         sd += '/'\r
201       pid = parseInt(e.attr('picture_id')).toString()\r
202       ext = e.attr('ext')\r
203       src = '/pictures/' + sd + pid + '.' + ext\r
204       e.attr('src', src)\r
205   \r
206   # sync view \r
207   $('input').map  ->\r
208     if $(@).attr('element_type') and $(@).attr('element_type') == 'panel_picture'\r
209       $(@).focusout ->\r
210         switch $(@).attr('column')\r
211           when 'x'\r
212             trace = element_tag_id($(@)) + 'div'\r
213             v = parseInt($(@).val()).toString() + 'px'\r
214             $(trace).css('left', v)\r
215           when 'y'\r
216             trace = element_tag_id($(@)) + 'div'\r
217             v = parseInt($(@).val()).toString() + 'px'\r
218             $(trace).css('top', v)\r
219           when 'width'\r
220             trace = element_tag_id($(@)) + 'img'\r
221             w = parseInt($(@).val())\r
222             $(trace).width(Math.abs(w))\r
223             $(trace).parent().width(Math.abs(w))\r
224             h = parseInt($(element_tag_id($(@)) + 'height').val())\r
225           when 'height'\r
226             trace = element_tag_id($(@)) + 'img'\r
227             h = parseInt($(@).val())\r
228             $(trace).height(Math.abs(h))\r
229             $(trace).parent().height(Math.abs(h))\r
230             w = parseInt($(element_tag_id($(@)) + 'width').val())\r
231           else\r
232         refresh_picture($(trace), w, h)\r
233     else\r
234   \r
235   # speech_balloons\r
236   $('.pettanr-comic-balloon' ).map ->\r
237     $(@).draggable {\r
238       stop: ( event, ui ) ->\r
239         trace = '#panel' + $(@).attr('panel_id') + 'speech_balloon' + $(@).attr('element_id') + 'balloon' + $(@).attr('balloon_id')\r
240         left = $(@).position().left\r
241         top = $(@).position().top\r
242         $(trace + 'x').val(parseInt(left))\r
243         $(trace + 'y').val(parseInt(top))\r
244     }\r
245 \r
246   \r
247   $('.pettanr-balloon' ).map ->\r
248     $(@).resizable {\r
249       stop: ( event, ui ) ->\r
250         trace = '#panel' + $(@).parent().attr('panel_id') + 'speech_balloon' + $(@).parent().attr('element_id') + 'balloon' + $(@).parent().attr('balloon_id')\r
251         $(trace + 'width').val($(@).width())\r
252         $(trace + 'height').val($(@).height())\r
253      resize: ( event, ui ) ->\r
254         trace = '#panel' + $(@).parent().attr('panel_id') + 'speech_balloon' + $(@).parent().attr('element_id')\r
255         $(trace).width($(@).width())\r
256         $(trace).height($(@).height())\r
257       handles: 'all',\r
258       autoHide: true\r
259     }\r
260   $('.pettanr-comic-balloon span' ).map ->\r
261     p = $(@).parent()\r
262     sb = p.parent()\r
263     sb.mouseover -> \r
264       trace = '#panel' + $(@).attr('panel_id') + 'speech_balloon' + $(@).attr('element_id') + 'balloon' + $(@).attr('balloon_id')\r
265       img = $(trace)\r
266       $('.ui-resizable-handle', img.parent()).map ->\r
267         $(@).css('display', 'block')\r
268     sb.mouseout -> \r
269       trace = '#panel' + $(@).attr('panel_id') + 'speech_balloon' + $(@).attr('element_id') + 'balloon' + $(@).attr('balloon_id')\r
270       img = $(trace)\r
271       $('.ui-resizable-handle', img.parent()).map ->\r
272         $(@).css('display', 'none')\r
273         \r
274   \r
275   # sync view \r
276   $('input').map  ->\r
277     if $(@).attr('element_type') and $(@).attr('element_type') == 'speech_balloon'\r
278       $(@).focusout ->\r
279         switch $(@).attr('column')\r
280           when 'x'\r
281             trace = element_tag_id($(@))\r
282             v = parseInt($(@).val()).toString() + 'px'\r
283             $(trace).css('left', v)\r
284           when 'y'\r
285             trace = element_tag_id($(@))\r
286             v = parseInt($(@).val()).toString() + 'px'\r
287             $(trace).css('top', v)\r
288           when 'width'\r
289             trace = element_tag_id($(@))\r
290             v = parseInt($(@).val())\r
291             $(trace).width(Math.abs(v))\r
292             trace = '#panel' + $(trace).attr('panel_id') + 'speech_balloon' + $(trace).attr('element_id') + 'balloon' + $(trace).attr('balloon_id')\r
293             $(trace).parent().width(v)\r
294             $(trace).width(v)\r
295           when 'height'\r
296             trace = element_tag_id($(@))\r
297             v = parseInt($(@).val())\r
298             $(trace).height(Math.abs(v))\r
299             trace = '#panel' + $(trace).attr('panel_id') + 'speech_balloon' + $(trace).attr('element_id') + 'balloon' + $(trace).attr('balloon_id')\r
300             $(trace).parent().height(v)\r
301             $(trace).height(v)\r
302           else\r
303     else\r
304   $('textarea').map  ->\r
305     if $(@).attr('element_type') and $(@).attr('element_type') == 'speech_balloon'\r
306       $(@).focusout ->\r
307         switch $(@).attr('column')\r
308           when 'content'\r
309             trace = '#panel' + $(@).attr('panel_id') + 'speech_balloon' + $(@).attr('element_id') + 'speech' + $(@).attr('element_part_id')\r
310             wf_sel = $(trace + 'writing_format_id')\r
311             wf_id = parseInt(wf_sel.val())\r
312             v = writing_format_functions[writing_formats[wf_id]]($(@).val())\r
313             $(trace).html(v)\r
314   $('textarea').map  ->\r
315     if $(@).attr('element_type') and $(@).attr('element_type') == 'speech_balloon'\r
316       switch $(@).attr('column')\r
317         when 'content'\r
318           $(@).bind('textchange', (event, previousText) ->\r
319             trace = '#panel' + $(@).attr('panel_id') + 'speech_balloon' + $(@).attr('element_id') + 'speech' + $(@).attr('element_part_id')\r
320             wf_sel = $(trace + 'writing_format_id')\r
321             wf_id = parseInt(wf_sel.val())\r
322             v = writing_format_functions[writing_formats[wf_id]]($(@).val())\r
323             $(trace).html(v)\r
324           )\r
325 \r
326   \r
327   # ground-picture\r
328   # sync view \r
329   $('input').map  ->\r
330     if $(@).attr('element_type') and $(@).attr('element_type') == 'ground_picture'\r
331       $(@).focusout ->\r
332         switch $(@).attr('column')\r
333           when 'x', 'y'\r
334             trace = element_tag_id($(@))\r
335             x = parseInt($(@).val()).toString() + 'px'\r
336             ytrace = '#panel' + $(@).attr('panel_id') + 'ground_picture' + $(@).attr('element_id') + 'y'\r
337             y = parseInt($(ytrace).val()).toString() + 'px'\r
338             $(trace).css('background-position', y + ' ' + x)\r
339   $('select').map  ->\r
340     if $(@).attr('element_type') and $(@).attr('element_type') == 'ground_picture'\r
341       $(@).change ->\r
342         switch $(@).attr('column')\r
343           when 'repeat'\r
344             trace = element_tag_id($(@))\r
345             v = parseInt($(@).val())\r
346             $(trace).css('background-repeat', repeat_texts[v])\r
347     else\r
348   \r
349   \r
350   # ground_color\r
351   # sync view \r
352   $('input').map  ->\r
353     if $(@).attr('element_type') and $(@).attr('element_type') == 'ground_color' and $(@).attr('column') == 'code'\r
354       $(@).hide()\r
355 \r
356   color_slider_change = (trace) -> \r
357     red = $(trace + 'code_red').slider('value')\r
358     green = $(trace + 'code_green').slider('value')\r
359     blue = $(trace + 'code_blue').slider('value')\r
360     code = (red << 16) + (green << 8) + (blue)\r
361     phex = "000000" + code.toString(16)\r
362     hex = code.toString(16)\r
363     h = phex.substring(phex.length - 6)\r
364     $(trace + 'code_swatch').css('background-color', '#' + h)\r
365     $(trace + 'code_hex').html('HEX: #' + h)\r
366     $(trace + 'code_rgb').html('RGB: (' + red + ',' + green + ',' +blue + ')')\r
367     $(trace + 'code').val(code)\r
368     v = '#' + h\r
369     $(trace).css('background-color', v)\r
370   \r
371   $('.colorpicker').map -> \r
372     code_picker_trace = element_tag_id($(@))\r
373     code = parseInt($(code_picker_trace + 'code').val())\r
374     red = (code >> 16) & 0xFF\r
375     green = (code >> 8) & 0xFF\r
376     blue = code & 0xFF\r
377     $(code_picker_trace + 'code_red').slider {\r
378       orientation: 'horizontal',\r
379       range: 'min',\r
380       max: 255,\r
381       value: red,\r
382       change: ( event, ui ) ->\r
383         trace = element_tag_id($(@).parent())\r
384         color_slider_change(trace)\r
385     }\r
386     $(code_picker_trace + 'code_green').slider {\r
387       orientation: 'horizontal',\r
388       range: 'min',\r
389       max: 255,\r
390       value: green,\r
391       change: ( event, ui ) ->\r
392         trace = element_tag_id($(@).parent())\r
393         color_slider_change(trace)\r
394     }\r
395     $(code_picker_trace + 'code_blue').slider {\r
396       orientation: 'horizontal',\r
397       range: 'min',\r
398       max: 255,\r
399       value: blue,\r
400       change: ( event, ui ) ->\r
401         trace = element_tag_id($(@).parent())\r
402         color_slider_change(trace)\r
403     }\r
404     color_slider_change(code_picker_trace)\r
405   $('.colorpicker-wrap').map -> \r
406     $(@).css('display', 'block')\r
407   \r
408   update_t = (ultrace) -> \r
409     t = 0\r
410     $(ultrace + ' li').map ->\r
411       trace = element_tag_id($(@))\r
412       if $(trace + '_destroy').val().length < 1\r
413         $(trace + 't').val(t)\r
414         t++\r
415       else\r
416   \r
417   $('.tsort').map -> \r
418     $(@).sortable {\r
419       update: ( event, ui ) ->\r
420         trace = panel_tag_id($(@))\r
421         update_t(trace + 'tsort')\r
422     }\r
423   $('.t-sort li').map -> \r
424     $(@).disableSelection()\r
425   \r
426   update_z = (ultrace) -> \r
427     z = 1\r
428     $(ultrace + ' li').map ->\r
429       trace = element_tag_id($(@))\r
430       # update panel\r
431       if $(trace + '_destroy').val().length < 1\r
432         $(trace + 'z').val(z)\r
433         switch $(@).attr('element_type')\r
434           when 'panel_picture'\r
435             trace = trace + 'div'\r
436         $(trace).css('zIndex', z)\r
437         z++\r
438       else\r
439   \r
440   $('.zsort').map -> \r
441     $(@).sortable {\r
442       update: ( event, ui ) ->\r
443         trace = panel_tag_id($(@))\r
444         update_z(trace + 'zsort')\r
445     }\r
446   $('.z-sort li').map -> \r
447     $(@).disableSelection()\r
448   \r
449   $('.panel_picture_width_tool').map ->\r
450     $(@).html('<button class="wreverse">Rev</button><button class="wdouble">x2</button><button class="whalf">/2</button>')\r
451   \r
452   $('.wreverse').click -> \r
453     d = $(@).parent()\r
454     trace = element_tag_id(d)\r
455     f = $(trace + 'width')\r
456     w = -f.val()\r
457     f.val(w)\r
458     f = $(trace + 'height')\r
459     h = f.val()\r
460     refresh_picture($(trace + 'img'), w, h)\r
461   \r
462   $('.wdouble').click -> \r
463     d = $(@).parent()\r
464     trace = element_tag_id(d)\r
465     f = $(trace + 'width')\r
466     w = f.val() * 2\r
467     f.val(w)\r
468     $(trace + 'img').width(Math.abs(w))\r
469     $(trace + 'img').parent().width(Math.abs(w))\r
470   \r
471   $('.whalf').click -> \r
472     d = $(@).parent()\r
473     trace = element_tag_id(d)\r
474     f = $(trace + 'width')\r
475     w = Math.floor(f.val() / 2)\r
476     f.val(w)\r
477     $(trace + 'img').width(Math.abs(w))\r
478     $(trace + 'img').parent().width(Math.abs(w))\r
479   \r
480   $('.panel_picture_height_tool').map ->\r
481     $(@).html('<button class="hreverse">Rev</button><button class="hdouble">x2</button><button class="hhalf">/2</button>')\r
482   \r
483   $('.hreverse').click -> \r
484     d = $(@).parent()\r
485     trace = element_tag_id(d)\r
486     f = $(trace + 'height')\r
487     h = -f.val()\r
488     f.val(h)\r
489     f = $(trace + 'width')\r
490     w = f.val()\r
491     refresh_picture($(trace + 'img'), w, h)\r
492   \r
493   $('.hdouble').click -> \r
494     d = $(@).parent()\r
495     trace = element_tag_id(d)\r
496     f = $(trace + 'height')\r
497     h = f.val() * 2\r
498     f.val(h)\r
499     $(trace + 'img').height(Math.abs(h))\r
500     $(trace + 'img').parent().height(Math.abs(h))\r
501   \r
502   $('.hhalf').click -> \r
503     d = $(@).parent()\r
504     trace = element_tag_id(d)\r
505     f = $(trace + 'height')\r
506     h = Math.floor(f.val() / 2)\r
507     f.val(h)\r
508     $(trace + 'img').height(Math.abs(h))\r
509     $(trace + 'img').parent().height(Math.abs(h))\r
510   \r
511   # all\r
512   # disable form actions\r
513   # hide submit buttons\r
514   $('.edit_panel_picture' ).map ->\r
515     $(@).submit ->\r
516       false\r
517   $('.edit_speech_balloon' ).map ->\r
518     $(@).submit ->\r
519       false\r
520   $('.edit_ground_picture' ).map ->\r
521     $(@).submit ->\r
522       false\r
523   $('.edit_ground_color' ).map ->\r
524     $(@).submit ->\r
525       false\r
526   \r
527   $('.edit_panel' ).map ->\r
528     if $(@).attr('jqform')\r
529     else\r
530       $(@).submit ->\r
531         false\r
532   \r
533   $('.submit' ).map ->\r
534     $(@).hide()\r
535   \r
536   # disable form z t\r
537   $('input').map  ->\r
538     if $(@).attr('element_type') and $(@).attr('column')\r
539       switch $(@).attr('column')\r
540         when 'z' , 't'\r
541           $(@).hide()\r
542           $(@).parent().hide() #label\r
543   \r
544   # add button on new form\r
545   $('.submit-new-form').map ->\r
546     $(@).html('<button class="new-element">add</button>')\r
547   \r
548   $('.new-element').map ->\r
549     $(@).click -> \r
550       false\r
551   \r