hooked up GUI and networking, first release candidate

This commit is contained in:
Kjistóf 2016-12-05 15:09:18 +01:00
parent 0c77d04a3c
commit 253929fa79
3 changed files with 82 additions and 5 deletions

View File

@ -7,6 +7,9 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -pthread")
find_package(Boost COMPONENTS system REQUIRED) find_package(Boost COMPONENTS system REQUIRED)
include_directories(${Boost_INCLUDE_DIR}) include_directories(${Boost_INCLUDE_DIR})
set(SOURCE_FILES commandline_chat.cpp chat_messages.hpp chat_networking.hpp) find_package(Qt5Widgets)
set(CMAKE_AUTOMOC ON)
set(SOURCE_FILES gui_chat.cpp chat_window.hpp chat_messages.hpp chat_networking.hpp check_policy.hpp)
add_executable(cpp11NHF2_chat ${SOURCE_FILES}) add_executable(cpp11NHF2_chat ${SOURCE_FILES})
target_link_libraries(cpp11NHF2_chat ${Boost_LIBRARIES}) target_link_libraries(cpp11NHF2_chat ${Boost_LIBRARIES} Qt5::Widgets)

View File

@ -3,9 +3,31 @@
#include <QGridLayout> #include <QGridLayout>
#include <QLineEdit> #include <QLineEdit>
#include <QListWidget> #include <QListWidget>
#include <boost/asio.hpp>
#include <thread>
#include "chat_networking.hpp"
struct receive_policy_ignore
{
static void message_do_what(const chat::chat_message& msg) {}
static void handshake_do_what(const chat::chat_message& msg) {}
static void serverdirection_do_what(const chat::chat_message& msg) {}
static void login_do_what(const chat::chat_message& msg) {}
static void logout_do_what(const chat::chat_message& msg) {}
static void invalid_msg_do_what(const chat::chat_message& msg)
{ throw std::runtime_error("Invalid message received!"); }
};
struct send_policy_ignore
{
/* this is handled in the gui: QLineEdit.setMaxLength() */
static bool check_msg_length(const chat::chat_message& msg)
{ return true; }
};
class chat_window : public QWidget class chat_window : public QWidget
{ {
Q_OBJECT Q_OBJECT
@ -15,15 +37,47 @@ class chat_window : public QWidget
QListWidget* _people; QListWidget* _people;
QLineEdit* _msg; QLineEdit* _msg;
boost::asio::io_service _ios;
boost::asio::ip::tcp::resolver::query _query;
chat::client_network_manager<receive_policy_ignore, send_policy_ignore> _cnm;
std::thread _iosthread;
public: public:
explicit chat_window(QWidget* parent = 0) explicit chat_window(QWidget* parent = 0)
:QWidget(parent) :QWidget(parent), _ios(), _query("infoc.eet.bme.hu", "8888"),
{ setupUi(); } _cnm(_ios, boost::asio::ip::tcp::resolver(_ios).resolve(_query), "BATMAN"),
_iosthread([this]{ _ios.run(); })
{
_cnm.subscribe(std::bind(&chat_window::receive_handler, this, std::placeholders::_1));
setupUi();
}
void receive_handler(chat::chat_message msg)
{
switch (msg.get_header())
{
case chat::message::MESSAGE:
case chat::message::SERVER_DIRECTION:
_chat->addItem(msg.get_content().c_str());
break;
case chat::message::LOGIN:
_people->addItem(msg.get_content().c_str());
break;
case chat::message::LOGOUT:
auto list = _people->findItems(msg.get_content().c_str(), Qt::MatchExactly);
if (list.size() > 0)
delete list[0];
break;
}
}
public slots: public slots:
void return_handler() void return_handler()
{ {
_chat->addItem(_msg->text()); _chat->addItem(_msg->text());
_cnm.send(chat::chat_message(chat::message::MESSAGE, _msg->text().toStdString()));
_msg->clear(); _msg->clear();
}; };
@ -38,6 +92,7 @@ private:
_people = new QListWidget(); _people = new QListWidget();
_msg = new QLineEdit(); _msg = new QLineEdit();
_msg->setMaxLength(220);
connect(_msg, &QLineEdit::returnPressed, this, &chat_window::return_handler); connect(_msg, &QLineEdit::returnPressed, this, &chat_window::return_handler);
_layout->addWidget(_chat, 0, 0, 1, 1); _layout->addWidget(_chat, 0, 0, 1, 1);
@ -46,4 +101,10 @@ private:
this->setLayout(_layout); this->setLayout(_layout);
} }
};
void closeEvent(QCloseEvent* event)
{
_cnm.close_connection();
_iosthread.join();
}
};

13
gui_chat.cpp Normal file
View File

@ -0,0 +1,13 @@
#include <QApplication>
#include "chat_window.hpp"
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
chat_window w;
w.show();
return a.exec();
}