こんにちは、高木です。
今回はgeometry_managerクラスにforgetコマンドを追加していきます。その前に、前回作ったconfigureコマンドと共通の下請け関数を作れそうなので、先にそちらの整備からやっていきます。
共通の下請け関数として、引数違いのsub_commandメンバー関数を実装します。アクセス指定子はprivateでもいいんですが、念のためprotectedにしておきましょう。コードは以下のようになります。
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 30 31 32 33 |
protected: // サブコマンド int sub_command(tcl::obj command, std::initializer_list<window> windows, std::initializer_list<tcl::obj> options) const { std::vector<Tcl_Obj*> args{ this->type_.get(), command.get() }; auto interp = set_window_parameters(args, windows); set_options(args, options); return interp.evaluate(args); } // サブコマンド: オプション無し int sub_command(tcl::obj command, std::initializer_list<window> windows) const { std::vector<Tcl_Obj*> args{ this->type_.get(), command.get() }; auto interp = set_window_parameters(args, windows); return interp.evaluate(args); } // サブコマンド: ウィジェト1つ、オプションあり int sub_command(tcl::obj command, const window& w, std::initializer_list<tcl::obj> options) const { std::vector<Tcl_Obj*> args{ this->type_.get(), command.get(), w.get().path().get() }; auto interp = w.get().interpreter(); set_options(args, options); return interp.evaluate(args); } // サブコマンド: ウィジェット1つ、オプション無し int sub_command(tcl::obj command, const window& w) const { return sub_command(command, w, {}); } |
せっかくですので、このsub_commandメンバー関数を使ってconfigureメンバー関数も書き換えておきます。
0 1 2 3 4 5 6 7 8 9 10 11 12 |
// configureコマンド int configure(std::initializer_list<window> windows, std::initializer_list<tcl::obj> options) const { return sub_command(u8"configure", windows, options); } // configureウィジェト1つ、オプションあり int configure(const window& w, std::initializer_list<tcl::obj> options) const { return sub_command(u8"configure", w, options); } |
同じようにすれば、forgetメンバー関数も簡単に実装できますね。
一応、forgetコマンドについて簡単に説明しておきます。forgetコマンドというのは、いったんジオメトリーマネージャーで配置したウィジェットを取り除くために使います。取り除いたウィジェットは削除されるわけではないので、あらためてジオメトリーマネージャーで配置し直すこともできます。
それではコードを見ていきます。
0 1 2 3 4 5 6 7 8 9 10 |
int forget(std::initializer_list<window> windows) const { return sub_command(u8"forget", windows); } int forget(const window& w) const { return sub_command(u8"configure", w); } |
こんな感じで、sub_commandメンバー関数を呼び出すだけですね。
今回はコードばかりになってしまいましたが、これといった説明はいらないと思います。次回は全ジオメトリーマネージャーに共通のコマンドを一気に実装していきます。今回実装したsub_commandメンバー関数が役に立ってくれそうです。