Module: Vedeu::Models::Focus

Extended by:
Focus
Included in:
Focus
Defined in:
lib/vedeu/models/focus.rb

Overview

Note:
  • Interfaces are added to the collection in the order they are defined.

  • If the interface definition contains ‘focus!`, (see Vedeu::Interfaces::DSL#focus!) then that interface is prepended to the list.

  • If the ‘Vedeu.focus_by_name ’some_interface’‘ declaration is used, then the list pointer (`current`) is set to the interface of that name.

The Focus repository is simply a collection of interface names, this module serving to store and manipulate the which interface is currently being focussed.

Instance Method Summary collapse

Instance Method Details

#add(name, focus = false) ⇒ Array

Add an interface name to the focus list unless it is already registered.



33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/vedeu/models/focus.rb', line 33

def add(name, focus = false)
  if registered?(name)
    return storage unless focus

    by_name(name)

  else
    Vedeu.log(type:    :store,
              message: "Storing focus entry: '#{name}'")

    focus ? storage.unshift(name) : storage.push(name)
  end
end

#by_name(name) ⇒ String|Symbol Also known as: focus_by_name

Focus an interface by name. Used after defining an interface or interfaces to set the initially focussed interface.

Examples:

Vedeu.trigger(:_focus_by_name_, name)
Vedeu.focus_by_name('name')

Raises:



59
60
61
62
63
64
65
# File 'lib/vedeu/models/focus.rb', line 59

def by_name(name)
  not_registered!(name) unless registered?(name)

  storage.rotate!(storage.index(name))

  update
end

#currentNilClass|String|Symbol Also known as: focus, name

Return the interface currently focussed.

Examples:

Vedeu.focus


74
75
76
77
78
# File 'lib/vedeu/models/focus.rb', line 74

def current
  return nil if storage.empty?

  storage[0]
end

#current?(name) ⇒ Boolean Also known as: focussed?

Returns a boolean indicating whether the named interface is focussed.

Examples:

Vedeu.focussed?(name)


90
91
92
# File 'lib/vedeu/models/focus.rb', line 90

def current?(name)
  current == name
end

#focus?Boolean

Returns a boolean indicating whether there are interfaces registered.



99
100
101
# File 'lib/vedeu/models/focus.rb', line 99

def focus?
  !storage.empty?
end

#in_memoryArray (private)

Returns an empty collection ready for the storing of interface names.



235
236
237
# File 'lib/vedeu/models/focus.rb', line 235

def in_memory
  []
end

#interfaceVedeu::Interfaces::Interface (private)



205
206
207
# File 'lib/vedeu/models/focus.rb', line 205

def interface
  Vedeu.interfaces.by_name(current)
end

#next_itemString|Symbol

Put the next interface relative to the current interfaces in focus.

Examples:

Vedeu.trigger(:_focus_next_)
Vedeu.focus_next


111
112
113
114
115
# File 'lib/vedeu/models/focus.rb', line 111

def next_item
  storage.rotate!

  update
end

#next_visible_itemString|Symbol Also known as: focus_next

Put the next visible interface relative to the current interfaces in focus.



122
123
124
125
126
127
128
129
130
131
# File 'lib/vedeu/models/focus.rb', line 122

def next_visible_item
  return update unless visible_items?

  loop do
    storage.rotate!
    break if interface.visible?
  end

  update
end

#not_registered!(name) ⇒ Object (private)



210
211
212
213
214
# File 'lib/vedeu/models/focus.rb', line 210

def not_registered!(name)
  raise Vedeu::Error::ModelNotFound,
        "Cannot focus '#{name}' as this interface has not been " \
        'registered.'
end

#prev_itemString|Symbol Also known as: prev, previous

Put the previous interface relative to the current interface in focus.

Examples:

Vedeu.trigger(:_focus_prev_)
Vedeu.focus_previous


142
143
144
145
146
# File 'lib/vedeu/models/focus.rb', line 142

def prev_item
  storage.rotate!(-1)

  update
end

#prev_visible_itemString|Symbol Also known as: focus_previous

Put the previous visible interface relative to the current interfaces in focus.



154
155
156
157
158
159
160
161
162
163
# File 'lib/vedeu/models/focus.rb', line 154

def prev_visible_item
  return update unless visible_items?

  loop do
    storage.rotate!(-1)
    break if interface.visible?
  end

  update
end

#refreshArray

Refresh the interface in focus.



169
170
171
172
173
# File 'lib/vedeu/models/focus.rb', line 169

def refresh
  Vedeu.trigger(:_refresh_view_, current)

  Vedeu.trigger(:_refresh_cursor_, current)
end

#registered?(name) ⇒ Boolean

Returns a boolean indicating whether the named model is registered.



188
189
190
191
192
# File 'lib/vedeu/models/focus.rb', line 188

def registered?(name)
  return false if storage.empty?

  storage.include?(name)
end

#reset!Array|Hash|Set Also known as: reset

Reset the repository.



197
198
199
# File 'lib/vedeu/models/focus.rb', line 197

def reset!
  @storage = in_memory
end

#storageArray Also known as: registered

Access to the storage for this repository.



178
179
180
# File 'lib/vedeu/models/focus.rb', line 178

def storage
  @storage ||= in_memory
end

#updateString|Boolean (private)

Return the name of the interface in focus after triggering the refresh event for that interface. Returns false when the storage is empty.



221
222
223
224
225
226
227
228
229
# File 'lib/vedeu/models/focus.rb', line 221

def update
  return false if storage.empty?

  Vedeu.log(message: "Interface in focus: '#{current}'")

  refresh

  current
end

#visible_items?Boolean (private)



240
241
242
# File 'lib/vedeu/models/focus.rb', line 240

def visible_items?
  storage.any? { |name| Vedeu.interfaces.by_name(name).visible? }
end