Progress Bar を使ってみる
Progress Bar をつけてみるで WebView に Progress Bar をつけてみたけど、いろいろごちゃごちゃしるので、もっと簡単にアプリケーションの他の場面で Progress Bar を使う方法をメモってみる。
まずは、Interface Builder で、Window に配置する。
オプションはいろいろある。Style はここでは Bar のままにしておくけど、くるくる回る Spinning も選べる。それ以外は、ここで設定してもいいけど、今回はスクリプトでやる方法のメモなので、適当に。
Size も後で変えられるんだけど、そうそうコロコロ変えるものでもないだろうから、Size のところで変えておく。ここでは、細いやつにしたいので Small を選んでみた。
さて、これで、outlet に結びつけて @progressBar というインスタンス変数で扱っていく。
まずは、最初に設定するのが、Progress Bar を別スレッドで扱う設定。setUsesThreadedAnimation(true/false) というメソッドを使う。これをしないと、メインの処理をしている間は Progress Bar が反応しない。awakeFromNib にでも入れておく。
def awakeFromNib()
@progressBar.setUsesThreadedAnimation(true)
end
次に、Progress Bar の表示のタイプを決める。Bar の場合、Indeterminate かどうか、つまり、Bar が進んでいくか、動いているというのを示すかだけかの違い。これには、setIndeterminate(true/false) というメソッドを使う。これは、ずっとどちらかにするなら Interface Builder で設定してもいいし、awakeFromNib に入れておいてもいい。そうでなければ、Progress Bar を使いたいときにその都度設定する。
@progressBar.setIndeterminate(true)
@progressBar.setIndeterminate(false)
setIndeterminate(true) としたときは、startAnimation(sender) で動かして stopAnimation(sender) で止める。
@progressBar.startAnimation(nil)
@progressBar.stopAnimation(nil)
setIndeterminate(false) としたときは、値などを設定していく。まずは、setMinValu(value) で最小値を setMaxValue(value) で最大値を設定する。double で設定する、とあるんだけど、Ruby では float、というか少数で設定する。別に integer というか整数であっても問題なく動くけど。これも決めうちなら Interface Builder で設定してもいいし、awakeFromNib に入れておいてもいい。
@progressBar.setMinValue(0.0)
@progressBar.setMaxValue(10.0)
次に、動かし始めるときに、setDoubleValue(value) で値を設定する。まずは 0 から始めたければ 0 もしくは 0.0 を指定する。
@progressBar.setDoubleValue(0.0)
Bar を進行させるには、incrementBy(value) で進める量を指定する。これは、ループ処理の中なんかに入れる。
@progressBar.incrementBy(1.0)
あと、動いていないときに表示させないようにするには、setDisplayedWhenStopped(true/false) というメソッドで設定する。もちろん Interface Builder でも設定できる。表示させないようにすると、stopAnimation(sender) で止めたときに Progress Bar 自体が表示されなくなる。indeterminate に設定されていないときは、Max Value になると消えたと思うけど、今回これを書いている時点で確認してないので、確認したらまた修正します。あと、また何か試してわかったことがあったら加筆します。
@progressBar.setDisplayedWhenStopped(true)
最後に、スクリプトをまとめて、少し応用みたいなのにしてみる。
ここでは、ファイルの単語の頻度を数えて、TableView で表示させるために @output という配列に結果を並べ替えて入れている。処理には単語頻度を数えるにある単語頻度を数えるスクリプトを入れてみた。
awakeFromNib では、Progress Bar を別スレッドで処理するのと、止まったら消えるようにする設定をする。実際の処理では、ボタンをクリックすると、runProcess(sender) という処理が行われるようにする。ファイル名が入っている @files という配列を使い、ファイルを一つ処理するごとに Progress Bar を進める。
最初に、ファイル処理の段階では Bar を進めたいので、indeterminate の設定を外す。そして、最小値、最大値を設定する。Max Value は配列の長さ、つまりファイル数にしてある。
一つファイルの処理が終わるごとに incrementBy(value) で Bar を進める。
ファイルの処理が終わったら、並べ替えなんだけど、この時点で単語数が多かったりすると時間がかかるかもしれないので、indeterminate に設定して、startAnimation(sender) でアニメーションを動かす。並べ替え処理が終わった時点で stopAnimation(sender) で止める。止まると Bar は消えるようになっている。
def awakeFromNib()
@progressBar.setUsesThreadedAnimation(true)
@progressBar.setDisplayedWhenStopped(true)
end
def runProcess(sender)
@progressBar.setIndeterminate(false)
@progressBar.setMinValue(0.0)
@progressBar.setMaxValue(@files.length)
words = Hash.new(0)
@files.each do |file|
File.open(file,"r") do |f|
f.read.downcase.split(/\W+/).each do |word|
words[word] += 1
end
end
@progressBar.incrementBy(1.0)
end
@progressBar.setIndeterminate(true)
@progressBar.startAnimation(nil)
@output = words.sort_by{|word,count| [-count,word]}
@progressBar.stopAnimation(nil)
@table.reloadData
end
ib_action :runProcess