2011年1月30日日曜日

MacRuby・環境設定ウィンドウその6

現在作っている自分用「デスクトップでマウスホイールをくるくる回すとSpaces.appのworkspaceが切り替わる」アプリ(長いな(^^;))仮称Snatcher、プロジェクト名はSpin(こっちのほうが自分としてはしっくりくる名前かも)で、環境設定ウィンドウのデフォルト値を読み取って実際の動作に反映させる。

ホイールのイベントを受け取って実際にworkspaceを切り替えるのはViewのお仕事。

def set_defaults
  defaults=NSUserDefaults.standardUserDefaults
  @use_visual=defaults.boolForKey("useVisual")
  @wheel=defaults.integerForKey("wheel")
  @trans=defaults.integerForKey("trans")
  @trans_opt=defaults.integerForKey("opt")
 end

こんなメソッドを書いて、scrollWheelイベントが来るたびに呼び出せば、それだけで所期の目的が完了。しかしこれだと、環境設定が何も変わっていない時でもいちいちデフォルト値を読み込みに行くのでなんだかもったいない。

環境設定が変更された時だけ、このメソッドが呼ばれるようにしたい。というわけでNotificationで実現することにした。

まず applicationDidFinishLaunching に以下の1行を追加。
NSDistributedNotificationCenter.defaultCenter.addObserver(self, selector:"defaultsChanged" ,name:"SpinDefaultChanged" ,object:nil)


これはアプリ終了時には必ず「もうオブザーブしません」と宣言するのが決まりらしい。

def applicationWillTerminate(note)
  NSNotificationCenter.defaultCenter.removeObserver(self, name:"SpinDefaultChanged" ,object:nil)
 end  
これも追加する。

で、あとは実際に環境設定が変更されたらNotificationを投げればいいはず。

PopupButton 関連は自分で変更を保存しているので、そのメソッドの中で
NSDistributedNotificationCenter.defaultCenter.postNotificationName "SpinDefaultChanged",object:nil

とする。しかし自前でやっていない、checkboxとかスライダーとかはどうするか。

def chabge_other(sender)
  NSDistributedNotificationCenter.defaultCenter.postNotificationName "SpinDefaultChanged",object:nil
 end

こんなメソッドを用意して、あとはInterfaceBuilderでactionを結びつけるだけでよかった。簡単だなあ。自動でUserDefaultに保存されるコントロールも、actionで結び付けられたメソッドのsenderになってくれるとわかったよかった。

こう、いかにもさっさと書きました、みたいな感じで書いているけれど、なんせ素人なので右往左往しましたよ。Notificationの書き方で、
selector:"defaultsChanged"

の最後に「:」(コロン)がいらない、とわかるまでにしばらくかかった。selectorってそのまま書けばいいの?って感じで驚いた。先日のToolbarの時は・・・selectorだけ書いて怒られたような気がするんだけど。

ここまでで本当にいちおう、所期の目的を果たした自分用ツールができた。視覚効果もつけてworkspaceを切り替えることができるし、スライダーで設定した「マウス感度」で切替のタイミングもある程度ユーザ設定できるようになった。

ふむ、次は・・・。

0 件のコメント:

コメントを投稿