root/as3/gunyarapaint/trunk/gunyarapaint/src/org/libspark/gunyarapaint/controls/PenDetailControlScript.as

リビジョン 1458, 10.5 kB (コミッタ: tasuku, コミット時期: 5 年 前)

post layer_infos and palettes with json

Line 
1 import mx.containers.GridItem;
2 import mx.core.Application;
3 import mx.core.IFlexDisplayObject;
4 import mx.events.CloseEvent;
5 import mx.events.FlexEvent;
6 import mx.events.ListEvent;
7 import mx.events.SliderEvent;
8 import mx.managers.PopUpManager;
9
10 import org.libspark.gunyarapaint.entities.GPPen;
11 import org.sepy.controls.SColorPicker;
12 import org.sepy.events.SPickerEvent;
13
14 private var _pen:GPPen;
15
16 import mx.core.IFlexDisplayObject;
17 import flash.display.Graphics;
18 import flash.display.DisplayObject;
19 import org.libspark.gunyarapaint.controls.GPCanvas;
20 import flash.events.Event;
21 import org.libspark.gunyarapaint.controls.PenDetailControl;
22 mx.core.IFlexDisplayObject; // for not erase
23
24 private var gridItemPalette:GridItem;
25
26 public function init():void {
27   // 太さ
28   thicknessSlider.addEventListener(SliderEvent.CHANGE, thicknessSliderHandler);
29  
30   // PENモード変更ボタンたち
31   dropperButton.addEventListener(Event.CHANGE, dropperButtonHandler);
32   handtoolButton.addEventListener(Event.CHANGE, handtoolButtonHandler);
33   eraserButton.addEventListener(Event.CHANGE, eraserButtonHandler);
34  
35   // colorpicker出すボタン
36   colorPickerButton.addEventListener(FlexEvent.BUTTON_DOWN, colorPickerButtonHandler);
37  
38   // 透明度
39   alphaSlider.addEventListener(SliderEvent.CHANGE, alphaSliderHandler);
40
41   // 線種
42   penModeComboBox.dataProvider = [
43     {label: '手描き', data: GPPen.PEN_MODE_HAND },
44 /*    {label: 'スポイト', data: GPPen.PEN_MODE_DROPPER }, */
45     {label: '直線', data: GPPen.PEN_MODE_LINE },
46 /*    {label: '四角', data: GPPen.PEN_MODE_RECT },
47     {label: '円', data: GPPen.PEN_MODE_ELLIPSE },
48     {label: '角丸四角', data: GPPen.PEN_MODE_ROUND_RECT }, */
49     {label: 'ペイント', data: GPPen.PEN_MODE_FLOOD_FILL }
50   ];
51   penModeComboBox.addEventListener(ListEvent.CHANGE, penModeComboBoxHandler);
52  
53   // ブレンドモード
54   blendModeComboBox.dataProvider = [
55     {label: '通常', data: flash.display.BlendMode.NORMAL},
56     // {label: '消去', data: flash.display.BlendMode.ERASE}, // eraserButtonで設定させる
57     {label: '比較(暗)', data: flash.display.BlendMode.DARKEN},
58     {label: '乗算', data: flash.display.BlendMode.MULTIPLY},
59     {label: '比較(明)', data: flash.display.BlendMode.LIGHTEN},
60     {label: 'スクリーン', data: flash.display.BlendMode.SCREEN},
61     {label: '覆い焼き', data: flash.display.BlendMode.ADD},
62     {label: 'オーバーレイ', data: flash.display.BlendMode.OVERLAY},
63     {label: 'ハードライト', data: flash.display.BlendMode.HARDLIGHT},
64     {label: '差の絶対値', data: flash.display.BlendMode.DIFFERENCE},
65     {label: '除外', data: flash.display.BlendMode.SUBTRACT},
66     {label: '反転', data: flash.display.BlendMode.INVERT}];
67   blendModeComboBox.addEventListener(ListEvent.CHANGE, blendModeComboBoxHandler);
68
69   this._pen = new GPPen();
70   _pen.control = this;
71   gridItemPaletteClickHandler(1);
72 }
73
74 private function gridItemPaletteClickHandler(index:uint):void {
75   var pal:GridItem = this['gridItemPalette' + index];
76   if (gridItemPalette) {
77     gridItemPalette.setStyle('borderThickness', 1);
78     gridItemPalette.setStyle('borderColor', 0xb7babc);
79   }
80   pal.setStyle('borderThickness', 3);
81   pal.setStyle('borderColor', 0x000000);
82   gridItemPalette = pal;
83   _pen.color = gridItemPalette.getStyle('backgroundColor');
84   changePen();
85 }
86
87 private function colorPickerButtonHandler(evt:FlexEvent):void {
88   // FIXME: お絵かきのログにパレット変更も反映したい
89   var picker:SColorPicker = new SColorPicker();
90   picker.selectedColor = gridItemPalette.getStyle('backgroundColor');
91   picker.title = "パレットに入れる色を選んでください。";
92
93   // display the 'x' close button
94   picker.showCloseButton = true; 
95   // picker.add_swatch = true;
96   // picker.picker_enabled = true;
97  
98   picker.addEventListener(CloseEvent.CLOSE, function(event:CloseEvent):void { PopUpManager.removePopUp(IFlexDisplayObject(event.target)); } );
99   picker.addEventListener(SPickerEvent.CHANGING, pickerHandler);
100   picker.addEventListener(SPickerEvent.SWATCH_ADD, pickerHandler);
101   picker.addEventListener(Event.CHANGE, pickerHandler);
102
103   PopUpManager.addPopUp(picker, Application.application as DisplayObject, true);
104   PopUpManager.centerPopUp(picker);
105 }
106
107 private function pickerHandler(evt:Event):void {
108   if (evt.type == SPickerEvent.CHANGING) { // avoid bug of component
109   } else if (evt.type == SPickerEvent.SWATCH_ADD) {
110   } else if (evt.type == Event.CHANGE) {
111     _pen.color = SColorPicker(evt.target).selectedColor;
112     gridItemPalette.setStyle('backgroundColor', _pen.color);
113     PopUpManager.removePopUp(IFlexDisplayObject(evt.target));
114     changePen();
115   }
116 }
117
118 // TODO: こいつらをスッキリまとめるべきでーす。
119 private function dropperButtonHandler(evt:Event):void {
120   handtoolButton.selected = false;
121   eraserButton.selected = false;
122   setTool(GPPen.PEN_MODE_DROPPER, null, evt.target.selected);
123 }
124
125 private function handtoolButtonHandler(evt:Event):void {
126   dropperButton.selected = false;
127   eraserButton.selected = false;
128   setTool(GPPen.PEN_MODE_HANDTOOL, null, evt.target.selected);
129 }
130
131 private function eraserButtonHandler(evt:Event):void {
132   handtoolButton.selected = false;
133   dropperButton.selected = false;
134   setTool(GPPen.PEN_MODE_ERASER, BlendMode.ERASE, evt.target.selected);
135 }
136
137 public function cancelTool():void {
138   dropperButton.selected = false;
139   handtoolButton.selected = false;
140   eraserButton.selected = false;
141   _pen.mode = uint(penModeComboBox.value);
142 }
143
144 public function setTool(penMode:uint, penBlendMode:String, b:Boolean):void {
145   if (b) {
146     if (penMode) {
147       _pen.mode = penMode;
148       changePen();
149     }
150     if (penBlendMode) {
151       _pen.blendMode = penBlendMode;
152       changePen();
153     }
154   } else {
155     _pen.mode = uint(penModeComboBox.value);
156     _pen.blendMode = String(blendModeComboBox.value);
157     changePen();
158   }
159 }
160
161 private function penModeComboBoxHandler(evt:ListEvent):void {
162   cancelTool();
163   _pen.mode = uint(evt.currentTarget.value);
164   changePen();
165 }
166
167 private function blendModeComboBoxHandler(evt:ListEvent):void {
168   cancelTool();
169   _pen.blendMode = String(evt.currentTarget.value);
170   changePen();
171 }
172
173 private function thicknessSliderHandler(evt:SliderEvent):void {
174   cancelTool();
175   _pen.thickness = evt.value;
176   changePen();
177 }
178
179 private function changeThickness(t:uint):void {
180   cancelTool();
181   thicknessSlider.value = t;
182   _pen.thickness = t;
183   changePen();
184 }
185
186 private function alphaSliderHandler(evt:SliderEvent):void {
187   _pen.alpha = evt.value;
188   changePen();
189 }
190
191 public function penColorChangeHandler():void {
192   gridItemPalette.setStyle('backgroundColor', _pen.color);
193   changePen(); 
194 }
195
196 // TODO:整理する
197 public function changePen():void {
198   drawPreview();
199
200   switch(_pen.mode) {
201   case GPPen.PEN_MODE_HAND:
202   case GPPen.PEN_MODE_LINE:
203     thicknessButton1.enabled = true;
204     thicknessButton2.enabled = true;
205     thicknessButton3.enabled = true;
206     thicknessButton4.enabled = true;
207     thicknessButton5.enabled = true;
208     thicknessSlider.enabled = true;
209     alphaSlider.enabled = true;
210     blendModeComboBox.enabled = true;
211     penModeComboBox.enabled = true;
212     paletteGrid.enabled = true;
213     break;
214   case GPPen.PEN_MODE_DROPPER:
215     thicknessButton1.enabled = false;
216     thicknessButton2.enabled = false;
217     thicknessButton3.enabled = false;
218     thicknessButton4.enabled = false;
219     thicknessButton5.enabled = false;
220     thicknessSlider.enabled = false;
221     alphaSlider.enabled = false;
222     blendModeComboBox.enabled = false;
223     penModeComboBox.enabled = false;
224     paletteGrid.enabled = true;
225     break;
226   case GPPen.PEN_MODE_FLOOD_FILL:
227     thicknessButton1.enabled = false;
228     thicknessButton2.enabled = false;
229     thicknessButton3.enabled = false;
230     thicknessButton4.enabled = false;
231     thicknessButton5.enabled = false;
232     thicknessSlider.enabled = false;
233     alphaSlider.enabled = true;
234     blendModeComboBox.enabled = true;
235     penModeComboBox.enabled = true;
236     paletteGrid.enabled = true;
237     break;
238   case GPPen.PEN_MODE_HANDTOOL:
239     thicknessButton1.enabled = false;
240     thicknessButton2.enabled = false;
241     thicknessButton3.enabled = false;
242     thicknessButton4.enabled = false;
243     thicknessButton5.enabled = false;
244     thicknessSlider.enabled = false;
245     alphaSlider.enabled = false;
246     blendModeComboBox.enabled = false;
247     penModeComboBox.enabled = false;
248     paletteGrid.enabled = false;
249     break;
250   case GPPen.PEN_MODE_ERASER:
251     thicknessButton1.enabled = true;
252     thicknessButton2.enabled = true;
253     thicknessButton3.enabled = true;
254     thicknessButton4.enabled = true;
255     thicknessButton5.enabled = true;
256     thicknessSlider.enabled = true;
257     alphaSlider.enabled = true; // 消しゴムはalpha値に対応している。
258     blendModeComboBox.enabled = false;
259     penModeComboBox.enabled = false;
260     paletteGrid.enabled = false;
261     break;
262   }
263
264   this.dispatchEvent(new Event('changePen'));
265 }
266
267 private function drawPreview():void {
268   var g:Graphics = previewCanvas.graphics;
269   g.clear();
270   g.beginFill(_pen.color, _pen.alpha);
271   g.drawCircle((previewCanvas.width) / 2,
272                (previewCanvas.height) / 2,
273                _pen.thickness / 2);
274   g.endFill();
275 }
276
277 public function get pen():GPPen {
278   return _pen;
279 }
280
281 public function get dataForPost():Object {
282   return {
283     'palettes': [
284       gridItemPalette1.getStyle('backgroundColor'),
285       gridItemPalette2.getStyle('backgroundColor'),
286       gridItemPalette3.getStyle('backgroundColor'),
287       gridItemPalette4.getStyle('backgroundColor'),
288       gridItemPalette5.getStyle('backgroundColor'),
289       gridItemPalette6.getStyle('backgroundColor'),
290       gridItemPalette7.getStyle('backgroundColor'),
291       gridItemPalette8.getStyle('backgroundColor'),
292       gridItemPalette9.getStyle('backgroundColor'),
293       gridItemPalette10.getStyle('backgroundColor'),
294       gridItemPalette11.getStyle('backgroundColor'),
295       gridItemPalette12.getStyle('backgroundColor'),
296       gridItemPalette13.getStyle('backgroundColor'),
297       gridItemPalette14.getStyle('backgroundColor'),
298       gridItemPalette15.getStyle('backgroundColor'),
299       gridItemPalette16.getStyle('backgroundColor'),
300       gridItemPalette17.getStyle('backgroundColor'),
301       gridItemPalette18.getStyle('backgroundColor'),
302       gridItemPalette19.getStyle('backgroundColor'),
303       gridItemPalette20.getStyle('backgroundColor'),
304       gridItemPalette21.getStyle('backgroundColor')
305     ]
306   };
307 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。