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
@@ -4,6 +4,8 @@ module RETerm
4
4
  class Entry < Component
5
5
  include CDKComponent
6
6
 
7
+ attr_accessor :title
8
+
7
9
  # Initialize the Entry component
8
10
  #
9
11
  # @param [Hash] args entry params
@@ -14,25 +16,51 @@ module RETerm
14
16
  # @option args [Integer] :min min entry length
15
17
  # @option args [Integer] :max max entry length
16
18
  def initialize(args={})
17
- @title = args[:title] || ""
18
- @label = args[:label] || ""
19
- @min_len = args[:min] || 0
20
- @max_len = args[:max] || 100
19
+ super
20
+ @title = args[:title] || ""
21
+ @label = args[:label] || ""
22
+ @min_len = args[:min] || 0
23
+ @max_len = args[:max] || 100
24
+ @min_size = args[:size] || 0
25
+ end
26
+
27
+ def requested_rows
28
+ 5
29
+ end
30
+
31
+ def requested_cols
32
+ [@title.size, @label.size, @min_size].max + 3
33
+ end
34
+
35
+ def value
36
+ component.getValue
21
37
  end
22
38
 
23
39
  private
24
40
 
41
+ def disp_type
42
+ :MIXED
43
+ end
44
+
25
45
  def _component
26
- CDK::ENTRY.new(window.cdk_scr, # cdkscreen,
27
- CDK::CENTER, CDK::CENTER, # xpos, ypos
28
- @title, @label, # title, label
29
- Ncurses::A_NORMAL, # field attribute (eg typed chars)
30
- '.', # filler char
31
- :MIXED, # display type
32
- window.cols-@label.size-5, # field width
33
- 0, 256, # min/max len
34
- false, false) # box, shadow
46
+ c = CDK::ENTRY.new(window.cdk_scr, # cdkscreen,
47
+ CDK::CENTER, CDK::CENTER, # xpos, ypos
48
+ @title, @label, # title, label
49
+ Ncurses::A_NORMAL, # field attribute (eg typed chars)
50
+ '.'.ord, # filler char
51
+ disp_type, # display type
52
+ window.cols-@label.size-5, # field width
53
+ 0, 512, # min/max len
54
+ false, false) # box, shadow
55
+ e = self
56
+ callback = lambda do |cdktype, entry, component, key|
57
+ component.dispatch :entry, key
58
+ end
59
+
60
+ c.setPostProcess(callback, self)
61
+
62
+ c
35
63
  end
36
- end # Radio
64
+ end # Entry
37
65
  end # module Components
38
66
  end # module RETerm
@@ -0,0 +1,55 @@
1
+ module RETerm
2
+ module Components
3
+ # CDK Histogram Widget
4
+ class Histogram < Component
5
+ include CDKComponent
6
+
7
+ attr_accessor :value
8
+
9
+ # Override setter
10
+ def value=(v)
11
+ component.set(:PERCENT, # view type
12
+ CDK::CENTER, # stats pos
13
+ Ncurses::A_BOLD, # stats attr
14
+ @min, @max, v, # low/high/current
15
+ ' '.ord | Ncurses::A_REVERSE, # fill ch
16
+ true) # box
17
+
18
+ window.cdk_scr.refresh
19
+ end
20
+
21
+ # Initialize the Histogram component
22
+ #
23
+ # @param [Hash] args label params
24
+ # @option args [String] :title title of Histogram
25
+ # @option args [Integer] :min min histogram value
26
+ # @option args [Integer] :max max histogram value
27
+ def initialize(args={})
28
+ super
29
+ @title = args[:title] || ""
30
+ @min = args[:min] || 0
31
+ @max = args[:max] || 10
32
+ end
33
+
34
+ def requested_rows
35
+ 4
36
+ end
37
+
38
+ def requested_cols
39
+ 50
40
+ end
41
+
42
+ private
43
+
44
+ def _component
45
+ CDK::HISTOGRAM.new(window.cdk_scr,
46
+ 2, 1, # x, y
47
+ 1, -2, # h, w
48
+ CDK::HORIZONTAL, # orient
49
+ @title,
50
+ true, false) # box, shadow
51
+ end
52
+
53
+ end # Histogram
54
+ end # module Components
55
+ end # module RETerm
@@ -10,6 +10,7 @@ module RETerm
10
10
  # @option args [String] :title title of slider
11
11
  # @option args [String] :label label of slider
12
12
  def initialize(args={})
13
+ super
13
14
  @title = args[:title] || " "
14
15
  @label = args[:label] || " "
15
16
 
@@ -17,6 +18,14 @@ module RETerm
17
18
  @range = [0, 100]
18
19
  end
19
20
 
21
+ def requested_cols
22
+ [@title.size, @label.size].min + 30
23
+ end
24
+
25
+ def requested_rows
26
+ 4
27
+ end
28
+
20
29
  private
21
30
 
22
31
  def _component
@@ -9,6 +9,7 @@ module RETerm
9
9
  # @option args [String] :file path to the file containing
10
10
  # the image
11
11
  def initialize(args={})
12
+ super
12
13
  @file = args[:file]
13
14
  end
14
15
 
@@ -16,6 +17,14 @@ module RETerm
16
17
  refresh_win
17
18
  end
18
19
 
20
+ def requeseted_rows
21
+ image.dimension.height
22
+ end
23
+
24
+ def requested_cols
25
+ image.dimension.width
26
+ end
27
+
19
28
  protected
20
29
 
21
30
  def canvas
@@ -0,0 +1,38 @@
1
+ module RETerm
2
+ module Components
3
+ # Renders specified isometric grid
4
+ class Isometric < Component
5
+
6
+ # Initialize the Isometric component
7
+ #
8
+ # @param [Hash] args isometric params
9
+ # @option args [Array<Array<Integer,Double>>] :matrix 2-dimensional array
10
+ # containing Z values corresponding to x/y grid coordinates
11
+ def initialize(args={})
12
+ super
13
+ @matrix = args[:matrix] || [[]]
14
+
15
+ raise ArgumentError unless @matrix.is_a?(Array) &&
16
+ @matrix.all? { |m| m.is_a?(Array) }
17
+ end
18
+
19
+ def requested_rows
20
+ end
21
+
22
+ def requested_cols
23
+ end
24
+
25
+ def draw!
26
+ refresh_win
27
+ end
28
+
29
+ private
30
+
31
+ def refresh_win
32
+ # ... TODO
33
+ window.refresh
34
+ update_reterm
35
+ end
36
+ end # class Isometric
37
+ end # module Components
38
+ end # module RETerm
@@ -3,17 +3,34 @@ module RETerm
3
3
  # Simply renders text to window
4
4
  class Label < Component
5
5
 
6
+ attr_accessor :text
7
+
6
8
  # Initialize the Label component
7
9
  #
8
10
  # @param [Hash] args label params
9
- # @option args [String] :text text of button
11
+ # @option args [String] :text text of the label
10
12
  def initialize(args={})
13
+ super
11
14
  @text = args[:text] || ""
12
15
  end
13
16
 
17
+ def requested_rows
18
+ 2
19
+ end
20
+
21
+ def requested_cols
22
+ @text.size + 1
23
+ end
24
+
14
25
  def draw!
15
- window.mvaddstr(1, 1, @text)
16
- update_reterm
26
+ padding = " " * [0, window.cols - @text.size-2].max
27
+ window.mvaddstr(0, 0, @text + padding)
28
+ end
29
+
30
+ def erase
31
+ padding = " " * [0, window.cols - @text.size-2].max
32
+ window.mvaddstr(0, 0, " " * (@text + padding).size)
33
+ window.refresh
17
34
  end
18
35
  end # Label
19
36
  end # module Components
@@ -8,6 +8,7 @@ module RETerm
8
8
  #
9
9
  # @param [Hash] args matrix params
10
10
  def initialize(args={})
11
+ super
11
12
  @rows = args[:rows]
12
13
  @cols = args[:cols]
13
14
  @title = args[:title]
@@ -22,6 +23,14 @@ module RETerm
22
23
  component.getCell(x, y)
23
24
  end
24
25
 
26
+ def requeseted_rows
27
+ 4 + 2 * rows + 1
28
+ end
29
+
30
+ def requested_cols
31
+ 2 + 2 * rows + 1
32
+ end
33
+
25
34
  private
26
35
 
27
36
  def _component
@@ -0,0 +1,54 @@
1
+ module RETerm
2
+ module Components
3
+ # CDK MultiLineEntry Component
4
+ class MultiLineEntry < Component
5
+ include CDKComponent
6
+
7
+ # Initialize the MultiLineEntry component
8
+ #
9
+ # @param [Hash] args entry params
10
+ # @option args [String] :title title to assign
11
+ # to entry
12
+ # @option args [String] :label label to assign
13
+ # to entry
14
+ # @option args [Integer] :min min entry length
15
+ # @option args [Integer] :rows number of logical rows
16
+ # to create
17
+ def initialize(args={})
18
+ super
19
+ @title = args[:title] || ""
20
+ @label = args[:label] || ""
21
+ @min_len = args[:min] || 0
22
+ @rows = args[:rows] || nil
23
+ end
24
+
25
+ def requested_rows
26
+ 3 + @rows
27
+ end
28
+
29
+ def requested_cols
30
+ [@title.size, @label.size + 5].min
31
+ end
32
+
33
+ private
34
+
35
+ def _component
36
+ width = window.cols - @label.size - 5
37
+ height = window.rows - 5
38
+ rows = @rows || height
39
+
40
+ CDK::MENTRY.new(window.cdk_scr, # cdkscreen,
41
+ CDK::CENTER, CDK::CENTER, # xpos, ypos
42
+ @title, @label, # title, label
43
+ Ncurses::A_BOLD, # field attribute (eg typed chars)
44
+ '.', # filler char
45
+ :MIXED, # display type
46
+ width, # field width
47
+ height, # field height (rows)
48
+ rows, # logical rows
49
+ @min_len, # min length
50
+ false, false) # box, shadow
51
+ end
52
+ end # MultiLineEntry
53
+ end # module Components
54
+ end # module RETerm
@@ -0,0 +1,15 @@
1
+ module RETerm
2
+ module Components
3
+ class PasswordEntry < Entry
4
+ def disp_type
5
+ :HMIXED
6
+ end
7
+
8
+ def _component
9
+ c = super
10
+ c.setHiddenChar('#'.ord)
11
+ c
12
+ end
13
+ end # class PasswordEntry
14
+ end # module Components
15
+ end # module RETerm
@@ -3,6 +3,7 @@ module RETerm
3
3
  # CDK Radio Component
4
4
  class Radio < Component
5
5
  include CDKComponent
6
+ include ItemHelpers
6
7
 
7
8
  # Initialize the Radio component
8
9
  #
@@ -11,10 +12,19 @@ module RETerm
11
12
  # @option args [Array<String>] :items items to
12
13
  # populate radio with
13
14
  def initialize(args={})
15
+ super
14
16
  @title = args[:title] || ""
15
17
  @items = args[:items] || []
16
18
  end
17
19
 
20
+ def requested_rows
21
+ @items.size
22
+ end
23
+
24
+ def requested_cols
25
+ max_item_size + 3
26
+ end
27
+
18
28
  private
19
29
 
20
30
  def _component
@@ -0,0 +1,126 @@
1
+ require 'date'
2
+
3
+ module RETerm
4
+ module Components
5
+ # Text that is revealed incrementally over time
6
+ class RevealingLabel < Component
7
+
8
+ attr_accessor :text
9
+
10
+ # Initialize the RevealingLabel component
11
+ #
12
+ # @param [Hash] args revealing label params
13
+ # @option args [String] :text text of the label
14
+ def initialize(args={})
15
+ activate_sync!
16
+
17
+ super
18
+ self.text = args[:text] || ""
19
+
20
+ # time between characters being revealed
21
+ @char_time = args[:char_time] || 0.01
22
+
23
+ # time wait after a line is displayed before starting new
24
+ @line_wait = args[:line_wait] || 3
25
+
26
+ @draw_next = false
27
+ @timestamp = nil
28
+ end
29
+
30
+ def text=(t)
31
+ @text = t
32
+ @lines = nil
33
+ @current_line = nil
34
+ @current_index = nil
35
+ end
36
+
37
+ def empty?
38
+ @text.nil? || @text.length == 0
39
+ end
40
+
41
+ def lines
42
+ @lines ||= text.split("\n")
43
+ end
44
+
45
+ def requested_rows
46
+ lines.size + 1
47
+ end
48
+
49
+ def requested_cols
50
+ empty? ? 1 :
51
+ lines.max { |l1, l2| l1.size <=> l2.size }.size + 1
52
+ end
53
+
54
+ def sync!
55
+ if @timestamp.nil?
56
+ @draw_next = true
57
+
58
+ else
59
+ if @current_index == 0
60
+ if (DateTime.now - @timestamp) * 24 * 60 * 60 > @line_wait
61
+ @draw_next = true
62
+ end
63
+
64
+ else
65
+ if (DateTime.now - @timestamp) * 24 * 60 * 60 > @char_time
66
+ @draw_next = true
67
+ end
68
+ end
69
+ end
70
+
71
+ draw!
72
+ end
73
+
74
+ def reset!
75
+ @current_line = 0
76
+ @current_index = 0
77
+ end
78
+
79
+ def draw!
80
+ @current_line ||= 0
81
+ @current_index ||= 0
82
+
83
+ return unless @draw_next
84
+ @draw_next = false
85
+
86
+ current = ((lines.size > @current_line) &&
87
+ (lines[@current_line].size > @current_index)) ?
88
+ lines[@current_line][@current_index] :
89
+ ""
90
+
91
+ dispatch :start_reveal if @current_line == 0 &&
92
+ @current_index == 0
93
+
94
+ @timestamp = DateTime.now
95
+ window.mvaddstr(@current_line + 1,
96
+ @current_index + 1,
97
+ current)
98
+
99
+ dispatch :revealed_char, current
100
+
101
+ set_next
102
+ end
103
+
104
+ def set_next
105
+ return if empty?
106
+ @current_index += 1
107
+
108
+ if @current_index >= lines[@current_line].size
109
+ @current_index = 0
110
+ @current_line += 1
111
+ end
112
+
113
+ if @current_line >= lines.size
114
+ @current_line = 0
115
+ dispatch :revealed
116
+ end
117
+ end
118
+
119
+ def erase
120
+ lines.each_with_index { |l, i|
121
+ window.mvaddstr(i+1, 1, " " * l.size)
122
+ }
123
+ end
124
+ end # RevealingLabel
125
+ end # module Components
126
+ end # module RETerm