Sha256: edb1c7799bc13a5f28734f4ec55017265e10f9f0655b38328554fb78c326e5a2

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

require 'forwardable'
require 'virtus'

require 'vedeu'
require 'vedeu/models/attributes/line_collection'
require 'vedeu/models/colour'
require 'vedeu/models/style'
require 'vedeu/output/clear'
require 'vedeu/output/render'
require 'vedeu/models/geometry'
require 'vedeu/support/terminal'

# Todo: mutation (events, current)

module Vedeu
  class Interface
    extend Forwardable
    include Virtus.model

    attribute :name,     String
    attribute :group,    String
    attribute :lines,    LineCollection
    attribute :colour,   Colour,   default: Colour.new
    attribute :style,    Style,    default: ''
    attribute :geometry, Geometry, default: Geometry.new
    attribute :current,  String,   default: ''
    attribute :cursor,   Boolean,  default: true
    attribute :delay,    Float,    default: 0
    attribute :buffer,   Array,    default: []

    def_delegators :@geometry, :north, :east, :south, :west,
                               :top, :right, :bottom, :left,
                               :width, :height, :origin

    def initialize(attributes = {})
      super

      Vedeu.events.on(:_refresh_, self.delay)                 { refresh }
      Vedeu.events.on("_refresh_#{name}_".to_sym, self.delay) { refresh }

      unless group.nil? || group.empty?
        Vedeu.events.on("_refresh_group_#{group}_".to_sym, self.delay) do
          refresh
        end
      end

      self
    end

    def clear
      @_clear ||= Clear.call(self)
    end

    def dequeue
      buffer.pop
    end

    def enqueue
      buffer.unshift(self.to_s)
    end

    def refresh
      if buffer.any?
        self.current = buffer.pop

      elsif no_content?
        self.current = clear

      else
        self.current

      end
      Terminal.output(self.current)

      self.current
    end

    def to_s
      Render.call(self)
    end

    private

    def no_content?
      self.current.nil? || self.current.empty?
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
vedeu-0.1.8 lib/vedeu/models/interface.rb