Class: Zashoku::View

Inherits:
Object
  • Object
show all
Includes:
Observable, Util
Defined in:
lib/core/view.rb

Direct Known Subclasses

Conf::ConfigView

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

#initializeView

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

  # @win = Curses::Window.new(0,0,0,0)
  @view = [0, Term.rows - 3]
  refresh
end

Instance Attribute Details

#attributesObject

Returns the value of attribute attributes.



8
9
10
# File 'lib/core/view.rb', line 8

def attributes
  @attributes
end

#formatObject

Returns the value of attribute format.



8
9
10
# File 'lib/core/view.rb', line 8

def format
  @format
end

#items_formattedObject

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_viewObject



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 # and @selected > 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[0] += diff
  @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

#cleanupObject



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_linesObject



31
32
33
# File 'lib/core/view.rb', line 31

def dirty_all_lines
  @dirty_lines = 0.step(get_len).to_a
end

#drawObject



284
285
286
287
288
289
290
291
292
293
294
295
296
297
# File 'lib/core/view.rb', line 284

def draw
  # set the view
  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" #.tr(' ', '#')
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_cursorObject



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

#get_formatObject



303
# File 'lib/core/view.rb', line 303

def get_format; '' end

#get_lenObject



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_matchObject



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

#pauseObject



76
# File 'lib/core/view.rb', line 76

def pause; end

#previous_matchObject



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

#refreshObject



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_attributesObject



299
# File 'lib/core/view.rb', line 299

def refresh_attributes; end

#refresh_formatsObject



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_itemsObject



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) #.sort.reverse
  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

  #return if out >= @items.length
  #return if inr >= @items[@expanded].length
  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_groupObject



148
149
150
# File 'lib/core/view.rb', line 148

def selected_group
  resolve_selected['out']
end

#selected_itemObject



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

#unpauseObject



74
# File 'lib/core/view.rb', line 74

def unpause; end