スライディングサイドバーを作ってみた

VisualStudio2005のIDEで便利なものに、タブの状態で最小化できるサイドバーがあります。


アコーディオンだと枚数が増えてくるとどうしても表示領域を圧迫してしまうのですが、縦型のタブで最小化しておけるこのサイドバーは画面を広く使えるのでとても便利。

とっても便利なので、作ってみました(例によってコードは未公開。実のところ公開するサーバを用意するヒマがないだけだったり・・・)

バーにはピンのアイコンがあって、ピンで留めておくとパネルとして常時表示になり、外していると画面のレイアウト上にフローティングします。フローティングした状態では、パネル外にマウスを持っていくと、Resizeエフェクトで最小化されます。


このコンポーネントは、大きく分けて

1)TabBar(タテでも非埋め込み文字が表示されるように拡張したもの)
2)パネル(横タブとViewStack、タイトルラベル、ピンボタンを配置)
3)レイアウトコンテナ(基本はHDividedBox)

から作成しました。


もっとも苦労したのは3)でした。
パネルのフローティングを実現するのに、のんきに「includeInLayoutをfalseにしとけば、はみ出した部分が重なって表示されるだろ」と考えていたのですが、コレが大間違い。
Boxコンテナというものは、HBoxなら左から右に向けて、VBoxなら上から下に向けてindexが増えます。
これが何を意味しているかというと、右側のコンポーネントはどうやっても左のコンポーネントよりも手前に表示される、ということなんですね。
つまりはみ出して表示させただけだと、中心のパネルの下に来るので一切操作できない・・・ということになるわけです。
結局、HDividedBoxのchildからいったん外し、rawChildrenに入れてやることで解決しました。

ちなみに、レイアウトコンテナをいじる場合、mx_internal名前空間を手探りでいじる羽目になることがあります。今回がまさにその例で、「layoutObjectっていったいなんだろうなぁ・・・」とか考えながら、updateDisplayList()だのmeasure()だのを実行させていました。

次はもうちょっと透明度の高いコンポーネントを作ろう・・・