# -*- coding: utf-8 -*-
# ユーザグループリスト用リストビュー
#

miquire :mui, 'extension'

class Gtk::ListList < Gtk::CRUD

  def column_schemer
    [{:kind => :active, :widget => :boolean, :type => TrueClass, :label => '表示'},
     {:kind => :text, :type => String, :label => 'リスト名'},
     {:type => UserList},
    ].freeze
  end

  # 「自分」のアカウントが関係するTwitterリストでこのリストビューを埋める。
  # ==== Args
  # [own]
  #   真なら自分が作成したTwitterリストのみをこのリストビューに入れる
  #   偽なら自分が作成したものと自分がフォローしているTwitterリストも入れる
  # ==== Return
  # self
  def set_auto_getter(plugin, own = false, &proc)
    type_strict plugin => Plugin, proc => Proc
    add_hook(Service.primary, own, UserLists.new(Plugin.filtering(:following_lists, UserLists.new).first), &proc)
    create = plugin.add_event(:list_created) { |service, lists|
      if destroyed?
        error "gtk widget already destroyed."
      else
        add_hook(service, own, UserLists.new(lists), &proc) end }
    destroy = plugin.add_event(:list_destroy){ |service, list_ids|
      if destroyed?
        error "gtk widget already destroyed."
      else
        each{ |model, path, iter|
          remove(iter) if list_ids.include?(iter[2][:id]) } end }
    signal_connect(:destroy){ |w, event|
      plugin.detach(create).detach(destroy)
      true }
    self end

  private

  # リスト郡 _lists_ の中で、まだリストビューの中にないリストを追加する
  # ==== Args
  # [service] Service
  # [own] 真なら自分の作成したリストのみを追加する
  # [lists] リストの配列(UserLists)
  def add_hook(service, own, lists, &proc)
    type_strict service => Service, lists => UserLists, proc => Proc
    (own ? lists.select{ |list| list[:user].me? } : lists).each{ |list|
      proc.call(service, list, model.append) } end

end
