Guest User

Untitled

a guest
Dec 16th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.61 KB | None | 0 0
  1. import Ember from 'ember';
  2. import { task } from 'ember-concurrency';
  3. import CanvasRenderer from '../utils/canvas-renderer';
  4. import ImageProxy from '../utils/image-proxy';
  5.  
  6. export default Ember.Component.extend({
  7. image: Ember.computed('imageSrc', {
  8. get() {
  9. let src = this.get('imageSrc');
  10. return ImageProxy.create({src});
  11. }
  12. }),
  13.  
  14. canvasRenderer: Ember.computed('element', {
  15. get() {
  16. let canvas = this.$('canvas').get(0);
  17. return CanvasRenderer.create({canvas});
  18. }
  19. }),
  20.  
  21. canvasRender: task(function * () {
  22. let image = yield this.get('image');
  23. let render = this.get('canvasRenderer');
  24. let annotations = this.get('annotations') || [];
  25. let selectedAnnotation = this.get('selected');
  26. let cursor = this.get('cursor');
  27. render.background(image);
  28. for (let annotation of annotations) {
  29. let { x, y, id } = Ember.getProperties(annotation, 'x', 'y', 'id');
  30. let isSelected = Ember.isEqual(annotation, selectedAnnotation);
  31. render.annotation(x, y, id, isSelected);
  32. }
  33. if (cursor && render.isInBounds(cursor)) {
  34. render.cursor(cursor.x, cursor.y, cursor.highlight);
  35. }
  36. })
  37. .restartable()
  38. .observes('image', 'selected', 'cursor', 'annotations.[]'),
  39.  
  40. didInsertElement() {
  41. this._super(...arguments);
  42. this.get('canvasRender').perform();
  43. },
  44.  
  45. didUpdateAttrs() {
  46. this._super(...arguments);
  47. this.get('canvasRender').perform();
  48. },
  49.  
  50. detectCursorCollision(pos) {
  51. let render = this.get('canvasRenderer');
  52. let selected = this.get('selected');
  53. let hitCursor = render.hitAnnotation(pos, 5);
  54. let hitSelected = render.hitAnnotation(selected);
  55. return hitCursor.detectCollision(hitSelected) ? selected : null;
  56. },
  57.  
  58. detectAnnotationCollision(pos) {
  59. let render = this.get('canvasRenderer');
  60. let annotations = this.get('annotations');
  61. let hitCursor = render.hitAnnotation(pos, 5);
  62. return annotations.find(annotation => {
  63. return render.hitAnnotation(annotation).detectCollision(hitCursor);
  64. });
  65. },
  66.  
  67. actions: {
  68. trackCursor(evt) {
  69. if (evt.button !== 0 || evt.buttons !== 1) {
  70. return;
  71. }
  72. let render = this.get('canvasRenderer');
  73. let pos = render.getMousePosition(evt);
  74. let selected = this.detectAnnotationCollision(pos);
  75. this.set('selected', selected || pos);
  76. this.set('cursor', pos);
  77. return false;
  78. },
  79.  
  80. selectCursor(evt) {
  81. let render = this.get('canvasRenderer');
  82. let pos = render.getMousePosition(evt);
  83. let selected = this.detectAnnotationCollision(pos);
  84. this.set('selected', selected || pos);
  85. this.set('cursor', selected ? null : Ember.assign({highlight: true}, pos));
  86. Ember.run.scheduleOnce('afterRender', () => this.$('input').focus());
  87. return false;
  88. },
  89.  
  90. clearSelected() {
  91. this.set('selected', null);
  92. this.set('cursor', null);
  93. },
  94.  
  95. updateDescription(annotation, evt) {
  96. let description = Ember.get(evt, 'target.value');
  97. Ember.set(annotation, 'description', description);
  98. this.send('clearSelected');
  99. if (Ember.isNone(Ember.get(annotation, 'id'))) {
  100. return this.send('addAnnotation', annotation);
  101. }
  102. },
  103.  
  104. addAnnotation(annotation) {
  105. this.send('clearSelected');
  106. return Ember.tryInvoke(this, 'addAnnotation', [annotation]);
  107. },
  108.  
  109. removeAnnotation(annotation) {
  110. this.send('clearSelected');
  111. return Ember.tryInvoke(this, 'removeAnnotation', [annotation]);
  112. },
  113.  
  114. descriptionKeyHandler(annotation, evt) {
  115. if (evt.keyCode === 13) {
  116. return this.send('annotationChanged', annotation);
  117. }
  118. }
  119. }
  120. });
Add Comment
Please, Sign In to add comment