こんにちは、高木です。
前回予告したように、今回はpacker固有のサブコマンドについて考えていきます。まずはじめに、packerのサブコマンドにはどんなものがあるのか、公式ドキュメントから洗い出してみましょう。
- configure
- forget
- info
- propagate
- slaves
- content
packerで使えるサブコマンドは上記の6つです。このうち、slavesとcontentは単なる別名です。また、configure, forget, info, slavesはすでに基底クラスであるgeometry_managerクラスで実装済みです。
よって、残りはpropagateコマンドだけになります。propagateコマンドは、コンテナとなるウィジェット(toplevelやframeなど)のサイズを決定する際に、そのコンテナが包含するウィジェットのサイズの影響を受けるかどうかをブール値で設定します。また、ブール値を省略すれば現在設定されている値を返します。
ですので、コンテナウィジェットは必ず指定するとして、bool型の引数の有無が異なる2つのメンバー関数を多重定義してあげればよさそうです。bool型の引数がある場合は返却値は本来必要ないのですが、コンテナではないウィジェットを指定した場合などはエラーになると思うので、tcl::interpreter::evaluateメンバー関数の返却値をそのまま返すことにしましょう。bool型の引数が無い場合は結果をtcl::obj型で返すことにします。
それではコードを見ていきます。そんなに長くないので、packerクラス全体を掲載しておきます。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class packer : public geometry_manager { public: packer() : geometry_manager(u8"pack") { } int propagate(const window& container, bool flag) { return sub_command(u8"propagate", container, { tcl::obj(flag) }); } tcl::obj propagate(const window& container) { if (sub_command(u8"propagate", container) != TCL_OK) return {}; return Tcl_GetObjResult(container.get().interpreter().get()); } }; |
これでpackerクラスは一通り完成です。あとはデストラクターやコピー/ムーブコンストラクター、コピー/ムーブ代入演算子をデフォルトで定義しておいてもいいでしょう。
次回はplacerについて考えていくことにします。