uki 1.0.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.
- data/.gitignore +7 -0
- data/.gitmodules +3 -0
- data/LICENSE +20 -0
- data/Rakefile +23 -0
- data/Readme.rdoc +9 -0
- data/VERSION +1 -0
- data/bin/uki +102 -0
- data/frameworks/jspec/lib/images/bg.png +0 -0
- data/frameworks/jspec/lib/images/hr.png +0 -0
- data/frameworks/jspec/lib/images/loading.gif +0 -0
- data/frameworks/jspec/lib/images/sprites.bg.png +0 -0
- data/frameworks/jspec/lib/images/sprites.png +0 -0
- data/frameworks/jspec/lib/images/vr.png +0 -0
- data/frameworks/jspec/lib/jspec.css +149 -0
- data/frameworks/jspec/lib/jspec.growl.js +115 -0
- data/frameworks/jspec/lib/jspec.jquery.js +72 -0
- data/frameworks/jspec/lib/jspec.js +1756 -0
- data/frameworks/jspec/lib/jspec.shell.js +39 -0
- data/frameworks/jspec/lib/jspec.timers.js +90 -0
- data/frameworks/jspec/lib/jspec.xhr.js +195 -0
- data/frameworks/uki/README.rdoc +179 -0
- data/frameworks/uki/compiler.jar +0 -0
- data/frameworks/uki/run.rb +2 -0
- data/frameworks/uki/spec/commands/example_command.rb +19 -0
- data/frameworks/uki/spec/dom.html +39 -0
- data/frameworks/uki/spec/support/images/bg.png +0 -0
- data/frameworks/uki/spec/support/images/hr.png +0 -0
- data/frameworks/uki/spec/support/images/loading.gif +0 -0
- data/frameworks/uki/spec/support/images/sprites.bg.png +0 -0
- data/frameworks/uki/spec/support/images/sprites.png +0 -0
- data/frameworks/uki/spec/support/images/vr.png +0 -0
- data/frameworks/uki/spec/support/jspec.css +149 -0
- data/frameworks/uki/spec/support/jspec.js +1773 -0
- data/frameworks/uki/spec/support/jspec.xhr.js +193 -0
- data/frameworks/uki/spec/support/spec.helper.js +1 -0
- data/frameworks/uki/spec/unit/background.spec.js +29 -0
- data/frameworks/uki/spec/unit/builder.spec.js +51 -0
- data/frameworks/uki/spec/unit/data/model.spec.js +29 -0
- data/frameworks/uki/spec/unit/dom/dnd.spec.js +71 -0
- data/frameworks/uki/spec/unit/dom/event.spec.js +78 -0
- data/frameworks/uki/spec/unit/dom.spec.js +28 -0
- data/frameworks/uki/spec/unit/geometry.spec.js +79 -0
- data/frameworks/uki/spec/unit/selector.spec.js +140 -0
- data/frameworks/uki/spec/unit/theme/template.spec.js +31 -0
- data/frameworks/uki/spec/unit/utils.spec.js +176 -0
- data/frameworks/uki/spec/unit/view/base.spec.js +86 -0
- data/frameworks/uki/spec/unit/view/container.spec.js +73 -0
- data/frameworks/uki/spec/unit/view.spec.js +13 -0
- data/frameworks/uki/src/airport.js +1 -0
- data/frameworks/uki/src/uki-core/attachment.js +175 -0
- data/frameworks/uki/src/uki-core/background/css.js +37 -0
- data/frameworks/uki/src/uki-core/background/cssBox.js +73 -0
- data/frameworks/uki/src/uki-core/background/multi.js +20 -0
- data/frameworks/uki/src/uki-core/background/null.js +10 -0
- data/frameworks/uki/src/uki-core/background/rows.js +77 -0
- data/frameworks/uki/src/uki-core/background/sliced9.js +206 -0
- data/frameworks/uki/src/uki-core/background.js +35 -0
- data/frameworks/uki/src/uki-core/builder.js +68 -0
- data/frameworks/uki/src/uki-core/collection.js +278 -0
- data/frameworks/uki/src/uki-core/const.js +17 -0
- data/frameworks/uki/src/uki-core/dom/dnd.js +93 -0
- data/frameworks/uki/src/uki-core/dom/event.js +194 -0
- data/frameworks/uki/src/uki-core/dom/nativeLayout.js +18 -0
- data/frameworks/uki/src/uki-core/dom/offset.js +130 -0
- data/frameworks/uki/src/uki-core/dom/w3cdnd.js +333 -0
- data/frameworks/uki/src/uki-core/dom.js +109 -0
- data/frameworks/uki/src/uki-core/geometry.js +658 -0
- data/frameworks/uki/src/uki-core/image.js +90 -0
- data/frameworks/uki/src/uki-core/selector.js +201 -0
- data/frameworks/uki/src/uki-core/theme/base.js +39 -0
- data/frameworks/uki/src/uki-core/theme/template.js +26 -0
- data/frameworks/uki/src/uki-core/theme.js +45 -0
- data/frameworks/uki/src/uki-core/uki.js +45 -0
- data/frameworks/uki/src/uki-core/utils.js +399 -0
- data/frameworks/uki/src/uki-core/view/base.js +480 -0
- data/frameworks/uki/src/uki-core/view/container.js +155 -0
- data/frameworks/uki/src/uki-core/view/focusable.js +93 -0
- data/frameworks/uki/src/uki-core/view/observable.js +66 -0
- data/frameworks/uki/src/uki-core/view/styleable.js +70 -0
- data/frameworks/uki/src/uki-core/view/utils.js +66 -0
- data/frameworks/uki/src/uki-core/view.js +21 -0
- data/frameworks/uki/src/uki-core.js +36 -0
- data/frameworks/uki/src/uki-data/data.js +1 -0
- data/frameworks/uki/src/uki-data/model.js +28 -0
- data/frameworks/uki/src/uki-data/observable.js +34 -0
- data/frameworks/uki/src/uki-data.js +1 -0
- data/frameworks/uki/src/uki-more/more/utils.js +20 -0
- data/frameworks/uki/src/uki-more/more/view/listContainer.js +4 -0
- data/frameworks/uki/src/uki-more/more/view/multiselectList.js +196 -0
- data/frameworks/uki/src/uki-more/more/view/radioButton.js +27 -0
- data/frameworks/uki/src/uki-more/more/view/splitTable.js +79 -0
- data/frameworks/uki/src/uki-more/more/view/toggleButton.js +24 -0
- data/frameworks/uki/src/uki-more/more/view/treeList/render.js +53 -0
- data/frameworks/uki/src/uki-more/more/view/treeList.js +110 -0
- data/frameworks/uki/src/uki-more/more/view.js +2 -0
- data/frameworks/uki/src/uki-more/more.js +1 -0
- data/frameworks/uki/src/uki-more.js +4 -0
- data/frameworks/uki/src/uki-theamless.js +15 -0
- 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/checkbox/checkbox.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/checkbox/focus.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/checkbox/normal.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/checkbox/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/radio/focus.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/radio/normal.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/radio/normal.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/radio/radio.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
- data/frameworks/uki/src/uki-theme/airport/i/splitPane/horizontal.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/splitPane/horizontal.png +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/splitPane/vertical.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport/i/x.gif +0 -0
- data/frameworks/uki/src/uki-theme/airport.js +322 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/down-c.gif +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/down-c.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/down-h.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/down-m.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/down-v.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/down.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/focusRing-c.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/focusRing-h.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/focusRing-m.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/focusRing-v.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/focusRing.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/normal-c.gif +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/normal-c.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/normal-h.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/normal-m.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/normal-v.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/button/normal.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/checkbox/focus.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/checkbox/normal.gif +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/checkbox/normal.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/panel/normal-h.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/panel/normal-m.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/panel/normal.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/popup/normal.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/radio/focus.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/radio/normal.gif +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/radio/normal.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/shadow/large-c.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/shadow/large-h.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/shadow/large-m.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/shadow/large-v.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/shadow/large.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/slider/bar-m.gif +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/slider/bar-m.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/slider/bar-v.gif +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/slider/bar-v.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/slider/bar.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/slider/handle.gif +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/slider/handle.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/splitPane/horizontal.gif +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/splitPane/horizontal.png +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/splitPane/vertical.gif +0 -0
- data/frameworks/uki/src/uki-theme/aristo/i/x.gif +0 -0
- data/frameworks/uki/src/uki-theme/aristo.js +217 -0
- data/frameworks/uki/src/uki-view/view/box.js +1 -0
- data/frameworks/uki/src/uki-view/view/button.js +126 -0
- data/frameworks/uki/src/uki-view/view/checkbox.js +36 -0
- data/frameworks/uki/src/uki-view/view/flow.js +48 -0
- data/frameworks/uki/src/uki-view/view/image.js +9 -0
- data/frameworks/uki/src/uki-view/view/label.js +123 -0
- data/frameworks/uki/src/uki-view/view/list/render.js +23 -0
- data/frameworks/uki/src/uki-view/view/list.js +442 -0
- data/frameworks/uki/src/uki-view/view/popup.js +113 -0
- data/frameworks/uki/src/uki-view/view/radio.js +57 -0
- data/frameworks/uki/src/uki-view/view/scrollPane.js +139 -0
- data/frameworks/uki/src/uki-view/view/slider.js +154 -0
- data/frameworks/uki/src/uki-view/view/splitPane.js +213 -0
- data/frameworks/uki/src/uki-view/view/table/column.js +96 -0
- data/frameworks/uki/src/uki-view/view/table/header.js +53 -0
- data/frameworks/uki/src/uki-view/view/table/render.js +25 -0
- data/frameworks/uki/src/uki-view/view/table.js +71 -0
- data/frameworks/uki/src/uki-view/view/textField.js +145 -0
- data/frameworks/uki/src/uki-view/view/toolbar.js +93 -0
- data/frameworks/uki/src/uki-view.js +15 -0
- data/frameworks/uki/src/uki.js +2 -0
- data/frameworks/uki/thin.yaml +11 -0
- data/frameworks/uki/uki.rb +38 -0
- data/frameworks/uki/uki.ru +2 -0
- data/lib/uki/include_js.rb +50 -0
- data/lib/uki/project.rb +207 -0
- data/lib/uki/routes.rb +20 -0
- data/lib/uki/server.rb +42 -0
- data/lib/uki.rb +9 -0
- data/templates/index.html.erb +10 -0
- data/templates/model.js.erb +5 -0
- data/templates/myapp.js.erb +44 -0
- data/templates/package.js.erb +3 -0
- data/templates/spec.html.erb +23 -0
- data/templates/spec.js.erb +6 -0
- data/templates/view.js.erb +10 -0
- data/uki.gemspec +281 -0
- metadata +317 -0
|
@@ -0,0 +1,658 @@
|
|
|
1
|
+
include('uki.js');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Geometry
|
|
5
|
+
*
|
|
6
|
+
* @namespace
|
|
7
|
+
*/
|
|
8
|
+
uki.geometry = {};
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Point with x and y properties
|
|
13
|
+
*
|
|
14
|
+
* @author voloko
|
|
15
|
+
* @name uki.geometry.Point
|
|
16
|
+
* @constructor
|
|
17
|
+
*
|
|
18
|
+
* @param {Integer=} x defaults to 0
|
|
19
|
+
* @param {Integer=} y defaults to 0
|
|
20
|
+
*/
|
|
21
|
+
var Point = uki.geometry.Point = function(x, y) {
|
|
22
|
+
this.x = x*1.0 || 0.0;
|
|
23
|
+
this.y = y*1.0 || 0.0;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
Point.prototype = /** @lends uki.geometry.Point.prototype */ {
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Converts to "100 50" string
|
|
30
|
+
*
|
|
31
|
+
* @this {uki.geometry.Point}
|
|
32
|
+
* @return {string}
|
|
33
|
+
*/
|
|
34
|
+
toString: function() {
|
|
35
|
+
return this.x + ' ' + this.y;
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Creates a new Point with the same properties
|
|
40
|
+
*
|
|
41
|
+
* @this {uki.geometry.Point}
|
|
42
|
+
* @return {uki.geometry.Point}
|
|
43
|
+
*/
|
|
44
|
+
clone: function() {
|
|
45
|
+
return new Point(this.x, this.y);
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Checks if this equals to another Point
|
|
50
|
+
*
|
|
51
|
+
* @param {uki.geometry.Point} point Point to compare with
|
|
52
|
+
* @this {uki.geometry.Point}
|
|
53
|
+
* @return {boolean}
|
|
54
|
+
*/
|
|
55
|
+
eq: function(point) {
|
|
56
|
+
return this.x == point.x && this.y == point.y;
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Moves point by x, y
|
|
61
|
+
*
|
|
62
|
+
* @this {uki.geometry.Point}
|
|
63
|
+
* @return {uki.geometry.Point} self
|
|
64
|
+
*/
|
|
65
|
+
offset: function(x, y) {
|
|
66
|
+
if (typeof x == 'object') {
|
|
67
|
+
y = x.y;
|
|
68
|
+
x = x.x;
|
|
69
|
+
}
|
|
70
|
+
this.x += x;
|
|
71
|
+
this.y += y;
|
|
72
|
+
return this;
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
constructor: Point
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Creates point from "x y" string
|
|
80
|
+
*
|
|
81
|
+
* @memberOf uki.geometry.Point
|
|
82
|
+
* @name fromString
|
|
83
|
+
* @function
|
|
84
|
+
*
|
|
85
|
+
* @param {string} string String representation of point
|
|
86
|
+
*
|
|
87
|
+
* @returns {uki.geometry.Point} created point
|
|
88
|
+
*/
|
|
89
|
+
Point.fromString = function(string) {
|
|
90
|
+
var parts = string.split(/\s+/);
|
|
91
|
+
return new Point( parts[0], parts[1] );
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Size with width and height properties
|
|
97
|
+
*
|
|
98
|
+
* @param {number=} width defaults to 0
|
|
99
|
+
* @param {number=} height defaults to 0
|
|
100
|
+
* @name uki.geometry.Size
|
|
101
|
+
* @constructor
|
|
102
|
+
*/
|
|
103
|
+
var Size = uki.geometry.Size = function(width, height) {
|
|
104
|
+
this.width = width*1.0 || 0.0;
|
|
105
|
+
this.height = height*1.0 || 0.0;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
Size.prototype = /** @lends uki.geometry.Size.prototype */ {
|
|
109
|
+
/**
|
|
110
|
+
* Converts size to "300 100" string
|
|
111
|
+
*
|
|
112
|
+
* @this {uki.geometry.Size}
|
|
113
|
+
* @return {string}
|
|
114
|
+
*/
|
|
115
|
+
toString: function() {
|
|
116
|
+
return this.width + ' ' + this.height;
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Creates a new Size with same properties
|
|
121
|
+
*
|
|
122
|
+
* @this {uki.geometry.Size}
|
|
123
|
+
* @return {uki.geometry.Size} new Size
|
|
124
|
+
*/
|
|
125
|
+
clone: function() {
|
|
126
|
+
return new Size(this.width, this.height);
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Checks if this equals to another Size
|
|
131
|
+
*
|
|
132
|
+
* @param {uki.geometry.Size} size Size to compare with
|
|
133
|
+
* @this {uki.geometry.Size}
|
|
134
|
+
* @return {boolean}
|
|
135
|
+
*/
|
|
136
|
+
eq: function(size) {
|
|
137
|
+
return this.width == size.width && this.height == size.height;
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Checks if this size has non-positive width or height
|
|
142
|
+
*
|
|
143
|
+
* @this {uki.geometry.Size}
|
|
144
|
+
* @return {boolean}
|
|
145
|
+
*/
|
|
146
|
+
empty: function() {
|
|
147
|
+
return this.width <= 0 || this.height <= 0;
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
constructor: Size
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Creates size from "width height" string
|
|
155
|
+
*
|
|
156
|
+
* @memberOf uki.geometry.Size
|
|
157
|
+
* @name fromString
|
|
158
|
+
* @function
|
|
159
|
+
*
|
|
160
|
+
* @param {string} string String representation of size
|
|
161
|
+
*
|
|
162
|
+
* @returns {uki.geometry.Size} created size
|
|
163
|
+
*/
|
|
164
|
+
Size.fromString = function(string) {
|
|
165
|
+
var parts = string.split(/\s+/);
|
|
166
|
+
return new Size( parts[0], parts[1] );
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Creates size from different representations
|
|
171
|
+
* - if no params given returns null
|
|
172
|
+
* - if uki.geometry.Size given returns it
|
|
173
|
+
* - if "200 300" string converts it to size
|
|
174
|
+
* - if two params given creates size from them
|
|
175
|
+
*
|
|
176
|
+
* @memberOf uki.geometry.Size
|
|
177
|
+
* @name create
|
|
178
|
+
* @function
|
|
179
|
+
*
|
|
180
|
+
* @param {...string|number|uki.geometry.Size} var_args Size representation
|
|
181
|
+
*
|
|
182
|
+
* @returns {uki.geometry.Size} created size
|
|
183
|
+
*/
|
|
184
|
+
Size.create = function(a1, a2) {
|
|
185
|
+
if (a1 === undefined) return null;
|
|
186
|
+
if (a1.width !== undefined) return a1;
|
|
187
|
+
if (/\S+\s+\S+/.test(a1 + '')) return Size.fromString(a1, a2);
|
|
188
|
+
return new Size(a1, a2);
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Rectangle with x, y, width and height properties
|
|
194
|
+
* May be used as uki.geometry.Point or uki.geometry.Size
|
|
195
|
+
* - if 4 arguments given creates size with x,y,width,height set to the given arguments
|
|
196
|
+
* - if 2 number arguments given creates size with x = y = 0 and width and height set
|
|
197
|
+
* set to the given arguments
|
|
198
|
+
* - if a Point and a Size given creates rect with point as an origin and given size
|
|
199
|
+
*
|
|
200
|
+
* @param {...number|uki.geometry.Point|uki.geometry.Size} var_args
|
|
201
|
+
* @name uki.geometry.Rect
|
|
202
|
+
* @augments uki.geometry.Size
|
|
203
|
+
* @augments uki.geometry.Point
|
|
204
|
+
* @constructor
|
|
205
|
+
*/
|
|
206
|
+
var Rect = uki.geometry.Rect = function(a1, a2, a3, a4) {
|
|
207
|
+
if (a3 !== undefined) {
|
|
208
|
+
this.x = a1*1.0 || 0.0;
|
|
209
|
+
this.y = a2*1.0 || 0.0;
|
|
210
|
+
this.width = a3*1.0 || 0.0;
|
|
211
|
+
this.height = a4*1.0 || 0.0;
|
|
212
|
+
} else if (a1 === undefined || a1.x === undefined) {
|
|
213
|
+
this.x = 0;
|
|
214
|
+
this.y = 0;
|
|
215
|
+
this.width = a1*1.0 || 0.0;
|
|
216
|
+
this.height = a2*1.0 || 0.0;
|
|
217
|
+
} else {
|
|
218
|
+
this.x = a1 ? a1.x*1.0 : 0;
|
|
219
|
+
this.y = a1 ? a1.y*1.0 : 0;
|
|
220
|
+
this.width = a2 ? a2.width*1.0 : 0;
|
|
221
|
+
this.height = a2 ? a2.height*1.0 : 0;
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
Rect.prototype = /** @lends uki.geometry.Rect.prototype */ {
|
|
226
|
+
/**
|
|
227
|
+
* Converts Rect to "x y width height" string
|
|
228
|
+
*
|
|
229
|
+
* @this {uki.geometry.Rect}
|
|
230
|
+
* @returns {string}
|
|
231
|
+
*/
|
|
232
|
+
toString: function() {
|
|
233
|
+
return [this.x, this.y, this.width, this.height].join(' ');
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Converts Rect to "x y maxX maxY" string
|
|
238
|
+
*
|
|
239
|
+
* @this {uki.geometry.Rect}
|
|
240
|
+
* @returns {string}
|
|
241
|
+
*/
|
|
242
|
+
toCoordsString: function() {
|
|
243
|
+
return [this.x, this.y, this.maxX(), this.maxY()].join(' ');
|
|
244
|
+
},
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Creates a new Rect with same properties
|
|
248
|
+
*
|
|
249
|
+
* @this {uki.geometry.Size}
|
|
250
|
+
* @return {uki.geometry.Size} new Size
|
|
251
|
+
*/
|
|
252
|
+
clone: function() {
|
|
253
|
+
return new Rect(this.x, this.y, this.width, this.height);
|
|
254
|
+
},
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Equals to .x
|
|
258
|
+
*
|
|
259
|
+
* @this {uki.geometry.Rect}
|
|
260
|
+
* @returns {number}
|
|
261
|
+
*/
|
|
262
|
+
minX: function() {
|
|
263
|
+
return this.x;
|
|
264
|
+
},
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Equals to x + width
|
|
268
|
+
*
|
|
269
|
+
* @this {uki.geometry.Rect}
|
|
270
|
+
* @returns {number}
|
|
271
|
+
*/
|
|
272
|
+
maxX: function() {
|
|
273
|
+
return this.x + this.width;
|
|
274
|
+
},
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Point between minX and maxX
|
|
278
|
+
*
|
|
279
|
+
* @this {uki.geometry.Rect}
|
|
280
|
+
* @returns {number}
|
|
281
|
+
*/
|
|
282
|
+
midX: function() {
|
|
283
|
+
return this.x + this.width / 2.0;
|
|
284
|
+
},
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Equals to .y
|
|
288
|
+
*
|
|
289
|
+
* @this {uki.geometry.Rect}
|
|
290
|
+
* @returns {number}
|
|
291
|
+
*/
|
|
292
|
+
minY: function() {
|
|
293
|
+
return this.y;
|
|
294
|
+
},
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Point between minY and maxY
|
|
298
|
+
*
|
|
299
|
+
* @this {uki.geometry.Rect}
|
|
300
|
+
* @returns {number}
|
|
301
|
+
*/
|
|
302
|
+
midY: function() {
|
|
303
|
+
return this.y + this.height / 2.0;
|
|
304
|
+
},
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Equals to y + height
|
|
308
|
+
*
|
|
309
|
+
* @this {uki.geometry.Rect}
|
|
310
|
+
* @returns {number}
|
|
311
|
+
*/
|
|
312
|
+
maxY: function() {
|
|
313
|
+
return this.y + this.height;
|
|
314
|
+
},
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Moves origin to 0,0 point
|
|
318
|
+
*
|
|
319
|
+
* @this {uki.geometry.Rect}
|
|
320
|
+
* @returns {uki.geometry.Point} self
|
|
321
|
+
*/
|
|
322
|
+
normalize: function() {
|
|
323
|
+
this.x = this.y = 0;
|
|
324
|
+
return this;
|
|
325
|
+
},
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Checks if this rect has non-positive width or height
|
|
329
|
+
*
|
|
330
|
+
* @this {uki.geometry.Rect}
|
|
331
|
+
* @function
|
|
332
|
+
* @return {boolean}
|
|
333
|
+
*/
|
|
334
|
+
empty: Size.prototype.empty,
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Checks if this equals to another Rect
|
|
338
|
+
*
|
|
339
|
+
* @param {uki.geometry.Rect} rect Rect to compare with
|
|
340
|
+
* @this {uki.geometry.Rect}
|
|
341
|
+
* @return {boolean}
|
|
342
|
+
*/
|
|
343
|
+
eq: function(rect) {
|
|
344
|
+
return rect && this.x == rect.x && this.y == rect.y && this.height == rect.height && this.width == rect.width;
|
|
345
|
+
},
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Insets size with dx and dy
|
|
349
|
+
*
|
|
350
|
+
* @param {number} dx
|
|
351
|
+
* @param {number} dy
|
|
352
|
+
* @this {uki.geometry.Rect}
|
|
353
|
+
* @returns {uki.geometry.Rect} sefl
|
|
354
|
+
*/
|
|
355
|
+
inset: function(dx, dy) {
|
|
356
|
+
this.x += dx;
|
|
357
|
+
this.y += dy;
|
|
358
|
+
this.width -= dx*2.0;
|
|
359
|
+
this.height -= dy*2.0;
|
|
360
|
+
return this;
|
|
361
|
+
},
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Moves origin point by x, y
|
|
365
|
+
*
|
|
366
|
+
* @this {uki.geometry.Rect}
|
|
367
|
+
* @function
|
|
368
|
+
* @return {uki.geometry.Rect} self
|
|
369
|
+
*/
|
|
370
|
+
offset: Point.prototype.offset,
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Intersects this with given rect
|
|
374
|
+
*
|
|
375
|
+
* @this {uki.geometry.Rect}
|
|
376
|
+
* @param {uki.geometry.Rect} rect Rect to intersect with
|
|
377
|
+
* @returns {uki.geometry.Rect} intersection
|
|
378
|
+
*/
|
|
379
|
+
intersection: function(rect) {
|
|
380
|
+
var origin = new Point(
|
|
381
|
+
MAX(this.x, rect.x),
|
|
382
|
+
MAX(this.y, rect.y)
|
|
383
|
+
),
|
|
384
|
+
size = new Size(
|
|
385
|
+
MIN(this.maxX(), rect.maxX()) - origin.x,
|
|
386
|
+
MIN(this.maxY(), rect.maxY()) - origin.y
|
|
387
|
+
);
|
|
388
|
+
return size.empty() ? new Rect() : new Rect(origin, size);
|
|
389
|
+
},
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Union rect of this and given rect
|
|
393
|
+
*
|
|
394
|
+
* @this {uki.geometry.Rect}
|
|
395
|
+
* @param {uki.geometry.Rect} rect
|
|
396
|
+
* @returns {uki.geometry.Rect} union
|
|
397
|
+
*/
|
|
398
|
+
union: function(rect) {
|
|
399
|
+
return Rect.fromCoords(
|
|
400
|
+
MIN(this.x, rect.x),
|
|
401
|
+
MIN(this.y, rect.y),
|
|
402
|
+
MAX(this.maxX(), rect.maxX()),
|
|
403
|
+
MAX(this.maxY(), rect.maxY())
|
|
404
|
+
);
|
|
405
|
+
},
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Checks if point is within this
|
|
409
|
+
*
|
|
410
|
+
* @this {uki.geometry.Rect}
|
|
411
|
+
* @param {uki.geometry.Point} point
|
|
412
|
+
* @returns {boolean}
|
|
413
|
+
*/
|
|
414
|
+
containsPoint: function(point) {
|
|
415
|
+
return point.x >= this.minX() &&
|
|
416
|
+
point.x <= this.maxX() &&
|
|
417
|
+
point.y >= this.minY() &&
|
|
418
|
+
point.y <= this.maxY();
|
|
419
|
+
},
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Checks if this contains given rect
|
|
423
|
+
*
|
|
424
|
+
* @this {uki.geometry.Rect}
|
|
425
|
+
* @param {uki.geometry.Rect} rect
|
|
426
|
+
* @returns {boolean}
|
|
427
|
+
*/
|
|
428
|
+
containsRect: function(rect) {
|
|
429
|
+
return this.eq(this.union(rect));
|
|
430
|
+
},
|
|
431
|
+
|
|
432
|
+
constructor: Rect
|
|
433
|
+
};
|
|
434
|
+
|
|
435
|
+
Rect.prototype.left = Rect.prototype.minX;
|
|
436
|
+
Rect.prototype.top = Rect.prototype.minY;
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Creates Rect from minX, minY, maxX, maxY
|
|
440
|
+
*
|
|
441
|
+
* @memberOf uki.geometry.Rect
|
|
442
|
+
* @name fromCoords
|
|
443
|
+
* @function
|
|
444
|
+
*
|
|
445
|
+
* @param {number} minX
|
|
446
|
+
* @param {number} maxX
|
|
447
|
+
* @param {number} minY
|
|
448
|
+
* @param {number} maxY
|
|
449
|
+
* @returns {uki.geometry.Rect}
|
|
450
|
+
*/
|
|
451
|
+
Rect.fromCoords = function(minX, minY, maxX, maxY) {
|
|
452
|
+
if (maxX === undefined) {
|
|
453
|
+
return new Rect(
|
|
454
|
+
minX.x,
|
|
455
|
+
minX.y,
|
|
456
|
+
minY.x - minX.x,
|
|
457
|
+
minY.y - minX.y
|
|
458
|
+
);
|
|
459
|
+
}
|
|
460
|
+
return new Rect(minX, minY, maxX - minX, maxY - minY);
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Creates Rect from "minX minY maxX maxY" string
|
|
465
|
+
*
|
|
466
|
+
* @memberOf uki.geometry.Rect
|
|
467
|
+
* @name fromCoordsString
|
|
468
|
+
* @function
|
|
469
|
+
*
|
|
470
|
+
* @param {string} string
|
|
471
|
+
* @returns {uki.geometry.Rect}
|
|
472
|
+
*/
|
|
473
|
+
Rect.fromCoordsString = function(string) {
|
|
474
|
+
var parts = string.split(/\s+/);
|
|
475
|
+
return Rect.fromCoords(
|
|
476
|
+
parts[0],
|
|
477
|
+
parts[1],
|
|
478
|
+
parts[2],
|
|
479
|
+
parts[3]
|
|
480
|
+
) ;
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Creates Rect from "x y width height" or "width height" string
|
|
485
|
+
*
|
|
486
|
+
* @memberOf uki.geometry.Rect
|
|
487
|
+
* @name fromString
|
|
488
|
+
* @function
|
|
489
|
+
*
|
|
490
|
+
* @param {string} string
|
|
491
|
+
* @returns {uki.geometry.Rect}
|
|
492
|
+
*/
|
|
493
|
+
Rect.fromString = function(string) {
|
|
494
|
+
var parts = string.split(/\s+/);
|
|
495
|
+
|
|
496
|
+
if (parts.length > 2) return new Rect(
|
|
497
|
+
parts[0],
|
|
498
|
+
parts[1],
|
|
499
|
+
parts[2],
|
|
500
|
+
parts[3]
|
|
501
|
+
);
|
|
502
|
+
return new Rect(
|
|
503
|
+
parts[0],
|
|
504
|
+
parts[1]
|
|
505
|
+
) ;
|
|
506
|
+
};
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Creates rect from different representations
|
|
510
|
+
* - if no params given returns null
|
|
511
|
+
* - if uki.geometry.Rect given returns it
|
|
512
|
+
* - if "200 300" or "0 10 200 300" string converts it to rect
|
|
513
|
+
* - if two or four params given creates rect from them
|
|
514
|
+
*
|
|
515
|
+
* @memberOf uki.geometry.Rect
|
|
516
|
+
* @name creates
|
|
517
|
+
* @function
|
|
518
|
+
*
|
|
519
|
+
* @param {...string|number|uki.geometry.Rect} var_args Rect representation
|
|
520
|
+
*
|
|
521
|
+
* @returns {uki.geometry.Rect} created size
|
|
522
|
+
*/
|
|
523
|
+
Rect.create = function(a1, a2, a3, a4) {
|
|
524
|
+
if (a1 === undefined) return null;
|
|
525
|
+
if (a1.x !== undefined) return a1;
|
|
526
|
+
if (/\S+\s+\S+/.test(a1 + '')) return Rect.fromString(a1, a2);
|
|
527
|
+
if (a3 === undefined) return new Rect(a1, a2);
|
|
528
|
+
return new Rect(a1, a2, a3, a4);
|
|
529
|
+
};
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
* Inset with top, right, bottom and left properties
|
|
534
|
+
* - if no params given top = right = bottom = left = 0
|
|
535
|
+
* - if two params given top = bottom and right = left
|
|
536
|
+
*
|
|
537
|
+
* @param {number=} top
|
|
538
|
+
* @param {number=} right
|
|
539
|
+
* @param {number=} bottom
|
|
540
|
+
* @param {number=} left
|
|
541
|
+
*
|
|
542
|
+
* @name uki.geometry.Inset
|
|
543
|
+
* @constructor
|
|
544
|
+
*/
|
|
545
|
+
var Inset = uki.geometry.Inset = function(top, right, bottom, left) {
|
|
546
|
+
this.top = top*1.0 || 0;
|
|
547
|
+
this.right = right*1.0 || 0;
|
|
548
|
+
this.bottom = bottom === undefined ? this.top*1.0 : bottom*1.0;
|
|
549
|
+
this.left = left === undefined ? this.right*1.0 : left*1.0;
|
|
550
|
+
};
|
|
551
|
+
|
|
552
|
+
Inset.prototype = /** @lends uki.geometry.Inset.prototype */ {
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* Converts Inset to "top right bottom left" string
|
|
556
|
+
*
|
|
557
|
+
* @returns {string}
|
|
558
|
+
*/
|
|
559
|
+
toString: function() {
|
|
560
|
+
return [this.top, this.right, this.bottom, this.left].join(' ');
|
|
561
|
+
},
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* Creates a new Inset with same properties
|
|
565
|
+
*
|
|
566
|
+
* @this {uki.geometry.Inset}
|
|
567
|
+
* @return {uki.geometry.Inset} new Inset
|
|
568
|
+
*/
|
|
569
|
+
clone: function() {
|
|
570
|
+
return new Inset(this.top, this.right, this.bottom, this.left);
|
|
571
|
+
},
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* left + right
|
|
575
|
+
*
|
|
576
|
+
* @this {uki.geometry.Inset}
|
|
577
|
+
* @return {number}
|
|
578
|
+
*/
|
|
579
|
+
width: function() {
|
|
580
|
+
return this.left + this.right;
|
|
581
|
+
},
|
|
582
|
+
|
|
583
|
+
/**
|
|
584
|
+
* top + bottom
|
|
585
|
+
*
|
|
586
|
+
* @this {uki.geometry.Inset}
|
|
587
|
+
* @return {number}
|
|
588
|
+
*/
|
|
589
|
+
height: function() {
|
|
590
|
+
return this.top + this.bottom;
|
|
591
|
+
},
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* True if any property < 0
|
|
595
|
+
*
|
|
596
|
+
* @this {uki.geometry.Inset}
|
|
597
|
+
* @return {boolean}
|
|
598
|
+
*/
|
|
599
|
+
negative: function() {
|
|
600
|
+
return this.top < 0 || this.left < 0 || this.right < 0 || this.bottom < 0;
|
|
601
|
+
},
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* True if all properties = 0
|
|
605
|
+
*
|
|
606
|
+
* @this {uki.geometry.Inset}
|
|
607
|
+
* @return {boolean}
|
|
608
|
+
*/
|
|
609
|
+
empty: function() {
|
|
610
|
+
return !this.top && !this.left && !this.right && !this.bottom;
|
|
611
|
+
}
|
|
612
|
+
};
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* Creates Rect from "top right bottom left" or "top right" string
|
|
616
|
+
*
|
|
617
|
+
* @memberOf uki.geometry.Inset
|
|
618
|
+
* @name fromString
|
|
619
|
+
* @function
|
|
620
|
+
*
|
|
621
|
+
* @param {string} string
|
|
622
|
+
* @returns {uki.geometry.Inset}
|
|
623
|
+
*/
|
|
624
|
+
Inset.fromString = function(string) {
|
|
625
|
+
var parts = string.split(/\s+/);
|
|
626
|
+
if (parts.length < 3) parts[2] = parts[0];
|
|
627
|
+
if (parts.length < 4) parts[3] = parts[1];
|
|
628
|
+
|
|
629
|
+
return new Inset(
|
|
630
|
+
parts[0],
|
|
631
|
+
parts[1],
|
|
632
|
+
parts[2],
|
|
633
|
+
parts[3]
|
|
634
|
+
);
|
|
635
|
+
};
|
|
636
|
+
|
|
637
|
+
/**
|
|
638
|
+
* Creates rect from different representations
|
|
639
|
+
* - if no params given returns null
|
|
640
|
+
* - if uki.geometry.Inset given returns it
|
|
641
|
+
* - if "200 300" or "0 10 200 300" string converts it to inset
|
|
642
|
+
* - if two or four params given creates inset from them
|
|
643
|
+
*
|
|
644
|
+
* @memberOf uki.geometry.Inset
|
|
645
|
+
* @name create
|
|
646
|
+
* @function
|
|
647
|
+
*
|
|
648
|
+
* @param {...string|number|uki.geometry.Inset} var_args Rect representation
|
|
649
|
+
*
|
|
650
|
+
* @returns {uki.geometry.Inset} created inset
|
|
651
|
+
*/
|
|
652
|
+
Inset.create = function(a1, a2, a3, a4) {
|
|
653
|
+
if (a1 === undefined) return null;
|
|
654
|
+
if (a1.top !== undefined) return a1;
|
|
655
|
+
if (/\S+\s+\S+/.test(a1 + '')) return Inset.fromString(a1, a2);
|
|
656
|
+
if (a3 === undefined) return new Inset(a1, a2);
|
|
657
|
+
return new Inset(a1, a2, a3, a4);
|
|
658
|
+
};
|