Class: Vedeu::Input::Keymap

Inherits:
Object
  • Object
show all
Includes:
Repositories::Model
Defined in:
lib/vedeu/input/keymap.rb

Overview

A container class for keys associated with a particular interface.

Instance Attribute Summary collapse

Attributes included from Repositories::Model

#repository

Instance Method Summary collapse

Methods included from Repositories::Model

included, #store

Methods included from Common

#absent?, #array?, #boolean, #boolean?, #empty_value?, #escape?, #falsy?, #hash?, #line_model?, #numeric?, #positionable?, #present?, #snake_case, #stream_model?, #string?, #symbol?, #truthy?, #view_model?

Constructor Details

#initialize(attributes = {}) ⇒ Vedeu::Input::Keymap

Returns a new instance of Vedeu::Input::Keymap.

Parameters:

Options Hash (attributes):

  • name (String|Symbol)

    The name of the keymap.

  • keys (Vedeu::Input::Keys|Array)

    A collection of keys.

  • repository (Object)
    Vedeu::Repositories::Repository

    This model’s storage.



29
30
31
32
33
# File 'lib/vedeu/input/keymap.rb', line 29

def initialize(attributes = {})
  defaults.merge!(attributes).each do |key, value|
    instance_variable_set("@#{key}", value)
  end
end

Instance Attribute Details

#nameString

Returns:

  • (String)


16
17
18
# File 'lib/vedeu/input/keymap.rb', line 16

def name
  @name
end

Instance Method Details

#add(key) ⇒ void

This method returns an undefined value.

Add a key to the keymap.

Parameters:



39
40
41
42
43
# File 'lib/vedeu/input/keymap.rb', line 39

def add(key)
  return false unless valid?(key)

  @keys = keys.add(key)
end

#defaultsHash<Symbol => void> (private)

The default options/attributes for a new instance of this class.

Returns:

  • (Hash<Symbol => void>)


89
90
91
92
93
94
95
# File 'lib/vedeu/input/keymap.rb', line 89

def defaults
  {
    name:       '',
    keys:       [],
    repository: Vedeu.keymaps,
  }
end

#deputy(client = nil) ⇒ Vedeu::Input::DSL

Returns a DSL instance responsible for defining the DSL methods of this model.

Parameters:

  • client (Object|NilClass) (defaults to: nil)

    The client binding represents the client application object that is currently invoking a DSL method. It is required so that we can send messages to the client application object should we need to.

Returns:



53
54
55
# File 'lib/vedeu/input/keymap.rb', line 53

def deputy(client = nil)
  Vedeu::Input::DSL.new(self, client)
end

#key_defined?(input) ⇒ Boolean

Check whether the key is already defined for this keymap.

Parameters:

  • input (String|Symbol)

Returns:

  • (Boolean)

    A boolean indicating the input provided is already in use for this keymap.



69
70
71
# File 'lib/vedeu/input/keymap.rb', line 69

def key_defined?(input)
  keys.any? { |key| key.input == input }
end

#keysVedeu::Input::Keys

Returns the collection of keys defined for this keymap.

Returns:



60
61
62
# File 'lib/vedeu/input/keymap.rb', line 60

def keys
  Vedeu::Input::Keys.coerce(@keys, self)
end

#use(input) ⇒ Array|Boolean

When the given input is registered with this keymap, this method triggers the action associated with the key.

Parameters:

  • input (String|Symbol)

Returns:



78
79
80
81
82
83
84
# File 'lib/vedeu/input/keymap.rb', line 78

def use(input)
  return false unless key_defined?(input)

  Vedeu.log(type: :input, message: "Key pressed: '#{input}'")

  keys.select { |key| key.input == input }.map(&:press)
end

#valid?(key) ⇒ Boolean (private)

Checks that the provided key is not already registered with this keymap.

Parameters:

Returns:



102
103
104
105
106
107
108
109
110
# File 'lib/vedeu/input/keymap.rb', line 102

def valid?(key)
  return true unless key_defined?(key.input)

  Vedeu.log(type:    :input,
            message: "Keymap '#{name}' already " \
                     "defines '#{key.input}'.")

  false
end