shoes-dsl 4.0.0.pre2
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 +7 -0
- data/CHANGELOG +84 -0
- data/Gemfile +24 -0
- data/Guardfile +11 -0
- data/LICENSE +31 -0
- data/README.md +201 -0
- data/ext/install/Rakefile +29 -0
- data/ext/install/shoes.bat +9 -0
- data/fonts/Coolvetica.ttf +0 -0
- data/fonts/Lacuna.ttf +0 -0
- data/lib/shoes/animation.rb +56 -0
- data/lib/shoes/app.rb +131 -0
- data/lib/shoes/arc.rb +25 -0
- data/lib/shoes/background.rb +24 -0
- data/lib/shoes/border.rb +24 -0
- data/lib/shoes/builtin_methods.rb +77 -0
- data/lib/shoes/button.rb +30 -0
- data/lib/shoes/check_button.rb +44 -0
- data/lib/shoes/color.rb +385 -0
- data/lib/shoes/common/background_element.rb +9 -0
- data/lib/shoes/common/changeable.rb +34 -0
- data/lib/shoes/common/clickable.rb +24 -0
- data/lib/shoes/common/inspect.rb +14 -0
- data/lib/shoes/common/positioning.rb +30 -0
- data/lib/shoes/common/registration.rb +33 -0
- data/lib/shoes/common/remove.rb +10 -0
- data/lib/shoes/common/state.rb +18 -0
- data/lib/shoes/common/style.rb +152 -0
- data/lib/shoes/common/style_normalizer.rb +16 -0
- data/lib/shoes/common/ui_element.rb +11 -0
- data/lib/shoes/common/visibility.rb +40 -0
- data/lib/shoes/configuration.rb +96 -0
- data/lib/shoes/dialog.rb +27 -0
- data/lib/shoes/dimension.rb +239 -0
- data/lib/shoes/dimensions.rb +209 -0
- data/lib/shoes/download.rb +121 -0
- data/lib/shoes/dsl.rb +591 -0
- data/lib/shoes/font.rb +49 -0
- data/lib/shoes/gradient.rb +31 -0
- data/lib/shoes/image.rb +29 -0
- data/lib/shoes/image_pattern.rb +12 -0
- data/lib/shoes/input_box.rb +60 -0
- data/lib/shoes/internal_app.rb +219 -0
- data/lib/shoes/key_event.rb +17 -0
- data/lib/shoes/line.rb +87 -0
- data/lib/shoes/link.rb +59 -0
- data/lib/shoes/link_hover.rb +5 -0
- data/lib/shoes/list_box.rb +50 -0
- data/lib/shoes/logger.rb +66 -0
- data/lib/shoes/logger/ruby.rb +18 -0
- data/lib/shoes/mock.rb +31 -0
- data/lib/shoes/mock/animation.rb +8 -0
- data/lib/shoes/mock/app.rb +47 -0
- data/lib/shoes/mock/arc.rb +9 -0
- data/lib/shoes/mock/background.rb +10 -0
- data/lib/shoes/mock/border.rb +7 -0
- data/lib/shoes/mock/button.rb +10 -0
- data/lib/shoes/mock/check.rb +25 -0
- data/lib/shoes/mock/clickable.rb +8 -0
- data/lib/shoes/mock/common_methods.rb +12 -0
- data/lib/shoes/mock/dialog.rb +13 -0
- data/lib/shoes/mock/download.rb +18 -0
- data/lib/shoes/mock/font.rb +17 -0
- data/lib/shoes/mock/image.rb +13 -0
- data/lib/shoes/mock/image_pattern.rb +9 -0
- data/lib/shoes/mock/input_box.rb +30 -0
- data/lib/shoes/mock/keypress.rb +10 -0
- data/lib/shoes/mock/keyrelease.rb +10 -0
- data/lib/shoes/mock/line.rb +14 -0
- data/lib/shoes/mock/link.rb +12 -0
- data/lib/shoes/mock/list_box.rb +19 -0
- data/lib/shoes/mock/oval.rb +12 -0
- data/lib/shoes/mock/progress.rb +10 -0
- data/lib/shoes/mock/radio.rb +27 -0
- data/lib/shoes/mock/rect.rb +14 -0
- data/lib/shoes/mock/shape.rb +20 -0
- data/lib/shoes/mock/slot.rb +16 -0
- data/lib/shoes/mock/sound.rb +8 -0
- data/lib/shoes/mock/star.rb +14 -0
- data/lib/shoes/mock/text_block.rb +36 -0
- data/lib/shoes/mock/timer.rb +8 -0
- data/lib/shoes/not_implemented_error.rb +4 -0
- data/lib/shoes/oval.rb +20 -0
- data/lib/shoes/point.rb +54 -0
- data/lib/shoes/progress.rb +25 -0
- data/lib/shoes/radio.rb +16 -0
- data/lib/shoes/rect.rb +21 -0
- data/lib/shoes/renamed_delegate.rb +15 -0
- data/lib/shoes/shape.rb +158 -0
- data/lib/shoes/slot.rb +271 -0
- data/lib/shoes/slot_contents.rb +50 -0
- data/lib/shoes/sound.rb +18 -0
- data/lib/shoes/span.rb +16 -0
- data/lib/shoes/star.rb +45 -0
- data/lib/shoes/text.rb +24 -0
- data/lib/shoes/text_block.rb +143 -0
- data/lib/shoes/text_block_dimensions.rb +52 -0
- data/lib/shoes/timer.rb +12 -0
- data/lib/shoes/url.rb +44 -0
- data/lib/shoes/version.rb +3 -0
- data/lib/shoes/widget.rb +69 -0
- data/manifests/common.rb +34 -0
- data/manifests/shoes-dsl.rb +34 -0
- data/shoes-dsl.gemspec +19 -0
- data/spec/code_coverage.rb +14 -0
- data/spec/shoes/animation_spec.rb +65 -0
- data/spec/shoes/app_spec.rb +484 -0
- data/spec/shoes/arc_spec.rb +51 -0
- data/spec/shoes/background_spec.rb +53 -0
- data/spec/shoes/border_spec.rb +47 -0
- data/spec/shoes/builtin_methods_spec.rb +110 -0
- data/spec/shoes/button_spec.rb +44 -0
- data/spec/shoes/check_spec.rb +35 -0
- data/spec/shoes/cli_spec.rb +15 -0
- data/spec/shoes/color_spec.rb +408 -0
- data/spec/shoes/common/inspect_spec.rb +26 -0
- data/spec/shoes/common/remove_spec.rb +38 -0
- data/spec/shoes/common/style_normalizer_spec.rb +28 -0
- data/spec/shoes/common/style_spec.rb +147 -0
- data/spec/shoes/configuration_spec.rb +36 -0
- data/spec/shoes/constants_spec.rb +38 -0
- data/spec/shoes/dialog_spec.rb +163 -0
- data/spec/shoes/dimension_spec.rb +407 -0
- data/spec/shoes/dimensions_spec.rb +837 -0
- data/spec/shoes/download_spec.rb +142 -0
- data/spec/shoes/flow_spec.rb +133 -0
- data/spec/shoes/font_spec.rb +37 -0
- data/spec/shoes/framework_learning_spec.rb +30 -0
- data/spec/shoes/gradient_spec.rb +32 -0
- data/spec/shoes/helpers/fake_element.rb +17 -0
- data/spec/shoes/helpers/inspect_helpers.rb +5 -0
- data/spec/shoes/helpers/sample17_helper.rb +66 -0
- data/spec/shoes/image_spec.rb +49 -0
- data/spec/shoes/images/shoe.jpg +0 -0
- data/spec/shoes/input_box_spec.rb +80 -0
- data/spec/shoes/integration_spec.rb +20 -0
- data/spec/shoes/internal_app_spec.rb +141 -0
- data/spec/shoes/keypress_spec.rb +11 -0
- data/spec/shoes/keyrelease_spec.rb +12 -0
- data/spec/shoes/line_spec.rb +49 -0
- data/spec/shoes/link_spec.rb +105 -0
- data/spec/shoes/list_box_spec.rb +74 -0
- data/spec/shoes/logger/ruby_spec.rb +8 -0
- data/spec/shoes/logger_spec.rb +45 -0
- data/spec/shoes/oval_spec.rb +24 -0
- data/spec/shoes/point_spec.rb +71 -0
- data/spec/shoes/progress_spec.rb +54 -0
- data/spec/shoes/radio_spec.rb +32 -0
- data/spec/shoes/rect_spec.rb +39 -0
- data/spec/shoes/renamed_delegate_spec.rb +70 -0
- data/spec/shoes/shape_spec.rb +95 -0
- data/spec/shoes/shared_examples/button.rb +6 -0
- data/spec/shoes/shared_examples/changeable.rb +26 -0
- data/spec/shoes/shared_examples/clickable.rb +5 -0
- data/spec/shoes/shared_examples/common_methods.rb +35 -0
- data/spec/shoes/shared_examples/dimensions.rb +32 -0
- data/spec/shoes/shared_examples/dsl.rb +44 -0
- data/spec/shoes/shared_examples/dsl/animate.rb +29 -0
- data/spec/shoes/shared_examples/dsl/arc.rb +45 -0
- data/spec/shoes/shared_examples/dsl/background.rb +26 -0
- data/spec/shoes/shared_examples/dsl/border.rb +10 -0
- data/spec/shoes/shared_examples/dsl/button.rb +5 -0
- data/spec/shoes/shared_examples/dsl/cap.rb +6 -0
- data/spec/shoes/shared_examples/dsl/check.rb +11 -0
- data/spec/shoes/shared_examples/dsl/edit_box.rb +8 -0
- data/spec/shoes/shared_examples/dsl/edit_line.rb +8 -0
- data/spec/shoes/shared_examples/dsl/editable_element.rb +29 -0
- data/spec/shoes/shared_examples/dsl/fill.rb +27 -0
- data/spec/shoes/shared_examples/dsl/flow.rb +15 -0
- data/spec/shoes/shared_examples/dsl/gradient.rb +62 -0
- data/spec/shoes/shared_examples/dsl/image.rb +21 -0
- data/spec/shoes/shared_examples/dsl/line.rb +9 -0
- data/spec/shoes/shared_examples/dsl/nofill.rb +6 -0
- data/spec/shoes/shared_examples/dsl/nostroke.rb +6 -0
- data/spec/shoes/shared_examples/dsl/oval.rb +88 -0
- data/spec/shoes/shared_examples/dsl/pattern.rb +34 -0
- data/spec/shoes/shared_examples/dsl/progress.rb +7 -0
- data/spec/shoes/shared_examples/dsl/rect.rb +92 -0
- data/spec/shoes/shared_examples/dsl/rgb.rb +26 -0
- data/spec/shoes/shared_examples/dsl/shape.rb +21 -0
- data/spec/shoes/shared_examples/dsl/star.rb +48 -0
- data/spec/shoes/shared_examples/dsl/stroke.rb +30 -0
- data/spec/shoes/shared_examples/dsl/strokewidth.rb +19 -0
- data/spec/shoes/shared_examples/dsl/style.rb +32 -0
- data/spec/shoes/shared_examples/dsl/text_elements.rb +81 -0
- data/spec/shoes/shared_examples/dsl/video.rb +5 -0
- data/spec/shoes/shared_examples/dsl_app_context.rb +8 -0
- data/spec/shoes/shared_examples/hover_leave.rb +11 -0
- data/spec/shoes/shared_examples/parent.rb +6 -0
- data/spec/shoes/shared_examples/scroll.rb +41 -0
- data/spec/shoes/shared_examples/shared_element_method.rb +60 -0
- data/spec/shoes/shared_examples/slot.rb +331 -0
- data/spec/shoes/shared_examples/state.rb +19 -0
- data/spec/shoes/shared_examples/style.rb +82 -0
- data/spec/shoes/slot_spec.rb +130 -0
- data/spec/shoes/sound_spec.rb +15 -0
- data/spec/shoes/span_spec.rb +112 -0
- data/spec/shoes/spec_helper.rb +24 -0
- data/spec/shoes/stack_spec.rb +79 -0
- data/spec/shoes/star_spec.rb +31 -0
- data/spec/shoes/text_block_dimensions_spec.rb +75 -0
- data/spec/shoes/text_block_spec.rb +270 -0
- data/spec/shoes/url_spec.rb +68 -0
- data/spec/shoes/widget_spec.rb +70 -0
- data/spec/shoes_spec.rb +44 -0
- data/spec/spec_helper.rb +18 -0
- data/static/Shoes.icns +0 -0
- data/static/shoes-icon.png +0 -0
- metadata +354 -0
data/lib/shoes/sound.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
class Shoes
|
2
|
+
class Sound
|
3
|
+
include Common::Inspect
|
4
|
+
|
5
|
+
def initialize(parent, filepath, opts={}, &blk)
|
6
|
+
@parent = parent
|
7
|
+
@filepath = filepath
|
8
|
+
|
9
|
+
@gui = Shoes.configuration.backend_for(self)
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :gui, :filepath, :parent
|
13
|
+
|
14
|
+
def play
|
15
|
+
@gui.play
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/shoes/span.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
class Shoes
|
2
|
+
class Span < Text
|
3
|
+
def initialize(texts, styles={})
|
4
|
+
@style = styles
|
5
|
+
super texts, styles.delete(:color)
|
6
|
+
end
|
7
|
+
|
8
|
+
def style
|
9
|
+
if @parent_text && @parent_text.respond_to?(:style)
|
10
|
+
@parent_text.style.merge(@style)
|
11
|
+
else
|
12
|
+
@style
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/shoes/star.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
class Shoes
|
2
|
+
class Star
|
3
|
+
include Common::UIElement
|
4
|
+
include Common::Style
|
5
|
+
include Common::Clickable
|
6
|
+
|
7
|
+
attr_reader :app, :parent, :dimensions, :gui
|
8
|
+
style_with :angle, :art_styles,:common_styles, :dimensions, :inner, :outer, :points
|
9
|
+
STYLES = {angle: 0}
|
10
|
+
|
11
|
+
def initialize(app, parent, left, top, points, outer, inner, styles = {}, blk = nil)
|
12
|
+
@app = app
|
13
|
+
@parent = parent
|
14
|
+
|
15
|
+
# Careful not to turn Fixnum to Float, lest Dimensions make you relative!
|
16
|
+
width = outer*2
|
17
|
+
|
18
|
+
# Ignore calculated height on Dimensions--will force to match width
|
19
|
+
@dimensions = AbsoluteDimensions.new left, top, width, 0
|
20
|
+
@dimensions.height = @dimensions.width
|
21
|
+
|
22
|
+
# Calculate the inner dimensions, which might be relative too
|
23
|
+
inner_dimensions = AbsoluteDimensions.new 0, 0, inner*2, 0
|
24
|
+
|
25
|
+
# Get actual outer/inner from the dimension to handle relative values
|
26
|
+
outer = @dimensions.width / 2
|
27
|
+
inner = inner_dimensions.width / 2
|
28
|
+
|
29
|
+
# Now set style using adjust outer and inner
|
30
|
+
style_init(styles, inner: inner, outer: outer, points: points)
|
31
|
+
|
32
|
+
@parent.add_child self
|
33
|
+
@gui = Shoes.backend_for self
|
34
|
+
|
35
|
+
register_click blk
|
36
|
+
end
|
37
|
+
|
38
|
+
def in_bounds?(x, y)
|
39
|
+
dx = width / 2.0
|
40
|
+
dy = height / 2.0
|
41
|
+
left - dx <= x and x <= right - dx and top - dy <= y and y <= bottom - dy
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
data/lib/shoes/text.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
class Shoes
|
2
|
+
class Text
|
3
|
+
include Common::Inspect
|
4
|
+
|
5
|
+
attr_reader :to_s, :texts, :color
|
6
|
+
attr_accessor :parent_text, :text_block
|
7
|
+
|
8
|
+
def initialize(texts, color=nil)
|
9
|
+
@texts = texts
|
10
|
+
@color = color
|
11
|
+
@to_s = @texts.map(&:to_s).join
|
12
|
+
@parent_text = nil
|
13
|
+
@text_block = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def app
|
17
|
+
@parent_text.app
|
18
|
+
end
|
19
|
+
|
20
|
+
def inspect
|
21
|
+
super.insert(-2, %Q| "#{to_s}"|)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
class Shoes
|
2
|
+
CENTER = "center".freeze
|
3
|
+
DEFAULT_TEXTBLOCK_FONT = "Arial"
|
4
|
+
|
5
|
+
class TextBlock
|
6
|
+
include Common::UIElement
|
7
|
+
include Common::Style
|
8
|
+
include Common::Clickable
|
9
|
+
include TextBlockDimensionsDelegations
|
10
|
+
|
11
|
+
attr_reader :gui, :parent, :text, :contents, :app, :text_styles, :dimensions
|
12
|
+
attr_accessor :cursor, :textcursor
|
13
|
+
style_with :common_styles, :dimensions, :text_block_styles
|
14
|
+
STYLES = {font: "Arial"} # used in TextBlock specs only
|
15
|
+
|
16
|
+
def initialize(app, parent, text, styles = {})
|
17
|
+
@parent = parent
|
18
|
+
@app = app
|
19
|
+
style_init styles
|
20
|
+
@dimensions = TextBlockDimensions.new parent, @style
|
21
|
+
handle_styles @style
|
22
|
+
@gui = Shoes.backend_for self
|
23
|
+
@parent.add_child self
|
24
|
+
|
25
|
+
# Important to use accessor and do this after the backend exists!
|
26
|
+
self.text = Array(text)
|
27
|
+
|
28
|
+
register_click
|
29
|
+
end
|
30
|
+
|
31
|
+
def in_bounds?(*args)
|
32
|
+
@gui.in_bounds?(*args)
|
33
|
+
end
|
34
|
+
|
35
|
+
def text=(*texts)
|
36
|
+
replace *texts[0]
|
37
|
+
end
|
38
|
+
|
39
|
+
def replace(*texts)
|
40
|
+
# Order here matters as well--backend#replace shouldn't rely on DSL state
|
41
|
+
# but the texts that it's passed if it needs information at this point.
|
42
|
+
@gui.replace *texts
|
43
|
+
|
44
|
+
@text = texts.map(&:to_s).join
|
45
|
+
@contents = texts
|
46
|
+
@text_styles = gather_text_styles(self, texts)
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_s
|
50
|
+
self.text
|
51
|
+
end
|
52
|
+
|
53
|
+
def contents_alignment(current_position=nil)
|
54
|
+
@gui.contents_alignment(current_position)
|
55
|
+
end
|
56
|
+
|
57
|
+
def adjust_current_position(current_position)
|
58
|
+
@gui.adjust_current_position(current_position)
|
59
|
+
end
|
60
|
+
|
61
|
+
def textcursor(line_height = 0)
|
62
|
+
@textcursor ||= app.textcursor(line_height)
|
63
|
+
end
|
64
|
+
|
65
|
+
def has_textcursor?
|
66
|
+
@textcursor
|
67
|
+
end
|
68
|
+
|
69
|
+
def centered?
|
70
|
+
style[:align] == CENTER
|
71
|
+
end
|
72
|
+
|
73
|
+
def links
|
74
|
+
return [] unless @contents
|
75
|
+
|
76
|
+
@contents.select do |element|
|
77
|
+
element.is_a?(Shoes::Link)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def gather_text_styles(parent_text, texts, styles={}, start_point=0)
|
84
|
+
texts.each do |text|
|
85
|
+
if text.is_a? Shoes::Text
|
86
|
+
text.text_block = self
|
87
|
+
text.parent_text = parent_text
|
88
|
+
end_point = start_point + text.to_s.length - 1
|
89
|
+
|
90
|
+
# If our endpoint is before our start, it's an empty string. We treat
|
91
|
+
# those specially with the (0...0) range that has an empty count.
|
92
|
+
if end_point < start_point
|
93
|
+
range = (0...0)
|
94
|
+
else
|
95
|
+
range = start_point..end_point
|
96
|
+
end
|
97
|
+
|
98
|
+
styles[range] ||= []
|
99
|
+
styles[range] << text
|
100
|
+
gather_text_styles(text, text.texts, styles, start_point)
|
101
|
+
end
|
102
|
+
start_point += text.to_s.length
|
103
|
+
end
|
104
|
+
styles
|
105
|
+
end
|
106
|
+
|
107
|
+
def handle_styles(style)
|
108
|
+
parse_font_style style[:font] if style[:font] #if is needed for the specs
|
109
|
+
end
|
110
|
+
|
111
|
+
def parse_font_style(type)
|
112
|
+
size_regex = /(\d+)(\s*px)?/
|
113
|
+
style_regex = /none|bold|normal|oblique|italic/i # TODO: add more
|
114
|
+
|
115
|
+
font_family = type.gsub(style_regex,'').gsub(size_regex,'').
|
116
|
+
split(',').map { |x| x.strip.gsub(/["]/,'') }
|
117
|
+
|
118
|
+
@style[:font] = font_family.first unless (font_family.size == 1 and
|
119
|
+
font_family[0] == "") or font_family.size == 0
|
120
|
+
|
121
|
+
fsize = size_regex.match(type)
|
122
|
+
@style[:size] = fsize[1].to_i unless fsize.nil?
|
123
|
+
|
124
|
+
# TODO: Style options
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
{
|
129
|
+
"Banner" => { size: 48 },
|
130
|
+
"Title" => { size: 34 },
|
131
|
+
"Subtitle" => { size: 26 },
|
132
|
+
"Tagline" => { size: 18 },
|
133
|
+
"Caption" => { size: 14 },
|
134
|
+
"Para" => { size: 12 },
|
135
|
+
"Inscription" => { size: 10 }
|
136
|
+
}.each do |name, styles|
|
137
|
+
clazz = Class.new(TextBlock) do
|
138
|
+
self.const_set("STYLES", { font: "Arial", fill: nil }.merge(styles))
|
139
|
+
end
|
140
|
+
Shoes.const_set(name, clazz)
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
class Shoes
|
2
|
+
# We take over a bunch of the absolute_* measurements since the jagged
|
3
|
+
# shape of a flowed TextBlock doesn't follow the usual rules for dimensions
|
4
|
+
# when we get to positioning (which is the main use of these values).
|
5
|
+
class TextBlockDimensions < Dimensions
|
6
|
+
attr_writer :absolute_right, :absolute_bottom,
|
7
|
+
:calculated_width, :calculated_height
|
8
|
+
|
9
|
+
def absolute_right
|
10
|
+
@absolute_right || super
|
11
|
+
end
|
12
|
+
|
13
|
+
def absolute_bottom
|
14
|
+
@absolute_bottom || super
|
15
|
+
end
|
16
|
+
|
17
|
+
# It might seem weird these reverse from above, but if explicit sizes get
|
18
|
+
# reported verbatim, while boundaries are set by text fitting.
|
19
|
+
def width
|
20
|
+
super || @calculated_width
|
21
|
+
end
|
22
|
+
|
23
|
+
def height
|
24
|
+
super || @calculated_height
|
25
|
+
end
|
26
|
+
|
27
|
+
# Since we flow, try to fit in almost any space
|
28
|
+
def fitting_width
|
29
|
+
10
|
30
|
+
end
|
31
|
+
|
32
|
+
# This is the width the text block initially wants to try and fit into.
|
33
|
+
def desired_width(containing=containing_width)
|
34
|
+
parent.absolute_left + containing - self.absolute_left
|
35
|
+
end
|
36
|
+
|
37
|
+
# If an explicit width's set, use that when asking how much space we need.
|
38
|
+
# If not, we look to the parent.
|
39
|
+
def containing_width
|
40
|
+
element_width || parent.element_width
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
module TextBlockDimensionsDelegations
|
45
|
+
extend Forwardable
|
46
|
+
|
47
|
+
DELEGATED_METHODS = TextBlockDimensions.public_instance_methods(false)
|
48
|
+
|
49
|
+
def_delegators :dimensions, *DELEGATED_METHODS
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
data/lib/shoes/timer.rb
ADDED
data/lib/shoes/url.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
class Shoes
|
2
|
+
|
3
|
+
# Backwards compatibility, kind of likely to be removed
|
4
|
+
def self.inherited(base_class)
|
5
|
+
base_class.send :include, URL #include is private, therefore send
|
6
|
+
end
|
7
|
+
|
8
|
+
module URL
|
9
|
+
attr_accessor :app
|
10
|
+
|
11
|
+
Shoes::App.subscribe_to_dsl_methods self
|
12
|
+
|
13
|
+
def self.included(base_class)
|
14
|
+
base_class.extend URLDefiner
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.urls
|
18
|
+
@urls ||= {}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module URLDefiner
|
23
|
+
def url(page, method)
|
24
|
+
page = convert_page_to_regex(page)
|
25
|
+
url_class = self
|
26
|
+
|
27
|
+
Shoes::URL.urls[page] = proc do |app, arg|
|
28
|
+
new_url_instance = url_class.new
|
29
|
+
new_url_instance.app = app
|
30
|
+
|
31
|
+
if arg
|
32
|
+
new_url_instance.send(method, arg)
|
33
|
+
else
|
34
|
+
new_url_instance.send method
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def convert_page_to_regex(page)
|
41
|
+
/^#{page}$/
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/shoes/widget.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
class Shoes
|
2
|
+
# This is the superclass for creating custom Shoes widgets.
|
3
|
+
#
|
4
|
+
# To use, inherit from {Shoes::Widget}. You get a few magical effects:
|
5
|
+
#
|
6
|
+
# * When you inherit from {Shoes::Widget}, you get a method in your Apps to
|
7
|
+
# create your widgets. The method is lower- and snake-cased. It returns
|
8
|
+
# an instance of your widget class.
|
9
|
+
# * Your widgets delegate missing methods to their app object. This
|
10
|
+
# allows you to use the Shoes DSL within your widgets.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# class SayHello < Shoes::Widget
|
14
|
+
# def initialize word
|
15
|
+
# para "Hello #{word}", stroke: green, size: 80
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# Shoes.app do
|
20
|
+
# say_hello 'Shoes'
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
class Widget
|
24
|
+
include Common::Inspect
|
25
|
+
|
26
|
+
Shoes::App.subscribe_to_dsl_methods self
|
27
|
+
|
28
|
+
attr_accessor :parent
|
29
|
+
attr_writer :app
|
30
|
+
|
31
|
+
class << self
|
32
|
+
attr_accessor :app
|
33
|
+
end
|
34
|
+
|
35
|
+
# lookup a bit more complicated as during initialize we do
|
36
|
+
# not have @app yet...
|
37
|
+
def app
|
38
|
+
@app || self.class.app
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.inherited(klass, &blk)
|
42
|
+
dsl_method = dsl_method_name(klass)
|
43
|
+
Shoes::App.new_dsl_method(dsl_method) do |*args, &blk|
|
44
|
+
# we set app 2 times because widgets execute most of their code
|
45
|
+
# straight in initialize. I dunno if there is a good way of setting
|
46
|
+
# an @app instance variable before initialize is executed. We could
|
47
|
+
# hand it over in #initialize but that would break the interface
|
48
|
+
# and people would have to set it themselves or make sure to call
|
49
|
+
# super so for not it's like this.
|
50
|
+
# Setting the ref on the instance is important as we might have
|
51
|
+
# instances of the same widget in different Shoes::Apps so each one
|
52
|
+
# needs to save the reference to the one it was started with
|
53
|
+
klass.app = self
|
54
|
+
widget_instance = klass.new(*args, &blk)
|
55
|
+
widget_instance.app = self
|
56
|
+
widget_instance.parent = @__app__.current_slot
|
57
|
+
widget_instance
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
private
|
63
|
+
def self.dsl_method_name(klass)
|
64
|
+
klass.to_s[/(^|::)(\w+)$/, 2].
|
65
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
66
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').downcase
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/manifests/common.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rake/file_list'
|
2
|
+
|
3
|
+
module ShoesManifestReport
|
4
|
+
def report
|
5
|
+
puts "Manifest of #{gem_name} gem"
|
6
|
+
puts
|
7
|
+
puts "files"
|
8
|
+
puts "-----"
|
9
|
+
puts files.sort.join("\n")
|
10
|
+
puts
|
11
|
+
puts "test_files"
|
12
|
+
puts "----------"
|
13
|
+
puts test_files.sort.join("\n")
|
14
|
+
puts
|
15
|
+
puts "#{files.length} files, #{test_files.length} test_files"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class ShoesCommonManifest
|
20
|
+
def self.files
|
21
|
+
Rake::FileList[%w(
|
22
|
+
CHANGELOG
|
23
|
+
Gemfile
|
24
|
+
Guardfile
|
25
|
+
LICENSE
|
26
|
+
README.md
|
27
|
+
manifests/common.rb
|
28
|
+
)]
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.test_files
|
32
|
+
[]
|
33
|
+
end
|
34
|
+
end
|