switchView_()でクリックされたアイコンを判断、それに対応するビューを設定ウィンドウのコンテンツとして表示する。アイコンクリック時に表示するカスタムビューは対応するもの一つだけとするので不要なビューは事前に削除する。
script PreferencesWindow property parent : class "NSWindow" property generalView : missing value property advancedView : missing value on cancelOperation_(sender) tell me to |close|() end on switchView_(sender) --クリックされたアイコンを判断し表示するカスタムビューを決める set tagNumber to tag of sender as real if tagNumber is 10 then set targetView to generalView else if tagNumber is 20 then set targetView to advancedView end if --設定ウィンドウのメインビューから不要なビューを取り除く set contentView to contentView() of me repeat with aView in subviews of contentView tell aView to removeFromSuperview() end repeat --設定ウィンドウのメインビューにカスタムビューを追加 tell contentView to addSubview_(targetView) end switchView_ end script
プロパティのgeneralViewとadvancedViewはMainMenu.xibでそれぞれ対応するカスタムビューと関連づける。これでビューが表示されるようになる。起動して動作確認。
表示はされるようになったがウィンドウのサイズとカスタムビューのサイズが一致していないので不格好なレイアウト。これを一致させる。通常、設定ウィンドウのサイズは表示するカスタムビューのサイズに合わせてアニメーション動作付きで変更される。それを実装してみる。細かい説明はコードのコメントで。
on switchView_(sender) --クリックされたアイコンを判断し表示するカスタムビューを決める set tagNumber to tag of sender as real if tagNumber is 10 then set targetView to generalView else if tagNumber is 20 then set targetView to advancedView end if --設定ウィンドウのメインビューから不要なビューを取り除く set contentView to contentView() of me repeat with aView in subviews of contentView tell aView to removeFromSuperview() end repeat --設定ウィンドウのサイズを取得 set windowFrame to frame() of me --設定ウィンドウのサイズをカスタムビューのサイズに合わせて調整 set newWindowFrame to frameRectForContentRect_(frame() of targetView) of me --設定ウィンドウの位置を調整 set frameHeight to height of |size| of windowFrame - height of |size| of newWindowFrame set x of origin of newWindowFrame to x of origin of windowFrame set y of origin of newWindowFrame to y of origin of windowFrame + frameHeight --設定ウィンドウの位置とサイズをアニメーション動作付きで設定 tell me to setFrame_display_animate_(newWindowFrame,1,1) --設定ウィンドウのメインビューにカスタムビューを追加 tell contentView to addSubview_(targetView) end switchView_
ポイントはframe。CocoaのGUIオブジェクトは自身のサイズと位置情報をframeというオブジェクトで持っているので、それの値を変更することで位置やサイズの変更が出来る。今回はカスタムビューのframeから計算して設定ウィンドウのframeを設定しているのでMainMenu.xibにてカスタムビューのサイズ変更などがあったとしてもコードを書き直す必要はない。起動して動作確認。アイコンクリックで設定ウィンドウがサイズ変更出来ている。
アプリケーションを起動して一番最初に設定ウィンドウを開いた時、アイコンは選択された状態にない。このままでも良いかもしれないけどウィンドウの表示位置も含めて気持ちよくない。なのでここら辺を修正する。デフォルトでGeneralアイコンを選択状態、ウィンドウの位置はセンタリングにしてみる。このコードはWindowControllerのshowWindow_()をオーバーライトして実装する。PreferencesWindow.applescriptに新しいスクリプトオブジェクトPreferencesWindowControllerを作る。
script PreferencesWindowController property parent : class "NSWindowController" property toolbar : missing value property defaultSelectedToolbarItem : missing value on showWindow_(sender) continue showWindow_(sender) if selectedItemIdentifier() of toolbar is missing value then tell toolbar to setSelectedItemIdentifier_(itemIdentifier() of defaultSelectedToolbarItem) tell |window|() of me to |center|() tell |window|() of me to switchView_(defaultSelectedToolbarItem) end if end showWindow_ end script
continue showWindow_(sender)で親クラスNSWindowControllerのshowWindow_()ハンドラを実行。続けてアイコンの選択、センタリング、カスタムビューの表示となる。このスクリプトオブジェクトを設定ウィンドウのWindow Controllerとなっているオブジェクトのクラスとして設定。プロパティのtoolbarとdefaultSelectedToolbarItemを関連づける。defaultSelectedToolbarItemはツールバーアイテムのGenericに関連付ける。
起動して動作確認。意図通りの設定ウィンドウ表示。だいぶ設定ウィンドウらしくなってきた。
一つ忘れていた。ツールバーがユーザー操作でカスタム可能になっている。これはカスタム無効としておきたい。ToolbarのAttribute InspectorでCustomizableのチェックを外し無効にする。
今回はここまで。次回は設定項目に入力したホームページアドレスの保存とそれを読み取り実際に表示させる。多分それで設定ウィンドウは終わり。
0 件のコメント:
コメントを投稿