File: gtk_userlist.rb

package info (click to toggle)
mikutter 3.8.6%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 10,544 kB
  • sloc: ruby: 20,548; sh: 99; makefile: 19
file content (93 lines) | stat: -rw-r--r-- 2,218 bytes parent folder | download
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