Skip to content

Commit

Permalink
fix(core): correctly relink ui/core when core is changed
Browse files Browse the repository at this point in the history
Widget was only connecting the Core to itself during initialization, but the Core instance could change during a restartCore call. This commit will make Widget link the Core to itself when it changes rather than only on initialization.

Fixes qTox#5710
  • Loading branch information
Kribylet committed Jun 24, 2019
1 parent 033f28e commit 3cc7242
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 33 deletions.
43 changes: 10 additions & 33 deletions src/nexus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -188,42 +188,19 @@ void Nexus::showMainGUI()
GUI::setEnabled(false);

// Connections
connect(profile, &Profile::selfAvatarChanged, widget, &Widget::onSelfAvatarLoaded);
connect(profile, &Profile::selfAvatarChanged,
widget, &Widget::onSelfAvatarLoaded);

Core* core = profile->getCore();
connect(core, &Core::requestSent, profile, &Profile::onRequestSent);
connect(profile, &Profile::coreChanged,
widget, &Widget::onCoreChanged);

connect(core, &Core::connected, widget, &Widget::onConnected);
connect(core, &Core::disconnected, widget, &Widget::onDisconnected);
connect(profile, &Profile::failedToStart, widget, &Widget::onFailedToStartCore,
connect(profile, &Profile::failedToStart,
widget, &Widget::onFailedToStartCore,
Qt::BlockingQueuedConnection);

connect(profile, &Profile::badProxy,
widget, &Widget::onBadProxyCore,
Qt::BlockingQueuedConnection);
connect(profile, &Profile::badProxy, widget, &Widget::onBadProxyCore, Qt::BlockingQueuedConnection);
connect(core, &Core::statusSet, widget, &Widget::onStatusSet);
connect(core, &Core::usernameSet, widget, &Widget::setUsername);
connect(core, &Core::statusMessageSet, widget, &Widget::setStatusMessage);
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::onReceiptReceived);
connect(core, &Core::groupInviteReceived, widget, &Widget::onGroupInviteReceived);
connect(core, &Core::groupMessageReceived, widget, &Widget::onGroupMessageReceived);
connect(core, &Core::groupPeerlistChanged, widget, &Widget::onGroupPeerlistChanged);
connect(core, &Core::groupPeerNameChanged, widget, &Widget::onGroupPeerNameChanged);
connect(core, &Core::groupTitleChanged, widget, &Widget::onGroupTitleChanged);
connect(core, &Core::groupPeerAudioPlaying, widget, &Widget::onGroupPeerAudioPlaying);
connect(core, &Core::emptyGroupCreated, widget, &Widget::onEmptyGroupCreated);
connect(core, &Core::groupJoined, widget, &Widget::onGroupJoined);
connect(core, &Core::friendTypingChanged, widget, &Widget::onFriendTypingChanged);
connect(core, &Core::groupSentFailed, widget, &Widget::onGroupSendFailed);
connect(core, &Core::usernameSet, widget, &Widget::refreshPeerListsLocal);

connect(widget, &Widget::statusSet, core, &Core::setStatus);
connect(widget, &Widget::friendRequested, core, &Core::requestFriendship);
connect(widget, &Widget::friendRequestAccepted, core, &Core::acceptFriendRequest);

profile->startCore();

Expand Down
9 changes: 9 additions & 0 deletions src/persistence/profile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,10 @@ QString Profile::getName() const
*/
void Profile::startCore()
{
//kriby: code duplication belongs in initCore, but cannot yet due to Core/Profile coupling
connect(core.get(), &Core::requestSent, this, &Profile::onRequestSent);
emit coreChanged(*core);

core->start();

const ToxId& selfId = core->getSelfId();
Expand Down Expand Up @@ -803,6 +807,11 @@ void Profile::restartCore()
assert(audioBak != nullptr);
initCore(savedata, Settings::getInstance(), isNewProfile);
core->getAv()->setAudio(*audioBak);

//kriby: code duplication belongs in initCore, but cannot yet due to Core/Profile coupling
connect(core.get(), &Core::requestSent, this, &Profile::onRequestSent);
emit coreChanged(*core);

core->start();
} else {
qCritical() << "Failed to save, not restarting core";
Expand Down
1 change: 1 addition & 0 deletions src/persistence/profile.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ class Profile : public QObject
// TODO(sudden6): this doesn't seem to be the right place for Core errors
void failedToStart();
void badProxy();
void coreChanged(Core& core);

public slots:
void onRequestSent(const ToxPk& friendPk, const QString& message);
Expand Down
31 changes: 31 additions & 0 deletions src/widget/widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,37 @@ void Widget::onSelfAvatarLoaded(const QPixmap& pic)
profilePicture->setPixmap(pic);
}

void Widget::onCoreChanged(Core& core) {

connect(&core, &Core::connected, this, &Widget::onConnected);
connect(&core, &Core::disconnected, this, &Widget::onDisconnected);
connect(&core, &Core::statusSet, this, &Widget::onStatusSet);
connect(&core, &Core::usernameSet, this, &Widget::setUsername);
connect(&core, &Core::statusMessageSet, this, &Widget::setStatusMessage);
connect(&core, &Core::friendAdded, this, &Widget::addFriend);
connect(&core, &Core::failedToAddFriend, this, &Widget::addFriendFailed);
connect(&core, &Core::friendUsernameChanged, this, &Widget::onFriendUsernameChanged);
connect(&core, &Core::friendStatusChanged, this, &Widget::onFriendStatusChanged);
connect(&core, &Core::friendStatusMessageChanged, this, &Widget::onFriendStatusMessageChanged);
connect(&core, &Core::friendRequestReceived, this, &Widget::onFriendRequestReceived);
connect(&core, &Core::friendMessageReceived, this, &Widget::onFriendMessageReceived);
connect(&core, &Core::receiptRecieved, this, &Widget::onReceiptReceived);
connect(&core, &Core::groupInviteReceived, this, &Widget::onGroupInviteReceived);
connect(&core, &Core::groupMessageReceived, this, &Widget::onGroupMessageReceived);
connect(&core, &Core::groupPeerlistChanged, this, &Widget::onGroupPeerlistChanged);
connect(&core, &Core::groupPeerNameChanged, this, &Widget::onGroupPeerNameChanged);
connect(&core, &Core::groupTitleChanged, this, &Widget::onGroupTitleChanged);
connect(&core, &Core::groupPeerAudioPlaying, this, &Widget::onGroupPeerAudioPlaying);
connect(&core, &Core::emptyGroupCreated, this, &Widget::onEmptyGroupCreated);
connect(&core, &Core::groupJoined, this, &Widget::onGroupJoined);
connect(&core, &Core::friendTypingChanged, this, &Widget::onFriendTypingChanged);
connect(&core, &Core::groupSentFailed, this, &Widget::onGroupSendFailed);
connect(&core, &Core::usernameSet, this, &Widget::refreshPeerListsLocal);
connect(this, &Widget::statusSet, &core, &Core::setStatus);
connect(this, &Widget::friendRequested, &core, &Core::requestFriendship);
connect(this, &Widget::friendRequestAccepted, &core, &Core::acceptFriendRequest);
}

void Widget::onConnected()
{
ui->statusButton->setEnabled(true);
Expand Down
1 change: 1 addition & 0 deletions src/widget/widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ public slots:
void toggleFullscreen();
void refreshPeerListsLocal(const QString& username);
void onUpdateAvailable(QString latestVersion, QUrl link);
void onCoreChanged(Core& core);

signals:
void friendRequestAccepted(const ToxPk& friendPk);
Expand Down

0 comments on commit 3cc7242

Please sign in to comment.