void Bb10Ui::onChannelListTriggered(const QVariantList index) { // Headers are not clickable if (index.length() < 2) return; QModelIndex modelIndex = qobject_cast<DataModelAdapter*>(m_channelListView->dataModel())->getQModelIndex(index); BufferInfo bufferInfo = modelIndex.data(NetworkModel::BufferInfoRole).value<BufferInfo>(); BufferId id = bufferInfo.bufferId(); if (!id.isValid()) return; QString bufferName = bufferInfo.bufferName(); qDebug() << "xxxxx Bb10Ui::onChannelListTriggered bufferInfo = " << bufferInfo << " index = " << index << " modelIndex = " << modelIndex; ChatView *view = qobject_cast<ChatView *>(m_chatViews.value(id)); if (!view) { view = new ChatView(id, bufferName); m_chatViews[id] = view; } m_currentBufferId = id; Client::bufferModel()->switchToBuffer(id); Client::networkModel()->clearBufferActivity(id); Client::setBufferLastSeenMsg(id, view->getLastMsgId()); Client::backlogManager()->checkForBacklog(id); navPanePush(view->getPage()); // ask channelListView to update the appearance qobject_cast<DataModelAdapter*>(m_channelListView->dataModel())->handleBufferModelDataChanged(modelIndex, modelIndex); }
void BufferWidget::scrollToHighlight(QGraphicsItem *highlightItem) { ChatView *view = qobject_cast<ChatView *>(ui.stackedWidget->currentWidget()); if (view) { view->centerOn(highlightItem); } }
AbstractChatView *BufferWidget::createChatView(BufferId id) { ChatView *chatView; chatView = new ChatView(id, this); chatView->setBufferContainer(this); _chatViews[id] = chatView; ui.stackedWidget->addWidget(chatView); chatView->setFocusProxy(this); return chatView; }
void BufferWidget::showChatView(BufferId id) { if(!id.isValid()) { ui.stackedWidget->setCurrentWidget(ui.page); } else { ChatView *view = qobject_cast<ChatView *>(_chatViews.value(id)); Q_ASSERT(view); ui.stackedWidget->setCurrentWidget(view); _chatViewSearchController->setScene(view->scene()); } }
bool ChatLine::sceneEvent(QEvent *event) { if(event->type() == QEvent::GrabMouse) { // get mouse cursor pos relative to us ChatView *view = chatScene()->chatView(); QPointF linePos = mapFromScene(view->mapToScene(view->mapFromGlobal(QCursor::pos()))); setMouseGrabberItem(itemAt(linePos)); } else if(event->type() == QEvent::UngrabMouse) { setMouseGrabberItem(0); } return QGraphicsItem::sceneEvent(event); }
void BufferWidget::currentChanged(const QModelIndex ¤t, const QModelIndex &previous) { ChatView *prevView = qobject_cast<ChatView *>(ui.stackedWidget->currentWidget()); AbstractBufferContainer::currentChanged(current, previous); // switch first to avoid a redraw // we need to hide the marker line if it's already/still at the bottom of the view (and not scrolled up) ChatView *curView = qobject_cast<ChatView *>(ui.stackedWidget->currentWidget()); if(curView) { BufferId curBufferId = current.data(NetworkModel::BufferIdRole).value<BufferId>(); if(curBufferId.isValid()) { MsgId markerMsgId = Client::networkModel()->markerLineMsgId(curBufferId); if(markerMsgId == curView->lastMsgId() && markerMsgId == curView->lastVisibleMsgId()) curView->setMarkerLineVisible(false); else curView->setMarkerLineVisible(true); } } if(prevView && autoMarkerLine()) setMarkerLine(prevView, false); }
void execute() { ChatView *v = (ChatView*)Desktop::getView("ChatView"); if ( v ) { tChatBox * cbox = v->getChatBox(); if ( ! cbox ) { return; } tVScrollBar * sbar = cbox->getVscrollBar(); if ( ! sbar ) { return; } int new_pos = std::min(sbar->getMax(), sbar->getPosition() + cbox->getNumVisibleLines()); sbar->setPosition(new_pos); } }
bool BufferWidget::eventFilter(QObject *watched, QEvent *event) { if (event->type() != QEvent::KeyPress) return false; QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); MultiLineEdit *inputLine = qobject_cast<MultiLineEdit *>(watched); if (!inputLine) return false; // Intercept copy key presses if (keyEvent == QKeySequence::Copy) { if (inputLine->hasSelectedText()) return false; ChatView *view = qobject_cast<ChatView *>(ui.stackedWidget->currentWidget()); if (view) view->scene()->selectionToClipboard(); return true; } // We don't want to steal cursor movement keys if the input line is in multiline mode if (!inputLine->isSingleLine()) return false; switch (keyEvent->key()) { case Qt::Key_Up: case Qt::Key_Down: if (!(keyEvent->modifiers() & Qt::ShiftModifier)) return false; case Qt::Key_PageUp: case Qt::Key_PageDown: // static cast to access public qobject::event return static_cast<QObject *>(ui.stackedWidget->currentWidget())->event(event); default: return false; } }
ProcessResult ProcessMuc::blockArrived(JabberDataBlockRef block, const ResourceContextRef rc){ JabberDataBlockRef xmuc=block->findChildNamespace("x", "http://jabber.org/protocol/muc#user"); if (!xmuc) return BLOCK_REJECTED; const std::string &from=block->getAttribute("from"); const std::string &type=block->getAttribute("type"); Jid roomNode; roomNode.setJid(from); std::string message; //1. group MucGroup::ref roomGrp; roomGrp=boost::dynamic_pointer_cast<MucGroup> (rc->roster->findGroup(roomNode.getBareJid())); if (!roomGrp) return BLOCK_PROCESSED; //dropped presence MucContact::ref c=getMucContactEntry(from, rc); MPA action=NONE; if (type=="error") { JabberDataBlockRef error=block->getChildByName("error"); int errCode=atoi(error->getAttribute("code").c_str()); //todo: if (status>=Presence.PRESENCE_OFFLINE) testMeOffline(); action=LEAVE; //todo: if (errCode!=409 || status>=Presence.PRESENCE_OFFLINE) setStatus(presenceType); std::string errText=error->getChildText("text"); if (errText.length()>0) message=errText; // if error description is provided by server else // legacy codes switch (errCode) { case 401: message="Password required"; case 403: message="You are banned in this room"; case 404: message="Room does not exists"; case 405: message="You can't create room on this server"; case 406: message="Reserved roomnick must be used"; case 407: message="This room is members-only"; case 409: message="Nickname is already in use by another occupant"; case 503: message="Maximum number of users has been reached in this room"; default: message=*(error->toXML()); } } else { JabberDataBlockRef item=xmuc->getChildByName("item"); MucContact::Role role = getRoleIndex(item->getAttribute("role")); c->sortKey=MucContact::MODERATOR-role; MucContact::Affiliation affiliation = getAffiliationIndex(item->getAttribute("affiliation")); boolean roleChanged= c->role != role; boolean affiliationChanged= c->affiliation !=affiliation; c->role=role; c->affiliation=affiliation; //setSortKey(nick); switch (role) { case MucContact::MODERATOR: c->transpIndex=icons::ICON_MODERATOR_INDEX; break; case MucContact::VISITOR: { Skin * il= dynamic_cast<Skin *>(skin.get()); c->transpIndex=(il)? il->getBaseIndex("visitors") : 0; break; } default: c->transpIndex=0; } JabberDataBlockRef statusBlock=xmuc->getChildByName("status"); int statusCode=(statusBlock)? atoi(statusBlock->getAttribute("code").c_str()) : 0; message=c->jid.getResource(); // nick if (type=="unavailable") { action=LEAVE; std::string reason=item->getChildText("reason"); switch (statusCode) { case 303: message+=" is now known as "; message+=item->getAttribute("nick"); c->jid.setResource(item->getAttribute("nick")); c->rosterJid=c->jid.getJid(); //for vCard c->update(); action=NONE; break; case 307: //kick case 301: //ban message+=(statusCode==307)?" was kicked " : " was banned "; message+="("; message+=reason; message+=")"; if (c->realJid.length()>0){ message+=" - "; message+=c->realJid; } break; case 321: message+=" has been unaffiliated and kicked from members-only room"; break; case 322: message+=" has been kicked because room became members-only"; break; default: { message+=" has left the channel"; const std::string & status=block->getChildText("status"); if (status.length()) { message+=" ("; message+=status; message+=")"; } } } } else { //onlines action=ENTER; if (c->status>=presence::OFFLINE) { // first online std::string realJid=item->getAttribute("jid"); if (realJid.length()) { c->realJid=realJid; message+=" ("; message+=realJid; //for moderating purposes message+=")"; } message+=" has joined the channel as "; message+=roleName[role]; if (affiliation!=MucContact::NONE) { message+=" and "; message+=affiliationName[affiliation-MucContact::OUTCAST]; const std::string & status=block->getChildText("status"); if (status.length()) { message+=" ("; message+=status; message+=")"; } } } else { //change status message+=" is now "; if ( roleChanged ) message+=roleName[role]; if (affiliationChanged) { if (roleChanged) message+=" and "; message+=(affiliation==MucContact::NONE)? "unaffiliated" : affiliationName[affiliation-MucContact::OUTCAST]; } if (!roleChanged && !affiliationChanged) { const std::string &show=block->getChildText("show"); if (show.length()==0) message+="online"; else message+=show; const std::string & status=block->getChildText("status"); if (status.length()) { message+=" ("; message+=status; message+=")"; } } } } } if (c.get()==roomGrp->selfContact.get()) { switch (action) { case ENTER: // room contact is online roomGrp->room->status=presence::ONLINE; break; case LEAVE: // room contact is offline roomGrp->room->status=presence::OFFLINE; // make all occupants offline rc->roster->setStatusByFilter(roomNode.getBareJid(), presence::OFFLINE); break; } } { ChatView *cv = dynamic_cast<ChatView *>(tabs->getWindowByODR(c).get()); bool ascroll=(cv==NULL)? false: cv->autoScroll(); c->processPresence(block); if (ascroll) { cv->moveEnd(); } if (cv) if (IsWindowVisible(cv->getHWnd())) cv->redraw(); } rc->roster->makeViewList(); { Message::ref msg=Message::ref(new Message(message, from, false, Message::PRESENCE, Message::extractXDelay(block) )); Contact::ref room=roomGrp->room; ChatView *cv = dynamic_cast<ChatView *>(tabs->getWindowByODR(room).get()); bool ascroll=(cv==NULL)? false: cv->autoScroll(); room->messageList->push_back(msg); if (ascroll) { cv->moveEnd(); } if (cv) if (IsWindowVisible(cv->getHWnd())) cv->redraw(); } return BLOCK_PROCESSED; }
void BufferWidget::zoomOriginal() { ChatView *view = qobject_cast<ChatView *>(ui.stackedWidget->currentWidget()); if(view) view->zoomOriginal(); }