pageflow-linkmap-page 1.5.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -6
  3. data/Gemfile +0 -7
  4. data/README.md +0 -5
  5. data/app/assets/javascript/pageflow/linkmap_page/editor/collections/areas_collection.js +8 -1
  6. data/app/assets/javascript/pageflow/linkmap_page/editor/config.js +23 -1
  7. data/app/assets/javascript/pageflow/linkmap_page/editor/controllers/side_bar_controller.js +24 -5
  8. data/app/assets/javascript/pageflow/linkmap_page/editor/models/area.js +4 -1
  9. data/app/assets/javascript/pageflow/linkmap_page/editor/models/color_map_delegator.js +16 -0
  10. data/app/assets/javascript/pageflow/linkmap_page/editor/models/color_map_file.js +6 -0
  11. data/app/assets/javascript/pageflow/linkmap_page/editor/models/masked_image_file.js +7 -0
  12. data/app/assets/javascript/pageflow/linkmap_page/editor/models/page_configuration_mixin.js +49 -55
  13. data/app/assets/javascript/pageflow/linkmap_page/editor/models/processed_file.js +12 -0
  14. data/app/assets/javascript/pageflow/linkmap_page/editor/patterns/area_pattern.js +42 -0
  15. data/app/assets/javascript/pageflow/linkmap_page/editor/routers/side_bar_router.js +3 -1
  16. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_item.jst.ejs +2 -2
  17. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_masks_preview.jst.ejs +4 -2
  18. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_outlines.jst.ejs +3 -2
  19. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/mobile_info_box_page_item.jst.ejs +2 -0
  20. data/app/assets/javascript/pageflow/linkmap_page/editor/views/areas_list_view.js +1 -0
  21. data/app/assets/javascript/pageflow/linkmap_page/editor/views/configuration_editor_view.js +46 -0
  22. data/app/assets/javascript/pageflow/linkmap_page/editor/views/edit_area_view.js +3 -6
  23. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_item_embedded_view.js +75 -10
  24. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_masks_preview_embedded_view.js +71 -77
  25. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_outlines_embedded_view.js +44 -82
  26. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/areas_embedded_view.js +12 -13
  27. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/mobile_info_box_embedded_view.js +61 -0
  28. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/mobile_info_box_page_item_embedded_view.js +28 -0
  29. data/app/assets/javascript/pageflow/linkmap_page/editor.js +10 -2
  30. data/app/assets/javascript/pageflow/linkmap_page/page_type.js +155 -20
  31. data/app/assets/javascript/pageflow/linkmap_page/widgets/hover_video.js +4 -1
  32. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/area_contains.js +7 -6
  33. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/area_set_mask.js +16 -0
  34. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/color_map.js +83 -142
  35. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/image_data.js +17 -47
  36. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/mask.js +3 -34
  37. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/remote_image.js +3 -6
  38. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap.js +78 -92
  39. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_area_indicators.js +75 -0
  40. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_paginator.js +292 -0
  41. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_pan_zoom.js +241 -0
  42. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_panorama.js +81 -59
  43. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_scroll_indicators.js +14 -0
  44. data/app/assets/stylesheets/pageflow/linkmap_page/editor/area_outlines.scss +6 -0
  45. data/app/assets/stylesheets/pageflow/linkmap_page/editor/masks_preview.scss +10 -0
  46. data/app/assets/stylesheets/pageflow/linkmap_page/themes/default/mobile_info_box.scss +31 -0
  47. data/app/assets/stylesheets/pageflow/linkmap_page/themes/default/paginator.scss +53 -0
  48. data/app/assets/stylesheets/pageflow/linkmap_page/themes/default/scroll_indicators.scss +5 -1
  49. data/app/assets/stylesheets/pageflow/linkmap_page/themes/default.scss +3 -0
  50. data/app/assets/stylesheets/pageflow/linkmap_page.scss +29 -3
  51. data/app/helpers/pageflow/linkmap_page/areas_helper.rb +37 -11
  52. data/app/jobs/pageflow/linkmap_page/process_source_image_file_job.rb +4 -4
  53. data/app/views/pageflow/linkmap_page/areas/_div.html.erb +13 -7
  54. data/app/views/pageflow/linkmap_page/color_map_files/_color_map_file.json.jbuilder +18 -0
  55. data/app/views/pageflow/linkmap_page/editor/color_map_files/_color_map_file.json.jbuilder +1 -0
  56. data/app/views/pageflow/linkmap_page/editor/masked_image_files/_masked_image_file.json.jbuilder +1 -0
  57. data/app/views/pageflow/linkmap_page/page.html.erb +76 -39
  58. data/config/locales/de.yml +47 -4
  59. data/config/locales/en.yml +43 -4
  60. data/db/migrate/20170330201200_create_mask_sprites.rb +1 -1
  61. data/db/migrate/20171106151700_create_masked_image_files.rb +1 -1
  62. data/db/migrate/20180111145100_create_color_map_files.rb +1 -1
  63. data/db/migrate/20180214201200_drop_mask_sprites.rb +7 -0
  64. data/lib/pageflow/linkmap_page/engine.rb +4 -0
  65. data/lib/pageflow/linkmap_page/page_type.rb +26 -0
  66. data/lib/pageflow/linkmap_page/paperclip_processors/color_mask.rb +1 -1
  67. data/lib/pageflow/linkmap_page/paperclip_processors/colors.rb +1 -1
  68. data/lib/pageflow/linkmap_page/version.rb +1 -1
  69. data/lib/tasks/pageflow_linkmap_page_tasks.rake +8 -7
  70. data/pageflow-linkmap-page.gemspec +11 -5
  71. data/spec/factories/color_map_file.rb +16 -0
  72. data/spec/factories/image_file.rb +25 -0
  73. data/spec/factories/masked_image_file.rb +10 -0
  74. data/spec/helpers/pageflow/linkmap_page/areas_helper_spec.rb +76 -13
  75. data/spec/integration/masked_image_file_type_spec.rb +15 -0
  76. data/spec/models/pageflow/linkmap_page/color_map_file_spec.rb +113 -0
  77. data/spec/models/pageflow/linkmap_page/masked_image_file_spec.rb +87 -0
  78. data/spec/pageflow/linkmap_page/paperclip_processors/colors_spec.rb +46 -0
  79. data/spec/pageflow/linkmap_page/progress_spec.rb +91 -0
  80. data/spec/spec_helper.rb +5 -1
  81. data/spec/support/config/devise.rb +1 -8
  82. data/spec/support/config/{factory_girl.rb → factory_bot.rb} +5 -3
  83. data/spec/support/config/resque.rb +9 -0
  84. data/spec/support/fixtures/black_dots.png +0 -0
  85. data/spec/support/fixtures/color_map.png +0 -0
  86. data/spec/support/fixtures/dots_and_lines.png +0 -0
  87. data/spec/support/fixtures/green_and_black.png +0 -0
  88. data/spec/support/fixtures/red.png +0 -0
  89. data/spec/support/fixtures/transparent.png +0 -0
  90. data/spec/support/matchers/have_color.rb +34 -0
  91. metadata +98 -41
  92. data/app/assets/javascript/pageflow/linkmap_page/editor/models/masks_delegator.js +0 -16
  93. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/area_redraw.js +0 -34
  94. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/mask_sprite.js +0 -68
  95. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/masks.js +0 -99
  96. data/app/controllers/pageflow/linkmap_page/mask_sprites_controller.rb +0 -26
  97. data/app/models/pageflow/linkmap_page/mask_sprite.rb +0 -15
  98. data/config/routes.rb +0 -5
  99. data/spec/controllers/pageflow/linkmap_page/mask_sprites_controller_spec.rb +0 -108
@@ -3,6 +3,11 @@ pageflow.linkmapPage.AreaItemEmbeddedView = Backbone.Marionette.ItemView.extend(
3
3
 
4
4
  className: 'hover_area',
5
5
 
6
+ ui: {
7
+ hoverImage: '.hover_image',
8
+ visitedImage: '.visited_image'
9
+ },
10
+
6
11
  events: {
7
12
  'linkmapareaclick': function() {
8
13
  if (this.$el.is('.editable .hover_area')) {
@@ -58,15 +63,66 @@ pageflow.linkmapPage.AreaItemEmbeddedView = Backbone.Marionette.ItemView.extend(
58
63
  },
59
64
 
60
65
  onRender: function() {
66
+ this.setupImageViews();
67
+ this.setupOutlineView();
61
68
  this.setupDraggableAndResizable();
62
69
  this.setupAudioPlayer();
63
70
 
64
- this.listenTo(this.options.masks, 'update', this.update);
71
+ this.listenTo(this.options.colorMap, 'update', this.update);
65
72
  this.listenTo(this.options.pageConfiguration, 'change:background_type', this.update);
73
+ this.listenTo(pageflow.entry, 'change:emulation_mode', this.updateDraggableAndResizable);
66
74
 
67
75
  this.update();
68
76
  },
69
77
 
78
+ setupImageViews: function() {
79
+ var view = this;
80
+
81
+ var backgroundImageClassNamePrefix = function() {
82
+ var colorMapComponent = view.getColorMapComponent();
83
+ return colorMapComponent ?
84
+ 'pageflow_linkmap_page_masked_image_file_' + colorMapComponent.color:
85
+ 'image_panorama';
86
+ };
87
+
88
+ var hoverImageView = new pageflow.BackgroundImageEmbeddedView({
89
+ el: this.ui.hoverImage,
90
+ model: this.options.pageConfiguration,
91
+ propertyName: function() {
92
+ return view.getColorMapComponent() ?
93
+ 'linkmap_masked_hover_image_id' :
94
+ 'hover_image_id';
95
+ },
96
+ useInlineStyles: false,
97
+ backgroundImageClassNamePrefix: backgroundImageClassNamePrefix
98
+ }).render();
99
+
100
+ var visitedImageView = new pageflow.BackgroundImageEmbeddedView({
101
+ el: this.ui.visitedImage,
102
+ model: this.options.pageConfiguration,
103
+ propertyName: function() {
104
+ return view.getColorMapComponent() ?
105
+ 'linkmap_masked_visited_image_id' :
106
+ 'visited_image_id';
107
+ },
108
+ useInlineStyles: false,
109
+ backgroundImageClassNamePrefix: backgroundImageClassNamePrefix
110
+ }).render();
111
+
112
+ this.listenTo(this.options.colorMap, 'update', function() {
113
+ hoverImageView.update();
114
+ visitedImageView.update();
115
+ });
116
+ },
117
+
118
+ setupOutlineView: function() {
119
+ this.appendSubview(new pageflow.linkmapPage.AreaOutlineEmbeddedView({
120
+ model: this.options.pageConfiguration,
121
+ area: this.model,
122
+ colorMap: this.options.colorMap
123
+ }));
124
+ },
125
+
70
126
  setupDraggableAndResizable: function() {
71
127
  var that = this;
72
128
  var scroller = this.options.container.$('.scroller');
@@ -125,12 +181,22 @@ pageflow.linkmapPage.AreaItemEmbeddedView = Backbone.Marionette.ItemView.extend(
125
181
  },
126
182
 
127
183
  updateDraggableAndResizable: function() {
128
- if (this.model.get('selected') && !this.getMask()) {
184
+ if (this.model.get('selected') &&
185
+ !pageflow.entry.has('emulation_mode')) {
186
+
129
187
  this.$el.resizable('enable');
130
- this.$el.draggable('enable');
131
188
  }
132
189
  else {
133
190
  this.$el.resizable('disable');
191
+ }
192
+
193
+ if (this.model.get('selected') &&
194
+ !pageflow.entry.has('emulation_mode') &&
195
+ !this.getColorMapComponent()) {
196
+
197
+ this.$el.draggable('enable');
198
+ }
199
+ else {
134
200
  this.$el.draggable('disable');
135
201
  }
136
202
  },
@@ -141,9 +207,9 @@ pageflow.linkmapPage.AreaItemEmbeddedView = Backbone.Marionette.ItemView.extend(
141
207
 
142
208
  update: function() {
143
209
  var audioFileId = this.model.get('target_id');
144
- var mask = this.getMask();
210
+ var colorMapComponent = this.getColorMapComponent();
145
211
 
146
- this.$el.attr('data-mask-id', mask ? this.model.get('mask_perma_id') : '');
212
+ this.$el.attr('data-mask-perma-id', colorMapComponent ? colorMapComponent.permaId : null);
147
213
  this.$el.attr('data-audio-file', audioFileId ? audioFileId + '.' + this.cid : '');
148
214
  this.$el.attr('data-target-type', this.model.get('target_type'));
149
215
  this.$el.attr('data-target-id', this.model.get('target_id'));
@@ -152,8 +218,8 @@ pageflow.linkmapPage.AreaItemEmbeddedView = Backbone.Marionette.ItemView.extend(
152
218
  this.$el.toggleClass('selected', !!this.model.get('selected'));
153
219
  this.$el.toggleClass('highlighted', !!this.model.get('highlighted'));
154
220
  this.$el.toggleClass('editing', !!this.model.get('editing'));
155
- this.$el.toggleClass('without_mask', !mask);
156
- this.$el.toggleClass('with_mask', !!mask);
221
+ this.$el.toggleClass('without_mask', !colorMapComponent);
222
+ this.$el.toggleClass('with_mask', !!colorMapComponent);
157
223
 
158
224
  this.$el.attr('data-width', this.model.get('width'));
159
225
  this.$el.attr('data-height', this.model.get('height'));
@@ -203,9 +269,8 @@ pageflow.linkmapPage.AreaItemEmbeddedView = Backbone.Marionette.ItemView.extend(
203
269
  element.toggleClass('inverted', !!this.model.get('inverted'));
204
270
  },
205
271
 
206
- getMask: function() {
207
- return this.options.pageConfiguration.getLinkmapAreaMask(
208
- this.options.masks,
272
+ getColorMapComponent: function() {
273
+ return this.options.colorMap.componentByPermaId(
209
274
  this.model.get('mask_perma_id')
210
275
  );
211
276
  }
@@ -4,8 +4,9 @@ pageflow.linkmapPage.AreaMasksPreviewEmbeddedView = Backbone.Marionette.ItemView
4
4
  className: 'linkmap_area_masks_preview',
5
5
 
6
6
  ui: {
7
- allAreasCanvas: 'canvas.all',
8
- currentAreaCanvas: 'canvas.current'
7
+ canvas: 'canvas',
8
+ canvasWrapper: '.canvas_wrapper',
9
+ backgroundImage: '.background_image'
9
10
  },
10
11
 
11
12
  modelEvents: {
@@ -44,14 +45,13 @@ pageflow.linkmapPage.AreaMasksPreviewEmbeddedView = Backbone.Marionette.ItemView
44
45
 
45
46
  this.update();
46
47
  this.updateCursor();
47
- this.redrawAllAreas();
48
48
  this.redraw();
49
49
  },
50
50
 
51
51
  handleMouseDown: function(event) {
52
52
  var view = this;
53
53
 
54
- if (this.currentMask || this.selection.type === 'mask') {
54
+ if (this.currentColorMapComponent || this.selection.type === 'colorMapComponent') {
55
55
  return;
56
56
  }
57
57
 
@@ -91,17 +91,21 @@ pageflow.linkmapPage.AreaMasksPreviewEmbeddedView = Backbone.Marionette.ItemView
91
91
  },
92
92
 
93
93
  handleClick: function(event) {
94
- var mask = this.maskFromPoint(event);
94
+ var colorMapComponent = this.colorMapComponentFromPoint(event);
95
95
 
96
- if (mask) {
97
- this.selection.deferred.resolve(mask.areaAttributes());
96
+ if (colorMapComponent) {
97
+ this.selection.deferred.resolve(colorMapComponent.areaAttributes());
98
98
  }
99
99
  else {
100
100
  this.selection.deferred.reject();
101
101
  }
102
+
103
+ event.stopPropagation();
102
104
  },
103
105
 
104
106
  update: function(event) {
107
+ this.ui.backgroundImage.css('background-image', 'url("' + this.options.colorMap.previewUrl() +'"');
108
+
105
109
  if (this.dragStartOffset) {
106
110
  this.drawSelection(this.dragStartOffset.x,
107
111
  this.dragStartOffset.y,
@@ -110,30 +114,30 @@ pageflow.linkmapPage.AreaMasksPreviewEmbeddedView = Backbone.Marionette.ItemView
110
114
  return;
111
115
  }
112
116
 
113
- var mask = event && this.maskFromPoint(event);
117
+ var colorMapComponent = event && this.colorMapComponentFromPoint(event);
114
118
 
115
- if (this.maskIsUsed(mask)) {
116
- mask = null;
119
+ if (colorMapComponent && this.colorMapComponentIsUsed(colorMapComponent)) {
120
+ colorMapComponent = null;
117
121
  }
118
122
 
119
- if (this.currentMask !== mask) {
120
- this.currentMask = mask;
123
+ if (this.currentColorMapComponent !== colorMapComponent) {
124
+ this.currentColorMapComponent = colorMapComponent;
121
125
 
122
126
  this.updateCursor();
123
127
  this.redraw();
124
128
  }
125
129
  },
126
130
 
127
- maskFromPoint: function(event) {
128
- return this.options.masks.atPoint(event.offsetX / this.$el.width(),
129
- event.offsetY / this.$el.height());
131
+ colorMapComponentFromPoint: function(event) {
132
+ return this.options.colorMap.componentFromPoint(event.offsetX / this.$el.width() * 100,
133
+ event.offsetY / this.$el.height() * 100);
130
134
  },
131
135
 
132
136
  updateCursor: function() {
133
- if (this.currentMask) {
137
+ if (this.currentColorMapComponent) {
134
138
  this.$el.css('cursor', 'pointer');
135
139
  }
136
- else if (this.selection.type !== 'mask') {
140
+ else if (this.selection.type !== 'colorMapComponent') {
137
141
  this.$el.css('cursor', 'crosshair');
138
142
  }
139
143
  else {
@@ -141,87 +145,77 @@ pageflow.linkmapPage.AreaMasksPreviewEmbeddedView = Backbone.Marionette.ItemView
141
145
  }
142
146
  },
143
147
 
144
- redrawAllAreas: function() {
145
- var canvas = this.ui.allAreasCanvas[0];
146
-
147
- canvas.width = this.$el.width();
148
- canvas.height = this.$el.height();
149
-
150
- var context = canvas.getContext('2d');
151
-
152
- context.clearRect(0, 0, canvas.width, canvas.height);
153
-
154
- context.globalAlpha = 0.5;
155
-
156
- this.options.masks.each(function(mask) {
157
- if (!this.maskIsUsed(mask)) {
158
- mask.draw(context, canvas.width);
159
- }
160
- }, this);
161
- },
162
-
163
- maskIsUsed: function(mask) {
148
+ colorMapComponentIsUsed: function(colorMapComponent) {
164
149
  return this.options.areas.any(function(area) {
165
- return mask === this.options.masks.findByPermaId(area.get('mask_perma_id'));
150
+ return colorMapComponent.permaId === area.get('mask_perma_id');
166
151
  }, this);
167
152
  },
168
153
 
169
154
  redraw: function() {
170
- var canvas = this.ui.currentAreaCanvas[0];
155
+ if (this.currentColorMapComponent) {
156
+ var attributes = this.currentColorMapComponent.areaAttributes();
157
+
158
+ this.ui.canvasWrapper.css({
159
+ top: attributes.top + '%',
160
+ left: attributes.left + '%',
161
+ width: attributes.width + '%',
162
+ height: attributes.height + '%',
163
+ });
171
164
 
172
- canvas.width = this.$el.width();
173
- canvas.height = this.$el.height();
165
+ this.ui.canvas.css({
166
+ left: 0,
167
+ top: 0,
168
+ width: '100%',
169
+ height: '100%'
170
+ }).show();
174
171
 
175
- var context = canvas.getContext('2d');
172
+ this.ui.canvas.show();
176
173
 
177
- context.clearRect(0, 0, canvas.width, canvas.height);
174
+ var canvas = this.ui.canvas[0];
175
+
176
+ canvas.width = this.ui.canvas.width();
177
+ canvas.height = this.ui.canvas.height();
178
178
 
179
- if (this.currentMask) {
180
- this.currentMask.draw(context, canvas.width);
179
+ var context = canvas.getContext('2d');
180
+
181
+ context.clearRect(0, 0, canvas.width, canvas.height);
182
+
183
+ this.currentColorMapComponent.draw(context, canvas.width);
181
184
 
182
185
  context.globalCompositeOperation = 'source-in';
183
- this.usePattern(context);
186
+ pageflow.linkmapPage.areaPattern.use(context)
184
187
  context.globalAlpha = 0.2;
185
188
  context.fillRect(0, 0, canvas.width, canvas.height);
186
189
  }
190
+ else {
191
+ this.ui.canvas.hide();
192
+ }
187
193
  },
188
194
 
189
195
  drawSelection: function(x, y, width, height) {
190
- var canvas = this.ui.currentAreaCanvas[0];
196
+ var canvas = this.ui.canvas[0];
191
197
 
192
- canvas.width = this.$el.width();
193
- canvas.height = this.$el.height();
198
+ var wrapperLeft = x + Math.min(0, width);
199
+ var wrapperTop = y + Math.min(0, height);
200
+ var wrapperWidth = Math.abs(width);
201
+ var wrapperHeight = Math.abs(height);
202
+
203
+ this.ui.canvasWrapper.css({
204
+ left: wrapperLeft + 'px',
205
+ top: wrapperTop + 'px',
206
+ width: wrapperWidth + 'px',
207
+ height: wrapperHeight + 'px'
208
+ }).show();
209
+
210
+ pageflow.linkmapPage.areaPattern.applyOffset(canvas,
211
+ wrapperLeft, wrapperTop,
212
+ wrapperWidth, wrapperHeight)
194
213
 
195
214
  var context = canvas.getContext('2d');
196
215
 
197
216
  context.clearRect(0, 0, canvas.width, canvas.height);
198
-
199
- this.usePattern(context);
217
+ pageflow.linkmapPage.areaPattern.use(context)
200
218
  context.globalAlpha = 0.6;
201
- context.fillRect(x, y, width, height);
202
- },
203
-
204
- usePattern: function(context) {
205
- if (!this.patternSource) {
206
- var rectSize = 7;
207
-
208
- var canvas = document.createElement('canvas');
209
- this.patternSource = canvas;
210
-
211
- canvas.width = rectSize * 2;
212
- canvas.height = rectSize * 2;
213
-
214
- var c = canvas.getContext('2d');
215
-
216
- c.fillStyle = '#000';
217
- c.fillRect(0, 0, rectSize, rectSize);
218
- c.fillRect(rectSize, rectSize, rectSize, rectSize);
219
-
220
- c.fillStyle = '#fff';
221
- c.fillRect(rectSize, 0, rectSize, rectSize);
222
- c.fillRect(0, rectSize, rectSize, rectSize);
223
- }
224
-
225
- context.fillStyle = context.createPattern(this.patternSource, 'repeat');
219
+ context.fillRect(0, 0, canvas.width, canvas.height);
226
220
  }
227
- });
221
+ });
@@ -1,126 +1,88 @@
1
- pageflow.linkmapPage.AreaOutlinesEmbeddedView = Backbone.Marionette.ItemView.extend({
1
+ pageflow.linkmapPage.AreaOutlineEmbeddedView = Backbone.Marionette.ItemView.extend({
2
2
  template: 'pageflow/linkmap_page/editor/templates/embedded/area_outlines',
3
3
 
4
4
  className: 'linkmap_area_outlines',
5
5
 
6
6
  ui: {
7
- allAreasCanvas: 'canvas.all',
8
- highlightedAreaCanvas: 'canvas.highlighted'
7
+ canvasWrapper: '.linkmap_area_outlines-canvas_wrapper',
8
+ canvas: 'canvas',
9
9
  },
10
10
 
11
11
  onRender: function() {
12
12
  this.listenTo(this.model, 'change:background_type', this.redraw);
13
- this.listenTo(this.options.masks, 'update', this.redrawAll);
14
- this.listenTo(this.options.areas, 'change:highlighted', this.redrawHighlighted);
15
- this.listenTo(this.options.areas, 'change:dimensions change:editing add remove', this.redraw);
13
+ this.listenTo(this.options.colorMap, 'update', this.redraw);
14
+ this.listenTo(this.options.area, 'change:highlighted change:dimensions change:editing', this.redraw);
16
15
  this.listenTo(pageflow.app, 'resize', this.redraw);
17
16
 
18
17
  this.listenTo(this.model.page, 'change:areas_outlined', this.update);
18
+ this.listenTo(pageflow.entry, 'change:emulation_mode', this.update);
19
19
  this.update();
20
20
  },
21
21
 
22
- maskFromPoint: function(event) {
23
- return this.options.masks.atPoint(event.offsetX / this.$el.width(),
24
- event.offsetY / this.$el.height());
25
- },
26
-
27
22
  update: function() {
28
- this.$el.toggle(!!this.model.page.get('areas_outlined'));
29
- this.redrawAll();
23
+ this.$el.toggle(!!this.model.page.get('areas_outlined') && !pageflow.entry.has('emulation_mode'));
24
+ this.redraw();
30
25
  },
31
26
 
32
27
  redraw: function() {
33
- this.redrawAll();
34
- this.redrawHighlighted();
35
- },
36
-
37
- redrawAll: function() {
38
- var canvas = this.ui.allAreasCanvas[0];
28
+ var area = this.options.area;
29
+ var canvas = this.ui.canvas[0];
39
30
 
40
- canvas.width = this.$el.width();
41
- canvas.height = this.$el.height();
31
+ var colorMapComponent = this.options.colorMap.componentByPermaId(area.get('mask_perma_id'));
42
32
 
43
- var context = canvas.getContext('2d');
44
-
45
- context.clearRect(0, 0, canvas.width, canvas.height);
33
+ if (colorMapComponent) {
34
+ var attributes = colorMapComponent.areaAttributes();
46
35
 
47
- this.options.areas.each(function(area) {
48
- if (!area.get('editing')) {
49
- this.drawArea(context, area);
50
- }
51
- }, this);
36
+ this.ui.canvas.css({
37
+ left: this.ui.canvasWrapper.width() * attributes.left / 100,
38
+ top: this.ui.canvasWrapper.height() * attributes.top / 100
39
+ });
52
40
 
53
- if (this.options.areas.length) {
54
- context.globalCompositeOperation = 'source-in';
55
-
56
- this.usePattern(context);
57
-
58
- context.globalAlpha = 0.2;
59
- context.fillRect(0, 0, canvas.width, canvas.height);
41
+ canvas.width = this.ui.canvasWrapper.width() * attributes.width / 100;
42
+ canvas.height = this.ui.canvasWrapper.height() * attributes.height / 100;
60
43
  }
61
- },
62
-
63
- redrawHighlighted: function() {
64
- var canvas = this.ui.highlightedAreaCanvas[0];
44
+ else {
45
+ this.ui.canvas.css({
46
+ left: 0,
47
+ top: 0
48
+ });
65
49
 
66
- canvas.width = this.$el.width();
67
- canvas.height = this.$el.height();
50
+ canvas.width = this.$el.width();
51
+ canvas.height = this.$el.height();
52
+ }
68
53
 
69
54
  var context = canvas.getContext('2d');
70
-
71
55
  context.clearRect(0, 0, canvas.width, canvas.height);
72
56
 
73
- var highlightedArea = this.options.areas.detect(function(area) {
74
- return area.get('highlighted');
75
- });
76
-
77
- if (highlightedArea && !highlightedArea.get('editing')) {
78
- this.drawArea(context, highlightedArea);
57
+ if (!area.get('editing')) {
58
+ this.drawArea(context, area);
79
59
 
80
60
  context.globalCompositeOperation = 'source-in';
81
- this.usePattern(context);
61
+ pageflow.linkmapPage.areaPattern.use(context);
62
+
63
+ if (area.get('highlighted')) {
64
+ context.globalAlpha = 0.4;
65
+ }
66
+ else {
67
+ context.globalAlpha = 0.2;
68
+ }
82
69
 
83
- context.globalAlpha = 0.4;
84
70
  context.fillRect(0, 0, canvas.width, canvas.height);
85
71
  }
86
72
  },
87
73
 
88
74
  drawArea: function(context, area) {
89
75
  var canvas = context.canvas;
90
- var mask = this.model.getLinkmapAreaMask(this.options.masks, area.get('mask_perma_id'));
76
+ var colorMapComponent = this.options.colorMap.componentByPermaId(area.get('mask_perma_id'));
91
77
 
92
- if (mask) {
93
- mask.draw(context, canvas.width);
78
+ if (colorMapComponent) {
79
+ colorMapComponent.draw(context, canvas.width);
94
80
  }
95
81
  else {
96
- context.fillRect(area.get('left') * canvas.width / 100,
97
- area.get('top') * canvas.height / 100,
98
- area.get('width') * canvas.width / 100,
99
- area.get('height') * canvas.height / 100);
82
+ context.fillRect(0,
83
+ 0,
84
+ canvas.width,
85
+ canvas.height);
100
86
  }
101
- },
102
-
103
- usePattern: function(context) {
104
- if (!this.patternSource) {
105
- var rectSize = 7;
106
-
107
- var canvas = document.createElement('canvas');
108
- this.patternSource = canvas;
109
-
110
- canvas.width = rectSize * 2;
111
- canvas.height = rectSize * 2;
112
-
113
- var c = canvas.getContext('2d');
114
-
115
- c.fillStyle = '#000';
116
- c.fillRect(0, 0, rectSize, rectSize);
117
- c.fillRect(rectSize, rectSize, rectSize, rectSize);
118
-
119
- c.fillStyle = '#fff';
120
- c.fillRect(rectSize, 0, rectSize, rectSize);
121
- c.fillRect(0, rectSize, rectSize, rectSize);
122
- }
123
-
124
- context.fillStyle = context.createPattern(this.patternSource, 'repeat');
125
87
  }
126
88
  });
@@ -9,10 +9,10 @@ pageflow.linkmapPage.AreasEmbeddedView = Backbone.Marionette.View.extend({
9
9
  render: function() {
10
10
  var view = this;
11
11
 
12
- var masksDelegator = this.masks = new pageflow.linkmapPage.MasksDelegator();
12
+ var colorMapDelegator = this.colorMap = new pageflow.linkmapPage.ColorMapDelegator();
13
13
 
14
- this.$el.on('linkmapupdatemasks', function(event, options) {
15
- masksDelegator.updateDelegate(options.masks);
14
+ this.$el.on('linkmapupdatecolormap', function(event, options) {
15
+ colorMapDelegator.updateDelegate(options.colorMap);
16
16
  view.updateClassNames();
17
17
  });
18
18
 
@@ -24,34 +24,33 @@ pageflow.linkmapPage.AreasEmbeddedView = Backbone.Marionette.View.extend({
24
24
  pageConfiguration: this.model,
25
25
  page: this.model.page,
26
26
  container: this.options.container,
27
- masks: masksDelegator
27
+ colorMap: colorMapDelegator
28
28
  }
29
29
  }));
30
30
 
31
- view.appendSubview(new pageflow.linkmapPage.AreaOutlinesEmbeddedView({
32
- model: this.model,
33
- areas: this.model.linkmapAreas(this.options.propertyName),
34
- masks: masksDelegator
35
- }));
36
-
37
31
  view.appendSubview(new pageflow.linkmapPage.AreaMasksPreviewEmbeddedView({
38
32
  model: this.model,
39
33
  areas: this.model.linkmapAreas(this.options.propertyName),
40
- masks: masksDelegator
34
+ colorMap: colorMapDelegator
41
35
  }));
42
36
 
43
37
  this.listenTo(this.model.page, 'change:areas_editable', function() {
44
38
  this.updateClassNames();
45
39
  });
46
40
 
41
+ this.listenTo(pageflow.entry, 'change:emulation_mode', function() {
42
+ this.updateClassNames();
43
+ });
44
+
47
45
  return this;
48
46
  },
49
47
 
50
48
  updateClassNames: function() {
51
- var editable = this.model.page.get('areas_editable');
49
+ var editable = this.model.page.get('areas_editable') && !pageflow.entry.has('emulation_mode');
52
50
 
53
51
  this.$el.toggleClass('editable', !!editable);
54
52
  this.$el.toggleClass('masks_available',
55
- !this.masks.isEmpty() && this.model.get('background_type') !== 'hover_video');
53
+ this.colorMap.components().length > 0 &&
54
+ this.model.get('background_type') !== 'hover_video');
56
55
  }
57
56
  });
@@ -0,0 +1,61 @@
1
+ pageflow.linkmapPage.MobileInfoBoxEmbeddedView = Backbone.Marionette.View.extend({
2
+ modelEvents: {
3
+ 'change:mobile_info_box_title change:mobile_info_box_description': 'update'
4
+ },
5
+
6
+ render: function() {
7
+ var collection = this.model.linkmapAreas();
8
+ var paginator = this.paginator = this.$el.find('.linkmap-paginator');
9
+
10
+ this.setupOverviewPage();
11
+
12
+ this.subview(new pageflow.CollectionView({
13
+ el: this.$el.find('.linkmap-paginator-page_group'),
14
+ collection: collection,
15
+ itemViewConstructor: pageflow.linkmapPage.MobileInfoBoxPageItemEmbeddedView,
16
+ itemViewOptions: {
17
+ paginator: paginator
18
+ }
19
+ }));
20
+
21
+ this.listenTo(collection, 'add remove', function() {
22
+ paginator.linkmapPaginator('update');
23
+ });
24
+
25
+ this.listenTo(collection, 'sort', function() {
26
+ paginator.linkmapPaginator('update');
27
+ });
28
+
29
+ this.listenTo(collection, 'select', function(area) {
30
+ paginator.linkmapPaginator('goToPage', collection.indexOf(area) + 1);
31
+ });
32
+
33
+ this.listenTo(collection, 'resetSelection', function(area) {
34
+ paginator.linkmapPaginator('goToPage', 0);
35
+ });
36
+
37
+ this.update();
38
+ paginator.linkmapPaginator('update');
39
+
40
+ return this;
41
+ },
42
+
43
+ setupOverviewPage: function() {
44
+ var overviewPage = this.$el.find('.linkmap-mobile_info_box-overview_page');
45
+
46
+ this.ui = {
47
+ title: $('<h3 />').appendTo(overviewPage),
48
+ description: $('<p />').appendTo(overviewPage)
49
+ };
50
+ },
51
+
52
+ update: function() {
53
+ this.ui.title.text(this.model.get('mobile_info_box_title'));
54
+ this.ui.description.html(this.model.get('mobile_info_box_description'));
55
+
56
+ this.ui.title.toggle(!!this.model.get('mobile_info_box_title'));
57
+ this.ui.description.toggle(!!this.model.get('mobile_info_box_description'));
58
+
59
+ this.paginator.linkmapPaginator('updateHeight');
60
+ }
61
+ });