glimmer-dsl-tk 0.0.22 → 0.0.26

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.22
1
+ 0.0.26
Binary file
@@ -0,0 +1,39 @@
1
+ # Copyright (c) 2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer/dsl/static_expression'
23
+ require 'glimmer/tk/spinbox_proxy'
24
+
25
+ module Glimmer
26
+ module DSL
27
+ module Tk
28
+ class FormatExpression < StaticExpression
29
+ def can_interpret?(parent, keyword, *args, &block)
30
+ super && parent.is_a?(Glimmer::Tk::SpinboxProxy) && args.size == 1 && block.nil?
31
+ end
32
+
33
+ def interpret(parent, keyword, *args, &block)
34
+ parent.tk.format(*args)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -27,7 +27,10 @@ module Glimmer
27
27
  module Tk
28
28
  class MessageBoxExpression < StaticExpression
29
29
  def interpret(parent, keyword, *args, &block)
30
- args.first[:parent] = args.first[:parent].tk if args.first.is_a?(Hash) && args.first[:parent].is_a?(Glimmer::Tk::RootProxy)
30
+ if args.first.is_a?(Hash)
31
+ args.first[:parent] = args.first[:parent].tk if args.first[:parent].is_a?(Glimmer::Tk::RootProxy)
32
+ args.first[:title] = args.first.delete(:text) if args.first.keys.include?(:text)
33
+ end
31
34
  ::Tk::messageBox(*args)
32
35
  end
33
36
  end
@@ -38,7 +38,7 @@ module Glimmer
38
38
 
39
39
  def interpret(parent, keyword, *args, &block)
40
40
  args = [parent] + args unless parent.nil?
41
- Glimmer::Tk::RootProxy.new(*args)
41
+ Glimmer::Tk::RootProxy.new(*args, &block)
42
42
  end
43
43
 
44
44
  def add_content(parent, keyword, *args, &block)
@@ -52,10 +52,3 @@ module Glimmer
52
52
  end
53
53
 
54
54
  require 'glimmer/tk/widget_proxy'
55
- require 'glimmer/tk/notebook_proxy'
56
- require 'glimmer/tk/frame_proxy'
57
- require 'glimmer/tk/button_proxy'
58
- require 'glimmer/tk/label_proxy'
59
- require 'glimmer/tk/list_proxy'
60
- require 'glimmer/tk/entry_proxy'
61
- require 'glimmer/tk/treeview_proxy'
@@ -20,6 +20,7 @@
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
22
  require 'glimmer/tk/widget_proxy'
23
+ require 'glimmer/tk/commandable'
23
24
 
24
25
  module Glimmer
25
26
  module Tk
@@ -27,20 +28,7 @@ module Glimmer
27
28
  #
28
29
  # Follows the Proxy Design Pattern
29
30
  class ButtonProxy < WidgetProxy
30
- # TODO extract to a module
31
-
32
- def command_block=(proc)
33
- tk.command(proc)
34
- end
35
-
36
- def handle_listener(listener_name, &listener)
37
- case listener_name.to_s.downcase
38
- when 'command'
39
- command(listener)
40
- else
41
- super
42
- end
43
- end
31
+ include Commandable
44
32
  end
45
33
  end
46
34
  end
@@ -20,25 +20,17 @@
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
22
  require 'glimmer/tk/widget_proxy'
23
+ require 'glimmer/tk/commandable'
24
+ require 'glimmer/tk/variable_owner'
23
25
 
24
26
  module Glimmer
25
27
  module Tk
26
28
  # Proxy for Tk::Tile::Checkbutton
27
29
  #
28
30
  # Follows the Proxy Design Pattern
29
- class ChecktbuttonProxy < WidgetProxy
30
- def command_block=(proc)
31
- tk.command(proc)
32
- end
33
-
34
- def handle_listener(listener_name, &listener)
35
- case listener_name.to_s.downcase
36
- when 'command'
37
- command(listener)
38
- else
39
- super
40
- end
41
- end
31
+ class CheckbuttonProxy < WidgetProxy
32
+ include Commandable
33
+ include VariableOwner
42
34
  end
43
35
  end
44
36
  end
@@ -0,0 +1,34 @@
1
+ # Copyright (c) 2020-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer/tk/widget_proxy'
23
+ require 'glimmer/tk/text_variable_owner'
24
+
25
+ module Glimmer
26
+ module Tk
27
+ # Proxy for Tk::Tile::Combobox
28
+ #
29
+ # Follows the Proxy Design Pattern
30
+ class ComboboxProxy < WidgetProxy
31
+ include TextVariableOwner
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,42 @@
1
+ # Copyright (c) 2020-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer/tk/widget_proxy'
23
+
24
+ module Glimmer
25
+ module Tk
26
+ # Represents widgets that can invoke a command
27
+ module Commandable
28
+ def command_block=(proc)
29
+ tk.command(proc)
30
+ end
31
+
32
+ def handle_listener(listener_name, &listener)
33
+ case listener_name.to_s.downcase
34
+ when 'command'
35
+ command(listener)
36
+ else
37
+ super
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -20,6 +20,7 @@
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
22
  require 'glimmer/tk/widget_proxy'
23
+ require 'glimmer/tk/text_variable_owner'
23
24
 
24
25
  module Glimmer
25
26
  module Tk
@@ -27,12 +28,31 @@ module Glimmer
27
28
  #
28
29
  # Follows the Proxy Design Pattern
29
30
  class EntryProxy < WidgetProxy
31
+ include TextVariableOwner
32
+
30
33
  def validatecommand_block=(proc)
31
34
  tk.validatecommand(proc)
32
35
  end
36
+
33
37
  def invalidcommand_block=(proc)
34
38
  tk.invalidcommand(proc)
35
39
  end
40
+
41
+ def handle_listener(listener_name, &listener)
42
+ case listener_name.to_s.downcase
43
+ when 'change'
44
+ tk.textvariable.trace('write') {
45
+ listener.call(@tk.textvariable)
46
+ }
47
+ when 'validatecommand', 'validate'
48
+ self.validatecommand_block = listener
49
+ when 'invalidcommand', 'invalid'
50
+ self.invalidcommand_block = listener
51
+ else
52
+ super
53
+ end
54
+ end
55
+
36
56
  end
37
57
  end
38
58
  end
@@ -20,6 +20,7 @@
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
22
  require 'glimmer/tk/widget_proxy'
23
+ require 'glimmer/tk/notebook_proxy'
23
24
 
24
25
  module Glimmer
25
26
  module Tk
@@ -33,10 +34,18 @@ module Glimmer
33
34
  if parent_proxy.is_a?(NotebookProxy)
34
35
  @tab_options, args[0] = args[0].to_h.partition {|key, value| NotebookProxy::TAB_OPTIONS.include?(key.to_s)}
35
36
  @tab_options = Hash[@tab_options]
37
+ @tab_options[:text] = @tab_options.delete(:title) if @tab_options.keys.include?(:title)
36
38
  args.delete_at(0) if args[0].to_a.empty?
37
39
  end
38
40
  super
39
41
  end
42
+
43
+ private
44
+
45
+ def initialize_defaults
46
+ super unless @parent_proxy.is_a?(NotebookProxy)
47
+ self.padding = 15
48
+ end
40
49
  end
41
50
  end
42
51
  end
@@ -20,6 +20,7 @@
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
22
  require 'glimmer/tk/widget_proxy'
23
+ require 'glimmer/tk/text_variable_owner'
23
24
 
24
25
  module Glimmer
25
26
  module Tk
@@ -27,10 +28,13 @@ module Glimmer
27
28
  #
28
29
  # Follows the Proxy Design Pattern
29
30
  class LabelProxy < WidgetProxy
30
- def set_attribute(attribute, *args)
31
- if attribute.to_s == 'font'
32
- args[0] = "tk_#{args[0]}_font".camelcase(:upper) if (args[0].is_a?(Symbol) || args[0].is_a?(String)) && args[0].to_s == args[0].to_s.downcase
33
- super
31
+ include TextVariableOwner
32
+
33
+ FONTS_PREDEFINED = %w[default text fixed menu heading caption small_caption icon tooltip]
34
+
35
+ def font=(value)
36
+ if (value.is_a?(Symbol) || value.is_a?(String)) && FONTS_PREDEFINED.include?(value.to_s.downcase)
37
+ @tk.font = "tk_#{value}_font".camelcase(:upper)
34
38
  else
35
39
  super
36
40
  end
@@ -27,17 +27,12 @@ module Glimmer
27
27
  #
28
28
  # Follows the Proxy Design Pattern
29
29
  class NotebookProxy < WidgetProxy
30
- TAB_OPTIONS = ['state', 'sticky', 'padding', 'text', 'image', 'compound', 'underline']
30
+ TAB_OPTIONS = ['state', 'sticky', 'padding', 'text', 'title', 'image', 'compound', 'underline']
31
31
 
32
- attr_reader :tab_proxies
33
-
34
- def initialize(*args)
35
- @tab_proxies = []
36
- super
37
- end
32
+ alias tab_proxies children
38
33
 
39
34
  def post_initialize_child(child)
40
- @tab_proxies << child
35
+ super
41
36
  @tk.add child.tk, child.tab_options
42
37
  end
43
38
  end
@@ -0,0 +1,46 @@
1
+ # Copyright (c) 2020-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer/tk/widget_proxy'
23
+ require 'glimmer/tk/commandable'
24
+
25
+ module Glimmer
26
+ module Tk
27
+ # Proxy for Tk::Tile::Radiobutton
28
+ #
29
+ # Follows the Proxy Design Pattern
30
+ class RadiobuttonProxy < WidgetProxy
31
+ include Commandable
32
+
33
+ def sibling_radio_buttons
34
+ @parent_proxy.children.select {|child| child.is_a?(RadiobuttonProxy) && child != self}
35
+ end
36
+
37
+ private
38
+
39
+ def initialize_defaults
40
+ super
41
+ sibling_variable = sibling_radio_buttons.map(&:tk).map(&:variable).compact.first
42
+ tk.variable = sibling_variable.nil? ? ::TkVariable.new : sibling_variable
43
+ end
44
+ end
45
+ end
46
+ end
@@ -31,9 +31,11 @@ module Glimmer
31
31
  DEFAULT_WIDTH = 190
32
32
  DEFAULT_HEIGHT = 95
33
33
 
34
- def initialize(*args)
34
+ def initialize(*args, &block)
35
35
  @tk = ::TkRoot.new
36
36
  @tk.minsize = DEFAULT_WIDTH, DEFAULT_HEIGHT
37
+ initialize_defaults
38
+ post_add_content if block.nil?
37
39
  end
38
40
 
39
41
  def post_add_content
@@ -57,16 +59,6 @@ module Glimmer
57
59
  when 'iconphoto'
58
60
  args[0..-1] = [image_argument(args)]
59
61
  super
60
- when 'width'
61
- @width = args.first.to_i
62
- self.geometry = "#{args.first.to_i}x#{@height || DEFAULT_HEIGHT}#{x_sign}#{abs_x}#{y_sign}#{abs_y}"
63
- when 'height'
64
- @height = args.first.to_i
65
- self.geometry = "#{@width || DEFAULT_WIDTH}x#{args.first.to_i}#{x_sign}#{abs_x}#{y_sign}#{abs_y}"
66
- when 'x'
67
- self.geometry = "#{@width || DEFAULT_WIDTH}x#{@height || DEFAULT_HEIGHT}#{args.first.to_i > 0 ? '+' : '-'}#{args.first.to_i.abs}#{y_sign}#{abs_y}"
68
- when 'y'
69
- self.geometry = "#{@width || DEFAULT_WIDTH}x#{@height || DEFAULT_HEIGHT}#{x_sign}#{abs_x}#{args.first.to_i > 0 ? '+' : '-'}#{args.first.to_i.abs}"
70
62
  when 'resizable'
71
63
  if args.size == 1 && !args.first.is_a?(Array)
72
64
  self.resizable = [args.first]*2
@@ -78,52 +70,38 @@ module Glimmer
78
70
  end
79
71
  end
80
72
 
81
- def get_attribute(attribute)
82
- attribute = attribute.to_s
83
- case attribute
84
- when 'width'
85
- geometry.split(REGEX_GEOMETRY)[0].to_i
86
- when 'height'
87
- geometry.split(REGEX_GEOMETRY)[1].to_i
88
- when 'x'
89
- sign_number(x_sign, geometry.split(REGEX_GEOMETRY)[2].to_i)
90
- when 'y'
91
- sign_number(y_sign, geometry.split(REGEX_GEOMETRY)[3].to_i)
92
- else
93
- super
94
- end
95
- end
96
-
97
73
  def width
98
- get_attribute(:width)
74
+ geometry.split(REGEX_GEOMETRY)[0].to_i
99
75
  end
100
76
 
101
77
  def height
102
- get_attribute(:height)
78
+ geometry.split(REGEX_GEOMETRY)[1].to_i
103
79
  end
104
80
 
105
81
  def x
106
- get_attribute(:x)
82
+ sign_number(x_sign, geometry.split(REGEX_GEOMETRY)[2].to_i)
107
83
  end
108
84
 
109
85
  def y
110
- get_attribute(:y)
86
+ sign_number(y_sign, geometry.split(REGEX_GEOMETRY)[3].to_i)
111
87
  end
112
88
 
113
89
  def width=(value)
114
- set_attribute(:width, value)
90
+ @width = value.to_i
91
+ self.geometry = "#{value.to_i}x#{@height || DEFAULT_HEIGHT}#{x_sign}#{abs_x}#{y_sign}#{abs_y}"
115
92
  end
116
93
 
117
94
  def height=(value)
118
- set_attribute(:height, value)
95
+ @height = value.to_i
96
+ self.geometry = "#{@width || DEFAULT_WIDTH}x#{value.to_i}#{x_sign}#{abs_x}#{y_sign}#{abs_y}"
119
97
  end
120
98
 
121
99
  def x=(value)
122
- set_attribute(:x, value)
100
+ self.geometry = "#{@width || DEFAULT_WIDTH}x#{@height || DEFAULT_HEIGHT}#{value.to_i > 0 ? '+' : '-'}#{value.to_i.abs}#{y_sign}#{abs_y}"
123
101
  end
124
102
 
125
103
  def y=(value)
126
- set_attribute(:y, value)
104
+ self.geometry = "#{@width || DEFAULT_WIDTH}x#{@height || DEFAULT_HEIGHT}#{x_sign}#{abs_x}#{value.to_i > 0 ? '+' : '-'}#{value.to_i.abs}"
127
105
  end
128
106
 
129
107
  def handle_listener(listener_name, &listener)
@@ -176,6 +154,10 @@ module Glimmer
176
154
  def geometry_signs
177
155
  geometry.chars.select {|char| char.match(/[+-]/)}
178
156
  end
157
+
158
+ def initialize_defaults
159
+ self.background = '#ececec' if OS.mac?
160
+ end
179
161
  end
180
162
  end
181
163
  end
@@ -0,0 +1,52 @@
1
+ # Copyright (c) 2020-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer/tk/widget_proxy'
23
+ require 'glimmer/tk/text_variable_owner'
24
+
25
+ module Glimmer
26
+ module Tk
27
+ # Proxy for Tk::Tile::TSpinbox
28
+ #
29
+ # Follows the Proxy Design Pattern
30
+ class SpinboxProxy < WidgetProxy
31
+ include TextVariableOwner
32
+
33
+ def command_block=(proc)
34
+ tk.command(proc)
35
+ end
36
+
37
+ def handle_listener(listener_name, &listener)
38
+ case listener_name.to_s.downcase
39
+ when 'command', 'change'
40
+ command(&listener)
41
+ when 'increment', '<increment>', '<<increment>>'
42
+ bind('<Increment>', listener)
43
+ when 'decrement', '<decrement>', '<<decrement>>'
44
+ bind('<Decrement>', listener)
45
+ else
46
+ super
47
+ end
48
+ end
49
+
50
+ end
51
+ end
52
+ end