rubytext 0.1.22 → 0.1.23

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.
@@ -1,21 +1,31 @@
1
1
 
2
+ # Helper method: insert text effects while printing
3
+
2
4
  def fx(str, *args, bg: nil)
3
5
  eff = RubyText::Effects.new(*args, bg: bg)
4
6
  str.define_singleton_method(:effect) { eff }
5
7
  str # must return str
6
8
  end
7
9
 
10
+ # Hande text effects (bold, normal, reverse, underline)
11
+
8
12
  class RubyText::Effects # dumb name?
13
+
14
+ # Text modes
9
15
  Modes = {bold: Curses::A_BOLD,
10
16
  normal: Curses::A_NORMAL,
11
17
  reverse: Curses::A_REVERSE,
12
18
  under: Curses::A_UNDERLINE}
13
19
 
20
+ # Other text modes "of our own"
21
+
14
22
  Others = %[:show, :hide] # show/hide cursor; more later??
15
23
 
16
24
  attr_reader :value, :fg, :bg
17
25
 
18
- # TODO rewrite logic to accommodate color pairs
26
+ # @todo rewrite logic to accommodate color pairs
27
+
28
+ # Initialize an Effects object
19
29
 
20
30
  def initialize(*args, bg: nil)
21
31
  bits = 0
@@ -32,6 +42,8 @@ class RubyText::Effects # dumb name?
32
42
  @value = bits
33
43
  end
34
44
 
45
+ # "Turn on" effect to specified window
46
+
35
47
  def set(win)
36
48
  @old_fg, @old_bg = win.fg, win.bg # Save off current state?
37
49
  attr, fg, bg = self.value, self.fg, self.bg
@@ -41,6 +53,8 @@ class RubyText::Effects # dumb name?
41
53
  win.set_colors(fg, bg)
42
54
  end
43
55
 
56
+ # "Turn off" effect in specified window
57
+
44
58
  def reset(win)
45
59
  attr = self.value
46
60
  win.cwin.attroff(attr)
@@ -1,4 +1,7 @@
1
+ # Ruby constants for curses key definitions
2
+
1
3
  module RubyText::Keys
4
+
2
5
  Down = 258
3
6
  Up = 259
4
7
  Left = 260
@@ -1,6 +1,13 @@
1
+ # The top-level module
2
+
1
3
  module RubyText
2
4
 
5
+ # Wrapper for a curses window
6
+
3
7
  class Window
8
+
9
+ # One-line menu at top of window
10
+
4
11
  def topmenu(items:, curr: 0, fg: Green, bg: Black)
5
12
  r, c = 0, 0
6
13
  high = 1
@@ -55,14 +62,16 @@ module RubyText
55
62
  next if result.nil?
56
63
  next if result.empty?
57
64
  return result
58
- else Curses.beep
65
+ else Curses.beep
59
66
  end
60
67
  RubyText.show_cursor
61
68
  end
62
69
  end
63
70
 
71
+ # Simple menu with rows of strings (or Procs)
72
+
64
73
  def menu(r: :center, c: :center, items:, curr: 0,
65
- border: true,
74
+ border: true, sticky: false,
66
75
  title: nil, fg: Green, bg: Black)
67
76
  RubyText.hide_cursor
68
77
  if items.is_a?(Hash)
@@ -111,7 +120,7 @@ module RubyText
111
120
  RubyText.show_cursor
112
121
  return [nil, nil]
113
122
  when Enter
114
- self.restback(high, wide, r, c)
123
+ self.restback(high, wide, r, c) unless sticky
115
124
  RubyText.show_cursor
116
125
  choice = results[sel]
117
126
  return [sel, choice] if choice.is_a? String
@@ -124,6 +133,8 @@ module RubyText
124
133
  end
125
134
  end
126
135
 
136
+ # Menu for multiple selections (buggy/unused?)
137
+
127
138
  def multimenu(r: :center, c: :center,
128
139
  items:, curr: 0, selected: [],
129
140
  title: nil, sel_fg: Yellow, fg: White, bg: Blue)
@@ -175,6 +186,8 @@ module RubyText
175
186
  end
176
187
  end
177
188
 
189
+ # Simple yes/no decision
190
+
178
191
  def yesno
179
192
  # TODO: Accept YyNn
180
193
  r, c = STDSCR.rc
@@ -182,6 +195,8 @@ module RubyText
182
195
  num == 0
183
196
  end
184
197
 
198
+ # Menu to choose a single setting and retain it
199
+
185
200
  def radio_menu(r: :center, c: :center, items:, curr: 0,
186
201
  # Handle current value better?
187
202
  border: true,
@@ -251,6 +266,11 @@ module RubyText
251
266
  end
252
267
  end
253
268
  end
269
+ end
270
+
271
+ module RubyText
272
+
273
+ # Two-paned widget with menu on left, informtional area on right
254
274
 
255
275
  def self.selector(win: STDSCR, r: 0, c: 0, rows: 10, cols: 20,
256
276
  items:, fg: White, bg: Blue,
@@ -301,5 +321,59 @@ module RubyText
301
321
  rescue
302
322
  retry
303
323
  end
324
+
325
+ # "Menu" for checklists
326
+
327
+ def checklist(r: :center, c: :center,
328
+ items:, curr: 0, selected: [],
329
+ title: nil, sel_fg: Yellow, fg: White, bg: Blue)
330
+ RubyText.hide_cursor
331
+ high = items.size + 2
332
+ wide = items.map(&:length).max + 8
333
+ tlen = title.length + 8 rescue 0
334
+ wide = [wide, tlen].max
335
+ row, col = self.coords(r, c)
336
+ row = row - high/2 if r == :center
337
+ col = col - wide/2 if c == :center
338
+ r, c = row, col
339
+ self.saveback(high, wide, r, c)
340
+ mr, mc = r+self.r0, c+self.c0
341
+ mwin = RubyText.window(high, wide, r: mr, c: mc,
342
+ fg: fg, bg: bg, title: title)
343
+ Curses.stdscr.keypad(true)
344
+ sel = curr
345
+ max = items.size - 1
346
+ loop do
347
+ RubyText.hide_cursor # FIXME should be unnecessary
348
+ items.each.with_index do |item, row|
349
+ mwin.go row, 0
350
+ style = (sel == row) ? :reverse : :normal
351
+ color = selected.find {|x| x[0] == row } ? sel_fg : fg
352
+ label = "[ ]" + item
353
+ mwin.print fx(label, color, style)
354
+ end
355
+ ch = getch
356
+ case ch
357
+ when Up
358
+ sel -= 1 if sel > 0
359
+ when Down
360
+ sel += 1 if sel < max
361
+ when Esc
362
+ self.restback(high, wide, r, c)
363
+ RubyText.show_cursor
364
+ return []
365
+ when Enter
366
+ self.restback(high, wide, r, c)
367
+ RubyText.show_cursor
368
+ return selected.map {|i| items[i] }
369
+ when " "
370
+ selected << [sel, items[sel]]
371
+ sel += 1 if sel < max
372
+ else Curses.beep
373
+ end
374
+ RubyText.show_cursor
375
+ end
376
+ end
377
+
304
378
  end
305
379
 
@@ -1,5 +1,9 @@
1
+ # Reopening: Coordinate handling (1-based!)
2
+
1
3
  class RubyText::Window
2
4
 
5
+ # Handle special coordinate names (symbols)
6
+
3
7
  def coords(r, c)
4
8
  r = case
5
9
  when r == :center
@@ -24,10 +28,17 @@ class RubyText::Window
24
28
  [r, c]
25
29
  end
26
30
 
31
+ # Go to specified row/column in current window
32
+
27
33
  def goto(r, c) # only accepts numbers!
28
34
  @cwin.setpos(r, c)
35
+ @cwin.refresh
29
36
  end
30
37
 
38
+
39
+ # Go to specified row/column in current window,
40
+ # execute block, and return cursor
41
+
31
42
  def go(r0, c0)
32
43
  r, c = coords(r0, c0)
33
44
  save = self.rc
@@ -38,60 +49,84 @@ class RubyText::Window
38
49
  end
39
50
  end
40
51
 
52
+ # Move cursor up
53
+
41
54
  def up(n=1)
42
55
  r, c = rc
43
56
  go r-n, c
44
57
  end
45
58
 
59
+ # Move cursor down
60
+
46
61
  def down(n=1)
47
62
  r, c = rc
48
63
  go r+n, c
49
64
  end
50
65
 
66
+ # Move cursor left
67
+
51
68
  def left(n=1)
52
69
  r, c = rc
53
70
  go r, c-n
54
71
  end
55
72
 
73
+ # Move cursor right
74
+
56
75
  def right(n=1)
57
76
  r, c = rc
58
77
  go r, c+n
59
78
  end
60
79
 
80
+ # Move cursor to top of window
81
+
61
82
  def top
62
83
  r, c = rc
63
84
  go 0, c
64
85
  end
65
86
 
87
+ # Move cursor to bottom of window
88
+
66
89
  def bottom
67
90
  r, c = rc
68
91
  rmax = self.rows - 1
69
92
  go rmax, c
70
93
  end
71
94
 
95
+ # Move cursor to top of window
96
+
72
97
  def up!
73
98
  top
74
99
  end
75
100
 
101
+ # Move cursor to bottom of window
102
+
76
103
  def down!
77
104
  bottom
78
105
  end
79
106
 
107
+ # Move cursor to far left of window
108
+
80
109
  def left!
81
110
  r, c = rc
82
111
  go r, 0
83
112
  end
84
113
 
114
+ # Move cursor to far left of window
115
+
85
116
  def right!
86
117
  r, c = rc
87
118
  cmax = self.cols - 1
88
119
  go r, cmax
89
120
  end
90
121
 
122
+ # Move cursor to home (upper left)
123
+
91
124
  def home
92
125
  go 0, 0
93
126
  end
94
127
 
128
+ # Return current row/column
129
+
95
130
  def rc
96
131
  [@cwin.cury, @cwin.curx]
97
132
  end
@@ -123,17 +123,31 @@ class RubyText::Window
123
123
  $stdscr = STDSCR
124
124
  end
125
125
 
126
+ =begin
127
+ def go(r0, c0)
128
+ r, c = coords(r0, c0)
129
+ save = self.rc
130
+ goto r, c
131
+ if block_given?
132
+ yield
133
+ goto *save
134
+ end
135
+ end
136
+ =end
137
+
126
138
  def [](r, c)
127
- ch = nil
128
- go(r, c) { ch = @cwin.inch }
129
- debug "ch = #{ch} ch.chr = #{ch.chr}"
139
+ r0, c0 = self.rc
140
+ @cwin.setpos(r, c)
141
+ ch = @cwin.inch
142
+ @cwin.setpos(r0, c0)
130
143
  ch.chr
131
144
  end
132
145
 
133
146
  def []=(r, c, char)
147
+ r0, c0 = self.rc
134
148
  @cwin.setpos(r, c)
135
149
  @cwin.addch(char[0].ord|Curses::A_NORMAL)
136
- @cwin.setpos(r, c)
150
+ @cwin.setpos(r0, c0)
137
151
  @cwin.refresh
138
152
  end
139
153
 
@@ -1,6 +1,6 @@
1
1
 
2
2
  module RubyText
3
- VERSION = "0.1.22"
3
+ VERSION = "0.1.23"
4
4
 
5
5
  Path = File.expand_path(File.join(File.dirname(__FILE__)))
6
6
  end
@@ -101,6 +101,7 @@ module RubyText
101
101
  Object.const_set(:STDSCR, main) unless defined? STDSCR
102
102
  $stdscr = STDSCR # FIXME global needed?
103
103
  Object.include(WindowIO)
104
+ Curses.ESCDELAY = 10
104
105
  @started = true
105
106
  # rescue => err
106
107
  # puts(err.inspect)
@@ -6,6 +6,7 @@ module RubyText
6
6
  c ||= (STDSCR.cols - wide)/2
7
7
  win = RubyText::Window.new(high, wide, r, c, border, fg, bg, scroll)
8
8
  win.add_title(title) if title
9
+ 0.upto(high) {|row| 0.upto(wide) {|col| win[row, col] = " " } }
9
10
  win
10
11
  end
11
12
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubytext
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.22
4
+ version: 0.1.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hal Fulton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-06 00:00:00.000000000 Z
11
+ date: 2020-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -76,7 +76,33 @@ files:
76
76
  - examples/updown_etc.rb
77
77
  - examples/win_centering.rb
78
78
  - examples/window_full.rb
79
+ - lib/.yardoc/checksums
80
+ - lib/.yardoc/complete
81
+ - lib/.yardoc/object_types
82
+ - lib/.yardoc/objects/root.dat
83
+ - lib/.yardoc/proxy_types
79
84
  - lib/color.rb
85
+ - lib/doc/RubyText.html
86
+ - lib/doc/RubyText/Color.html
87
+ - lib/doc/RubyText/Effects.html
88
+ - lib/doc/RubyText/Keys.html
89
+ - lib/doc/RubyText/Settings.html
90
+ - lib/doc/RubyText/Window.html
91
+ - lib/doc/RubyText/Window/GetString.html
92
+ - lib/doc/WindowIO.html
93
+ - lib/doc/_index.html
94
+ - lib/doc/class_list.html
95
+ - lib/doc/css/common.css
96
+ - lib/doc/css/full_list.css
97
+ - lib/doc/css/style.css
98
+ - lib/doc/file_list.html
99
+ - lib/doc/frames.html
100
+ - lib/doc/index.html
101
+ - lib/doc/js/app.js
102
+ - lib/doc/js/full_list.js
103
+ - lib/doc/js/jquery.js
104
+ - lib/doc/method_list.html
105
+ - lib/doc/top-level-namespace.html
80
106
  - lib/effects.rb
81
107
  - lib/keys.rb
82
108
  - lib/menu.rb