ホイールのイベントを受け取って実際に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 件のコメント:
コメントを投稿