sproutcore 1.11.0.rc3 → 1.11.0
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 +6 -14
- data/CHANGELOG +5 -0
- data/VERSION.yml +1 -1
- data/lib/frameworks/sproutcore/Buildfile +3 -2
- data/lib/frameworks/sproutcore/CHANGELOG.md +59 -10
- data/lib/frameworks/sproutcore/apps/showcase/resources/main_page.js +1 -0
- data/lib/frameworks/sproutcore/apps/showcase/resources/stylesheet.css +9 -4
- data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/manipulation.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +0 -10
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +10 -45
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/selection_set.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/touch.js +76 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/{touch.js → touch_test.js} +64 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/append_remove.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/design_mode_test.js +61 -24
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/createChildViews.js +1 -2
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/destroy.js +0 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/{layoutStyle.js → layout_style_test.js} +4 -4
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layout_test.js +602 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/viewDidResize.js +0 -23
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +18 -17
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +5 -5
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/design_mode.js +64 -24
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +904 -871
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +1 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/statechart.js +40 -24
- data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +5 -5
- data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +14 -14
- data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +36 -33
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/autonomous_dataSourceCallbacks.js +6 -6
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +7 -7
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +4 -4
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +11 -11
- data/lib/frameworks/sproutcore/frameworks/designer/coders/object.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +30 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +12 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +5 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroller_view.js +0 -36
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll_view.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/pinch_gesture.js +286 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/swipe_gesture.js +449 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/tap_gesture.js +259 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/mixins/gesturable.js +218 -30
- data/lib/frameworks/sproutcore/frameworks/foundation/system/gesture.js +259 -158
- data/lib/frameworks/sproutcore/frameworks/foundation/system/string.js +58 -50
- data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_measurement.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/gestures/pinch_gesture_test.js +321 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/gestures/swipe_gesture_test.js +154 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/gestures/tap_gesture_test.js +55 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/gesturable_test.js +233 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/gesture_test.js +254 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/views/container.js +1 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/legacy/object_keys_polyfill.js +51 -0
- data/lib/frameworks/sproutcore/frameworks/{core_foundation/system/req_anim_frame.js → legacy/request_animation_frame_polyfill.js} +10 -3
- data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +19 -25
- data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +7 -7
- data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +9 -9
- data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/ext/array.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +66 -5
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/tree.js +44 -0
- data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +4 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +0 -25
- data/lib/frameworks/sproutcore/frameworks/runtime/system/enumerator.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/system/error.js +67 -15
- data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +6 -11
- data/lib/frameworks/sproutcore/frameworks/runtime/system/set.js +6 -6
- data/lib/frameworks/sproutcore/frameworks/runtime/system/string.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/{observable.js → observable_test.js} +110 -16
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/error.js +21 -0
- data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +1 -1
- data/lib/sproutcore/render_engines/haml.rb +1 -1
- metadata +610 -604
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layout.js +0 -210
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutDidChange.js +0 -275
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/pinch.js +0 -119
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/swipe.js +0 -234
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/tap.js +0 -157
@@ -8,108 +8,125 @@
|
|
8
8
|
|
9
9
|
/**
|
10
10
|
@class
|
11
|
-
|
11
|
+
|
12
12
|
An SC.Gesture analyzes SC.Touch objects and determines if they are part
|
13
13
|
of a gesture. If they are, SC.Gestures keep the views that own them up-to-date
|
14
14
|
as that gesture progresses, informing it when it starts, when some aspect of
|
15
15
|
it changes, when it ends, and—for convenience—when it is considered to have
|
16
16
|
been "triggered".
|
17
|
-
|
17
|
+
|
18
18
|
Gestures can call the following methods on their views:
|
19
|
-
|
20
|
-
- [gestureName](
|
19
|
+
|
20
|
+
- [gestureName](args...): called when the gesture has occurred. This is
|
21
21
|
useful for event-style gestures, where you aren't interested in when it starts or
|
22
22
|
ends, but just that it has occurred. SC.SwipeGesture triggers this after the
|
23
23
|
swipe has moved a minimum amount—40px by default.
|
24
24
|
|
25
|
-
- [gestureName]Start(
|
26
|
-
For instance, a swipe gesture may be recognized after the finger has moved a
|
25
|
+
- [gestureName]Start(args...): called when the gesture is first recognized.
|
26
|
+
For instance, a swipe gesture may be recognized after the finger has moved a
|
27
27
|
minimum distance in a horizontal.
|
28
|
-
|
29
|
-
- [gestureName]Changed(
|
30
|
-
has changed. For instance, this may be called continuously as the user swipes as
|
28
|
+
|
29
|
+
- [gestureName]Changed(args...): called when some property of the gesture
|
30
|
+
has changed. For instance, this may be called continuously as the user swipes as
|
31
31
|
the swipe's distance changes.
|
32
|
-
|
33
|
-
- [gestureName]Cancelled(
|
34
|
-
or another, is no longer recognized. For instance, a horizontal swipe gesture
|
32
|
+
|
33
|
+
- [gestureName]Cancelled(args...): called when a gesture, for one reason
|
34
|
+
or another, is no longer recognized. For instance, a horizontal swipe gesture
|
35
35
|
could cancel if the user moves too far in a vertical direction.
|
36
|
-
|
37
|
-
- [gestureName]End(
|
36
|
+
|
37
|
+
- [gestureName]End(args...): called when a gesture ends. A swipe would end
|
38
38
|
when the user lifts their finger.
|
39
|
-
|
39
|
+
|
40
40
|
Gesture Lifecycle
|
41
41
|
------------------------
|
42
42
|
Gestures start receiving events when their view—usually mixing in SC.Gesturable—tells it
|
43
43
|
about activities with "unassigned" touches. "Unassigned" touches are touches that have
|
44
44
|
not _yet_ been assigned to a gesture.
|
45
|
-
|
45
|
+
|
46
46
|
The touch becomes "assigned" when the gesture's touchIsInGesture method returns YES.
|
47
|
-
When a
|
47
|
+
When a touch is assigned to a gesture, the gesture becomes the touch's touch responder;
|
48
48
|
this means that it will receive a touchStart event (to which it must return YES), and
|
49
49
|
then, all further touch events will be sent _directly_ to the gesture—the gesture's view
|
50
50
|
will not receive them at all.
|
51
|
-
|
51
|
+
|
52
52
|
At any point, the gesture may tell the view that it has started, ended, or changed. In
|
53
53
|
addition, the gesture may tell the view it has been "triggered." A gesture is not
|
54
54
|
necessarily "triggered" when it starts and ends; for instance, a swipe gesture might
|
55
55
|
only be triggered if the swipe moves more than a specified amount. The ability to track
|
56
56
|
when the gesture has been triggered allows views to easily handle the gesture as its own
|
57
57
|
event, rather than as the individual events that are part of it.
|
58
|
-
|
58
|
+
|
59
59
|
If, at some point, the gesture must release the touch back (perhaps the gesture had _thought_
|
60
60
|
the touch was a part of it, but turned out to be incorrect), the release(touch) method releases
|
61
61
|
it back to the view.
|
62
|
-
|
62
|
+
|
63
63
|
Exclusivity
|
64
64
|
---------------------------------
|
65
65
|
The concept described above gives the gestures a way to be either exclusive or inclusive as-needed:
|
66
66
|
they can choose to take exclusive control of a touch if they think it is theirs, but if they are
|
67
67
|
not sure, they can wait and see.
|
68
|
-
|
68
|
+
|
69
69
|
Status Object
|
70
70
|
---------------------------------
|
71
71
|
It is a common need to track some data related to the touch, but without modifying the touch itself.
|
72
72
|
SC.Gesture is able to keep track of simple hashes for you, mapping them to the SC.Touch object,
|
73
73
|
so that you can maintain some state related to the touch.
|
74
|
-
|
74
|
+
|
75
75
|
For instance, you could set status.failed in touchesDragged, if a touch that you previously
|
76
|
-
thought may have been part of the gesture turned out not to be, and then check for
|
76
|
+
thought may have been part of the gesture turned out not to be, and then check for
|
77
77
|
status.failed in touchIsInGesture, returning NO if present. This would cause the touch
|
78
78
|
to never be considered for your gesture again.
|
79
|
-
|
79
|
+
|
80
80
|
touchIsInGesture is called with the status hash provided in the second argument. You may look
|
81
81
|
up the status hash for a touch at any time by calling this.statusForTouch(touch).
|
82
|
-
|
83
|
-
|
82
|
+
|
83
|
+
|
84
84
|
Implementing a Gesture
|
85
85
|
---------------------------------
|
86
86
|
To write a gesture, you would generally implement the following methods:
|
87
|
-
|
87
|
+
|
88
88
|
- touchIsInGesture: Return YES when the touch is—or is likely enough to be that you
|
89
89
|
want your gesture to have exclusive control over the touch. You usually do not
|
90
90
|
perform much gesture logic here—instead, you save it for touchStart, which will
|
91
91
|
get called after you return YES from this method.
|
92
|
-
|
92
|
+
|
93
93
|
- touchStart: Return YES to accept control of the touch. If you do not return YES,
|
94
94
|
your gesture will not receive touchesDragged nor touchEnd events. At this point,
|
95
95
|
you may (or may not) wish to tell the view that the gesture has started by using the
|
96
96
|
start(args...) method.
|
97
|
-
|
97
|
+
|
98
98
|
- touchesDragged: Use this as you would use it in an SC.View to track the touches
|
99
99
|
assigned to the gesture. At this point, you might want to tell the view that the
|
100
100
|
gesture has updated by using the change(args...) method.
|
101
|
-
|
101
|
+
|
102
102
|
- touchEnd: Again, use this like you would in an SC.View to track when touches
|
103
103
|
assigned to the gesture have ended. This is also a potential time to alert the view
|
104
104
|
that the gesture has ended, by using the end(args...) method. Further, this may
|
105
105
|
also be the time to "trigger" the gesture.
|
106
|
-
|
106
|
+
|
107
107
|
*/
|
108
108
|
SC.Gesture = SC.Object.extend({
|
109
|
+
|
110
|
+
/** @private Tracks when the gesture is active or not. */
|
111
|
+
_sc_isActive: false,
|
112
|
+
|
113
|
+
/**
|
114
|
+
Whether to receive touch events for each distinct touch (rather than only the first touch start
|
115
|
+
and last touch end).
|
116
|
+
|
117
|
+
@type Boolean
|
118
|
+
@default false
|
119
|
+
@see SC.View#acceptsMultitouch
|
120
|
+
*/
|
121
|
+
acceptsMultitouch: false,
|
122
|
+
|
109
123
|
/**
|
110
124
|
The gesture's name. When calling events on the owning SC.View, this name will
|
111
125
|
be prefixed to the methods. For instance, if the method to be called is
|
112
126
|
'Start', and the gesture's name is 'swipe', SC.Gesture will call 'swipeStart'.
|
127
|
+
|
128
|
+
@type String
|
129
|
+
@default "gesture"
|
113
130
|
*/
|
114
131
|
name: "gesture",
|
115
132
|
|
@@ -117,102 +134,140 @@ SC.Gesture = SC.Object.extend({
|
|
117
134
|
Return YES to take exclusive control over the touch. In addition to the
|
118
135
|
SC.Touch object you may take control of, you are also provided a "status"
|
119
136
|
hash, which is unique for both the gesture instance and the touch instance,
|
120
|
-
which you may use for your own purposes.
|
137
|
+
which you may use for your own purposes.
|
138
|
+
|
139
|
+
@param {SC.Touch} touch The touch.
|
140
|
+
@param {Object} status A unique status hash for the given touch.
|
141
|
+
@returns {Boolean} true if the gesture should claim the touch; false to leave it unclaimed.
|
121
142
|
*/
|
122
143
|
touchIsInGesture: function(touch, status) {
|
123
144
|
return NO;
|
124
145
|
},
|
125
|
-
|
146
|
+
|
126
147
|
/**
|
127
148
|
After you return YES from touchIsInGesture (or otherwise 'take' a touch, perhaps
|
128
149
|
using the 'take' method), touchStart will be called.
|
129
|
-
|
150
|
+
|
130
151
|
This is where you do any logic needed now that the touch is part of the gesture.
|
131
152
|
For instance, you could inform the view that the gesture has started by calling
|
132
153
|
this.start().
|
133
|
-
|
154
|
+
|
134
155
|
NOTE: SC.Gesture is just like SC.View in that it has an acceptsMultitouch property.
|
135
156
|
If NO (the default), the gesture will only receive touchStart for the first touch
|
136
157
|
assigned to it, and only receive touchEnd for the last touch that ends.
|
158
|
+
|
159
|
+
@param {SC.Touch} touch The touch that started.
|
160
|
+
@returns {Boolean} true if the gesture should respond to the touch; false otherwise (this should always return true)
|
161
|
+
@see SC.ResponderProtocol#touchStart
|
137
162
|
*/
|
138
163
|
touchStart: function(touch) {
|
139
|
-
|
164
|
+
return true;
|
140
165
|
},
|
141
|
-
|
142
|
-
/**
|
143
|
-
Called when touches assigned to the gesture have moved.
|
144
|
-
|
145
|
-
This is where you update the gesture's state, potentially calling change() to
|
146
|
-
notify the view.
|
147
|
-
*/
|
148
|
-
touchesDragged: function(evt, touches) {
|
149
|
-
|
150
|
-
},
|
151
|
-
|
166
|
+
|
152
167
|
/**
|
153
168
|
Called when a touch assigned to the gesture ends.
|
154
|
-
|
169
|
+
|
155
170
|
If there are no remaining touches on the gesture, you may want to call end() to
|
156
171
|
notify the view that the gesture has ended (if you haven't ended the gesture
|
157
172
|
already).
|
158
|
-
|
173
|
+
|
159
174
|
NOTE: SC.Gesture is just like SC.View in that it has an acceptsMultitouch property.
|
160
175
|
If NO (the default), the gesture will only receive touchStart for the first touch
|
161
176
|
assigned to it, and only receive touchEnd for the last touch that ends.
|
177
|
+
|
178
|
+
@name touchEnd
|
179
|
+
@function
|
180
|
+
@param {SC.Touch} touch The touch that ended.
|
162
181
|
*/
|
163
|
-
|
164
|
-
|
165
|
-
},
|
166
|
-
|
182
|
+
|
167
183
|
/**
|
168
184
|
Starts the gesture (marking it as "active"), and notifies the view.
|
169
|
-
|
185
|
+
|
170
186
|
You can pass any number of arguments to start. They will, along with
|
171
|
-
the gesture instance itself, will be passed to the appropriate gesture
|
187
|
+
the gesture instance itself, will be passed to the appropriate gesture
|
172
188
|
event on the SC.View.
|
173
189
|
*/
|
174
190
|
start: function() {
|
175
|
-
if (!this.
|
176
|
-
this.
|
177
|
-
|
178
|
-
var
|
179
|
-
args
|
180
|
-
|
191
|
+
if (!this._sc_isActive) {
|
192
|
+
this._sc_isActive = true;
|
193
|
+
|
194
|
+
// var argumentsLength = arguments.length,
|
195
|
+
// args = new Array(argumentsLength + 1);
|
196
|
+
|
197
|
+
// // Unshift this to the front of arguments.
|
198
|
+
// args[0] = this;
|
199
|
+
// for (var i = 0, len = argumentsLength; i < len; i++) { args[i + 1] = arguments[i]; }
|
200
|
+
|
201
|
+
// var act = this.name + "Start";
|
202
|
+
// if (this.view[act]) this.view[act].apply(this.view, args);
|
203
|
+
|
204
|
+
// Fast arguments access. Don't materialize the `arguments` object, it is costly.
|
205
|
+
var argumentsLength = arguments.length,
|
206
|
+
args = new Array(argumentsLength);
|
207
|
+
|
208
|
+
for (var i = 0, len = argumentsLength; i < len; i++) { args[i] = arguments[i]; }
|
209
|
+
|
181
210
|
var act = this.name + "Start";
|
182
211
|
if (this.view[act]) this.view[act].apply(this.view, args);
|
183
212
|
}
|
184
213
|
},
|
185
|
-
|
214
|
+
|
186
215
|
/**
|
187
216
|
Ends the gesture, if it is active (marking it as not active), and notifies
|
188
217
|
the view.
|
189
|
-
|
218
|
+
|
190
219
|
You may pass any number of arguments to end(). They, along with your gesture
|
191
220
|
instance itself, will be passed to the appropriate gesture event on the SC.View.
|
192
221
|
*/
|
193
222
|
end: function() {
|
194
|
-
if (this.
|
195
|
-
this.
|
223
|
+
if (this._sc_isActive) {
|
224
|
+
this._sc_isActive = false;
|
225
|
+
|
226
|
+
// var argumentsLength = arguments.length,
|
227
|
+
// args = new Array(argumentsLength + 1);
|
228
|
+
|
229
|
+
// // Unshift this to the front of arguments.
|
230
|
+
// args[0] = this;
|
231
|
+
// for (var i = 0, len = argumentsLength; i < len; i++) { args[i + 1] = arguments[i]; }
|
232
|
+
|
233
|
+
// var act = this.name + "End";
|
234
|
+
// if (this.view[act]) this.view[act].apply(this.view, args);
|
235
|
+
|
236
|
+
// Fast arguments access. Don't materialize the `arguments` object, it is costly.
|
237
|
+
var argumentsLength = arguments.length,
|
238
|
+
args = new Array(argumentsLength);
|
239
|
+
|
240
|
+
for (var i = 0, len = argumentsLength; i < len; i++) { args[i] = arguments[i]; }
|
196
241
|
|
197
|
-
var args = SC.$A(arguments);
|
198
|
-
args.unshift(this);
|
199
|
-
|
200
242
|
var act = this.name + "End";
|
201
243
|
if (this.view[act]) this.view[act].apply(this.view, args);
|
202
244
|
}
|
203
245
|
},
|
204
|
-
|
246
|
+
|
205
247
|
/**
|
206
248
|
If the gesture is active, notifies the view that the gesture has
|
207
249
|
changed.
|
208
|
-
|
250
|
+
|
209
251
|
The gesture, along with any arguments to change(), will be passed to
|
210
252
|
the appropriate method on the SC.View.
|
211
253
|
*/
|
212
254
|
change: function() {
|
213
|
-
if (this.
|
214
|
-
var
|
215
|
-
args
|
255
|
+
if (this._sc_isActive) {
|
256
|
+
// var argumentsLength = arguments.length,
|
257
|
+
// args = new Array(argumentsLength + 1);
|
258
|
+
|
259
|
+
// // Unshift this to the front of arguments.
|
260
|
+
// args[0] = this;
|
261
|
+
// for (var i = 0, len = argumentsLength; i < len; i++) { args[i + 1] = arguments[i]; }
|
262
|
+
|
263
|
+
// var act = this.name + "Changed";
|
264
|
+
// if (this.view[act]) this.view[act].apply(this.view, args);
|
265
|
+
|
266
|
+
// Fast arguments access. Don't materialize the `arguments` object, it is costly.
|
267
|
+
var argumentsLength = arguments.length,
|
268
|
+
args = new Array(argumentsLength);
|
269
|
+
|
270
|
+
for (var i = 0, len = argumentsLength; i < len; i++) { args[i] = arguments[i]; }
|
216
271
|
|
217
272
|
var act = this.name + "Changed";
|
218
273
|
if (this.view[act]) this.view[act].apply(this.view, args);
|
@@ -222,142 +277,188 @@ SC.Gesture = SC.Object.extend({
|
|
222
277
|
/**
|
223
278
|
Cancels the gesture, if it is active, and notifies the view that the
|
224
279
|
gesture has been cancelled.
|
225
|
-
|
280
|
+
|
226
281
|
Gestures are cancelled when they have ended, but any action that would
|
227
282
|
normally be appropriate due to their ending should not be performed.
|
228
|
-
|
283
|
+
|
229
284
|
The gesture, along with any arguments to cancel(), will be passed to the
|
230
285
|
appropriate method on the SC.View.
|
231
286
|
*/
|
232
287
|
cancel: function(){
|
233
|
-
if (this.
|
234
|
-
this.
|
288
|
+
if (this._sc_isActive) {
|
289
|
+
this._sc_isActive = false;
|
290
|
+
|
291
|
+
// var argumentsLength = arguments.length,
|
292
|
+
// args = new Array(argumentsLength + 1);
|
235
293
|
|
236
|
-
|
237
|
-
args
|
294
|
+
// // Unshift this to the front of arguments.
|
295
|
+
// args[0] = this;
|
296
|
+
// for (var i = 0, len = argumentsLength; i < len; i++) { args[i + 1] = arguments[i]; }
|
297
|
+
|
298
|
+
// var act = this.name + "Cancelled";
|
299
|
+
// if (this.view[act]) this.view[act].apply(this.view, args);
|
300
|
+
|
301
|
+
// Fast arguments access. Don't materialize the `arguments` object, it is costly.
|
302
|
+
var argumentsLength = arguments.length,
|
303
|
+
args = new Array(argumentsLength);
|
304
|
+
|
305
|
+
for (var i = 0, len = argumentsLength; i < len; i++) { args[i] = arguments[i]; }
|
238
306
|
|
239
307
|
var act = this.name + "Cancelled";
|
240
308
|
if (this.view[act]) this.view[act].apply(this.view, args);
|
241
309
|
}
|
242
310
|
},
|
243
|
-
|
311
|
+
|
244
312
|
/**
|
245
313
|
Triggers the gesture, notifying the view that the gesture has happened.
|
246
|
-
|
314
|
+
|
247
315
|
You should trigger a gesture where it would be natural to say it has "happened";
|
248
316
|
for instance, if a touch moves a couple of pixels, you probably wouldn't say
|
249
317
|
a swipe has occurred—though you might say it has "begun." And you wouldn't necessarily
|
250
318
|
wait until the touch has ended either. Once the touch has moved a certain amount,
|
251
319
|
there has definitely been a swipe. By calling trigger() at this point, you will
|
252
320
|
tell the view that it has occurred.
|
253
|
-
|
254
|
-
For SC.SwipeGesture, this allows a view to implement only swipe(), and then be
|
321
|
+
|
322
|
+
For SC.SwipeGesture, this allows a view to implement only swipe(), and then be
|
255
323
|
automatically notified whenever any swipe has occurred.
|
256
324
|
*/
|
257
325
|
trigger: function() {
|
258
|
-
|
259
|
-
|
260
|
-
|
326
|
+
// Fast arguments access. Don't materialize the `arguments` object, it is costly.
|
327
|
+
var argumentsLength = arguments.length,
|
328
|
+
// args = new Array(argumentsLength + 1);
|
329
|
+
args = new Array(argumentsLength);
|
330
|
+
|
331
|
+
// // Unshift this to the front of arguments.
|
332
|
+
// args[0] = this;
|
333
|
+
// for (var i = 0, len = argumentsLength; i < len; i++) { args[i + 1] = arguments[i]; }
|
334
|
+
|
335
|
+
for (var i = 0, len = argumentsLength; i < len; i++) { args[i] = arguments[i]; }
|
336
|
+
|
261
337
|
var act = this.name;
|
262
338
|
if (this.view[act]) this.view[act].apply(this.view, args);
|
263
339
|
},
|
264
340
|
|
265
341
|
/**
|
266
|
-
Takes possession of a touch.
|
267
|
-
|
268
|
-
|
342
|
+
Takes possession of a touch.
|
343
|
+
|
269
344
|
This is called automatically when you return YES from touchIsInGesture.
|
270
345
|
*/
|
271
|
-
take: function(touch) {
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
346
|
+
// take: function(touch) {
|
347
|
+
// if (!touch.isTaken) {
|
348
|
+
// touch.isTaken = YES; // because even changing responder won't prevent it from being used this cycle.
|
349
|
+
// if (SC.none(touch.touchResponder) || touch.touchResponder !== this) touch.makeTouchResponder(this, YES);
|
350
|
+
// }
|
351
|
+
// //@if(debug)
|
352
|
+
// else {
|
353
|
+
// SC.warn("Developer Warning: A gesture tried to take a touch that was already taken: %@".fmt(this));
|
354
|
+
// }
|
355
|
+
// //@endif
|
356
|
+
// },
|
357
|
+
|
276
358
|
/**
|
277
359
|
Releases a touch back to its previous owner, which is usually the view. This allows
|
278
|
-
you to give back control of a touch that it turns out is not part of the gesture.
|
279
|
-
|
360
|
+
you to give back control of a touch that it turns out is not part of the gesture.
|
361
|
+
|
280
362
|
This takes effect immediately, because you would usually call this from
|
281
363
|
touchesDragged or such.
|
282
364
|
*/
|
283
|
-
release: function(touch) {
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
365
|
+
// release: function(touch) {
|
366
|
+
// if (touch.isTaken) {
|
367
|
+
// touch.isTaken = NO;
|
368
|
+
// if (touch.nextTouchResponder) touch.makeTouchResponder(touch.nextTouchResponder);
|
369
|
+
// }
|
370
|
+
// //@if(debug)
|
371
|
+
// else {
|
372
|
+
// SC.warn("Developer Warning: A gesture tried to release a touch that was not taken: %@".fmt(this));
|
373
|
+
// }
|
374
|
+
// //@endif
|
375
|
+
// },
|
376
|
+
|
288
377
|
/**
|
289
378
|
Discards a touch, making its responder null. This makes the touch go away and never
|
290
379
|
come back—not to this gesture, nor to any other, nor to the view, nor to any other
|
291
380
|
view.
|
292
381
|
*/
|
293
|
-
discardTouch: function(touch) {
|
294
|
-
|
295
|
-
|
382
|
+
// discardTouch: function(touch) {
|
383
|
+
// touch.isTaken = YES; // because even changing responder won't prevent it from being used this cycle.
|
384
|
+
// touch.makeTouchResponder(null);
|
385
|
+
// },
|
386
|
+
|
387
|
+
/**
|
388
|
+
Called by the view when a touch session has begun.
|
389
|
+
|
390
|
+
You should override this method in your custom SC.Gesturable subclasses to set up any touch
|
391
|
+
session state. For example, you may want to track the initial touch start time in order to
|
392
|
+
decide how to react when or if additional touches start later.
|
393
|
+
|
394
|
+
@param {SC.Touch} touch The touch that started the session.
|
395
|
+
@returns {void}
|
396
|
+
*/
|
397
|
+
touchSessionStarted: function (touch) {
|
296
398
|
},
|
297
|
-
|
399
|
+
|
298
400
|
/**
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
401
|
+
Called by the view when the touch session has ended.
|
402
|
+
|
403
|
+
This will occur because all touches in the session have finished.
|
404
|
+
|
405
|
+
You should override this method in your custom SC.Gesturable subclasses to clean up any state
|
406
|
+
variables used in the touch session.
|
407
|
+
|
408
|
+
@returns {void}
|
409
|
+
*/
|
410
|
+
touchSessionEnded: function () {
|
307
411
|
},
|
308
|
-
|
412
|
+
|
309
413
|
/**
|
310
|
-
Called
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
414
|
+
Called by the view when the touch session was cancelled.
|
415
|
+
|
416
|
+
This will occur because this gesture returned `false` in any of `touchAddedToSession`,
|
417
|
+
`touchesMovedInSession`, `touchEndedInSession`, `touchCancelledInSession` to indicate that the
|
418
|
+
gesture is no longer interested in the session or because another gesture claimed the touch
|
419
|
+
session for itself, forcing all other gestures out (rare).
|
420
|
+
|
421
|
+
You should override this method in your custom SC.Gesturable subclasses to clean up any state
|
422
|
+
variables used in the touch session.
|
423
|
+
|
424
|
+
@returns {void}
|
425
|
+
*/
|
426
|
+
touchSessionCancelled: function () {
|
318
427
|
},
|
319
|
-
|
428
|
+
|
320
429
|
/**
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
if (this.touchIsInGesture(touch, this.statusForTouch(touch))) {
|
328
|
-
this.take(touch);
|
329
|
-
}
|
330
|
-
}, this);
|
430
|
+
@param {SC.Touch} touch The touch to be added to the session.
|
431
|
+
@param {Array} touchesInSession The touches already in the session.
|
432
|
+
@returns {Boolean} True if the gesture is still interested in the touch session; false to stop getting notified for any further touch changes in the touch session.
|
433
|
+
*/
|
434
|
+
touchAddedToSession: function (touch, touchesInSession) {
|
435
|
+
return true; // Most gestures should theoretically be interested in a new touch session.
|
331
436
|
},
|
332
|
-
|
437
|
+
|
333
438
|
/**
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
439
|
+
@param {SC.Touch} touch The touch to be removed from the session.
|
440
|
+
@param {Array} touchesInSession The touches still remaining in the session.
|
441
|
+
@returns {Boolean} True if the gesture is still interested in the touch session; false to stop getting notified for any further touch changes in the touch session.
|
442
|
+
*/
|
443
|
+
touchCancelledInSession: function (touch, touchesInSession) {
|
444
|
+
return true;
|
340
445
|
},
|
341
|
-
|
446
|
+
|
342
447
|
/**
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
if (status.isInterested) return;
|
350
|
-
status.isInterested = YES;
|
351
|
-
touch.isInteresting++;
|
448
|
+
@param {SC.Touch} touch The touch to be removed from the session.
|
449
|
+
@param {Array} touchesInSession The touches still remaining in the session.
|
450
|
+
@returns {Boolean} True if the gesture is still interested in the touch session; false to stop getting notified for any further touch changes in the touch session.
|
451
|
+
*/
|
452
|
+
touchEndedInSession: function (touch, touchesInSession) {
|
453
|
+
return true;
|
352
454
|
},
|
353
|
-
|
455
|
+
|
354
456
|
/**
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
status.isInterested = NO;
|
361
|
-
touch.isInteresting--;
|
457
|
+
@param {Array} touchesInSession The touches in the session.
|
458
|
+
@returns {Boolean} True if the gesture is still interested in the touch session; false to stop getting notified for any further touch changes in the touch session.
|
459
|
+
*/
|
460
|
+
touchesMovedInSession: function (touchesInSession) {
|
461
|
+
return true;
|
362
462
|
}
|
463
|
+
|
363
464
|
});
|