こんにちは、高木です。
前回予告したように今回はgridderについて考えていきます。gridderもpackerやplacerと同じくジオメトリーマネージャーの一種なのですが、固有のサブコマンドを多数持っています。
gridderのサブコマンドにどんなものがあるのか、ざっと見ていきましょう。
- anchor
- bbox
- columnconfigure
- configure
- forget
- info
- location
- propagate
- rowconfigure
- remove
- size
- slaves
- content
このうちcontentはslavesの別名です。また、configure, forget, info, slavesはgeometry_managerクラスで実装済みです。propagateはpackerにもあったのでコピペすればよさそうです。
では、早速コードを見ていきましょう。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
namespace tk { class gridder : public geometry_manager { public: gridder() : geometry_manager(u8"grid") { } 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()); } int operator()(std::initializer_list<window> windows, std::initializer_list<tcl::obj> options) const = delete; int operator()(std::initializer_list<window> windows) const = delete; int operator()(const window& w) const = delete; int configure(std::initializer_list<window> windows, std::initializer_list<tcl::obj> options) const = delete; }; } |
残るはanchor, bbox, columnconfigure, location, rowconfigure, remove, sizeということになります。
このうち、columnconfigureとrowconfigureは列と行の違いだけでまったく同じ形をしていますので、いっしょに実装してしまいましょう。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
int columnconfigure(const window& w, int index, std::initializer_list<tcl::obj> options) const { tcl::obj command(u8"columnconfigure"); tcl::obj index_obj(index); std::vector<Tcl_Obj*> args{ type().get(), command.get(), w.get().path().get(), index_obj.get() }; auto interp = w.get().interpreter(); set_options(args, options); return interp.evaluate(args); } int rowconfigure(const window& w, int index, std::initializer_list<tcl::obj> options) const { tcl::obj command(u8"rowconfigure"); tcl::obj index_obj(index); std::vector<Tcl_Obj*> args{ type().get(), command.get(), w.get().path().get(), index_obj.get() }; auto interp = w.get().interpreter(); set_options(args, options); return interp.evaluate(args); } |
このあたり、ほとんどワンパターンですね。
長くなってきましたので、残りのサブコマンドについては次回回しにしたいと思います。