2020年6月29日月曜日

自作ツールをドッキングさせる。その3

workspaceControl コマンドを使って、ドッキングできるGUIを作成すると、メインウィンドウのどこにでもくっ付いてしまいます。
また、フローティングウィンドウにくっつけると、タブ化され、ウィンドウタイトルが無くなってしまうのも嫌な感じです。
やっぱ、自分のツールは自分の作ったウィンドウだけに収めたい感じです。


そこで、特定のウィンドウへドッキングさせるために dockControlコマンドというのがあります。
これは前からあるコマンドなのですが、dockControlのコマンドヘルプには、こんなサンプルコードしか書かれていません。
{
    string $myWindow = `window`;
    string $buttonForm = `formLayout -parent $myWindow`;
    button -parent $buttonForm;
    dockControl -area "left"
        -content $myWindow
        -allowedArea "left"
        -allowedArea "right";
    
}
これをスクリプトエディタで実行すると、こんな感じのメインウィンドウにドッキングしたUIが作られます。

こんな短いサンプルコードでは、きっかけを掴みづらいんですけど、実は、windowコマンドのコマンドヘルプのほうに、こんなサンプルコードが載っています。

{
    string $window =`window -title "Long Name"
            -iconName "Short Name"
            -widthHeight 200 55
            -dockStation
            -nestedDockingEnabled true
            -dockCorner "topLeft" "left"`;
        columnLayout -adjustableColumn true;
            button -label "Do Nothing";
            button -label "Close" -command ("deleteUI -window "+$window);
        setParent ..;
    showWindow $window;
    
    string $subWindow =`window`;
    string $buttonForm =`formLayout -parent $subWindow`;
        button -parent $buttonForm;
    
    dockControl -area "left"
        -content $subWindow
        -allowedArea "left"
        -allowedArea "right"
        -dockStation $window;
        
}
これを実行すると、自作のウィンドウへしかドッキングしないUIを作成することが出来ます。
ウィンドウを作成するときに、5行目みたいな、-dockStattionのフラグを立てないといけません。あわせて、dockControlには22行目のように同じく-dockSatationフラグで、ドッキングさせるウィンドウ名を指定します。
これを指定しないと、メインウィンドウにドッキングするようになっているため、dockControlのサンプルのようになってしまいます。


このdockControlコマンドには、いくつか注意点があるようです。

まずは、メニュー。
windowコマンドには、メニューを追加するための-mebuBarフラグがあります。が、dockControlをドッキングさせると、メニューの文字列に、ドッキングしたバーの部分が重なってしまい、ウィンドウのメニューが使えなくなってしまいます。こんな風に。

ラベルは見えるんですが、クリック出来たり出来なかったり。
ドッキングしていても、していなくてもなので、window-dockControlフラグが立っているとメニューが使えなくなるようです。

ドッキングもして、メニューも追加したい場合には menuBarLayoutというコマンドを使います。
こんな感じで、メインウィンドウにメニューが出るので、どこにドッキングされても、レイアウトが崩れることはありません。ちょっとマージンがデカイですが・・・。


次に、dockControlをタブ化することが出来ますが、ウィンドウやレイアウトにサイズを指定していると、ドッキング先に、その大きさの隙間が無いとドッキングしてくれません。で、タブ化されたタブの位置は、下側で固定です。
workspaceControl tabLayoutで下側にタブを配置できなくなっているのは、これが原因かもしれないですね。


さらに、dockControlを個別に閉じる事ができるため、表示させるプロシージャを自前で作成しておく必要があります。
復帰させるときには、-state(-st)フラグを使用するとdockControlの状態を出力できるので活用します。
こんな感じ。
global proc updateDockControlState(string $dockStation)
{
    if(`optionVar -exists ($dockStation+"State")` && `window -exists $dockStation`)
        dockControl -e -state `optionVar -q ($dockStation+"State")` $dockStation;
}


global proc saveDockControlState(string $dockStation)
{
    if(`dockControl -exists $dockStation` && `dockControl -q -floating $dockStation`)
        optionVar -stringValue ($dockStation+"State") `dockControl -q -state $dockStation`;
}

dockControlは配置を入れ替えられるので、再起動などでツールの状態を復帰させる場合には、windowコマンドにも-stateフラグが有るので、同じように使用できます。




0 件のコメント:

コメントを投稿