ジャムスタ

just another mind Style

AppleScriptでタイマーアプリを作るための情報収集

ようは、現在時刻を表示するダイアログを作って、それを一分ごとに更新すればそれっぽくなるだろう、というところまではわかる。

 

タイマー機能で時間を賢く使うスクリプト(Mac版) : ライフハッカー[日本版], 仕事も生活も上手くこなすライフハック情報満載のブログ・メディア

 

とりあえず適当にググったら上がヒットした。

 

このアプリは指定した時間事に「おい、おまえちゃっと仕事しているか」と上司のようにダイアログを立ち上げてくれる仕事効率化アプリである。

 

ソースをコピペしておくと、

set delayTime to 60 * 20

repeat

display dialog "Consider if this is really how I should be spending my time. Continue?" buttons {"Yes", "No"} default button 1
if the button returned of the result is "Yes" then
delay delayTime
else
exit repeat
end if
end repeat

 

となっている。

最初の60 * 20はループする時間の指定。ようは20分後にダイアログさんによる再チェックが行われるわけだ。

 

repeatは繰り返しの指定。

その下はダイアログを表示させて、""の中の文章を表示しつつ、ダイアログはYesとNoの二つのボタンを表示して、しかもデフォルト(標準選択されていもの)はYesにしておけ、という文。

で、もしそのボタンがYesを押されたら、最初に指定したループの時間だけ処理を止める。で、その後repeat部分に戻って以下略。

そうでなければ(yesを押す以外の処理ならば)、繰り返しのループから抜け出す。

 

という感じ。とりあえずひな形としては使えそう。

 

繰り返しのタイミングを60秒にして、ダイアログを"現在時刻"にすれば、一分単位でダイアログが現在時刻の表示される。ただし、毎回OKボタンを押さないといけない。それは目指すタイマーアプリとは違う。

 

とりあえず、ボタンを一つにして、それを押せばタイマーが止まる、そうでないならループを繰り返す、という方がよいだろうか。

 

現在時刻に関するデータは current date から持ってこられる。日付の情報などは必要ないので、

 

the time string of (current date)

 

あたりを使えばいいだろうか。

 

これで時間、分、秒のstringが得られる。

 

とりあえず、ダイアログの中身を書き換える。

 

set delayTime to 60

repeat
    set time_start to time string of (current date)
    display dialog time_start buttons {"Yes", "No"} default button 1
    if the button returned of the result is "Yes" then
        delay delayTime
    else
        exit repeat
    end if
end repeat

 

これで毎回一分ごとに今の時刻を表示するダイアログが出てくる。

 

あとは繰り返しの処理。

 

set delayTime to 60

repeat
    set time_start to time string of (current date)
    display dialog time_start buttons {"終了"} default button 1
    if the button returned of the result is "終了" then
        exit repeat
    else
        delay delayTime
    end if
   
end repeat

 

とボタンを一つ消して、終了ボタンが押されたら終了。そうでなければ60秒待ってリピートさせるとやりたかったがうまくいかず。よくよく考えたらダイアログが閉じていないから次の処理に進まないのだ。すると考え方を改める必要がありそうだ。

 

だったら安直に指定した時間が経ったら、ダイアログを消して、リピートを回せばいいんじゃね?と考えてみる。

 

set delayTime to 60

repeat
    set time_start to time string of (current date)
    display dialog time_start buttons {"終了"} default button 1 giving up after delayTime
    if the button returned of the result is "終了" then
        exit repeat
    else
       
    end if
   
end repeat

 

これで60秒ごとに勝手にダイアログが閉じて、新しいダイアログが立ち上がる。

 

開始の時間を変数に突っ込んでおき、現在時間との差分を取れば、経過時間を表示することも可能だろう。

 

が、どうにもダサイ。

 

やはりダイアログだけでやろうすること自体に無理があるのかもしれない。