root/as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint.as

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

r101@poppop (orig r100): tasuku | 2008-08-12 15:27:04 +0900
layer draw now properlly works!

Line 
1 private const DEBUG:Boolean = true;
2
3 import flash.events.Event;
4 import flash.events.KeyboardEvent;
5 import flash.ui.Keyboard;
6
7 import gunyarapaint.Com;
8 import gunyarapaint.controls.GPCanvas;
9 import gunyarapaint.entities.GPPen;
10 import gunyarapaint.entities.GPLogger;
11 import gunyarapaint.utils.MiscUtils;
12
13 import mx.controls.Alert;
14 import mx.events.FlexEvent;
15 import mx.events.NumericStepperEvent;
16 import mx.events.SliderEvent;
17 import mx.managers.PopUpManager;
18
19 private var gpCanvas:GPCanvas;
20 private var basex:uint, basey:uint, baseWidth:uint, baseHeight:uint;
21
22 private var comm:Com;
23 private var oekakiId:uint;
24 private var redirectUrl:String;
25 private var onPost:Boolean = false;
26
27 private var canvasWidth:uint;
28 private var canvasHeight:uint;
29 private var undoBufferSize:uint;
30
31 private const ALERT_TITLE:String = 'お絵カキコ';
32 private const MAX_CANVAS_WIDTH:uint = 500;
33 private const MAX_CANVAS_HEIGHT:uint = 500;
34 private const MIN_CANVAS_WIDTH:uint = 16;
35 private const MIN_CANVAS_HEIGHT:uint = 16;
36
37 public function init():void { 
38
39   if (DEBUG) {
40     versionLabel.text += 'debug';
41   }
42
43   this.enabled = false;
44   comm = new Com();
45   comm.addEventListener('completeGetData', commCompleteHandler);
46  
47   if (parameters['postUrl'] && parameters['cookie'] && parameters['magic'] && parameters['redirectUrl']) {
48     comm.setPostEnv(parameters['postUrl'], parameters['cookie'], parameters['magic']);
49     postOekakiButton.enabled = true;
50     redirectUrl = parameters['redirectUrl'];
51   }
52   if (parameters['undoBufferSize']) {
53     undoBufferSize = int(parameters['undoBufferSize']);
54     if (undoBufferSize < 0) {
55       Alert.show('最大アンドゥ回数が少なすぎます。', ALERT_TITLE);     
56     }
57     if (undoBufferSize > 32) {
58       Alert.show('最大アンドゥ回数が多すぎます。', ALERT_TITLE);     
59     }
60   } else {
61     if (DEBUG) {
62       undoBufferSize = 16;
63     } else {
64       return;
65     }
66   }
67   if (parameters['oekakiId'] && parameters['baseImgUrl']) {
68     oekakiId = uint(parameters['oekakiId']);
69     var url:String = parameters['baseImgUrl'];
70     comm.loadUrl(url);
71     this.enabled = false;
72   } else {
73     if (parameters['canvasWidth'] && parameters['canvasHeight']) {
74       canvasWidth = int(parameters['canvasWidth']);
75       canvasHeight = int(parameters['canvasHeight']);
76       if (canvasWidth < MIN_CANVAS_WIDTH || canvasHeight < MIN_CANVAS_HEIGHT) {
77         Alert.show('キャンバスサイズが小さすぎます。', ALERT_TITLE);
78         return;
79       }
80       if (canvasWidth > MAX_CANVAS_WIDTH || canvasHeight > MAX_CANVAS_HEIGHT) {
81         Alert.show('キャンバスサイズが大きすぎます。', ALERT_TITLE);
82         return;
83       }
84     } else {
85       if (DEBUG) {
86         canvasWidth = 300; canvasHeight = 400;
87       } else {
88         return;
89       }
90     }
91     gpCanvas = gpCanvasWindow.createCanvas(canvasWidth, canvasHeight, undoBufferSize, null, null, penDetailWindow.pen);
92     initGunyaraPaintCanvas();
93   }
94
95   // canvasのpopup
96   PopUpManager.addPopUp(gpCanvasWindow, this);
97  
98   if (DEBUG) {
99     logPlayButton.addEventListener(FlexEvent.BUTTON_DOWN, playLogHandler);
100     checkPngButton.addEventListener(FlexEvent.BUTTON_DOWN, checkPngHandler);
101     logPlayButton.visible = true;
102     checkPngButton.visible = true;
103   }
104  
105   // ペン詳細
106   PopUpManager.addPopUp(penDetailWindow, this);
107   // FIXME: 最終的にはWindowのほうがイベント投げる
108   penDetailWindow.penDetail.addEventListener('changePen', changePenHandler);
109
110   // レイヤー
111   PopUpManager.addPopUp(gpLayerWindow, this);
112  
113   // キャンバス回転スライダ
114   canvasZoom.addEventListener(SliderEvent.CHANGE, canvasZoomHandler);
115   canvasZoom.addEventListener(SliderEvent.THUMB_DRAG, canvasZoomHandler);
116   canvasRotate.addEventListener(SliderEvent.CHANGE, canvasRotateHandler);
117   canvasRotate.addEventListener(SliderEvent.THUMB_DRAG, canvasRotateHandler);
118   zoomResetButton.addEventListener(FlexEvent.BUTTON_DOWN, zoomResetButtonHandler);
119   rotateResetButton.addEventListener(FlexEvent.BUTTON_DOWN, rotateResetButtonHandler);
120  
121   // アンドゥ・リドゥ
122   undoButton.addEventListener(FlexEvent.BUTTON_DOWN, undoButtonHandler);
123   redoButton.addEventListener(FlexEvent.BUTTON_DOWN, redoButtonHandler);
124    
125   // 補助線
126   additionalNumberStepper.addEventListener(NumericStepperEvent.CHANGE, additionalNumberStepperHandler);
127   additionalBoxCheckBox.addEventListener(Event.CHANGE, additionalBoxCheckBoxHandler);
128   additionalSkewCheckBox.addEventListener(Event.CHANGE, additionalSkewCheckBoxHandler);
129  
130   // 投稿
131   postOekakiButton.addEventListener(FlexEvent.BUTTON_DOWN, postOekakiButtonHandler);
132
133   this.enabled = true;
134 }
135
136 private function appComplete():void {
137   stage.addEventListener(KeyboardEvent.KEY_DOWN, shortCutKeyDownHandler); 
138   stage.addEventListener(KeyboardEvent.KEY_UP, shortCutKeyUpHandler); 
139   stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
140   stage.addEventListener(MouseEvent.MOUSE_OUT, mouseUpHandler); // これを入れるとマズい。
141 }
142
143 // canvasでの外のmouseUpをcanvasに通知 
144 private function mouseUpHandler(evt:MouseEvent):void {
145   gpCanvas.extMouseUp();
146 }
147
148 private function initGunyaraPaintCanvas():void {
149   // undo/redoの状態変化
150   gpCanvas.addEventListener('changeUndoRedo', changeUndoRedoHandler);
151   gpCanvas.rotation = 0;
152   gpLayerWindow.canvas = gpCanvas;
153
154   toolCanvas.x = (this.width - toolCanvas.width) / 2;
155 }
156
157 private function commCompleteHandler(evt:Event):void {
158   if (onPost) {
159     onPost = false;
160     if (comm.getErrorStr()) {
161       // error
162       Alert.show(comm.getErrorStr(), ALERT_TITLE);
163       this.enabled = true;
164     } else if (comm.getStringData() != '') {
165       Alert.show(comm.getStringData(), ALERT_TITLE);
166       this.enabled = true;
167     } else {
168       // redirect
169       Com.redirect(redirectUrl);
170     }
171   } else {
172     // 続きを書く
173     var baseImg:BitmapData = Bitmap(comm.getContent()).bitmapData;
174     canvasWidth = baseImg.width;
175     canvasHeight = baseImg.height;
176     gpCanvas = gpCanvasWindow.createCanvas(0, 0, undoBufferSize, null, baseImg, penDetailWindow.pen);
177     initGunyaraPaintCanvas();
178     this.enabled = true;
179   }
180 }
181
182 private function canvasZoomHandler(evt:SliderEvent):void {
183   gpCanvasWindow.zoomCanvas(evt.value);
184 }
185
186 private function canvasRotateHandler(evt:SliderEvent):void {
187   gpCanvasWindow.rotateCanvas(evt.value);
188 }
189 /*
190 private function changeGunyaraPaintRect():void {
191   // 外部のスクリプト呼び出し。主に回転時のサイズ変更
192   if (this.width < (toolCanvas.width + 4)) {
193     this.width = toolCanvas.width + 4;
194   }
195   if (this.height < 312) { // for color picker
196     this.height = 312;
197   }
198   if (ExternalInterface.available) {
199     try {
200       ExternalInterface.call("changeGunyaraPaintRect", this.width, this.height);
201     } catch (e:SecurityError) {
202     } catch (e:Error) {
203     }
204   } 
205 }
206 */
207
208 private function undoButtonHandler(evt:FlexEvent):void {
209   gpCanvas.undo();
210 }
211 private function redoButtonHandler(evt:FlexEvent):void {
212   gpCanvas.redo();
213 }
214 private function additionalNumberStepperHandler(evt:NumericStepperEvent):void {
215   gpCanvas.setAdditionalNumber(evt.value);
216 }
217 private function additionalBoxCheckBoxHandler(evt:Event):void {
218   gpCanvas.setAdditionalBox(evt.target.selected);
219 }
220 private function additionalSkewCheckBoxHandler(evt:Event):void {
221   gpCanvas.setAdditionalSkew(evt.target.selected);
222 }
223 private function changeUndoRedoHandler(evt:Event):void {
224   var undoCount:Number = gpCanvas.getUndoCount();
225   var redoCount:Number = gpCanvas.getRedoCount();
226   if (undoCount > 0) {
227     undoButton.label = 'アンドゥ (' + undoCount + ')';
228     undoButton.enabled = true;
229   } else {
230     undoButton.label = 'アンドゥ';
231     undoButton.enabled = false;
232   }
233   if (redoCount > 0) {
234     redoButton.label = 'リドゥ (' + redoCount + ')';
235     redoButton.enabled = true;
236   } else {
237     redoButton.label = 'リドゥ';
238     redoButton.enabled = false;
239   }
240 }
241
242 private function postOekakiButtonHandler(evt:Event):void {
243   if (messageTextArea.text == '') {
244     Alert.show('書き込みが空です。絵のタイトルなどの情報を書き込んでください。', ALERT_TITLE);
245     return;
246   }
247   if (gpCanvas.logger.getLogCount() == 0) {
248     Alert.show('絵が描かれていません。お絵かきしてください。', ALERT_TITLE);
249     return;
250   }
251   this.enabled = false;
252   onPost = true;
253   comm.postOekaki(fromTextInput.text,
254                   messageTextArea.text,
255                   gpCanvas.getPNGImage(),
256                   gpCanvas.compressedLog,
257                   oekakiId);
258 }
259
260 private function changePenHandler(evt:Event):void {
261   gpCanvasWindow.pen = penDetailWindow.pen;
262 }
263
264 private var logger:GPLogger;
265 private var logcan:GPCanvas;
266
267 private function playLogHandler(evt:FlexEvent):void {
268   logger = gpCanvas.logger;
269   logcan = logger.createViewerCanvas(null);
270   this.addChild(logcan);
271   logger.play(logcan, 1000);
272 }
273
274 private function checkPngHandler(evt:FlexEvent):void {
275   if (MiscUtils.compareObject(
276         logcan.getPNGImage(), gpCanvas.getPNGImage())) {
277     Alert.show('合ってる。');
278   } else {
279     Alert.show('違うよ!');
280   }
281 }
282
283 private function rotateResetButtonHandler(evt:Event):void {
284   setRotate(0);
285 }
286
287 private function zoomResetButtonHandler(evt:Event):void {
288   setZoom(1);
289 }
290
291 private function setRotate(v:Number):void {
292   canvasRotate.value = v;
293   gpCanvasWindow.rotateCanvas(canvasRotate.value);
294 }
295
296 private function setZoom(v:Number):void {
297   canvasZoom.value = v;
298   gpCanvasWindow.zoomCanvas(canvasZoom.value); 
299 }
300
301 private function shortCutKeyDownHandler(evt:KeyboardEvent):void {
302   if (evt.target == this.fromTextInput ||
303       evt.target == this.messageTextArea) {
304     return;
305   }
306   switch (evt.keyCode) {
307   case Keyboard.CONTROL:
308     penDetailWindow.penDetail.setTool(GPPen.PEN_MODE_DROPPER, true);
309     break;
310   case Keyboard.SHIFT:
311     break;
312   case Keyboard.SPACE:
313     penDetailWindow.penDetail.setTool(GPPen.PEN_MODE_HANDTOOL, true);
314     break;
315   case 48: // 0
316   case 96: // ten-key 0
317     if (evt.ctrlKey) {
318       if (evt.shiftKey) {
319         setRotate(0);
320       } else {
321         setZoom(1);
322       }
323     }
324     break;
325   case 89: // y
326     gpCanvas.redo();
327     break;
328   case 90: // z
329     gpCanvas.undo();
330     break;
331   case 107: // ten key +
332     if (evt.ctrlKey) {
333       // ctrl-+
334       setZoom(canvasZoom.value + 1);
335     }
336     break;
337   case 109: // ten key -
338     if (evt.ctrlKey) {
339       // ctrl-'-'
340       setZoom(canvasZoom.value - 1);
341     }
342     break;
343   case 187:
344     if (evt.shiftKey && evt.ctrlKey) {
345       // ctrl-+
346       setZoom(canvasZoom.value + 1);
347     }
348     break;
349   case 189:
350     if (evt.ctrlKey) {
351       // ctrl--
352       setZoom(canvasZoom.value - 1);
353     }
354     break;
355   default:
356     Alert('' + evt.keyCode);
357     break;
358   }
359 }
360
361 private function shortCutKeyUpHandler(evt:KeyboardEvent):void {
362   if (evt.target == this.fromTextInput ||
363       evt.target == this.messageTextArea) {
364     return;
365   }
366   switch (evt.keyCode) {
367   case Keyboard.CONTROL:
368     penDetailWindow.penDetail.setTool(GPPen.PEN_MODE_DROPPER, false);
369     break;
370   case Keyboard.SPACE:
371     penDetailWindow.penDetail.setTool(GPPen.PEN_MODE_HANDTOOL, false);
372     break;
373   return;
374   }
375 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。