reterm 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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'