uki 1.1.1 → 1.1.2
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.
- data/VERSION +1 -1
- data/bin/uki +1 -1
- data/frameworks/uki/README.rdoc +1 -1
- data/frameworks/uki/examples/core-examples/controls/controls.js +6 -6
- data/frameworks/uki/examples/core-examples/flow/flow.js +4 -4
- data/frameworks/uki/examples/core-examples/linearGradient/gradient.svg +11 -0
- data/frameworks/uki/examples/core-examples/linearGradient/linearGradient.js +87 -0
- data/frameworks/uki/examples/core-examples/popup/popup.js +23 -10
- data/frameworks/uki/examples/core-examples/resizeToContents/resizeToContents.js +12 -1
- data/frameworks/uki/examples/core-examples/slider/slider.js +1 -1
- data/frameworks/uki/examples/core-examples/splitPaneExtended/splitPaneExtended.js +1 -1
- data/frameworks/uki/examples/core-examples/table/table.js +19 -2
- data/frameworks/uki/examples/core-examples/wave/wave-theme.js +1 -1
- data/frameworks/uki/examples/core-examples/wave/wave.js +1 -1
- data/frameworks/uki/examples/more-examples/radioButton/radioButton.js +3 -3
- data/frameworks/uki/examples/more-examples/select/select.js +35 -0
- data/frameworks/uki/examples/touch-examples/scrollPane/scrollPane.js +53 -0
- data/frameworks/uki/spec/unit/background.spec.js +1 -1
- data/frameworks/uki/spec/unit/selector.spec.js +28 -12
- data/frameworks/uki/spec/unit/utils.spec.js +14 -0
- data/frameworks/uki/src/uki-core.js +3 -1
- data/frameworks/uki/src/uki-core/after.js +57 -0
- data/frameworks/uki/src/uki-core/attachment.js +15 -6
- data/frameworks/uki/src/uki-core/background.js +4 -3
- data/frameworks/uki/src/uki-core/background/css.js +1 -0
- data/frameworks/uki/src/uki-core/background/cssBox.js +5 -3
- data/frameworks/uki/src/uki-core/background/linearGradient.js +112 -0
- data/frameworks/uki/src/uki-core/background/multi.js +2 -2
- data/frameworks/uki/src/uki-core/background/rows.js +1 -0
- data/frameworks/uki/src/uki-core/background/sliced9.js +5 -2
- data/frameworks/uki/src/uki-core/builder.js +5 -4
- data/frameworks/uki/src/uki-core/collection.js +18 -13
- data/frameworks/uki/src/uki-core/dom/browser.js +114 -0
- data/frameworks/uki/src/uki-core/dom/event.js +3 -0
- data/frameworks/uki/src/uki-core/image.js +1 -26
- data/frameworks/uki/src/uki-core/selector.js +5 -0
- data/frameworks/uki/src/uki-core/theme.js +24 -23
- data/frameworks/uki/src/uki-core/theme/template.js +1 -1
- data/frameworks/uki/src/uki-core/uki.js +7 -4
- data/frameworks/uki/src/uki-core/utils.js +51 -26
- data/frameworks/uki/src/uki-core/view.js +6 -3
- data/frameworks/uki/src/uki-core/view/base.js +16 -1
- data/frameworks/uki/src/uki-core/view/container.js +15 -5
- data/frameworks/uki/src/uki-core/view/focusable.js +17 -4
- data/frameworks/uki/src/uki-core/view/observable.js +15 -2
- data/frameworks/uki/src/uki-core/view/styleable.js +4 -11
- data/frameworks/uki/src/uki-data/ajax.js +4 -30
- data/frameworks/uki/src/uki-data/json.js +191 -0
- data/frameworks/uki/src/uki-data/localStore.js +37 -0
- data/frameworks/uki/src/uki-data/model.js +1 -1
- data/frameworks/uki/src/uki-more.js +4 -0
- data/frameworks/uki/src/uki-more/more/background.js +2 -0
- data/frameworks/uki/src/uki-more/more/color.js +168 -0
- data/frameworks/uki/src/uki-more/more/utils.js +5 -12
- data/frameworks/uki/src/uki-more/more/view.js +3 -1
- data/frameworks/uki/src/uki-more/more/view/form.js +30 -0
- data/frameworks/uki/src/uki-more/more/view/hTile.js +59 -0
- data/frameworks/uki/src/uki-more/more/view/nativeButton.js +3 -0
- data/frameworks/uki/src/uki-more/more/view/nativeCheckbox.js +38 -0
- data/frameworks/uki/src/uki-more/more/view/nativeControl.js +40 -0
- data/frameworks/uki/src/uki-more/more/view/nativeInput.js +78 -0
- data/frameworks/uki/src/uki-more/more/view/nativeSelect.js +29 -0
- data/frameworks/uki/src/uki-more/more/view/radioButton.js +1 -1
- data/frameworks/uki/src/uki-more/more/view/select-theme.js +55 -0
- data/frameworks/uki/src/uki-more/more/view/select.js +208 -0
- data/frameworks/uki/src/uki-theme/airport.js +145 -88
- data/frameworks/uki/src/uki-theme/airport/i/table/a-down.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/table/a-up.png +0 -0
- data/frameworks/uki/src/uki-touch.js +2 -0
- data/frameworks/uki/src/uki-touch/touch.js +1 -0
- data/frameworks/uki/src/uki-touch/touch/const.js +24 -0
- data/frameworks/uki/src/uki-touch/touch/setup.js +52 -0
- data/frameworks/uki/src/uki-touch/touch/view.js +4 -0
- data/frameworks/uki/src/uki-touch/touch/view/scrollPane.js +505 -0
- data/frameworks/uki/src/uki-touch/touch/view/scrollableList.js +27 -0
- data/frameworks/uki/src/uki-view/view/box.js +9 -0
- data/frameworks/uki/src/uki-view/view/button.js +36 -1
- data/frameworks/uki/src/uki-view/view/checkbox.js +32 -3
- data/frameworks/uki/src/uki-view/view/flow.js +37 -9
- data/frameworks/uki/src/uki-view/view/image.js +14 -1
- data/frameworks/uki/src/uki-view/view/label.js +72 -11
- data/frameworks/uki/src/uki-view/view/list.js +143 -13
- data/frameworks/uki/src/uki-view/view/list/render.js +1 -0
- data/frameworks/uki/src/uki-view/view/popup.js +46 -2
- data/frameworks/uki/src/uki-view/view/radio.js +19 -4
- data/frameworks/uki/src/uki-view/view/scrollPane.js +91 -33
- data/frameworks/uki/src/uki-view/view/slider.js +67 -54
- data/frameworks/uki/src/uki-view/view/splitPane.js +102 -9
- data/frameworks/uki/src/uki-view/view/table.js +59 -2
- data/frameworks/uki/src/uki-view/view/table/column.js +45 -17
- data/frameworks/uki/src/uki-view/view/table/header.js +40 -12
- data/frameworks/uki/src/uki-view/view/table/render.js +4 -0
- data/frameworks/uki/src/uki-view/view/textField.js +75 -21
- data/frameworks/uki/src/uki-view/view/toolbar.js +16 -0
- data/lib/uki/builder.rb +1 -1
- data/lib/uki/include_js.rb +2 -2
- data/lib/uki/project.rb +14 -14
- data/templates/index.html.erb +2 -2
- data/templates/myapp.js.erb +2 -2
- data/uki.gemspec +34 -48
- metadata +44 -47
- data/frameworks/uki/src/uki-core/dom/nativeLayout.js +0 -18
- data/frameworks/uki/src/uki-theme/airport/i/button/down-c.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/down-c.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/down-h.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/down-h.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/down-m.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/down-v.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/focusRing-c.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/focusRing-h.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/focusRing-m.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/focusRing-v.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/focusRing.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/hover-c.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/hover-c.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/hover-h.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/hover-h.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/hover-m.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/hover-v.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/hover.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/normal-c.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/normal-c.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/normal-h.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/normal-h.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/normal-m.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/normal-v.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/button/normal.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/panel/dark-h.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/panel/dark-h.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/panel/dark-m.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/panel/dark.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/popup/normal.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/shadow/large-c.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/shadow/large-h.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/shadow/large-m.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/shadow/large-v.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/shadow/large.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/slider/bar-m.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/slider/bar-m.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/slider/bar-v.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/slider/bar-v.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/slider/bar.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/slider/focus.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/slider/handle.gif +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
include('uki.js');
|
|
2
|
-
|
|
2
|
+
(function() {
|
|
3
|
+
|
|
3
4
|
var toString = Object.prototype.toString,
|
|
4
5
|
trim = String.prototype.trim,
|
|
5
6
|
slice = Array.prototype.slice,
|
|
@@ -8,7 +9,10 @@ var toString = Object.prototype.toString,
|
|
|
8
9
|
|
|
9
10
|
var marked = '__uki_marked';
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
// dummy subclass
|
|
13
|
+
/** @ignore */
|
|
14
|
+
function inheritance () {}
|
|
15
|
+
|
|
12
16
|
/**
|
|
13
17
|
* Utility functions.
|
|
14
18
|
*/
|
|
@@ -164,7 +168,7 @@ var utils = {
|
|
|
164
168
|
array[i][marked] = true;
|
|
165
169
|
};
|
|
166
170
|
for (i = 0; i < result.length; i++) {
|
|
167
|
-
delete result[i][marked]
|
|
171
|
+
delete result[i][marked];
|
|
168
172
|
};
|
|
169
173
|
return result;
|
|
170
174
|
|
|
@@ -259,13 +263,13 @@ var utils = {
|
|
|
259
263
|
*/
|
|
260
264
|
extend: function() {
|
|
261
265
|
var target = arguments[0] || {}, i = 1, length = arguments.length, options;
|
|
262
|
-
|
|
266
|
+
|
|
263
267
|
for ( ; i < length; i++ ) {
|
|
264
268
|
if ( (options = arguments[i]) != null ) {
|
|
265
269
|
|
|
266
270
|
for ( var name in options ) {
|
|
267
271
|
var copy = options[ name ];
|
|
268
|
-
|
|
272
|
+
|
|
269
273
|
if ( copy !== undefined ) {
|
|
270
274
|
target[ name ] = copy;
|
|
271
275
|
}
|
|
@@ -273,7 +277,7 @@ var utils = {
|
|
|
273
277
|
}
|
|
274
278
|
}
|
|
275
279
|
}
|
|
276
|
-
|
|
280
|
+
|
|
277
281
|
return target;
|
|
278
282
|
},
|
|
279
283
|
|
|
@@ -297,32 +301,37 @@ var utils = {
|
|
|
297
301
|
newClass: function(/* [[superClass], mixin1, mixin2, ..] */ methods) {
|
|
298
302
|
var klass = function() {
|
|
299
303
|
this.init.apply(this, arguments);
|
|
300
|
-
}
|
|
304
|
+
},
|
|
301
305
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
if (arguments.length > 1) {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
inheritance =
|
|
308
|
-
inheritance.prototype = arguments[0].prototype;
|
|
306
|
+
i, startFrom = 0, tmp, baseClasses = [], base, name, copy, $arguments = arguments, length;
|
|
307
|
+
|
|
308
|
+
if ((length = $arguments.length) > 1) {
|
|
309
|
+
base = $arguments[0];
|
|
310
|
+
if (base.prototype) { // real inheritance
|
|
311
|
+
inheritance.prototype = base.prototype;
|
|
309
312
|
klass.prototype = new inheritance();
|
|
310
313
|
startFrom = 1;
|
|
311
314
|
baseClasses = [inheritance.prototype];
|
|
315
|
+
|
|
316
|
+
// class method inheritance
|
|
317
|
+
for ( name in base ) {
|
|
318
|
+
copy = base[ name ];
|
|
319
|
+
if ( !base.hasOwnProperty(name) || copy === undefined || name == 'prototype' ) continue;
|
|
320
|
+
klass[ name ] = copy;
|
|
321
|
+
}
|
|
312
322
|
}
|
|
313
323
|
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
if ( !base.hasOwnProperty(name) || copy === undefined ) continue;
|
|
322
|
-
klass.prototype[ name ] = copy;
|
|
324
|
+
|
|
325
|
+
for (i=startFrom; i < length; i++) {
|
|
326
|
+
base = $arguments[i];
|
|
327
|
+
if (this.isFunction(base)) {
|
|
328
|
+
tmp = {};
|
|
329
|
+
base.apply(tmp, baseClasses);
|
|
330
|
+
base = tmp;
|
|
323
331
|
}
|
|
332
|
+
baseClasses[ baseClasses.length ] = base;
|
|
324
333
|
|
|
325
|
-
|
|
334
|
+
uki.extend(klass.prototype, base);
|
|
326
335
|
};
|
|
327
336
|
if (!klass.prototype.init) klass.prototype.init = function() {};
|
|
328
337
|
return klass;
|
|
@@ -336,10 +345,12 @@ var utils = {
|
|
|
336
345
|
*/
|
|
337
346
|
binarySearch: function (value, array) {
|
|
338
347
|
var low = 0, high = array.length, mid;
|
|
348
|
+
|
|
339
349
|
while (low < high) {
|
|
340
350
|
mid = (low + high) >> 1;
|
|
341
351
|
array[mid] < value ? low = mid + 1 : high = mid;
|
|
342
352
|
}
|
|
353
|
+
|
|
343
354
|
return low;
|
|
344
355
|
},
|
|
345
356
|
|
|
@@ -382,7 +393,8 @@ var utils = {
|
|
|
382
393
|
* @param {Array.<string>} props Property names
|
|
383
394
|
*/
|
|
384
395
|
addProps: function(proto, props) {
|
|
385
|
-
|
|
396
|
+
for (var i =0, len = props.length; i<len; i++)
|
|
397
|
+
proto[ props[i] ] = uki.newProp('_' + props[i]);
|
|
386
398
|
},
|
|
387
399
|
|
|
388
400
|
toArray: function(arr) {
|
|
@@ -403,7 +415,20 @@ var utils = {
|
|
|
403
415
|
}
|
|
404
416
|
return this;
|
|
405
417
|
};
|
|
418
|
+
},
|
|
419
|
+
|
|
420
|
+
camalize: function(string) {
|
|
421
|
+
return string.replace(/[-_]\S/g, function(v) {
|
|
422
|
+
return v.substr(1).toUpperCase();
|
|
423
|
+
});
|
|
424
|
+
},
|
|
425
|
+
|
|
426
|
+
dasherize: function(string) {
|
|
427
|
+
return string.replace(/[A-Z]/g, function(v) {
|
|
428
|
+
return '-' + v.toLowerCase();
|
|
429
|
+
});
|
|
406
430
|
}
|
|
407
431
|
};
|
|
408
432
|
utils.extend(uki, utils);
|
|
409
|
-
|
|
433
|
+
|
|
434
|
+
})();
|
|
@@ -7,15 +7,18 @@ uki.view = {
|
|
|
7
7
|
klass = uki.newClass.apply(uki, args),
|
|
8
8
|
parts = name.split('.'),
|
|
9
9
|
obj = root,
|
|
10
|
-
i, part;
|
|
10
|
+
i, part, l = parts.length - 1;
|
|
11
11
|
|
|
12
12
|
klass.prototype.typeName = function() { return name; };
|
|
13
|
-
|
|
13
|
+
|
|
14
|
+
for ( i= 0; i < l; i++ ) {
|
|
14
15
|
part = parts[i];
|
|
15
16
|
if (!obj[part]) obj[part] = {};
|
|
16
17
|
obj = obj[part];
|
|
18
|
+
|
|
17
19
|
};
|
|
18
|
-
|
|
20
|
+
|
|
21
|
+
obj[ parts[l] ] = klass;
|
|
19
22
|
return klass;
|
|
20
23
|
}
|
|
21
24
|
};
|
|
@@ -3,7 +3,6 @@ include('../geometry.js');
|
|
|
3
3
|
include('../utils.js');
|
|
4
4
|
include('../builder.js');
|
|
5
5
|
include('../dom.js');
|
|
6
|
-
include('../dom/nativeLayout.js');
|
|
7
6
|
include('observable.js');
|
|
8
7
|
include('styleable.js');
|
|
9
8
|
|
|
@@ -274,6 +273,10 @@ uki.view.declare('uki.view.Base', uki.view.Observable, uki.view.Styleable, funct
|
|
|
274
273
|
this._firstLayout = false;
|
|
275
274
|
};
|
|
276
275
|
|
|
276
|
+
this.layoutIfNeeded = function() {
|
|
277
|
+
if (this._needsLayout && this.visible()) this.layout();
|
|
278
|
+
};
|
|
279
|
+
|
|
277
280
|
|
|
278
281
|
/**
|
|
279
282
|
* @function uki.view.Base#minSize
|
|
@@ -318,6 +321,13 @@ uki.view.declare('uki.view.Base', uki.view.Observable, uki.view.Styleable, funct
|
|
|
318
321
|
this.rect(newRect);
|
|
319
322
|
};
|
|
320
323
|
|
|
324
|
+
/**
|
|
325
|
+
* Called when child changes it's size
|
|
326
|
+
*/
|
|
327
|
+
this.childResized = function(child) {
|
|
328
|
+
// do nothing, extend in subviews
|
|
329
|
+
};
|
|
330
|
+
|
|
321
331
|
/**
|
|
322
332
|
* Resizes view to its contents. Contents size is determined by view.
|
|
323
333
|
* View can be resized by width, height or both. This is specified through
|
|
@@ -442,6 +452,11 @@ uki.view.declare('uki.view.Base', uki.view.Observable, uki.view.Styleable, funct
|
|
|
442
452
|
*/
|
|
443
453
|
this._createDom = function() {
|
|
444
454
|
this._dom = uki.createElement('div', this.defaultCss);
|
|
455
|
+
this._initClassName();
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
this._initClassName = function() {
|
|
459
|
+
this._dom.className = this.typeName().replace(/\./g, '-');
|
|
445
460
|
};
|
|
446
461
|
|
|
447
462
|
/**
|
|
@@ -8,6 +8,8 @@ include('base.js');
|
|
|
8
8
|
uki.view.declare('uki.view.Container', uki.view.Base, function(Base) {
|
|
9
9
|
/**#@+ @memberOf uki.view.Container# */
|
|
10
10
|
|
|
11
|
+
this._inset = new Inset();
|
|
12
|
+
|
|
11
13
|
/** @private */
|
|
12
14
|
this._setup = function() {
|
|
13
15
|
this._childViews = [];
|
|
@@ -25,11 +27,11 @@ uki.view.declare('uki.view.Container', uki.view.Base, function(Base) {
|
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
this.contentsWidth = function() {
|
|
28
|
-
return maxProp(this, 'maxX');
|
|
30
|
+
return maxProp(this, 'maxX') + this.inset().right;
|
|
29
31
|
};
|
|
30
32
|
|
|
31
33
|
this.contentsHeight = function() {
|
|
32
|
-
return maxProp(this, 'maxY');
|
|
34
|
+
return maxProp(this, 'maxY') + this.inset().bottom;
|
|
33
35
|
};
|
|
34
36
|
|
|
35
37
|
this.contentsSize = function() {
|
|
@@ -65,6 +67,7 @@ uki.view.declare('uki.view.Container', uki.view.Base, function(Base) {
|
|
|
65
67
|
this._childViews[i]._viewIndex--;
|
|
66
68
|
};
|
|
67
69
|
this._childViews = uki.grep(this._childViews, function(elem) { return elem != child; });
|
|
70
|
+
this._contentChanged();
|
|
68
71
|
};
|
|
69
72
|
|
|
70
73
|
/**
|
|
@@ -75,6 +78,7 @@ uki.view.declare('uki.view.Container', uki.view.Base, function(Base) {
|
|
|
75
78
|
this._childViews.push(child);
|
|
76
79
|
child.parent(this);
|
|
77
80
|
this.domForChild(child).appendChild(child.dom());
|
|
81
|
+
this._contentChanged();
|
|
78
82
|
};
|
|
79
83
|
|
|
80
84
|
/**
|
|
@@ -91,6 +95,7 @@ uki.view.declare('uki.view.Container', uki.view.Base, function(Base) {
|
|
|
91
95
|
this._childViews.splice(beforeChild._viewIndex-1, 0, child);
|
|
92
96
|
child.parent(this);
|
|
93
97
|
this.domForChild(child).insertBefore(child.dom(), beforeChild.dom());
|
|
98
|
+
this._contentChanged();
|
|
94
99
|
};
|
|
95
100
|
|
|
96
101
|
/**
|
|
@@ -101,8 +106,15 @@ uki.view.declare('uki.view.Container', uki.view.Base, function(Base) {
|
|
|
101
106
|
return this._dom;
|
|
102
107
|
};
|
|
103
108
|
|
|
109
|
+
this.inset = uki.newProp('_inset', function(v) {
|
|
110
|
+
this._inset = Inset.create(v);
|
|
111
|
+
});
|
|
104
112
|
|
|
105
113
|
/** @private */
|
|
114
|
+
this._contentChanged = function() {
|
|
115
|
+
// called on every insertBefore, appendChild, removeChild
|
|
116
|
+
};
|
|
117
|
+
|
|
106
118
|
this._layoutDom = function(rect) {
|
|
107
119
|
Base._layoutDom.call(this, rect);
|
|
108
120
|
this._layoutChildViews(rect);
|
|
@@ -111,9 +123,7 @@ uki.view.declare('uki.view.Container', uki.view.Base, function(Base) {
|
|
|
111
123
|
/** @private */
|
|
112
124
|
this._layoutChildViews = function() {
|
|
113
125
|
for (var i=0, childViews = this.childViews(); i < childViews.length; i++) {
|
|
114
|
-
|
|
115
|
-
childViews[i].layout(this._rect);
|
|
116
|
-
}
|
|
126
|
+
childViews[i].layoutIfNeeded();
|
|
117
127
|
};
|
|
118
128
|
};
|
|
119
129
|
|
|
@@ -2,7 +2,7 @@ include('../view.js');
|
|
|
2
2
|
include('observable.js');
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* @
|
|
5
|
+
* @interface
|
|
6
6
|
*/
|
|
7
7
|
uki.view.Focusable = new function() {/** @lends uki.view.Focusable.prototype */
|
|
8
8
|
|
|
@@ -45,21 +45,25 @@ uki.view.Focusable = new function() {/** @lends uki.view.Focusable.prototype */
|
|
|
45
45
|
|
|
46
46
|
if (!preCreatedFocusTarget) {
|
|
47
47
|
this._focusTarget = uki.createElement('input', 'position:absolute;left:-9999px;top:0;width:1px;height:1px;');
|
|
48
|
+
this._focusTarget.className = 'uki-view-Focusable';
|
|
48
49
|
this.dom().appendChild(this._focusTarget);
|
|
49
50
|
}
|
|
50
51
|
this._hasFocus = false;
|
|
51
52
|
this._firstFocus = true;
|
|
52
53
|
|
|
53
54
|
uki.dom.bind(this._focusTarget, 'focus', uki.proxy(function(e) {
|
|
55
|
+
this._stopWatingForBlur();
|
|
54
56
|
if (!this._hasFocus) this._focus(e);
|
|
55
57
|
}, this));
|
|
56
58
|
|
|
57
59
|
uki.dom.bind(this._focusTarget, 'blur', uki.proxy(function(e) {
|
|
58
60
|
if (this._hasFocus) {
|
|
59
61
|
this._hasFocus = false;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
this._waitingForBlur =
|
|
63
|
+
setTimeout(uki.proxy(function() { // wait for mousedown refocusing
|
|
64
|
+
this._waitingForBlur = false;
|
|
65
|
+
if (!this._hasFocus) this._blur();
|
|
66
|
+
}, this), 1);
|
|
63
67
|
}
|
|
64
68
|
}, this));
|
|
65
69
|
|
|
@@ -78,8 +82,17 @@ uki.view.Focusable = new function() {/** @lends uki.view.Focusable.prototype */
|
|
|
78
82
|
this._hasFocus = false;
|
|
79
83
|
}
|
|
80
84
|
|
|
85
|
+
this._stopWatingForBlur = function() {
|
|
86
|
+
if (this._waitingForBlur) {
|
|
87
|
+
clearTimeout(this._waitingForBlur);
|
|
88
|
+
this._waitingForBlur = false;
|
|
89
|
+
this._hasFocus = true;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
|
|
81
93
|
this.focus = function() {
|
|
82
94
|
if (this._focusable && !this._disabled) {
|
|
95
|
+
this._stopWatingForBlur();
|
|
83
96
|
if (!this._hasFocus) this._focus();
|
|
84
97
|
var target = this._focusTarget;
|
|
85
98
|
setTimeout(function() {
|
|
@@ -8,6 +8,10 @@ uki.view.Observable = /** @lends uki.view.Observable.prototype */ {
|
|
|
8
8
|
// return null; // should implement
|
|
9
9
|
// },
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* @param {String} name Event name
|
|
13
|
+
* @param {function()} callback
|
|
14
|
+
*/
|
|
11
15
|
bind: function(name, callback) {
|
|
12
16
|
callback.huid = callback.huid || uki.guid++;
|
|
13
17
|
uki.each(name.split(' '), function(i, name) {
|
|
@@ -18,11 +22,20 @@ uki.view.Observable = /** @lends uki.view.Observable.prototype */ {
|
|
|
18
22
|
},
|
|
19
23
|
|
|
20
24
|
unbind: function(name, callback) {
|
|
21
|
-
|
|
25
|
+
if (!this._observers) return;
|
|
26
|
+
var names;
|
|
27
|
+
if (name) {
|
|
28
|
+
names = name.split(' ');
|
|
29
|
+
} else {
|
|
30
|
+
names = [];
|
|
31
|
+
uki.each(this._observers, function(k, v) { names.push(k) });
|
|
32
|
+
}
|
|
33
|
+
uki.each(names, function(i, name) {
|
|
22
34
|
this._observers[name] = !callback ? [] : uki.grep(this._observersFor(name, true), function(observer) {
|
|
23
35
|
return observer != callback && observer.huid != callback.huid;
|
|
24
36
|
});
|
|
25
37
|
if (this._observers[name].length == 0) {
|
|
38
|
+
this._observers[name] = undefined;
|
|
26
39
|
this._unbindFromDom(name);
|
|
27
40
|
}
|
|
28
41
|
}, this);
|
|
@@ -43,7 +56,7 @@ uki.view.Observable = /** @lends uki.view.Observable.prototype */ {
|
|
|
43
56
|
},
|
|
44
57
|
|
|
45
58
|
_bindToDom: function(name, target) {
|
|
46
|
-
if (!target && !this.dom) return;
|
|
59
|
+
if (!target && !this.dom) return false;
|
|
47
60
|
this._domHander = this._domHander || uki.proxy(function(e) {
|
|
48
61
|
e.source = this;
|
|
49
62
|
this.trigger(e.type, e);
|
|
@@ -33,11 +33,6 @@ uki.view.Styleable = new function() {
|
|
|
33
33
|
// };
|
|
34
34
|
// });
|
|
35
35
|
|
|
36
|
-
var probe = uki.createElement('div').style;
|
|
37
|
-
uki.each(['userSelect', 'MozUserSelect', 'WebkitUserSelect'], function(i, name) {
|
|
38
|
-
if (typeof probe[name] == 'string') this._textSelectProp = name;
|
|
39
|
-
}, this);
|
|
40
|
-
|
|
41
36
|
/**
|
|
42
37
|
* Sets whether text of the view can be selected.
|
|
43
38
|
*
|
|
@@ -47,17 +42,15 @@ uki.view.Styleable = new function() {
|
|
|
47
42
|
* @param {boolean=} state
|
|
48
43
|
* @returns {boolean|uki.view.Base} current textSelectable state of self
|
|
49
44
|
*/
|
|
50
|
-
this.textSelectable = function(state) {
|
|
51
|
-
if (state === undefined) return this._textSelectable;
|
|
45
|
+
this.textSelectable = uki.newProp('_textSelectable', function(state) {
|
|
52
46
|
this._textSelectable = state;
|
|
53
|
-
if (
|
|
54
|
-
this._dom.style[
|
|
47
|
+
if (uki.browser.cssUserSelect() != 'unsupported') {
|
|
48
|
+
this._dom.style[uki.camalize(uki.browser.cssUserSelect())] = (state ? '' : uki.browser.cssUserSelect() == '-moz-user-select' ? '-moz-none' : 'none');
|
|
55
49
|
} else {
|
|
56
50
|
uki.dom[state ? 'unbind' : 'bind'](this.dom(), 'selectstart', uki.dom.preventDefaultHandler);
|
|
57
51
|
}
|
|
58
52
|
this._dom.style.cursor = state ? '' : 'default';
|
|
59
|
-
|
|
60
|
-
};
|
|
53
|
+
});
|
|
61
54
|
|
|
62
55
|
this.draggable = function(state) {
|
|
63
56
|
if (state === undefined) return this._dom.getAttribute('draggable');
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
include('json.js');
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* based on http://github.com/uki/uki/blob/1.4.2/src/ajax.js
|
|
3
5
|
*
|
|
@@ -18,34 +20,6 @@ var jsc = +new Date,
|
|
|
18
20
|
|
|
19
21
|
|
|
20
22
|
uki.extend(uki, {
|
|
21
|
-
error: function( msg ) {
|
|
22
|
-
throw msg;
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
parseJSON: function( data ) {
|
|
26
|
-
if ( typeof data !== "string" || !data ) {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Make sure leading/trailing whitespace is removed (IE can't handle it)
|
|
31
|
-
data = uki.trim( data );
|
|
32
|
-
|
|
33
|
-
// Make sure the incoming data is actual JSON
|
|
34
|
-
// Logic borrowed from http://json.org/json2.js
|
|
35
|
-
if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
|
|
36
|
-
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
|
|
37
|
-
.replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
|
|
38
|
-
|
|
39
|
-
// Try to use the native JSON parser first
|
|
40
|
-
return window.JSON && window.JSON.parse ?
|
|
41
|
-
window.JSON.parse( data ) :
|
|
42
|
-
(new Function("return " + data))();
|
|
43
|
-
|
|
44
|
-
} else {
|
|
45
|
-
uki.error( "Invalid JSON: " + data );
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
|
|
49
23
|
// Evalulates a script in a global context
|
|
50
24
|
globalEval: function( data ) {
|
|
51
25
|
if ( data && rnotwhite.test(data) ) {
|
|
@@ -240,7 +214,7 @@ uki.extend(uki, {
|
|
|
240
214
|
}
|
|
241
215
|
|
|
242
216
|
if ( s.cache === false && type === "GET" ) {
|
|
243
|
-
var ts =
|
|
217
|
+
var ts = +new Date;
|
|
244
218
|
|
|
245
219
|
// try replacing _= if it is there
|
|
246
220
|
var ret = s.url.replace(rts, "$1_=" + ts + "$2");
|
|
@@ -517,7 +491,7 @@ uki.extend(uki, {
|
|
|
517
491
|
data = xml ? xhr.responseXML : xhr.responseText;
|
|
518
492
|
|
|
519
493
|
if ( xml && data.documentElement.nodeName === "parsererror" ) {
|
|
520
|
-
|
|
494
|
+
throw "parsererror";
|
|
521
495
|
}
|
|
522
496
|
|
|
523
497
|
// Allow a pre-filtering function to sanitize the response
|