こんにちは、高木です。
前回予告したように今回は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);     } | 
このあたり、ほとんどワンパターンですね。
長くなってきましたので、残りのサブコマンドについては次回回しにしたいと思います。

![[迷信] scanfではバッファオーバーランを防げない](https://www.kijineko.co.jp/wp-content/uploads/2021/06/3279051_s.jpg)




