先日ブログに書いたCsv viewerに編集の機能をつけました。 ビューワというよりもエディタの面が主になってきたので、名前もCsv editorにすることにしました。
ビューワからエディタに変更するために一番手間がかかったのは、GtkColumnViewのウィジェットとリストの連携です。 これらはGtkListItemで繋がれて管理されるので、リストアイテムが得られれば何でもできるのですが、そう簡単にはいきません。 リストアイテムは、GtkListItemFactoryが自動的にセットアップ、バインド、アンバインド、テアダウンを管理するので、外からアクセスが難しいのです。 それを解決するのにいろいろなアイディアを試して、それに時間がかかりました。 いくつかの方法が考えられます。
- リスト(たとえばGSList)を利用して、リストアイテムのリストを作り、そこからアクセスする。 リストアイテムが必要ではなく、表示用のウィジェット(リストアイテムのチャイルド)だけですむならば、そのウィジェットのリストを作る。 ウィジェットは常に存在するわけではないので、リストから取り出すときにはかならずチェックが必要です。 (ポインタがNULLかどうかをチェックするなど) この方法の利点はすべての表示ウィジェットにアクセスすることができることです。 例えば、全体のウィジェットについてCSSの状態をチェックしたいときなどに有効です。
- リストアイテムが参照するリストの要素をGObjectの子オブジェクトとして新たに定義し、その中に対応するリストアイテム、またはウィジェットへのポインタを設定する。 この場合は、ウィジェット全体をアクセスすることも一応出来ますが、面倒な作業が必要になり、実用的ではありません。 ウィジェット全体へのアクセスが必要な場合は最初の方法が勝っています。 この方法の利点はリストを作るなどの複雑なことをしなくてすみ、実装が簡単なことです。
これらは、シグナル・ファクトリを用いて、セットアップ、バインドのいずれかで設定し、アンバインド、テアダウンのいずれかで解放するようにします。
これにより、もともとリストを表示するためのGtkColumnViewを、単なるビューワだけでなく、編集機能をもたせて、リストにフィードバックすることが可能になります。
Csv editorは、名前をtcsv
とつけました。
tcsv
は今日の時点でバージョンを0.5としました。
ドキュメントも含めて一応完成した形になっています。
ソースファイルはgithubのレポジトリに収められています。
tcsvは長いことかかりましたが、これで一段落したので、今後はGObject tutorial で気になっていた修正や、Gtk4 tutorial の見直しに取り掛かりたいと思っています。