void FriendListWidget::moveWidget(FriendWidget* w, Status s, bool add) { if (mode == Name) { int circleId = Settings::getInstance().getFriendCircleID(FriendList::findFriend(w->friendId)->getToxId()); CircleWidget* circleWidget = CircleWidget::getFromID(circleId); if (circleWidget == nullptr || add) { if (circleId != -1) Settings::getInstance().setFriendCircleID(FriendList::findFriend(w->friendId)->getToxId(), -1); listLayout->addFriendWidget(w, s); return; } circleWidget->addFriendWidget(w, s); } else { Friend* contact = FriendList::findFriend(w->friendId); QDate activityDate = getDateFriend(contact); Time time = getTime(activityDate); CategoryWidget* categoryWidget = dynamic_cast<CategoryWidget*>(activityLayout->itemAt(time)->widget()); categoryWidget->addFriendWidget(contact->getFriendWidget(), contact->getStatus()); categoryWidget->show(); } }
void FriendListWidget::moveWidget(FriendWidget* widget, Status s, bool add) { if (mode == Name) { Friend* f = FriendList::findFriend(widget->friendId); int circleId = Settings::getInstance().getFriendCircleID(f->getPublicKey()); CircleWidget* circleWidget = CircleWidget::getFromID(circleId); if (circleWidget == nullptr || add) { if (circleId != -1) Settings::getInstance().setFriendCircleID(f->getPublicKey(), -1); listLayout->addFriendWidget(widget, s); return; } circleWidget->addFriendWidget(widget, s); } else { Friend* contact = FriendList::findFriend(widget->friendId); QDate activityDate = getDateFriend(contact); int time = static_cast<int>(getTime(activityDate)); QWidget* w = activityLayout->itemAt(time)->widget(); CategoryWidget* categoryWidget = qobject_cast<CategoryWidget*>(w); categoryWidget->addFriendWidget(widget, contact->getStatus()); categoryWidget->show(); } }
void FriendWidget::search(const QString &searchString, bool hide) { searchName(searchString, hide); CircleWidget* circleWidget = CircleWidget::getFromID(Settings::getInstance().getFriendCircleID(FriendList::findFriend(friendId)->getToxId())); if (circleWidget != nullptr) circleWidget->search(searchString); }
void CircleWidget::dropEvent(QDropEvent* event) { setExpanded(true, false); // Check, that the element is dropped from qTox QObject* o = event->source(); FriendWidget* widget = qobject_cast<FriendWidget*>(o); if (!widget) return; // Check, that the user has a friend with the same ToxId ToxId toxId(event->mimeData()->text()); Friend* f = FriendList::findFriend(toxId.getPublicKey()); if (!f) return; // Save CircleWidget before changing the Id int circleId = Settings::getInstance().getFriendCircleID(toxId.getPublicKey()); CircleWidget* circleWidget = getFromID(circleId); addFriendWidget(widget, f->getStatus()); Settings::getInstance().savePersonal(); if (circleWidget != nullptr) { circleWidget->updateStatus(); Widget::getInstance()->searchCircle(circleWidget); } setContainerAttribute(Qt::WA_UnderMouse, false); }
void FriendListWidget::addFriendWidget(FriendWidget* w, Status s, int circleIndex) { CircleWidget* circleWidget = CircleWidget::getFromID(circleIndex); if (circleWidget == nullptr) moveWidget(w, s, true); else circleWidget->addFriendWidget(w, s); }
void FriendListWidget::addFriendWidget(FriendWidget* w, Status s, int circleIndex) { CircleWidget* circleWidget = CircleWidget::getFromID(circleIndex); if (circleWidget == nullptr) moveWidget(w, s, true); else circleWidget->addFriendWidget(w, s); connect(w, &FriendWidget::friendWidgetRenamed, this, &FriendListWidget::onFriendWidgetRenamed); }
void FriendListWidget::moveFriends(QLayout* layout) { for (int i = 0; i < layout->count(); i++) { QWidget* widget = layout->itemAt(i)->widget(); FriendWidget* friendWidget = qobject_cast<FriendWidget*>(widget); CircleWidget* circleWidget = qobject_cast<CircleWidget*>(widget); if (circleWidget) { circleWidget->moveFriendWidgets(this); } else if (friendWidget) { const Friend* contact = friendWidget->getFriend(); QDate activityDate = getDateFriend(contact); int time = static_cast<int>(getTime(activityDate)); QWidget* w = activityLayout->itemAt(time)->widget(); CategoryWidget* categoryWidget = qobject_cast<CategoryWidget*>(w); categoryWidget->addFriendWidget(friendWidget, contact->getStatus()); } } }
CircleWidget* FriendListWidget::createCircleWidget(int id) { if (id == -1) id = Settings::getInstance().addCircle(); // Stop, after it has been created. Code after this is for displaying. if (mode == Activity) return nullptr; assert(circleLayout != nullptr); CircleWidget* circleWidget = new CircleWidget(this, id); circleLayout->addSortedWidget(circleWidget); connect(this, &FriendListWidget::onCompactChanged, circleWidget, &CircleWidget::onCompactChanged); connect(circleWidget, &CircleWidget::renameRequested, this, &FriendListWidget::renameCircleWidget); circleWidget->show(); // Avoid flickering. return circleWidget; }
void FriendListWidget::removeFriendWidget(FriendWidget* w) { Friend* contact = FriendList::findFriend(w->friendId); if (mode == Activity) { QDate activityDate = getDateFriend(contact); int time = static_cast<int>(getTime(activityDate)); QWidget* widget = activityLayout->itemAt(time)->widget(); CategoryWidget* categoryWidget = qobject_cast<CategoryWidget*>(widget); categoryWidget->removeFriendWidget(w, contact->getStatus()); categoryWidget->setVisible(categoryWidget->hasChatrooms()); } else { int id = Settings::getInstance().getFriendCircleID(contact->getPublicKey()); CircleWidget* circleWidget = CircleWidget::getFromID(id); if (circleWidget != nullptr) { circleWidget->removeFriendWidget(w, contact->getStatus()); Widget::getInstance()->searchCircle(circleWidget); } } }
void FriendListWidget::dropEvent(QDropEvent* event) { if (event->mimeData()->hasFormat("friend")) { int friendId = event->mimeData()->data("friend").toInt(); Friend* f = FriendList::findFriend(friendId); assert(f != nullptr); FriendWidget* widget = f->getFriendWidget(); assert(widget != nullptr); // Update old circle after moved. CircleWidget* circleWidget = CircleWidget::getFromID(Settings::getInstance().getFriendCircleID(f->getToxId())); moveWidget(widget, f->getStatus(), true); if (circleWidget != nullptr) circleWidget->updateStatus(); } }
void FriendListWidget::searchChatrooms(const QString& searchString, bool hideOnline, bool hideOffline, bool hideGroups) { groupLayout.search(searchString, hideGroups); listLayout->searchChatrooms(searchString, hideOnline, hideOffline); if (circleLayout != nullptr) { for (int i = 0; i != circleLayout->getLayout()->count(); ++i) { CircleWidget* circleWidget = static_cast<CircleWidget*>(circleLayout->getLayout()->itemAt(i)->widget()); circleWidget->search(searchString, true, hideOnline, hideOffline); } } else if (activityLayout != nullptr) { for (int i = 0; i != activityLayout->count(); ++i) { CategoryWidget* categoryWidget = static_cast<CategoryWidget*>(activityLayout->itemAt(i)->widget()); categoryWidget->search(searchString, true, hideOnline, hideOffline); categoryWidget->setVisible(categoryWidget->hasChatrooms()); } } }
void FriendListWidget::dropEvent(QDropEvent* event) { // Check, that the element is dropped from qTox QObject* o = event->source(); FriendWidget* widget = qobject_cast<FriendWidget*>(o); if (!widget) return; // Check, that the user has a friend with the same ToxId ToxId toxId(event->mimeData()->text()); Friend* f = FriendList::findFriend(toxId.getPublicKey()); if (!f) return; // Save CircleWidget before changing the Id int circleId = Settings::getInstance().getFriendCircleID(f->getPublicKey()); CircleWidget* circleWidget = CircleWidget::getFromID(circleId); moveWidget(widget, f->getStatus(), true); if (circleWidget) circleWidget->updateStatus(); }
void FriendListWidget::onFriendWidgetRenamed(FriendWidget* friendWidget) { const Friend* contact = friendWidget->getFriend(); auto status = contact->getStatus(); if (mode == Activity) { QDate activityDate = getDateFriend(contact); int time = static_cast<int>(getTime(activityDate)); QWidget* widget = activityLayout->itemAt(time)->widget(); CategoryWidget* categoryWidget = qobject_cast<CategoryWidget*>(widget); categoryWidget->removeFriendWidget(friendWidget, status); categoryWidget->addFriendWidget(friendWidget, status); } else { int id = Settings::getInstance().getFriendCircleID(contact->getPublicKey()); CircleWidget* circleWidget = CircleWidget::getFromID(id); if (circleWidget != nullptr) { circleWidget->removeFriendWidget(friendWidget, status); circleWidget->addFriendWidget(friendWidget, status); Widget::getInstance()->searchCircle(circleWidget); } else { listLayout->removeFriendWidget(friendWidget, status); listLayout->addFriendWidget(friendWidget, status); } } }
void FriendWidget::updateStatusLight() { Friend* f = FriendList::findFriend(friendId); Status status = f->getStatus(); if (status == Status::Online && f->getEventFlag() == 0) statusPic.setPixmap(QPixmap(":img/status/dot_online.svg")); else if (status == Status::Online && f->getEventFlag() == 1) statusPic.setPixmap(QPixmap(":img/status/dot_online_notification.svg")); else if (status == Status::Away && f->getEventFlag() == 0) statusPic.setPixmap(QPixmap(":img/status/dot_away.svg")); else if (status == Status::Away && f->getEventFlag() == 1) statusPic.setPixmap(QPixmap(":img/status/dot_away_notification.svg")); else if (status == Status::Busy && f->getEventFlag() == 0) statusPic.setPixmap(QPixmap(":img/status/dot_busy.svg")); else if (status == Status::Busy && f->getEventFlag() == 1) statusPic.setPixmap(QPixmap(":img/status/dot_busy_notification.svg")); else if (status == Status::Offline && f->getEventFlag() == 0) statusPic.setPixmap(QPixmap(":img/status/dot_offline.svg")); else if (status == Status::Offline && f->getEventFlag() == 1) statusPic.setPixmap(QPixmap(":img/status/dot_offline_notification.svg")); if (f->getEventFlag()) { CircleWidget* circleWidget = CircleWidget::getFromID(Settings::getInstance().getFriendCircleID(FriendList::findFriend(friendId)->getToxId())); if (circleWidget != nullptr) circleWidget->setExpanded(true); Widget::getInstance()->updateFriendActivity(FriendList::findFriend(friendId)); } if (!f->getEventFlag()) statusPic.setMargin(3); else statusPic.setMargin(0); }
void FriendListWidget::addCircleWidget(FriendWidget* friendWidget) { CircleWidget* circleWidget = createCircleWidget(); if (circleWidget != nullptr) { if (friendWidget != nullptr) { CircleWidget* circleOriginal = CircleWidget::getFromID(Settings::getInstance().getFriendCircleID(FriendList::findFriend(friendWidget->friendId)->getToxId())); circleWidget->addFriendWidget(friendWidget, FriendList::findFriend(friendWidget->friendId)->getStatus()); circleWidget->setExpanded(true); if (circleOriginal != nullptr) Widget::getInstance()->searchCircle(circleOriginal); } Widget::getInstance()->searchCircle(circleWidget); if (window()->isActiveWindow()) circleWidget->editName(); } reDraw(); }
void FriendListWidget::addCircleWidget(FriendWidget* friendWidget) { CircleWidget* circleWidget = createCircleWidget(); if (circleWidget != nullptr) { if (friendWidget != nullptr) { Friend* f = FriendList::findFriend(friendWidget->friendId); ToxPk toxPk = f->getPublicKey(); int circleId = Settings::getInstance().getFriendCircleID(toxPk); CircleWidget* circleOriginal = CircleWidget::getFromID(circleId); circleWidget->addFriendWidget(friendWidget, f->getStatus()); circleWidget->setExpanded(true); if (circleOriginal != nullptr) Widget::getInstance()->searchCircle(circleOriginal); } Widget::getInstance()->searchCircle(circleWidget); if (window()->isActiveWindow()) circleWidget->editName(); } reDraw(); }
void FriendWidget::contextMenuEvent(QContextMenuEvent * event) { if (!active) setBackgroundRole(QPalette::Highlight); installEventFilter(this); // Disable leave event. QPoint pos = event->globalPos(); ToxId id = FriendList::findFriend(friendId)->getToxId(); QString dir = Settings::getInstance().getAutoAcceptDir(id); QMenu menu; QAction* openChatWindow = nullptr; QAction* removeChatWindow = nullptr; ContentDialog* contentDialog = ContentDialog::getFriendDialog(friendId); bool notAlone = contentDialog != nullptr && contentDialog->chatroomWidgetCount() > 1; if (contentDialog == nullptr || notAlone) openChatWindow = menu.addAction(tr("Open chat in new window")); if (contentDialog != nullptr && contentDialog->hasFriendWidget(friendId, this)) removeChatWindow = menu.addAction(tr("Remove chat from this window")); menu.addSeparator(); QMenu* inviteMenu = menu.addMenu(tr("Invite to group","Menu to invite a friend to a groupchat")); QAction* newGroupAction = inviteMenu->addAction(tr("To new group")); inviteMenu->addSeparator(); QMap<QAction*, Group*> groupActions; for (Group* group : GroupList::getAllGroups()) { int maxNameLen = 30; QString name = group->getGroupWidget()->getName(); if ( name.length() > maxNameLen ) { name = name.left(maxNameLen).trimmed() + ".."; } QAction* groupAction = inviteMenu->addAction(tr("Invite to group '%1'").arg(name)); groupActions[groupAction] = group; } int circleId = Settings::getInstance().getFriendCircleID(FriendList::findFriend(friendId)->getToxId()); CircleWidget *circleWidget = CircleWidget::getFromID(circleId); QMenu* circleMenu = nullptr; QAction* newCircleAction = nullptr; QAction *removeCircleAction = nullptr; QMap<QAction*, int> circleActions; FriendListWidget *friendList; if (circleWidget == nullptr) friendList = qobject_cast<FriendListWidget*>(FriendList::findFriend(friendId)->getFriendWidget()->parentWidget()); else friendList = qobject_cast<FriendListWidget*>(circleWidget->parentWidget()); circleMenu = menu.addMenu(tr("Move to circle...", "Menu to move a friend into a different circle")); newCircleAction = circleMenu->addAction(tr("To new circle")); if (circleId != -1) removeCircleAction = circleMenu->addAction(tr("Remove from circle '%1'").arg(Settings::getInstance().getCircleName(circleId))); circleMenu->addSeparator(); QList<QAction*> circleActionList; for (int i = 0; i < Settings::getInstance().getCircleCount(); ++i) { if (i != circleId) { circleActionList.push_back(new QAction(tr("Move to circle \"%1\"").arg(Settings::getInstance().getCircleName(i)), circleMenu)); circleActions[circleActionList.back()] = i; } } std::sort(circleActionList.begin(), circleActionList.end(), [](const QAction* lhs, const QAction* rhs) -> bool { QCollator collator; collator.setNumericMode(true); return collator.compare(lhs->text(), rhs->text()) < 0; }); circleMenu->addActions(circleActionList); QAction* setAlias = menu.addAction(tr("Set alias...")); menu.addSeparator(); QAction* autoAccept = menu.addAction(tr("Auto accept files from this friend", "context menu entry")); autoAccept->setCheckable(true); autoAccept->setChecked(!dir.isEmpty()); menu.addSeparator(); QAction* removeFriendAction = nullptr; if (contentDialog == nullptr || !contentDialog->hasFriendWidget(friendId, this)) removeFriendAction = menu.addAction(tr("Remove friend", "Menu to remove the friend from our friendlist")); menu.addSeparator(); QAction* aboutWindow = menu.addAction(tr("Show details")); QAction* selectedItem = menu.exec(pos); removeEventFilter(this); if (!active) setBackgroundRole(QPalette::Window); if (selectedItem) { if (selectedItem == setAlias) { nameLabel->editBegin(); } else if (selectedItem == removeFriendAction) { emit removeFriend(friendId); return; } else if (selectedItem == openChatWindow) { emit chatroomWidgetClicked(this, true); return; } else if (selectedItem == removeChatWindow) { ContentDialog* contentDialog = ContentDialog::getFriendDialog(friendId); contentDialog->removeFriend(friendId); return; } else if (selectedItem == autoAccept) { if (!autoAccept->isChecked()) { qDebug() << "not checked"; dir = QDir::homePath(); autoAccept->setChecked(false); Settings::getInstance().setAutoAcceptDir(id, ""); } else if (autoAccept->isChecked()) { dir = QFileDialog::getExistingDirectory(0, tr("Choose an auto accept directory","popup title"), dir, QFileDialog::DontUseNativeDialog); autoAccept->setChecked(true); qDebug() << "setting auto accept dir for" << friendId << "to" << dir; Settings::getInstance().setAutoAcceptDir(id, dir); } } else if (selectedItem == aboutWindow) { AboutUser *aboutUser = new AboutUser(id, Widget::getInstance()); aboutUser->setFriend(FriendList::findFriend(friendId)); aboutUser->show(); } else if (selectedItem == newGroupAction) { int groupId = Core::getInstance()->createGroup(); Core::getInstance()->groupInviteFriend(friendId, groupId); } else if (selectedItem == newCircleAction) { if (circleWidget != nullptr) circleWidget->updateStatus(); if (friendList != nullptr) friendList->addCircleWidget(FriendList::findFriend(friendId)->getFriendWidget()); else Settings::getInstance().setFriendCircleID(id, Settings::getInstance().addCircle()); } else if (groupActions.contains(selectedItem)) { Group* group = groupActions[selectedItem]; Core::getInstance()->groupInviteFriend(friendId, group->getGroupId()); } else if (removeCircleAction != nullptr && selectedItem == removeCircleAction) { if (friendList != nullptr) friendList->moveWidget(FriendList::findFriend(friendId)->getFriendWidget(), FriendList::findFriend(friendId)->getStatus(), true); else Settings::getInstance().setFriendCircleID(id, -1); if (circleWidget) { circleWidget->updateStatus(); Widget::getInstance()->searchCircle(circleWidget); } } else if (circleActions.contains(selectedItem)) { CircleWidget* circle = CircleWidget::getFromID(circleActions[selectedItem]); if (circle != nullptr) { circle->addFriendWidget(FriendList::findFriend(friendId)->getFriendWidget(), FriendList::findFriend(friendId)->getStatus()); circle->setExpanded(true); Widget::getInstance()->searchCircle(circle); Settings::getInstance().savePersonal(); } else Settings::getInstance().setFriendCircleID(id, circleActions[selectedItem]); if (circleWidget != nullptr) { circleWidget->updateStatus(); Widget::getInstance()->searchCircle(circleWidget); } } } }
void FriendListWidget::cycleContacts(GenericChatroomWidget* activeChatroomWidget, bool forward) { if (!activeChatroomWidget) { return; } int index = -1; FriendWidget* friendWidget = qobject_cast<FriendWidget*>(activeChatroomWidget); if (mode == Activity) { if (!friendWidget) { return; } QDate activityDate = getDateFriend(friendWidget->getFriend()); index = static_cast<int>(getTime(activityDate)); QWidget* widget = activityLayout->itemAt(index)->widget(); CategoryWidget* categoryWidget = qobject_cast<CategoryWidget*>(widget); if (categoryWidget == nullptr || categoryWidget->cycleContacts(friendWidget, forward)) { return; } index += forward ? 1 : -1; for (;;) { // Bounds checking. if (index < 0) { index = LAST_TIME; continue; } else if (index > LAST_TIME) { index = 0; continue; } widget = activityLayout->itemAt(index)->widget(); categoryWidget = qobject_cast<CategoryWidget*>(widget); if (categoryWidget != nullptr) { if (!categoryWidget->cycleContacts(forward)) { // Skip empty or finished categories. index += forward ? 1 : -1; continue; } } break; } return; } QLayout* currentLayout = nullptr; CircleWidget* circleWidget = nullptr; if (friendWidget != nullptr) { const ToxPk& pk = friendWidget->getFriend()->getPublicKey(); uint32_t circleId = Settings::getInstance().getFriendCircleID(pk); circleWidget = CircleWidget::getFromID(circleId); if (circleWidget != nullptr) { if (circleWidget->cycleContacts(friendWidget, forward)) { return; } index = circleLayout->indexOfSortedWidget(circleWidget); currentLayout = circleLayout->getLayout(); } else { currentLayout = listLayout->getLayoutOnline(); index = listLayout->indexOfFriendWidget(friendWidget, true); if (index == -1) { currentLayout = listLayout->getLayoutOffline(); index = listLayout->indexOfFriendWidget(friendWidget, false); } } } else { GroupWidget* groupWidget = qobject_cast<GroupWidget*>(activeChatroomWidget); if (groupWidget != nullptr) { currentLayout = groupLayout.getLayout(); index = groupLayout.indexOfSortedWidget(groupWidget); } else { return; }; } index += forward ? 1 : -1; for (;;) { // Bounds checking. if (index < 0) { currentLayout = nextLayout(currentLayout, forward); index = currentLayout->count() - 1; continue; } else if (index >= currentLayout->count()) { currentLayout = nextLayout(currentLayout, forward); index = 0; continue; } // Go to the actual next index. if (currentLayout == listLayout->getLayoutOnline() || currentLayout == listLayout->getLayoutOffline() || currentLayout == groupLayout.getLayout()) { GenericChatroomWidget* chatWidget = qobject_cast<GenericChatroomWidget*>(currentLayout->itemAt(index)->widget()); if (chatWidget != nullptr) emit chatWidget->chatroomWidgetClicked(chatWidget); return; } else if (currentLayout == circleLayout->getLayout()) { circleWidget = qobject_cast<CircleWidget*>(currentLayout->itemAt(index)->widget()); if (circleWidget != nullptr) { if (!circleWidget->cycleContacts(forward)) { // Skip empty or finished circles. index += forward ? 1 : -1; continue; } } return; } else { return; } } }
void FriendListWidget::cycleContacts(GenericChatroomWidget* activeChatroomWidget, bool forward) { if (activeChatroomWidget == nullptr) return; int index = -1; FriendWidget* friendWidget = dynamic_cast<FriendWidget*>(activeChatroomWidget); if (mode == Activity) { if (friendWidget == nullptr) return; QDate activityDate = getDateFriend(FriendList::findFriend(friendWidget->friendId)); index = getTime(activityDate); CategoryWidget* categoryWidget = dynamic_cast<CategoryWidget*>(activityLayout->itemAt(index)->widget()); if (categoryWidget == nullptr || categoryWidget->cycleContacts(friendWidget, forward)) return; index += forward ? 1 : -1; for (;;) { // Bounds checking. if (index < Today) { index = Never; continue; } else if (index > Never) { index = Today; continue; } CategoryWidget* categoryWidget = dynamic_cast<CategoryWidget*>(activityLayout->itemAt(index)->widget()); if (categoryWidget != nullptr) { if (!categoryWidget->cycleContacts(forward)) { // Skip empty or finished categories. index += forward ? 1 : -1; continue; } } break; } return; } QLayout* currentLayout = nullptr; CircleWidget* circleWidget = nullptr; if (friendWidget != nullptr) { circleWidget = CircleWidget::getFromID(Settings::getInstance().getFriendCircleID(FriendList::findFriend(friendWidget->friendId)->getToxId())); if (circleWidget != nullptr) { if (circleWidget->cycleContacts(friendWidget, forward)) return; index = circleLayout->indexOfSortedWidget(circleWidget); currentLayout = circleLayout->getLayout(); } else { currentLayout = listLayout->getLayoutOnline(); index = listLayout->indexOfFriendWidget(friendWidget, true); if (index == -1) { currentLayout = listLayout->getLayoutOffline(); index = listLayout->indexOfFriendWidget(friendWidget, false); } } } else { GroupWidget* groupWidget = dynamic_cast<GroupWidget*>(activeChatroomWidget); if (groupWidget != nullptr) { currentLayout = groupLayout.getLayout(); index = groupLayout.indexOfSortedWidget(groupWidget); } else { return; }; } index += forward ? 1 : -1; for (;;) { // Bounds checking. if (index < 0) { currentLayout = nextLayout(currentLayout, forward); index = currentLayout->count() - 1; continue; } else if (index >= currentLayout->count()) { currentLayout = nextLayout(currentLayout, forward); index = 0; continue; } // Go to the actual next index. if (currentLayout == listLayout->getLayoutOnline() || currentLayout == listLayout->getLayoutOffline() || currentLayout == groupLayout.getLayout()) { GenericChatroomWidget* chatWidget = dynamic_cast<GenericChatroomWidget*>(currentLayout->itemAt(index)->widget()); if (chatWidget != nullptr) emit chatWidget->chatroomWidgetClicked(chatWidget); return; } else if (currentLayout == circleLayout->getLayout()) { circleWidget = dynamic_cast<CircleWidget*>(currentLayout->itemAt(index)->widget()); if (circleWidget != nullptr) { if (!circleWidget->cycleContacts(forward)) { // Skip empty or finished circles. index += forward ? 1 : -1; continue; } } return; } else { return; } } }