Class: TkWrapper::Widgets::Base::Configuration

Inherits:
Object
  • Object
show all
Defined in:
lib/widgets/base/configuration.rb

Constant Summary collapse

GRID_SPECIAL_VALUES =
{
  onecell: {
    weights: { rows: [1], cols: [1] }
  },
  fullcell: {
    column: 0, row: 0, sticky: 'nsew'
  },
  default: {
    weights: { rows: [1], cols: [1] },
    column: 0, row: 0, sticky: 'nsew'
  }
}.freeze
NON_TK_OPTIONS =
%i[
  tk_class tearoff weights menu min_width add_width
].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ Configuration

Returns a new instance of Configuration.



27
28
29
# File 'lib/widgets/base/configuration.rb', line 27

def initialize(config)
  @config = parse_and_clone(config)
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



8
9
10
# File 'lib/widgets/base/configuration.rb', line 8

def config
  @config
end

Instance Method Details

#[](key) ⇒ Object



41
42
43
44
45
46
# File 'lib/widgets/base/configuration.rb', line 41

def [](key)
  key = key.to_sym
  return self.class.new(@config[key]) if @config[key].is_a?(Hash)

  @config[key]
end

#[]=(key, value) ⇒ Object



48
49
50
51
# File 'lib/widgets/base/configuration.rb', line 48

def []=(key, value)
  key = key.to_sym
  @config[key] = parse_and_clone(value, key)
end

#configure_grid(tk_widget) ⇒ Object



80
81
82
83
84
85
# File 'lib/widgets/base/configuration.rb', line 80

def configure_grid(tk_widget)
  grid = grid(only_tk_options: true)
  return if grid.empty?

  tk_widget.grid(grid)
end

#configure_tearoffObject



114
115
116
117
118
# File 'lib/widgets/base/configuration.rb', line 114

def configure_tearoff
  return if (tearoff = @config[:tearoff]).nil?

  TkOption.add '*tearOff', (tearoff ? 1 : 0)
end

#configure_tk_widget(tk_widget) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/widgets/base/configuration.rb', line 87

def configure_tk_widget(tk_widget)
  @config.each do |option, value|
    next if NON_TK_OPTIONS.include?(option)

    case option
    when :grid  then configure_grid(tk_widget)
    when :pack  then tk_widget.pack(value)
    when :place then tk_widget.place(value)
    else             tk_widget[option] = value
    end
  end

  configure_weights(tk_widget)
end

#configure_weights(tk_widget) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
# File 'lib/widgets/base/configuration.rb', line 102

def configure_weights(tk_widget)
  return unless (weights = @config.dig(:grid, :weights))

  (weights[:rows] || []).each_with_index do |weight, index|
    TkGrid.rowconfigure(tk_widget, index, weight: weight)
  end

  (weights[:cols] || []).each_with_index do |weight, index|
    TkGrid.columnconfigure(tk_widget, index, weight: weight)
  end
end

#grid(only_tk_options: false) ⇒ Object



74
75
76
77
78
# File 'lib/widgets/base/configuration.rb', line 74

def grid(only_tk_options: false)
  return @config[:grid] unless only_tk_options

  @config[:grid].reject { |option, _| NON_TK_OPTIONS.include?(option) }
end

#merge(*configurations, overwrite: true) ⇒ Object



31
32
33
34
35
36
37
38
39
# File 'lib/widgets/base/configuration.rb', line 31

def merge(*configurations, overwrite: true)
  configurations = configurations.map do |configuration|
    configuration = configuration.config if configuration.is_a?(self.class)

    parse_and_clone(configuration)
  end

  Util.merge_recursive!(@config, *configurations, overwrite: overwrite)
end

#merge_global_configurations(manager, widget) ⇒ Object



120
121
122
123
124
# File 'lib/widgets/base/configuration.rb', line 120

def merge_global_configurations(manager, widget)
  return unless manager

  merge(*manager.configurations(widget))
end

#parse_and_clone(value, key = nil) ⇒ Object



53
54
55
56
57
# File 'lib/widgets/base/configuration.rb', line 53

def parse_and_clone(value, key = nil)
  return parse_value(key, value) unless value.is_a?(Hash)

  value.each_with_object({}) { |(k, v), h| h[k] = parse_and_clone(v, k) }
end

#parse_grid_value(value) ⇒ Object



68
69
70
71
72
# File 'lib/widgets/base/configuration.rb', line 68

def parse_grid_value(value)
  return GRID_SPECIAL_VALUES[value] if value.is_a?(Symbol)

  value
end

#parse_value(key, value) ⇒ Object



59
60
61
62
63
64
65
66
# File 'lib/widgets/base/configuration.rb', line 59

def parse_value(key, value)
  case key
  when :grid
    parse_grid_value(value)
  else
    value
  end
end