OSDN Git Service

t#31650:remove tree
[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   escapeHTML = (t) ->\r
8     $("<div/>").text(t).html()\r
9 \r
10   set_tree_value = (keys, last_attr, value) ->\r
11     key = keys.shift()\r
12     if keys.length <= 0\r
13       last_attr[key] = value\r
14     else\r
15       last_attr[key] = last_attr[key] || {}\r
16       set_tree_value(keys, last_attr[key], value)\r
17 \r
18   repeat_texts = ['repeat', 'repeat-x', 'repeat-y', 'no-repeat']\r
19   \r
20   is_editable = (p) ->\r
21     if p.parent().attr('editable')\r
22       return true\r
23     else\r
24       return false\r
25   is_var = (o) ->\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 = element_tag_id($(@))\r
310             speech_trace = '#panel' + $(@).attr('panel_id') + 'speech_balloon' + $(@).attr('element_id') + 'speech' + $(@).attr('element_part_id')\r
311             v = escapeHTML($(@).val())\r
312             $(speech_trace).html(v)\r
313   \r
314   # ground-picture\r
315   # sync view \r
316   $('input').map  ->\r
317     if $(@).attr('element_type') and $(@).attr('element_type') == 'ground_picture'\r
318       $(@).focusout ->\r
319         switch $(@).attr('column')\r
320           when 'x', 'y'\r
321             trace = element_tag_id($(@))\r
322             x = parseInt($(@).val()).toString() + 'px'\r
323             ytrace = '#panel' + $(@).attr('panel_id') + 'ground_picture' + $(@).attr('element_id') + 'y'\r
324             y = parseInt($(ytrace).val()).toString() + 'px'\r
325             $(trace).css('background-position', y + ' ' + x)\r
326   $('select').map  ->\r
327     if $(@).attr('element_type') and $(@).attr('element_type') == 'ground_picture'\r
328       $(@).change ->\r
329         switch $(@).attr('column')\r
330           when 'repeat'\r
331             trace = element_tag_id($(@))\r
332             v = parseInt($(@).val())\r
333             $(trace).css('background-repeat', repeat_texts[v])\r
334     else\r
335   \r
336   \r
337   # ground_color\r
338   # sync view \r
339   $('input').map  ->\r
340     if $(@).attr('element_type') and $(@).attr('element_type') == 'ground_color' and $(@).attr('column') == 'code'\r
341       $(@).hide()\r
342 \r
343   color_slider_change = (trace) -> \r
344     red = $(trace + 'code_red').slider('value')\r
345     green = $(trace + 'code_green').slider('value')\r
346     blue = $(trace + 'code_blue').slider('value')\r
347     code = (red << 16) + (green << 8) + (blue)\r
348     phex = "000000" + code.toString(16)\r
349     hex = code.toString(16)\r
350     h = phex.substring(phex.length - 6)\r
351     $(trace + 'code_swatch').css('background-color', '#' + h)\r
352     $(trace + 'code_hex').html('HEX: #' + h)\r
353     $(trace + 'code_rgb').html('RGB: (' + red + ',' + green + ',' +blue + ')')\r
354     $(trace + 'code').val(code)\r
355     v = '#' + h\r
356     $(trace).css('background-color', v)\r
357   \r
358   $('.colorpicker').map -> \r
359     code_picker_trace = element_tag_id($(@))\r
360     code = parseInt($(code_picker_trace + 'code').val())\r
361     red = (code >> 16) & 0xFF\r
362     green = (code >> 8) & 0xFF\r
363     blue = code & 0xFF\r
364     $(code_picker_trace + 'code_red').slider {\r
365       orientation: 'horizontal',\r
366       range: 'min',\r
367       max: 255,\r
368       value: red,\r
369       change: ( event, ui ) ->\r
370         trace = element_tag_id($(@).parent())\r
371         color_slider_change(trace)\r
372     }\r
373     $(code_picker_trace + 'code_green').slider {\r
374       orientation: 'horizontal',\r
375       range: 'min',\r
376       max: 255,\r
377       value: green,\r
378       change: ( event, ui ) ->\r
379         trace = element_tag_id($(@).parent())\r
380         color_slider_change(trace)\r
381     }\r
382     $(code_picker_trace + 'code_blue').slider {\r
383       orientation: 'horizontal',\r
384       range: 'min',\r
385       max: 255,\r
386       value: blue,\r
387       change: ( event, ui ) ->\r
388         trace = element_tag_id($(@).parent())\r
389         color_slider_change(trace)\r
390     }\r
391     color_slider_change(code_picker_trace)\r
392   $('.colorpicker-wrap').map -> \r
393     $(@).css('display', 'block')\r
394   \r
395   update_t = (ultrace) -> \r
396     t = 0\r
397     $(ultrace + ' li').map ->\r
398       trace = element_tag_id($(@))\r
399       if $(trace + '_destroy').val().length < 1\r
400         $(trace + 't').val(t)\r
401         t++\r
402       else\r
403   \r
404   $('.tsort').map -> \r
405     $(@).sortable {\r
406       update: ( event, ui ) ->\r
407         trace = panel_tag_id($(@))\r
408         update_t(trace + 'tsort')\r
409     }\r
410   $('.t-sort li').map -> \r
411     $(@).disableSelection()\r
412   \r
413   update_z = (ultrace) -> \r
414     z = 1\r
415     $(ultrace + ' li').map ->\r
416       trace = element_tag_id($(@))\r
417       # update panel\r
418       if $(trace + '_destroy').val().length < 1\r
419         $(trace + 'z').val(z)\r
420         switch $(@).attr('element_type')\r
421           when 'panel_picture'\r
422             trace = trace + 'div'\r
423         $(trace).css('zIndex', z)\r
424         z++\r
425       else\r
426   \r
427   $('.zsort').map -> \r
428     $(@).sortable {\r
429       update: ( event, ui ) ->\r
430         trace = panel_tag_id($(@))\r
431         update_z(trace + 'zsort')\r
432     }\r
433   $('.z-sort li').map -> \r
434     $(@).disableSelection()\r
435   \r
436   $('.panel_picture_width_tool').map ->\r
437     $(@).html('<button class="wreverse">Rev</button><button class="wdouble">x2</button><button class="whalf">/2</button>')\r
438   \r
439   $('.wreverse').click -> \r
440     d = $(@).parent()\r
441     trace = element_tag_id(d)\r
442     f = $(trace + 'width')\r
443     w = -f.val()\r
444     f.val(w)\r
445     f = $(trace + 'height')\r
446     h = f.val()\r
447     refresh_picture($(trace + 'img'), w, h)\r
448   \r
449   $('.wdouble').click -> \r
450     d = $(@).parent()\r
451     trace = element_tag_id(d)\r
452     f = $(trace + 'width')\r
453     w = f.val() * 2\r
454     f.val(w)\r
455     $(trace + 'img').width(Math.abs(w))\r
456     $(trace + 'img').parent().width(Math.abs(w))\r
457   \r
458   $('.whalf').click -> \r
459     d = $(@).parent()\r
460     trace = element_tag_id(d)\r
461     f = $(trace + 'width')\r
462     w = Math.floor(f.val() / 2)\r
463     f.val(w)\r
464     $(trace + 'img').width(Math.abs(w))\r
465     $(trace + 'img').parent().width(Math.abs(w))\r
466   \r
467   $('.panel_picture_height_tool').map ->\r
468     $(@).html('<button class="hreverse">Rev</button><button class="hdouble">x2</button><button class="hhalf">/2</button>')\r
469   \r
470   $('.hreverse').click -> \r
471     d = $(@).parent()\r
472     trace = element_tag_id(d)\r
473     f = $(trace + 'height')\r
474     h = -f.val()\r
475     f.val(h)\r
476     f = $(trace + 'width')\r
477     w = f.val()\r
478     refresh_picture($(trace + 'img'), w, h)\r
479   \r
480   $('.hdouble').click -> \r
481     d = $(@).parent()\r
482     trace = element_tag_id(d)\r
483     f = $(trace + 'height')\r
484     h = f.val() * 2\r
485     f.val(h)\r
486     $(trace + 'img').height(Math.abs(h))\r
487     $(trace + 'img').parent().height(Math.abs(h))\r
488   \r
489   $('.hhalf').click -> \r
490     d = $(@).parent()\r
491     trace = element_tag_id(d)\r
492     f = $(trace + 'height')\r
493     h = Math.floor(f.val() / 2)\r
494     f.val(h)\r
495     $(trace + 'img').height(Math.abs(h))\r
496     $(trace + 'img').parent().height(Math.abs(h))\r
497   \r
498   # all\r
499   # disable form actions\r
500   # hide submit buttons\r
501   $('.edit_panel_picture' ).map ->\r
502     $(@).submit ->\r
503       false\r
504   $('.edit_speech_balloon' ).map ->\r
505     $(@).submit ->\r
506       false\r
507   $('.edit_ground_picture' ).map ->\r
508     $(@).submit ->\r
509       false\r
510   $('.edit_ground_color' ).map ->\r
511     $(@).submit ->\r
512       false\r
513   \r
514   $('.edit_panel' ).map ->\r
515     if $(@).attr('jqform')\r
516     else\r
517       $(@).submit ->\r
518         false\r
519   \r
520   $('.submit' ).map ->\r
521     $(@).hide()\r
522   \r
523   # disable form z t\r
524   $('input').map  ->\r
525     if $(@).attr('element_type') and $(@).attr('column')\r
526       switch $(@).attr('column')\r
527         when 'z' , 't'\r
528           $(@).hide()\r
529           $(@).parent().hide() #label\r
530   \r
531   # add button on new form\r
532   $('.submit-new-form').map ->\r
533     $(@).html('<button class="new-element">add</button>')\r
534   \r
535   $('.new-element').map ->\r
536     $(@).click -> \r
537       false\r
538   \r