reterm 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/designer/src/ComponentParams.rb +89 -42
  3. data/designer/src/ComponentsList.rb +26 -25
  4. data/designer/src/CreatedList.rb +9 -0
  5. data/designer/src/Designer.rb +23 -1
  6. data/designer/src/ToggleArea.rb +20 -3
  7. data/designer/src/about.rb +35 -0
  8. data/designer/src/component_factory.rb +18 -0
  9. data/designer/src/component_map.rb +7 -0
  10. data/designer/src/file_chooser.rb +25 -0
  11. data/designer/src/glade/Designer.glade +1 -19
  12. data/designer/src/images/{slist.png → scroll_list.png} +0 -0
  13. data/lib/reterm.rb +10 -1
  14. data/lib/reterm/color_pair.rb +166 -10
  15. data/lib/reterm/component.rb +89 -2
  16. data/lib/reterm/components.rb +16 -1
  17. data/lib/reterm/components/alphalist.rb +45 -0
  18. data/lib/reterm/components/ascii_text.rb +14 -1
  19. data/lib/reterm/components/asciimator.rb +1 -0
  20. data/lib/reterm/components/button.rb +35 -5
  21. data/lib/reterm/components/button_box.rb +108 -0
  22. data/lib/reterm/components/close_button.rb +22 -0
  23. data/lib/reterm/components/cmd_output.rb +69 -0
  24. data/lib/reterm/components/dial.rb +11 -2
  25. data/lib/reterm/components/dialog.rb +41 -1
  26. data/lib/reterm/components/drop_down_menu.rb +140 -0
  27. data/lib/reterm/components/entry.rb +42 -14
  28. data/lib/reterm/components/histogram.rb +55 -0
  29. data/lib/reterm/components/hslider.rb +9 -0
  30. data/lib/reterm/components/image.rb +9 -0
  31. data/lib/reterm/components/isometric.rb +38 -0
  32. data/lib/reterm/components/label.rb +20 -3
  33. data/lib/reterm/components/matrix.rb +9 -0
  34. data/lib/reterm/components/multi_line_entry.rb +54 -0
  35. data/lib/reterm/components/password_entry.rb +15 -0
  36. data/lib/reterm/components/radio.rb +10 -0
  37. data/lib/reterm/components/revealing_label.rb +126 -0
  38. data/lib/reterm/components/rocker.rb +21 -11
  39. data/lib/reterm/components/scroll_list.rb +96 -0
  40. data/lib/reterm/components/scrolling_area.rb +50 -0
  41. data/lib/reterm/components/select_list.rb +67 -0
  42. data/lib/reterm/components/splash.rb +85 -0
  43. data/lib/reterm/components/template.rb +12 -1
  44. data/lib/reterm/components/treeview.rb +1 -0
  45. data/lib/reterm/components/vslider.rb +11 -2
  46. data/lib/reterm/components/youtube.rb +20 -0
  47. data/lib/reterm/config.rb +22 -0
  48. data/lib/reterm/init.rb +131 -6
  49. data/lib/reterm/layout.rb +147 -11
  50. data/lib/reterm/layouts.rb +1 -0
  51. data/lib/reterm/layouts/grid.rb +69 -0
  52. data/lib/reterm/layouts/horizontal.rb +25 -4
  53. data/lib/reterm/layouts/vertical.rb +26 -5
  54. data/lib/reterm/loader.rb +2 -2
  55. data/lib/reterm/mixins/button_helpers.rb +7 -0
  56. data/lib/reterm/mixins/cdk_component.rb +66 -2
  57. data/lib/reterm/mixins/common_controls.rb +15 -0
  58. data/lib/reterm/mixins/common_keys.rb +20 -0
  59. data/lib/reterm/mixins/component_input.rb +62 -14
  60. data/lib/reterm/mixins/event_dispatcher.rb +2 -0
  61. data/lib/reterm/mixins/item_helpers.rb +8 -0
  62. data/lib/reterm/mixins/key_bindings.rb +23 -0
  63. data/lib/reterm/mixins/log_helpers.rb +13 -0
  64. data/lib/reterm/mixins/mouse_input.rb +58 -0
  65. data/lib/reterm/mixins/nav_controls.rb +33 -0
  66. data/lib/reterm/mixins/nav_input.rb +161 -69
  67. data/lib/reterm/terminal.rb +6 -2
  68. data/lib/reterm/util.rb +121 -0
  69. data/lib/reterm/version.rb +1 -1
  70. data/lib/reterm/window.rb +295 -29
  71. metadata +33 -17
  72. data/designer/src/images/orig/Check.png +0 -0
  73. data/designer/src/images/orig/ascii_text.png +0 -0
  74. data/designer/src/images/orig/button.png +0 -0
  75. data/designer/src/images/orig/dial.png +0 -0
  76. data/designer/src/images/orig/entry.png +0 -0
  77. data/designer/src/images/orig/hslider.png +0 -0
  78. data/designer/src/images/orig/label.png +0 -0
  79. data/designer/src/images/orig/matrix.png +0 -0
  80. data/designer/src/images/orig/radio.png +0 -0
  81. data/designer/src/images/orig/rocker.png +0 -0
  82. data/designer/src/images/orig/slist.png +0 -0
  83. data/designer/src/images/orig/vslider.png +0 -0
  84. data/lib/reterm/components/slist.rb +0 -32
  85. data/lib/reterm/menu.rb +0 -81
@@ -1,4 +1,11 @@
1
1
  COMPONENTS = {
2
+ :generic => {
3
+ :params => {
4
+ "Fill" => :bool,
5
+ "Expand" => :bool
6
+ }
7
+ },
8
+
2
9
  # Layouts
3
10
  :Horizontal => {
4
11
  :desc => "Horizontal Layout",
@@ -0,0 +1,25 @@
1
+ class FileChooser
2
+ def initialize(window)
3
+ @window = window
4
+ end
5
+
6
+ def show
7
+ dialog = Gtk::FileChooserDialog.new(
8
+ :title => "Save File",
9
+ :parent => @window,
10
+ :action => Gtk::FileChooserAction::SAVE,
11
+ :back => nil,
12
+ :buttons => [
13
+ [Gtk::Stock::CANCEL, Gtk::ResponseType::CANCEL],
14
+ [Gtk::Stock::OPEN, Gtk::ResponseType::ACCEPT]
15
+ ])
16
+
17
+
18
+ file = (dialog.run == Gtk::ResponseType::ACCEPT) ?
19
+ dialog.filename : nil
20
+
21
+ dialog.destroy
22
+
23
+ file
24
+ end
25
+ end
@@ -33,15 +33,6 @@
33
33
  <property name="use_stock">True</property>
34
34
  </object>
35
35
  </child>
36
- <child>
37
- <object class="GtkImageMenuItem" id="file_menu_open">
38
- <property name="label">gtk-open</property>
39
- <property name="visible">True</property>
40
- <property name="can_focus">False</property>
41
- <property name="use_underline">True</property>
42
- <property name="use_stock">True</property>
43
- </object>
44
- </child>
45
36
  <child>
46
37
  <object class="GtkImageMenuItem" id="file_menu_save">
47
38
  <property name="label">gtk-save</property>
@@ -51,15 +42,6 @@
51
42
  <property name="use_stock">True</property>
52
43
  </object>
53
44
  </child>
54
- <child>
55
- <object class="GtkImageMenuItem" id="file_menu_save_as">
56
- <property name="label">gtk-save-as</property>
57
- <property name="visible">True</property>
58
- <property name="can_focus">False</property>
59
- <property name="use_underline">True</property>
60
- <property name="use_stock">True</property>
61
- </object>
62
- </child>
63
45
  <child>
64
46
  <object class="GtkSeparatorMenuItem">
65
47
  <property name="visible">True</property>
@@ -90,7 +72,7 @@
90
72
  <property name="visible">True</property>
91
73
  <property name="can_focus">False</property>
92
74
  <child>
93
- <object class="GtkImageMenuItem">
75
+ <object class="GtkImageMenuItem" id="help_menu_about">
94
76
  <property name="label">gtk-about</property>
95
77
  <property name="visible">True</property>
96
78
  <property name="can_focus">False</property>
File without changes
data/lib/reterm.rb CHANGED
@@ -7,16 +7,25 @@ require 'reterm/init'
7
7
  require 'reterm/color_pair'
8
8
 
9
9
  require 'reterm/mixins/event_dispatcher'
10
+ require 'reterm/mixins/mouse_input'
11
+ require 'reterm/mixins/common_controls'
12
+ require 'reterm/mixins/common_keys'
10
13
  require 'reterm/mixins/component_input'
14
+ require 'reterm/mixins/nav_controls'
11
15
  require 'reterm/mixins/nav_input'
12
16
  require 'reterm/mixins/cdk_component'
17
+ require 'reterm/mixins/item_helpers'
18
+ require 'reterm/mixins/key_bindings'
19
+ require 'reterm/mixins/button_helpers'
20
+ require 'reterm/mixins/log_helpers'
13
21
 
14
22
  require 'reterm/terminal'
15
23
  require 'reterm/window'
16
24
  require 'reterm/panel'
17
- require 'reterm/menu'
18
25
 
19
26
  require 'reterm/components'
20
27
  require 'reterm/layouts'
21
28
 
22
29
  require 'reterm/loader'
30
+ require 'reterm/util'
31
+ require 'reterm/config'
@@ -7,8 +7,74 @@ module RETerm
7
7
  attr_accessor :id
8
8
  attr_accessor :tags
9
9
 
10
- attr_accessor :fg
11
- attr_accessor :bg
10
+ # Color Identifiers
11
+ attr_accessor :fg, :bg
12
+
13
+ # Actual NCurses colors
14
+ attr_accessor :fgc, :bgc
15
+
16
+ # Return color in CDK format
17
+ def cdk_fmt
18
+ "</#{@id}>"
19
+ end
20
+
21
+ def self.builtin
22
+ @builtin ||= Ncurses.constants.select { |c|
23
+ c =~ /^COLOR.*/
24
+ }.collect { |c|
25
+ c.to_s.gsub("COLOR_", "").downcase.intern
26
+ }
27
+ end
28
+
29
+ def self.default_bkgd
30
+ @dbkgd ||= Ncurses::WINDOW.new(1, 1, 1, 1).getbkgd
31
+ end
32
+
33
+ def self.default_bkgd_char
34
+ @dbkgdch ||= default_bkgg & Ncurses::A_CHARTEXT
35
+ end
36
+
37
+ def self.default_bkgd_color
38
+ @dbkgdco ||= ((default_bkgd & Ncurses::A_COLOR) >> 8)
39
+ end
40
+
41
+ def self.default_fg
42
+ @dfg ||= begin
43
+ f, b = [], []
44
+ Ncurses::pair_content(default_bkgd_color, f, b)
45
+ f.first
46
+ end
47
+ end
48
+
49
+ def self.default_bg
50
+ @dbg ||= begin
51
+ f, b = [], []
52
+ Ncurses::pair_content(default_bkgd_color, f, b)
53
+ b.first
54
+ end
55
+ end
56
+
57
+ def self.default_color
58
+ @dcp ||= register default_fg, default_bg
59
+ end
60
+
61
+ # Reserves and returns block of N colors
62
+ def self.reserve(n=1)
63
+ @reserved ||= []
64
+ @next_color ||= 50
65
+
66
+ 0.upto(n) {
67
+ @reserved << @next_color
68
+ @next_color += 1
69
+ }
70
+
71
+ @reserved[-n..-1]
72
+ end
73
+
74
+ # Alias for reserve
75
+ def self.next_color
76
+ reserve
77
+ end
12
78
 
13
79
  # Redefined system RGB color. Color name should be specified
14
80
  # as well as new RGB components
@@ -19,7 +85,57 @@ module RETerm
19
85
  # @param [Integer] g value to assign to green component
20
86
  # @param [Integer] b value to assign to blue component
21
87
  def self.change(color, r, g, b)
22
- Ncurses::init_color Ncurses.const_get("COLOR_#{color.to_s.upcase}"), r, g, b
88
+ # XXX shoehorning 256 colors into ncurses 0-1000 scale here,
89
+ # possible explore if alternative solutions are better
90
+ r = r.to_f / 255 * 1000
91
+ g = g.to_f / 255 * 1000
92
+ b = b.to_f / 255 * 1000
93
+
94
+ c = builtin.include?(color.to_s.downcase.intern) ?
95
+ Ncurses.const_get("COLOR_#{color.to_s.upcase}") : color
96
+
97
+ Ncurses::init_color c, r, g, b
98
+ end
99
+
100
+ # An alias for #change
101
+ def self.define(color, r, g, b)
102
+ change(color, r, g, b)
103
+ end
104
+
105
+ # Return RGB components corresponding to system color
106
+ #
107
+ # @param [String, Symbol] color name of color to return
108
+ def self.get(color)
109
+ c = builtin.include?(color.to_s.downcase.intern) ?
110
+ Ncurses.const_get("COLOR_#{color.to_s.upcase}") : color
111
+
112
+ r, g, b = [[],[],[]]
113
+ Ncurses::color_content c, r, g, b
114
+
115
+ [r.first, g.first, b.first]
116
+ end
117
+
118
+ # Temporarily resassign RGB to named color, invoke callback
119
+ # block, and restore to original
120
+ # @param [Hash<String,Symbol,Array<Integer>>] colors color assignments
121
+ # to use, mapping of color names to RBG pairs
122
+ # @param [Integer] r value to assign to red component
123
+ # @param [Integer] g value to assign to green component
124
+ # @param [Integer] b value to assign to blue component
125
+ def self.use(colors={})
126
+ orig = {}
127
+ colors.each { |n, rgb|
128
+ orig[n] = get(n)
129
+ change(n, *rgb)
130
+ }
131
+
132
+ yield
133
+
134
+ colors.each { |n, rgb|
135
+ change(n, *orig[n])
136
+ }
137
+
138
+ nil
23
139
  end
24
140
 
25
141
  # Instantiate a new ColorPair, specifying foreground and background
@@ -40,12 +156,28 @@ module RETerm
40
156
 
41
157
  # FIXME need to verify input is in valid domain
42
158
  # before conveRETermng it to symbol w/ "intern"
43
- fg = fg.to_s.downcase.intern
44
- bg = bg.to_s.downcase.intern
159
+ fg = fg.to_s.downcase.intern if fg.is_a?(String) || fg.is_a?(Symbol)
160
+ bg = bg.to_s.downcase.intern if bg.is_a?(String) || bg.is_a?(Symbol)
161
+ @fg, @bg = fg, bg
162
+
163
+ fgc = fg.is_a?(Symbol) ? Ncurses.const_get("COLOR_#{fg.to_s.upcase}") : fg
164
+ bgc = bg.is_a?(Symbol) ? Ncurses.const_get("COLOR_#{bg.to_s.upcase}") : bg
165
+
166
+ @fgc, @bgc = fgc, bgc
45
167
 
46
- Ncurses.init_pair(@id,
47
- Ncurses.const_get("COLOR_#{fg.to_s.upcase}"),
48
- Ncurses.const_get("COLOR_#{bg.to_s.upcase}"))
168
+ Ncurses.init_pair(@id, fgc, bgc)
169
+ end
170
+
171
+ # Returns ncurses color pair corresponding to this instance
172
+ def nc
173
+ Ncurses::COLOR_PAIR(@id)
174
+ end
175
+
176
+ # Encapsulates window operation in color pair attribute
177
+ def format(win)
178
+ win.win.attron(nc)
179
+ yield
180
+ win.win.attroff(nc)
49
181
  end
50
182
 
51
183
  # Create and store a new Color Pair in a static
@@ -56,11 +188,35 @@ module RETerm
56
188
  @@registry.last
57
189
  end
58
190
 
59
- # Return first Color Pair found with the given tag
191
+ # Return all colors pairs
192
+ def self.all
193
+ @@registry ||= []
194
+ @@registry
195
+ end
196
+
197
+ # Return Color Pairs found with the given tag
60
198
  # or nil for no matches
61
199
  def self.for(tag)
62
200
  @@registry ||= []
63
- @@registry.find { |cp| cp.tags.include?(tag) }
201
+ @@registry.select { |cp| cp.tags.include?(tag) }
202
+ end
203
+
204
+ # Return Color Pairs found with the given
205
+ # fg color
206
+ def self.with_fg(color)
207
+ @@registry ||= []
208
+ @@registry.select { |cp|
209
+ color == (color.is_a?(Symbol) ? cp.fg : cp.fgc)
210
+ }
211
+ end
212
+
213
+ # Return Color Pairs found with the given
214
+ # bg color
215
+ def self.with_bg(color)
216
+ @@registry ||= []
217
+ @@registry.select { |cp|
218
+ color == (color.is_a?(Symbol) ? cp.bg : cp.bgc)
219
+ }
64
220
  end
65
221
  end # class ColorPair
66
222
  end # module RETerm
@@ -2,7 +2,35 @@ module RETerm
2
2
  # A Component is a generic widget container associated with a window.
3
3
  # Subclasses each implement a specific UI artifact.
4
4
  class Component
5
- attr_accessor :window
5
+ include EventDispatcher
6
+ include LogHelpers
7
+ include KeyBindings
8
+
9
+ attr_reader :window
10
+
11
+ def window=(w)
12
+ @window = w
13
+ dispatch(:window_assigned)
14
+ w
15
+ end
16
+
17
+ def initialize(args={})
18
+ self.highlight_focus = args[:highlight_focus] if args.key?(:highlight_focus)
19
+ self.activate_focus = args[:activate_focus] if args.key?(:activate_focus)
20
+ init_cdk(args) if cdk?
21
+ end
22
+
23
+ # This method is invoked when adding component to layout
24
+ # to determine rows needed
25
+ def requested_rows
26
+ 1
27
+ end
28
+
29
+ # This method is invoked when adding component to layout
30
+ # to determine cols needed
31
+ def requested_cols
32
+ 1
33
+ end
6
34
 
7
35
  # This method is invoked to cleanup the component on shutdown.
8
36
  # It should be be overriden by subclasses that needs to clean
@@ -33,8 +61,67 @@ module RETerm
33
61
  # logic when the user has selected an activatable? component.
34
62
  # Should be overriden by interactive subcomponents to
35
63
  # process user inpute specific to that component
36
- def activate!
64
+ def activate!(*input)
37
65
  raise RuntimeError, "should not be activated"
38
66
  end
67
+
68
+ # This method is invoked when component loses focus
69
+ # (when navigating to another component, window closed, etc).
70
+ # Subclasses may override to hide / cleanup resources
71
+ def deactivate!
72
+ @deactivate = true
73
+ end
74
+
75
+ # Flag indicating that this component should
76
+ # be deactivated
77
+ def deactivate?
78
+ !!(@deactivate ||= false)
79
+ end
80
+
81
+ # Reset deactivation
82
+ def reactivate!
83
+ @deactivate = false
84
+ end
85
+
86
+ attr_writer :highlight_focus
87
+
88
+ # Return boolean indicating if this component should
89
+ # be highlighted on focus (default true)
90
+ def highlight_focus?
91
+ !defined?(@highlight_focus) || @highlight_focus
92
+ end
93
+
94
+ attr_writer :activate_focus
95
+
96
+ def activate_focus?
97
+ defined?(@activate_focus) && @activate_focus
98
+ end
99
+
100
+ # Return extra padding to be given to component
101
+ def extra_padding
102
+ (activatable? && highlight_focus?) ? 3 : 0
103
+ end
104
+
105
+ # Method to periodically synchronize component if needed
106
+ def sync!
107
+ end
108
+
109
+ # Dispatch to window.resize
110
+ def resize(rows, cols)
111
+ window.resize(rows, cols)
112
+ self
113
+ end
114
+
115
+ # Overridden by CDK components
116
+ def cdk?
117
+ false
118
+ end
119
+
120
+ def sync_getch
121
+ c = window.sync_getch
122
+ c = nil if key_bound?(c) &&
123
+ invoke_key_bindings(c)
124
+ c
125
+ end
39
126
  end # class Component
40
127
  end # module RETerm
@@ -19,14 +19,29 @@ require 'reterm/components/dial'
19
19
  require 'reterm/components/rocker'
20
20
  require 'reterm/components/vslider'
21
21
  require 'reterm/components/label'
22
+ require 'reterm/components/revealing_label'
22
23
  require 'reterm/components/ascii_text'
23
24
  require 'reterm/components/image'
25
+ require 'reterm/components/splash'
24
26
 
25
27
  # cdk
26
28
  require 'reterm/components/hslider'
27
29
  require 'reterm/components/button'
28
30
  require 'reterm/components/dialog'
29
31
  require 'reterm/components/radio'
30
- require 'reterm/components/slist'
32
+ require 'reterm/components/scroll_list'
33
+ require 'reterm/components/select_list'
31
34
  require 'reterm/components/entry'
35
+ require 'reterm/components/password_entry'
32
36
  require 'reterm/components/matrix'
37
+ require 'reterm/components/drop_down_menu'
38
+ require 'reterm/components/button_box'
39
+ require 'reterm/components/alphalist'
40
+ require 'reterm/components/multi_line_entry'
41
+ require 'reterm/components/histogram'
42
+ require 'reterm/components/scrolling_area'
43
+
44
+ # additional
45
+ require 'reterm/components/close_button'
46
+ require 'reterm/components/cmd_output'
47
+ require 'reterm/components/youtube'