shoes-core 4.0.0.pre3 → 4.0.0.pre4
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 +4 -4
- data/bin/shoes +1 -1
- data/bin/shoes-picker +5 -1
- data/bin/shoes-stub +1 -1
- data/ext/install/shoes.bat +2 -0
- data/lib/rubygems_plugin.rb +2 -2
- data/lib/shoes/app.rb +18 -19
- data/lib/shoes/arc.rb +8 -8
- data/lib/shoes/background.rb +4 -8
- data/lib/shoes/border.rb +4 -8
- data/lib/shoes/builtin_methods.rb +2 -2
- data/lib/shoes/button.rb +2 -9
- data/lib/shoes/check_button.rb +0 -12
- data/lib/shoes/color.rb +29 -34
- data/lib/shoes/common/background_element.rb +4 -0
- data/lib/shoes/common/fill.rb +9 -0
- data/lib/shoes/common/initialization.rb +59 -0
- data/lib/shoes/common/inspect.rb +20 -2
- data/lib/shoes/common/rotate.rb +10 -0
- data/lib/shoes/common/stroke.rb +9 -0
- data/lib/shoes/common/style.rb +21 -7
- data/lib/shoes/common/style_normalizer.rb +1 -3
- data/lib/shoes/common/ui_element.rb +10 -0
- data/lib/shoes/common/visibility.rb +4 -4
- data/lib/shoes/configuration.rb +4 -2
- data/lib/shoes/core/version.rb +1 -1
- data/lib/shoes/dialog.rb +2 -2
- data/lib/shoes/dimension.rb +78 -68
- data/lib/shoes/dimensions.rb +22 -10
- data/lib/shoes/download.rb +26 -10
- data/lib/shoes/dsl.rb +32 -51
- data/lib/shoes/gradient.rb +6 -13
- data/lib/shoes/image.rb +4 -9
- data/lib/shoes/input_box.rb +6 -9
- data/lib/shoes/internal_app.rb +16 -36
- data/lib/shoes/line.rb +29 -10
- data/lib/shoes/link.rb +13 -2
- data/lib/shoes/list_box.rb +33 -11
- data/lib/shoes/logger.rb +12 -13
- data/lib/shoes/mock/arc.rb +2 -0
- data/lib/shoes/mock/common_methods.rb +9 -0
- data/lib/shoes/mock/shape.rb +1 -1
- data/lib/shoes/mock/slot.rb +1 -0
- data/lib/shoes/oval.rb +13 -8
- data/lib/shoes/packager.rb +7 -1
- data/lib/shoes/point.rb +26 -3
- data/lib/shoes/progress.rb +6 -8
- data/lib/shoes/rect.rb +14 -10
- data/lib/shoes/shape.rb +28 -14
- data/lib/shoes/slot.rb +33 -24
- data/lib/shoes/slot_contents.rb +4 -4
- data/lib/shoes/star.rb +7 -16
- data/lib/shoes/text.rb +5 -3
- data/lib/shoes/text_block.rb +17 -16
- data/lib/shoes/text_block_dimensions.rb +1 -1
- data/lib/shoes/ui/cli.rb +12 -3
- data/lib/shoes/ui/picker.rb +64 -19
- data/lib/shoes/version.rb +1 -1
- data/shoes-core.gemspec +2 -2
- data/spec/shoes/animation_spec.rb +1 -1
- data/spec/shoes/app_spec.rb +4 -23
- data/spec/shoes/color_spec.rb +16 -1
- data/spec/shoes/common/style_normalizer_spec.rb +3 -3
- data/spec/shoes/common/style_spec.rb +42 -5
- data/spec/shoes/dimension_spec.rb +5 -7
- data/spec/shoes/dimensions_spec.rb +7 -7
- data/spec/shoes/download_spec.rb +49 -8
- data/spec/shoes/flow_spec.rb +1 -1
- data/spec/shoes/helpers/fake_element.rb +7 -0
- data/spec/shoes/helpers/sample17_helper.rb +3 -3
- data/spec/shoes/integration_spec.rb +1 -1
- data/spec/shoes/internal_app_spec.rb +8 -0
- data/spec/shoes/line_spec.rb +35 -3
- data/spec/shoes/link_spec.rb +24 -12
- data/spec/shoes/list_box_spec.rb +14 -2
- data/spec/shoes/point_spec.rb +28 -0
- data/spec/shoes/renamed_delegate_spec.rb +2 -2
- data/spec/shoes/shape_spec.rb +15 -2
- data/spec/shoes/shared_examples/changeable.rb +1 -1
- data/spec/shoes/shared_examples/common_methods.rb +1 -1
- data/spec/shoes/shared_examples/dsl/style.rb +1 -1
- data/spec/shoes/shared_examples/dsl/text_elements.rb +3 -3
- data/spec/shoes/shared_examples/dsl/video.rb +1 -1
- data/spec/shoes/shared_examples/dsl_app_context.rb +0 -1
- data/spec/shoes/shared_examples/parent.rb +1 -1
- data/spec/shoes/shared_examples/slot.rb +11 -5
- data/spec/shoes/shared_examples/state.rb +2 -2
- data/spec/shoes/shared_examples/style.rb +1 -1
- data/spec/shoes/spec_helper.rb +1 -1
- data/spec/shoes/text_block_spec.rb +20 -3
- data/spec/shoes/ui/picker_spec.rb +70 -0
- metadata +8 -2
data/lib/shoes/slot_contents.rb
CHANGED
@@ -33,12 +33,12 @@ class Shoes
|
|
33
33
|
@contents.clear
|
34
34
|
end
|
35
35
|
|
36
|
-
def inspect
|
37
|
-
super.insert(-2, " @size=#{size} @prepending=#{@prepending} @prepending_index=#{@prepending_index}")
|
38
|
-
end
|
39
|
-
|
40
36
|
private
|
41
37
|
|
38
|
+
def inspect_details
|
39
|
+
" @size=#{size} @prepending=#{@prepending} @prepending_index=#{@prepending_index}"
|
40
|
+
end
|
41
|
+
|
42
42
|
def append_element(element)
|
43
43
|
@contents << element
|
44
44
|
end
|
data/lib/shoes/star.rb
CHANGED
@@ -1,17 +1,15 @@
|
|
1
1
|
class Shoes
|
2
2
|
class Star
|
3
3
|
include Common::UIElement
|
4
|
+
include Common::Fill
|
5
|
+
include Common::Stroke
|
4
6
|
include Common::Style
|
5
7
|
include Common::Clickable
|
6
8
|
|
7
|
-
attr_reader :app, :parent, :dimensions, :gui
|
8
9
|
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
|
10
|
+
STYLES = { angle: 0, fill: Shoes::COLORS[:black] }
|
14
11
|
|
12
|
+
def create_dimensions(left, top, points, outer, inner)
|
15
13
|
# Don't use param defaults as DSL explicit passes nil for missing params
|
16
14
|
points ||= 10
|
17
15
|
outer ||= 100.0
|
@@ -28,16 +26,9 @@ class Shoes
|
|
28
26
|
inner_dimensions = AbsoluteDimensions.new 0, 0, inner * 2, 0
|
29
27
|
|
30
28
|
# Get actual outer/inner from the dimension to handle relative values
|
31
|
-
outer
|
32
|
-
inner
|
33
|
-
|
34
|
-
# Now set style using adjust outer and inner
|
35
|
-
style_init(styles, inner: inner, outer: outer, points: points)
|
36
|
-
|
37
|
-
@parent.add_child self
|
38
|
-
@gui = Shoes.backend_for self
|
39
|
-
|
40
|
-
register_click blk
|
29
|
+
style[:outer] = @dimensions.width / 2
|
30
|
+
style[:inner] = inner_dimensions.width / 2
|
31
|
+
style[:points] = points
|
41
32
|
end
|
42
33
|
|
43
34
|
def in_bounds?(x, y)
|
data/lib/shoes/text.rb
CHANGED
data/lib/shoes/text_block.rb
CHANGED
@@ -8,24 +8,21 @@ class Shoes
|
|
8
8
|
include Common::Clickable
|
9
9
|
include TextBlockDimensionsDelegations
|
10
10
|
|
11
|
-
attr_reader :
|
11
|
+
attr_reader :text, :contents, :text_styles
|
12
12
|
attr_accessor :cursor, :textcursor
|
13
|
+
|
13
14
|
style_with :common_styles, :dimensions, :text_block_styles
|
14
|
-
STYLES = { font:
|
15
|
+
STYLES = { font: DEFAULT_TEXTBLOCK_FONT } # used in TextBlock specs only
|
16
|
+
|
17
|
+
def create_dimensions(*_)
|
18
|
+
@dimensions = TextBlockDimensions.new @parent, @style
|
19
|
+
end
|
15
20
|
|
16
|
-
def
|
17
|
-
@parent = parent
|
18
|
-
@app = app
|
19
|
-
style_init styles
|
20
|
-
@dimensions = TextBlockDimensions.new parent, @style
|
21
|
+
def after_initialize(text)
|
21
22
|
handle_styles @style
|
22
|
-
@gui = Shoes.backend_for self
|
23
|
-
@parent.add_child self
|
24
23
|
|
25
24
|
# Important to use accessor and do this after the backend exists!
|
26
25
|
self.text = Array(text)
|
27
|
-
|
28
|
-
register_click
|
29
26
|
end
|
30
27
|
|
31
28
|
def in_bounds?(*args)
|
@@ -37,6 +34,12 @@ class Shoes
|
|
37
34
|
end
|
38
35
|
|
39
36
|
def replace(*texts)
|
37
|
+
opts = texts.pop if texts.last.is_a?(Hash)
|
38
|
+
if opts
|
39
|
+
style(opts)
|
40
|
+
handle_styles(opts)
|
41
|
+
end
|
42
|
+
|
40
43
|
# Order here matters as well--backend#replace shouldn't rely on DSL state
|
41
44
|
# but the texts that it's passed if it needs information at this point.
|
42
45
|
@gui.replace(*texts)
|
@@ -62,7 +65,7 @@ class Shoes
|
|
62
65
|
@textcursor ||= app.textcursor(line_height)
|
63
66
|
end
|
64
67
|
|
65
|
-
def
|
68
|
+
def textcursor?
|
66
69
|
@textcursor
|
67
70
|
end
|
68
71
|
|
@@ -71,9 +74,7 @@ class Shoes
|
|
71
74
|
end
|
72
75
|
|
73
76
|
def links
|
74
|
-
|
75
|
-
|
76
|
-
@contents.select do |element|
|
77
|
+
contents.to_a.select do |element|
|
77
78
|
element.is_a?(Shoes::Link)
|
78
79
|
end
|
79
80
|
end
|
@@ -135,7 +136,7 @@ class Shoes
|
|
135
136
|
"Inscription" => { size: 10 }
|
136
137
|
}.each do |name, styles|
|
137
138
|
clazz = Class.new(TextBlock) do
|
138
|
-
const_set("STYLES", { font:
|
139
|
+
const_set("STYLES", { font: DEFAULT_TEXTBLOCK_FONT, fill: nil }.merge(styles))
|
139
140
|
end
|
140
141
|
Shoes.const_set(name, clazz)
|
141
142
|
end
|
@@ -31,7 +31,7 @@ class Shoes
|
|
31
31
|
|
32
32
|
# This is the width the text block initially wants to try and fit into.
|
33
33
|
def desired_width(containing = containing_width)
|
34
|
-
parent.absolute_left + containing - absolute_left
|
34
|
+
parent.absolute_left + containing - absolute_left - margin_left - margin_right
|
35
35
|
end
|
36
36
|
|
37
37
|
# If an explicit width's set, use that when asking how much space we need.
|
data/lib/shoes/ui/cli.rb
CHANGED
@@ -5,7 +5,11 @@ class Shoes
|
|
5
5
|
class CLI
|
6
6
|
attr_reader :packager
|
7
7
|
|
8
|
-
def initialize
|
8
|
+
def initialize(backend)
|
9
|
+
$LOAD_PATH.unshift(Dir.pwd)
|
10
|
+
backend_const = Shoes.load_backend(backend)
|
11
|
+
backend_const.initialize_backend
|
12
|
+
|
9
13
|
@packager = Shoes::Packager.new
|
10
14
|
end
|
11
15
|
|
@@ -33,6 +37,12 @@ Usage: #{opts.program_name} [-h] [-p package] file
|
|
33
37
|
exit
|
34
38
|
end
|
35
39
|
|
40
|
+
opts.on('-b', '--backend [BACKEND]', 'Select a Shoes backend') do |backend|
|
41
|
+
require 'shoes/ui/picker'
|
42
|
+
Shoes::UI::Picker.new.run(ENV["SHOES_BIN_DIR"], backend)
|
43
|
+
exit
|
44
|
+
end
|
45
|
+
|
36
46
|
opts.separator @packager.help(opts.program_name)
|
37
47
|
end
|
38
48
|
|
@@ -43,9 +53,8 @@ Usage: #{opts.program_name} [-h] [-p package] file
|
|
43
53
|
# Execute a shoes app.
|
44
54
|
#
|
45
55
|
# @param [String] app the location of the app to run
|
56
|
+
# @param [String] backend name of backend to load with the app
|
46
57
|
def execute_app(app)
|
47
|
-
$LOAD_PATH.unshift(Dir.pwd)
|
48
|
-
require 'shoes/swt'
|
49
58
|
load app
|
50
59
|
end
|
51
60
|
|
data/lib/shoes/ui/picker.rb
CHANGED
@@ -3,38 +3,83 @@ class Shoes
|
|
3
3
|
# This class is used for interactively (if necessary) picking the Shoes
|
4
4
|
# backend that the user will run their Shoes app with.
|
5
5
|
class Picker
|
6
|
-
def
|
6
|
+
def initialize(input=STDIN, output=STDOUT)
|
7
|
+
@input = input
|
8
|
+
@output = output
|
9
|
+
end
|
10
|
+
|
11
|
+
def run(bin_dir, desired_backend=nil)
|
7
12
|
bundle
|
8
|
-
generator_file = select_generator
|
9
|
-
write_backend(generator_file)
|
13
|
+
generator_file = select_generator(desired_backend)
|
14
|
+
write_backend(generator_file, bin_dir)
|
10
15
|
end
|
11
16
|
|
12
17
|
# Only bundle if we find a local Gemfile. This allows us to work properly
|
13
|
-
# running from source without finding gem-
|
18
|
+
# running from source without finding gem-installed backends.
|
14
19
|
def bundle
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
20
|
+
return unless File.exist?("Gemfile")
|
21
|
+
|
22
|
+
# Only need bundler/setup to get our paths right--we don't need to
|
23
|
+
# actually require the gems, since we find the generate-backend.rb's
|
24
|
+
# and just require them directly.
|
25
|
+
require 'bundler/setup'
|
19
26
|
end
|
20
27
|
|
21
|
-
def select_generator
|
22
|
-
|
23
|
-
|
24
|
-
if candidates.
|
25
|
-
|
28
|
+
def select_generator(desired_backend=nil)
|
29
|
+
candidates = find_candidates(desired_backend)
|
30
|
+
|
31
|
+
if candidates.empty?
|
32
|
+
raise ArgumentError.new("No gems found matching '#{desired_backend}'")
|
33
|
+
elsif candidates.one?
|
34
|
+
candidate = candidates.first
|
35
|
+
@output.puts "Selecting #{name_for_candidate(candidate)} backend to use. This is a one-time operation."
|
36
|
+
candidate
|
26
37
|
else
|
27
|
-
|
38
|
+
candidates.sort!
|
39
|
+
output_candidates(candidates)
|
40
|
+
prompt_for_candidate(candidates)
|
28
41
|
end
|
42
|
+
end
|
29
43
|
|
30
|
-
|
44
|
+
def find_candidates(desired_backend)
|
45
|
+
search_string = "shoes/**/#{desired_backend}/generate-backend.rb"
|
46
|
+
search_string.gsub!("//", "/")
|
47
|
+
Gem.find_files(search_string)
|
31
48
|
end
|
32
49
|
|
33
|
-
def
|
34
|
-
|
50
|
+
def output_candidates(candidates)
|
51
|
+
@output.puts
|
52
|
+
@output.puts "Enter a number to select a Shoes backend (This is a one-time operation):"
|
35
53
|
|
36
|
-
|
37
|
-
|
54
|
+
candidates.each_with_index do |candidate, index|
|
55
|
+
@output.puts " #{index + 1}. #{name_for_candidate(candidate)}"
|
56
|
+
end
|
57
|
+
|
58
|
+
@output.print "> "
|
59
|
+
end
|
60
|
+
|
61
|
+
def prompt_for_candidate(candidates)
|
62
|
+
candidate = nil
|
63
|
+
|
64
|
+
until candidate
|
65
|
+
entered_index = @input.readline.to_i
|
66
|
+
if entered_index > 0
|
67
|
+
candidate = candidates[entered_index - 1]
|
68
|
+
break if candidate
|
69
|
+
end
|
70
|
+
@output.puts "Invalid selection. Try again with a number from 1 to #{candidates.size}."
|
71
|
+
end
|
72
|
+
|
73
|
+
candidate
|
74
|
+
end
|
75
|
+
|
76
|
+
def name_for_candidate(candidate)
|
77
|
+
/.*lib\/shoes\/(.*)\/generate-backend.rb/.match(candidate)
|
78
|
+
return "shoes-#{$1.gsub("/", "-")}"
|
79
|
+
end
|
80
|
+
|
81
|
+
def write_backend(generator_file, bin_dir)
|
82
|
+
require generator_file
|
38
83
|
|
39
84
|
File.open(File.expand_path(File.join(bin_dir, "shoes-backend")), "w") do |file|
|
40
85
|
# Contract with backends is to define generate_backend method that we
|
data/lib/shoes/version.rb
CHANGED
data/shoes-core.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.authors = ["Team Shoes"]
|
9
9
|
s.email = ["shoes@librelist.com"]
|
10
10
|
s.homepage = "https://github.com/shoes/shoes4"
|
11
|
-
s.summary =
|
12
|
-
s.description =
|
11
|
+
s.summary = 'The best little DSL for the best little GUI toolkit for Ruby.'
|
12
|
+
s.description = "Shoes is the best little GUI toolkit for Ruby. Shoes makes building for Mac, Windows, and Linux super simple. This is the DSL for writing your app. You'll need a backend to run it."
|
13
13
|
s.license = 'MIT'
|
14
14
|
|
15
15
|
s.files = `git ls-files`.split($/)
|
@@ -37,7 +37,7 @@ describe Shoes::Animation do
|
|
37
37
|
let(:opts) { {} }
|
38
38
|
let(:block) { double('block') }
|
39
39
|
let(:bound_block) { double('bound block') }
|
40
|
-
subject { Shoes::Animation.new(
|
40
|
+
subject { Shoes::Animation.new(app, opts, block) }
|
41
41
|
|
42
42
|
before :each do
|
43
43
|
expect(app).to receive(:gui) { app_gui }
|
data/spec/shoes/app_spec.rb
CHANGED
@@ -58,7 +58,7 @@ describe Shoes::App do
|
|
58
58
|
end
|
59
59
|
|
60
60
|
it "shows title in #inspect" do
|
61
|
-
expect(subject.inspect).to match(
|
61
|
+
expect(subject.inspect).to match(/\(Shoes::App:#{shoes_object_id_pattern} "#{defaults.fetch :title}"\)/)
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
@@ -81,8 +81,8 @@ describe Shoes::App do
|
|
81
81
|
|
82
82
|
it 'initializes a flow with the right parameters' do
|
83
83
|
expect(Shoes::Flow).to receive(:new).with(anything, anything,
|
84
|
-
|
85
|
-
|
84
|
+
width: opts[:width],
|
85
|
+
height: opts[:height]).
|
86
86
|
and_call_original
|
87
87
|
subject
|
88
88
|
end
|
@@ -283,25 +283,6 @@ describe Shoes::App do
|
|
283
283
|
end
|
284
284
|
end
|
285
285
|
|
286
|
-
describe "#gutter" do
|
287
|
-
context "when app has a scrollbar" do
|
288
|
-
let(:input_opts) { {width: 100, height: 100} }
|
289
|
-
let(:input_block) { Proc.new { para "Round peg, square hole" * 200 } }
|
290
|
-
|
291
|
-
it "has gutter of 16" do
|
292
|
-
expect(app.gutter).to be_within(2).of(16)
|
293
|
-
end
|
294
|
-
end
|
295
|
-
|
296
|
-
context "when app has no scrollbar" do
|
297
|
-
let(:input_block) { Proc.new { para "Round peg, square hole" } }
|
298
|
-
|
299
|
-
it "has gutter of 16" do
|
300
|
-
expect(app.gutter).to be_within(2).of(16)
|
301
|
-
end
|
302
|
-
end
|
303
|
-
end
|
304
|
-
|
305
286
|
describe "#parent" do
|
306
287
|
context "for a top-level element (not explicitly in a slot)" do
|
307
288
|
it "returns the top_slot" do
|
@@ -319,7 +300,7 @@ describe Shoes::App do
|
|
319
300
|
it "returns the enclosing slot" do
|
320
301
|
my_parent = nil
|
321
302
|
my_stack = nil
|
322
|
-
|
303
|
+
Shoes.app do
|
323
304
|
my_stack = stack do
|
324
305
|
flow do
|
325
306
|
my_parent = parent
|
data/spec/shoes/color_spec.rb
CHANGED
@@ -238,6 +238,17 @@ describe Shoes::Color do
|
|
238
238
|
expect(green).to eq green
|
239
239
|
end
|
240
240
|
|
241
|
+
# shoes 3 compatibility behavior
|
242
|
+
describe 'different colors' do
|
243
|
+
it 'takes the total of rgb values to compare, less is less' do
|
244
|
+
expect(create_rgb 100, 200, 0).to be < create_rgb(50, 100, 151)
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'takes the total of rgb values to compare, more is more' do
|
248
|
+
expect(create_rgb 0, 200, 200).to be > create_rgb(150, 150, 99)
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
241
252
|
context "same rgb values" do
|
242
253
|
let(:color_2) { Shoes::Color.new(255, 69, 0, 254) }
|
243
254
|
it "is less than when less opaque" do
|
@@ -250,6 +261,10 @@ describe Shoes::Color do
|
|
250
261
|
end
|
251
262
|
end
|
252
263
|
end
|
264
|
+
|
265
|
+
def create_rgb(r, g, b)
|
266
|
+
Shoes::Color.new r, g, b
|
267
|
+
end
|
253
268
|
end
|
254
269
|
|
255
270
|
describe "Shoes built-in colors" do
|
@@ -284,7 +299,7 @@ describe "Shoes built in gray" do
|
|
284
299
|
end
|
285
300
|
|
286
301
|
specify "float parameters should be normalised" do
|
287
|
-
expect(app.gray(1.0, 0.5)).to eq(Shoes::Color.new(
|
302
|
+
expect(app.gray(1.0, 0.5)).to eq(Shoes::Color.new(255, 255, 255, 128))
|
288
303
|
end
|
289
304
|
|
290
305
|
it 'hangles 0.93 right as well' do
|
@@ -13,7 +13,7 @@ describe Shoes::Common::StyleNormalizer do
|
|
13
13
|
expected = {fill: Shoes::Color.new(255, 255, 255)}
|
14
14
|
expect(subject.normalize input).to eq expected
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
it 'turns hexcodes for stroke into colors' do
|
18
18
|
input = {stroke: 'ffffff'}
|
19
19
|
expected = {stroke: Shoes::Color.new(255, 255, 255)}
|
@@ -23,6 +23,6 @@ describe Shoes::Common::StyleNormalizer do
|
|
23
23
|
it 'does not modify the original hash' do
|
24
24
|
input = {stroke: '333333'}
|
25
25
|
subject.normalize input
|
26
|
-
expect(input).to eq(
|
26
|
+
expect(input).to eq(stroke: '333333')
|
27
27
|
end
|
28
|
-
end
|
28
|
+
end
|
@@ -5,15 +5,22 @@ describe Shoes::Common::Style do
|
|
5
5
|
let(:blue) { Shoes::COLORS[:blue] }
|
6
6
|
|
7
7
|
class StyleTester
|
8
|
+
include Shoes::Common::Visibility
|
9
|
+
include Shoes::DimensionsDelegations
|
8
10
|
include Shoes::Common::Style
|
9
|
-
|
11
|
+
|
12
|
+
attr_reader :dimensions
|
10
13
|
style_with :key, :left, :click, :strokewidth, :fill
|
14
|
+
|
11
15
|
STYLES = {fill: Shoes::COLORS[:blue]}
|
12
16
|
|
13
17
|
def initialize(app, styles = {})
|
14
18
|
@app = app #needed for style init
|
19
|
+
@dimensions = Shoes::Dimensions.new(@app, left: 15)
|
20
|
+
|
21
|
+
# Would normally be done by Common::Initialization
|
15
22
|
style_init(styles, key: 'value')
|
16
|
-
|
23
|
+
update_dimensions
|
17
24
|
end
|
18
25
|
|
19
26
|
def click(&arg)
|
@@ -23,17 +30,21 @@ describe Shoes::Common::Style do
|
|
23
30
|
def click_blk
|
24
31
|
@click
|
25
32
|
end
|
33
|
+
|
34
|
+
def update_visibility
|
35
|
+
end
|
26
36
|
end
|
37
|
+
|
27
38
|
subject {StyleTester.new(app)}
|
28
39
|
|
29
|
-
its(:style) { should eq
|
30
|
-
let(:initial_style) { {key: 'value', left: 15, click: nil, strokewidth: 1, fill: blue
|
40
|
+
its(:style) { should eq(initial_style) }
|
41
|
+
let(:initial_style) { {key: 'value', left: 15, click: nil, strokewidth: 1, fill: blue,
|
42
|
+
margin: [0,0,0,0], margin_left: 0, margin_top: 0, margin_right: 0, margin_bottom: 0 } }
|
31
43
|
|
32
44
|
describe 'reading and writing through #style(hash)' do
|
33
45
|
let(:input_proc) { Proc.new {} }
|
34
46
|
let(:changed_style) { {key: 'changed value'} }
|
35
47
|
|
36
|
-
|
37
48
|
before :each do
|
38
49
|
subject.style changed_style
|
39
50
|
end
|
@@ -57,6 +68,16 @@ describe Shoes::Common::Style do
|
|
57
68
|
expect(subject.left).to eq 200
|
58
69
|
end
|
59
70
|
|
71
|
+
it 'reads visibility' do
|
72
|
+
subject.hide
|
73
|
+
expect(subject.style[:hidden]).to be true
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'writes visibility' do
|
77
|
+
subject.style(hidden: true)
|
78
|
+
expect(subject.hidden?).to be true
|
79
|
+
end
|
80
|
+
|
60
81
|
it 'sets click' do
|
61
82
|
subject.style(click: input_proc)
|
62
83
|
expect(subject.click_blk).to eq input_proc
|
@@ -117,6 +138,7 @@ describe Shoes::Common::Style do
|
|
117
138
|
|
118
139
|
describe "style priorities" do
|
119
140
|
subject {StyleTester.new(app, key: 'pumpkin')}
|
141
|
+
let(:green) { Shoes::COLORS[:green] }
|
120
142
|
|
121
143
|
it 'uses arguments-styles over element-styles' do
|
122
144
|
expect(subject.key).to eq 'pumpkin'
|
@@ -126,6 +148,21 @@ describe Shoes::Common::Style do
|
|
126
148
|
expect(subject.fill).to eq blue
|
127
149
|
end
|
128
150
|
|
151
|
+
describe "with app level styles applied" do
|
152
|
+
let(:app) { Shoes::App.new}
|
153
|
+
|
154
|
+
it "should override class level defaults with app level styles provided those app styles are supported by the class" do
|
155
|
+
app.style(fill: green)
|
156
|
+
expect(app.line(0, 0, 10, 10).fill).to eq green
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should not override class level defaults with app level styles for already instanciated objects" do
|
160
|
+
line_instance = app.line(0, 0, 10, 10)
|
161
|
+
app.style(fill: green)
|
162
|
+
expect(line_instance.fill).not_to eq green
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
129
166
|
#related priority specs are tested individually in spec/shared_examples/style
|
130
167
|
end
|
131
168
|
|
@@ -307,9 +307,8 @@ describe Shoes::Dimension do
|
|
307
307
|
it {is_expected.to be_in_bounds 105}
|
308
308
|
it {is_expected.to be_in_bounds 20.021}
|
309
309
|
it {is_expected.not_to be_in_bounds absolute_end + ONE_PIXEL}
|
310
|
-
it {is_expected.not_to be_in_bounds absolute_start - ONE_PIXEL
|
311
|
-
}
|
312
|
-
it {is_expected.not_to be_in_bounds -5}
|
310
|
+
it {is_expected.not_to be_in_bounds absolute_start - ONE_PIXEL }
|
311
|
+
it {is_expected.not_to be_in_bounds(-5)}
|
313
312
|
it {is_expected.not_to be_in_bounds 0}
|
314
313
|
it {is_expected.not_to be_in_bounds 150}
|
315
314
|
it {is_expected.not_to be_in_bounds 123178}
|
@@ -334,12 +333,12 @@ describe Shoes::Dimension do
|
|
334
333
|
|
335
334
|
it 'parses negative values' do
|
336
335
|
subject.start = '-13'
|
337
|
-
expect(subject.start).to eq
|
336
|
+
expect(subject.start).to eq(-13)
|
338
337
|
end
|
339
338
|
|
340
339
|
it 'even parses negative values with px' do
|
341
340
|
subject.start = '-22px'
|
342
|
-
expect(subject.start).to eq
|
341
|
+
expect(subject.start).to eq(-22)
|
343
342
|
end
|
344
343
|
|
345
344
|
it 'returns nil for unknown values' do
|
@@ -397,7 +396,7 @@ describe Shoes::Dimension do
|
|
397
396
|
|
398
397
|
it 'can still handle special values like a negative extent' do
|
399
398
|
subject.extent = -10
|
400
|
-
expect(subject.extent).to eq
|
399
|
+
expect(subject.extent).to eq(parent_extent - 2 * margin - 10)
|
401
400
|
end
|
402
401
|
|
403
402
|
it 'can also still handle special values like relative values' do
|
@@ -430,4 +429,3 @@ describe Shoes::Dimension do
|
|
430
429
|
end
|
431
430
|
|
432
431
|
end
|
433
|
-
|
@@ -211,10 +211,10 @@ describe Shoes::Dimensions do
|
|
211
211
|
let(:parent_height) {300}
|
212
212
|
subject {Shoes::Dimensions.new parent, "- 100", "-20px", "- 50px", "- 80"}
|
213
213
|
|
214
|
-
its(:left) {should eq
|
215
|
-
its(:top) {should eq
|
216
|
-
its(:width) {should eq
|
217
|
-
its(:height) {should eq
|
214
|
+
its(:left) {should eq(-100)}
|
215
|
+
its(:top) {should eq(-20)}
|
216
|
+
its(:width) {should eq(parent_width - 50)}
|
217
|
+
its(:height) {should eq(parent_height - 80)}
|
218
218
|
end
|
219
219
|
end
|
220
220
|
|
@@ -553,12 +553,12 @@ describe Shoes::Dimensions do
|
|
553
553
|
subject.margin_right = 7
|
554
554
|
expect(subject.margin).to eq([margin, margin, 7, margin])
|
555
555
|
end
|
556
|
-
|
556
|
+
|
557
557
|
it 'adapts margins when margin is changed with single value' do
|
558
558
|
subject.margin = 7
|
559
559
|
expect(subject.margin).to eq([7, 7, 7, 7])
|
560
560
|
end
|
561
|
-
|
561
|
+
|
562
562
|
it 'adapts margin when margin is changed with array' do
|
563
563
|
subject.margin = [7, 7, 7, 7]
|
564
564
|
expect(subject.margin).to eq([7, 7, 7, 7])
|
@@ -759,7 +759,7 @@ describe Shoes::Dimensions do
|
|
759
759
|
|
760
760
|
it 'can also still handle special values like a negative width' do
|
761
761
|
subject.width = -10
|
762
|
-
expect(subject.width).to eq
|
762
|
+
expect(subject.width).to eq(parent.width - 10)
|
763
763
|
end
|
764
764
|
|
765
765
|
it 'can also still handle special values like a relative height' do
|