rubytext 0.1.22 → 0.1.23

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