ひ to り go と

ZMHistoryPanel 1.0.1

Products

ZMHistoryPanel のバージョン 1.0.1 をリリース。今回の変更は Sketch への対応。

同じ操作を繰り返したときにその数だけ取り消しアクションが記録されると、直前の(とユーザが思っている)状態に戻りたいと思っても何度も取り消しを繰り返さなければいけない。

Cocoa の NSUndoManager はそのための対策がある。-[NSUndoManager setGroupsByEvent:] で YES を渡しておけば NSRunLoop のモードの仕組みを使用して自動的にまとめてくれるのだ。オブジェクトをドラッグして移動してもマウスが 1px 動くごとに取り消し回数が増えるのではなく、マウスボタンを押してから離した時点までが一つのアクションとして記録される。

しかしそれでも十分ではない。矢印キーをポンポンと押してオブジェクトの位置を移動したときなどはイベントの固まりがそれぞれ独立しているため、前述の仕組みは通用しない。

調べてみると時差のあるアクションを上手くまとめる実装方法はいくつかあるようだけど、例えば Cocoa 標準のテキストビューである NSTextView では一文字打つごとに取り消しアクションが記録されると実用的ではないのでイベント発生時間などを考慮しながらほどよくグループ化する仕組みがあるみたい。

Sketch のようなドローソフトではまさにそんな工夫が必要な部分が多い。このプラグインのバージョン 1.0 が Sketch と相性が悪かったのは、Sketch が NSUndoManager そのもの(のサブクラス)を拡張してグループ化の仕組みを入れていたためだった。

今回のバージョンでは Sketch で自然に使えるようにできるだけ対策してあるけど、取り消し/やり直しを何回かしているとリストのアクションが増えたり減ったりしてちょっと混乱する。こういう理由なので、気にしないようにしてください。

Share

(参考になったらぜひ。記事を書くモチベーションの向上に役立てます。)