sproutcore 1.11.0.rc1 → 1.11.0.rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/VERSION.yml +1 -1
- data/lib/frameworks/sproutcore/CHANGELOG.md +93 -65
- data/lib/frameworks/sproutcore/apps/showcase/controllers/source_tree_controller.js +17 -7
- data/lib/frameworks/sproutcore/apps/showcase/resources/main_page.js +22 -2
- data/lib/frameworks/sproutcore/apps/showcase/resources/stylesheet.css +14 -0
- data/lib/frameworks/sproutcore/apps/showcase/resources/views_page.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +20 -8
- data/lib/frameworks/sproutcore/frameworks/ajax/system/websocket.js +58 -43
- data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +192 -35
- data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/delegate_support.js +7 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/responder_context.js +27 -7
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/browser.js +20 -63
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/color.js +16 -7
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +279 -159
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +21 -10
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/action_support.js +32 -28
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/targetForAction.js +107 -90
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/touch.js +33 -25
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/touch.js +23 -15
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +12 -6
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +55 -33
- data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +7 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/methods.js +228 -72
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/touch.js +54 -100
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +15 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +57 -45
- data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +9 -16
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll_view.js +111 -44
- data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +2 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +51 -5
- data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +13 -10
- data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +28 -9
- data/lib/frameworks/sproutcore/frameworks/runtime/system/set.js +7 -5
- data/lib/frameworks/sproutcore/frameworks/statechart/ext/function.js +51 -46
- data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +8 -5
- data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +12 -3
- metadata +2 -2
@@ -79,8 +79,11 @@ module("SC.ScrollView touch", {
|
|
79
79
|
evt.pageY = 50;
|
80
80
|
evt.changedTouches = [evt];
|
81
81
|
},
|
82
|
+
|
82
83
|
teardown: function() {
|
83
84
|
SC.run(pane.destroy, pane);
|
85
|
+
|
86
|
+
pane = scrollView = inner = targetLayer = evt = null;
|
84
87
|
}
|
85
88
|
});
|
86
89
|
|
@@ -89,25 +92,19 @@ module("SC.ScrollView touch", {
|
|
89
92
|
// but since there was no scroll, it will give inner views a chance to respond to it on touchEnd.
|
90
93
|
test("Tapping with delaysContentTouches: YES", function() {
|
91
94
|
// Trigger touchstart
|
92
|
-
SC.
|
93
|
-
SC.Event.trigger(targetLayer, 'touchstart', [evt]);
|
94
|
-
});
|
95
|
+
SC.Event.trigger(targetLayer, 'touchstart', evt);
|
95
96
|
|
96
97
|
equals(scrollStart, 1, "After touchstart, the scroll view's touchStart should have been called once");
|
97
98
|
equals(innerStart, 0, "After touchstart, the inner view's touchStart should not have been called, as the touch was captured by the scroll view");
|
98
99
|
|
99
100
|
// Trigger touchmove:
|
100
|
-
SC.
|
101
|
-
SC.Event.trigger(targetLayer, 'touchmove', [evt]);
|
102
|
-
});
|
101
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
103
102
|
|
104
103
|
equals(scrollDragged, 1, "After touchmove, the scroll view's touchesDragged should have been called once");
|
105
104
|
equals(innerDragged, 0, "After touchmove, the inner view's touchesDragged should not have been called, as the touch is still owned by the scroll view");
|
106
105
|
|
107
106
|
// Trigger touchend:
|
108
|
-
SC.
|
109
|
-
SC.Event.trigger(targetLayer, 'touchend', [evt]);
|
110
|
-
});
|
107
|
+
SC.Event.trigger(targetLayer, 'touchend', evt);
|
111
108
|
|
112
109
|
equals(scrollEnd, 1, "After touchend, the scroll view's touchEnd should have been called once");
|
113
110
|
equals(innerStart, 1, "Once the scroll view has handled touchEnd, it passes the touch to the inner view, so innerStart should have run");
|
@@ -120,9 +117,7 @@ test("Tapping with delaysContentTouches: YES", function() {
|
|
120
117
|
// touch, and since there was a scroll, the inner view will not receive any notifications whatsoever.
|
121
118
|
test("Dragging with delaysContentTouches: YES", function() {
|
122
119
|
// Trigger touchstart
|
123
|
-
SC.
|
124
|
-
SC.Event.trigger(targetLayer, 'touchstart', [evt]);
|
125
|
-
});
|
120
|
+
SC.Event.trigger(targetLayer, 'touchstart', evt);
|
126
121
|
|
127
122
|
equals(scrollStart, 1, "After touchstart, the scroll view's touchStart should have been called once");
|
128
123
|
equals(innerStart, 0, "After touchstart, the inner view's touchStart should not have been called, as the touch was captured by the scroll view");
|
@@ -130,17 +125,13 @@ test("Dragging with delaysContentTouches: YES", function() {
|
|
130
125
|
// Give the event some vertical delta:
|
131
126
|
evt.pageY += 16;
|
132
127
|
// Trigger touchmove:
|
133
|
-
SC.
|
134
|
-
SC.Event.trigger(targetLayer, 'touchmove', [evt]);
|
135
|
-
});
|
128
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
136
129
|
|
137
130
|
equals(scrollDragged, 1, "After touchmove, the scroll view's touchesDragged should have been called once");
|
138
131
|
equals(innerDragged, 0, "After touchmove, the inner view's touchesDragged should not have been called, as the touch is still owned by the scroll view");
|
139
132
|
|
140
133
|
// Trigger touchend:
|
141
|
-
SC.
|
142
|
-
SC.Event.trigger(targetLayer, 'touchend', [evt]);
|
143
|
-
});
|
134
|
+
SC.Event.trigger(targetLayer, 'touchend', evt);
|
144
135
|
|
145
136
|
equals(scrollEnd, 1, "After touchend, the scroll view's touchEnd should have been called once");
|
146
137
|
equals(innerStart, 0, "inner view's touchStart will not have run, as the touch has moved enough to begin scrolling and will bypass the inner view entirely");
|
@@ -154,25 +145,19 @@ test("Tapping with delaysContentTouches: NO", function() {
|
|
154
145
|
scrollView.set('delaysContentTouches', NO);
|
155
146
|
|
156
147
|
// Trigger touchstart
|
157
|
-
SC.
|
158
|
-
SC.Event.trigger(targetLayer, 'touchstart', [evt]);
|
159
|
-
});
|
148
|
+
SC.Event.trigger(targetLayer, 'touchstart', evt);
|
160
149
|
|
161
150
|
equals(scrollStart, 0, "We're not capturing touches, so scroll view's touchStart will not have fired after touchstart");
|
162
151
|
equals(innerStart, 1, "After touchstart, inner view's touchStart will have been called once");
|
163
152
|
|
164
153
|
// Trigger touchmove:
|
165
|
-
SC.
|
166
|
-
SC.Event.trigger(targetLayer, 'touchmove', [evt]);
|
167
|
-
});
|
154
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
168
155
|
|
169
156
|
equals(scrollDragged, 0, "Scroll view's touchesDragged will not have fired, as it is not the touch responder");
|
170
157
|
equals(innerDragged, 1, "After touchmove, inner view's touchDragged gets straightforwardly called because it is the touch responder");
|
171
158
|
|
172
159
|
// Trigger touchend:
|
173
|
-
SC.
|
174
|
-
SC.Event.trigger(targetLayer, 'touchend', [evt]);
|
175
|
-
});
|
160
|
+
SC.Event.trigger(targetLayer, 'touchend', evt);
|
176
161
|
|
177
162
|
equals(scrollEnd, 0, "Again, the scroll view is completely uninvolved in this touch, so its touchEnd doesn't get called");
|
178
163
|
equals(innerEnd, 1, "The inner view's touchEnd gets called because of how it's responding to the touch");
|
@@ -186,9 +171,7 @@ test("Dragging with delaysContentTouches: NO", function() {
|
|
186
171
|
scrollView.set('delaysContentTouches', NO);
|
187
172
|
|
188
173
|
// Trigger touchstart
|
189
|
-
SC.
|
190
|
-
SC.Event.trigger(targetLayer, 'touchstart', [evt]);
|
191
|
-
});
|
174
|
+
SC.Event.trigger(targetLayer, 'touchstart', evt);
|
192
175
|
|
193
176
|
equals(scrollStart, 0, "Since the scroll view isn't capturing touches, it gets no touchStart love");
|
194
177
|
equals(innerStart, 1, "After touchstart, the inner view's touchStart should have been straightforwardly called");
|
@@ -196,9 +179,7 @@ test("Dragging with delaysContentTouches: NO", function() {
|
|
196
179
|
// Give the event some vertical delta:
|
197
180
|
evt.pageY += 16;
|
198
181
|
// Trigger touchmove:
|
199
|
-
SC.
|
200
|
-
SC.Event.trigger(targetLayer, 'touchmove', [evt]);
|
201
|
-
});
|
182
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
202
183
|
|
203
184
|
equals(scrollDragged, 0, "The scroll view's touchDragged should not have been called, since at the time of the event it was not the touch's responder");
|
204
185
|
equals(innerDragged, 1, "The inner view's touchesDragged should have straightforwardly handled the event");
|
@@ -206,9 +187,7 @@ test("Dragging with delaysContentTouches: NO", function() {
|
|
206
187
|
equals(innerCancel, 1, "Having passed the touch back to the scroll view, the inner view's touchCancelled should have run");
|
207
188
|
|
208
189
|
// Trigger touchend:
|
209
|
-
SC.
|
210
|
-
SC.Event.trigger(targetLayer, 'touchend', [evt]);
|
211
|
-
});
|
190
|
+
SC.Event.trigger(targetLayer, 'touchend', evt);
|
212
191
|
|
213
192
|
equals(scrollEnd, 1, "After touchend, the scroll view's touchEnd should have been called once");
|
214
193
|
});
|
@@ -259,13 +238,13 @@ module("SC.ScrollView touch thresholds and locks", {
|
|
259
238
|
|
260
239
|
// // Start touch
|
261
240
|
// SC.run(function() {
|
262
|
-
// SC.Event.trigger(targetLayer, 'touchstart',
|
241
|
+
// SC.Event.trigger(targetLayer, 'touchstart', evt);
|
263
242
|
// });
|
264
243
|
|
265
244
|
// // Move touch up less than touchScrollThreshold.
|
266
245
|
// evt.pageY = initialPageY - 9;
|
267
246
|
// SC.run(function() {
|
268
|
-
// SC.Event.trigger(targetLayer, 'touchmove',
|
247
|
+
// SC.Event.trigger(targetLayer, 'touchmove', evt);
|
269
248
|
// });
|
270
249
|
// equals(scrollView.get('verticalScrollOffset'), 0, "Scrolling less than touchScrollThreshold results in no scrolling");
|
271
250
|
// if (scrollView.get('horizontalScrollOffset') !== 0) ok(false, "A touch with no horizontal change shouldn't trigger a horizontal scroll!");
|
@@ -273,7 +252,7 @@ module("SC.ScrollView touch thresholds and locks", {
|
|
273
252
|
// // Move touch up more than touchScrollThreshold.
|
274
253
|
// evt.pageY = initialPageY - 11;
|
275
254
|
// SC.run(function() {
|
276
|
-
// SC.Event.trigger(targetLayer, 'touchmove',
|
255
|
+
// SC.Event.trigger(targetLayer, 'touchmove', evt);
|
277
256
|
// });
|
278
257
|
// equals(scrollView.get('verticalScrollOffset'), 11, "Scrolling more than touchScrollThreshold results in scrolling");
|
279
258
|
// if (scrollView.get('horizontalScrollOffset') !== 0) ok(false, "A touch with no horizontal change shouldn't trigger a horizontal scroll!");
|
@@ -281,7 +260,7 @@ module("SC.ScrollView touch thresholds and locks", {
|
|
281
260
|
// // Move touch sideways less than touchSecondaryScrollThreshold.
|
282
261
|
// evt.pageX = initialPageX - 19;
|
283
262
|
// SC.run(function() {
|
284
|
-
// SC.Event.trigger(targetLayer, 'touchmove',
|
263
|
+
// SC.Event.trigger(targetLayer, 'touchmove', evt);
|
285
264
|
// });
|
286
265
|
// if (scrollView.get('verticalScrollOffset') !== 11) ok(false, "A touch with no vertical change shouldn't trigger a vertical scroll!");
|
287
266
|
// equals(scrollView.get('horizontalScrollOffset'), 0, "With a vertical scroll in motion, scrolling horizontally less than touchSecondaryScrollThreshold results in no scrolling");
|
@@ -289,7 +268,7 @@ module("SC.ScrollView touch thresholds and locks", {
|
|
289
268
|
// // Move touch sideways more than touchSecondaryScrollThreshold.
|
290
269
|
// evt.pageX = initialPageX - 21;
|
291
270
|
// SC.run(function() {
|
292
|
-
// SC.Event.trigger(targetLayer, 'touchmove',
|
271
|
+
// SC.Event.trigger(targetLayer, 'touchmove', evt);
|
293
272
|
// });
|
294
273
|
// if (scrollView.get('verticalScrollOffset') !== 11) ok(false, "A touch with no vertical change shouldn't trigger a vertical scroll!");
|
295
274
|
// equals(scrollView.get('horizontalScrollOffset'), 21, "With a vertical scroll in motion, scrolling horizontally by more than touchSecondaryScrollThreshold results in scrolling");
|
@@ -301,26 +280,21 @@ test("Touch scroll lock", function() {
|
|
301
280
|
equals(scrollView.get('horizontalScrollOffset'), 0, "PRELIM: Horizontal offset starts at");
|
302
281
|
|
303
282
|
// Start touch
|
304
|
-
SC.
|
305
|
-
SC.Event.trigger(targetLayer, 'touchstart', [evt]);
|
306
|
-
});
|
283
|
+
SC.Event.trigger(targetLayer, 'touchstart', evt);
|
307
284
|
|
308
285
|
// Move touch up more than touchSecondaryScrollLock.
|
309
286
|
evt.pageY = initialPageY - SC.SCROLL.SCROLL_LOCK_GESTURE_THRESHOLD;
|
310
|
-
SC.
|
311
|
-
|
312
|
-
});
|
287
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
288
|
+
|
313
289
|
equals(scrollView.get('verticalScrollOffset'), SC.SCROLL.SCROLL_LOCK_GESTURE_THRESHOLD, "PRELIM: Scrolling more than touchScrollThreshold results in scrolling");
|
314
290
|
equals(scrollView.get('horizontalScrollOffset'), 0, "A touch with no horizontal change shouldn't trigger a horizontal scroll!");
|
315
291
|
|
316
292
|
// Move touch sideways.
|
317
293
|
evt.pageX = initialPageX - 50;
|
318
|
-
SC.
|
319
|
-
|
320
|
-
});
|
294
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
295
|
+
|
321
296
|
equals(scrollView.get('verticalScrollOffset'), SC.SCROLL.SCROLL_LOCK_GESTURE_THRESHOLD, "A touch with no vertical change shouldn't trigger a vertical scroll!");
|
322
297
|
equals(scrollView.get('horizontalScrollOffset'), 0, "Having scrolled vertically past the scrollGestureSecondaryThreshold, horizontal touch movements are ignored");
|
323
|
-
|
324
298
|
});
|
325
299
|
|
326
300
|
module("SC.ScrollView touch scale", {
|
@@ -388,19 +362,16 @@ test("Basic touch scale", function() {
|
|
388
362
|
// Start touches.
|
389
363
|
evt.touches = [];
|
390
364
|
evt.changedTouches = [evt, evt2];
|
391
|
-
SC.
|
392
|
-
|
393
|
-
});
|
365
|
+
SC.Event.trigger(targetLayer, 'touchstart', evt);
|
366
|
+
|
394
367
|
equals(SC.RootResponder.responder.touchesForView(scrollView).length, 2, "Two touches should result in two touches");
|
395
368
|
|
396
369
|
// Pinch out to 2x.
|
397
|
-
evt.touches = [evt, evt2];
|
398
|
-
evt.changedTouches = [evt, evt2];
|
399
370
|
evt.pageX = evt.pageY -= 100;
|
400
371
|
evt2.pageX = evt2.pageY += 100;
|
401
|
-
|
402
|
-
|
403
|
-
|
372
|
+
evt.touches = [evt, evt2];
|
373
|
+
// evt.changedTouches = [touch1, touch2];
|
374
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
404
375
|
|
405
376
|
// SC.ScrollView's touch-pinching depends heavily on SC.RootResponder#averagedTouchesForView. If these tests
|
406
377
|
// are misbehaving, first verify that SC.RootResponder's touch tests are passing.
|
@@ -411,9 +382,7 @@ test("Basic touch scale", function() {
|
|
411
382
|
// Move the gesture.
|
412
383
|
evt.pageX = evt.pageY += 100;
|
413
384
|
evt2.pageX = evt2.pageY += 100;
|
414
|
-
SC.
|
415
|
-
SC.Event.trigger(targetLayer, 'touchmove', [evt]);
|
416
|
-
});
|
385
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
417
386
|
|
418
387
|
equals(scrollView.get('scale'), 2, "A gesture change with no change in distance should not change scale");
|
419
388
|
equals(scrollView.get('horizontalScrollOffset'), 400, "Gesture change in position by 100 should move offsets by 100");
|
@@ -422,9 +391,7 @@ test("Basic touch scale", function() {
|
|
422
391
|
// Move and pinch (back to 1x) in the same gesture.
|
423
392
|
evt.pageX = evt.pageY = 400;
|
424
393
|
evt2.pageX = evt2.pageY = 600;
|
425
|
-
SC.
|
426
|
-
SC.Event.trigger(targetLayer, 'touchmove', [evt]);
|
427
|
-
});
|
394
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
428
395
|
|
429
396
|
equals(scrollView.get('scale'), 1, "A pinch + move gesture should change the scale");
|
430
397
|
equals(scrollView.get('horizontalScrollOffset'), 0, "A pinch + move gesture should update the horizontal offset correctly");
|
@@ -443,45 +410,38 @@ test("Adding and removing touches (no scaling).", function() {
|
|
443
410
|
// Start touches.
|
444
411
|
evt.touches = [];
|
445
412
|
evt.changedTouches = [evt, evt2];
|
446
|
-
SC.
|
447
|
-
|
448
|
-
});
|
413
|
+
SC.Event.trigger(targetLayer, 'touchstart', evt);
|
414
|
+
|
449
415
|
equals(SC.RootResponder.responder.touchesForView(scrollView).length, 2, "Two touches should result in two touches");
|
450
416
|
|
451
|
-
// Update the touch lists.
|
452
|
-
evt.touches = [evt, evt2];
|
453
|
-
evt.changedTouches = [evt, evt2];
|
454
|
-
// Move touches up in tandem.
|
455
417
|
evt.pageY -= 100;
|
456
418
|
evt2.pageY -= 100;
|
457
|
-
|
458
|
-
|
459
|
-
|
419
|
+
evt.touches = [evt, evt2];
|
420
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
421
|
+
|
460
422
|
equals(SC.RootResponder.responder.touchesForView(scrollView).length, 2, "There should still be two touches");
|
461
423
|
equals(scrollView.get('scale'), 1, "A two-touch gesture with no pinching should result in no scaling");
|
462
424
|
equals(scrollView.get('horizontalScrollOffset'), 0, "A two-touch vertical scroll gesture should not scroll horizontally");
|
463
425
|
equals(scrollView.get('verticalScrollOffset'), 100, "A two-touch vertical scroll gesture should successfully scroll vertically");
|
464
426
|
|
465
427
|
// Add a third touch.
|
466
|
-
|
467
|
-
|
468
|
-
SC.
|
469
|
-
|
470
|
-
});
|
428
|
+
evt.touches = [evt, evt2];
|
429
|
+
evt.changedTouches = [evt3];
|
430
|
+
SC.Event.trigger(targetLayer, 'touchstart', evt);
|
431
|
+
|
471
432
|
equals(SC.RootResponder.responder.touchesForView(scrollView).length, 3, "Adding a third touch should result in three touches");
|
472
433
|
equals(scrollView.get('scale'), 1, "Adding a third touch should not impact scaling");
|
473
434
|
equals(scrollView.get('horizontalScrollOffset'), 0, "Adding a third touch should not impact horizontal offset");
|
474
435
|
equals(scrollView.get('verticalScrollOffset'), 100, "Adding a third touch should not impact vertical offset");
|
475
436
|
|
476
437
|
// Move all three touches up in tandem.
|
477
|
-
evt.touches = [evt, evt2, evt3];
|
478
|
-
evt.changedTouches = [evt, evt2, evt3];
|
479
438
|
evt.pageY -= 100;
|
480
439
|
evt2.pageY -= 100;
|
481
440
|
evt3.pageY -= 100;
|
482
|
-
|
483
|
-
|
484
|
-
|
441
|
+
evt.touches = [evt, evt2, evt3];
|
442
|
+
evt.changedTouches = [evt, evt2, evt3];
|
443
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
444
|
+
|
485
445
|
equals(scrollView.get('scale'), 1, "A three-touch gesture with no pinching should result in no scaling");
|
486
446
|
equals(scrollView.get('horizontalScrollOffset'), 0, "A now-three-touch vertical scroll gesture should not scroll horizontally");
|
487
447
|
equals(scrollView.get('verticalScrollOffset'), 200, "A now-three-touch vertical scroll gesture should successfully scroll vertically");
|
@@ -495,18 +455,15 @@ test("Adding and removing touches while scaling.", function() {
|
|
495
455
|
// Start touches.
|
496
456
|
evt.touches = [];
|
497
457
|
evt.changedTouches = [evt, evt2];
|
498
|
-
SC.
|
499
|
-
SC.Event.trigger(targetLayer, 'touchstart', [evt]);
|
500
|
-
});
|
458
|
+
SC.Event.trigger(targetLayer, 'touchstart', evt);
|
501
459
|
equals(SC.RootResponder.responder.touchesForView(scrollView).length, 2, "Two touches should result in two touches");
|
502
460
|
|
503
461
|
// Pinch out to 2x to begin scaling.
|
504
462
|
evt.touches = [evt, evt2];
|
505
463
|
evt.pageX = evt.pageY = 300;
|
506
464
|
evt2.pageX = evt2.pageY = 700;
|
507
|
-
SC.
|
508
|
-
|
509
|
-
});
|
465
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
466
|
+
|
510
467
|
equals(scrollView.get('scale'), 2, "A 2x pinch gesture should double the scroll's scale");
|
511
468
|
equals(scrollView.get('horizontalScrollOffset'), 500, "A centered pinch gesture should move the horizontal offset by half the content view's change in width");
|
512
469
|
equals(scrollView.get('verticalScrollOffset'), 500, "A centered pinch gesture should move the vertical offset by half the content view's change in height");
|
@@ -514,9 +471,8 @@ test("Adding and removing touches while scaling.", function() {
|
|
514
471
|
// Remove our second touch.
|
515
472
|
evt2.touches = [evt, evt2];
|
516
473
|
evt2.changedTouches = [evt2];
|
517
|
-
SC.
|
518
|
-
|
519
|
-
});
|
474
|
+
SC.Event.trigger(targetLayer, 'touchend', evt2);
|
475
|
+
|
520
476
|
equals(SC.RootResponder.responder.touchesForView(scrollView).length, 1, "Removing one of two touches should leave one touch");
|
521
477
|
equals(scrollView.get('scale'), 2, "Removing a touch shouldn't change scale");
|
522
478
|
equals(scrollView.get('horizontalScrollOffset'), 500, "Removing a touch shouldn't change the horizontal offset");
|
@@ -527,9 +483,8 @@ test("Adding and removing touches while scaling.", function() {
|
|
527
483
|
evt3.changedTouches = [evt3];
|
528
484
|
evt3.pageX = 700;
|
529
485
|
evt3.pageY = 700;
|
530
|
-
SC.
|
531
|
-
|
532
|
-
});
|
486
|
+
SC.Event.trigger(targetLayer, 'touchstart', evt3);
|
487
|
+
|
533
488
|
equals(SC.RootResponder.responder.touchesForView(scrollView).length, 2, "Adding one touch to one touch should result in two touches");
|
534
489
|
equals(scrollView.get('scale'), 2, "Adding a touch shouldn't change scale");
|
535
490
|
equals(scrollView.get('horizontalScrollOffset'), 500, "Adding a touch shouldn't change the horizontal offset");
|
@@ -540,9 +495,8 @@ test("Adding and removing touches while scaling.", function() {
|
|
540
495
|
evt.changedTouches = [evt, evt3];
|
541
496
|
evt.pageX = evt.pageY = 400;
|
542
497
|
evt3.pageX = evt3.pageY = 600;
|
543
|
-
SC.
|
544
|
-
|
545
|
-
});
|
498
|
+
SC.Event.trigger(targetLayer, 'touchmove', evt);
|
499
|
+
|
546
500
|
equals(scrollView.get('scale'), 1, "Pinching back down by half should reverse doubling of scaling");
|
547
501
|
equals(scrollView.get('horizontalScrollOffset'), 0, "Pinching back down by half should reverse horizontal offset change");
|
548
502
|
equals(scrollView.get('verticalScrollOffset'), 0, "Pinching back down by half should reverse vertical offset change");
|
@@ -605,5 +605,20 @@ var pane;
|
|
605
605
|
ok(SC.none(segmentedView.getPath('layout.width')), "Having flexible layout prevents view from auto-resizing.");
|
606
606
|
});
|
607
607
|
|
608
|
+
test("Check adjusting a segment views layout updates its frame", function() {
|
609
|
+
var segmentedView;
|
610
|
+
|
611
|
+
segmentedView = pane.view('3_empty');
|
612
|
+
|
613
|
+
equals(segmentedView.get('layout').height, 25, '3_empty.layout should have a height of 25');
|
614
|
+
equals(segmentedView.get('frame').height, 25, '3_empty.layout should have a height of 25');
|
615
|
+
|
616
|
+
// adjust the views height
|
617
|
+
segmentedView.adjust('height', 30);
|
618
|
+
|
619
|
+
equals(segmentedView.get('layout').height, 30, '3_empty.layout should have a height of 30');
|
620
|
+
equals(segmentedView.get('frame').height, 30, '3_empty.layout should have a height of 30');
|
621
|
+
})
|
622
|
+
|
608
623
|
|
609
624
|
})();
|
@@ -57,7 +57,7 @@ SC.HOLD_BEHAVIOR = 'hold';
|
|
57
57
|
@extends SC.Control
|
58
58
|
@since SproutCore 1.0
|
59
59
|
*/
|
60
|
-
SC.ButtonView = SC.View.extend(SC.Control,
|
60
|
+
SC.ButtonView = SC.View.extend(SC.ActionSupport, SC.Control,
|
61
61
|
/** @scope SC.ButtonView.prototype */ {
|
62
62
|
|
63
63
|
/**
|
@@ -71,6 +71,32 @@ SC.ButtonView = SC.View.extend(SC.Control,
|
|
71
71
|
return NO;
|
72
72
|
}.property('isEnabledInPane'),
|
73
73
|
|
74
|
+
/**
|
75
|
+
The name of the method to call when the button is pressed.
|
76
|
+
|
77
|
+
This property is used in conjunction with the `target` property to execute a method when a
|
78
|
+
regular button is pressed. If you do not set a target, then pressing the button will cause a
|
79
|
+
search of the responder chain for a view that implements the action named. If you do set a
|
80
|
+
target, then the button will only try to call the method on that target.
|
81
|
+
|
82
|
+
The action method of the target should implement the following signature:
|
83
|
+
|
84
|
+
action: function (sender) {
|
85
|
+
// Return value is ignored by SC.ButtonView.
|
86
|
+
}
|
87
|
+
|
88
|
+
Therefore, if a target needs to know which button called its action, it should look to the
|
89
|
+
`sender` argument.
|
90
|
+
|
91
|
+
*NOTE:* This property is not relevant when the button is used in toggle mode. Toggle mode only
|
92
|
+
modifies the `value` of the button without triggering actions.
|
93
|
+
|
94
|
+
@type String
|
95
|
+
@default null
|
96
|
+
@see SC.ActionSupport
|
97
|
+
*/
|
98
|
+
action: null,
|
99
|
+
|
74
100
|
/**
|
75
101
|
@type Array
|
76
102
|
@default ['sc-button-view']
|
@@ -93,6 +119,31 @@ SC.ButtonView = SC.View.extend(SC.Control,
|
|
93
119
|
*/
|
94
120
|
escapeHTML: true,
|
95
121
|
|
122
|
+
/**
|
123
|
+
The target to invoke the action on when the button is pressed.
|
124
|
+
|
125
|
+
If you set this target, the action will be called on the target object directly when the button
|
126
|
+
is clicked. If you leave this property set to `null`, then the responder chain will be
|
127
|
+
searched for a view that implements the action when the button is pressed.
|
128
|
+
|
129
|
+
The action method of the target should implement the following signature:
|
130
|
+
|
131
|
+
action: function (sender) {
|
132
|
+
// Return value is ignored by SC.ButtonView.
|
133
|
+
}
|
134
|
+
|
135
|
+
Therefore, if a target needs to know which button called its action, it should look to the
|
136
|
+
`sender` argument.
|
137
|
+
|
138
|
+
*NOTE:* This property is not relevant when the button is used in toggle mode. Toggle mode only
|
139
|
+
modifies the `value` of the button without triggering actions.
|
140
|
+
|
141
|
+
@type Object
|
142
|
+
@default null
|
143
|
+
@see SC.ActionSupport
|
144
|
+
*/
|
145
|
+
target: null,
|
146
|
+
|
96
147
|
/**
|
97
148
|
The theme to apply to the button. By default, a subtheme with the name of
|
98
149
|
'square' is created for backwards-compatibility.
|
@@ -299,41 +350,6 @@ SC.ButtonView = SC.View.extend(SC.Control,
|
|
299
350
|
isCancel: NO,
|
300
351
|
isCancelBindingDefault: SC.Binding.oneWay().bool(),
|
301
352
|
|
302
|
-
/**
|
303
|
-
The name of the action you want triggered when the button is pressed.
|
304
|
-
|
305
|
-
This property is used in conjunction with the target property to execute
|
306
|
-
a method when a regular button is pressed. These properties are not
|
307
|
-
relevant when the button is used in toggle mode.
|
308
|
-
|
309
|
-
If you do not set a target, then pressing a button will cause the
|
310
|
-
responder chain to search for a view that implements the action you name
|
311
|
-
here. If you set a target, then the button will try to call the method
|
312
|
-
on the target itself.
|
313
|
-
|
314
|
-
For legacy support, you can also set the action property to a function.
|
315
|
-
Doing so will cause the function itself to be called when the button is
|
316
|
-
clicked. It is generally better to use the target/action approach and
|
317
|
-
to implement your code in a controller of some type.
|
318
|
-
|
319
|
-
@type String
|
320
|
-
@default null
|
321
|
-
*/
|
322
|
-
action: null,
|
323
|
-
|
324
|
-
/**
|
325
|
-
The target object to invoke the action on when the button is pressed.
|
326
|
-
|
327
|
-
If you set this target, the action will be called on the target object
|
328
|
-
directly when the button is clicked. If you leave this property set to
|
329
|
-
null, then the button will search the responder chain for a view that
|
330
|
-
implements the action when the button is pressed instead.
|
331
|
-
|
332
|
-
@type Object
|
333
|
-
@default null
|
334
|
-
*/
|
335
|
-
target: null,
|
336
|
-
|
337
353
|
/*
|
338
354
|
TODO When is this property ever changed? Is this redundant with
|
339
355
|
render delegates since it can now be turned on on a theme-by-theme
|
@@ -804,20 +820,16 @@ SC.ButtonView = SC.View.extend(SC.Control,
|
|
804
820
|
|
805
821
|
/** @private */
|
806
822
|
_runAction: function(evt) {
|
807
|
-
var action = this.get('action')
|
808
|
-
target = this.get('target') || null,
|
809
|
-
rootResponder;
|
823
|
+
var action = this.get('action');
|
810
824
|
|
811
825
|
if (action) {
|
826
|
+
// Legacy support for action functions.
|
812
827
|
if (action && (SC.typeOf(action) === SC.T_FUNCTION)) {
|
813
828
|
this.action(evt);
|
814
|
-
|
829
|
+
|
830
|
+
// Use SC.ActionSupport.
|
815
831
|
} else {
|
816
|
-
|
817
|
-
if (rootResponder) {
|
818
|
-
// newer action method + optional target syntax...
|
819
|
-
rootResponder.sendAction(action, target, this, this.get('pane'), null, this);
|
820
|
-
}
|
832
|
+
this.fireAction();
|
821
833
|
}
|
822
834
|
}
|
823
835
|
},
|