listpager 1.0.1 → 1.0.2
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.
- checksums.yaml +4 -4
- data/README.md +6 -1
- data/lib/listpager/client_terminal.rb +30 -25
- data/lib/listpager/color.rb +3 -1
- data/lib/listpager/list.rb +42 -5
- data/lib/listpager/scrollbar.rb +1 -2
- data/lib/listpager/version.rb +1 -1
- data/listpager.gemspec +1 -10
- metadata +16 -4
- data/ext/mkrf_conf.rb +0 -23
- data/lib/listpager/ncurses.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d4f836e524e3a80691d2a2a0212b3e447d683c7
|
4
|
+
data.tar.gz: 4d68a1eee960c026cfbcbaa24b3b9f7378218e26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2942ab1c84e13c509b4958b6002604f81c3ee7ee8708eeb3a6e6dce0e0286ff2df89b5a3d60463535d4c7941b0052c4755519452b394d3bf87095c3ef101d29
|
7
|
+
data.tar.gz: 8789bc607ee28fdf54d6018144c18df4583e61fd4c250739f46e7209e25cf638371e5ec7cb1f5ffca89f8b79df0aff660d926da9112fb0a8bea78a6b1b088f3f
|
data/README.md
CHANGED
@@ -73,8 +73,13 @@ ask for statuses, manipulate the list, add badges, change captions, etc.
|
|
73
73
|
|
74
74
|
## Dependencies and Installation
|
75
75
|
Install listpager with `gem install listpager`. It has few dependencies:
|
76
|
-
currently only `
|
76
|
+
currently only `ncursesw`. BUT IT DOESNT STOP THERE, of course: For the
|
77
|
+
gem to build on a fresh Ubuntu, you'll need the following for widechar-
|
78
|
+
supporting libncurses development headers:
|
77
79
|
|
80
|
+
```bash
|
81
|
+
sudo apt install libncursesw5-dev
|
82
|
+
```
|
78
83
|
|
79
84
|
## Implementation Notes
|
80
85
|
curses is terrible but portable. 'curses' doesn't expose enough to be useful,
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'ncursesw'
|
2
2
|
require 'shellwords'
|
3
3
|
require 'optparse'
|
4
4
|
require 'io/console'
|
@@ -54,36 +54,41 @@ module Listpager
|
|
54
54
|
@mode == :append
|
55
55
|
end
|
56
56
|
|
57
|
-
def process_command(
|
58
|
-
|
59
|
-
|
60
|
-
when '
|
61
|
-
|
57
|
+
def process_command(argv)
|
58
|
+
cmd, *args = argv
|
59
|
+
case cmd
|
60
|
+
when 'append-mode', '%'
|
61
|
+
@mode = :append
|
62
|
+
when 'title'
|
63
|
+
@list.title = args[0]
|
64
|
+
when 'clear'
|
65
|
+
@list.values = []
|
66
|
+
@list.selected = 0
|
62
67
|
list.dirty!
|
63
|
-
when '
|
68
|
+
when 'get-selected'
|
69
|
+
list.selection_changed
|
70
|
+
when 'select'
|
71
|
+
list.selected = args.fetch(0).to_i
|
72
|
+
when 'get-item'
|
73
|
+
puts ["item", args.fetch(0), list.values[args.fetch(0).to_i]].join ' '
|
74
|
+
when 'quit'
|
75
|
+
raise Interrupt
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def process_line(line)
|
80
|
+
if append_mode?
|
81
|
+
if line == '%%'
|
64
82
|
@mode = :command
|
83
|
+
elsif line[0] == '%'
|
84
|
+
cmd = Shellwords.split(line[1..-1])
|
85
|
+
process_command(cmd)
|
65
86
|
else
|
66
87
|
list.values.push(line)
|
67
88
|
list.dirty!
|
68
89
|
end
|
69
90
|
else
|
70
|
-
|
71
|
-
begin
|
72
|
-
case cmd
|
73
|
-
when '%%', 'append-mode'
|
74
|
-
@mode = :append
|
75
|
-
when 'get-selected'
|
76
|
-
list.selection_changed
|
77
|
-
when 'select'
|
78
|
-
list.selected = args.fetch(0).to_i
|
79
|
-
when 'get-item'
|
80
|
-
puts ["item", args.fetch(0), list.values[args.fetch(0).to_i]].join ' '
|
81
|
-
when 'quit'
|
82
|
-
raise Interrupt
|
83
|
-
end
|
84
|
-
rescue IndexError => e
|
85
|
-
puts "error bad-command #{line}"
|
86
|
-
end
|
91
|
+
process_command(Shellwords.split(line))
|
87
92
|
end
|
88
93
|
end
|
89
94
|
|
@@ -103,7 +108,7 @@ module Listpager
|
|
103
108
|
used = 0
|
104
109
|
StringIO.new(@buffer).each_line do |line|
|
105
110
|
if line[-1] == "\n"
|
106
|
-
|
111
|
+
process_line(line.chomp)
|
107
112
|
used += line.size
|
108
113
|
else
|
109
114
|
break
|
data/lib/listpager/color.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'ncursesw'
|
2
2
|
|
3
3
|
module Listpager
|
4
4
|
class Color
|
@@ -8,6 +8,7 @@ module Listpager
|
|
8
8
|
scroll_track: 2,
|
9
9
|
scroll_thumb: 3,
|
10
10
|
scroll_arrow: 4,
|
11
|
+
title: 5,
|
11
12
|
}.freeze
|
12
13
|
|
13
14
|
def self.curses_lookup(c)
|
@@ -24,6 +25,7 @@ module Listpager
|
|
24
25
|
init_color(:scroll_track, :COLOR_BLACK, :COLOR_BLACK)
|
25
26
|
init_color(:scroll_thumb, :COLOR_WHITE, :COLOR_WHITE)
|
26
27
|
init_color(:scroll_arrow, :COLOR_WHITE, :COLOR_BLACK)
|
28
|
+
init_color(:title, :COLOR_BLACK, :COLOR_BLUE)
|
27
29
|
end
|
28
30
|
|
29
31
|
def self.[](name)
|
data/lib/listpager/list.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
|
1
|
+
require 'ncursesw'
|
3
2
|
require 'listpager/color'
|
4
3
|
require 'listpager/scrollbar'
|
5
4
|
|
@@ -27,9 +26,11 @@ module Listpager
|
|
27
26
|
attr_reader :selected
|
28
27
|
attr_reader :offset
|
29
28
|
attr_reader :scrollbar
|
29
|
+
attr_reader :title
|
30
30
|
|
31
31
|
def initialize(window)
|
32
32
|
@window = window
|
33
|
+
@title = nil
|
33
34
|
@values = []
|
34
35
|
@selected = 0
|
35
36
|
@offset = 0
|
@@ -45,17 +46,29 @@ module Listpager
|
|
45
46
|
@dirty
|
46
47
|
end
|
47
48
|
|
49
|
+
def title=(v)
|
50
|
+
if v != @title
|
51
|
+
@title = v
|
52
|
+
dirty!
|
53
|
+
end
|
54
|
+
@title
|
55
|
+
end
|
56
|
+
|
48
57
|
def offset=(v)
|
49
58
|
dirty! if v != @offset
|
59
|
+
v = 0 if v < 0
|
50
60
|
@offset = v
|
51
61
|
end
|
52
62
|
|
53
63
|
attr_reader :selected
|
54
64
|
def selected=(v)
|
65
|
+
minx, miny = getminxy
|
55
66
|
maxx, maxy = getmaxxy
|
56
67
|
|
57
68
|
v = [0, v, values.size - 1].sort[1]
|
58
|
-
|
69
|
+
screenh = maxy - miny
|
70
|
+
|
71
|
+
self.offset = [v + miny - 1, offset, (v + miny + 1) - screenh].sort[1]
|
59
72
|
|
60
73
|
if v != @selected
|
61
74
|
dirty!
|
@@ -103,21 +116,45 @@ module Listpager
|
|
103
116
|
s.gsub(/[^[:print:]]/, '')
|
104
117
|
end
|
105
118
|
|
119
|
+
def getminxy
|
120
|
+
x, y = 0, 0
|
121
|
+
y += 1 if title
|
122
|
+
[x, y]
|
123
|
+
end
|
124
|
+
|
106
125
|
def getmaxxy
|
107
126
|
maxx, maxy = [], []
|
108
127
|
window.getmaxyx(maxy, maxx)
|
109
128
|
[maxx[0], maxy[0]]
|
110
129
|
end
|
111
130
|
|
131
|
+
def space_pad(s, w)
|
132
|
+
nspaces = (w - s.size)
|
133
|
+
nspaces = 0 if nspaces < 0
|
134
|
+
s + (BLANK_SPACE * (w - s.size))
|
135
|
+
end
|
136
|
+
|
137
|
+
def render_title
|
138
|
+
maxx, maxy = getmaxxy
|
139
|
+
if title
|
140
|
+
window.color_set(Color[:title], nil)
|
141
|
+
window.move(0, 0)
|
142
|
+
window.addstr(space_pad(' ' + title, maxx))
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
112
146
|
def render
|
113
147
|
return false if ! dirty?
|
114
148
|
|
149
|
+
render_title
|
150
|
+
|
115
151
|
maxx, maxy = getmaxxy
|
152
|
+
minx, miny = getminxy
|
116
153
|
|
117
|
-
(
|
154
|
+
(miny...maxy).each do |i|
|
118
155
|
window.color_set(Color[:list_default], nil)
|
119
156
|
|
120
|
-
list_index = offset + i
|
157
|
+
list_index = (offset + i) - miny
|
121
158
|
window.move(i, 0)
|
122
159
|
indicator = nil
|
123
160
|
|
data/lib/listpager/scrollbar.rb
CHANGED
data/lib/listpager/version.rb
CHANGED
data/listpager.gemspec
CHANGED
@@ -27,16 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
28
|
spec.require_paths = ["lib"]
|
29
29
|
|
30
|
-
|
31
|
-
#
|
32
|
-
# if RUBY_PLATFORM =~ /\bdarwin/
|
33
|
-
# spec.add_runtime_dependency 'ncurses-ruby'
|
34
|
-
# else
|
35
|
-
# # Doesn't build on newer macOS...
|
36
|
-
# spec.add_runtime_dependency 'ncursesw'
|
37
|
-
# end
|
38
|
-
#
|
39
|
-
# A PR has been submitted to ncursesw, so hopefully this can go away soon.
|
30
|
+
spec.add_runtime_dependency "ncursesw", "~> 1.4.10"
|
40
31
|
|
41
32
|
spec.add_development_dependency "bundler", "~> 1.12"
|
42
33
|
spec.add_development_dependency "rake", "~> 10.0"
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: listpager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Owens
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ncursesw
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.4.10
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.4.10
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -55,12 +69,10 @@ files:
|
|
55
69
|
- bin/setup
|
56
70
|
- doc/screenshot.png
|
57
71
|
- exe/listpager
|
58
|
-
- ext/mkrf_conf.rb
|
59
72
|
- lib/listpager.rb
|
60
73
|
- lib/listpager/client_terminal.rb
|
61
74
|
- lib/listpager/color.rb
|
62
75
|
- lib/listpager/list.rb
|
63
|
-
- lib/listpager/ncurses.rb
|
64
76
|
- lib/listpager/scrollbar.rb
|
65
77
|
- lib/listpager/version.rb
|
66
78
|
- listpager.gemspec
|
data/ext/mkrf_conf.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rubygems/command.rb'
|
3
|
-
require 'rubygems/dependency_installer.rb'
|
4
|
-
|
5
|
-
begin
|
6
|
-
Gem::Command.build_args = ARGV
|
7
|
-
rescue NoMethodError
|
8
|
-
# We're good
|
9
|
-
end
|
10
|
-
|
11
|
-
inst = Gem::DependencyInstaller.new
|
12
|
-
begin
|
13
|
-
if RUBY_PLATFORM =~ /\bdarwin/i
|
14
|
-
inst.install "ruby-ncurses", "~> 1.2.4"
|
15
|
-
else
|
16
|
-
inst.install "ncursesw", "~> 1.4.9"
|
17
|
-
end
|
18
|
-
rescue
|
19
|
-
exit 1
|
20
|
-
end
|
21
|
-
|
22
|
-
# create dummy rakefile to indicate success
|
23
|
-
File.write(__dir__("Rakefile"), "task: default\n")
|