1
1
/**
2
2
* @provides javelin-behavior-pholio-mock-view
3
3
* @requires javelin-behavior
4
+ * javelin-util
4
5
* javelin-stratcom
5
6
* javelin-dom
6
7
* javelin-vector
10
11
JX . behavior ( 'pholio-mock-view' , function ( config ) {
11
12
var is_dragging = false ;
12
13
13
- var wrapper = JX . $ ( 'mock-wrapper' ) ;
14
14
var drag_begin ;
15
15
var drag_end ;
16
+ var panel = JX . $ ( config . panelID ) ;
17
+ var viewport = JX . $ ( config . viewportID ) ;
16
18
17
19
var selection_border ;
18
20
var selection_fill ;
@@ -29,16 +31,38 @@ JX.behavior('pholio-mock-view', function(config) {
29
31
return null ;
30
32
}
31
33
32
- function select_image ( image_id ) {
33
- var image = get_image ( image_id ) ;
34
- active_image = image ;
34
+ function onload_image ( id ) {
35
+ if ( active_image . id != id ) {
36
+ // The user has clicked another image before this one loaded, so just
37
+ // bail.
38
+ return ;
39
+ }
40
+
41
+ // If the image is too wide for the viewport, scale it down so it fits.
42
+ // (If it is too tall, we just let the user scroll.)
43
+ var w = JX . Vector . getDim ( panel ) ;
44
+ w . x -= 40 ;
45
+ if ( w . x < this . naturalWidth ) {
46
+ var scale = w . x / this . naturalWidth ;
47
+ this . width = Math . floor ( scale * this . naturalWidth ) ;
48
+ this . height = Math . floor ( scale * this . naturalHeight ) ;
49
+ }
35
50
36
- var main = JX . $ ( config . mainID ) ;
37
- main . src = image . fullURI ;
38
- JX . DOM . show ( main ) ;
51
+ active_image . tag = this ;
52
+
53
+ // NOTE: This also clears inline comment reticles.
54
+ JX . DOM . setContent ( viewport , this ) ;
55
+
56
+ redraw_inlines ( active_image . id ) ;
57
+ }
58
+
59
+ function select_image ( image_id ) {
60
+ active_image = get_image ( image_id ) ;
61
+ active_image . tag = null ;
39
62
40
- // NOTE: This is to clear inline comment reticles.
41
- JX . DOM . setContent ( wrapper , main ) ;
63
+ var img = JX . $N ( 'img' , { className : 'pholio-mock-image' } ) ;
64
+ img . onload = JX . bind ( img , onload_image , active_image . id ) ;
65
+ img . src = active_image . fullURI ;
42
66
43
67
load_inline_comments ( ) ;
44
68
}
@@ -54,7 +78,7 @@ JX.behavior('pholio-mock-view', function(config) {
54
78
// Select and show the first image.
55
79
select_image ( config . images [ 0 ] . id ) ;
56
80
57
- JX . Stratcom . listen ( 'mousedown' , 'mock-wrapper ' , function ( e ) {
81
+ JX . Stratcom . listen ( 'mousedown' , 'mock-panel ' , function ( e ) {
58
82
if ( ! e . isNormalMouseEvent ( ) ) {
59
83
return ;
60
84
}
@@ -111,8 +135,8 @@ JX.behavior('pholio-mock-view', function(config) {
111
135
112
136
var dialog = JX . $ ( 'pholio-new-inline-comment-dialog' ) ;
113
137
114
- var wrapperVector = JX . $V ( wrapper ) ;
115
- var wrapperDimensions = JX . Vector . getDim ( wrapper ) ;
138
+ var viewportVector = JX . $V ( viewport ) ;
139
+ var viewportDimensions = JX . Vector . getDim ( viewport ) ;
116
140
117
141
JX . $V (
118
142
// TODO: This is a little funky for now.
@@ -145,6 +169,13 @@ JX.behavior('pholio-mock-view', function(config) {
145
169
146
170
for ( var ii = 0 ; ii < inlines . length ; ii ++ ) {
147
171
var inline = inlines [ ii ] ;
172
+ JX . DOM . appendContent ( comment_holder , JX . $H ( inline . contentHTML ) ) ;
173
+
174
+ if ( ! active_image . tag ) {
175
+ // The image itself hasn't loaded yet, so we can't draw the inline
176
+ // reticles.
177
+ continue ;
178
+ }
148
179
149
180
var inlineSelection = JX . $N (
150
181
'div' ,
@@ -158,9 +189,8 @@ JX.behavior('pholio-mock-view', function(config) {
158
189
{ phid : inline . phid } ) ;
159
190
160
191
JX . Stratcom . addSigil ( inlineSelection , "image_selection" ) ;
161
- JX . DOM . appendContent ( comment_holder , JX . $H ( inline . contentHTML ) ) ;
162
192
163
- JX . DOM . appendContent ( wrapper , inlineSelection ) ;
193
+ JX . DOM . appendContent ( viewport , inlineSelection ) ;
164
194
165
195
position_inline_rectangle ( inline , inlineSelection ) ;
166
196
@@ -180,29 +210,38 @@ JX.behavior('pholio-mock-view', function(config) {
180
210
{ phid : inline . phid } ) ;
181
211
182
212
JX . Stratcom . addSigil ( inlineDraft , "image_selection" ) ;
183
- JX . DOM . appendContent ( wrapper , inlineDraft ) ;
213
+ JX . DOM . appendContent ( viewport , inlineDraft ) ;
184
214
}
185
215
}
186
216
}
187
217
188
218
function position_inline_rectangle ( inline , rect ) {
189
- JX . $V ( inline . x , inline . y ) . setPos ( rect ) ;
190
- JX . $V ( inline . width , inline . height ) . setDim ( rect ) ;
219
+ var scale = active_image . tag . width / active_image . tag . naturalWidth ;
220
+
221
+ JX . $V ( scale * inline . x , scale * inline . y ) . setPos ( rect ) ;
222
+ JX . $V ( scale * inline . width , scale * inline . height ) . setDim ( rect ) ;
191
223
}
192
224
193
225
function get_image_xy ( p ) {
194
- var main = JX . $ ( config . mainID ) ;
195
- var mainp = JX . $V ( main ) ;
226
+ var img = active_image . tag ;
227
+ var imgp = JX . $V ( img ) ;
228
+
229
+ var scale = 1 / get_image_scale ( ) ;
196
230
197
- var x = Math . max ( 0 , Math . min ( p . x - mainp . x , main . naturalWidth ) ) ;
198
- var y = Math . max ( 0 , Math . min ( p . y - mainp . y , main . naturalHeight ) ) ;
231
+ var x = scale * Math . max ( 0 , Math . min ( p . x - imgp . x , img . width ) ) ;
232
+ var y = scale * Math . max ( 0 , Math . min ( p . y - imgp . y , img . height ) ) ;
199
233
200
234
return {
201
235
x : x ,
202
236
y : y
203
237
} ;
204
238
}
205
239
240
+ function get_image_scale ( ) {
241
+ var img = active_image . tag ;
242
+ return img . width / img . naturalWidth ;
243
+ }
244
+
206
245
function redraw_selection ( ) {
207
246
selection_border = selection_border || JX . $N (
208
247
'div' ,
@@ -220,10 +259,17 @@ JX.behavior('pholio-mock-view', function(config) {
220
259
Math . max ( drag_begin . x , drag_end . x ) - p . x ,
221
260
Math . max ( drag_begin . y , drag_end . y ) - p . y ) ;
222
261
262
+ var scale = get_image_scale ( ) ;
263
+
264
+ p . x *= scale ;
265
+ p . y *= scale ;
266
+ d . x *= scale ;
267
+ d . y *= scale ;
268
+
223
269
var nodes = [ selection_border , selection_fill ] ;
224
270
for ( var ii = 0 ; ii < nodes . length ; ii ++ ) {
225
271
var node = nodes [ ii ] ;
226
- wrapper . appendChild ( node ) ;
272
+ viewport . appendChild ( node ) ;
227
273
p . setPos ( node ) ;
228
274
d . setDim ( node ) ;
229
275
}
@@ -393,4 +439,5 @@ JX.behavior('pholio-mock-view', function(config) {
393
439
}
394
440
395
441
load_inline_comments ( ) ;
442
+
396
443
} ) ;
0 commit comments