Class: Canopus::Panel::Registry
- Inherits:
-
Object
- Object
- Canopus::Panel::Registry
- Defined in:
- lib/canopus/panel.rb,
sig/panel.rbs
Constant Summary collapse
- DOCKS =
%i[left right bottom].freeze
Instance Attribute Summary collapse
-
#docks ⇒ Hash[dock, dock_state]
readonly
Returns the value of attribute docks.
Instance Method Summary collapse
- #active(dock) ⇒ Array[Definition]
- #badge(id, value) ⇒ Definition
- #fetch(id) ⇒ Definition
- #hide(id) ⇒ Definition
-
#initialize(docks) ⇒ Registry
constructor
A new instance of Registry.
- #key?(id) ⇒ Boolean
- #register(definition, visible: true, size: nil) ⇒ Definition
- #resize(dock, size) ⇒ Numeric
- #restore(state, docks: nil) ⇒ self
- #show(id) ⇒ Definition
- #state ⇒ saved_state
- #toggle(id) ⇒ Definition
- #visible?(id) ⇒ Boolean
Constructor Details
#initialize(docks) ⇒ Registry
Returns a new instance of Registry.
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.
10 11 12 |
# File 'lib/canopus/panel.rb', line 10 def docks @docks end |
Instance Method Details
#active(dock) ⇒ Array[Definition]
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
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
27 |
# File 'lib/canopus/panel.rb', line 27 def fetch(id) = @definitions.fetch(id.to_s) |
#hide(id) ⇒ Definition
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
28 |
# File 'lib/canopus/panel.rb', line 28 def key?(id) = @definitions.key?(id.to_s) |
#register(definition, visible: true, size: nil) ⇒ Definition
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
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
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
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
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
51 |
# File 'lib/canopus/panel.rb', line 51 def toggle(id) = visible?(id) ? hide(id) : show(id) |
#visible?(id) ⇒ Boolean
29 30 31 32 |
# File 'lib/canopus/panel.rb', line 29 def visible?(id) definition = fetch(id) !!@states.fetch(definition.id)[:visible] end |