cura 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +4 -2
- data/examples/cura-scrollwindow/Gemfile +4 -0
- data/examples/cura-scrollwindow/Gemfile.lock +19 -0
- data/examples/cura-scrollwindow/doc/coverage/call_stack.html +3526 -0
- data/examples/cura-scrollwindow/doc/coverage/graph.html +36927 -0
- data/examples/cura-scrollwindow/lib/app.rb +62 -0
- data/examples/todo_list/debug.log +1 -0
- data/lib/cura/application.rb +7 -2
- data/lib/cura/attributes/has_children.rb +7 -1
- data/lib/cura/attributes/has_root.rb +7 -14
- data/lib/cura/color.rb +6 -1
- data/lib/cura/component/base.rb +37 -54
- data/lib/cura/component/group.rb +1 -0
- data/lib/cura/component/label.rb +1 -0
- data/lib/cura/component/listbox.rb +13 -0
- data/lib/cura/component/pack.rb +1 -1
- data/lib/cura/event/base.rb +1 -1
- data/lib/cura/event/middleware/dispatch.rb +5 -0
- data/lib/cura/helpers/component/drawing.rb +66 -0
- data/lib/cura/version.rb +1 -1
- data/lib/cura/window.rb +16 -0
- metadata +15 -2
@@ -0,0 +1,62 @@
|
|
1
|
+
require "cura"
|
2
|
+
require "cura/termbox/adapter"
|
3
|
+
require "faker"
|
4
|
+
require "pry"
|
5
|
+
|
6
|
+
class ScrollWindowApp < Cura::Application
|
7
|
+
on_event(:key_down) do |event|
|
8
|
+
stop if event.control? && event.name == :C # CTRL+C
|
9
|
+
|
10
|
+
@listbox.add_child(:label, text: Faker::Hipster.sentence)
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(attributes={})
|
14
|
+
super
|
15
|
+
|
16
|
+
window = Cura::Window.new
|
17
|
+
add_window(window)
|
18
|
+
|
19
|
+
window.root = Cura::Component::Pack.new(width: window.width, height: window.height, fill: true)
|
20
|
+
|
21
|
+
@listbox = window.add_child(:listbox, height: window.height-1, background: Cura::Color.red)
|
22
|
+
|
23
|
+
line_pack = window.add_child(:pack, orientation: :horizontal)
|
24
|
+
|
25
|
+
@prompt = line_pack.add_child(:label, text: ">", margin: { right: 1 })
|
26
|
+
@input = line_pack.add_child(:textbox, width: window.width - @prompt.width)
|
27
|
+
|
28
|
+
@input.focus
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
require "ruby-prof"
|
35
|
+
|
36
|
+
RubyProf.start
|
37
|
+
|
38
|
+
app = ScrollWindowApp.new
|
39
|
+
|
40
|
+
Thread.new do
|
41
|
+
sleep 5
|
42
|
+
|
43
|
+
letters = ("A".."Z").to_a + ("a".."z").to_a
|
44
|
+
letters.each do |letter|
|
45
|
+
app.dispatch_event(:key_down, name: letter)
|
46
|
+
sleep 0.25
|
47
|
+
end
|
48
|
+
app.stop
|
49
|
+
end
|
50
|
+
app.run
|
51
|
+
|
52
|
+
|
53
|
+
result = RubyProf.stop
|
54
|
+
|
55
|
+
path = Pathname.new(__FILE__).join("..", "..", "doc", "coverage").expand_path
|
56
|
+
path.mkpath
|
57
|
+
|
58
|
+
printer = RubyProf::CallStackPrinter.new(result)
|
59
|
+
path.join("call_stack.html").open("w+") { |file| printer.print(file) }
|
60
|
+
|
61
|
+
printer = RubyProf::GraphHtmlPrinter.new(result)
|
62
|
+
path.join("graph.html").open("w+") { |file| printer.print(file) }
|
@@ -0,0 +1 @@
|
|
1
|
+
# Logfile created on 2016-06-24 22:52:31 -0400 by logger.rb/53141
|
data/lib/cura/application.rb
CHANGED
@@ -95,7 +95,10 @@ module Cura
|
|
95
95
|
|
96
96
|
self
|
97
97
|
ensure
|
98
|
-
@
|
98
|
+
unless @cleaned
|
99
|
+
@adapter.cleanup
|
100
|
+
@cleaned = true
|
101
|
+
end
|
99
102
|
end
|
100
103
|
|
101
104
|
# Stop the application after the current run cycle.
|
@@ -111,8 +114,10 @@ module Cura
|
|
111
114
|
#
|
112
115
|
# @return [Application] This application.
|
113
116
|
def stop!
|
114
|
-
|
117
|
+
@running = false
|
118
|
+
|
115
119
|
@adapter.cleanup
|
120
|
+
@cleaned = true
|
116
121
|
|
117
122
|
self
|
118
123
|
end
|
@@ -45,11 +45,16 @@ module Cura
|
|
45
45
|
# A Symbol representing the child component type or a {Component::Base} instance.
|
46
46
|
# When a Symbol is given, a new child component will be initialized of that type. See {Component::Base.type}.
|
47
47
|
# @param [#to_h] attributes
|
48
|
+
# When component_or_type is a Class, then these attributes will be used to initialize the child component.
|
48
49
|
# When component_or_type is a Symbol, then these attributes will be used to initialize the child component.
|
49
50
|
# When component_or_type is a {Component::Base}, then these attributes will be used to update the child component.
|
50
51
|
# @return [Component]
|
51
52
|
def add_child(component_or_type, attributes={})
|
52
|
-
component = if component_or_type.
|
53
|
+
component = if component_or_type.is_a?(Class)
|
54
|
+
raise Error::InvalidComponent unless component_or_type < Component::Base
|
55
|
+
|
56
|
+
component_or_type.new
|
57
|
+
elsif component_or_type.respond_to?(:to_sym)
|
53
58
|
type = component_or_type.to_sym
|
54
59
|
component_class = Component.find_by_type(type)
|
55
60
|
|
@@ -100,6 +105,7 @@ module Cura
|
|
100
105
|
# @return [Group]
|
101
106
|
def delete_children
|
102
107
|
(0...@children.count).to_a.reverse_each { |index| delete_child_at(index) } # TODO: Why reverse?
|
108
|
+
|
103
109
|
self
|
104
110
|
end
|
105
111
|
|
@@ -8,6 +8,7 @@ module Cura
|
|
8
8
|
module Attributes
|
9
9
|
# Adds the `root` attribute to an object, which defaults to a Component::Group.
|
10
10
|
module HasRoot
|
11
|
+
|
11
12
|
include Attributes::HasAttributes
|
12
13
|
|
13
14
|
def initialize(attributes={})
|
@@ -16,20 +17,23 @@ module Cura
|
|
16
17
|
super
|
17
18
|
end
|
18
19
|
|
19
|
-
# @method root
|
20
20
|
# Get root component for this object.
|
21
21
|
#
|
22
22
|
# @return [Component::Group]
|
23
|
+
attr_reader :root
|
23
24
|
|
24
|
-
# @method root=(component)
|
25
25
|
# Set root component for this object.
|
26
26
|
#
|
27
27
|
# @param [Component::Group] component
|
28
28
|
# @return [Component::Group]
|
29
|
+
def root=(value)
|
30
|
+
raise TypeError, "root must be a Component::Group" unless value.is_a?(Component::Group)
|
29
31
|
|
30
|
-
|
32
|
+
@root = value
|
33
|
+
end
|
31
34
|
|
32
35
|
# Delegates -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
36
|
+
# TODO: Use Forwardable
|
33
37
|
|
34
38
|
# Get the children of this object.
|
35
39
|
#
|
@@ -89,17 +93,6 @@ module Cura
|
|
89
93
|
@root.children?
|
90
94
|
end
|
91
95
|
|
92
|
-
protected
|
93
|
-
|
94
|
-
def set_root(component)
|
95
|
-
raise TypeError, "root must be a Component::Group" unless component.is_a?(Component::Group)
|
96
|
-
|
97
|
-
@root.parent = nil unless @root.nil?
|
98
|
-
@root = component
|
99
|
-
@root.parent = self
|
100
|
-
|
101
|
-
@root
|
102
|
-
end
|
103
96
|
end
|
104
97
|
end
|
105
98
|
end
|
data/lib/cura/color.rb
CHANGED
@@ -40,6 +40,8 @@ module Cura
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
RGB_TO_LAB_CACHE = {}
|
44
|
+
|
43
45
|
def initialize(r=0, g=0, b=0, a=255)
|
44
46
|
if r.respond_to?(:to_h)
|
45
47
|
super(r.to_h)
|
@@ -50,7 +52,10 @@ module Cura
|
|
50
52
|
@alpha = a
|
51
53
|
end
|
52
54
|
|
53
|
-
|
55
|
+
# TODO: Update on rgb setters?
|
56
|
+
rgb = [@red, @green, @blue]
|
57
|
+
@lab = (RGB_TO_LAB_CACHE[rgb] ||= rgb_to_lab(rgb))
|
58
|
+
# @lab = rgb_to_lab(rgb)
|
54
59
|
end
|
55
60
|
|
56
61
|
# @method red
|
data/lib/cura/component/base.rb
CHANGED
@@ -7,7 +7,9 @@ if Kernel.respond_to?(:require)
|
|
7
7
|
require "cura/attributes/has_offsets"
|
8
8
|
require "cura/attributes/has_relative_coordinates"
|
9
9
|
require "cura/attributes/has_visibility"
|
10
|
+
require "cura/helpers/component/drawing"
|
10
11
|
require "cura/component"
|
12
|
+
require "cura/window"
|
11
13
|
end
|
12
14
|
|
13
15
|
module Cura
|
@@ -17,9 +19,12 @@ module Cura
|
|
17
19
|
# All components use a box model similar to CSS.
|
18
20
|
# Margins, borders, paddings, then content.
|
19
21
|
class Base
|
22
|
+
|
20
23
|
class << self
|
21
24
|
# On subclass hook.
|
22
25
|
def inherited(subclass)
|
26
|
+
super
|
27
|
+
|
23
28
|
Component.all << subclass
|
24
29
|
end
|
25
30
|
|
@@ -47,6 +52,8 @@ module Cura
|
|
47
52
|
include Attributes::HasRelativeCoordinates
|
48
53
|
include Attributes::HasVisibility
|
49
54
|
|
55
|
+
include Helpers::Component::Drawing
|
56
|
+
|
50
57
|
# Get the cursor for this application.
|
51
58
|
# TODO: Delegate something like: def_delegate(:cursor) { application }
|
52
59
|
#
|
@@ -72,6 +79,17 @@ module Cura
|
|
72
79
|
parent.application
|
73
80
|
end
|
74
81
|
|
82
|
+
# Get the window of this object.
|
83
|
+
#
|
84
|
+
# @return [Application]
|
85
|
+
def window
|
86
|
+
return nil if parent.nil?
|
87
|
+
return nil if parent.is_a?(Cura::Application)
|
88
|
+
return parent if parent.is_a?(Cura::Window)
|
89
|
+
|
90
|
+
parent.window
|
91
|
+
end
|
92
|
+
|
75
93
|
# Focus on this component.
|
76
94
|
#
|
77
95
|
# @return [Component]
|
@@ -116,6 +134,8 @@ module Cura
|
|
116
134
|
#
|
117
135
|
# @return [Component]
|
118
136
|
def update
|
137
|
+
@draw = true
|
138
|
+
|
119
139
|
self
|
120
140
|
end
|
121
141
|
|
@@ -123,14 +143,27 @@ module Cura
|
|
123
143
|
#
|
124
144
|
# @return [Component]
|
125
145
|
def draw
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
146
|
+
return self unless @visible
|
147
|
+
return self unless draw?
|
148
|
+
|
149
|
+
draw_background
|
150
|
+
draw_border
|
130
151
|
|
131
152
|
self
|
132
153
|
end
|
133
154
|
|
155
|
+
# @method draw?
|
156
|
+
# Get whether this component should be drawn.
|
157
|
+
#
|
158
|
+
# @return [Boolean]
|
159
|
+
|
160
|
+
# @method draw=
|
161
|
+
# Set whether this component should be drawn.
|
162
|
+
#
|
163
|
+
# @param [Boolean] value
|
164
|
+
# @return [Boolean]
|
165
|
+
attribute(:draw, query: true)
|
166
|
+
|
134
167
|
# Instance inspection.
|
135
168
|
#
|
136
169
|
# @return [String]
|
@@ -138,56 +171,6 @@ module Cura
|
|
138
171
|
"#<#{self.class}:0x#{__id__.to_s(16)} x=#{x} y=#{y} absolute_x=#{absolute_x} absolute_y=#{absolute_y} w=#{width} h=#{height} parent=#{@parent.class}:0x#{@parent.__id__.to_s(16)}>"
|
139
172
|
end
|
140
173
|
|
141
|
-
protected
|
142
|
-
|
143
|
-
# Draw a point.
|
144
|
-
def draw_point(x, y, color=Cura::Color.black)
|
145
|
-
x = absolute_x + @offsets.left + x
|
146
|
-
y = absolute_y + @offsets.top + y
|
147
|
-
|
148
|
-
pencil.draw_point(x, y, color)
|
149
|
-
end
|
150
|
-
|
151
|
-
# Draw a rectangle.
|
152
|
-
# TODO: filled argument
|
153
|
-
def draw_rectangle(x, y, width, height, color=Cura::Color.black)
|
154
|
-
x = absolute_x + @offsets.left + x
|
155
|
-
y = absolute_y + @offsets.top + y
|
156
|
-
|
157
|
-
pencil.draw_rectangle(x, y, width, height, color)
|
158
|
-
end
|
159
|
-
|
160
|
-
# Draw a single character.
|
161
|
-
def draw_character(x, y, character, foreground=Cura::Color.black, background=Cura::Color.white, bold=false, underline=false)
|
162
|
-
x = absolute_x + @offsets.left + x
|
163
|
-
y = absolute_y + @offsets.top + y
|
164
|
-
|
165
|
-
pencil.draw_character(x, y, character, foreground, background, bold, underline)
|
166
|
-
end
|
167
|
-
|
168
|
-
# Draw text.
|
169
|
-
def draw_text(x, y, text, foreground=Cura::Color.black, background=Cura::Color.white, bold=false, underline=false)
|
170
|
-
x = absolute_x + @offsets.left + x
|
171
|
-
y = absolute_y + @offsets.top + y
|
172
|
-
|
173
|
-
pencil.draw_text(x, y, text, foreground, background, bold, underline)
|
174
|
-
end
|
175
|
-
|
176
|
-
# Draw the background of this component.
|
177
|
-
def draw_background
|
178
|
-
x = absolute_x + @margin.left + @border.left
|
179
|
-
y = absolute_y + @margin.top + @border.top
|
180
|
-
width = self.width + @padding.width
|
181
|
-
height = self.height + @padding.height
|
182
|
-
color = background
|
183
|
-
|
184
|
-
pencil.draw_rectangle(x, y, width, height, color)
|
185
|
-
end
|
186
|
-
|
187
|
-
# Draw the border of this component.
|
188
|
-
def draw_border # TODO
|
189
|
-
end
|
190
|
-
|
191
174
|
def get_or_inherit_color(name, default)
|
192
175
|
value = instance_variable_get("@#{name}")
|
193
176
|
|
data/lib/cura/component/group.rb
CHANGED
data/lib/cura/component/label.rb
CHANGED
@@ -81,6 +81,19 @@ module Cura
|
|
81
81
|
@children[@selected_index]
|
82
82
|
end
|
83
83
|
|
84
|
+
# Set the selected child.
|
85
|
+
#
|
86
|
+
# @param [Component] child
|
87
|
+
# @return [Component]
|
88
|
+
def selected_child=(child)
|
89
|
+
index = @children.index(child)
|
90
|
+
|
91
|
+
return nil if index.nil? # TODO: Raise error?
|
92
|
+
self.selected_index = index
|
93
|
+
|
94
|
+
selected_child
|
95
|
+
end
|
96
|
+
|
84
97
|
# Add a child to this group.
|
85
98
|
#
|
86
99
|
# @param [#to_sym, Component] component_or_type
|
data/lib/cura/component/pack.rb
CHANGED
data/lib/cura/event/base.rb
CHANGED
@@ -9,6 +9,11 @@ module Cura
|
|
9
9
|
# @param [#to_h] options
|
10
10
|
# @option options [Event::Base] :event
|
11
11
|
def call(options={})
|
12
|
+
# TODO: !!!! Refactor
|
13
|
+
return nil if options[:event].nil?
|
14
|
+
return nil if options[:event].target.nil?
|
15
|
+
return nil if !options[:event].target.is_a?(Application) && options[:event].target.application.nil? # TODO: Check if orphaned, maybe log this?
|
16
|
+
|
12
17
|
options[:dispatch_queue] << options[:event]
|
13
18
|
end
|
14
19
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
if Kernel.respond_to?(:require)
|
2
|
+
require "cura/color"
|
3
|
+
end
|
4
|
+
|
5
|
+
module Cura
|
6
|
+
module Helpers
|
7
|
+
module Component
|
8
|
+
|
9
|
+
# Helpers for drawing within components.
|
10
|
+
module Drawing
|
11
|
+
|
12
|
+
protected
|
13
|
+
|
14
|
+
# Draw a point.
|
15
|
+
def draw_point(x, y, color=Cura::Color.black)
|
16
|
+
x = absolute_x + @offsets.left + x
|
17
|
+
y = absolute_y + @offsets.top + y
|
18
|
+
|
19
|
+
pencil.draw_point(x, y, color)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Draw a rectangle.
|
23
|
+
# TODO: filled argument
|
24
|
+
def draw_rectangle(x, y, width, height, color=Cura::Color.black)
|
25
|
+
x = absolute_x + @offsets.left + x
|
26
|
+
y = absolute_y + @offsets.top + y
|
27
|
+
|
28
|
+
pencil.draw_rectangle(x, y, width, height, color)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Draw a single character.
|
32
|
+
def draw_character(x, y, character, foreground=Cura::Color.black, background=Cura::Color.white, bold=false, underline=false)
|
33
|
+
x = absolute_x + @offsets.left + x
|
34
|
+
y = absolute_y + @offsets.top + y
|
35
|
+
|
36
|
+
pencil.draw_character(x, y, character, foreground, background, bold, underline)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Draw text.
|
40
|
+
def draw_text(x, y, text, foreground=Cura::Color.black, background=Cura::Color.white, bold=false, underline=false)
|
41
|
+
x = absolute_x + @offsets.left + x
|
42
|
+
y = absolute_y + @offsets.top + y
|
43
|
+
|
44
|
+
pencil.draw_text(x, y, text, foreground, background, bold, underline)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Draw the background of this component.
|
48
|
+
def draw_background
|
49
|
+
x = absolute_x + @margin.left + @border.left
|
50
|
+
y = absolute_y + @margin.top + @border.top
|
51
|
+
width = self.width + @padding.width
|
52
|
+
height = self.height + @padding.height
|
53
|
+
color = background
|
54
|
+
|
55
|
+
pencil.draw_rectangle(x, y, width, height, color)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Draw the border of this component.
|
59
|
+
def draw_border # TODO
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|