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
@@ -0,0 +1,34 @@
|
|
1
|
+
class Shoes
|
2
|
+
module Common
|
3
|
+
# Changeable elements are elements that receive `change' events.
|
4
|
+
# These are ListBox, EditBox and EditLine. To have your code respond
|
5
|
+
# to these events, either pass a block in when creating the element,
|
6
|
+
# or call #change on the element with a block.
|
7
|
+
module Changeable
|
8
|
+
# Add an extra change event listener block
|
9
|
+
#
|
10
|
+
# @yield The block to execute on a change event
|
11
|
+
def change(&blk)
|
12
|
+
add_change_listener(blk)
|
13
|
+
end
|
14
|
+
|
15
|
+
# The GUI backend needs to call this when an actual change happens in
|
16
|
+
# the backend.
|
17
|
+
def call_change_listeners
|
18
|
+
change_listeners.each do |listener|
|
19
|
+
listener.call(self)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def change_listeners
|
26
|
+
@change_listeners ||= []
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_change_listener(callable)
|
30
|
+
change_listeners << callable
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Shoes
|
2
|
+
module Common
|
3
|
+
module Clickable
|
4
|
+
attr_accessor :pass_coordinates
|
5
|
+
|
6
|
+
def click(&blk)
|
7
|
+
@gui.click blk
|
8
|
+
end
|
9
|
+
|
10
|
+
def release(&blk)
|
11
|
+
@gui.release blk
|
12
|
+
end
|
13
|
+
|
14
|
+
def register_click(blk = nil)
|
15
|
+
click(&@style[:click]) if @style[:click]
|
16
|
+
click(&blk) if blk
|
17
|
+
end
|
18
|
+
|
19
|
+
def pass_coordinates?
|
20
|
+
@pass_coordinates
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Shoes
|
2
|
+
module Common
|
3
|
+
module Inspect
|
4
|
+
def to_s
|
5
|
+
"(#{self.class.name})"
|
6
|
+
end
|
7
|
+
|
8
|
+
# Object hex representation from https://github.com/michaeldv/awesome_print
|
9
|
+
def inspect
|
10
|
+
"(#{self.class.name}:#{"0x%08x" % (self.object_id * 2)})"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Shoes
|
2
|
+
module Common
|
3
|
+
module Positioning
|
4
|
+
# Moves an element to a specific pixel position. The element is still in the slot,
|
5
|
+
# but will no longer be stacked or flowed with the other stuff in the slot.
|
6
|
+
def move(left, top)
|
7
|
+
self.left = left
|
8
|
+
self.top = top
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
# NOT part of the public interface e.g. no Shoes APP should use this
|
13
|
+
# however we need it from the Slot code to position elements
|
14
|
+
def _position left, top
|
15
|
+
self.absolute_left = left
|
16
|
+
self.absolute_top = top
|
17
|
+
gui.update_position if gui && gui.respond_to?(:update_position)
|
18
|
+
end
|
19
|
+
|
20
|
+
# displace(left: a number, top: a number) » self
|
21
|
+
# Displacing an element moves it. But without changing the layout around it.
|
22
|
+
def displace(left, top)
|
23
|
+
self.displace_left = left
|
24
|
+
self.displace_top = top
|
25
|
+
gui.update_position
|
26
|
+
self
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class Shoes
|
2
|
+
module Common
|
3
|
+
module Registration
|
4
|
+
def apps
|
5
|
+
@apps ||= []
|
6
|
+
@apps.dup
|
7
|
+
end
|
8
|
+
|
9
|
+
def register(app)
|
10
|
+
register_main_app app
|
11
|
+
apps && @apps << app
|
12
|
+
end
|
13
|
+
|
14
|
+
def unregister(app)
|
15
|
+
apps && @apps.delete(app)
|
16
|
+
end
|
17
|
+
|
18
|
+
def unregister_all
|
19
|
+
@main_app = nil
|
20
|
+
@apps = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def main_app
|
24
|
+
@main_app
|
25
|
+
end
|
26
|
+
|
27
|
+
# Registers the first app as the main app
|
28
|
+
def register_main_app(app)
|
29
|
+
@main_app ||= app
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
class Shoes
|
2
|
+
module Common
|
3
|
+
# Style methods.
|
4
|
+
module Style
|
5
|
+
|
6
|
+
DEFAULT_STYLES = {
|
7
|
+
fill: Shoes::COLORS[:black],
|
8
|
+
rotate: 0,
|
9
|
+
stroke: Shoes::COLORS[:black],
|
10
|
+
strokewidth: 1
|
11
|
+
}
|
12
|
+
|
13
|
+
STYLE_GROUPS = {
|
14
|
+
art_styles: [:cap, :click, :fill, :rotate, :stroke, :strokewidth, :transform, :translate],
|
15
|
+
common_styles: [:displace_left, :displace_top, :hidden],
|
16
|
+
dimensions: [:bottom, :height, :left, :margin,
|
17
|
+
:margin_bottom, :margin_left, :margin_right,
|
18
|
+
:margin_top, :right, :top, :width],
|
19
|
+
text_block_styles: [:align, :click, :emphasis, :family, :fill, :font,
|
20
|
+
:justify, :kerning, :leading, :rise, :size, :stretch,
|
21
|
+
:strikecolor, :strikethrough, :stroke, :undercolor,
|
22
|
+
:underline, :weight, :wrap],
|
23
|
+
}
|
24
|
+
|
25
|
+
# Adds styles, or just returns current style if no argument
|
26
|
+
def style(new_styles = nil)
|
27
|
+
update_style(new_styles) if need_to_update_style?(new_styles)
|
28
|
+
update_dimensions if styles_with_dimensions?
|
29
|
+
@style
|
30
|
+
end
|
31
|
+
|
32
|
+
def style_init(arg_styles, new_styles = {})
|
33
|
+
default_element_styles = {}
|
34
|
+
default_element_styles = self.class::STYLES if defined? self.class::STYLES
|
35
|
+
|
36
|
+
create_style_hash
|
37
|
+
merge_app_styles
|
38
|
+
@style.merge!(default_element_styles)
|
39
|
+
@style.merge!(@app.element_styles[self.class]) if @app.element_styles[self.class]
|
40
|
+
@style.merge!(new_styles)
|
41
|
+
@style.merge!(arg_styles)
|
42
|
+
@style = StyleNormalizer.new.normalize(@style)
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_style_hash
|
46
|
+
@style = {}
|
47
|
+
supported_styles.each do |key|
|
48
|
+
@style[key] = nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def merge_app_styles
|
53
|
+
@app.style.each do |key, val|
|
54
|
+
@style[key] = val if self.supported_styles.include? key
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
module StyleWith
|
59
|
+
def style_with(*styles)
|
60
|
+
@supported_styles = []
|
61
|
+
|
62
|
+
unpack_style_groups(styles)
|
63
|
+
define_reader_methods
|
64
|
+
define_writer_methods
|
65
|
+
end
|
66
|
+
|
67
|
+
def unpack_style_groups(styles)
|
68
|
+
styles.each do |style|
|
69
|
+
if STYLE_GROUPS[style]
|
70
|
+
STYLE_GROUPS[style].each{|style| @supported_styles << style}
|
71
|
+
else
|
72
|
+
@supported_styles << style
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
supported_styles = @supported_styles
|
77
|
+
|
78
|
+
define_method("supported_styles") do
|
79
|
+
supported_styles
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def define_reader_methods
|
84
|
+
needs_readers = @supported_styles.reject do |style|
|
85
|
+
self.method_defined?(style)
|
86
|
+
end
|
87
|
+
|
88
|
+
needs_readers.map(&:to_sym).each do |style|
|
89
|
+
define_method style do
|
90
|
+
@style[style]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def define_writer_methods
|
96
|
+
needs_writers = @supported_styles.reject do |style|
|
97
|
+
self.method_defined?("#{style}=")
|
98
|
+
end
|
99
|
+
|
100
|
+
needs_writers.map(&:to_sym).each do |style_key|
|
101
|
+
define_method "#{style_key}=" do |new_style|
|
102
|
+
self.send("style", style_key.to_sym => new_style)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end #end of StyleWith module
|
107
|
+
|
108
|
+
def self.included(klass)
|
109
|
+
klass.extend StyleWith
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def update_style(new_styles)
|
115
|
+
normalized_style = StyleNormalizer.new.normalize(new_styles)
|
116
|
+
set_dimensions(new_styles)
|
117
|
+
click(&new_styles[:click]) if new_styles.has_key?(:click)
|
118
|
+
@style.merge! normalized_style
|
119
|
+
end
|
120
|
+
|
121
|
+
#if dimension is set via style, pass info on to the dimensions setter
|
122
|
+
def set_dimensions(new_styles)
|
123
|
+
new_styles.each do |key, value|
|
124
|
+
self.send("#{key}=", value) if STYLE_GROUPS[:dimensions].include?(key)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def update_dimensions #so that @style hash matches actual values
|
129
|
+
STYLE_GROUPS[:dimensions].each do |style|
|
130
|
+
@style[style] = self.send(style) if self.respond_to? style
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def styles_with_dimensions?
|
135
|
+
STYLE_GROUPS[:dimensions].any? {|dimension| @style.has_key? dimension}
|
136
|
+
end
|
137
|
+
|
138
|
+
def need_to_update_style?(new_styles)
|
139
|
+
new_styles && style_changed?(new_styles)
|
140
|
+
end
|
141
|
+
|
142
|
+
# check necessary because update_style triggers a redraw in the redrawing
|
143
|
+
# aspect and we want to avoid unnecessary redraws
|
144
|
+
def style_changed?(new_styles)
|
145
|
+
new_styles.each_pair.any? do |key, value|
|
146
|
+
@style[key] != value
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Shoes
|
2
|
+
module Common
|
3
|
+
class StyleNormalizer
|
4
|
+
include Color::DSLHelpers
|
5
|
+
def normalize(orig_style)
|
6
|
+
normalized_style = {}
|
7
|
+
[:fill, :stroke].each do |s|
|
8
|
+
if orig_style[s]
|
9
|
+
normalized_style[s] = pattern(orig_style[s])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
orig_style.merge(normalized_style)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class Shoes
|
2
|
+
module Common
|
3
|
+
module Visibility
|
4
|
+
# Hides the element, so that it can't be seen. See also #show and #toggle.
|
5
|
+
def hide
|
6
|
+
@hidden = true
|
7
|
+
update_visibility
|
8
|
+
end
|
9
|
+
|
10
|
+
def hidden?
|
11
|
+
@hidden
|
12
|
+
end
|
13
|
+
|
14
|
+
alias_method :hidden, :hidden?
|
15
|
+
|
16
|
+
def visible?
|
17
|
+
!hidden?
|
18
|
+
end
|
19
|
+
|
20
|
+
# Reveals the element, if it is hidden. See also #hide and #toggle.
|
21
|
+
def show
|
22
|
+
@hidden = false
|
23
|
+
update_visibility
|
24
|
+
end
|
25
|
+
|
26
|
+
# Hides an element if it is shown. Or shows the element, if it is hidden.
|
27
|
+
# See also #hide and #show.
|
28
|
+
def toggle
|
29
|
+
@hidden = !@hidden
|
30
|
+
update_visibility
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def update_visibility
|
35
|
+
gui.update_visibility
|
36
|
+
self
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
class Shoes
|
2
|
+
class Configuration
|
3
|
+
class << self
|
4
|
+
def reset
|
5
|
+
@logger = nil
|
6
|
+
@logger_instance = nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def backend
|
10
|
+
@backend ||= Shoes.load_backend(backend_name)
|
11
|
+
end
|
12
|
+
|
13
|
+
def backend_name
|
14
|
+
@backend_name ||= ENV.fetch('SHOES_BACKEND', default_backend).to_sym
|
15
|
+
end
|
16
|
+
|
17
|
+
def default_backend
|
18
|
+
if caller.any? {|path| path =~ /rspec/}
|
19
|
+
:mock
|
20
|
+
else
|
21
|
+
:swt
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# The Shoes backend to use. Can only be set once.
|
26
|
+
#
|
27
|
+
# @param [Symbol] backend The backend's name
|
28
|
+
# @return [Module] The backend's root module
|
29
|
+
# @example
|
30
|
+
# Shoes::Configuration.backend = :swt # => Shoes::Swt
|
31
|
+
def backend=(name)
|
32
|
+
unless @backend.nil?
|
33
|
+
raise "Can't switch backend to Shoes::#{name.capitalize}, Shoes::#{backend_name.capitalize} backend already loaded."
|
34
|
+
end
|
35
|
+
@backend_name ||= name
|
36
|
+
end
|
37
|
+
|
38
|
+
# Finds the appropriate backend class for the given Shoes object
|
39
|
+
#
|
40
|
+
# @param [Object] shoes_object A Shoes object
|
41
|
+
# @return [Object] An appropriate backend class
|
42
|
+
# @example
|
43
|
+
# Shoes.configuration.backend_class(shoes_button) # => Shoes::Swt::Button
|
44
|
+
def backend_class(shoes_object)
|
45
|
+
class_name = shoes_object.class.name.split("::").last
|
46
|
+
raise ArgumentError, "#{shoes_object} does not have a backend class defined for #{backend}" unless self.backend.const_defined?(class_name)
|
47
|
+
self.backend.const_get(class_name)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Creates an appropriate backend object, passing along additional arguments
|
51
|
+
#
|
52
|
+
# @param [Object] shoes_object A Shoes object
|
53
|
+
# @return [Object] An appropriate backend object
|
54
|
+
# @example
|
55
|
+
# Shoes.configuration.backend_for(button, args) # => <Shoes::Swt::Button:0x12345678>
|
56
|
+
def backend_for(shoes_object, *args)
|
57
|
+
backend_factory(shoes_object).call(shoes_object, *args)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Experimental replacement for #backend_for
|
61
|
+
def backend_with_app_for(shoes_object, *args, &blk)
|
62
|
+
backend_factory(shoes_object).call(shoes_object, shoes_object.app.gui, *args, &blk)
|
63
|
+
end
|
64
|
+
|
65
|
+
def backend_factory(shoes_object)
|
66
|
+
klass = backend_class(shoes_object)
|
67
|
+
klass.respond_to?(:create) ? klass.method(:create) : klass.method(:new)
|
68
|
+
end
|
69
|
+
|
70
|
+
def logger=(value)
|
71
|
+
@logger = value
|
72
|
+
@logger_instance = nil
|
73
|
+
end
|
74
|
+
|
75
|
+
def logger
|
76
|
+
@logger ||= :ruby
|
77
|
+
end
|
78
|
+
|
79
|
+
def logger_instance
|
80
|
+
@logger_instance ||= Shoes::Logger.get(self.logger).new
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def Shoes.configuration
|
87
|
+
Shoes::Configuration
|
88
|
+
end
|
89
|
+
|
90
|
+
def Shoes.backend_for(shoes_object, *args, &blk)
|
91
|
+
Shoes::Configuration.backend_with_app_for(shoes_object, *args, &blk)
|
92
|
+
end
|
93
|
+
|
94
|
+
def Shoes.backend
|
95
|
+
Shoes.configuration.backend
|
96
|
+
end
|