royw-shoeshine 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,15 +4,15 @@ This is a collection of UI elements for shoes (http://shoooes.net).
4
4
 
5
5
  The collection currently includes:
6
6
 
7
- * UnorderedList is an unordered lists with various bullets
8
- * with/without bullets
7
+ * List displays lists with various optional bullets or indexes
8
+ * bullets (circle, star, plus, or custom)
9
+ * indexes (anything that responds to a .next())
9
10
  * vertical or horizontal orientation
10
11
  * ListItems is a handy wrapper for placing things in the list
11
12
  * DropDownMenu is an inplace drop down menu that can serve as popup menus
12
13
  * An example application to show them off with
13
14
 
14
15
  TODOs include:
15
- * ordered lists
16
16
  * toolbar (horizontal list of icons)
17
17
  * maybe a menubar
18
18
 
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 2
2
+ :patch: 3
3
3
  :major: 0
4
4
  :minor: 0
@@ -5,16 +5,13 @@ class CommandWidget
5
5
  def show(opt={})
6
6
  app.stack(opt) do
7
7
  app.background app.gradient(app.rgb(0, 255, 255), app.rgb(255, 0, 255), :angle => -35)
8
- command_list = UnorderedList.new(app, :left_margin => 0)
8
+ command_list = List.new(app, :left_margin => 0)
9
9
  command_list.add ListItem.new("Index",
10
10
  :click => lambda{app.visit(INDEX_PAGE)},
11
11
  :bullet => List::STAR_BULLET)
12
12
  command_list.add HorizontalRule.new(:width => opt[:width])
13
- command_list.add ListItem.new("Unordered Lists",
14
- :click => lambda {app.visit(UNORDERED_LIST_PAGE)},
15
- :bullet => List::CIRCLE_BULLET)
16
- command_list.add ListItem.new("Ordered Lists",
17
- :click => lambda {app.visit(ORDERED_LIST_PAGE)},
13
+ command_list.add ListItem.new("Lists",
14
+ :click => lambda {app.visit(LIST_PAGE)},
18
15
  :bullet => List::CIRCLE_BULLET)
19
16
  command_list.add ListItem.new("DropDownMenus",
20
17
  :click => lambda {app.visit(DROP_DOWN_MENU_PAGE)},
@@ -12,7 +12,8 @@ class DDMenuWidget
12
12
  app.para "Both columns close the menu when the mouse leaves it."
13
13
  app.flow do
14
14
  app.stack(:width => 100) do
15
- list = UnorderedList.new(app)
15
+ app.para "right click"
16
+ list = List.new(app)
16
17
  numbers = %w(one two three four five).collect do |item|
17
18
  ListItem.new(item,
18
19
  :click => lambda{alert("#{item} was clicked")})
@@ -27,9 +28,11 @@ class DDMenuWidget
27
28
  ))
28
29
  end
29
30
  list.show
31
+ app.rect(90, 0, 1, 180)
30
32
  end
31
33
  app.stack(:width => 100) do
32
- list = UnorderedList.new(app)
34
+ app.para 'hover'
35
+ list = List.new(app)
33
36
  numbers = %w(six seven eight nine).collect do |item|
34
37
  ListItem.new(item,
35
38
  :click => lambda{alert("#{item} was clicked")})
@@ -11,8 +11,7 @@ require 'nav'
11
11
  require 'action'
12
12
  require 'dd_menu_action'
13
13
  require 'index_action'
14
- require 'ordered_list_action'
15
- require 'unordered_list_action'
14
+ require 'list_action'
16
15
 
17
16
  class ListExample < Shoes
18
17
  include Nav
@@ -42,8 +41,7 @@ class ListExample < Shoes
42
41
 
43
42
  # define our pages
44
43
  page_def INDEX_PAGE, :index, IndexAction
45
- page_def UNORDERED_LIST_PAGE, :ul, UnorderedListAction
46
- page_def ORDERED_LIST_PAGE, :ol, OrderedListAction
44
+ page_def LIST_PAGE, :list, ListAction
47
45
  page_def DROP_DOWN_MENU_PAGE, :drop_down_menu, DropDownMenuAction
48
46
 
49
47
  private
@@ -1,13 +1,13 @@
1
1
  require 'action'
2
2
  require 'nav'
3
- require 'unordered_list_widget'
3
+ require 'list_widget'
4
4
 
5
- class UnorderedListAction < Action
5
+ class ListAction < Action
6
6
  include Nav
7
7
 
8
8
  def initialize
9
9
  super
10
- @widget = UnorderedListWidget.new
10
+ @widget = ListWidget.new
11
11
  end
12
12
 
13
13
  def execute()
@@ -0,0 +1,93 @@
1
+ require 'shoeshine/widget'
2
+
3
+ class ListWidget
4
+ include Widget
5
+ include Nav
6
+
7
+ def initialize
8
+ end
9
+
10
+ def show(opt={})
11
+ opt = opt.merge(VIEW_AREA_OPTS)
12
+ app.stack(opt) do
13
+ app.background(app.floralwhite) if $DEBUG
14
+ app.caption "Vertical Lists"
15
+
16
+ app.para "Various Bullets"
17
+ app.flow do
18
+ app.background(app.gainsboro) if $DEBUG
19
+ @x = 0
20
+ list_one(80, {})
21
+ list_one(80, {:bullet => List::CIRCLE_BULLET})
22
+ list_one(100, {:bullet => List::STAR_BULLET, :indent => 40, :background => app.yellow})
23
+ list_one(80, {:bullet => List::PLUS_BULLET, :background => app.cyan})
24
+ list_one(80, {:bullet => List::INDEX_BULLET, :index_seed => '1', :index_separator => '.'})
25
+ list_one(80, {:bullet => List::INDEX_BULLET, :index_seed => 'a', :index_separator => ')'})
26
+ list_one(80, {:bullet => List::INDEX_BULLET, :index_seed => 'G', :index_separator => ''})
27
+ end
28
+
29
+ app.para "With Links"
30
+ app.flow do
31
+ app.background(app.lavender) if $DEBUG
32
+ @x = 0
33
+ list_two(80, {})
34
+ list_two(80, {:bullet => List::CIRCLE_BULLET})
35
+ list_two(80, {:bullet => List::STAR_BULLET})
36
+ list_two(80, {:bullet => List::PLUS_BULLET})
37
+ end
38
+
39
+ app.caption "Horizontal Lists"
40
+ app.stack do
41
+ app.background(app.khaki) if $DEBUG
42
+ @y = 0
43
+ list_horizontal(30, {:column_width => 90})
44
+ list_horizontal(30, {:column_width => 100, :bullet => List::CIRCLE_BULLET})
45
+ list_horizontal(30, {:column_width => 110, :bullet => List::STAR_BULLET})
46
+ list_horizontal(30, {:column_width => 120, :bullet => List::PLUS_BULLET})
47
+ end
48
+
49
+ app.para ''
50
+ end
51
+ end
52
+
53
+ def list_one(width, options)
54
+ app.stack({:width => width}) do
55
+ list = List.new(app, options)
56
+ %w(alpha bravo charlie delta echo foxtrot).each do |item|
57
+ list.add(ListItem.new(item))
58
+ end
59
+ list.show
60
+ end
61
+ @x += width
62
+ app.rect(@x,0,1,140)
63
+ end
64
+
65
+ def list_two(width, options)
66
+ app.stack({:width => width}) do
67
+ list = List.new(app, options)
68
+ %w(alpha bravo charlie delta echo foxtrot).each do |item|
69
+ list.add(ListItem.new(item, :click => lambda{alert("#{item} clicked")}))
70
+ end
71
+ list.show
72
+ end
73
+ @x += width
74
+ app.rect(@x,0,1,140)
75
+ end
76
+
77
+ def list_horizontal(height, options)
78
+ app.stack(:height => height, :width => '100%') do
79
+ app.background(app.deeppink) if $DEBUG
80
+ list = List.new(app, options.merge(:orientation => :horizontal, :width => '100%'))
81
+ %w(alpha bravo charlie).each do |item|
82
+ list.add(ListItem.new(item))
83
+ end
84
+ %w(delta echo).each do |item|
85
+ list.add(ListItem.new(item, :click => lambda{alert("#{item} clicked")}))
86
+ end
87
+ list.show
88
+ end
89
+ @y += height
90
+ app.rect(0, @y, 5 * options[:column_width], 1)
91
+ end
92
+
93
+ end
@@ -1,9 +1,8 @@
1
1
  module Nav
2
2
  INDEX_PAGE = '/'
3
- UNORDERED_LIST_PAGE = '/ul'
4
- ORDERED_LIST_PAGE = '/ol'
3
+ LIST_PAGE = '/list'
5
4
  DROP_DOWN_MENU_PAGE = '/drop_down_menu'
6
5
 
7
- COMMAND_AREA_WIDTH = 150
6
+ COMMAND_AREA_WIDTH = 160
8
7
  VIEW_AREA_OPTS = {:width => -COMMAND_AREA_WIDTH, :margin_left => 10, :margin_right => @gutter}
9
8
  end
@@ -8,6 +8,5 @@ $:.push(File.join(File.dirname(__FILE__)))
8
8
  require 'shoeshine/widget'
9
9
  require 'shoeshine/list'
10
10
  require 'shoeshine/list_item'
11
- require 'shoeshine/unordered_list'
12
11
  require 'shoeshine/drop_down_menu'
13
12
  require 'shoeshine/horizontal_rule'
@@ -1,6 +1,8 @@
1
1
  class HorizontalRule
2
2
  include Widget
3
3
 
4
+ attr_accessor :counter
5
+
4
6
  def initialize(opts={})
5
7
  @options = opts
6
8
  @options ||= {}
@@ -1,19 +1,114 @@
1
+ require 'shoeshine/widget'
2
+
1
3
  class List
2
- STAR_BULLET = :star
3
- CIRCLE_BULLET = :circle
4
- PLUS_BULLET = :plus
5
- SPACE_BULLET = :space
6
-
7
- BULLETS = {
8
- :star => lambda{|app| app.star(-3,13,5,6,3)},
9
- :circle => lambda{|app| app.oval(-7,10,7)},
10
- :plus => lambda do |app|
11
- # rect(x,y,w,h) NOTE, docs are wrong
12
- length = 9
13
- beam = 1
14
- app.rect(-5,8,beam,length,1) # vertical bar
15
- app.rect(-9,12,length,beam,1) # horizontal bar
16
- end,
17
- :space => lambda {|app| }
18
- }
4
+ include Widget
5
+
6
+ STAR_BULLET = lambda{ |app, *ignore| List.star_image(app) }
7
+ CIRCLE_BULLET = lambda{ |app, *ignore| List.circle_image(app) }
8
+ PLUS_BULLET = lambda{ |app, *ignore| List.plus_image(app) }
9
+ SPACE_BULLET = lambda{ |app, *ignore| ' '}
10
+ INDEX_BULLET = lambda{ |app, counter, separator| List.index_string(app, counter, separator) }
11
+ IMAGE_BULLET = lambda{ |app, image_url, *ignore| app.image(image_url) unless image_url.nil? }
12
+
13
+ IMAGE_SIZE = 20
14
+
15
+ def initialize(app, list_opts={})
16
+ self.app = app
17
+ @list_opts = list_opts
18
+ @list_opts ||= {}
19
+ @list_items = []
20
+ end
21
+
22
+ def add(list_item)
23
+ @list_items << list_item
24
+ end
25
+
26
+ # list_opts => {
27
+ # :bullet => one_of(BULLETS.keys),
28
+ # :background => app.background argument
29
+ # }
30
+ def show(opts={})
31
+ show_options = {:margin_bottom => 10}.merge(@list_opts.merge(opts)) unless opts.nil?
32
+ column_options = {}
33
+ column_options[:width] = show_options[:column_width] unless show_options[:column_width].nil?
34
+ counter = show_options[:index_seed]
35
+ orientation = show_options[:orientation]
36
+ orientation = :vertical if orientation.nil?
37
+ case orientation.to_sym
38
+ when :vertical
39
+ app.stack(show_options) do
40
+ @list_items.each do |item|
41
+ item.app = app
42
+ app.flow do
43
+ item.counter = counter
44
+ item.show @list_opts
45
+ counter = counter.next unless counter.nil?
46
+ end
47
+ end
48
+ end
49
+ when :horizontal
50
+ app.flow(show_options.merge(:width => '100%')) do
51
+ app.background(app.cyan) if $DEBUG
52
+ @list_items.each do |item|
53
+ item.app = app
54
+ app.stack(column_options) do
55
+ app.background(app.red) if $DEBUG
56
+ app.flow do
57
+ app.background(app.yellow) if $DEBUG
58
+ item.counter = counter
59
+ item.show @list_opts
60
+ counter = counter.next unless counter.nil?
61
+ end
62
+ end
63
+ end
64
+ end
65
+ else
66
+ app.error "Invalid orientation value: '#{orientation.to_s}'"
67
+ end
68
+ end
69
+
70
+ protected
71
+
72
+ def self.star_image(app)
73
+ app.image IMAGE_SIZE, IMAGE_SIZE do
74
+ top = IMAGE_SIZE / 2 + 2
75
+ left = IMAGE_SIZE / 2
76
+ points = 5
77
+ outer = IMAGE_SIZE / 3
78
+ inner = IMAGE_SIZE / 6
79
+ app.star(left, top, points, outer, inner)
80
+ end
81
+ end
82
+
83
+ def self.circle_image(app)
84
+ app.image IMAGE_SIZE, IMAGE_SIZE do
85
+ top = (IMAGE_SIZE / 2)
86
+ left = (IMAGE_SIZE / 2)
87
+ radius = IMAGE_SIZE / 3
88
+ app.oval(left, top, radius)
89
+ end
90
+ end
91
+
92
+ def self.plus_image(app)
93
+ app.image IMAGE_SIZE, IMAGE_SIZE do
94
+ # rect(x,y,w,h) NOTE, docs are wrong
95
+ length = (IMAGE_SIZE * 2) / 3
96
+ beam = 3
97
+ top = ((IMAGE_SIZE - length) / 2) + 2
98
+ left = ((IMAGE_SIZE - length) / 2) + 2
99
+ vertical_center = IMAGE_SIZE / 2
100
+ horizontal_center = IMAGE_SIZE / 2
101
+ app.rect(horizontal_center, top, beam, length, 1) # vertical bar
102
+ app.rect(left, vertical_center, length, beam, 1) # horizontal bar
103
+ end
104
+ end
105
+
106
+ def self.index_string(app, counter, separator)
107
+ str = ''
108
+ separator ||= ''
109
+ unless counter.nil?
110
+ str = "#{counter}#{separator}"
111
+ end
112
+ app.para(str, :margin_bottom => 0)
113
+ end
19
114
  end
@@ -2,45 +2,46 @@ class ListItem
2
2
  include Widget
3
3
 
4
4
  attr_reader :options
5
+ attr_accessor :counter
5
6
 
6
7
  def initialize(text, opts={})
7
8
  @text = text
8
9
  @options = opts
9
10
  @options ||= {}
11
+ @counter = nil
10
12
  end
11
13
 
12
14
  def show(list_options={})
13
15
  list_options ||= {}
14
16
  show_options = list_options.merge(self.options)
17
+ bullet_options = {}
18
+ bullet_options[:width] = show_options[:indent].nil? ? 20 : show_options[:indent]
15
19
 
16
20
  bullet = show_options[:bullet]
17
- icon = show_options[:image]
18
21
  menu_items = show_options[:menu_items]
19
22
 
20
- indent = (bullet.nil? ? 0 : 15)
21
- right = (show_options[:margin_right].nil? ? 0 : show_options[:margin_right])
22
- left = (show_options[:margin_left].nil? ? 10 : show_options[:margin_left])
23
+ # right = (show_options[:margin_right].nil? ? 0 : show_options[:margin_right])
24
+ # left = (show_options[:margin_left].nil? ? 10 : show_options[:margin_left])
25
+ # left = (show_options[:indent].nil? ? 10 : show_options[:indent])
23
26
 
24
- unless icon.nil?
25
- icon_image = app.image icon
26
- indent = icon_image.full_width + 5
27
- else
28
- unless bullet.nil?
29
- indent = 15
30
- List::BULLETS[bullet].call(app)
31
- end
27
+ unless show_options[:background].nil?
28
+ app.background(show_options[:background], :margin_left => bullet_options[:width])
29
+ # app.background(show_options[:background])
30
+ # left += 5
32
31
  end
33
32
 
34
- unless show_options[:background].nil?
35
- app.background(show_options[:background], :margin_left => left)
36
- left += 5
33
+ unless bullet.nil?
34
+ app.flow(bullet_options) do
35
+ bullet_image = bullet.call(app, @counter, show_options[:index_separator])
36
+ end
37
37
  end
38
+
38
39
  unless menu_items.nil?
39
40
  trigger = show_options[:menu_trigger] || DropDownMenuWidget::RIGHT_BUTTON
40
41
  menu = DropDownMenuWidget.new(app, self, trigger, menu_items, menu_options(show_options))
41
42
  menu.show
42
43
  else
43
- para_opts = {:margin_left => left, :margin_right => right, :margin_bottom => 0}
44
+ para_opts = {:margin_bottom => 0}
44
45
  app.para(self.as_value(app), para_opts)
45
46
  end
46
47
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: royw-shoeshine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roy Wright
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-30 00:00:00 -07:00
12
+ date: 2009-05-01 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -34,19 +34,18 @@ files:
34
34
  - examples/example_app.rb
35
35
  - examples/index_action.rb
36
36
  - examples/index_widget.rb
37
+ - examples/list_action.rb
38
+ - examples/list_widget.rb
37
39
  - examples/nav.rb
38
40
  - examples/ordered_list_action.rb
39
41
  - examples/ordered_list_widget.rb
40
42
  - examples/page_widget.rb
41
43
  - examples/title_widget.rb
42
- - examples/unordered_list_action.rb
43
- - examples/unordered_list_widget.rb
44
44
  - lib/shoeshine.rb
45
45
  - lib/shoeshine/drop_down_menu.rb
46
46
  - lib/shoeshine/horizontal_rule.rb
47
47
  - lib/shoeshine/list.rb
48
48
  - lib/shoeshine/list_item.rb
49
- - lib/shoeshine/unordered_list.rb
50
49
  - lib/shoeshine/widget.rb
51
50
  - spec/drop_down_menu_spec.rb
52
51
  - spec/spec_helper.rb
@@ -81,15 +80,15 @@ test_files:
81
80
  - spec/drop_down_menu_spec.rb
82
81
  - examples/example_app.rb
83
82
  - examples/dd_menu_action.rb
83
+ - examples/list_action.rb
84
84
  - examples/nav.rb
85
85
  - examples/title_widget.rb
86
86
  - examples/dd_menu_widget.rb
87
- - examples/unordered_list_action.rb
88
87
  - examples/ordered_list_widget.rb
89
88
  - examples/ordered_list_action.rb
90
89
  - examples/index_action.rb
90
+ - examples/list_widget.rb
91
91
  - examples/index_widget.rb
92
92
  - examples/page_widget.rb
93
93
  - examples/action.rb
94
- - examples/unordered_list_widget.rb
95
94
  - examples/command_widget.rb
@@ -1,68 +0,0 @@
1
- require 'shoeshine/widget'
2
-
3
- class UnorderedListWidget
4
- include Widget
5
- include Nav
6
-
7
- def initialize
8
- end
9
-
10
- def show(opt={})
11
- app.stack(opt) do
12
- app.flow do
13
- app.para "Various bullets"
14
- list_one({})
15
- list_one({:bullet => List::CIRCLE_BULLET})
16
- list_one({:bullet => List::STAR_BULLET})
17
- list_one({:bullet => List::PLUS_BULLET})
18
- end
19
- app.flow(opt) do
20
- app.para "With links"
21
- list_two({})
22
- list_two({:bullet => List::CIRCLE_BULLET})
23
- list_two({:bullet => List::STAR_BULLET})
24
- list_two({:bullet => List::PLUS_BULLET})
25
- end
26
- app.stack(opt) do
27
- list_horizontal({})
28
- list_horizontal({:bullet => List::CIRCLE_BULLET})
29
- list_horizontal({:bullet => List::STAR_BULLET})
30
- list_horizontal({:bullet => List::PLUS_BULLET})
31
- end
32
- end
33
- end
34
-
35
- def list_one(options)
36
- app.stack({:width => 80}) do
37
- list = UnorderedList.new(app, options)
38
- %w(alpha bravo charlie delta echo foxtrot).each do |item|
39
- list.add(ListItem.new(item))
40
- end
41
- list.show
42
- end
43
- end
44
-
45
- def list_two(options)
46
- app.stack({:width => 80}) do
47
- list = UnorderedList.new(app, options)
48
- %w(alpha bravo charlie delta echo foxtrot).each do |item|
49
- list.add(ListItem.new(item, :click => lambda{alert("#{item} clicked")}))
50
- end
51
- list.show
52
- end
53
- end
54
-
55
- def list_horizontal(options)
56
- app.stack do
57
- list = UnorderedList.new(app, options.merge(:orientation => :horizontal, :width => '100%'))
58
- %w(alpha bravo charlie).each do |item|
59
- list.add(ListItem.new(item))
60
- end
61
- %w(delta echo foxtrot).each do |item|
62
- list.add(ListItem.new(item, :click => lambda{alert("#{item} clicked")}))
63
- end
64
- list.show
65
- end
66
- end
67
-
68
- end
@@ -1,52 +0,0 @@
1
- class UnorderedList < List
2
- include Widget
3
-
4
- public
5
-
6
- def initialize(app, list_opts={})
7
- self.app = app
8
- @list_opts = list_opts
9
- @list_opts ||= {}
10
- @list_items = []
11
- end
12
-
13
- def add(list_item)
14
- @list_items << list_item
15
- end
16
-
17
- # list_opts => {
18
- # :bullet => one_of(BULLETS.keys),
19
- # :background => app.background argument
20
- # }
21
- def show(opts={})
22
- show_options = {:margin_bottom => 10}.merge(@list_opts.merge(opts)) unless opts.nil?
23
-
24
- orientation = show_options[:orientation]
25
- orientation = :vertical if orientation.nil?
26
- case orientation.to_sym
27
- when :vertical
28
- app.stack(show_options) do
29
- @list_items.each do |item|
30
- item.app = app
31
- app.flow do
32
- item.show @list_opts
33
- end
34
- end
35
- end
36
- when :horizontal
37
- app.flow(show_options) do
38
- @list_items.each do |item|
39
- item.app = app
40
- app.stack(:width => 80) do
41
- item.show @list_opts
42
- end
43
- end
44
- end
45
- else
46
- app.error "Invalid orientation value: '#{orientation.to_s}'"
47
- end
48
- end
49
-
50
- def show_items
51
- end
52
- end