ifilter 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b3c3826565d691dd1f2125b61351f67e7328599d
4
- data.tar.gz: f98fc31feb76580b6b696b7ccc76a6eee7902eb2
3
+ metadata.gz: 87bc44ff9b07d7dced65ad01dc151214cf4753ff
4
+ data.tar.gz: e63a537acc96986989e621d51c94b06da85168af
5
5
  SHA512:
6
- metadata.gz: 300473b6da810bc1c060924881e2ecc3bd3e49293eb51c35449aafc32e1e41fc397033f97bd5be826b75be72e3b3af2d8523448ab2922cf5c600e418d37d9cac
7
- data.tar.gz: a9809b2d05043a1f6f0bf82b1233d3f091af9fb2f0d079cc64a84b8b22ac7192b531b748e681f4a051aa865bda180de99c39dadb2d553aa414993539a7ea87be
6
+ metadata.gz: 598ffac359a6728b9189d1e4c065c1ecdb62f5a4db4d9ed7c33f901b967d2817d07c42c9282f9c8440b9d058776a3c4c579600ae2622b2566885069125445e62
7
+ data.tar.gz: 682d6f1ccde77971b4166ff4c2687243da80266eb7cb236903d3195fb591f347f93438634a784fb3c8eeba742d56479744e82103ac198e5b9451b112bf955b71
data/.gitignore CHANGED
@@ -7,3 +7,5 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+
11
+ vendor
@@ -56,7 +56,7 @@ module Ifilter
56
56
 
57
57
  private
58
58
 
59
- def update_window
59
+ def update_window(cursor_position: 1)
60
60
  # Initialize a window
61
61
  @window.clear
62
62
  reset_cursor_position
@@ -67,18 +67,24 @@ module Ifilter
67
67
  @outputs = filtering_by_input(@target, start_index: start_index)
68
68
 
69
69
  # Redraw the output
70
- output_line(@prompt + @input.to_s)
70
+ output_prompt
71
71
  output_current_page
72
72
  @outputs.each do |output|
73
+ @window.setpos(@cursor_position, 0)
73
74
  output_line(output)
75
+ @cursor_position += 1
74
76
  end
75
- reset_cursor_position
77
+
78
+ @cursor_position = cursor_position
79
+ @window.setpos(@cursor_position, 0)
80
+
81
+ highlight_cursor_position
76
82
  end
77
83
 
78
84
  def get_keycode(key)
79
- Curses.constants.select do |name|
85
+ Curses.constants.select {|name|
80
86
  name =~ /^KEY/ && Curses.const_get(name) == key
81
- end.first
87
+ }.first
82
88
  end
83
89
 
84
90
  def filtering_by_input(array, start_index: 0)
@@ -94,29 +100,34 @@ module Ifilter
94
100
  end
95
101
 
96
102
  def output_line(word)
97
- unless @cursor_position - 1 > @window.maxy - 1
98
- @window.setpos(@cursor_position - 1, 0)
99
-
100
- if !@input.size.zero? && @cursor_position > 1 && match_pos = word =~ @input.to_regexp
101
- @window << word[0, match_pos]
103
+ if @cursor_position > @window.maxy - 1
104
+ return
105
+ end
102
106
 
103
- @window.standout
104
- @window << word[match_pos, @input.size]
105
- @window.standend
107
+ if !@input.size.zero? && match_pos = word =~ @input.to_regexp
108
+ @window << word[0, match_pos]
106
109
 
107
- @window << word[match_pos + @input.size, word.size - match_pos + @input.size]
108
- else
109
- @window << word
110
- end
110
+ @window.attrset(Curses.color_pair(3))
111
+ @window << word[match_pos, @input.size]
112
+ @window.attrunset(Curses.color_pair(3))
111
113
 
112
- @cursor_position += 1
114
+ @window << word[match_pos + @input.size, word.size - match_pos + @input.size]
115
+ @window.attrset(Curses.color_pair(1))
116
+ else
117
+ @window << word
113
118
  end
114
119
  end
115
120
 
121
+ def output_prompt
122
+ @window.setpos(0, 0)
123
+
124
+ @window << @prompt + @input.to_s
125
+ end
126
+
116
127
  def output_current_page
117
- word = "[#{@page_number}/#{max_page_number.zero? ? 1 : max_page_number}]"
118
- @window.setpos(@cursor_position - 1, @window.maxx)
128
+ @window.setpos(0, @window.maxx)
119
129
 
130
+ word = "[#{@page_number}/#{max_page_number.zero? ? 1 : max_page_number}]"
120
131
  @window << (' ' * (@window.maxx - @prompt.size - @input.size - word.size)) + word
121
132
  end
122
133
 
@@ -124,8 +135,7 @@ module Ifilter
124
135
  if @cursor_position == 1
125
136
  scroll_prev_page
126
137
  else
127
- @cursor_position -= 1
128
- @window.setpos(@cursor_position, 0)
138
+ update_window(cursor_position: @cursor_position - 1)
129
139
  end
130
140
  end
131
141
 
@@ -133,8 +143,7 @@ module Ifilter
133
143
  if @cursor_position == @window.maxy - 1 || @cursor_position == @outputs.size
134
144
  scroll_next_page
135
145
  else
136
- @cursor_position += 1
137
- @window.setpos(@cursor_position, 0)
146
+ update_window(cursor_position: @cursor_position + 1)
138
147
  end
139
148
  end
140
149
 
@@ -146,16 +155,10 @@ module Ifilter
146
155
  def scroll_prev_page
147
156
  if @page_number == 1
148
157
  @page_number = max_page_number
149
- update_window
150
-
151
- @cursor_position = last_output_position
152
- @window.setpos(@cursor_position, 0)
158
+ update_window(cursor_position: last_output_position)
153
159
  else
154
160
  @page_number -= 1
155
- update_window
156
-
157
- @cursor_position = @window.maxy - 1
158
- @window.setpos(@cursor_position, 0)
161
+ update_window(cursor_position: @window.maxy - 1)
159
162
  end
160
163
  end
161
164
 
@@ -169,6 +172,12 @@ module Ifilter
169
172
  end
170
173
  end
171
174
 
175
+ def highlight_cursor_position
176
+ @window.attrset(Curses.color_pair(2))
177
+ output_line(@outputs[@cursor_position - 1].to_s.slice(0, @window.maxx - 1))
178
+ @window.attrset(Curses.color_pair(1))
179
+ end
180
+
172
181
  def max_page_number
173
182
  (filtering_by_input(@target).size.to_f / (@window.maxy - 1).to_f).ceil
174
183
  end
@@ -1,3 +1,3 @@
1
1
  module Ifilter
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -2,16 +2,33 @@ require 'curses'
2
2
 
3
3
  module Ifilter
4
4
  class Window < Curses::Window
5
- def initialize(height, width, y, x)
5
+ def initialize(*args)
6
+ @previous_colors = []
7
+
6
8
  Curses.init_screen
9
+ Curses.start_color
7
10
  Curses.crmode
8
11
  Curses.noecho
12
+ Curses.curs_set(0) # invisible
13
+ Curses.init_pair(1, Curses::COLOR_WHITE, Curses::COLOR_BLACK) # default
14
+ Curses.init_pair(2, Curses::COLOR_BLACK, Curses::COLOR_CYAN) # cursor position
15
+ Curses.init_pair(3, Curses::COLOR_BLACK, Curses::COLOR_MAGENTA) # match string
9
16
 
10
17
  super
11
18
 
12
19
  self.keypad(true)
13
20
  end
14
21
 
22
+ def attrset(color_pair)
23
+ @previous_colors << color_pair
24
+ super
25
+ end
26
+
27
+ def attrunset(color_pair)
28
+ @previous_colors.delete(color_pair)
29
+ self.attrset(@previous_colors.pop)
30
+ end
31
+
15
32
  def close
16
33
  Curses.close_screen
17
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ifilter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kaihar4
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-07-20 00:00:00.000000000 Z
11
+ date: 2015-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -136,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
136
  version: '0'
137
137
  requirements: []
138
138
  rubyforge_project:
139
- rubygems_version: 2.4.5
139
+ rubygems_version: 2.4.5.1
140
140
  signing_key:
141
141
  specification_version: 4
142
142
  summary: Interactive Filter