module Diva::Model::PhotoMixin

画像リソースを扱うModelのためのmix-in。 これをincludeすると、画像データを保存するblobフィールドが追加される。

このmoduleをincludeしたクラスは、必要に応じて download_routine をオーバライドする

Constants

DownloadThread
GdkPixbufCache

Public Class Methods

included(klass) click to toggle source
# File core/lib/diva_hacks/mixin/photo_mixin.rb, line 13
def self.included(klass)
  klass.field.string :blob
end
new(*rest) click to toggle source
Calls superclass method
# File core/lib/diva_hacks/mixin/photo_mixin.rb, line 17
def initialize(*rest)
  super
  @read_count = 0
  @cached = false
  @forget = nil
end

Public Instance Methods

completed?() click to toggle source

画像のダウンロードが終わっていれば真を返す。 真を返す時、 blob には完全な画像の情報が存在している

# File core/lib/diva_hacks/mixin/photo_mixin.rb, line 48
def completed?
  @state == :complete
end
download() { |part| ... } click to toggle source

画像をダウンロードする。 partialを指定すると、ダウンロードの進捗があれば、前回呼び出されたときから ダウンロードできた内容を引数に呼び出される。 既にダウンロードが終わっていれば、 blob の戻り値がそのまま渡される。 このメソッドは、複数回呼び出されても画像のダウンロードを一度しか行わない。

Args

&partial_callback

現在ダウンロードできたデータの一部(String)

Return

Delayer::Deferred::Deferredable

ダウンロードが完了したらselfを引数に呼び出される

# File core/lib/diva_hacks/mixin/photo_mixin.rb, line 33
def download(&partial_callback)      # :yield: part
  increase_read_count
  case @state
  when :complete
    partial_callback.(blob) if block_given?
    Delayer::Deferred.new.next{ self }
  when :download
    append_download_queue(&partial_callback)
  else
    download!(&partial_callback)
  end
end
download_pixbuf(width:, height:) click to toggle source

特定のサイズのPixbufを作成するDeferredを返す

# File core/mui/gtk_photo_pixbuf.rb, line 12
def download_pixbuf(width,, height))
  increase_read_count
  cache_get_defer(width: width, height: height).trap do |err|
    error err if err
    gen_pixbuf_from_raw_data(width: width, height: height)
  end
end
downloading?() click to toggle source

画像をダウロード中なら真

# File core/lib/diva_hacks/mixin/photo_mixin.rb, line 53
def downloading?
  @state == :download
end
inspect() click to toggle source
# File core/lib/diva_hacks/mixin/photo_mixin.rb, line 62
def inspect
  if @state == :complete
    "#<#{self.class}: #{uri} (state: #{@state}, #{self.blob.size} bytes cached)>"
  else
    "#<#{self.class}: #{uri} (state: #{@state})>"
  end
end
load_pixbuf(width:, height:, ifnone: Skin['notfound.png'].pixbuf(width: width, height: height), &complete_callback) click to toggle source

#download_pixbuf と似ているが、すぐさまキャッシュされているGdkPixbuf::Pixbufを返す。 取得に失敗した場合は ifnone を返す。 もしキャッシュされた GdkPixbuf::Pixbuf が存在しない場合、ロード中を示すPixbufを返し、 GdkPixbuf::Pixbuf の作成を開始する。 作成が完了したら、その Pixbuf を引数に _&complete_callback_ が呼び出される。

Args

width:

取得する Pixbuf の幅(px)

height:

取得する Pixbuf の高さ(px)

ifnone:

Pixbuf が存在しなかった時に _&complete_callback_ に渡す値

&complete_callback

このメソッドによって画像のダウンロードが行われた場合、ダウンロード完了時に呼ばれる

Return

GdkPixbuf::Pixbuf

pixbuf

# File core/mui/gtk_photo_pixbuf.rb, line 32
def load_pixbuf(width,, height,, ifnone: Skin['notfound.png'].pixbuf(width: width, height: height), &complete_callback)
  result = pixbuf(width: width, height: height) rescue ifnone
  if result
    result
  else
    download_pixbuf(width: width, height: height).next(&complete_callback).trap{
      complete_callback.(ifnone)
    }
    Skin['loading.png'].pixbuf(width: width, height: height)
  end
end
local?() click to toggle source

ローカルファイルシステム上のものなら真

# File core/mui/gtk_photo_pixbuf.rb, line 7
def local?
  uri.scheme == 'file'.freeze
end
pixbuf(width:, height:) click to toggle source

引数の寸法の GdkPixbuf::Pixbuf を、Pixbufキャッシュから返す。 Pixbufキャッシュに存在しない場合は nil を返す。 ただし、ロファイルシステム上に見つかった場合は、その場でそれを読み込んで返す。 つまり、ファイルシステムのファイルを示している場合は、このメソッドはnilを返さず、常に GdkPixbuf::Pixbuf を返す。

Args

width:

Pixbufの幅(px)

height:

Pixbufの高さ(px)

Return

GdkPixbuf::Pixbuf

メモリキャッシュやファイルシステムから画像が見つかった場合

nil

画像がローカルにキャッシュされていない場合

# File core/mui/gtk_photo_pixbuf.rb, line 54
def pixbuf(width,, height))
  result = pixbuf_cache[[width, height].hash]
  if result
    result.read_count += 1
    result.reserver.cancel if result.reserver
    result.reserver = pixbuf_forget(width, height, result.read_count)
    result.pixbuf
  elsif local?
    pixbuf_cache_set(GdkPixbuf::Pixbuf.new(file: uri.path, width: width, height: height), width: width, height: height)
  end
end
ready?() click to toggle source

ダウンロードが始まっていなければ真

# File core/lib/diva_hacks/mixin/photo_mixin.rb, line 58
def ready?
  !@state
end