under-os-ui 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +26 -0
  3. data/lib/assets/fontawesome-webfont.ttf +0 -0
  4. data/lib/assets/under-os.css +115 -0
  5. data/lib/core/kernel.rb +16 -0
  6. data/lib/under-os-ui.rb +6 -0
  7. data/lib/under_os/app.rb +26 -0
  8. data/lib/under_os/config.rb +25 -0
  9. data/lib/under_os/history.rb +53 -0
  10. data/lib/under_os/page.rb +178 -0
  11. data/lib/under_os/page/builder.rb +96 -0
  12. data/lib/under_os/page/layout.rb +43 -0
  13. data/lib/under_os/page/matcher.rb +128 -0
  14. data/lib/under_os/page/stylesheet.rb +67 -0
  15. data/lib/under_os/parser.rb +24 -0
  16. data/lib/under_os/parser/css.rb +37 -0
  17. data/lib/under_os/parser/html.rb +97 -0
  18. data/lib/under_os/ui.rb +3 -0
  19. data/lib/under_os/ui/alert.rb +52 -0
  20. data/lib/under_os/ui/button.rb +42 -0
  21. data/lib/under_os/ui/collection.rb +65 -0
  22. data/lib/under_os/ui/collection/cell.rb +21 -0
  23. data/lib/under_os/ui/collection/delegate.rb +70 -0
  24. data/lib/under_os/ui/collection/item.rb +32 -0
  25. data/lib/under_os/ui/collection/layout.rb +43 -0
  26. data/lib/under_os/ui/collection/styles.rb +15 -0
  27. data/lib/under_os/ui/div.rb +3 -0
  28. data/lib/under_os/ui/form.rb +60 -0
  29. data/lib/under_os/ui/icon.rb +61 -0
  30. data/lib/under_os/ui/icon/awesome.rb +376 -0
  31. data/lib/under_os/ui/icon/engine.rb +9 -0
  32. data/lib/under_os/ui/image.rb +31 -0
  33. data/lib/under_os/ui/input.rb +140 -0
  34. data/lib/under_os/ui/label.rb +21 -0
  35. data/lib/under_os/ui/locker.rb +42 -0
  36. data/lib/under_os/ui/navbar.rb +123 -0
  37. data/lib/under_os/ui/progress.rb +17 -0
  38. data/lib/under_os/ui/scroll.rb +102 -0
  39. data/lib/under_os/ui/select.rb +95 -0
  40. data/lib/under_os/ui/sidebar.rb +45 -0
  41. data/lib/under_os/ui/slider.rb +37 -0
  42. data/lib/under_os/ui/spinner.rb +23 -0
  43. data/lib/under_os/ui/style.rb +21 -0
  44. data/lib/under_os/ui/style/fonts.rb +56 -0
  45. data/lib/under_os/ui/style/margins.rb +164 -0
  46. data/lib/under_os/ui/style/outlining.rb +170 -0
  47. data/lib/under_os/ui/style/positioning.rb +183 -0
  48. data/lib/under_os/ui/switch.rb +26 -0
  49. data/lib/under_os/ui/textarea.rb +19 -0
  50. data/lib/under_os/ui/utils/animation.rb +101 -0
  51. data/lib/under_os/ui/utils/commons.rb +70 -0
  52. data/lib/under_os/ui/utils/dimensions.rb +37 -0
  53. data/lib/under_os/ui/utils/events.rb +210 -0
  54. data/lib/under_os/ui/utils/manipulation.rb +44 -0
  55. data/lib/under_os/ui/utils/position.rb +21 -0
  56. data/lib/under_os/ui/utils/size.rb +21 -0
  57. data/lib/under_os/ui/utils/styles.rb +89 -0
  58. data/lib/under_os/ui/utils/traversing.rb +44 -0
  59. data/lib/under_os/ui/utils/wrap.rb +77 -0
  60. data/lib/under_os/ui/view.rb +31 -0
  61. data/spec/assets/app.css +13 -0
  62. data/spec/assets/test.css +7 -0
  63. data/spec/assets/test.html +3 -0
  64. data/spec/assets/test.png +0 -0
  65. data/spec/assets/test_page.rb +2 -0
  66. data/spec/under_os/page/builder_spec.rb +128 -0
  67. data/spec/under_os/page/layout_spec.rb +18 -0
  68. data/spec/under_os/page/matcher_spec.rb +260 -0
  69. data/spec/under_os/page/stylesheet_spec.rb +83 -0
  70. data/spec/under_os/page_spec.rb +5 -0
  71. data/spec/under_os/parser/css_spec.rb +77 -0
  72. data/spec/under_os/parser/html_spec.rb +152 -0
  73. data/spec/under_os/parser_spec.rb +16 -0
  74. data/spec/under_os/ui/button_spec.rb +50 -0
  75. data/spec/under_os/ui/collection_spec.rb +19 -0
  76. data/spec/under_os/ui/div_spec.rb +24 -0
  77. data/spec/under_os/ui/form_spec.rb +156 -0
  78. data/spec/under_os/ui/icon_spec.rb +57 -0
  79. data/spec/under_os/ui/image_spec.rb +39 -0
  80. data/spec/under_os/ui/input_spec.rb +109 -0
  81. data/spec/under_os/ui/label_spec.rb +22 -0
  82. data/spec/under_os/ui/locker_spec.rb +31 -0
  83. data/spec/under_os/ui/progress_spec.rb +31 -0
  84. data/spec/under_os/ui/scroll_spec.rb +75 -0
  85. data/spec/under_os/ui/select_spec.rb +135 -0
  86. data/spec/under_os/ui/sidebar_spec.rb +35 -0
  87. data/spec/under_os/ui/slider_spec.rb +69 -0
  88. data/spec/under_os/ui/spinner_spec.rb +57 -0
  89. data/spec/under_os/ui/style/fonts_spec.rb +111 -0
  90. data/spec/under_os/ui/style/margins_spec.rb +106 -0
  91. data/spec/under_os/ui/style/outlining_spec.rb +101 -0
  92. data/spec/under_os/ui/style/positioning_spec.rb +69 -0
  93. data/spec/under_os/ui/style_spec.rb +19 -0
  94. data/spec/under_os/ui/switch_spec.rb +60 -0
  95. data/spec/under_os/ui/textarea_spec.rb +34 -0
  96. data/spec/under_os/ui/utils/commons_spec.rb +81 -0
  97. data/spec/under_os/ui/utils/events_spec.rb +87 -0
  98. data/spec/under_os/ui/utils/manipulation_spec.rb +130 -0
  99. data/spec/under_os/ui/utils/styles_spec.rb +140 -0
  100. data/spec/under_os/ui/utils/traversing_spec.rb +124 -0
  101. data/spec/under_os/ui/utils/wrap_spec.rb +69 -0
  102. data/spec/under_os/ui/view_spec.rb +39 -0
  103. data/under-os-ui.gemspec +23 -0
  104. metadata +216 -0
@@ -0,0 +1,37 @@
1
+ class UnderOs::UI::Slider < UnderOs::UI::Input
2
+ wraps UISlider, tag: 'slider'
3
+
4
+ def initialize(options={})
5
+ super
6
+
7
+ self.min = options[:min] if options[:min]
8
+ self.max = options[:max] if options[:max]
9
+
10
+ @_.continuous = options.delete(:track) || true # track the changes as they go
11
+ @_.addTarget self, action: :handle_change, forControlEvents:UIControlEventValueChanged
12
+ end
13
+
14
+ def value
15
+ @_.value
16
+ end
17
+
18
+ def value=(value)
19
+ @_.value = value.to_f
20
+ end
21
+
22
+ def min
23
+ @_.minimumValue
24
+ end
25
+
26
+ def min=(value)
27
+ @_.minimumValue = value.to_f
28
+ end
29
+
30
+ def max
31
+ @_.maximumValue
32
+ end
33
+
34
+ def max=(value)
35
+ @_.maximumValue = value.to_f
36
+ end
37
+ end
@@ -0,0 +1,23 @@
1
+ class UnderOs::UI::Spinner < UnderOs::UI::View
2
+ wraps UIActivityIndicatorView, tag: :spinner
3
+
4
+ def initialize(options={})
5
+ super
6
+ show
7
+ end
8
+
9
+ def show
10
+ @_.startAnimating
11
+ self
12
+ end
13
+
14
+ def hide
15
+ @_.stopAnimating
16
+ self
17
+ end
18
+
19
+ def hidden
20
+ @_.isAnimating == 0
21
+ end
22
+
23
+ end
@@ -0,0 +1,21 @@
1
+ #
2
+ # The view styles handling wrapper
3
+ #
4
+ # The idea here is to provide a DOM like `style` object,
5
+ # which can take similar to DOM properties and translate
6
+ # them into iOS equivalents
7
+ #
8
+ class UnderOs::UI::Style
9
+ include Fonts
10
+ include Margins
11
+ include Outlining
12
+ include Positioning
13
+
14
+ attr_reader :view
15
+
16
+ def initialize(view, type)
17
+ @view = view
18
+ @type = type
19
+ end
20
+
21
+ end
@@ -0,0 +1,56 @@
1
+ #
2
+ # This module handles all sorts of things related to fonts
3
+ # and text attributes
4
+ #
5
+ module UnderOs::UI
6
+ class Style
7
+ module Fonts
8
+ def fontFamily
9
+ @view.font.familyName
10
+ end
11
+
12
+ def fontFamily=(value)
13
+ @view.font = UIFont.fontWithName(value, size: @view.font.pointSize)
14
+ end
15
+
16
+ def fontSize
17
+ @view.font.pointSize
18
+ end
19
+
20
+ def fontSize=(value)
21
+ @view.font = @view.font.fontWithSize(value)
22
+ @view.sizeToFit if @type == :icon
23
+ end
24
+
25
+ def textAlign
26
+ if @view.is_a?(UIButton)
27
+ BUTTONS_ALIGMENTS_MAP.key(@view.contentHorizontalAlignment)
28
+ elsif @view.respond_to?(:textAlignment)
29
+ TEXTNODES_ALIGMENTS_MAP.key(@view.textAlignment)
30
+ end
31
+ end
32
+
33
+ def textAlign=(value)
34
+ if @view.is_a?(UIButton)
35
+ @view.contentHorizontalAlignment = BUTTONS_ALIGMENTS_MAP[value.to_s] || BUTTONS_ALIGMENTS_MAP['left']
36
+ elsif @view.respond_to?(:textAlignment)
37
+ @view.textAlignment = TEXTNODES_ALIGMENTS_MAP[value.to_s] || BUTTONS_ALIGMENTS_MAP['left']
38
+ end
39
+ end
40
+
41
+ BUTTONS_ALIGMENTS_MAP = {
42
+ 'right' => UIControlContentHorizontalAlignmentRight,
43
+ 'center' => UIControlContentHorizontalAlignmentCenter,
44
+ 'justify' => UIControlContentHorizontalAlignmentFill,
45
+ 'left' => UIControlContentHorizontalAlignmentLeft
46
+ }
47
+
48
+ TEXTNODES_ALIGMENTS_MAP = {
49
+ 'right' => NSTextAlignmentRight,
50
+ 'center' => NSTextAlignmentCenter,
51
+ 'justify' => NSTextAlignmentJustified,
52
+ 'left' => NSTextAlignmentLeft
53
+ }
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,164 @@
1
+ #
2
+ # This module handles styles related to margins and paddings
3
+ #
4
+ module UnderOs::UI
5
+ class Style
6
+ module Margins
7
+ def display
8
+ @display || :block
9
+ end
10
+
11
+ def display=(value)
12
+ @display = %w[none block inline].include?(value.to_s) ? value.to_sym : :block
13
+ @view.hidden = @display == :none
14
+ set_offsets if @display == :inline
15
+ end
16
+
17
+ def margin
18
+ [marginTop, marginRight, marginBottom, marginLeft]
19
+ end
20
+
21
+ def margin=(value)
22
+ @margin_top, @margin_right, @margin_botom, @margin_left = to_4dim_array(value)
23
+ set_offsets
24
+ end
25
+
26
+ def marginTop
27
+ @margin_top || 0
28
+ end
29
+
30
+ def marginTop=(value)
31
+ @margin_top = value
32
+ set_offsets
33
+ end
34
+
35
+ def marginLeft
36
+ @margin_left || 0
37
+ end
38
+
39
+ def marginLeft=(value)
40
+ @margin_left = value
41
+ set_offsets
42
+ end
43
+
44
+ def marginRight
45
+ @margin_right || 0
46
+ end
47
+
48
+ def marginRight=(value)
49
+ @margin_right = value
50
+ set_offsets
51
+ end
52
+
53
+ def marginBottom
54
+ @margin_botom || 0
55
+ end
56
+
57
+ def marginBottom=(value)
58
+ @margin_botom = value
59
+ set_offsets
60
+ end
61
+
62
+ def padding
63
+ [paddingTop, paddingRight, paddingBottom, paddingLeft]
64
+ end
65
+
66
+ def padding=(value)
67
+ @padding_top, @padding_right, @padding_botom, @padding_left = to_4dim_array(value)
68
+ set_offsets
69
+ end
70
+
71
+ def paddingTop
72
+ @padding_top || 0
73
+ end
74
+
75
+ def paddingTop=(value)
76
+ @padding_top = value
77
+ set_paddings
78
+ end
79
+
80
+ def paddingLeft
81
+ @padding_left || 0
82
+ end
83
+
84
+ def paddingLeft=(value)
85
+ @padding_left = value
86
+ set_paddings
87
+ end
88
+
89
+ def paddingRight
90
+ @padding_right || 0
91
+ end
92
+
93
+ def paddingRight=(value)
94
+ @padding_right = value
95
+ set_paddings
96
+ end
97
+
98
+ def paddingBottom
99
+ @padding_botom || 0
100
+ end
101
+
102
+ def paddingBottom=(value)
103
+ @padding_botom = value
104
+ set_paddings
105
+ end
106
+
107
+ private
108
+
109
+ def to_4dim_array(value)
110
+ value = value.gsub('px', '').split.map(&:to_f) if value.is_a?(String)
111
+ value = Array(value)
112
+ case value.size
113
+ when 1 then value * 4
114
+ when 2 then [value[0], value[1], value[0], value[1]]
115
+ else value
116
+ end
117
+ end
118
+
119
+ def set_offsets
120
+ return nil if display != :inline
121
+
122
+ position_x = marginLeft + parent_offset_x
123
+ position_y = marginTop
124
+
125
+ @view.frame = [[position_x, position_y], [
126
+ @view.frame.size.width, @view.frame.size.height
127
+ ]]
128
+ end
129
+
130
+ def set_paddings
131
+ if @view.respond_to?(:contentEdgeInsets)
132
+ @view.contentEdgeInsets = UIEdgeInsetsMake(paddingTop, paddingLeft, paddingBottom, paddingRight)
133
+ end
134
+ end
135
+
136
+ def parent_offset_x
137
+ offset = 0
138
+ parent_frame = parent_view_frame
139
+
140
+ if parent_frame
141
+ offset += parent_frame.origin.x + parent_frame.size.width
142
+
143
+ if wrap = UnderOs::UI::View.wrap_for(@view)
144
+ offset += wrap.style.marginRight
145
+ end
146
+ end
147
+
148
+ offset
149
+ end
150
+
151
+ def parent_view_frame
152
+ parent_view = @view.superview
153
+ parent_frame = nil
154
+
155
+ unless parent_view.subviews[0] === @view
156
+ previous_view = parent_view.subviews[parent_view.subviews.index(@view)-1]
157
+ parent_frame = previous_view && previous_view.frame
158
+ end
159
+
160
+ parent_frame
161
+ end
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,170 @@
1
+ #
2
+ # This module contains things like colors, borders, shadows, etc
3
+ #
4
+ module UnderOs::UI
5
+ class Style
6
+ module Outlining
7
+ def opacity
8
+ @view.alpha
9
+ end
10
+
11
+ def opacity=(value)
12
+ @view.alpha = value
13
+ end
14
+
15
+ def backgroundColor
16
+ @view.backgroundColor
17
+ end
18
+
19
+ def backgroundColor=(color, state=UIControlStateNormal)
20
+ if @view.is_a?(UIButton)
21
+ @view.setBackgroundColor convert_color(color), forState:state
22
+ else
23
+ @view.backgroundColor = convert_color(color)
24
+ end
25
+ end
26
+
27
+ def backgroundImage
28
+ @background_image
29
+ end
30
+
31
+ def backgroundImage=(image)
32
+ image = UIImage.UIImage.imageNamed(image) if image.is_a?(String)
33
+
34
+ if @view.is_a?(UIButton)
35
+ @view.setBackgroundImage(image, forState:UIControlStateNormal)
36
+ else
37
+ @background_image = UnderOs::UI::Image.new(src: image, class: 'uos-background-image')
38
+ @background_image._.frame = [[0, 0], [@view.frame.size.width, @view.frame.size.height]]
39
+ @view.insertSubview(@background_image._, atIndex: 0)
40
+ end
41
+ end
42
+
43
+ alias :background :backgroundColor
44
+ alias :background= :backgroundColor=
45
+
46
+ def color(state=UIControlStateNormal)
47
+ if @view.is_a?(UIButton)
48
+ @view.titleColorForState(state)
49
+ elsif @view.respond_to?(:textColor)
50
+ @view.textColor
51
+ elsif @view.respond_to?(:color)
52
+ @view.color
53
+ end
54
+ end
55
+
56
+ def color=(color, state=UIControlStateNormal)
57
+ if @view.is_a?(UIButton)
58
+ @view.setTitleColor convert_color(color), forState:state
59
+ elsif @view.respond_to?(:textColor)
60
+ @view.textColor = convert_color(color)
61
+ elsif @view.respond_to?(:color)
62
+ @view.color = convert_color(color)
63
+ end
64
+ end
65
+
66
+ def borderRadius
67
+ @view.layer.cornerRadius
68
+ end
69
+
70
+ def borderRadius=(radius)
71
+ @view.clipsToBounds = true
72
+ @view.layer.cornerRadius = radius
73
+ end
74
+
75
+ def borderColor
76
+ @view.layer.borderColor
77
+ end
78
+
79
+ def borderColor=(color)
80
+ @view.layer.borderColor = convert_color(color).CGColor
81
+ end
82
+
83
+ def borderWidth
84
+ @view.layer.borderWidth
85
+ end
86
+
87
+ def borderWidth=(width)
88
+ @view.layer.borderWidth = width
89
+ end
90
+
91
+ def boxShadow
92
+ get_layer_shadow @view.layer
93
+ end
94
+
95
+ def boxShadow=(value)
96
+ set_layer_shadow @view.layer, value
97
+ end
98
+
99
+ def textShadow
100
+ get_layer_shadow text_layer
101
+ end
102
+
103
+ def textShadow=(value)
104
+ set_layer_shadow text_layer, value
105
+ end
106
+
107
+ private
108
+
109
+ def convert_color(color)
110
+ UnderOs::Color.new(color).ui
111
+ end
112
+
113
+ def text_layer
114
+ @view.is_a?(UIButton) ? @view.titleLabel : @view.layer
115
+ end
116
+
117
+ def get_layer_shadow(layer)
118
+ [
119
+ layer.shadowOffset.width,
120
+ layer.shadowOffset.height,
121
+ layer.shadowRadius,
122
+ layer.shadowOpacity,
123
+ UnderOs::Color.new(layer.shadowColor).to_hex
124
+ ].compact.join(" ")
125
+ end
126
+
127
+ def set_layer_shadow(layer, value)
128
+ x, y, radius, opacity, color = parse_shadow_params(value)
129
+
130
+ layer.shadowOffset = CGSizeMake(x, y) if x && y
131
+ layer.shadowColor = color.CGColor if color
132
+ layer.shadowRadius = radius if radius
133
+ layer.shadowOpacity = opacity if opacity
134
+ layer.shadowPath = UIBezierPath.bezierPathWithRect(@view.layer.bounds).CGPath
135
+ end
136
+
137
+ def parse_shadow_params(string)
138
+ x, y, radius, opacity, color = string.strip.split
139
+
140
+ x = x.gsub /px$/, ''
141
+ y = y.gsub /px$/, ''
142
+ radius = radius.gsub /px$/, '' if radius
143
+ opacity = opacity.gsub /px$/, '' if opacity
144
+
145
+ if ! color
146
+ if opacity
147
+ unless opacity =~ /^[\d\.]+$/
148
+ color = opacity
149
+ opacity = nil
150
+ end
151
+ elsif radius
152
+ unless radius =~ /^[\d\.]+$/
153
+ color = radius
154
+ radius = nil
155
+ end
156
+ end
157
+ end
158
+
159
+ x = x.to_f if x
160
+ y = y.to_f if y
161
+
162
+ radius = radius.to_f if radius
163
+ opacity = opacity.to_f if opacity
164
+ color = convert_color(color) if color
165
+
166
+ [x, y, radius, opacity, color]
167
+ end
168
+ end
169
+ end
170
+ end