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.

Parameters:

  • name (NilClass|Symbol|String)

    The name of the model or target model to act upon. May default to ‘Vedeu.focus`.

  • focus (Boolean) (defaults to: false)

    When true, prepends the interface name to the collection, making that interface the currently focussed interface.

Returns:

  • (Array)

    The collection of interface names.



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')

Parameters:

  • name (NilClass|Symbol|String)

    The name of the model or target model to act upon. May default to ‘Vedeu.focus`.

Returns:

  • (String|Symbol)

    The name of the interface now in focus.

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

Returns:

  • (NilClass|String|Symbol)


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)

Parameters:

  • name (NilClass|Symbol|String)

    The name of the model or target model to act upon. May default to ‘Vedeu.focus`.

Returns:



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.

Returns:



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.

Returns:

  • (Array)


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

Returns:

  • (String|Symbol)


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.

Returns:

  • (String|Symbol)


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

Returns:

  • (String|Symbol)


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.

Returns:

  • (String|Symbol)


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.

Returns:

  • (Array)


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.

Parameters:

  • name (NilClass|Symbol|String)

    The name of the model or target model to act upon. May default to ‘Vedeu.focus`.

Returns:



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.

Returns:

  • (Array|Hash|Set)


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.

Returns:

  • (Array)


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.

Returns:



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)

Returns:



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

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