オレブラウザを作る 08

2013年4月3日水曜日

AppleScript

t f B! P L
前回の続き。どのアイコンがクリックされたか判断できるようになったので次は対応するカスタムビューを表示する。

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のチェックを外し無効にする。



今回はここまで。次回は設定項目に入力したホームページアドレスの保存とそれを読み取り実際に表示させる。多分それで設定ウィンドウは終わり。








このブログを検索

人気の投稿

ラベル

QooQ