NSTableViewの行をドラッグ&ドロップ

やり方を理解するのに結構手間取ったのがNSArrayControllerのビューになっているNSTableViewの行をドラッグ&ドロップで入れ替える実装方法。

詳細な説明は省きますが、概念さえわかれば中身は意外とシンプルです。
NSTableViewDataSourceとして以下の3つを実装すればOK。

func tableView(_ tableView: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool

ドラッグ&ドロップの実態は、コピー&ペーストに近いものがあります。
ここでやるべきことはNSPastboardにユーザーが移動しようとしている行のIndexSet(複数行ドラッグの可能性があるためIndexSetが渡ってきます)をセットするだけ。
(コピーに相当。)

func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableViewDropOperation) -> NSDragOperation

.moveを返せばドラッグ可能になります。

func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableViewDropOperation) -> Bool

NSPasteboardから取り出した(ペーストに相当)IndexSetと、移動先として渡ってきた行番号を手がかりにNSArrayControllerが管理している配列を並び替えるだけです。

わかってしまえばシンプルで泥臭い実装をするだけですね。

Touchdown 1.1公開!

Touchdown 1.1を公開しました。



ダウンロードはこちらから。

Ver.1.1の変更点は以下の通りです。

新機能

  • プリセットの並べ替え
    • プリセットリストの項目をドラッグで並べ替えられるようにしました
  • 「新規プリセット」メニュー項目追加
    • ファイルメニューに「新規プリセット」を追加しました
    • コマンド+Nでプリセットを追加できます


不具合修正

  • 一部文言を修正しました
  • Touch Barが適切に切り替わらないことがある不具合を修正しました


ぜひお試しください。

Touchdown ver.1.1向け追加予定機能

Touchdown ver.1.0としてリリースし便利に使っているものの、実装したかったけどまだできていない機能がいくつかあるため、今後のリリースで拡張して行く予定です。

優先度が高いものとしては

  • プリセットの並び替え
  • リネーム

の2点。

次期ver.1.1に向けてはまず「プリセットの並び替え」を実装したいですが、細かな改善と合わせて気長に対応していく予定です。

MacBook Proのための機能 その2

MacBook Proに長らく搭載されていて革新的でありながらイマイチ活用されていない機能といえばForce Touchトラックパッド。

実はTouchdownでも地味に対応しています。

ファイルをウィンドウにドラッグするとフォーカス枠が表示されますが、その際に指先にフィードバックが来るようにしています。
触覚フィードバックだけでなく、感圧を生かしたアプリも作ってみたいですね。

MacBook Proのための機能 その1

Touchdownを作ろうと思った最大のモチベーションは「MacBook Proをもっと活用したい」だったので、最初に注目したのはいうまでもなくTouch Bar。

まずはTouch Barに何か表示してみるところから始めて、プリセットの切り替えという無難な機能に落ち着きました。

しかし、ちょっと物足りないので、Touch Barジェスチャーにも対応し、ダブルタップでプリセットの選択と実行をまとめてできるようにしてみました。

なんでも表示できるのでもっと派手な感じにもしたかったのですが、Appleのガイドラインに従う限り、あまり目立つものは実装できないのが残念です。

Touch Barでダブルタップ検知

TouchdownではTouch Barの設定(NSSegmentedControl)をダブルタップで実行する機能を実装しています。

やり方は意外と簡単。
NSClickGestureRecognizerで検知したいジェスチャーを指定し、任意のControlに設定するだけです。

let gesture = NSClickGestureRecognizer() // NSClickGestureRecognizerのインスタンスを作成
gesture.target = self // 通知を受けるオブジェクトを設定
gesture.numberOfTouchesRequired = 1 // 検知する指の本数
gesture.numberOfClicksRequired = 2 // 検知するタップ回数
gesture.allowedTouchTypes = .direct // 指によるダイレクトタッチを検知
gesture.action = #selector(deferConvertFiles(_:)) // 通知を受けたときに実行するセレクタ
segmentedControl.addGestureRecognizer(gesture) // Controlにジェスチャーを設定

シンプルで強力な仕組みですね。



Touchdown 1.0公開!

Touchdown 1.0を公開しました!



Touch Barに対応した画像変換ユーティリティアプリです。
こちらからダウンロードしてお試しください。

Touchdown 1.3公開!

Touchdown 1.3を公開しました。 ダウンロードは こちら から。 Ver.1.3の変更点は以下の通りです。 新機能 macOS Mojave 10.13以降に対応 ダークモードに対応 ぜひお試しください。