ちょっとした GUI アプリをつくるのに MacRuby をつかってみた。結論からいうと MacRuby はよくできているなあ、という印象をえた。
昔、RubyCocoa をさわってみたことはあったのだけど RubyCocoa は
「なんか正直 Objective-C の方がむしろ楽な気がする。。」
という感じだった。なにしろめんどくさいという印象しかのこらなかったのである。
一方、 MacRuby はいいな。 Syntax をカスタマイズすることにより無理矢理実現している変態的な感じもよい。実用的。
ちょっとした自分用ツールをかくときに今までは web application としてかいていたのだけど、MacRuby の方が楽だな、そんな気分になったのであった。
(というか、最初 Web Application としてかいてつかっていたツールを MacRuby に移植したのである)
VB でアプリかくとき並の楽さだ(XCode がバージョンごとに UI がかわっておいつくのがダルいという点をのぞけば、だけど)。
ツール自体は非常にシンプルなもので、以下のようなコードです。仕事上、毎日確実にやっておかないといけないことのチェックリストを実現するというアプリ(自分専用ツールなので、タスクリストがハードコードだったりします)。
#
# AppDelegate.rb
#
class Task
attr_accessor :title
attr_reader :done_time
def initialize(title)
@title = title
@done_time = nil
end
def done?
return @done_time && @done_time.strftime("%Y-%m-%d") == Time.now.strftime("%Y-%m-%d")
end
def done!
@done_time = Time.now
end
def toggle!
if self.done?
@done_time = nil
else
self.done!
end
end
def refresh!
if @done_time && @done_time.strftime("%Y-%m-%d") != Time.now.strftime("%Y-%m-%d")
@done_time = nil
end
end
end
class AppDelegate
attr_accessor :window
attr_accessor :table_view
@@tasks = [
'gmail check',
'○○ mail check',
'redmine check',
'google calendar check',
'○○ calendar check',
'○○ check(night)',
].map {|x|
Task.new(x)
}
def applicationDidFinishLaunching(a_notification)
# Insert code here to initialize your application
@refresh_thread = Thread.start do
while 1
self.refreshTasks()
@table_view.reloadData
sleep 10
end
end
end
def numberOfRowsInTableView(aTableView)
@@tasks.size
end
def tableView(aTableView, objectValueForTableColumn: aTableColumn, row: rowIndex)
case aTableColumn.identifier
when 'task'
aTableColumn.dataCell.title = @@tasks[rowIndex].title
@@tasks[rowIndex].done?
when 'time'
task = @@tasks[rowIndex]
if task.done?
task.done_time.strftime("%H:%M")
else
''
end
else
throw "Should not reach here"
end
end
# - (void)tableView:(NSTableView *)tableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
def tableView(aTableView, setObjectValue: anObject, forTableColumn: tableColumn, row: row)
@@tasks[row].toggle!
@table_view.reloadData
end
def refreshTasks
@@tasks.each do |task|
task.refresh!
end
end
end
で、MacRuby の入門にはこちらのサイトがよくまとまっていた。
http://watson1978.github.com/MacRuby-DoJo/
あと MacRuby.h がないといわれるむきにはこのページを参照。
http://blog.i462soft.com/2012/06/xcode-4.html