Sha256: 1673906eb65bc32dea36a2f885eca1ed5a4b78d6710c460c35044b39fbfaab31

Contents?: true

Size: 1.59 KB

Versions: 1

Compression:

Stored size: 1.59 KB

Contents

# frozen_string_literal: true

require './lib/repositories/containers/data_table'

class DataList
  # Это "абстрактный" класс
  private_class_method :new

  attr_writer :objects

  # Конструктор, принимает массив любых объектов
  def initialize(objects)
    self.objects = objects
    @listeners = []
  end

  def add_listener(listener)
    @listeners << listener
  end

  def remove_listener(listener)
    @listeners.delete(listener)
  end

  def notify
    @listeners.each { |lst| lst.on_datalist_changed(data_table) }
  end

  # Выбрать элемент по номеру
  def select_element(number)
    self.selected_num = number < objects.size ? number : nil
  end

  def selected_id
    objects[selected_num].id
  end

  # Получить DataTable со всеми элементами.
  def data_table
    result = []
    counter = 0
    objects.each do |obj|
      row = []
      row << counter
      row.push(*table_fields(obj))
      result << row
      counter += 1
    end
    DataTable.new(result)
  end

  # Добавить элементы в конец списка
  def replace_objects(objects)
    self.objects = objects.dup
    notify
  end

  protected

  # Список значений полей для DataTable. Переопределить в наследниках
  def table_fields(_obj)
    []
  end

  # Имена атрибутов объектов по порядку. Переопределить в наследниках
  def column_names
    []
  end

  private

  attr_reader :objects
  attr_accessor :selected_num
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
papaSquidLib-0.1.0 lib/repositories/containers/data_list.rb