tk_component 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/README.md +3 -1
- data/bin/browser_demo.rb +9 -11
- data/bin/table_view_demo.rb +12 -14
- data/bin/tiles_demo.rb +20 -17
- data/lib/tk_component.rb +3 -8
- data/lib/tk_component/base.rb +3 -113
- data/lib/tk_component/base/base.rb +123 -0
- data/lib/tk_component/{basic_component.rb → base/basic_component.rb} +0 -0
- data/lib/tk_component/{menu.rb → base/menu.rb} +0 -0
- data/lib/tk_component/{window.rb → base/window.rb} +0 -0
- data/lib/tk_component/builder/node.rb +1 -1
- data/lib/tk_component/components.rb +5 -0
- data/lib/tk_component/components/browser_column_component.rb +68 -0
- data/lib/tk_component/{browser_component.rb → components/browser_component.rb} +7 -9
- data/lib/tk_component/{r_browser_component.rb → components/r_browser_component.rb} +8 -10
- data/lib/tk_component/{table_view_component.rb → components/table_view_component.rb} +6 -8
- data/lib/tk_component/extras.rb +1 -0
- data/lib/tk_component/{turtle.rb → extras/turtle.rb} +0 -0
- data/lib/tk_component/version.rb +1 -1
- metadata +13 -11
- data/Gemfile.lock +0 -63
- data/lib/tk_component/browser_column_component.rb +0 -70
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab47775b9e804ad9eed734826438dac14daff031dd710ed2ecda752fb258b090
|
4
|
+
data.tar.gz: 0a70c15c78074b6c1c7a3685863bdb1e76ad334c7be0687494015595717a00de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1486fb9b4a7e12e71635ce7d0e2b83dfff83e9db85ce0e57ca41f93fa9e7d7cb99755e1c672d55dfbba6b42bf657358b801f81389bf9b0ded6422b124fffc96c
|
7
|
+
data.tar.gz: 644ed176397d24a3e513df17e50ad9c3757d9263a8f00feea0041beabb580e19b2ff6bccd93c8c673e333442b60d0f93b28dfd02a0734ef1cb740738acb90b52
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# TkComponent
|
2
2
|
|
3
|
-
TkComponent allows you to create desktop UIs using a component
|
3
|
+
TkComponent allows you to create desktop UIs in Ruby, using a component
|
4
|
+
structure taking advantadge of TK, the UI toolkit created for TCL and
|
5
|
+
used by Python in TkInter.
|
4
6
|
|
5
7
|
Still very much a work in progress.
|
6
8
|
|
data/bin/browser_demo.rb
CHANGED
@@ -24,17 +24,15 @@ class DataSource
|
|
24
24
|
end
|
25
25
|
|
26
26
|
class DemoRoot < TkComponent::Base
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
puts "PathChanged: " + e.data_object.selected_path.to_s
|
37
|
-
end
|
27
|
+
def render(p, parent_component)
|
28
|
+
p.vframe(sticky: 'wens', x_flex: 1, y_flex: 1) do |f|
|
29
|
+
f.label(text: "Directory of #{DataSource.shared.title_for_path(nil, [])}")
|
30
|
+
f.insert_component(TkComponent::BrowserComponent, self,
|
31
|
+
data_source: DataSource.shared,
|
32
|
+
paned: true,
|
33
|
+
sticky: 'nsew', x_flex: 1, y_flex: 1) do |bc|
|
34
|
+
bc.on_event'PathChanged', ->(e) do
|
35
|
+
puts "PathChanged: " + e.data_object.selected_path.to_s
|
38
36
|
end
|
39
37
|
end
|
40
38
|
end
|
data/bin/table_view_demo.rb
CHANGED
@@ -40,20 +40,18 @@ class DataSource
|
|
40
40
|
end
|
41
41
|
|
42
42
|
class DemoRoot < TkComponent::Base
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
sticky: 'nsew', x_flex: 1, y_flex: 1)
|
56
|
-
end
|
43
|
+
def render(p, parent_component)
|
44
|
+
p.vframe(sticky: 'wens', x_flex: 1, y_flex: 1) do |f|
|
45
|
+
f.label(text: "Directory of #{ENV['HOME']}")
|
46
|
+
f.insert_component(TkComponent::TableViewComponent, self,
|
47
|
+
data_source: DataSource.shared,
|
48
|
+
columns: [
|
49
|
+
{ key: :name, text: 'Name' },
|
50
|
+
{ key: :size, text: 'Size' }
|
51
|
+
],
|
52
|
+
nested: true,
|
53
|
+
lazy: true,
|
54
|
+
sticky: 'nsew', x_flex: 1, y_flex: 1)
|
57
55
|
end
|
58
56
|
end
|
59
57
|
end
|
data/bin/tiles_demo.rb
CHANGED
@@ -5,10 +5,14 @@ require "tk_component"
|
|
5
5
|
require "pry"
|
6
6
|
|
7
7
|
class ColorBlock < TkComponent::Base
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
attr_accessor :color
|
9
|
+
def initialize(options = {})
|
10
|
+
super
|
11
|
+
@color = options[:color] || 'white'
|
12
|
+
end
|
13
|
+
|
14
|
+
def render(p, parent_component)
|
15
|
+
p.canvas(background: color, sticky: 'wens', x_flex: 1, y_flex: 1)
|
12
16
|
end
|
13
17
|
end
|
14
18
|
|
@@ -16,19 +20,18 @@ class DemoRoot < TkComponent::Base
|
|
16
20
|
COLORS = %w|red yellow green brown blue orange|
|
17
21
|
ROWS = 10
|
18
22
|
COLUMNS = 10
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
23
|
+
|
24
|
+
def render(p, parent_component)
|
25
|
+
p.frame(sticky: 'wens', x_flex: 1, y_flex: 1) do |f|
|
26
|
+
f.row(sticky: 'wens', x_flex: 1, y_flex: 1) do |r|
|
27
|
+
r.button(text: "Refresh", columnspan: COLUMNS, sticky: 'e') do |b|
|
28
|
+
b.on_click ->(e) { regenerate }
|
26
29
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
30
|
+
end
|
31
|
+
ROWS.times do
|
32
|
+
f.row(sticky: 'wens', x_flex: 1, y_flex: 1) do |r|
|
33
|
+
COLUMNS.times do
|
34
|
+
r.insert_component(ColorBlock, self, color: random_color, sticky: 'nsew', x_flex: 1, y_flex: 1)
|
32
35
|
end
|
33
36
|
end
|
34
37
|
end
|
@@ -40,7 +43,7 @@ class DemoRoot < TkComponent::Base
|
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
43
|
-
@tk_root = TkComponent::Window.new(title: "Demo")
|
46
|
+
@tk_root = TkComponent::Window.new(title: "Demo", root: true)
|
44
47
|
@main_component = DemoRoot.new
|
45
48
|
@tk_root.place_root_component(@main_component)
|
46
49
|
|
data/lib/tk_component.rb
CHANGED
@@ -1,11 +1,6 @@
|
|
1
1
|
require "tk_component/version"
|
2
2
|
require "active_support/all"
|
3
|
-
|
4
|
-
require_relative 'tk_component/basic_component'
|
5
|
-
require_relative 'tk_component/base'
|
6
|
-
require_relative 'tk_component/browser_component'
|
7
|
-
require_relative 'tk_component/r_browser_component'
|
8
|
-
require_relative 'tk_component/table_view_component'
|
9
|
-
require_relative 'tk_component/window'
|
3
|
+
require_relative "tk_component/base"
|
10
4
|
require_relative 'tk_component/builder'
|
11
|
-
require_relative
|
5
|
+
require_relative "tk_component/components"
|
6
|
+
require_relative "tk_component/extras"
|
data/lib/tk_component/base.rb
CHANGED
@@ -1,113 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
module TkComponent
|
5
|
-
class Base
|
6
|
-
|
7
|
-
attr_accessor :tk_item
|
8
|
-
attr_accessor :parent
|
9
|
-
attr_accessor :parent_node
|
10
|
-
attr_accessor :children
|
11
|
-
attr_accessor :node
|
12
|
-
|
13
|
-
include BasicComponent
|
14
|
-
|
15
|
-
def initialize(options = {})
|
16
|
-
@parent = options[:parent]
|
17
|
-
@parent_node = options[:parent_node]
|
18
|
-
@children = []
|
19
|
-
end
|
20
|
-
|
21
|
-
def parse_component(parent_component, options = {})
|
22
|
-
raise "You need to provide a block" unless block_given?
|
23
|
-
@node = Builder::Node.new(:top, options)
|
24
|
-
yield(@node)
|
25
|
-
binding.pry if @node.sub_nodes.size != 1
|
26
|
-
raise "Components need to have a single root node" unless @node.sub_nodes.size == 1
|
27
|
-
@node.prepare_option_events(self)
|
28
|
-
@node.prepare_grid
|
29
|
-
@node = @node.sub_nodes.first # Get rid of the dummy top node
|
30
|
-
end
|
31
|
-
|
32
|
-
def parse_nodes(parent_node, options = {})
|
33
|
-
old_sub_nodes = parent_node.sub_nodes.dup
|
34
|
-
yield(parent_node)
|
35
|
-
new_sub_nodes = parent_node.sub_nodes - old_sub_nodes
|
36
|
-
new_sub_nodes.each { |n| n.prepare_option_events(self) }
|
37
|
-
parent_node.prepare_grid
|
38
|
-
new_sub_nodes
|
39
|
-
end
|
40
|
-
|
41
|
-
def build(parent_component)
|
42
|
-
@node.build(@parent_node, parent_component)
|
43
|
-
component_did_build
|
44
|
-
children.each do |c|
|
45
|
-
c.build(self)
|
46
|
-
TkGrid.columnconfigure c.parent_node.tk_item.native_item, 0, weight: 1
|
47
|
-
TkGrid.rowconfigure c.parent_node.tk_item.native_item, 0, weight: 1
|
48
|
-
TkGrid.columnconfigure c.node.tk_item.native_item, 0, weight: 1
|
49
|
-
TkGrid.rowconfigure c.node.tk_item.native_item, 0, weight: 1
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def regenerate
|
54
|
-
old_node = @node
|
55
|
-
old_children = @children
|
56
|
-
@children = []
|
57
|
-
generate(parent)
|
58
|
-
rebuild(old_node)
|
59
|
-
@children.each do |c|
|
60
|
-
c.generate(self)
|
61
|
-
c.build(self)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def regenerate_from_node(node, parent_node, options = {}, &block)
|
66
|
-
regenerate_from_index(parent_node, parent_node.sub_nodes.index(node), options, &block)
|
67
|
-
end
|
68
|
-
|
69
|
-
def regenerate_after_node(node, parent_node, options = {}, &block)
|
70
|
-
return if parent_node.sub_nodes.index(node).nil?
|
71
|
-
regenerate_from_index(parent_node, parent_node.sub_nodes.index(node) + 1, options, &block)
|
72
|
-
end
|
73
|
-
|
74
|
-
def regenerate_from_index(parent_node, index, options = {}, &block)
|
75
|
-
old_children = @children.dup
|
76
|
-
to_remove = parent_node.sub_nodes.slice!(index..-1)
|
77
|
-
to_remove.each do |n|
|
78
|
-
n.remove
|
79
|
-
end
|
80
|
-
new_sub_nodes = parse_nodes(parent_node, options, &block)
|
81
|
-
new_children = @children - old_children
|
82
|
-
new_sub_nodes.each do |n|
|
83
|
-
n.build(parent_node, self)
|
84
|
-
end
|
85
|
-
new_children.each do |c|
|
86
|
-
c.generate(self)
|
87
|
-
c.build(self)
|
88
|
-
end
|
89
|
-
parent_node.apply_grid
|
90
|
-
parent_node.built
|
91
|
-
end
|
92
|
-
|
93
|
-
def rebuild(old_node)
|
94
|
-
build(parent)
|
95
|
-
end
|
96
|
-
|
97
|
-
def name
|
98
|
-
self.class.name
|
99
|
-
end
|
100
|
-
|
101
|
-
def emit(event_name)
|
102
|
-
TkComponent::Builder::Event.emit(event_name, parent_node.native_item, self.object_id)
|
103
|
-
end
|
104
|
-
|
105
|
-
def component_did_build
|
106
|
-
end
|
107
|
-
|
108
|
-
def add_child(child)
|
109
|
-
binding.pry if children.nil?
|
110
|
-
children << child
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
1
|
+
require_relative 'base/basic_component'
|
2
|
+
require_relative 'base/base'
|
3
|
+
require_relative 'base/window'
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'tk'
|
2
|
+
require 'tkextlib/tile'
|
3
|
+
|
4
|
+
module TkComponent
|
5
|
+
class Base
|
6
|
+
|
7
|
+
attr_accessor :tk_item
|
8
|
+
attr_accessor :parent
|
9
|
+
attr_accessor :parent_node
|
10
|
+
attr_accessor :children
|
11
|
+
attr_accessor :node
|
12
|
+
|
13
|
+
include BasicComponent
|
14
|
+
|
15
|
+
def initialize(options = {})
|
16
|
+
@parent = options[:parent]
|
17
|
+
@parent_node = options[:parent_node]
|
18
|
+
@children = []
|
19
|
+
end
|
20
|
+
|
21
|
+
def render(p, parent_component)
|
22
|
+
raise "Component #{self.class.to_s} needs to have a 'render' method"
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate(parent_component)
|
26
|
+
parse_component(parent_component) do |p|
|
27
|
+
render(p, parent_component)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def parse_component(parent_component)
|
32
|
+
raise "You need to provide a block" unless block_given?
|
33
|
+
@node = Builder::Node.new(:top)
|
34
|
+
yield(@node)
|
35
|
+
binding.pry if @node.sub_nodes.size != 1
|
36
|
+
raise "Components need to have a single root node" unless @node.sub_nodes.size == 1
|
37
|
+
@node.prepare_option_events(self)
|
38
|
+
@node.prepare_grid
|
39
|
+
@node = @node.sub_nodes.first # Get rid of the dummy top node
|
40
|
+
end
|
41
|
+
|
42
|
+
def parse_nodes(parent_node, options = {})
|
43
|
+
old_sub_nodes = parent_node.sub_nodes.dup
|
44
|
+
yield(parent_node)
|
45
|
+
new_sub_nodes = parent_node.sub_nodes - old_sub_nodes
|
46
|
+
new_sub_nodes.each { |n| n.prepare_option_events(self) }
|
47
|
+
parent_node.prepare_grid
|
48
|
+
new_sub_nodes
|
49
|
+
end
|
50
|
+
|
51
|
+
def build(parent_component)
|
52
|
+
@node.build(@parent_node, parent_component)
|
53
|
+
component_did_build
|
54
|
+
children.each do |c|
|
55
|
+
c.build(self)
|
56
|
+
TkGrid.columnconfigure c.parent_node.tk_item.native_item, 0, weight: 1
|
57
|
+
TkGrid.rowconfigure c.parent_node.tk_item.native_item, 0, weight: 1
|
58
|
+
TkGrid.columnconfigure c.node.tk_item.native_item, 0, weight: 1
|
59
|
+
TkGrid.rowconfigure c.node.tk_item.native_item, 0, weight: 1
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def regenerate
|
64
|
+
old_node = @node
|
65
|
+
old_children = @children
|
66
|
+
@children = []
|
67
|
+
generate(parent)
|
68
|
+
rebuild(old_node)
|
69
|
+
@children.each do |c|
|
70
|
+
c.generate(self)
|
71
|
+
c.build(self)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def regenerate_from_node(node, parent_node, &block)
|
76
|
+
regenerate_from_index(parent_node, parent_node.sub_nodes.index(node), &block)
|
77
|
+
end
|
78
|
+
|
79
|
+
def regenerate_after_node(node, parent_node, &block)
|
80
|
+
return if parent_node.sub_nodes.index(node).nil?
|
81
|
+
regenerate_from_index(parent_node, parent_node.sub_nodes.index(node) + 1, &block)
|
82
|
+
end
|
83
|
+
|
84
|
+
def regenerate_from_index(parent_node, index, &block)
|
85
|
+
old_children = @children.dup
|
86
|
+
to_remove = parent_node.sub_nodes.slice!(index..-1)
|
87
|
+
to_remove.each do |n|
|
88
|
+
n.remove
|
89
|
+
end
|
90
|
+
new_sub_nodes = parse_nodes(parent_node, &block)
|
91
|
+
new_children = @children - old_children
|
92
|
+
new_sub_nodes.each do |n|
|
93
|
+
n.build(parent_node, self)
|
94
|
+
end
|
95
|
+
new_children.each do |c|
|
96
|
+
c.generate(self)
|
97
|
+
c.build(self)
|
98
|
+
end
|
99
|
+
parent_node.apply_grid
|
100
|
+
parent_node.built
|
101
|
+
end
|
102
|
+
|
103
|
+
def rebuild(old_node)
|
104
|
+
build(parent)
|
105
|
+
end
|
106
|
+
|
107
|
+
def name
|
108
|
+
self.class.name
|
109
|
+
end
|
110
|
+
|
111
|
+
def emit(event_name)
|
112
|
+
TkComponent::Builder::Event.emit(event_name, parent_node.native_item, self.object_id)
|
113
|
+
end
|
114
|
+
|
115
|
+
def component_did_build
|
116
|
+
end
|
117
|
+
|
118
|
+
def add_child(child)
|
119
|
+
binding.pry if children.nil?
|
120
|
+
children << child
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -50,7 +50,7 @@ module TkComponent
|
|
50
50
|
layout_options = options.slice(*LAYOUT_OPTIONS)
|
51
51
|
c_node = node_from_command(:frame, layout_options, &block)
|
52
52
|
comp = component_class.new(options.merge(parent: parent_component, parent_node: c_node))
|
53
|
-
comp.generate(parent_component
|
53
|
+
comp.generate(parent_component)
|
54
54
|
parent_component.add_child(comp)
|
55
55
|
comp
|
56
56
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module TkComponent
|
2
|
+
class BrowserColumnComponent < TkComponent::Base
|
3
|
+
|
4
|
+
attr_accessor :browser
|
5
|
+
attr_accessor :column_index
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
super
|
9
|
+
@browser = options[:browser]
|
10
|
+
@column_index = options[:column_index] || 0
|
11
|
+
end
|
12
|
+
|
13
|
+
def render(p, parent_component)
|
14
|
+
if @column_index <= @browser.selected_path.size
|
15
|
+
current_item = @browser.selected_path[@column_index]
|
16
|
+
path_so_far = @browser.selected_path.slice(0, @column_index)
|
17
|
+
items = @browser.data_source.items_for_path(path_so_far)
|
18
|
+
items ||= []
|
19
|
+
else
|
20
|
+
items = []
|
21
|
+
current_item = nil
|
22
|
+
end
|
23
|
+
command = @browser.paned ? :hpaned : :hframe
|
24
|
+
p.send(command, sticky: 'nsew', x_flex: 1, y_flex: 1) do |f|
|
25
|
+
@tree = f.tree(sticky: 'nsew', x_flex: 1, y_flex: 1,
|
26
|
+
on_select: :select_item,
|
27
|
+
scrollers: 'y', heading: @browser.data_source.title_for_path(path_so_far, items)) do |t|
|
28
|
+
items.each do |item|
|
29
|
+
t.tree_node(at: 'end',
|
30
|
+
text: item,
|
31
|
+
selected: item == current_item)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
if (@browser.max_columns.blank? || @browser.max_columns > @column_index + 1) &&
|
35
|
+
(@column_index < @browser.selected_path.size || items.present?)
|
36
|
+
f.hframe(sticky: 'nsew', x_flex: 1, y_flex: 1) do |hf|
|
37
|
+
@next_column = hf.insert_component(TkComponent::BrowserColumnComponent, self,
|
38
|
+
browser: @browser,
|
39
|
+
column_index: @column_index + 1,
|
40
|
+
sticky: 'nsew', x_flex: 1, y_flex: 1) do |bc|
|
41
|
+
bc.on_event 'ItemSelected', ->(e) do
|
42
|
+
emit('ItemSelected')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def component_did_build
|
51
|
+
show_current_selection
|
52
|
+
end
|
53
|
+
|
54
|
+
def show_current_selection
|
55
|
+
@tree.tk_item.scroll_to_selection
|
56
|
+
end
|
57
|
+
|
58
|
+
def select_item(e)
|
59
|
+
item = e.sender.native_item.selection&.first.text.to_s
|
60
|
+
return if @browser.selected_path[@column_index] == item
|
61
|
+
@browser.selected_path[@column_index] = item
|
62
|
+
@browser.selected_path.slice!(@column_index + 1..-1) if @column_index < @browser.selected_path.size - 1
|
63
|
+
puts "New selected path: #{@browser.selected_path}"
|
64
|
+
@next_column&.regenerate
|
65
|
+
emit('ItemSelected')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -13,15 +13,13 @@ module TkComponent
|
|
13
13
|
@trees = []
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
generate_from_level(f, 0)
|
24
|
-
end
|
16
|
+
def render(p, parent_component)
|
17
|
+
partial_path = []
|
18
|
+
@trees = []
|
19
|
+
p.vframe(sticky: 'nsew', x_flex: 1, y_flex: 1) do |vf|
|
20
|
+
command = @paned ? :hpaned : :hframe
|
21
|
+
@trees_container = vf.send(command, sticky: 'nsew', x_flex: 1, y_flex: 1) do |f|
|
22
|
+
generate_from_level(f, 0)
|
25
23
|
end
|
26
24
|
end
|
27
25
|
end
|
@@ -16,16 +16,14 @@ module TkComponent
|
|
16
16
|
@max_columns = options[:max_columns]
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
emit('PathChanged')
|
28
|
-
end
|
19
|
+
def render(p, parent_component)
|
20
|
+
p.insert_component(TkComponent::BrowserColumnComponent, self,
|
21
|
+
browser: self,
|
22
|
+
column_index: 0,
|
23
|
+
sticky: 'nsew', x_flex: 1, y_flex: 1) do |bc|
|
24
|
+
bc.on_event 'ItemSelected', ->(e) do
|
25
|
+
puts "ItemSelected"
|
26
|
+
emit('PathChanged')
|
29
27
|
end
|
30
28
|
end
|
31
29
|
end
|
@@ -17,15 +17,13 @@ module TkComponent
|
|
17
17
|
@to_load = {}
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
20
|
+
def render(p, parent_component)
|
21
21
|
@to_load = {}
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
)
|
28
|
-
end
|
22
|
+
@tree = p.tree(sticky: 'nsew', x_flex: 1, y_flex: 1, scrollers: @scrollers,
|
23
|
+
column_defs: columns,
|
24
|
+
on_item_open: :item_open,
|
25
|
+
on_select: :item_selected
|
26
|
+
)
|
29
27
|
end
|
30
28
|
|
31
29
|
def component_did_build
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'extras/turtle'
|
File without changes
|
data/lib/tk_component/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tk_component
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josep Egea
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tk
|
@@ -98,7 +98,6 @@ files:
|
|
98
98
|
- ".travis.yml"
|
99
99
|
- CODE_OF_CONDUCT.md
|
100
100
|
- Gemfile
|
101
|
-
- Gemfile.lock
|
102
101
|
- LICENSE.txt
|
103
102
|
- README.md
|
104
103
|
- Rakefile
|
@@ -109,21 +108,24 @@ files:
|
|
109
108
|
- bin/tiles_demo.rb
|
110
109
|
- lib/tk_component.rb
|
111
110
|
- lib/tk_component/base.rb
|
112
|
-
- lib/tk_component/
|
113
|
-
- lib/tk_component/
|
114
|
-
- lib/tk_component/
|
111
|
+
- lib/tk_component/base/base.rb
|
112
|
+
- lib/tk_component/base/basic_component.rb
|
113
|
+
- lib/tk_component/base/menu.rb
|
114
|
+
- lib/tk_component/base/window.rb
|
115
115
|
- lib/tk_component/builder.rb
|
116
116
|
- lib/tk_component/builder/event.rb
|
117
117
|
- lib/tk_component/builder/event_handler.rb
|
118
118
|
- lib/tk_component/builder/grid_map.rb
|
119
119
|
- lib/tk_component/builder/node.rb
|
120
120
|
- lib/tk_component/builder/tk_item.rb
|
121
|
-
- lib/tk_component/
|
122
|
-
- lib/tk_component/
|
123
|
-
- lib/tk_component/
|
124
|
-
- lib/tk_component/
|
121
|
+
- lib/tk_component/components.rb
|
122
|
+
- lib/tk_component/components/browser_column_component.rb
|
123
|
+
- lib/tk_component/components/browser_component.rb
|
124
|
+
- lib/tk_component/components/r_browser_component.rb
|
125
|
+
- lib/tk_component/components/table_view_component.rb
|
126
|
+
- lib/tk_component/extras.rb
|
127
|
+
- lib/tk_component/extras/turtle.rb
|
125
128
|
- lib/tk_component/version.rb
|
126
|
-
- lib/tk_component/window.rb
|
127
129
|
- tk_component.gemspec
|
128
130
|
homepage: https://github.com/josepegea/tk_component
|
129
131
|
licenses:
|
data/Gemfile.lock
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
tk_component (0.1.2)
|
5
|
-
activesupport (~> 6.0.3)
|
6
|
-
tk (~> 0.3.0)
|
7
|
-
|
8
|
-
GEM
|
9
|
-
remote: https://rubygems.org/
|
10
|
-
specs:
|
11
|
-
activesupport (6.0.3.4)
|
12
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
13
|
-
i18n (>= 0.7, < 2)
|
14
|
-
minitest (~> 5.1)
|
15
|
-
tzinfo (~> 1.1)
|
16
|
-
zeitwerk (~> 2.2, >= 2.2.2)
|
17
|
-
byebug (11.1.3)
|
18
|
-
coderay (1.1.3)
|
19
|
-
concurrent-ruby (1.1.8)
|
20
|
-
diff-lcs (1.4.4)
|
21
|
-
i18n (1.8.7)
|
22
|
-
concurrent-ruby (~> 1.0)
|
23
|
-
method_source (1.0.0)
|
24
|
-
minitest (5.14.3)
|
25
|
-
pry (0.13.1)
|
26
|
-
coderay (~> 1.1)
|
27
|
-
method_source (~> 1.0)
|
28
|
-
pry-byebug (3.9.0)
|
29
|
-
byebug (~> 11.0)
|
30
|
-
pry (~> 0.13.0)
|
31
|
-
rake (10.5.0)
|
32
|
-
rspec (3.10.0)
|
33
|
-
rspec-core (~> 3.10.0)
|
34
|
-
rspec-expectations (~> 3.10.0)
|
35
|
-
rspec-mocks (~> 3.10.0)
|
36
|
-
rspec-core (3.10.0)
|
37
|
-
rspec-support (~> 3.10.0)
|
38
|
-
rspec-expectations (3.10.0)
|
39
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
40
|
-
rspec-support (~> 3.10.0)
|
41
|
-
rspec-mocks (3.10.0)
|
42
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
43
|
-
rspec-support (~> 3.10.0)
|
44
|
-
rspec-support (3.10.0)
|
45
|
-
thread_safe (0.3.6)
|
46
|
-
tk (0.3.0)
|
47
|
-
tzinfo (1.2.9)
|
48
|
-
thread_safe (~> 0.1)
|
49
|
-
zeitwerk (2.4.2)
|
50
|
-
|
51
|
-
PLATFORMS
|
52
|
-
ruby
|
53
|
-
|
54
|
-
DEPENDENCIES
|
55
|
-
bundler (~> 1.16)
|
56
|
-
pry
|
57
|
-
pry-byebug
|
58
|
-
rake (~> 10.0)
|
59
|
-
rspec (~> 3.0)
|
60
|
-
tk_component!
|
61
|
-
|
62
|
-
BUNDLED WITH
|
63
|
-
1.16.6
|
@@ -1,70 +0,0 @@
|
|
1
|
-
module TkComponent
|
2
|
-
class BrowserColumnComponent < TkComponent::Base
|
3
|
-
|
4
|
-
attr_accessor :browser
|
5
|
-
attr_accessor :column_index
|
6
|
-
|
7
|
-
def initialize(options = {})
|
8
|
-
super
|
9
|
-
@browser = options[:browser]
|
10
|
-
@column_index = options[:column_index] || 0
|
11
|
-
end
|
12
|
-
|
13
|
-
def generate(parent_component, options = {})
|
14
|
-
parse_component(parent_component, options) do |p|
|
15
|
-
if @column_index <= @browser.selected_path.size
|
16
|
-
current_item = @browser.selected_path[@column_index]
|
17
|
-
path_so_far = @browser.selected_path.slice(0, @column_index)
|
18
|
-
items = @browser.data_source.items_for_path(path_so_far)
|
19
|
-
items ||= []
|
20
|
-
else
|
21
|
-
items = []
|
22
|
-
current_item = nil
|
23
|
-
end
|
24
|
-
command = @browser.paned ? :hpaned : :hframe
|
25
|
-
p.send(command, sticky: 'nsew', x_flex: 1, y_flex: 1) do |f|
|
26
|
-
@tree = f.tree(sticky: 'nsew', x_flex: 1, y_flex: 1,
|
27
|
-
on_select: :select_item,
|
28
|
-
scrollers: 'y', heading: @browser.data_source.title_for_path(path_so_far, items)) do |t|
|
29
|
-
items.each do |item|
|
30
|
-
t.tree_node(at: 'end',
|
31
|
-
text: item,
|
32
|
-
selected: item == current_item)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
if (@browser.max_columns.blank? || @browser.max_columns > @column_index + 1) &&
|
36
|
-
(@column_index < @browser.selected_path.size || items.present?)
|
37
|
-
f.hframe(sticky: 'nsew', x_flex: 1, y_flex: 1) do |hf|
|
38
|
-
@next_column = hf.insert_component(TkComponent::BrowserColumnComponent, self,
|
39
|
-
browser: @browser,
|
40
|
-
column_index: @column_index + 1,
|
41
|
-
sticky: 'nsew', x_flex: 1, y_flex: 1) do |bc|
|
42
|
-
bc.on_event 'ItemSelected', ->(e) do
|
43
|
-
emit('ItemSelected')
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def component_did_build
|
53
|
-
show_current_selection
|
54
|
-
end
|
55
|
-
|
56
|
-
def show_current_selection
|
57
|
-
@tree.tk_item.scroll_to_selection
|
58
|
-
end
|
59
|
-
|
60
|
-
def select_item(e)
|
61
|
-
item = e.sender.native_item.selection&.first.text.to_s
|
62
|
-
return if @browser.selected_path[@column_index] == item
|
63
|
-
@browser.selected_path[@column_index] = item
|
64
|
-
@browser.selected_path.slice!(@column_index + 1..-1) if @column_index < @browser.selected_path.size - 1
|
65
|
-
puts "New selected path: #{@browser.selected_path}"
|
66
|
-
@next_column&.regenerate
|
67
|
-
emit('ItemSelected')
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|