1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
# -*- coding: utf-8 -*-
require 'gtk2'
miquire :mui, 'extension', 'inneruserlist'
require 'set'
class Gtk::UserList < Gtk::EventBox
include Enumerable
attr_reader :listview
# ユーザをダブルクリックとかされた時に呼ばれるProcを返す
# ==== Return
# Proc
def self.row_activated
->(this, path, column) do
iter = this.model.get_iter(path)
if iter
Plugin.call(:open, iter[Gtk::InnerUserList::COL_USER])
end
end
end
def initialize
super
@listview = Gtk::InnerUserList.new(self)
scrollbar = ::Gtk::VScrollbar.new(@listview.vadjustment)
add Gtk::HBox.new(false, 0).add(@listview).closeup(scrollbar)
@listview.ssc(:row_activated, &self.class.row_activated)
@listview.ssc(:expose_event){
emit_expose_user
false
}
end
def each
@listview.each{ |m, p, i| i[Gtk::InnerUserList::COL_USER] } end
# Userの配列 _users_ を追加する
# ==== Args
# [users] Enumerable ユーザを繰り返すEnumerable
# ==== Return
# self
def add_user(users)
@to_a = nil
@listview.add_user(users)
end
# Userの配列 _users_ に含まれるユーザを削除する
# ==== Args
# [users] ユーザの配列
# ==== Return
# self
def remove_user(users)
@to_a = nil
@listview.remove_user(users)
end
def gen_order(user)
(@order_generator ||= gen_counter).call end
# ユーザ user の順番を再計算する
# ==== Args
# [user] ユーザ
# ==== Return
# self
def reorder(user)
type_strict user => User
@listview.reorder(user)
self end
private
def emit_expose_user
if @listview.visible_range
current, last = @listview.visible_range
Enumerator.new{|y|
while (current <=> last) < 1
y << @listview.model.get_iter(current)
break if not current.next!
end
}.reject{|iter|
iter[Gtk::InnerUserList::COL_ICON]
}.each do |iter|
iter[Gtk::InnerUserList::COL_ICON] = iter[Gtk::InnerUserList::COL_USER].icon.load_pixbuf(width: 24, height: 24){|pixbuf|
iter[Gtk::InnerUserList::COL_ICON] = pixbuf unless @listview.destroyed?
}
end
end
end
end
|