void ChatDlg::updateContact(const Jid &j, bool fromPresence) { // if groupchat, only update if the resource matches if (account()->findGCContact(j) && !jid().compare(j)) { return; } if (jid().compare(j, false)) { QList<UserListItem*> ul = account()->findRelevant(j); UserStatus userStatus = userStatusFor(jid(), ul, false); if (userStatus.statusType == XMPP::Status::Offline) contactChatState_ = XMPP::StateNone; bool statusChanged = false; if (status_ != userStatus.statusType || statusString_ != userStatus.status) { statusChanged = true; status_ = userStatus.statusType; statusString_ = userStatus.status; } contactUpdated(userStatus.userListItem, userStatus.statusType, userStatus.status); if (userStatus.userListItem) { dispNick_ = JIDUtil::nickOrJid(userStatus.userListItem->name(), userStatus.userListItem->jid().full()); nicksChanged(); invalidateTab(); key_ = userStatus.publicKeyID; updatePGP(); if (fromPresence && statusChanged) { QString msg = tr("%1 is %2").arg(Qt::escape(dispNick_)).arg(status2txt(status_)); if (!statusString_.isEmpty()) { QString ss = TextUtil::linkify(TextUtil::plain2rich(statusString_)); if (PsiOptions::instance()->getOption("options.ui.emoticons.use-emoticons").toBool()) { ss = TextUtil::emoticonify(ss); } if (PsiOptions::instance()->getOption("options.ui.chat.legacy-formatting").toBool()) { ss = TextUtil::legacyFormat(ss); } msg += QString(" [%1]").arg(ss); } appendSysMsg(msg); } } // Update capabilities capsChanged(jid()); // Reset 'is composing' event if the status changed if (statusChanged && contactChatState_ != XMPP::StateNone) { if (contactChatState_ == XMPP::StateComposing || contactChatState_ == XMPP::StateInactive) { setContactChatState(XMPP::StatePaused); } } } }
void ContactManager::contactDataUpdated() { ContactData *cd = dynamic_cast<ContactData *>(sender()); if (!cd) return; Contact contact = byContactData(cd); if (!contact.isNull()) emit contactUpdated(contact); }
void ContactListModelUpdater::addContact(PsiContact* contact) { // qWarning(">>> addContact: %s", qPrintable(contact->jid())); Q_ASSERT(!monitoredContacts_.contains(contact)); if (monitoredContacts_.contains(contact)) return; monitoredContacts_[contact] = true; // qWarning("updater(%x):addContact: %s", (int)this, qPrintable(contact->jid().full())); addOperation(contact, AddContact); connect(contact, SIGNAL(destroyed(PsiContact*)), SLOT(removeContact(PsiContact*))); connect(contact, SIGNAL(updated()), SLOT(contactUpdated())); connect(contact, SIGNAL(groupsChanged()), SLOT(contactGroupsChanged())); }
void ContactModel::addBot(MAGNORMOBOT *bot) { if (conduits.contains(bot)) { qWarning("ContactModel is already tracking %p\n", bot); return; } connect(bot, SIGNAL(contactPresenceUpdated(QString)), SLOT(updateContactPresence(QString))); connect(bot, SIGNAL(contactAdded(QString)), SLOT(addContact(QString))); connect(bot, SIGNAL(contactUpdated(QString)), SLOT(updateContact(QString))); connect(bot, SIGNAL(contactRemoved(QString)), SLOT(removeContact(QString))); connect(bot, SIGNAL(contactListReceived()), SLOT(receiveContactList())); connect(bot, SIGNAL(disconnected()), SLOT(botDisconnected()), Qt::QueuedConnection); connect(bot, SIGNAL(destroyed()), SLOT(botDestroyed())); refreshContacts(bot); }
bool SSIManager::updateContact( const Oscar::SSI& contact ) { Oscar::SSI oldContact = findContact( contact.name() ); if ( oldContact.isValid() ) { removeID( oldContact ); d->SSIList.remove( oldContact ); } if ( d->SSIList.findIndex( contact ) != -1 ) { kdDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "New contact is already in list." << endl; return false; } kdDebug( OSCAR_RAW_DEBUG ) << k_funcinfo << "Updating contact '" << contact.name() << "' in SSI list" << endl; addID( contact ); d->SSIList.append( contact ); emit contactUpdated( contact ); return true; }
void ContactListModelUpdater::commit() { if (!updatesEnabled()) return; // qWarning("updater(%x):commit", (int)this); // qWarning("*** ContactListModelUpdater::commit(). operationQueue_.count() = %d", operationQueue_.count()); commitTimerStartTime_ = QDateTime(); commitTimer_->stop(); if (operationQueue_.isEmpty()) return; bool doBulkUpdate = operationQueue_.count() > 1; if (doBulkUpdate) emit beginBulkContactUpdate(); QHashIterator<PsiContact*, int> it(operationQueue_); while (it.hasNext()) { it.next(); int operations = simplifiedOperationList(it.value()); if (operations & AddContact) emit addedContact(it.key()); if (operations & RemoveContact) Q_ASSERT(false); if (operations & UpdateContact) emit contactUpdated(it.key()); if (operations & ContactGroupsChanged) emit contactGroupsChanged(it.key()); } if (doBulkUpdate) emit endBulkContactUpdate(); operationQueue_.clear(); }
ChatWindow::ChatWindow(Account* account, ChatSession* s, EmoticonSelector* emoticonSelector, MultSelector* multSelector) : QWidget(), m_account(account), session(s), messageEditor(0), smsEditor(0), flashPlayer(0) { qDebug() << Q_FUNC_INFO << "{"; transferStatus = None; QVBoxLayout* layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); isNewMessage = false; connect(s->contact(), SIGNAL(renamed(QString)), this, SLOT(contactUpdated())); connect(s->contact(), SIGNAL(ignoredChanged()), this, SLOT(contactIgnored())); timer = new QTimer(this); timer->setSingleShot(true); connect(timer, SIGNAL(timeout()), this, SLOT(slotTimeout())); QHBoxLayout* mainLayout = new QHBoxLayout; splitter = new QSplitter(Qt::Vertical, this); QWidget* chatWidget = new QWidget; QHBoxLayout* chatWidgetLayout = new QHBoxLayout; chatWidgetLayout->setContentsMargins(1, 1, 1, 1); chatWidgetLayout->setSpacing(1); QToolBar* topToolbar = new QToolBar; QAction* games = new QAction(QIcon(), "", this); games->setCheckable(true); connect(games, SIGNAL(triggered(bool)), this, SLOT(showGameMenu(bool))); topToolbar->addAction(games); layout->addWidget(topToolbar); chatView = new AnimatedTextBrowser; chatWidgetLayout->addWidget(chatView); connect(chatView, SIGNAL(anchorClicked(QUrl)), this, SLOT(slotAnchorClicked(QUrl))); if (!s->contact()->isPhone() && !session->contact()->isConference()) { AvatarBoxWithHandle* avatarBoxWithHandle = new AvatarBoxWithHandle(m_account->avatarsPath(), session->contact()->email()); avatarBoxWithHandle->toggle(m_account->settings()->value("ChatWindow/TopAvatarBoxState", false).toBool()); connect(avatarBoxWithHandle, SIGNAL(toggled(bool)), SLOT(saveTopAvatarBoxState(bool))); chatWidgetLayout->addWidget(avatarBoxWithHandle); } chatWidget->setLayout(chatWidgetLayout); splitter->addWidget(chatWidget); if (!s->contact()->isPhone()) { QWidget* bottomWidget = new QWidget; QHBoxLayout* bottomWidgetLayout = new QHBoxLayout; bottomWidgetLayout->setContentsMargins(1, 1, 1, 1); bottomWidgetLayout->setSpacing(1); editorsWidget = new QTabWidget; editorsWidget->setStyleSheet("QTabWidget::pane { border: 0px; } QTabWidget::tab-bar { left: 1px; } QTabBar::tab { padding: 0px 32px 0px 32px; font: bold 9px; }"); editorsWidget->setTabPosition(QTabWidget::South); editorsWidget->setTabShape(QTabWidget::Triangular); messageEditor = new MessageEditor(m_account, session->contact(), emoticonSelector, multSelector); connect(messageEditor, SIGNAL(sendPressed()), this, SLOT(sendMessage())); connect(messageEditor, SIGNAL(textChanged()), session, SLOT(sendTyping())); connect(messageEditor, SIGNAL(wakeupPressed()), this, SLOT(wakeupContact())); connect(messageEditor, SIGNAL(showMult(const QString&)), this, SLOT(sendMult(const QString&))); connect(this, SIGNAL(messageEditorActivate()), messageEditor, SLOT(messageEditorActivate())); connect(messageEditor, SIGNAL(setIgnore(bool)), this, SIGNAL(setIgnore(bool))); connect(this, SIGNAL(ignoreSet(bool)), messageEditor, SLOT(slotIgnoreSet(bool))); connect(messageEditor, SIGNAL(setSignalCheckSpelling(bool)), this, SIGNAL(setSignalCheckSpelling(bool))); connect(this, SIGNAL(signalCheckSpellingSet(bool)), messageEditor, SLOT(setCheckSpelling(bool))); fileMessageOut = new FileMessage(FileMessage::Outgoing, this); fileMessageIn = new FileMessage(FileMessage::Incoming, this); fileMessageIn->setAccEmail(account->email()); fileMessageIn->setContEmail(session->contact()->email()); fileMessageOut->setAccEmail(account->email()); fileMessageOut->setContEmail(session->contact()->email()); connect(fileMessageOut, SIGNAL(fileTransferred(FileMessage::Status, QString, QString)), this, SLOT(slotFileTransferred(FileMessage::Status, QString, QString))); connect(fileMessageOut, SIGNAL(progress(FileMessage::Status, int)), messageEditor, SLOT(slotProgress(FileMessage::Status, int))); connect(fileMessageIn, SIGNAL(startTransferring(quint32)), this, SLOT(transferStarted(quint32))); connect(fileMessageIn, SIGNAL(fileTransferred(FileMessage::Status, QString, QString)), this, SLOT(slotFileTransferred(FileMessage::Status, QString, QString))); connect(fileMessageIn, SIGNAL(progress(FileMessage::Status, int)), messageEditor, SLOT(slotProgress(FileMessage::Status, int))); connect(m_account->client(), SIGNAL(fileTransferAck(quint32, QByteArray, quint32, QByteArray)), fileMessageOut, SLOT(slotFileTransferStatus(quint32, QByteArray, quint32, QByteArray))); connect(m_account->client(), SIGNAL(proxyAck(quint32, QByteArray, quint32, quint32, QByteArray, QByteArray, quint32, quint32, quint32, quint32)), fileMessageOut, SLOT(slotProxyAck(quint32, QByteArray, quint32, quint32, QByteArray, QByteArray, quint32, quint32, quint32, quint32))); connect(m_account->client(), SIGNAL(fileTransferAck(quint32, QByteArray, quint32, QByteArray)), fileMessageIn, SLOT(slotFileTransferStatus(quint32, QByteArray, quint32, QByteArray))); connect(m_account->client(), SIGNAL(proxy(QByteArray, quint32, quint32, QByteArray, QByteArray, quint32, quint32, quint32, quint32)), fileMessageIn, SLOT(slotProxy(QByteArray, quint32, quint32, QByteArray, QByteArray, quint32, quint32, quint32, quint32))); connect(messageEditor, SIGNAL(transferringCancel()), this, SLOT(transferringCancelled())); editorsWidget->addTab(messageEditor, tr("Text")); if (!session->contact()->isConference()) { smsEditor = new SmsEditor(m_account, session->contact()); connect(smsEditor, SIGNAL(sendPressed()), this, SLOT(sendSms())); editorsWidget->addTab(smsEditor, tr("SMS")); connect(editorsWidget, SIGNAL(currentChanged(int)), this, SLOT(slotEditorActivate(int))); }
void ContactListModel::Private::realAddContact(PsiContact *contact) { ContactListItem *root = static_cast<ContactListItem*>(q->root());; if (accountsEnabled) { PsiAccount *account = contact->account(); ContactListItem *accountItem = root->findAccount(account); if (!accountItem) { accountItem = new ContactListItem(q, ContactListItem::Type::AccountType); accountItem->setAccount(account); accountItem->setExpanded(!collapsed.contains(accountItem->internalName())); connect(account, SIGNAL(accountDestroyed()), SLOT(onAccountDestroyed())); connect(account, SIGNAL(updatedAccount()), SLOT(updateAccount())); root->appendChild(accountItem); } root = accountItem; } if (!contact->isSelf() && groupsEnabled) { ContactListItem::SpecialGroupType specialGroupType = specialGroupFor(contact); QStringList groups = specialGroupType == ContactListItem::SpecialGroupType::NoneSpecialGroupType ? contact->groups() : QStringList{QString()}; for (const QString &groupName: groups) { ContactListItem *groupItem = nullptr; if (specialGroupType == ContactListItem::SpecialGroupType::NoneSpecialGroupType) groupItem = root->findGroup(groupName); else groupItem = root->findGroup(specialGroupType); // No duplicates if (groupItem && groupItem->findContact(contact)) { continue; } ContactListItem *item = new ContactListItem(q, ContactListItem::Type::ContactType); item->setContact(contact); if (!groupItem) { groupItem = new ContactListItem(q, ContactListItem::Type::GroupType, specialGroupType); if (specialGroupType == ContactListItem::SpecialGroupType::NoneSpecialGroupType) groupItem->setName(groupName); root->appendChild(groupItem); groupItem->setExpanded(!collapsed.contains(groupItem->internalName())); groupItem->setHidden(hidden.contains(groupItem->internalName())); } groupItem->appendChild(item); monitoredContacts.insertMulti(contact, q->toModelIndex(item)); } } else { ContactListItem *item = new ContactListItem(q, ContactListItem::Type::ContactType); item->setContact(contact); root->appendChild(item); monitoredContacts.insertMulti(contact, q->toModelIndex(item)); } connect(contact, SIGNAL(destroyed(PsiContact*)), SLOT(removeContact(PsiContact*))); connect(contact, SIGNAL(groupsChanged()), SLOT(contactGroupsChanged())); connect(contact, SIGNAL(updated()), SLOT(contactUpdated())); connect(contact, SIGNAL(alert()), SLOT(contactUpdated())); connect(contact, SIGNAL(anim()), SLOT(contactUpdated())); }
void SqlContactsMapping::init() { loadMappingsFromDatabase(); connect(m_contactManager, SIGNAL(contactUpdated(Contact)), this, SLOT(contactUpdated(Contact))); }