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
209
210
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
|
# File 'lib/core/view.rb', line 209
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
# File 'lib/core/view.rb', line 82
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
76
77
78
79
80
|
# File 'lib/core/view.rb', line 76
def changed!
fix_cursor
changed
notify_observers
end
|
#color(index) ⇒ Object
201
202
203
204
205
206
207
|
# File 'lib/core/view.rb', line 201
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
29
30
31
|
# File 'lib/core/view.rb', line 29
def dirty_all_lines
@dirty_lines = 0.step(get_len).to_a
end
|
#draw ⇒ Object
281
282
283
284
285
286
287
288
289
290
291
292
293
294
|
# File 'lib/core/view.rb', line 281
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
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
|
# File 'lib/core/view.rb', line 253
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
# File 'lib/core/view.rb', line 108
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
190
191
192
193
|
# File 'lib/core/view.rb', line 190
def fix_cursor
@selected = 0 if @selected < 0
@selected = get_len - 1 if @selected >= get_len
end
|
300
|
# File 'lib/core/view.rb', line 300
def get_format; '' end
|
#get_len ⇒ Object
195
196
197
198
199
|
# File 'lib/core/view.rb', line 195
def get_len
len = @items.length
len += @items.values[@expanded].length if @expanded >= 0
len
end
|
#move_cursor(dir) ⇒ Object
159
160
161
162
163
164
165
166
167
|
# File 'lib/core/view.rb', line 159
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
33
34
35
36
37
38
39
40
41
42
|
# File 'lib/core/view.rb', line 33
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
74
|
# File 'lib/core/view.rb', line 74
def pause; end
|
#previous_match ⇒ Object
44
45
46
47
48
49
50
51
52
53
|
# File 'lib/core/view.rb', line 44
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
98
99
100
101
102
103
104
105
106
|
# File 'lib/core/view.rb', line 98
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
296
|
# File 'lib/core/view.rb', line 296
def refresh_attributes; end
|
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
|
# File 'lib/core/view.rb', line 237
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
)
@items_formatted = Zashoku::Formatter.items(get_format, @items)
end
|
#refresh_items ⇒ Object
298
|
# File 'lib/core/view.rb', line 298
def refresh_items; [] end
|
#resolve_selected(resolve_me = @selected) ⇒ Object
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
# File 'lib/core/view.rb', line 125
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/core/view.rb', line 55
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
# File 'lib/core/view.rb', line 169
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
146
147
148
|
# File 'lib/core/view.rb', line 146
def selected_group
resolve_selected['out']
end
|
#selected_item ⇒ Object
150
151
152
153
154
155
156
157
|
# File 'lib/core/view.rb', line 150
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
72
|
# File 'lib/core/view.rb', line 72
def unpause; end
|