blog comments 0 del.icio.us bookmarks 0 diggs 0 Google results 0

1.0
PostRank

맥루비의 신무기, HotCocoa

From myRuby.net, 2 months ago, 0 views

지난 글에서 맥루비(MacRuby)를 소개했었다. 현재 맥루비는 0.2 버전이 공개되었고, RubyConf 즈음 발표될 0.3 버전은 첫 안정버전이 될 예정이다. 그런데 0.3 버전에 포함될 기능 중 눈에 띄는 것이 하나 있다. 바로 HotCocoa다(개발버전 trunk에서 사용할 수 있다). 뜨거운 루비가 아니라 뜨거운 코코아 ^^

 

HotCocoa는 Rucola처럼 루비스럽게 코코아를 사용하기 위한 DSL이다. 하지만  프레임워크보다는 API의 접근 방식을 취했다. 코코아 자체가 훌륭한 프레임워크이니까 이게 더 자연스러운 느낌이다.

 

누구냐 넌!

이 글을 통해 HotCocoa를 처음 접한다면, '도대체 뭐에 쓰는 물건인고?'라는 반응이 당연할 것이다. 아래 코드를 보자.

 

  1. win = NSWindow.alloc.initWithContentRect [10,20,300,300],
      :styleMask => (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)

 

NSWindow를 하나 만드는 코드인데, 그리 예쁘지않다. 흉직하다는 표현이 어울릴지도 모르겠다. HotCocoa는 이 문제를 해결하려고 한다. 이런 식으로 말이다.

 

  1. win = window :frame => [10,20,300,300]

 

적당한 이름의 DSL과 상황에 맞는 기본값(위의 styleMask처럼)이 제공해 군더더기 코드를 빼자는 것이 HotCocoa의 목적이다. 보다 루비스러운 코코아 API를 만드는 것이다.

 

그리고 아래 코드처럼 이벤트 처리에는 루비의 블럭 문법을 잘 활용한다.

 

  1. window :frame => [200, 800, 300, 120], :title => "HotCocoa!" do |win|
      win.did_move do
        puts "Window moved to #{win.frame.inspect}!"
      end
    end

 

HotCocoa로 만드는 SpeakLine 예제

HotCocoa를 이용하면 인터페이스 빌더 없이도 간편하게 루비로 간단한 UI를 가진 코코아 애플리케이션을 개발할 수 있다.

 

02 컨트롤 다루기 - 한줄 말하기 애플리케이션에서 루비 코코아로 만들었고, 맥루비(MacRuby) - 루비 코코아의 새로운 도전에서 맥루비로 만들었던 애플리케이션을 이번에는 HotCocoa로 다시 만들어보자.

 

그림_5.png

 

코드는 아래가 전부다. 따로 NIB 파일이 필요하지도 않다. 마치 무거운 레일스 애플리케이션 대신 Sinatra로 가볍게 애플리케이션을 만드는 느낌이다.

 

  1. require 'hotcocoa'
    include HotCocoa

    def say_it
      voice = NSSpeechSynthesizer.availableVoices[@combo.indexOfSelectedItem]
      NSSpeechSynthesizer.new.initWithVoice(voice).startSpeakingString(@text.stringValue)
    end

    application do |app|
      window :frame => [200, 200, 400, 110], :title => 'SpeakLine with HotCocoa' do |win|
        win << layout_view(:mode => :horizontal, :frame => [30, 0, 350, 40]) do |view|
          view << (@combo = combo_box(:frame => [0, 0, 200, 25], :data => NSSpeechSynthesizer.availableVoices))
          view << button(:title => 'Say It!', :on_action  => Proc.new{say_it})
        end
        win << (@text = text_field(:frame => [25, 0, 350, 25]))
      end
     
      @combo.selectItemAtIndex(0)
    end

 

API가 더 늘어나 좀 더 유창한 루비(?)를 구사할 수 있다면, 꽤 재미있어질 것 같다. 그리고 Nib2HotCocoa와 같은 변환기도 하나 있으면 좋겠다.

 

참고 자료

 

comments

No comments yet.

You must be logged in to add your own comment.