mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
We create a GUI class to abstract common GUI needs (showing a message box, asking a question, ...) from the actual GUI backend. We also create a Nexus class to manage the startup and lifetime of our main systems (Core, GUI, ...) instead of delegating that to Widget. Eventually, Widget will only be in charge of the Desktop GUI and AndroidGUI of the mobile GUI. Nexus will overview the system and GUI will provide a clean platform-independant interface.
122 lines
4.3 KiB
C++
122 lines
4.3 KiB
C++
#include "nexus.h"
|
|
#include "core.h"
|
|
#include "misc/settings.h"
|
|
#include "video/camera.h"
|
|
#include <QThread>
|
|
#include <QDebug>
|
|
|
|
#ifdef Q_OS_ANDROID
|
|
#include <src/widget/androidgui.h>
|
|
#else
|
|
#include <src/widget/widget.h>
|
|
#endif
|
|
|
|
Nexus::Nexus(QObject *parent) :
|
|
QObject(parent),
|
|
core{nullptr},
|
|
coreThread{nullptr},
|
|
widget{nullptr},
|
|
androidgui{nullptr},
|
|
started{false}
|
|
{
|
|
}
|
|
|
|
Nexus::~Nexus()
|
|
{
|
|
delete core;
|
|
delete coreThread;
|
|
#ifdef Q_OS_ANDROID
|
|
delete androidgui;
|
|
#else
|
|
delete widget;
|
|
#endif
|
|
}
|
|
|
|
void Nexus::start()
|
|
{
|
|
if (started)
|
|
return;
|
|
qDebug() << "Nexus: Starting up";
|
|
|
|
// Setup the environment
|
|
qRegisterMetaType<Status>("Status");
|
|
qRegisterMetaType<vpx_image>("vpx_image");
|
|
qRegisterMetaType<uint8_t>("uint8_t");
|
|
qRegisterMetaType<uint16_t>("uint16_t");
|
|
qRegisterMetaType<const int16_t*>("const int16_t*");
|
|
qRegisterMetaType<int32_t>("int32_t");
|
|
qRegisterMetaType<int64_t>("int64_t");
|
|
qRegisterMetaType<QPixmap>("QPixmap");
|
|
qRegisterMetaType<ToxFile>("ToxFile");
|
|
qRegisterMetaType<ToxFile::FileDirection>("ToxFile::FileDirection");
|
|
qRegisterMetaType<Core::PasswordType>("Core::PasswordType");
|
|
|
|
// Create Core
|
|
QString profilePath = Settings::getInstance().detectProfile();
|
|
coreThread = new QThread(this);
|
|
coreThread->setObjectName("qTox Core");
|
|
core = new Core(Camera::getInstance(), coreThread, profilePath);
|
|
core->moveToThread(coreThread);
|
|
connect(coreThread, &QThread::started, core, &Core::start);
|
|
|
|
// Start GUI
|
|
#ifdef Q_OS_ANDROID
|
|
androidgui = new AndroidGUI;
|
|
androidgui->show();
|
|
#else
|
|
widget = Widget::getInstance();
|
|
#endif
|
|
|
|
// Connections
|
|
#ifndef Q_OS_ANDROID
|
|
connect(core, &Core::connected, widget, &Widget::onConnected);
|
|
connect(core, &Core::disconnected, widget, &Widget::onDisconnected);
|
|
connect(core, &Core::failedToStart, widget, &Widget::onFailedToStartCore);
|
|
connect(core, &Core::badProxy, widget, &Widget::onBadProxyCore);
|
|
connect(core, &Core::statusSet, widget, &Widget::onStatusSet);
|
|
connect(core, &Core::usernameSet, widget, &Widget::setUsername);
|
|
connect(core, &Core::statusMessageSet, widget, &Widget::setStatusMessage);
|
|
connect(core, &Core::selfAvatarChanged, widget, &Widget::onSelfAvatarLoaded);
|
|
connect(core, &Core::friendAdded, widget, &Widget::addFriend);
|
|
connect(core, &Core::failedToAddFriend, widget, &Widget::addFriendFailed);
|
|
connect(core, &Core::friendUsernameChanged, widget, &Widget::onFriendUsernameChanged);
|
|
connect(core, &Core::friendStatusChanged, widget, &Widget::onFriendStatusChanged);
|
|
connect(core, &Core::friendStatusMessageChanged, widget, &Widget::onFriendStatusMessageChanged);
|
|
connect(core, &Core::friendRequestReceived, widget, &Widget::onFriendRequestReceived);
|
|
connect(core, &Core::friendMessageReceived, widget, &Widget::onFriendMessageReceived);
|
|
connect(core, &Core::receiptRecieved, widget, &Widget::onReceiptRecieved);
|
|
connect(core, &Core::groupInviteReceived, widget, &Widget::onGroupInviteReceived);
|
|
connect(core, &Core::groupMessageReceived, widget, &Widget::onGroupMessageReceived);
|
|
connect(core, &Core::groupNamelistChanged, widget, &Widget::onGroupNamelistChanged);
|
|
connect(core, &Core::groupTitleChanged, widget, &Widget::onGroupTitleChanged);
|
|
connect(core, &Core::emptyGroupCreated, widget, &Widget::onEmptyGroupCreated);
|
|
connect(core, &Core::avInvite, widget, &Widget::playRingtone);
|
|
connect(core, &Core::blockingClearContacts, widget, &Widget::clearContactsList, Qt::BlockingQueuedConnection);
|
|
connect(core, &Core::friendTypingChanged, widget, &Widget::onFriendTypingChanged);
|
|
|
|
connect(core, SIGNAL(messageSentResult(int,QString,int)), widget, SLOT(onMessageSendResult(int,QString,int)));
|
|
connect(core, SIGNAL(groupSentResult(int,QString,int)), widget, SLOT(onGroupSendResult(int,QString,int)));
|
|
|
|
connect(widget, &Widget::statusSet, core, &Core::setStatus);
|
|
connect(widget, &Widget::friendRequested, core, &Core::requestFriendship);
|
|
connect(widget, &Widget::friendRequestAccepted, core, &Core::acceptFriendRequest);
|
|
connect(widget, &Widget::changeProfile, core, &Core::switchConfiguration);
|
|
#endif
|
|
|
|
// Start Core
|
|
coreThread->start();
|
|
|
|
started = true;
|
|
}
|
|
|
|
Nexus& Nexus::getInstance()
|
|
{
|
|
static Nexus nexus;
|
|
return nexus;
|
|
}
|
|
|
|
Core* Nexus::getCore()
|
|
{
|
|
return getInstance().core;
|
|
}
|