Class: Zashoku::View
- Inherits:
-
Object
show all
- Includes:
- Observable, Util
- Defined in:
- lib/core/view.rb
Instance Attribute Summary collapse
Instance Method Summary
collapse
Methods included from Util
alert, decode_object, deep_merge, encode_object, get_yaml, put_yaml
Constructor Details
#initialize ⇒ View
Returns a new instance of View.
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# File 'lib/core/view.rb', line 10
def initialize
@attributes = {}
@children = true
@expanded = -1
@selected = 0
@matches = []
@match_i = -1
@items_formatted = {}
@old_rows = Term.rows
@view = [0, Term.rows - 3]
refresh
end
|
Instance Attribute Details
#attributes ⇒ Object
Returns the value of attribute attributes.
8
9
10
|
# File 'lib/core/view.rb', line 8
def attributes
@attributes
end
|
Returns the value of attribute format.
8
9
10
|
# File 'lib/core/view.rb', line 8
def format
@format
end
|
Returns the value of attribute items_formatted.
8
9
10
|
# File 'lib/core/view.rb', line 8
def items_formatted
@items_formatted
end
|
Instance Method Details
#adjust_view ⇒ Object
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
# File 'lib/core/view.rb', line 211
def adjust_view
buffer = 2
bottom = Term.rows - 3
ov = @view.clone
diff = 0
if @selected < @view[0] + buffer while @selected < @view[0] + buffer
@view[0] -= 1
@view[1] -= 1
end
elsif (@selected > @view[1] - (buffer + 1)) && (@selected < get_len - buffer)
while (@selected > @view[1] - (buffer + 1)) && (@selected < get_len - buffer)
@view[0] += 1
@view[1] += 1
end
end
diff = 0 - @view[0] if @view[0].negative?
diff = bottom - @view[1] if @view[1] < bottom
@view[0] += diff
@view[1] += diff
dirty_all_lines unless ov == @view
end
|
#change_screen_size(redraw: true) ⇒ Object
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/core/view.rb', line 84
def change_screen_size(redraw: true)
@items_formatted = {}
refresh_formats
diff = Term.rows - @old_rows
@view[1] += diff
@old_rows = Term.rows
adjust_view
if redraw
dirty_all_lines
draw
end
end
|
#changed! ⇒ Object
78
79
80
81
82
|
# File 'lib/core/view.rb', line 78
def changed!
fix_cursor
changed
notify_observers
end
|
#cleanup ⇒ Object
29
|
# File 'lib/core/view.rb', line 29
def cleanup; end
|
#color(index) ⇒ Object
203
204
205
206
207
208
209
|
# File 'lib/core/view.rb', line 203
def color(index)
if index == @selected
Zashoku.conf.get(%w[color selected])
else
Zashoku.conf.get(%w[color secondary])
end
end
|
#dirty_all_lines ⇒ Object
31
32
33
|
# File 'lib/core/view.rb', line 31
def dirty_all_lines
@dirty_lines = 0.step(get_len).to_a
end
|
#draw ⇒ Object
284
285
286
287
288
289
290
291
292
293
294
295
296
297
|
# File 'lib/core/view.rb', line 284
def draw
line_on = @view[0]
lines_to_draw = @view[1]
print "\e[1;1H#{@cl['m']}#{@title_formatted}\e[K"
while line_on < lines_to_draw
draw_line(line_on) if @dirty_lines.include?(line_on)
line_on += 1
end
@dirty_lines.clear
end
|
#draw_line(line_on) ⇒ Object
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
|
# File 'lib/core/view.rb', line 256
def draw_line(line_on)
in_outer_region = line_on < get_len
rs = resolve_selected(line_on)
line = line_on - @view[0] + 2
lc =
if line_on == @selected
@cl['s']
elsif rs['in_expanded']
@cl['2']
else
@cl['1']
end
lo = "\e[#{line};1H#{lc}"
item =
if rs['in_expanded'] && @children
"#{@items_formatted.values[@expanded][rs['in']]}"
elsif in_outer_region
"#{@items_formatted.keys[rs['out']]}"
else
''
end
print "#{lo}#{item}\e[K" end
|
#expand(i) ⇒ Object
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
# File 'lib/core/view.rb', line 110
def expand(i)
return if i > @items.length
oexpanded = @expanded
if @expanded == i
@selected = @expanded
@expanded = -1
else
@selected = i
@expanded = i
end
arr = [@expanded, oexpanded] - [-1]
@dirty_lines = arr.min.step(@view[1]).to_a
changed!
end
|
#fix_cursor ⇒ Object
192
193
194
195
|
# File 'lib/core/view.rb', line 192
def fix_cursor
@selected = 0 if @selected < 0
@selected = get_len - 1 if @selected >= get_len
end
|
303
|
# File 'lib/core/view.rb', line 303
def get_format; '' end
|
#get_len ⇒ Object
197
198
199
200
201
|
# File 'lib/core/view.rb', line 197
def get_len
len = @items.length
len += @items.values[@expanded].length if @expanded >= 0
len
end
|
#move_cursor(dir) ⇒ Object
161
162
163
164
165
166
167
168
169
|
# File 'lib/core/view.rb', line 161
def move_cursor(dir)
os = @selected
@selected -= 1 if dir == 'up'
@selected += 1 if dir == 'down'
@dirty_lines += [os, @selected]
adjust_view
changed!
end
|
#next_match ⇒ Object
35
36
37
38
39
40
41
42
43
44
|
# File 'lib/core/view.rb', line 35
def next_match
return if @matches.empty?
@match_i += 1
if @match_i >= @matches.length
@match_i = 0
end
select(*@matches[@match_i])
end
|
#pause ⇒ Object
76
|
# File 'lib/core/view.rb', line 76
def pause; end
|
#previous_match ⇒ Object
46
47
48
49
50
51
52
53
54
55
|
# File 'lib/core/view.rb', line 46
def previous_match
return if @matches.empty?
@match_i -= 1
if @match_i < 0
@match_i = @matches.length - 1
end
select(*@matches[@match_i])
end
|
#refresh ⇒ Object
100
101
102
103
104
105
106
107
108
|
# File 'lib/core/view.rb', line 100
def refresh
@items = refresh_items
@children = @items.class == Hash
refresh_attributes
refresh_formats
dirty_all_lines
@expanded = -1 if @children && @items.values[@expanded].nil?
changed!
end
|
#refresh_attributes ⇒ Object
299
|
# File 'lib/core/view.rb', line 299
def refresh_attributes; end
|
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
|
# File 'lib/core/view.rb', line 239
def refresh_formats
@cl = {
's' => Zashoku.conf.get(%w[color selected]),
'1' => Zashoku.conf.get(%w[color primary]),
'2' => Zashoku.conf.get(%w[color secondary]),
'm' => Zashoku.conf.get(%w[color main])
}
@title_formatted = Zashoku::Formatter.format_line(
get_format['title'],
@attributes
)
return if @items.empty?
@items_formatted = Zashoku::Formatter.items(get_format, @items)
end
|
#refresh_items ⇒ Object
301
|
# File 'lib/core/view.rb', line 301
def refresh_items; [] end
|
#resolve_selected(resolve_me = @selected) ⇒ Object
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
# File 'lib/core/view.rb', line 127
def resolve_selected(resolve_me = @selected)
in_expanded = false
inside = 0
outside = resolve_me
if @expanded > -1
if (resolve_me > @expanded) && (resolve_me <= (@items.values[@expanded].length + @expanded))
outside = @expanded
inside = resolve_me - @expanded - 1
in_expanded = true
elsif resolve_me > @expanded
outside = resolve_me - @items.values[@expanded].length
end
end
{
'out' => outside,
'in' => inside,
'in_expanded' => in_expanded
}
end
|
#search(term) ⇒ Object
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
# File 'lib/core/view.rb', line 57
def search(term)
re = /.*#{term}.*/i
@match_i = -1
outer = -1
@matches = @items_formatted.map do |parent, children|
inner = 0
outer += 1
matches = re.match?(parent) ? [[outer, 0]] : []
matches += children.map do |c|
[outer, inner+=1] if re.match?(c)
end.compact
matches
end.flatten(1) next_match
end
|
#select(out, inr) ⇒ Object
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
# File 'lib/core/view.rb', line 171
def select(out, inr)
out = out.to_i
inr = inr.to_i
unless inr == 0 || @expanded == out
oexpanded = @expanded
@expanded = out
arr = [@expanded, oexpanded] - [-1]
@dirty_lines += arr.min.step(@view[1]).to_a
end
os = @selected
@selected = out + inr
@dirty_lines += [os, @selected]
adjust_view
changed!
end
|
#selected_group ⇒ Object
148
149
150
|
# File 'lib/core/view.rb', line 148
def selected_group
resolve_selected['out']
end
|
#selected_item ⇒ Object
152
153
154
155
156
157
158
159
|
# File 'lib/core/view.rb', line 152
def selected_item
rs = resolve_selected
if rs['in_expanded']
@items.values[rs["out"]][rs["in"]]
else
@items.keys[rs['out']]
end
end
|
#unpause ⇒ Object
74
|
# File 'lib/core/view.rb', line 74
def unpause; end
|