PageRenderTime 48ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/src/com/facecontrol/forms/MyPhotoForm.as

https://github.com/vkflashmedia/Facecontrol
ActionScript | 439 lines | 375 code | 62 blank | 2 comment | 27 complexity | 0b636780ad7acc6720922158efff3c64 MD5 | raw file
  1. package com.facecontrol.forms
  2. {
  3. import com.efnx.events.MultiLoaderEvent;
  4. import com.efnx.net.MultiLoader;
  5. import com.facecontrol.dialog.Alert;
  6. import com.facecontrol.dialog.PhotoAlbumDialog;
  7. import com.facecontrol.dialog.PhotoPreviewDialog;
  8. import com.facecontrol.gui.MyPhotoGridItem;
  9. import com.facecontrol.gui.Photo;
  10. import com.facecontrol.gui.RatingStatusBar;
  11. import com.facecontrol.util.Constants;
  12. import com.facecontrol.util.Images;
  13. import com.facecontrol.util.Util;
  14. import com.flashmedia.basics.GameObjectEvent;
  15. import com.flashmedia.basics.GameScene;
  16. import com.flashmedia.basics.View;
  17. import com.flashmedia.gui.Button;
  18. import com.flashmedia.gui.Form;
  19. import com.flashmedia.gui.GridBox;
  20. import com.flashmedia.gui.LinkButton;
  21. import com.flashmedia.gui.Pagination;
  22. import com.flashmedia.util.BitmapUtil;
  23. import flash.display.Bitmap;
  24. import flash.display.Sprite;
  25. import flash.events.ErrorEvent;
  26. import flash.events.Event;
  27. import flash.events.FocusEvent;
  28. import flash.text.AntiAliasType;
  29. import flash.text.TextField;
  30. import flash.text.TextFieldAutoSize;
  31. import flash.text.TextFieldType;
  32. import flash.text.TextFormat;
  33. public class MyPhotoForm extends Form
  34. {
  35. private static const MAX_PHOTO_COUNT_IN_GRID:uint = 6;
  36. private static const INDENT_BETWEEN_MAIN_PHOTO_AND_COMMENT_AREA:uint = 62;
  37. private static const COMMENT_TEXT_X:uint = 46;
  38. private static const COMMENT_TEXT_Y:uint = 41;
  39. private static var _instance:MyPhotoForm;
  40. public static function get instance():MyPhotoForm {
  41. if (!_instance) _instance = new MyPhotoForm(Util.scene);
  42. return _instance;
  43. }
  44. private var _photos:Array;
  45. private var _main:Object;
  46. private var _mainPhoto:Photo;
  47. private var _mainPhotoRatingAverage:TextField;
  48. private var _mainPhotoVotesCount:TextField;
  49. private var _mainPhotoNoVotes:TextField
  50. private var _mainPhotoArea:Sprite;
  51. private var _mainPhotoNoVotesArea:Sprite;
  52. private var _photoCommentArea:Sprite;
  53. private var _photoCommentPlaceholder:TextField;
  54. private var _photoComment:TextField;
  55. private var _ratingStatusBar:RatingStatusBar;
  56. private var _photoGrid:GridBox;
  57. private var _pagination:Pagination;
  58. private var _multiloader:MultiLoader;
  59. public function MyPhotoForm(value:GameScene)
  60. {
  61. super(value, 0, 0, Constants.APP_WIDTH, Constants.APP_HEIGHT);
  62. _multiloader = new MultiLoader();
  63. visible = false;
  64. var smileIco:Bitmap = BitmapUtil.cloneImageNamed(Images.MY_PHOTO_SMILE_ICO);
  65. smileIco.x = 38;
  66. smileIco.y = 97;
  67. addChild(smileIco);
  68. var label:TextField = Util.createLabel('Мои фото', 62, 92);
  69. label.setTextFormat(new TextFormat(Util.opiumBold.fontName, 18, 0xceb0ff));
  70. label.embedFonts = true;
  71. label.antiAliasType = AntiAliasType.ADVANCED;
  72. label.autoSize = TextFieldAutoSize.LEFT;
  73. addChild(label);
  74. label = Util.createLabel('Мой рейтинг:', 274, 92);
  75. label.setTextFormat(new TextFormat(Util.opiumBold.fontName, 18, 0xceb0ff));
  76. label.embedFonts = true;
  77. label.antiAliasType = AntiAliasType.ADVANCED;
  78. label.autoSize = TextFieldAutoSize.LEFT;
  79. addChild(label);
  80. _ratingStatusBar = new RatingStatusBar(value);
  81. addChild(_ratingStatusBar);
  82. var verticalBorder:Sprite = new Sprite();
  83. verticalBorder.x = 41;
  84. verticalBorder.y = 125;
  85. verticalBorder.graphics.beginFill(0xf5dc8c, 1);
  86. verticalBorder.graphics.drawRect(0, 0, 1, 11);
  87. addChild(verticalBorder);
  88. label = Util.createLabel('Главное фото', verticalBorder.x + 4, 118);
  89. label.setTextFormat(new TextFormat(Util.opiumBold.fontName, 14, 0xffa200));
  90. label.embedFonts = true;
  91. label.antiAliasType = AntiAliasType.ADVANCED;
  92. label.autoSize = TextFieldAutoSize.LEFT;
  93. addChild(label);
  94. label = Util.createLabel('Выбери самое лучшее фото твоей жизни', 38, 146, 125, 50);
  95. label.setTextFormat(new TextFormat(Util.tahoma.fontName, 12, 0xd3d96c));
  96. label.embedFonts = true;
  97. label.antiAliasType = AntiAliasType.ADVANCED;
  98. label.autoSize = TextFieldAutoSize.NONE;
  99. label.multiline = true;
  100. label.wordWrap = true;
  101. addChild(label);
  102. verticalBorder = new Sprite();
  103. verticalBorder.x = 276;
  104. verticalBorder.y = 125;
  105. verticalBorder.graphics.beginFill(0xf5dc8c, 1);
  106. verticalBorder.graphics.drawRect(0, 0, 1, 11);
  107. addChild(verticalBorder);
  108. label = Util.createLabel('Твои фото в приложении', verticalBorder.x + 4, 118);
  109. label.setTextFormat(new TextFormat(Util.opiumBold.fontName, 14, 0xffa200));
  110. label.embedFonts = true;
  111. label.antiAliasType = AntiAliasType.ADVANCED;
  112. label.autoSize = TextFieldAutoSize.LEFT;
  113. addChild(label);
  114. label = Util.createLabel('Выбери главное фото, которое будет учавствовать в голосовании', 273, 146, 240, 50);
  115. label.setTextFormat(new TextFormat(Util.tahoma.fontName, 12, 0xd3d96c));
  116. label.embedFonts = true;
  117. label.antiAliasType = AntiAliasType.ADVANCED;
  118. label.autoSize = TextFieldAutoSize.NONE;
  119. label.multiline = true;
  120. label.wordWrap = true;
  121. addChild(label);
  122. _mainPhoto = new Photo(_scene, null, 38, 189, 192, 177);
  123. _mainPhoto.photoBorder = 1;
  124. _mainPhoto.horizontalScale = Photo.HORIZONTAL_SCALE_ALWAYS;
  125. addChild(_mainPhoto);
  126. _mainPhotoNoVotesArea = new Sprite();
  127. _mainPhotoNoVotesArea.y = _mainPhoto.y + _mainPhoto.photoHeight;
  128. _mainPhotoNoVotesArea.visible = false;
  129. addChild(_mainPhotoNoVotesArea);
  130. _mainPhotoArea = new Sprite();
  131. _mainPhotoArea.y = _mainPhoto.y + _mainPhoto.photoHeight;
  132. _mainPhotoArea.visible = false;
  133. addChild(_mainPhotoArea);
  134. var mainPhotoMetaStarIcon:Bitmap = BitmapUtil.cloneImageNamed(Images.BIG_STAR);
  135. mainPhotoMetaStarIcon.x = 38;
  136. mainPhotoMetaStarIcon.y = 8;
  137. _mainPhotoArea.addChild(mainPhotoMetaStarIcon);
  138. _mainPhotoRatingAverage = Util.createLabel('9,5', 77, 3);
  139. _mainPhotoRatingAverage.setTextFormat(new TextFormat(Util.tahoma.fontName, 30, 0xffffff));
  140. _mainPhotoRatingAverage.embedFonts = true;
  141. _mainPhotoRatingAverage.antiAliasType = AntiAliasType.ADVANCED;
  142. _mainPhotoRatingAverage.autoSize = TextFieldAutoSize.LEFT;
  143. _mainPhotoArea.addChild(_mainPhotoRatingAverage);
  144. _mainPhotoVotesCount = Util.createLabel(Util.votesCount(0), 140, 18);
  145. _mainPhotoVotesCount.setTextFormat(new TextFormat(Util.tahoma.fontName, 12, 0xb0dee6));
  146. _mainPhotoVotesCount.embedFonts = true;
  147. _mainPhotoVotesCount.antiAliasType = AntiAliasType.ADVANCED;
  148. _mainPhotoVotesCount.autoSize = TextFieldAutoSize.LEFT;
  149. _mainPhotoArea.addChild(_mainPhotoVotesCount);
  150. _mainPhotoNoVotes = Util.createLabel('Нет голосов', 38, _mainPhotoVotesCount.y);
  151. _mainPhotoNoVotes.setTextFormat(new TextFormat(Util.tahoma.fontName, 12, 0xb0dee6));
  152. _mainPhotoNoVotes.embedFonts = true;
  153. _mainPhotoNoVotes.antiAliasType = AntiAliasType.ADVANCED;
  154. _mainPhotoNoVotes.autoSize = TextFieldAutoSize.LEFT;
  155. _mainPhotoNoVotesArea.addChild(_mainPhotoNoVotes);
  156. _photoCommentArea = new Sprite();
  157. _photoCommentArea.y = _mainPhoto.y + _mainPhoto.photoHeight + INDENT_BETWEEN_MAIN_PHOTO_AND_COMMENT_AREA;
  158. _photoCommentArea.visible = false;
  159. addChild(_photoCommentArea);
  160. var commentLabel:TextField = Util.createLabel('Комментарий к фото:', 38, 0);
  161. commentLabel.setTextFormat(new TextFormat(Util.tahoma.fontName, 12, 0xd3d96c));
  162. commentLabel.embedFonts = true;
  163. commentLabel.antiAliasType = AntiAliasType.ADVANCED;
  164. commentLabel.autoSize = TextFieldAutoSize.LEFT;
  165. _photoCommentArea.addChild(commentLabel);
  166. var commentForm:Bitmap = BitmapUtil.cloneImageNamed(Images.MY_PHOTO_COMMENT_FORM);
  167. commentForm.x = 37;
  168. commentForm.y = 23;
  169. _photoCommentArea.addChild(commentForm);
  170. _photoCommentPlaceholder = new TextField();
  171. _photoCommentPlaceholder.x = COMMENT_TEXT_X;
  172. _photoCommentPlaceholder.y = COMMENT_TEXT_Y;
  173. _photoCommentPlaceholder.defaultTextFormat = new TextFormat(Util.tahoma.fontName, 12, 0xcac4c8);
  174. _photoCommentPlaceholder.text = 'Введите комментарий';
  175. _photoCommentPlaceholder.embedFonts = true;
  176. _photoCommentPlaceholder.selectable = false;
  177. _photoCommentPlaceholder.antiAliasType = AntiAliasType.ADVANCED;
  178. _photoCommentPlaceholder.autoSize = TextFieldAutoSize.LEFT;
  179. _photoCommentArea.addChild(_photoCommentPlaceholder);
  180. _photoComment = new TextField();
  181. _photoComment.selectable = true;
  182. _photoComment.x = COMMENT_TEXT_X;
  183. _photoComment.y = COMMENT_TEXT_Y;
  184. _photoComment.width = 176;
  185. _photoComment.height = 121;
  186. _photoComment.defaultTextFormat = new TextFormat(Util.tahoma.fontName, 12, 0xcac4c8);
  187. _photoComment.maxChars = 127;
  188. _photoComment.embedFonts = true;
  189. _photoComment.antiAliasType = AntiAliasType.ADVANCED;
  190. _photoComment.type = TextFieldType.INPUT;
  191. _photoComment.wordWrap = true;
  192. _photoComment.addEventListener(FocusEvent.FOCUS_OUT, onMouseOut);
  193. _photoComment.addEventListener(FocusEvent.FOCUS_IN, onMouseIn);
  194. _photoCommentArea.addChild(_photoComment);
  195. var photoGridBackground:Bitmap = BitmapUtil.cloneImageNamed(Images.MY_PHOTO_BACKGROUND);
  196. photoGridBackground.y = 189;
  197. photoGridBackground.x = 274;
  198. addChild(photoGridBackground);
  199. var previewButton:LinkButton = new LinkButton(_scene, 'предпросмотр', 278, 459);
  200. previewButton.setTextFormatForState(new TextFormat(Util.tahoma.fontName, 11, 0xffb44a, null, null, true), CONTROL_STATE_NORMAL);
  201. previewButton.textField.embedFonts = true;
  202. previewButton.textField.antiAliasType = AntiAliasType.ADVANCED;
  203. previewButton.addEventListener(GameObjectEvent.TYPE_MOUSE_CLICK, onPreviewClick);
  204. addChild(previewButton);
  205. var markAsMain:Button = new Button(_scene, 264, 488);
  206. markAsMain.setTitleForState('Сделать главной', CONTROL_STATE_NORMAL);
  207. markAsMain.setBackgroundImageForState(BitmapUtil.cloneImageNamed(Images.MY_PHOTO_BUTTON_RED), CONTROL_STATE_NORMAL);
  208. markAsMain.setTextFormatForState(new TextFormat(Util.tahoma.fontName, 10, 0xffffff), CONTROL_STATE_NORMAL);
  209. markAsMain.textField.embedFonts = true;
  210. markAsMain.textField.antiAliasType = AntiAliasType.ADVANCED;
  211. markAsMain.setTextPosition(19, 17);
  212. markAsMain.addEventListener(GameObjectEvent.TYPE_MOUSE_CLICK, onMarkAsMainClick);
  213. addChild(markAsMain);
  214. var addPhoto:Button = new Button(_scene, 377, 488);
  215. addPhoto.setTitleForState('Добавить фото', CONTROL_STATE_NORMAL);
  216. addPhoto.setBackgroundImageForState(Util.multiLoader.get(Images.MY_PHOTO_BUTTON_ORANGE), CONTROL_STATE_NORMAL);
  217. addPhoto.setTextFormatForState(new TextFormat(Util.tahoma.fontName, 10, 0xffffff), CONTROL_STATE_NORMAL);
  218. addPhoto.textField.embedFonts = true;
  219. addPhoto.textField.antiAliasType = AntiAliasType.ADVANCED;
  220. addPhoto.setTextPosition(19, 17);
  221. addPhoto.addEventListener(GameObjectEvent.TYPE_MOUSE_CLICK, onAddPhotoClick);
  222. addChild(addPhoto);
  223. var deletePhoto:Button = new Button(_scene, 486, 488);
  224. deletePhoto.setTitleForState('Удалить фото', CONTROL_STATE_NORMAL);
  225. deletePhoto.setBackgroundImageForState(Util.multiLoader.get(Images.MY_PHOTO_BUTTON_GRAY), CONTROL_STATE_NORMAL);
  226. deletePhoto.setTextFormatForState(new TextFormat(Util.tahoma.fontName, 10, 0xffffff), CONTROL_STATE_NORMAL);
  227. deletePhoto.textField.embedFonts = true;
  228. deletePhoto.textField.antiAliasType = AntiAliasType.ADVANCED;
  229. deletePhoto.setTextPosition(19, 17);
  230. deletePhoto.addEventListener(GameObjectEvent.TYPE_MOUSE_CLICK, onDeletePhotoClick);
  231. addChild(deletePhoto);
  232. _photoGrid = new GridBox(_scene, 2, 3);
  233. _photoGrid.x = 281;
  234. _photoGrid.y = 203;
  235. _photoGrid.width = 290;
  236. _photoGrid.height = 225;
  237. _photoGrid.widthPolicy = GridBox.WIDTH_POLICY_ABSOLUTE;
  238. _photoGrid.heightPolicy = GridBox.HEIGHT_POLICY_ABSOLUTE;
  239. _photoGrid.horizontalItemsAlign = View.ALIGN_HOR_LEFT;
  240. _photoGrid.verticalItemsAlign = View.ALIGN_VER_TOP;
  241. _photoGrid.indentBetweenRows = 0;
  242. _photoGrid.indentBetweenCols = 0;
  243. _photoGrid.setPaddings(3,3,3,3);
  244. addChild(_photoGrid);
  245. _pagination = new Pagination(_scene, 500, 462);
  246. _pagination.width = 83;
  247. _pagination.textFormatForDefaultButton = new TextFormat(Util.tahoma.fontName, 9, 0xbcbcbc);
  248. _pagination.textFormatForSelectedButton = new TextFormat(Util.tahomaBold.fontName, 9, 0x00ccff);
  249. _pagination.addEventListener(Event.CHANGE, onPaginationChange);
  250. addChild(_pagination);
  251. }
  252. public function onPaginationChange(event:Event):void {
  253. updateGrid();
  254. }
  255. public function updateGrid():void {
  256. _photoGrid.removeAllItems();
  257. var start:int = _pagination.currentPage * MAX_PHOTO_COUNT_IN_GRID;
  258. var end:int = start + MAX_PHOTO_COUNT_IN_GRID < _photos.length ? start + MAX_PHOTO_COUNT_IN_GRID : _photos.length;
  259. var p:MyPhotoGridItem;
  260. for (var i:uint = start; i < end; ++i) {
  261. p = new MyPhotoGridItem(_scene, _photos[i], _multiloader.get(_photos[i].pid), 140, 64);
  262. p.setFocus(true, true, BitmapUtil.cloneImageNamed(Images.MY_PHOTO_SELECTION));
  263. _photoGrid.addItem(p);
  264. }
  265. }
  266. private function update():void {
  267. if (_main) {
  268. _mainPhotoNoVotesArea.y = _mainPhotoArea.y = _mainPhoto.y + _mainPhoto.photoHeight;
  269. _photoCommentArea.y = _mainPhoto.y + _mainPhoto.photoHeight + INDENT_BETWEEN_MAIN_PHOTO_AND_COMMENT_AREA;
  270. _photoCommentArea.visible = true;
  271. _mainPhotoNoVotesArea.visible = (_main.votes_count == 0);
  272. _mainPhotoArea.visible = !_mainPhotoNoVotesArea.visible;
  273. _mainPhotoVotesCount.defaultTextFormat = _mainPhotoVotesCount.getTextFormat();
  274. _mainPhotoVotesCount.text = Util.votesCount(_main.votes_count);
  275. _mainPhotoRatingAverage.defaultTextFormat = _mainPhotoRatingAverage.getTextFormat();
  276. _mainPhotoRatingAverage.text = (_main.rating_average) ? _main.rating_average : '';
  277. }
  278. _pagination.pagesCount = Math.ceil(_photos.length / MAX_PHOTO_COUNT_IN_GRID);
  279. _pagination.visible = _pagination.pagesCount > 1;
  280. updateGrid();
  281. }
  282. public function get photos(): Array {
  283. return _photos;
  284. }
  285. public function setProfile(response:Object):void {
  286. if (response) {
  287. // _ratingLabel.defaultTextFormat = _ratingLabel.getTextFormat();
  288. // _ratingLabel.text = response['rating'];
  289. _ratingStatusBar.rating = response['rating'];
  290. _photos = response['photos'];
  291. _multiloader.addEventListener(ErrorEvent.ERROR, multiLoaderError);
  292. for each (var photo:Object in _photos) {
  293. if (!_multiloader.hasLoaded(photo.pid)) {
  294. _multiloader.load(photo.src_big, photo.pid, 'Bitmap');
  295. }
  296. if (photo.main == 1) {
  297. _main = photo;
  298. _photoComment.defaultTextFormat = _photoComment.getTextFormat();
  299. _photoComment.text = (_main.comment) ? _main.comment : '';
  300. _photoCommentPlaceholder.visible = (_photoComment.text == '');
  301. }
  302. }
  303. _mainPhoto.frameIndex = _main.frame;
  304. if (_multiloader.isLoaded) {
  305. _mainPhoto.photo = _multiloader.get(_main.pid);
  306. update();
  307. }
  308. else {
  309. if (!PreloaderSplash.instance.isModal) {
  310. Util.scene.showModal(PreloaderSplash.instance);
  311. }
  312. _multiloader.addEventListener(MultiLoaderEvent.COMPLETE, multiLoaderComplite);
  313. }
  314. }
  315. }
  316. public function multiLoaderError(event:ErrorEvent):void {
  317. PreloaderSplash.instance.resetModal();
  318. Alert.show('Ошибка:', 'Не удалось загрузить фотографию.', 'Ок');
  319. }
  320. public function multiLoaderComplite(event:MultiLoaderEvent):void {
  321. if (_multiloader.isLoaded) {
  322. _multiloader.removeEventListener(MultiLoaderEvent.COMPLETE, multiLoaderComplite);
  323. if (_main) {
  324. _mainPhoto.photo = _multiloader.get(_main.pid);
  325. }
  326. update();
  327. PreloaderSplash.instance.resetModal();
  328. }
  329. }
  330. public function onMarkAsMainClick(event:GameObjectEvent):void {
  331. var gridItem:MyPhotoGridItem = _photoGrid.selectedItem;
  332. if (gridItem) Util.api.setMain(gridItem.photoData.pid);
  333. else Alert.show('Сообщение:', 'Необходимо выбрать фотографию', 'Ок');
  334. }
  335. public function onAddPhotoClick(event:GameObjectEvent):void {
  336. PhotoAlbumDialog.instance.setAddedPhotos(MyPhotoForm.instance.photos);
  337. _scene.showModal(PhotoAlbumDialog.instance);
  338. }
  339. public function onDeletePhotoClick(event:GameObjectEvent):void {
  340. var gridItem:MyPhotoGridItem = _photoGrid.selectedItem;
  341. if (gridItem) {
  342. PreloaderSplash.instance.showModal();
  343. Util.api.deletePhoto(gridItem.photoData.pid);
  344. }
  345. else {
  346. Alert.show('Сообщение:', 'Необходимо выбрать фотографию', 'Ок');
  347. }
  348. }
  349. public function onMouseIn(event:FocusEvent):void {
  350. _photoCommentPlaceholder.visible = false;
  351. }
  352. public function onMouseOut(event:FocusEvent):void {
  353. _photoCommentPlaceholder.visible = (_photoComment.text == '');
  354. if (_main.comment != _photoComment.text) {
  355. Util.api.setComment(_main.pid, _photoComment.text);
  356. }
  357. }
  358. public function onPreviewClick(event:GameObjectEvent):void {
  359. var gridItem:MyPhotoGridItem = _photoGrid.selectedItem;
  360. if (gridItem) {
  361. _scene.showModal(new PhotoPreviewDialog(_scene, _multiloader.get(gridItem.photoData.pid)));
  362. } else {
  363. Alert.show('Сообщение:', 'Необходимо выбрать фотографию', 'Ок');
  364. }
  365. }
  366. public override function show():void {
  367. if (_scene) {
  368. for (var i:int = 0; i < _scene.numChildren; ++i) {
  369. if (_scene.getChildAt(i) is Form) {
  370. var form:Form = _scene.getChildAt(i) as Form;
  371. form.visible = (form is MyPhotoForm);
  372. }
  373. }
  374. }
  375. }
  376. }
  377. }