【ドット絵エディタ制作】15回目:ドラッグ可能なウィンドウ

ドラッグ可能なウィンドウを実装し、エディタのレイアウトを自由に変更できるようにした。

作ったもの

これまでBootstrapのアコーディオンを使っていた箇所を
ドラッグ可能なウィンドウに変更した。

ただし、ブラウザのウィンドウサイズの変更には対応していないため、
他のパーツと異なる動きをしてしまい、気持ち悪い。

確認用ページ

ソースコード

クラス図

ドラッグ可能なウィンドウを実装するDraggableWindowを追加。

ライブラリは使わずに自分で実装してみた。
汎用的に利用できるようにしたかったので、他のクラスとは切り離した実装にしている。

つまづきポイント

ドラッグ中のmousemoveイベントはdocumentをターゲットに

mousedownイベントやmouseupイベントはHTMLElementをターゲットにすればよいが、
mousemoveイベントも同様の設定にしてしまうと、
素早くマウスを動かしたときに、挙動がおかしくなることがある。

その対策としてmousemoveイベントはdocumentをターゲットにする。

CSSでマウスカーソルを変更

グラブ(ドラッグ)できることを示すカーソル

cursor : grab;

グラブ(ドラッグ)していることを示すカーソル

cursor : grabbing;

前回設定したレイヤーパネルの移動カーソルもついでに変更しておいた。

参考:cursor – CSS: カスケーディングスタイルシート | MDN

各ウィンドウを管理するシングルトンパターンのManagerクラス

他のウィンドウの真下や右真横にスナップ(吸着)するようになっているが、
これらの管理は、DraggableWindow.ts内のManagerクラスが行っている。
Managerクラスはexportしていないためクラス図に表示されない。

このManagerクラスはシングルトンパターンで作られており、
DraggableWindowクラスのコンストラクタで、そのインスタンスを
Managerクラスが取り込むようにしている。

こうすることで、DraggableWindowクラスのインスタンス同士の位置を
Managerクラスが管理し、スナップ機能を実現している。

参考:【TypeScript】「シングルトンクラス」を作るには – プログラミングマガジン


追加したイシュー


ひとこと

ライブラリっぽい作りにして、
いい感じならこれだけを別で公開することも考えていたが
現実はそんなにあまくなかった。

粗だらけなので気が向いたら調整していくつもり。