Class: Canopus::Panel::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/canopus/panel.rb,
sig/panel.rbs

Constant Summary collapse

DOCKS =

Returns:

  • (Array[dock])
%i[left right bottom].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(docks) ⇒ Registry

Returns a new instance of Registry.

Parameters:

  • docks (Hash[dock, dock_state])


12
13
14
15
# File 'lib/canopus/panel.rb', line 12

def initialize(docks)
  @docks = docks
  @definitions, @states = {}, {}
end

Instance Attribute Details

#docks ⇒ Hash[dock, dock_state] (readonly)

Returns the value of attribute docks.

Returns:

  • (Hash[dock, dock_state])


10
11
12
# File 'lib/canopus/panel.rb', line 10

def docks
  @docks
end

Instance Method Details

#active(dock) ⇒ Array[Definition]

Parameters:

  • dock (dock)

Returns:

Raises:

  • (ArgumentError)


53
54
55
56
# File 'lib/canopus/panel.rb', line 53

def active(dock)
  raise ArgumentError, "invalid dock side" unless DOCKS.include?(dock)
  @definitions.each_value.select { |definition| definition.dock == dock && visible?(definition.id) }
end

#badge(id, value) ⇒ Definition

Parameters:

  • id (String, Symbol)
  • value (Object)

Returns:



58
59
60
61
# File 'lib/canopus/panel.rb', line 58

def badge(id, value)
  definition = fetch(id).with(badge: value)
  @definitions[definition.id] = definition
end

#fetch(id) ⇒ Definition

Parameters:

  • id (String, Symbol)

Returns:



27
# File 'lib/canopus/panel.rb', line 27

def fetch(id) = @definitions.fetch(id.to_s)

#hide(id) ⇒ Definition

Parameters:

  • id (String, Symbol)

Returns:



43
44
45
46
47
48
49
# File 'lib/canopus/panel.rb', line 43

def hide(id)
  definition = fetch(id)
  state = @states.fetch(definition.id)
  state[:size], state[:visible] = @docks.fetch(definition.dock)[:size], false
  @docks.fetch(definition.dock)[:visible] = false if active(definition.dock).empty?
  definition
end

#key?(id) ⇒ Boolean

Parameters:

  • id (String, Symbol)

Returns:

  • (Boolean)


28
# File 'lib/canopus/panel.rb', line 28

def key?(id) = @definitions.key?(id.to_s)

#register(definition, visible: true, size: nil) ⇒ Definition

Parameters:

  • definition (Definition)
  • visible: (Boolean) (defaults to: true)
  • size: (Numeric, nil) (defaults to: nil)

Returns:

Raises:

  • (ArgumentError)


17
18
19
20
21
22
23
24
25
# File 'lib/canopus/panel.rb', line 17

def register(definition, visible: true, size: nil)
  definition = normalize(definition)
  raise ArgumentError, "panel visibility must be true or false" unless [true, false].include?(visible)
  size ||= @docks.fetch(definition.dock)[:size]
  raise ArgumentError, "invalid panel size" unless size.is_a?(Numeric) && size.finite? && size.positive?
  @definitions[definition.id] = definition
  @states[definition.id] ||= {visible: visible, size: size}
  definition
end

#resize(dock, size) ⇒ Numeric

Parameters:

  • dock (dock)
  • size (Numeric)

Returns:

  • (Numeric)

Raises:

  • (ArgumentError)


63
64
65
66
67
68
# File 'lib/canopus/panel.rb', line 63

def resize(dock, size)
  raise ArgumentError, "invalid dock size" unless size.is_a?(Numeric) && size.finite? && size.positive?
  @docks.fetch(dock)[:size] = size
  active(dock).each { |definition| @states.fetch(definition.id)[:size] = size }
  size
end

#restore(state, docks: nil) ⇒ self

Parameters:

  • state (saved_state)
  • docks: (Hash[dock, dock_state], nil) (defaults to: nil)

Returns:

  • (self)

Raises:

  • (ArgumentError)


74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/canopus/panel.rb', line 74

def restore(state, docks: nil)
  raise ArgumentError, "panel state must be an object" unless state.is_a?(Hash) && state.length <= 1_000
  restored = state.each_with_object({}) do |(id, value), result|
    id = id.to_s
    valid = value.is_a?(Hash) && [true, false].include?(value["visible"]) &&
      value["size"].is_a?(Numeric) && value["size"].finite? && value["size"].positive?
    raise ArgumentError, "invalid panel state: #{id}" if @definitions.key?(id) && !valid
    next unless valid
    result[id] = {visible: value["visible"], size: value["size"]}
  end
  @docks.replace(docks.transform_values(&:dup)) if docks
  @states.merge!(restored)
  self
end

#show(id) ⇒ Definition

Parameters:

  • id (String, Symbol)

Returns:



34
35
36
37
38
39
40
41
# File 'lib/canopus/panel.rb', line 34

def show(id)
  definition = fetch(id)
  state = @states.fetch(definition.id)
  state[:visible] = true
  dock = @docks.fetch(definition.dock)
  dock[:size], dock[:visible] = state[:size], true
  definition
end

#state ⇒ saved_state

Returns:

  • (saved_state)


70
71
72
# File 'lib/canopus/panel.rb', line 70

def state
  @states.to_h { |id, value| [id, {"visible" => value[:visible], "size" => value[:size]}] }
end

#toggle(id) ⇒ Definition

Parameters:

  • id (String, Symbol)

Returns:



51
# File 'lib/canopus/panel.rb', line 51

def toggle(id) = visible?(id) ? hide(id) : show(id)

#visible?(id) ⇒ Boolean

Parameters:

  • id (String, Symbol)

Returns:

  • (Boolean)


29
30
31
32
# File 'lib/canopus/panel.rb', line 29

def visible?(id)
  definition = fetch(id)
  !!@states.fetch(definition.id)[:visible]
end