tkwrapper 1.0.2 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: adff2bad961cbadb878bb2abbe0a6fbc94ff538889b6460dedea974821743874
4
- data.tar.gz: f2ef0b44bc561ebe718e68197348974d6c85973dfe9a2f95f73a8b30229c7450
3
+ metadata.gz: 81c1971220f794d1e17288aac5b75221393727be934288a4993a621c35b3282d
4
+ data.tar.gz: f2a841f6f3a6a7ee040c85fe0f2081234780bf1ff0bf4aeb70de9cf4c2a75055
5
5
  SHA512:
6
- metadata.gz: '0032648213c0a318b02756bf63dbef4e6375f3af1554c94cb369c858a0ed2be7c2f17456493429e5f32ed62b65ad1710f63599d3ae98f1a585596f52ecc612c7'
7
- data.tar.gz: 0c737c6ebe8f1d06ae6061f8666066663abb41ee4be1317be3e2701da815f892ede6fca30db77ddf17adff726e99f6ebdc765c6f33ceb57fdeb6d13e5dac7f34
6
+ metadata.gz: 22cf843324096411be2441088df910d723ecc353aa6b54dd64ba5703b2fcd47bec3c2424a38e910fefb187fdcf23ec60dd44640de3f0657a3cb2969e84da016c
7
+ data.tar.gz: acb296b0e78c570e7d80ba96d91c4ebf62ecfd1ce7c97fac088546d599e0468a23dafac325ee14ae9fa0d4d08a9c8c70e5972df849346a05d8e2ac3ee9fb1154
data/lib/tkwrapper.rb CHANGED
@@ -7,5 +7,6 @@ module TkWrapper end
7
7
  require_relative 'widgets/widgets'
8
8
 
9
9
  module TkWrapper
10
+ Manager = TkWrapper::Widgets::Base::Manager
10
11
  Widget = TkWrapper::Widgets::Base::Widget
11
12
  end
@@ -19,12 +19,9 @@ module Util
19
19
  end
20
20
  end
21
21
 
22
- def self.recursive_transform_key_value!(hash, &block)
23
- hash.transform_keys! do |key|
24
- value = hash[key]
25
- next recursive_transform_key_value!(value, &block) if value.is_a?(Hash)
26
-
27
- block.call(key, value)
22
+ def self.clone_recursive(hash)
23
+ hash.transform_values do |value|
24
+ value.is_a?(Hash) ? clone_recursive(value) : value
28
25
  end
29
26
  end
30
27
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'tk'
4
+
5
+ class TkWrapper::Util::Tk::Cell
6
+ def initialize(widget)
7
+ @widget = widget
8
+ end
9
+
10
+ # returns the bounding box of the tk_widget
11
+ def bbox
12
+ return unless (container = container_parent)
13
+
14
+ grid_info = TkGrid.info(@widget.tk_widget)
15
+ start_col = grid_info['column']
16
+ end_col = start_col + grid_info['columnspan'] - 1
17
+ start_row = grid_info['row']
18
+ end_row = start_row + grid_info['rowspan'] - 1
19
+
20
+ TkGrid.bbox(container.tk_widget, start_col, start_row, end_col, end_row)
21
+ end
22
+
23
+ private
24
+
25
+ # the first parent, which contains a tk_widget, which is really different
26
+ # from self.tk_widget
27
+ def container_parent
28
+ container = @widget.parent
29
+ while container.tk_widget == @widget.tk_widget
30
+ return unless container.parent # not in a grid?
31
+
32
+ container = container.parent
33
+ end
34
+ container
35
+ end
36
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "#{LIB_DIR}/widgets/base/manager"
4
+ require "#{LIB_DIR}/widgets/base/matcher"
5
+ require_relative 'tk'
6
+
7
+ class TkWrapper::Util::Tk::Finder
8
+ Matcher = TkWrapper::Widgets::Base::Matcher
9
+
10
+ def initialize(widgets: nil)
11
+ @widgets = widgets
12
+ end
13
+
14
+ def each_widget_match(widgets, matchers, &block)
15
+ widgets.each do |widget|
16
+ widget.ids.each do |id|
17
+ matchers.each do |matcher|
18
+ (match = matcher.match(id, widget)) && block.call(match)
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ def find(comparators, widgets = @widgets)
25
+ matchers = create_value_matchers(comparators)
26
+
27
+ each_widget_match(widgets, matchers) do |match|
28
+ return match.widget if match
29
+ end
30
+ end
31
+
32
+ def find_all(comparators, widgets = @widgets)
33
+ matchers = create_value_matchers(comparators)
34
+ matches = TkWrapper::Widgets::Base::Matches.new
35
+
36
+ each_widget_match(widgets, matchers) do |match|
37
+ matches.push(match)
38
+ end
39
+
40
+ matches
41
+ end
42
+
43
+ private
44
+
45
+ def create_value_matchers(comparators)
46
+ comparators = [comparators] unless comparators.is_a?(Array)
47
+ comparators.map { |comparator| Matcher.new(comparator: comparator) }
48
+ end
49
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tk'
4
+ require 'forwardable'
5
+
6
+ require_relative 'tk'
7
+
8
+ class TkWrapper::Util::Tk::Font
9
+ def initialize(tk_widget)
10
+ @tk_widget = tk_widget
11
+ end
12
+
13
+ %i[family size weight slant underline overstrike].each do |option|
14
+ define_method("#{option}=") do |value, **args|
15
+ load unless @config
16
+ args[:update] ||= false
17
+ @config[option] = value
18
+ update if args[:update]
19
+ end
20
+
21
+ define_method(option) do
22
+ load unless @config
23
+ @config[option]
24
+ end
25
+ end
26
+
27
+ def with_update(&block)
28
+ block.call(self)
29
+ update
30
+ end
31
+
32
+ def method_missing(method, *args)
33
+ if TkFont.respond_to?(method)
34
+ TkFont.send(method, @tk_widget.font, *args)
35
+ else
36
+ super
37
+ end
38
+ end
39
+
40
+ def respond_to_missing?(method, *)
41
+ TkFont.respond_to?(method) || super
42
+ end
43
+
44
+ def load
45
+ @config = TkFont.actual(@tk_widget.font).to_h.transform_keys(&:to_sym)
46
+ end
47
+
48
+ def update
49
+ @tk_widget.font = TkFont.new(@config)
50
+ end
51
+ end
data/lib/util/tk/tk.rb ADDED
@@ -0,0 +1,8 @@
1
+ module TkWrapper
2
+ module Util
3
+ module Tk
4
+ end
5
+ end
6
+ end
7
+
8
+ require_relative 'font'
@@ -4,57 +4,31 @@ class TkWrapper::Widgets::AutoResizeEntry < TkWrapper::Widgets::Entry
4
4
  # auto resizes on user input, only works if in the grid geometry manager of tk
5
5
  attr_accessor :min_width, :add_width
6
6
 
7
- def initialize(config: {}, childs: [])
8
- @min_width = config.delete(:min_width) || 0
9
- @add_width = config.delete(:add_width) || 0
10
- super(config: config, childs: childs)
7
+ def initialize(**args)
8
+ @min_width = args[:config][:min_width] || 0
9
+ @add_width = args[:config][:add_width] || 0
10
+ super(**args)
11
11
  end
12
12
 
13
- def build(parent, configure: true)
14
- super(parent, configure: configure)
13
+ def build(parent, **args)
14
+ super(parent, **args)
15
15
  parent.tk_widget.bind('Configure') { resize }
16
16
  tk_widget.textvariable = TkVariable.new unless tk_widget.textvariable
17
17
  tk_widget.textvariable.trace('write') { resize }
18
18
  resize
19
19
  end
20
20
 
21
- def config_for_dummy_label
22
- grid_info = TkGrid.info(tk_widget)
23
- { config: { grid: {
24
- row: grid_info['row'],
25
- column: grid_info['column'],
26
- columnspan: grid_info['columnspan'],
27
- sticky: 'nw'
28
- } } }
21
+ def value=(value)
22
+ tk_widget.textvariable.value = value
29
23
  end
30
24
 
31
- def create_dummy_label_with_same_size(&block)
32
- label = TkWrapper::Widgets::Label.new(**config_for_dummy_label)
33
- label.build(@parent)
34
- label.tk_widget.text = tk_widget.textvariable.value
35
- label.tk_widget.lower
36
- result = block.call(label)
37
- label.tk_widget.destroy
38
- result
39
- end
40
-
41
- def text_width_in_pixel
42
- create_dummy_label_with_same_size do |label|
43
- @parent.tk_widget.update
44
- label.tk_widget.winfo_width
45
- end
46
- end
47
-
48
- def textwidth_and_maxwidth_in_pixel
49
- create_dummy_frame_with_same_size_label do |frame, label|
50
- { text_width: label.tk_widget.winfo_width,
51
- max_width: frame.tk_widget.winfo_width }
52
- end
25
+ def value
26
+ tk_widget.textvariable.value
53
27
  end
54
28
 
55
29
  def resize
56
- max_width = cell_bbox[2]
57
- text_width = text_width_in_pixel
30
+ max_width = @cell.bbox[2]
31
+ text_width = @font.measure(value)
58
32
  new_width = [[@min_width, text_width + @add_width].max, max_width].min
59
33
  tk_widget.width = 0
60
34
  tk_widget.grid(ipadx: new_width / 2.0)
@@ -5,3 +5,4 @@ module TkWrapper::Widgets::Base end
5
5
  require_relative 'widget'
6
6
  require_relative 'manager'
7
7
  require_relative 'configuration'
8
+ require_relative 'matches'
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'matcher'
4
+
5
+ class TkWrapper::Widgets::Base::ComparatorItemStore
6
+ Matcher = TkWrapper::Widgets::Base::Matcher
7
+
8
+ def initialize
9
+ @key_map = {} # for fast lookup
10
+ @comparator_map = {} # for lookup using comparisons by Matcher class
11
+ end
12
+
13
+ def push(key, *items)
14
+ if [String, Symbol].include?(key)
15
+ (@key_map[key] ||= []).concat(items)
16
+ else
17
+ (@comparator_map[key] ||= []).concat(items)
18
+ end
19
+ end
20
+
21
+ # returns [{items: [...], match: Match}, {items: [...]}, ...]
22
+ def items_and_matches_for_widget(widget)
23
+ widget.ids.reduce([]) do |items, id|
24
+ items + items_from_key_map(id) + items_from_comparator_map(id, widget)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def items_from_key_map(id)
31
+ (items = @key_map[id]) ? [{ items: items }] : []
32
+ end
33
+
34
+ def items_from_comparator_map(id, widget)
35
+ matcher = Matcher.new(value: id)
36
+
37
+ @comparator_map.filter_map do |(comparator, items)|
38
+ (m = matcher.match(comparator, widget)) && { items: items, match: m }
39
+ end
40
+ end
41
+ end
@@ -5,7 +5,7 @@ require "#{LIB_DIR}/util/hash_recursive.rb"
5
5
  require_relative 'base'
6
6
 
7
7
  class TkWrapper::Widgets::Base::Configuration
8
- attr_accessor :config
8
+ attr_reader :config
9
9
 
10
10
  GRID_SPECIAL_VALUES = {
11
11
  onecell: {
@@ -20,32 +20,24 @@ class TkWrapper::Widgets::Base::Configuration
20
20
  }
21
21
  }.freeze
22
22
 
23
- NON_TK_OPTIONS = %i[id tk_class tearoff weights menu].freeze
23
+ NON_TK_OPTIONS = %i[
24
+ tk_class tearoff weights menu min_width add_width
25
+ ].freeze
24
26
 
25
27
  def initialize(config)
26
- @config = parse!(config)
28
+ @config = parse_and_clone(config)
27
29
  end
28
30
 
29
- def merge!(*configurations)
31
+ def merge(*configurations)
30
32
  configurations = configurations.map do |configuration|
31
- next configuration.config if configuration.is_a?(self.class)
33
+ configuration = configuration.config if configuration.is_a?(self.class)
32
34
 
33
- parse!(configuration)
35
+ parse_and_clone(configuration)
34
36
  end
35
37
 
36
38
  Util.merge_recursive!(@config, *configurations)
37
39
  end
38
40
 
39
- def parse!(config)
40
- Util.each_recursive(config) do |hash, key, value|
41
- next if value.is_a?(Hash)
42
-
43
- hash[key] = parse_value(key, value)
44
- end
45
-
46
- config
47
- end
48
-
49
41
  def [](key)
50
42
  key = key.to_sym
51
43
  return self.class.new(@config[key]) if @config[key].is_a?(Hash)
@@ -55,7 +47,13 @@ class TkWrapper::Widgets::Base::Configuration
55
47
 
56
48
  def []=(key, value)
57
49
  key = key.to_sym
58
- @config[key] = parse_value(key, value)
50
+ @config[key] = parse_and_clone(value, key)
51
+ end
52
+
53
+ def parse_and_clone(value, key = nil)
54
+ return parse_value(key, value) unless value.is_a?(Hash)
55
+
56
+ value.each_with_object({}) { |(k, v), h| h[k] = parse_and_clone(v, k) }
59
57
  end
60
58
 
61
59
  def parse_value(key, value)
@@ -114,6 +112,8 @@ class TkWrapper::Widgets::Base::Configuration
114
112
  end
115
113
 
116
114
  def merge_global_configurations(manager, widget)
117
- merge!(*manager.configurations(widget))
115
+ return unless manager
116
+
117
+ merge(*manager.configurations(widget))
118
118
  end
119
119
  end
@@ -1,32 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # manages widgets and their global configurations
3
+ require_relative 'comparator_item_store'
4
+
4
5
  class TkWrapper::Widgets::Base::Manager
6
+ ComparatorItemStore = TkWrapper::Widgets::Base::ComparatorItemStore
7
+
5
8
  def initialize
6
- @configurations = []
7
- @modifications = []
9
+ @configurations = ComparatorItemStore.new
10
+ @modifications = ComparatorItemStore.new
11
+ end
12
+
13
+ def add_configurations(matcher = nil, configuration = nil, **configurations)
14
+ add_configuration(matcher, configuration) if configuration
15
+
16
+ configurations.each { |mat, cfg| add_configuration(mat, cfg) }
8
17
  end
9
18
 
10
- def add_configuration(matcher, configuration)
11
- @configurations.push([matcher, configuration])
19
+ def add_configuration(comparator, configuration)
20
+ @configurations.push(comparator, configuration)
12
21
  end
13
22
 
14
23
  def add_modification(matcher, &callback)
15
- @modifications.push([matcher, callback])
24
+ @modifications.push(matcher, callback)
16
25
  end
17
26
 
18
27
  def configurations(widget)
19
- @configurations.filter_map do |(matcher, config)|
20
- config if widget.check_match(matcher)
21
- end
28
+ config_list = @configurations.items_and_matches_for_widget(widget)
29
+ config_list.map { |configs| configs[:items] }.flatten(1)
22
30
  end
23
31
 
24
32
  def execute_modifications(widget)
25
- @modifications.each do |(matcher, callback)|
26
- next unless (match = widget.check_match(matcher))
27
-
28
- arguments = match.is_a?(MatchData) ? [widget, match] : [widget]
29
- callback.call(*arguments)
33
+ item_list = @modifications.items_and_matches_for_widget(widget)
34
+ item_list.each do |items|
35
+ items[:items].each do |callback|
36
+ callback.call(widget, items[:match])
37
+ end
30
38
  end
31
39
  end
40
+
41
+ def configure(widget)
42
+ widget.config.merge(*configurations(widget))
43
+ end
44
+
45
+ alias modify add_modification
46
+ alias config add_configurations
32
47
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ # single 'match' as part of a Matches object
4
+ class TkWrapper::Widgets::Base::Match
5
+ attr_reader :key, :widget, :match
6
+
7
+ def initialize(value, cls: nil, match: nil, widget: nil)
8
+ @key = match&.[](0) || value
9
+ @widget = widget
10
+ @match = match
11
+ @cls = cls
12
+ @value = value
13
+ end
14
+
15
+ def tk_widget
16
+ @widget&.tk_widget
17
+ end
18
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "#{LIB_DIR}/widgets/base/match"
4
+
5
+ class TkWrapper::Widgets::Base::Matcher
6
+ Match = TkWrapper::Widgets::Base::Match
7
+
8
+ def initialize(value: nil, comparator: nil)
9
+ @match_function = curry_match_function(value, comparator)
10
+ end
11
+
12
+ # args:
13
+ # [] if widget and matcher were provided on initialization
14
+ # [widget] if matcher was provided on initialization
15
+ # [matcher] if widget was provided on initialization
16
+ # [widget, matcher] if neither widget nor matcher were provided on initial.
17
+ def match(*args)
18
+ @match_function.call(*args)
19
+ end
20
+
21
+ private
22
+
23
+ def match_regex(value, comparator, widget)
24
+ (match = comparator.match(value)) &&
25
+ Match.new(value, match: match, widget: widget)
26
+ end
27
+
28
+ def match_string(value, comparator, widget)
29
+ value == comparator && Match.new(value, widget: widget)
30
+ end
31
+
32
+ def match_class(value, comparator, widget)
33
+ widget.is_a?(comparator) &&
34
+ Match.new(value, cls: comparator, widget: widget)
35
+ end
36
+
37
+ def match_f(value, comparator, widget)
38
+ case comparator
39
+ when String, Symbol then match_string(value, comparator, widget)
40
+ when Regexp then match_regex(value, comparator, widget)
41
+ when Class then match_class(value, comparator, widget)
42
+ when nil then Match(value, { widget: widget })
43
+ else false
44
+ end
45
+ end
46
+
47
+ def curry_match_function(value, comparator)
48
+ if value && comparator
49
+ ->(widget) { match_f(value, comparator, widget) }
50
+ elsif value
51
+ ->(x_comparator, widget) { match_f(value, x_comparator, widget) }
52
+ elsif comparator
53
+ ->(x_value, widget) { match_f(x_value, comparator, widget) }
54
+ else
55
+ ->(x_value, x_comparator, widget) { match_f(x_value, x_comparator, widget) }
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,34 @@
1
+ require_relative 'match'
2
+
3
+ # matches widgets against conditions and stores matching widgets and matches
4
+ class TkWrapper::Widgets::Base::Matches
5
+ include Enumerable
6
+
7
+ def initialize
8
+ @matches = {}
9
+ end
10
+
11
+ def push(match)
12
+ (@matches[match.key] ||= []).push(match)
13
+ end
14
+
15
+ def concat(matches)
16
+ matches.each { |match| push(match) }
17
+ end
18
+
19
+ def each(&block)
20
+ @matches.each do |(key, matches_for_key)|
21
+ matches_for_key.each do |match|
22
+ block.call([match.widget, key, match.match, match])
23
+ end
24
+ end
25
+ end
26
+
27
+ def [](key)
28
+ case @matches[key].size
29
+ when 0 then nil
30
+ when 1 then @matches[key][0]
31
+ else @matches[key]
32
+ end
33
+ end
34
+ end
@@ -1,39 +1,28 @@
1
- # frozen_string_literal: true
2
-
3
- require 'tk'
4
-
1
+ require "#{LIB_DIR}/util/tk/cell"
2
+ require "#{LIB_DIR}/util/tk/finder"
5
3
  require "#{LIB_DIR}/tk_extensions"
6
4
 
7
5
  require_relative 'base'
8
6
 
9
7
  class TkWrapper::Widgets::Base::Widget
8
+ extend Forwardable
10
9
  include TkExtensions
10
+ include Enumerable
11
+
12
+ def_delegators :@finder, :find, :find_all
11
13
 
12
14
  attr_accessor :config
13
- attr_reader :parent, :childs
15
+ attr_reader :parent, :ids, :cell, :childs, :manager
14
16
 
15
17
  def tk_class() end
16
18
 
17
- def self.manager
18
- @manager ||= TkWrapper::Widgets::Base::Manager.new
19
- end
20
-
21
- def self.config(matcher, configuration)
22
- manager.add_configuration(matcher, configuration)
23
- end
24
-
25
- def self.modify(matcher, &callback)
26
- manager.add_modification(matcher, &callback)
27
- end
28
-
29
- def manager
30
- TkWrapper::Widgets::Base::Widget.manager
31
- end
32
-
33
- def initialize(config: {}, childs: [])
19
+ def initialize(config: {}, childs: [], manager: nil, ids: [])
20
+ @cell = TkWrapper::Util::Tk::Cell.new(self)
21
+ @finder = TkWrapper::Util::Tk::Finder.new(widgets: self)
34
22
  @config = TkWrapper::Widgets::Base::Configuration.new(config)
35
23
  @childs = childs.is_a?(Array) ? childs : [childs]
36
- @id = config[:id]
24
+ @manager = manager
25
+ @ids = ids.is_a?(Array) ? ids : [ids]
37
26
  end
38
27
 
39
28
  def create_tk_widget(parent)
@@ -52,79 +41,33 @@ class TkWrapper::Widgets::Base::Widget
52
41
  (@tk_widget = create_tk_widget(parent)) || parent&.tk_widget
53
42
  end
54
43
 
55
- def build(parent, configure: true)
44
+ def build(parent, configure: true, manager: nil)
56
45
  @parent = parent
57
46
  tk_widget # creates the widget if possible and not yet created
47
+ @font = TkWrapper::Util::Tk::Font.new(tk_widget)
48
+ @manager ||= manager
49
+ @config.merge(*@manager.configurations(self)) if @manager
58
50
  self.configure if configure
59
- manager.execute_modifications(self)
60
- @childs.each { |child| child.build(self) }
51
+ @manager&.execute_modifications(self)
52
+ @childs.each { |child| child.build(self, manager: @manager) }
61
53
  end
62
54
 
63
55
  def configure
64
- @config.merge_global_configurations(manager, self)
65
56
  @config.configure_tk_widget(tk_widget)
66
57
  @config.configure_tearoff
67
58
  end
68
59
 
69
- def check_match(matcher)
70
- case matcher
71
- when Regexp
72
- matcher.match(@id)
73
- when String, Symbol
74
- matcher == @id
75
- when nil
76
- true
77
- else
78
- is_a?(matcher)
60
+ def each(&block)
61
+ nodes_to_walk = [self]
62
+ until nodes_to_walk.empty?
63
+ node = nodes_to_walk.pop
64
+ block.call(node)
65
+ nodes_to_walk = node.childs + nodes_to_walk
79
66
  end
80
67
  end
81
68
 
82
- def find(matcher)
83
- nodes_to_scan = [self]
84
- until nodes_to_scan.empty?
85
- node = nodes_to_scan.pop
86
- return node if node.check_match(matcher)
87
-
88
- nodes_to_scan = node.childs + nodes_to_scan
89
- end
69
+ def push(child)
70
+ @childs.push(child)
71
+ child.build(self)
90
72
  end
91
-
92
- def find_all(matcher)
93
- found_nodes = []
94
- nodes_to_scan = [self]
95
-
96
- until nodes_to_scan.empty?
97
- node = nodes_to_scan.pop
98
- found_nodes.push(node) if node.check_match(matcher)
99
-
100
- nodes_to_scan = node.childs + nodes_to_scan
101
- end
102
-
103
- found_nodes
104
- end
105
- end
106
-
107
- # the first parent, which contains a tk_widget, which is really different
108
- # from self.tk_widget
109
- def get_container_parent
110
- container = @parent
111
- while container.tk_widget == tk_widget
112
- return unless container.parent # not in a grid?
113
-
114
- container = container.parent
115
- end
116
- container
117
- end
118
-
119
- # returns the bounding box of the tk_widget
120
- def cell_bbox
121
- return unless (container = get_container_parent)
122
-
123
- grid_info = TkGrid.info(tk_widget)
124
- start_col = grid_info['column']
125
- end_col = start_col + grid_info['columnspan'] - 1
126
- start_row = grid_info['row']
127
- end_row = start_row + grid_info['rowspan'] - 1
128
-
129
- TkGrid.bbox(container.tk_widget, start_col, start_row, end_col, end_row)
130
73
  end
data/lib/widgets/grid.rb CHANGED
@@ -10,8 +10,8 @@ class TkWrapper::Widgets::Grid < TkWrapper::Widgets::Base::Widget
10
10
  TkWidgets::Frame
11
11
  end
12
12
 
13
- def initialize(config: {}, childs: [])
14
- super(config: config, childs: childs)
13
+ def initialize(**arguments)
14
+ super(**arguments)
15
15
  @childs.map! { |row| row.is_a?(Array) ? row : [row] }
16
16
  configure_cells_for_grid
17
17
  @childs.flatten! && @childs.select! { |cell| cell.is_a?(Widget) }
@@ -22,7 +22,7 @@ class TkWrapper::Widgets::Grid < TkWrapper::Widgets::Base::Widget
22
22
  row.each_with_index do |cell, col_i|
23
23
  next unless cell.is_a?(Widget)
24
24
 
25
- (cell.config[:grid] ||= {}).merge!({ row: row_i, column: col_i })
25
+ cell.config.merge({ grid: { row: row_i, column: col_i } })
26
26
 
27
27
  configure_colspan(cell, row_i, col_i)
28
28
  configure_rowspan(cell, row_i, col_i)
@@ -35,7 +35,7 @@ class TkWrapper::Widgets::Grid < TkWrapper::Widgets::Base::Widget
35
35
  colspan = cols_after_cell.reduce(1) do |span, content|
36
36
  content == :right ? span + 1 : (break span)
37
37
  end
38
- (cell.config[:grid] ||= {}).merge!({ columnspan: colspan })
38
+ cell.config.merge({ grid: { columnspan: colspan } })
39
39
  end
40
40
 
41
41
  def configure_rowspan(cell, row_i, col_i)
@@ -43,6 +43,6 @@ class TkWrapper::Widgets::Grid < TkWrapper::Widgets::Base::Widget
43
43
  rowspan = rows_after_cell.reduce(1) do |span, row|
44
44
  row[col_i] == :bottom ? span + 1 : (break span)
45
45
  end
46
- (cell.config[:grid] ||= {}).merge!({ rowspan: rowspan })
46
+ cell.config.merge({ grid: { rowspan: rowspan } })
47
47
  end
48
48
  end
data/lib/widgets/menu.rb CHANGED
@@ -5,8 +5,8 @@ class TkWrapper::Widgets::Menu < TkWrapper::Widgets::Base::Widget
5
5
  TkWidgets::TkMenu
6
6
  end
7
7
 
8
- def build(parent)
9
- super(parent)
8
+ def build(parent, **args)
9
+ super(parent, **args)
10
10
  parent.tk_widget['menu'] = tk_widget
11
11
  end
12
12
 
@@ -15,15 +15,18 @@ class TkWrapper::Widgets::Menu < TkWrapper::Widgets::Base::Widget
15
15
  TkWidgets::TkMenu
16
16
  end
17
17
 
18
- def build(parent)
19
- super(parent, configure: false)
18
+ def build(parent, **args)
19
+ args[:configure] = false
20
+ super(parent, **args)
20
21
  @config[:menu] = tk_widget
21
22
  parent.tk_widget.add :cascade, **@config.config
22
23
  end
23
24
  end
24
25
 
25
26
  class Command < TkWrapper::Widgets::Base::Widget
26
- def build(parent)
27
+ def build(parent, **args)
28
+ args[:configure] = false
29
+ super(parent, **args)
27
30
  parent.tk_widget.add :command, **@config.config
28
31
  end
29
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tkwrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Schnitzler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-13 00:00:00.000000000 Z
11
+ date: 2021-12-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: reception@e.mail.de
@@ -19,13 +19,20 @@ files:
19
19
  - lib/tk_extensions.rb
20
20
  - lib/tkwrapper.rb
21
21
  - lib/util/hash_recursive.rb
22
+ - lib/util/tk/cell.rb
23
+ - lib/util/tk/finder.rb
24
+ - lib/util/tk/font.rb
25
+ - lib/util/tk/tk.rb
22
26
  - lib/util/virtual_methods.rb
23
27
  - lib/widgets/auto_resize_entry.rb
24
28
  - lib/widgets/base/base.rb
29
+ - lib/widgets/base/comparator_item_store.rb
25
30
  - lib/widgets/base/configuration.rb
26
31
  - lib/widgets/base/manager.rb
32
+ - lib/widgets/base/match.rb
33
+ - lib/widgets/base/matcher.rb
34
+ - lib/widgets/base/matches.rb
27
35
  - lib/widgets/base/widget.rb
28
- - lib/widgets/base/widgets.rb
29
36
  - lib/widgets/entry.rb
30
37
  - lib/widgets/frame.rb
31
38
  - lib/widgets/grid.rb
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class TkWrapper::Widgets::Base::Widgets
4
- def initialize
5
- @configurations = []
6
- @modifications = []
7
- end
8
-
9
- def add_configuration(matcher, configuration)
10
- @configurations.push(matcher, configuration)
11
- end
12
-
13
- def add_modification(matcher, &callback)
14
- @modifications.push(matcher, callback)
15
- end
16
-
17
- def configurations(widget)
18
- @configurations.filter_map do |(matcher, config)|
19
- config if widget.check_match(matcher)
20
- end
21
- end
22
-
23
- def execute_modifications(widget)
24
- @modifications.each do |(matcher, callback)|
25
- next unless (match = widget.check_match(matcher))
26
-
27
- arguments = match.is_a?(MatchData) ? [widget, match] : [widget]
28
- callback.call(*arguments)
29
- end
30
- end
31
- end