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, encode_object, get_yaml, put_yaml

Constructor Details

#initializeView

Returns a new instance of View.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/core/view.rb', line 15

def initialize
  @attributes = {}

  @children = true
  @expanded = -1
  @selected = 0

  @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.



13
14
15
# File 'lib/core/view.rb', line 13

def attributes
  @attributes
end

#formatObject

Returns the value of attribute format.



13
14
15
# File 'lib/core/view.rb', line 13

def format
  @format
end

#items_formattedObject

Returns the value of attribute items_formatted.



13
14
15
# File 'lib/core/view.rb', line 13

def items_formatted
  @items_formatted
end

Instance Method Details

#adjust_viewObject



166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# File 'lib/core/view.rb', line 166

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

#auto_update(s: :start) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/core/view.rb', line 45

def auto_update(s: :start)
  case s
  when :start
    @update_thread = Thread.new do
      loop do
        refresh
        changed!
        sleep 1
      end
    end
  when :stop
    @update_thread.exit if @update_thread
  end
end

#change_screen_size(redraw: true) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/core/view.rb', line 60

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



39
40
41
42
43
# File 'lib/core/view.rb', line 39

def changed!
  fix_cursor
  changed
  notify_observers
end

#color(index) ⇒ Object



158
159
160
161
162
163
164
# File 'lib/core/view.rb', line 158

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



238
239
240
241
242
243
244
245
246
247
248
249
250
251
# File 'lib/core/view.rb', line 238

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



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
236
# File 'lib/core/view.rb', line 210

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



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/core/view.rb', line 86

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



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

def fix_cursor
  @selected = 0 if @selected < 0
  @selected = get_len - 1 if @selected >= get_len
end

#get_formatObject



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

def get_format; '' end

#get_lenObject



152
153
154
155
156
# File 'lib/core/view.rb', line 152

def get_len
  len = @items.length
  len += @items.values[@expanded].length if @expanded >= 0
  len
end

#move_cursor(dir) ⇒ Object



137
138
139
140
141
142
143
144
145
# File 'lib/core/view.rb', line 137

def move_cursor(dir)
  os = @selected
  @selected -= 1 if dir == 'up'
  @selected += 1 if dir == 'down'
  @dirty_lines += [os, @selected]

  adjust_view
  changed!
end

#pauseObject



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

def pause; end

#refreshObject



76
77
78
79
80
81
82
83
84
# File 'lib/core/view.rb', line 76

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



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

def refresh_attributes; end

#refresh_formatsObject



194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/core/view.rb', line 194

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_itemsObject



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

def refresh_items; [] end

#resolve_selected(resolve_me = @selected) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/core/view.rb', line 103

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

#selected_groupObject



124
125
126
# File 'lib/core/view.rb', line 124

def selected_group
  resolve_selected['out']
end

#selected_itemObject



128
129
130
131
132
133
134
135
# File 'lib/core/view.rb', line 128

def selected_item
  rs = resolve_selected
  if rs['in_expanded']
    @items.values[rs["out"]][rs["in"]]
  else
    @items.keys[rs['out']]
  end
end

#unpauseObject



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

def unpause; end