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/font.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
class Shoes
|
2
|
+
FONT_DIR = DIR + "/fonts/"
|
3
|
+
|
4
|
+
module Font
|
5
|
+
FONT_TYPES = "{ttf,ttc,otf,fnt,fon,bdf,pcf,snf,mmm,pfb,pfm}"
|
6
|
+
@loaded_fonts = {}
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_reader :loaded_fonts
|
10
|
+
|
11
|
+
def font_paths_from_dir(path)
|
12
|
+
font_paths = []
|
13
|
+
Dir.glob(path + "**/*." + FONT_TYPES).each do |font_path|
|
14
|
+
font_paths << font_path
|
15
|
+
end
|
16
|
+
font_paths
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_font(path)
|
20
|
+
Shoes.backend::Font.add_font(path)
|
21
|
+
end
|
22
|
+
|
23
|
+
def add_font_to_fonts(path)
|
24
|
+
name = font_name(path)
|
25
|
+
Shoes::FONTS << name
|
26
|
+
name
|
27
|
+
end
|
28
|
+
|
29
|
+
def initial_fonts
|
30
|
+
Shoes.backend::Font.initial_fonts
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def font_name(path)
|
35
|
+
remove_file_ext(parse_filename_from_path(path))
|
36
|
+
end
|
37
|
+
|
38
|
+
def parse_filename_from_path(file_path)
|
39
|
+
Pathname.new(file_path).basename.to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
def remove_file_ext(file_name)
|
43
|
+
file_name.chomp(File.extname(file_name))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
FONTS = []
|
49
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Shoes
|
2
|
+
class Gradient
|
3
|
+
include Common::Inspect
|
4
|
+
include Comparable
|
5
|
+
|
6
|
+
def initialize(color1, color2, alpha = Shoes::Color::OPAQUE)
|
7
|
+
@color1, @color2 = color1, color2
|
8
|
+
@alpha = alpha
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :alpha, :color1, :color2
|
12
|
+
|
13
|
+
def inspect
|
14
|
+
super.insert(-2, " #{color1}->#{color2}")
|
15
|
+
end
|
16
|
+
|
17
|
+
def <=>(other) #arbitrarily compare 1st non-equal color
|
18
|
+
raise_class_mismatch_error(other) unless other.is_a?(self.class)
|
19
|
+
if @color1 == other.color1
|
20
|
+
@color2 <=> other.color2
|
21
|
+
else
|
22
|
+
@color1 <=> other.color1
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def raise_class_mismatch_error other
|
27
|
+
raise ArgumentError,
|
28
|
+
"can't compare #{self.class.name} with #{other.class.name}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/shoes/image.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
class Shoes
|
2
|
+
class Image
|
3
|
+
include Common::UIElement
|
4
|
+
include Common::Style
|
5
|
+
include Common::Clickable
|
6
|
+
|
7
|
+
attr_reader :app, :parent, :dimensions, :gui
|
8
|
+
style_with :art_styles, :common_styles, :dimensions, :file_path
|
9
|
+
|
10
|
+
def initialize(app, parent, file_path, styles = {}, blk = nil)
|
11
|
+
@app = app
|
12
|
+
@parent = parent
|
13
|
+
style_init styles, file_path: file_path
|
14
|
+
@dimensions = Dimensions.new parent, @style
|
15
|
+
@parent.add_child self
|
16
|
+
@gui = Shoes.configuration.backend_for self, @parent.gui
|
17
|
+
register_click blk
|
18
|
+
end
|
19
|
+
|
20
|
+
def path
|
21
|
+
@style[:file_path]
|
22
|
+
end
|
23
|
+
|
24
|
+
def path=(path)
|
25
|
+
style(file_path: path)
|
26
|
+
@gui.update_image
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class Shoes
|
2
|
+
class InputBox
|
3
|
+
include Common::UIElement
|
4
|
+
include Common::Style
|
5
|
+
include Common::Changeable
|
6
|
+
|
7
|
+
attr_reader :app, :parent, :dimensions, :gui
|
8
|
+
|
9
|
+
def initialize(app, parent, text, styles = {}, blk = nil)
|
10
|
+
@app = app
|
11
|
+
@parent = parent
|
12
|
+
style_init styles, text: text.to_s
|
13
|
+
@dimensions = Dimensions.new parent, @style
|
14
|
+
@parent.add_child self
|
15
|
+
@gui = Shoes.configuration.backend_for self, @parent.gui
|
16
|
+
change &blk if blk
|
17
|
+
end
|
18
|
+
|
19
|
+
def state=(value)
|
20
|
+
style(state: value)
|
21
|
+
@gui.enabled value.nil?
|
22
|
+
end
|
23
|
+
|
24
|
+
def focus
|
25
|
+
@gui.focus
|
26
|
+
end
|
27
|
+
|
28
|
+
def text
|
29
|
+
@gui.text
|
30
|
+
end
|
31
|
+
|
32
|
+
def text=(value)
|
33
|
+
style(text: value.to_s)
|
34
|
+
@gui.text = value.to_s
|
35
|
+
end
|
36
|
+
|
37
|
+
def highlight_text(start_index, final_index)
|
38
|
+
@gui.highlight_text(start_index, final_index)
|
39
|
+
end
|
40
|
+
|
41
|
+
def caret_to(index)
|
42
|
+
@gui.caret_to(index)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class EditBox < InputBox
|
47
|
+
style_with :change, :common_styles, :dimensions, :text, :state
|
48
|
+
STYLES = { width: 200, height: 108, text: '' }
|
49
|
+
end
|
50
|
+
|
51
|
+
class EditLine < InputBox
|
52
|
+
style_with :change, :common_styles, :dimensions, :text, :secret, :state
|
53
|
+
STYLES = { width: 200, height: 28, text: '' }
|
54
|
+
|
55
|
+
def secret?
|
56
|
+
self.secret
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,219 @@
|
|
1
|
+
class Shoes
|
2
|
+
# This is the representation of the app that is used internally by Shoes
|
3
|
+
# objects. It is *NOT* the app object that a user interacts with in a
|
4
|
+
# Shoes.app block. The user facing App object is...the App object.
|
5
|
+
#
|
6
|
+
# The InternalApp object is responsible for maintaining the state of the App
|
7
|
+
# and providing the bulk of the functionality, leaving the App a relatively
|
8
|
+
# blank slate for users to bend to their will.
|
9
|
+
class InternalApp
|
10
|
+
include Common::Style
|
11
|
+
include Common::Clickable
|
12
|
+
include DimensionsDelegations
|
13
|
+
|
14
|
+
extend Forwardable
|
15
|
+
|
16
|
+
DEFAULT_OPTIONS = { :width => 600,
|
17
|
+
:height => 500,
|
18
|
+
:title => "Shoes 4",
|
19
|
+
:resizable => true,
|
20
|
+
:background => Shoes::COLORS.fetch(:shoes_background) }.freeze
|
21
|
+
|
22
|
+
def initialize(app, opts, &blk)
|
23
|
+
@app = app
|
24
|
+
@blk = blk
|
25
|
+
set_attributes_from_options(opts)
|
26
|
+
set_initial_attributes
|
27
|
+
end
|
28
|
+
|
29
|
+
def setup_gui
|
30
|
+
@gui = Shoes.configuration.backend::App.new self
|
31
|
+
|
32
|
+
self.current_slot = create_top_slot
|
33
|
+
execution_blk = create_execution_block(blk)
|
34
|
+
eval_block execution_blk
|
35
|
+
|
36
|
+
setup_global_keypresses
|
37
|
+
register_console_keypress
|
38
|
+
end
|
39
|
+
|
40
|
+
attr_reader :gui, :top_slot, :app, :dimensions,
|
41
|
+
:mouse_motion, :owner, :element_styles, :resize_callbacks
|
42
|
+
attr_accessor :elements, :current_slot, :opts, :blk, :mouse_button,
|
43
|
+
:mouse_pos, :mouse_hover_controls, :resizable, :app_title,
|
44
|
+
:width, :height, :start_as_fullscreen, :location
|
45
|
+
|
46
|
+
def_delegators :@app, :eval_with_additional_context
|
47
|
+
|
48
|
+
def clear(&blk)
|
49
|
+
current_slot.clear &blk
|
50
|
+
end
|
51
|
+
|
52
|
+
def contents
|
53
|
+
top_slot.contents
|
54
|
+
end
|
55
|
+
|
56
|
+
def width
|
57
|
+
started? ? gui.width : @dimensions.width
|
58
|
+
end
|
59
|
+
|
60
|
+
def height
|
61
|
+
started? ? gui.height : @dimensions.height
|
62
|
+
end
|
63
|
+
|
64
|
+
def font(path = Shoes::DEFAULT_TEXTBLOCK_FONT)
|
65
|
+
app.font path
|
66
|
+
end
|
67
|
+
|
68
|
+
def started?
|
69
|
+
gui && gui.started?
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_child(child)
|
73
|
+
# No-op. The top_slot needs this method, but we already hold an explicit
|
74
|
+
# reference to the top_slot, so we don't need to add it as a child. Other
|
75
|
+
# elements should be added as children of the top_slot.
|
76
|
+
end
|
77
|
+
|
78
|
+
def default_styles
|
79
|
+
Common::Style::DEFAULT_STYLES.clone
|
80
|
+
end
|
81
|
+
|
82
|
+
def in_bounds?(x, y)
|
83
|
+
true
|
84
|
+
end
|
85
|
+
|
86
|
+
def fullscreen=(state)
|
87
|
+
gui.fullscreen = state
|
88
|
+
end
|
89
|
+
|
90
|
+
def fullscreen
|
91
|
+
gui.fullscreen
|
92
|
+
end
|
93
|
+
|
94
|
+
alias_method :start_as_fullscreen?, :start_as_fullscreen
|
95
|
+
|
96
|
+
def add_mouse_hover_control(element)
|
97
|
+
unless mouse_hover_controls.include? element
|
98
|
+
mouse_hover_controls << element
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def open_gui
|
103
|
+
gui.open
|
104
|
+
end
|
105
|
+
|
106
|
+
def quit
|
107
|
+
@gui.quit
|
108
|
+
end
|
109
|
+
|
110
|
+
def scroll_top
|
111
|
+
gui.scroll_top
|
112
|
+
end
|
113
|
+
|
114
|
+
def scroll_top=(n)
|
115
|
+
gui.scroll_top = n
|
116
|
+
end
|
117
|
+
|
118
|
+
def clipboard
|
119
|
+
gui.clipboard
|
120
|
+
end
|
121
|
+
|
122
|
+
def clipboard=(str)
|
123
|
+
gui.clipboard = str
|
124
|
+
end
|
125
|
+
|
126
|
+
def download(url, opts, &block)
|
127
|
+
app.download url, opts, &block
|
128
|
+
end
|
129
|
+
|
130
|
+
def textcursor(line_height)
|
131
|
+
app.line(0, 0, 0, line_height, hidden: true)
|
132
|
+
end
|
133
|
+
|
134
|
+
def execute_block(blk)
|
135
|
+
app.instance_eval &blk
|
136
|
+
end
|
137
|
+
|
138
|
+
def gutter
|
139
|
+
gui.gutter
|
140
|
+
end
|
141
|
+
|
142
|
+
def add_resize_callback(blk)
|
143
|
+
@resize_callbacks << blk
|
144
|
+
end
|
145
|
+
|
146
|
+
def inspect
|
147
|
+
super.insert(-2, " \"#{@app_title}\" #{@dimensions.inspect})")
|
148
|
+
end
|
149
|
+
|
150
|
+
def self.global_keypresses
|
151
|
+
@global_keypresses ||= {}
|
152
|
+
end
|
153
|
+
|
154
|
+
def self.add_global_keypress(key, &blk)
|
155
|
+
self.global_keypresses[key] = blk
|
156
|
+
end
|
157
|
+
|
158
|
+
private
|
159
|
+
def create_top_slot
|
160
|
+
@top_slot = Flow.new self, self, width: width, height: height
|
161
|
+
end
|
162
|
+
|
163
|
+
def eval_block(execution_blk)
|
164
|
+
@top_slot.append &execution_blk
|
165
|
+
end
|
166
|
+
|
167
|
+
def create_execution_block(blk)
|
168
|
+
if blk
|
169
|
+
execution_blk = Proc.new do
|
170
|
+
execute_block blk
|
171
|
+
end
|
172
|
+
elsif Shoes::URL.urls.keys.any? { |page| page.match '/' }
|
173
|
+
execution_blk = Proc.new do
|
174
|
+
app.visit '/'
|
175
|
+
end
|
176
|
+
else
|
177
|
+
execution_blk = nil
|
178
|
+
end
|
179
|
+
execution_blk
|
180
|
+
end
|
181
|
+
|
182
|
+
def set_initial_attributes
|
183
|
+
@style = default_styles
|
184
|
+
@element_styles = {}
|
185
|
+
@mouse_motion = []
|
186
|
+
@mouse_button = 0
|
187
|
+
@mouse_pos = [0, 0]
|
188
|
+
@mouse_hover_controls = []
|
189
|
+
@resize_callbacks = []
|
190
|
+
@pass_coordinates = true
|
191
|
+
end
|
192
|
+
|
193
|
+
def set_attributes_from_options(opts)
|
194
|
+
opts = DEFAULT_OPTIONS.merge(opts)
|
195
|
+
|
196
|
+
@app_title = opts[:title]
|
197
|
+
@resizable = opts[:resizable]
|
198
|
+
@start_as_fullscreen = opts[:fullscreen]
|
199
|
+
@opts = opts
|
200
|
+
@owner = opts[:owner]
|
201
|
+
@dimensions = AbsoluteDimensions.new opts
|
202
|
+
self.absolute_left = 0
|
203
|
+
self.absolute_top = 0
|
204
|
+
end
|
205
|
+
|
206
|
+
def setup_global_keypresses
|
207
|
+
@app.keypress do |key|
|
208
|
+
blk = self.class.global_keypresses[key]
|
209
|
+
@app.instance_eval(&blk) unless blk.nil?
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
def register_console_keypress
|
214
|
+
self.class.add_global_keypress(:"alt_/") do
|
215
|
+
Logger.setup
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Shoes
|
2
|
+
class KeyEvent
|
3
|
+
def initialize(app, &blk)
|
4
|
+
@app = app
|
5
|
+
@gui = Shoes.backend_for self, &blk
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :app
|
9
|
+
|
10
|
+
def remove
|
11
|
+
@gui.remove
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Keypress < KeyEvent ; end
|
16
|
+
class Keyrelease < KeyEvent ; end
|
17
|
+
end
|
data/lib/shoes/line.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
class Shoes
|
2
|
+
class Line
|
3
|
+
include Common::UIElement
|
4
|
+
include Common::Style
|
5
|
+
include Common::Clickable
|
6
|
+
|
7
|
+
attr_reader :app, :parent, :dimensions, :gui, :point_a, :point_b
|
8
|
+
|
9
|
+
style_with :angle, :art_styles, :dimensions, :x2, :y2
|
10
|
+
STYLES = {angle: 0}
|
11
|
+
|
12
|
+
def initialize(app, parent, point_a, point_b, styles = {}, blk = nil)
|
13
|
+
@app = app
|
14
|
+
@parent = parent
|
15
|
+
@point_a = point_a
|
16
|
+
@point_b = point_b
|
17
|
+
|
18
|
+
style_init styles, x2: point_b.x, y2: point_b.y
|
19
|
+
enclosing_box_of_line
|
20
|
+
|
21
|
+
@parent.add_child self
|
22
|
+
@gui = Shoes.backend_for self
|
23
|
+
register_click blk
|
24
|
+
end
|
25
|
+
|
26
|
+
def update_style(new_styles)
|
27
|
+
super
|
28
|
+
enclosing_box_of_line
|
29
|
+
end
|
30
|
+
|
31
|
+
def left=(val)
|
32
|
+
@point_a.x < @point_b.x ? set_point_a(:x, val) : set_point_b(:x, val)
|
33
|
+
end
|
34
|
+
|
35
|
+
def right=(val)
|
36
|
+
@point_a.x > @point_b.x ? set_point_a(:x, val) : set_point_b(:x, val)
|
37
|
+
end
|
38
|
+
|
39
|
+
def top=(val)
|
40
|
+
@point_a.y < @point_b.y ? set_point_a(:y, val) : set_point_b(:y, val)
|
41
|
+
end
|
42
|
+
|
43
|
+
def bottom=(val)
|
44
|
+
@point_a.y > @point_b.y ? set_point_a(:y, val) : set_point_b(:y, val)
|
45
|
+
end
|
46
|
+
|
47
|
+
def x2=(val)
|
48
|
+
set_point_b(:x, val)
|
49
|
+
end
|
50
|
+
|
51
|
+
def y2=(val)
|
52
|
+
set_point_b(:y, val)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def set_point_a(which, val)
|
58
|
+
@point_a.x = val if which == :x
|
59
|
+
@point_a.y = val if which == :y
|
60
|
+
enclosing_box_of_line
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_point_b(which, val)
|
64
|
+
@point_b.x = val if which == :x
|
65
|
+
@point_b.y = val if which == :y
|
66
|
+
style(x2: val) if which == :x
|
67
|
+
style(y2: val) if which == :y
|
68
|
+
enclosing_box_of_line
|
69
|
+
end
|
70
|
+
|
71
|
+
def enclosing_box_of_line
|
72
|
+
left = @point_a.left(@point_b)
|
73
|
+
top = @point_a.top(@point_b)
|
74
|
+
width = @point_a.width(@point_b)
|
75
|
+
height = @point_a.height(@point_b)
|
76
|
+
right = left + width
|
77
|
+
bottom = top + height
|
78
|
+
|
79
|
+
@dimensions = AbsoluteDimensions.new left: left,
|
80
|
+
top: top,
|
81
|
+
right: right,
|
82
|
+
bottom: bottom,
|
83
|
+
width: width,
|
84
|
+
height: height
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|