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,10 +1,11 @@
1
1
  module RETerm
2
2
  module Components
3
- # Rocker component, allowing use to select one of several values
3
+ # Rocker component, allowing use to select one of several items
4
4
  class Rocker < Component
5
5
  include ComponentInput
6
+ include ItemHelpers
6
7
 
7
- attr_accessor :values, :index, :labels
8
+ attr_accessor :items, :index, :labels
8
9
 
9
10
  # Initialize the Rocker component
10
11
  #
@@ -14,16 +15,25 @@ module RETerm
14
15
  # win = Window.new
15
16
  # rocker = Rocker.new
16
17
  # win.component = rocker
17
- # rocker.values = ['Foo', 'Bar', 'Baz']
18
+ # rocker.items = ['Foo', 'Bar', 'Baz']
18
19
  # val = rocker.activate!
19
20
  #
20
21
  def initialize(args={})
21
- @values = []
22
+ super
23
+ @items = []
22
24
  @index = nil
23
25
  @labels = true
24
26
  @index = 0
25
27
  end
26
28
 
29
+ def requested_rows
30
+ @items.size + 3
31
+ end
32
+
33
+ def requested_cols
34
+ max_item_size + 3
35
+ end
36
+
27
37
  def draw!
28
38
  refresh_win
29
39
  end
@@ -32,17 +42,17 @@ module RETerm
32
42
  true
33
43
  end
34
44
 
35
- def activate!
45
+ def activate!(*input)
36
46
  refresh_win
37
- handle_input
38
- @values[@index]
47
+ handle_input(*input)
48
+ @items[@index]
39
49
  end
40
50
 
41
51
  private
42
52
 
43
53
  def on_inc
44
54
  @index += 1
45
- @index = @values.size - 1 if @index == @values.size
55
+ @index = @items.size - 1 if @index == @items.size
46
56
  refresh_win
47
57
  end
48
58
 
@@ -58,11 +68,11 @@ module RETerm
58
68
  post = '+' if @labels
59
69
 
60
70
  window.mvaddstr(1, 1, " |#{pre}|")
61
- @values.each_with_index { |v, i|
71
+ @items.each_with_index { |v, i|
62
72
  sel = @index == i ? "#" : " "
63
- window.mvaddstr(i+2, 1, " |" + sel + "|" + @values[i])
73
+ window.mvaddstr(i+2, 1, " |" + sel + "|" + @items[i])
64
74
  }
65
- window.mvaddstr(@values.size+2, 1, " |#{post}|")
75
+ window.mvaddstr(@items.size+2, 1, " |#{post}|")
66
76
  window.refresh
67
77
  update_reterm
68
78
  end
@@ -0,0 +1,96 @@
1
+ module RETerm
2
+ module Components
3
+ # Scrolling List CDK Component
4
+ class ScrollList < Component
5
+ include CDKComponent
6
+ include ItemHelpers
7
+
8
+ attr_reader :items
9
+
10
+ # Initialize the ScrollList component
11
+ #
12
+ # @param [Hash] args list params
13
+ # @option args [String] :title title of list
14
+ # @option args [Array<String>] :items items to
15
+ # populate list with
16
+ def initialize(args={})
17
+ super
18
+ @title = args[:title] || ""
19
+ @items = args[:items] || []
20
+ end
21
+
22
+ def quit_on_enter=(v)
23
+ component.quit_on_enter = v
24
+ end
25
+
26
+ def requested_rows
27
+ 2 + @items.size
28
+ end
29
+
30
+ def requested_cols
31
+ [@title.size, max_item_size].max + 2
32
+ end
33
+
34
+ def <<(item)
35
+ @items << item
36
+
37
+ if window.expand? &&
38
+ (window.rows < (requested_rows + extra_padding) ||
39
+ window.cols < (requested_cols + extra_padding))
40
+ window.request_expansion requested_rows + extra_padding,
41
+ requested_cols + extra_padding
42
+ end
43
+ end
44
+
45
+ def reset!
46
+ component.setCurrentItem(0)
47
+ end
48
+
49
+ def empty!
50
+ @items.clear
51
+ end
52
+
53
+ def selected
54
+ @items[component.getCurrentItem]
55
+ end
56
+
57
+ def current
58
+ selected
59
+ end
60
+
61
+ def current_index
62
+ component.getCurrentItem
63
+ end
64
+
65
+ def activate!(*input)
66
+ i = super
67
+ return nil unless normal_exit?
68
+ dispatch(:selected)
69
+ @items[i]
70
+ end
71
+
72
+ private
73
+
74
+ def _component
75
+ c = CDK::SCROLL.new(window.cdk_scr, # cdkscreen,
76
+ CDK::CENTER, CDK::CENTER, # xplace, yplace,
77
+ CDK::RIGHT, # scroll pos
78
+ window.rows-2, # widget height
79
+ window.cols-3, # widget width
80
+ @title, @items, @items.size, # title and items
81
+ false, # prefix numbers
82
+ Ncurses::A_REVERSE, # highlight
83
+ true, false) # box, shadow
84
+
85
+ pp = lambda do |cdktype, list, scroll_list, key|
86
+ scroll_list.dispatch(:entry, key)
87
+ scroll_list.dispatch(:changed)
88
+ end
89
+
90
+ c.setPostProcess(pp, self)
91
+
92
+ c
93
+ end
94
+ end # ScrollList
95
+ end # module Components
96
+ end # module RETerm
@@ -0,0 +1,50 @@
1
+ module RETerm
2
+ module Components
3
+ # Scrolling Area CDK Component
4
+ class ScrollingArea < Component
5
+ include CDKComponent
6
+
7
+ attr_accessor :title, :lines
8
+
9
+ # Initialize the ScrollingArea component
10
+ #
11
+ # @param [Hash] args scrolling area params
12
+ # @option args [String] :title title of area
13
+ # @option args [Integer] :lines number of lines
14
+ # in the area
15
+ def initialize(args={})
16
+ super
17
+ @title = args[:title] || ""
18
+ @lines = args[:lines] || 10
19
+ end
20
+
21
+ # XXX swindow results in weird keyboard interactions, disable for now
22
+ def activatable?
23
+ false
24
+ end
25
+
26
+ def requested_rows
27
+ 10
28
+ end
29
+
30
+ def requested_cols
31
+ [@title.size, 10].min
32
+ end
33
+
34
+ def <<(item)
35
+ component.add item, CDK::BOTTOM
36
+ end
37
+
38
+ private
39
+
40
+ def _component
41
+ CDK::SWINDOW.new(window.cdk_scr, # cdkscreen,
42
+ 0, 1, # xplace, yplace, scroll pos
43
+ window.rows, # widget height
44
+ window.cols, # widget width
45
+ @title, @lines, # title, lines
46
+ true, false) # box, shadow
47
+ end
48
+ end # ScrollList
49
+ end # module Components
50
+ end # module RETerm
@@ -0,0 +1,67 @@
1
+ module RETerm
2
+ module Components
3
+ # Select List CDK Component
4
+ class SelectList < Component
5
+ include CDKComponent
6
+ include ItemHelpers
7
+
8
+ # Initialize the SelectList component
9
+ #
10
+ # @param [Hash] args list params
11
+ # @option args [String] :title title of list
12
+ # @option args [Array<String>] :items items to
13
+ # populate list with
14
+ def initialize(args={})
15
+ super
16
+ @title = args[:title] || ""
17
+ @items = args[:items] || []
18
+ end
19
+
20
+ def requested_rows
21
+ 5 + @items.size
22
+ end
23
+
24
+ def requested_cols
25
+ [@title.size, max_item_size].max + 2
26
+ end
27
+
28
+ def reset!
29
+ component.setCurrentItem(0)
30
+ end
31
+
32
+ def current
33
+ @items[component.getCurrentItem]
34
+ end
35
+
36
+ def selected
37
+ (0...@items.size).collect { |i|
38
+ component.selections[i] == 1 ? @items[i] : nil
39
+ }.compact
40
+ end
41
+
42
+ def activate!(*input)
43
+ super
44
+ selected
45
+ end
46
+
47
+ private
48
+
49
+ def _component
50
+ choices = [
51
+ " ",
52
+ "-->"
53
+ ]
54
+
55
+ CDK::SELECTION.new(window.cdk_scr, # cdkscreen,
56
+ 2, 1, CDK::RIGHT, # xplace, yplace, select pos
57
+ window.rows - 2, # widget height
58
+ window.cols - 2, # widget width
59
+ @title, # title
60
+ @items, @items.size, # items
61
+ choices, choices.size, # space bar choices
62
+ Ncurses::A_REVERSE, # highlight
63
+ true, false) # box, shadow
64
+ end
65
+ end # ScrollList
66
+ end # module Components
67
+ end # module RETerm
@@ -0,0 +1,85 @@
1
+ module RETerm
2
+ module Components
3
+ # Splash Screen
4
+ class Splash < Component
5
+ attr_reader :widget, :callback
6
+
7
+ # Initialize the Splash component
8
+ #
9
+ # @param [Hash] args splash params
10
+ # @option args [Component] :widget component
11
+ # to include in the slash window
12
+ def initialize(args={})
13
+ super
14
+ @widget = args[:widget]
15
+ @callback = args[:callback]
16
+ @terminate = false
17
+ end
18
+
19
+ # Client may invoke this to
20
+ # - create dialog and window
21
+ # - activate it
22
+ # - periodically invoke callback,
23
+ # check return value
24
+ # - close / cleanup
25
+ def self.show(args={}, &bl)
26
+ splash = self.new args.merge(:callback => bl)
27
+ win = Window.new args.merge(:component => splash,
28
+ :x => :center,
29
+ :y => :center)
30
+ #win.component = splash
31
+ splash.activate!
32
+ update_reterm(true)
33
+ splash.close!
34
+ end
35
+
36
+ def requested_rows
37
+ @widget.requested_rows + 3
38
+ end
39
+
40
+ def requested_cols
41
+ @widget.requested_cols + 3
42
+ end
43
+
44
+ def close!
45
+ widget.erase
46
+ widget.finalize!
47
+
48
+ window.erase
49
+ window.finalize!
50
+
51
+ # get rid of all outstanding input
52
+ flush_input
53
+ end
54
+
55
+ def sync!
56
+ widget.sync!
57
+ end
58
+
59
+ def draw!
60
+ window.border!
61
+ widget.draw!
62
+ end
63
+
64
+ def window=(win)
65
+ super(win)
66
+ cw = win.create_child :rows => widget.requested_rows,
67
+ :cols => widget.requested_cols,
68
+ :x => 1,
69
+ :y => 1
70
+ raise ArgumentError, "could not create child" if cw.win.nil?
71
+ cw.component = widget
72
+ end
73
+
74
+ def activate!(*input)
75
+ until @terminate
76
+ window.draw!
77
+
78
+ sleep SYNC_TIMEOUT.to_f / 1000
79
+ run_sync!
80
+ @terminate = !!callback.call
81
+ end
82
+ end
83
+ end # class Splash
84
+ end # module Components
85
+ end # module RETerm
@@ -4,6 +4,17 @@ module RETerm
4
4
  class Template < Component
5
5
  # All components must accept args hash (specified via loader)
6
6
  def initialize(args={})
7
+ super
8
+ end
9
+
10
+ # Override this to request minimum rows
11
+ # for window allocation
12
+ def requested_rows
13
+ end
14
+
15
+ # Override this to request minimum cols
16
+ # for window allocation
17
+ def requested_cols
7
18
  end
8
19
 
9
20
  # Override this method to draw component on screen
@@ -16,7 +27,7 @@ module RETerm
16
27
  end
17
28
 
18
29
  # Method call when this component is activated
19
- def activate!
30
+ def activate!(*input)
20
31
  end
21
32
  end # class Template
22
33
  end # module Components
@@ -0,0 +1 @@
1
+ # TODO treeview component
@@ -10,6 +10,7 @@ module RETerm
10
10
  #
11
11
  # @param [Hash] args slider params
12
12
  def initialize(args={})
13
+ super
13
14
  @initial_value = 0
14
15
  @increment = 0.01
15
16
  @range = [0, 1]
@@ -17,6 +18,14 @@ module RETerm
17
18
  @value = initial_value
18
19
  end
19
20
 
21
+ def requested_rows
22
+ 10
23
+ end
24
+
25
+ def requested_cols
26
+ 3
27
+ end
28
+
20
29
  def draw!
21
30
  refresh_win
22
31
  end
@@ -25,9 +34,9 @@ module RETerm
25
34
  true
26
35
  end
27
36
 
28
- def activate!
37
+ def activate!(*input)
29
38
  refresh_win
30
- handle_input
39
+ handle_input(*input)
31
40
  (range[1] - range[0]) * @value
32
41
  end
33
42
 
@@ -0,0 +1,20 @@
1
+ module RETerm
2
+ module Components
3
+ # YouTube viewer, use cmds to render youtube to ascii:
4
+ # youtube-dl <url>
5
+ # mplayer -vo aa <file> -or-
6
+ # CACA_DRIVER=ncurses mplayer -vo caca <file>
7
+ class YouTube < CmdOutput
8
+ # Initialize the YouTube component
9
+ #
10
+ # @param [Hash] args youtube params
11
+ # @option args [String] :url url of the video
12
+ # to load
13
+ def initialize(args={})
14
+ @url = args[:url]
15
+ cmd = "..."
16
+ super(args.merge(:cmd => cmd))
17
+ end
18
+ end # YouTube
19
+ end # module Components
20
+ end # module RETerm