#pragma once #include #include "caf/all.hpp" #include "caf/mixin/actor_widget.hpp" CAF_PUSH_WARNINGS #include #include #include CAF_POP_WARNINGS CAF_BEGIN_TYPE_ID_BLOCK(qtsupport, first_custom_type_id) CAF_ADD_ATOM(qtsupport, set_name_atom) CAF_ADD_ATOM(qtsupport, quit_atom) CAF_END_TYPE_ID_BLOCK(qtsupport) class ChatWidget : public caf::mixin::actor_widget { private: // -- Qt boilerplate code ---------------------------------------------------- Q_OBJECT public: // -- member types ----------------------------------------------------------- using super = caf::mixin::actor_widget; ChatWidget(QWidget* parent = nullptr); ~ChatWidget(); void init(caf::actor_system& system); public slots: void sendChatMessage(); void joinGroup(); void changeName(); private: template T* get(T*& member, const char* name) { if (member == nullptr) { member = findChild(name); if (member == nullptr) throw std::runtime_error("unable to find child: " + std::string(name)); } return member; } inline QLineEdit* input() { return get(input_, "input"); } inline QTextEdit* output() { return get(output_, "output"); } inline void print(const QString& what) { output()->append(what); } caf::actor_system& system() { return self()->home_system(); } QLineEdit* input_; QTextEdit* output_; std::string name_; caf::group chatroom_; };