Commit 6b5ad3e2 authored by Andreas Traczyk's avatar Andreas Traczyk

callwidget: fix handling of smartlist for calls

Change-Id: If360b3f73a22f8cdfc140f1be2716390bfb9ccb0
parent 3fc824d7
......@@ -276,7 +276,7 @@ CallWidget::onIncomingMessage(const std::string& convUid,
.arg(QString::fromStdString(bestName)));
}
updateConversationsFilterWidget();
if (convUid != selectedConvUid()) {
if (convUid != LRCInstance::getSelectedConvUid()) {
return;
}
......@@ -319,7 +319,7 @@ CallWidget::setupSmartListContextMenu(const QPoint& pos)
[this, convUid, conversation, convModel]() {
convModel->placeCall(convUid);
ui->callingPhoto->setPixmap(QPixmap::fromImage(imageForConv(convUid)));
if (convUid != selectedConvUid()) {
if (convUid != LRCInstance::getSelectedConvUid()) {
selectConversation(*conversation, *convModel);
}
});
......@@ -330,7 +330,7 @@ CallWidget::setupSmartListContextMenu(const QPoint& pos)
[this, convUid, conversation, convModel]() {
convModel->placeAudioOnlyCall(convUid);
ui->callingPhoto->setPixmap(QPixmap::fromImage(imageForConv(convUid)));
if (convUid != selectedConvUid()) {
if (convUid != LRCInstance::getSelectedConvUid()) {
selectConversation(*conversation, *convModel);
}
});
......@@ -429,7 +429,7 @@ CallWidget::on_acceptButton_clicked()
{
auto convModel = LRCInstance::getCurrentConversationModel();
auto callModel = LRCInstance::getCurrentCallModel();
auto conversation = Utils::getConversationFromUid(selectedConvUid(), *convModel);
auto conversation = Utils::getConversationFromUid(LRCInstance::getSelectedConvUid(), *convModel);
callModel->accept(conversation->callId);
}
......@@ -437,7 +437,7 @@ void
CallWidget::on_refuseButton_clicked()
{
auto convModel = LRCInstance::getCurrentConversationModel();
auto conversation = Utils::getConversationFromUid(selectedConvUid(), *convModel);
auto conversation = Utils::getConversationFromUid(LRCInstance::getSelectedConvUid(), *convModel);
LRCInstance::getCurrentCallModel()->hangUp(conversation->callId);
showConversationView();
}
......@@ -446,7 +446,7 @@ void
CallWidget::on_cancelButton_clicked()
{
auto convModel = LRCInstance::getCurrentConversationModel();
auto conversation = Utils::getConversationFromUid(selectedConvUid(), *convModel);
auto conversation = Utils::getConversationFromUid(LRCInstance::getSelectedConvUid(), *convModel);
LRCInstance::getCurrentCallModel()->hangUp(conversation->callId);
showConversationView();
}
......@@ -494,9 +494,9 @@ CallWidget::on_smartList_doubleClicked(const QModelIndex& index)
if (!index.isValid())
return;
LRCInstance::getCurrentConversationModel()->placeCall(selectedConvUid());
LRCInstance::getCurrentConversationModel()->placeCall(LRCInstance::getSelectedConvUid());
ui->callingPhoto->setPixmap(QPixmap::fromImage(imageForConv(selectedConvUid())));
ui->callingPhoto->setPixmap(QPixmap::fromImage(imageForConv(LRCInstance::getSelectedConvUid())));
}
QImage
......@@ -505,18 +505,6 @@ CallWidget::imageForConv(const std::string& convUid)
return Utils::conversationPhoto(convUid, LRCInstance::getCurrentAccountInfo());
}
const std::string&
CallWidget::selectedAccountId()
{
return LRCInstance::getCurrAccId();
}
const std::string&
CallWidget::selectedConvUid()
{
return LRCInstance::getSelectedConvUid();
}
void
CallWidget::smartListSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
......@@ -628,21 +616,6 @@ void CallWidget::slotAccountChanged(int index)
try {
auto accountList = LRCInstance::accountModel().getAccountList();
setSelectedAccount(accountList.at(index));
auto& contactModel = LRCInstance::getCurrentAccountInfo().contactModel;
disconnect(contactAddedConnection_);
contactAddedConnection_ = connect(contactModel.get(), &lrc::api::ContactModel::contactAdded,
[this, &contactModel](const std::string & contactId) {
auto convModel = LRCInstance::getCurrentConversationModel();
auto currentConversation = Utils::getConversationFromUid(selectedConvUid(),
*convModel);
if (currentConversation == convModel->allFilteredConversations().end()) {
return;
}
if (contactId == contactModel.get()->getContact((*currentConversation).participants.at(0)).profileInfo.uri) {
ui->messageView->clear();
ui->messageView->printHistory(*convModel, currentConversation->interactions);
}
});
} catch (...) {
qWarning() << "CallWidget::slotAccountChanged exception";
}
......@@ -679,7 +652,7 @@ void CallWidget::slotShowIncomingCallView(const std::string& accountId,
auto finalBestId = (bestName != bestId) ? bestId : "";
auto call = callModel->getCall(convInfo.callId);
auto isCallSelected = selectedConvUid() == convInfo.uid;
auto isCallSelected = LRCInstance::getSelectedConvUid() == convInfo.uid;
if (call.isOutgoing) {
if (isCallSelected) {
......@@ -712,22 +685,6 @@ void CallWidget::slotShowIncomingCallView(const std::string& accountId,
ui->messagesWidget->show();
}
// flashing index widget during call
for (int row = 0; row < smartListModel_->rowCount(); row++) {
QModelIndex index = smartListModel_->index(row);
auto indexUid = index.data(SmartListModel::Role::UID).value<QString>().toStdString();
if (indexUid == convInfo.uid) {
auto widget = ui->smartList->indexWidget(index);
if (!widget) {
auto blinkingWidget = new AnimatedOverlay(RingTheme::urgentOrange_);
ui->smartList->setIndexWidget(index, blinkingWidget);
blinkingWidget->show();
} else {
widget->show();
}
}
}
ui->videoWidget->pushRenderer(convInfo.callId);
QFontMetrics primaryCallLabelFontMetrics(ui->callingBestNameLabel->font());
......@@ -751,18 +708,6 @@ void CallWidget::slotShowChatView(const std::string& accountId,
Q_UNUSED(accountId);
Q_UNUSED(convInfo);
for (int row = 0; row < smartListModel_->rowCount(); row++) {
QModelIndex index = smartListModel_->index(row);
auto indexUid = index.data(SmartListModel::Role::UID).value<QString>().toStdString();
if (indexUid == convInfo.uid) {
if (auto widget = ui->smartList->indexWidget(index)) {
widget->hide();
widget->deleteLater();
ui->smartList->setIndexWidget(index, nullptr);
}
}
}
ui->callStackWidget->hide();
showConversationView();
}
......@@ -824,6 +769,7 @@ CallWidget::setSelectedAccount(const std::string& accountId)
LRCInstance::getCurrentConversationModel()->setFilter(accountInfo.profileInfo.type);
updateConversationsFilterWidget();
connectConversationModel();
connectAccount(accountId);
}
void CallWidget::setConversationFilter(lrc::api::profile::Type filter)
......@@ -884,7 +830,7 @@ CallWidget::showIMOutOfCall(const QModelIndex& nodeIdx)
ui->sendContactRequestButton->setVisible(shouldShowSendContactRequestBtn);
auto convModel = LRCInstance::getCurrentConversationModel();
auto currentConversation = Utils::getConversationFromUid(selectedConvUid(),
auto currentConversation = Utils::getConversationFromUid(LRCInstance::getSelectedConvUid(),
*convModel);
ui->messageView->clear();
ui->messageView->printHistory(*convModel, currentConversation->interactions, true);
......@@ -905,7 +851,7 @@ CallWidget::showIMOutOfCall(const QModelIndex& nodeIdx)
accInfo->contactModel->getContactProfileId(contactUri),
contact.profileInfo.avatar);
} else {
auto avatar = Utils::conversationPhoto(selectedConvUid(), *accInfo);
auto avatar = Utils::conversationPhoto(LRCInstance::getSelectedConvUid(), *accInfo);
QByteArray ba;
QBuffer bu(&ba);
avatar.save(&bu, "PNG");
......@@ -962,7 +908,7 @@ CallWidget::on_shareButton_clicked()
void
CallWidget::on_sendContactRequestButton_clicked()
{
LRCInstance::getCurrentConversationModel()->makePermanent(selectedConvUid());
LRCInstance::getCurrentConversationModel()->makePermanent(LRCInstance::getSelectedConvUid());
ui->sendContactRequestButton->hide();
}
......@@ -1005,7 +951,7 @@ CallWidget::connectConversationModel()
currentConversationModel, &lrc::api::ConversationModel::modelSorted,
[this]() {
updateConversationsFilterWidget();
selectSmartlistItem(selectedConvUid());
selectSmartlistItem(LRCInstance::getSelectedConvUid());
ui->smartList->update();
}
);
......@@ -1044,7 +990,7 @@ CallWidget::connectConversationModel()
ui->messageView->clear();
// if currently selected,
// switch to welcome screen (deselecting current smartlist item )
if (convUid != selectedConvUid()) {
if (convUid != LRCInstance::getSelectedConvUid()) {
return;
}
backToWelcomePage();
......@@ -1053,7 +999,7 @@ CallWidget::connectConversationModel()
interactionStatusUpdatedConnection_ = QObject::connect(
currentConversationModel, &lrc::api::ConversationModel::interactionStatusUpdated,
[this](const std::string& convUid, uint64_t interactionId, const lrc::api::interaction::Info& interaction) {
if (convUid != selectedConvUid()) {
if (convUid != LRCInstance::getSelectedConvUid()) {
return;
}
auto& currentAccountInfo = LRCInstance::getCurrentAccountInfo();
......@@ -1070,7 +1016,7 @@ CallWidget::connectConversationModel()
if (interaction.type == lrc::api::interaction::Type::CALL) {
return;
}
if (convUid == selectedConvUid()) {
if (convUid == LRCInstance::getSelectedConvUid()) {
ui->videoWidget->simulateShowChatview(true);
}
}
......@@ -1091,7 +1037,7 @@ CallWidget::connectConversationModel()
void
CallWidget::updateConversationView(const std::string& convUid)
{
if (convUid != selectedConvUid()) {
if (convUid != LRCInstance::getSelectedConvUid()) {
return;
}
}
......@@ -1109,7 +1055,7 @@ CallWidget::selectConversation(const QModelIndex& index)
if (selectConversation(item, *currentConversationModel)) {
showIMOutOfCall(index);
auto convUid = selectedConvUid();
auto convUid = LRCInstance::getSelectedConvUid();
if (!lastConvUid_.compare(convUid)) {
return;
}
......@@ -1131,7 +1077,7 @@ bool
CallWidget::selectConversation( const lrc::api::conversation::Info& item,
lrc::api::ConversationModel& convModel)
{
if (selectedConvUid() == item.uid) {
if (LRCInstance::getSelectedConvUid() == item.uid) {
return false;
} else if (item.participants.size() > 0) {
convModel.selectConversation(item.uid);
......@@ -1166,7 +1112,7 @@ CallWidget::updateConversationForNewContact(const std::string& convUid)
return;
}
ui->ringContactLineEdit->setText("");
auto selectedUid = selectedConvUid();
auto selectedUid = LRCInstance::getSelectedConvUid();
auto it = Utils::getConversationFromUid(convUid, *convModel);
if (it != convModel->allFilteredConversations().end()) {
try {
......@@ -1184,10 +1130,13 @@ CallWidget::updateConversationForNewContact(const std::string& convUid)
void
CallWidget::updateSmartList()
{
auto& currentAccountInfo = LRCInstance::getCurrentAccountInfo();
smartListModel_.reset(new SmartListModel(currentAccountInfo, this));
ui->smartList->setModel(smartListModel_.get());
ui->smartList->setItemDelegate(new ConversationItemDelegate());
if (!ui->smartList->model()) {
smartListModel_.reset(new SmartListModel(LRCInstance::getCurrAccId(), this));
ui->smartList->setModel(smartListModel_.get());
ui->smartList->setItemDelegate(new ConversationItemDelegate());
} else {
smartListModel_->setAccount(LRCInstance::getCurrAccId());
}
// smartlist selection
QObject::disconnect(smartlistSelectionConnection_);
......@@ -1211,3 +1160,45 @@ CallWidget::update()
updateComboBox();
connectConversationModel();
}
void
CallWidget::connectAccount(const std::string& accId)
{
auto callModel = LRCInstance::accountModel().getAccountInfo(accId).callModel.get();
disconnect(callStatusChangedConnection_);
callStatusChangedConnection_ = QObject::connect(callModel, &lrc::api::NewCallModel::callStatusChanged,
[this, accId](const std::string& callId) {
auto callModel = LRCInstance::accountModel().getAccountInfo(accId).callModel.get();
auto call = callModel->getCall(callId);
switch (call.status) {
case lrc::api::call::Status::INVALID:
case lrc::api::call::Status::INACTIVE:
case lrc::api::call::Status::ENDED:
case lrc::api::call::Status::PEER_BUSY:
case lrc::api::call::Status::TIMEOUT:
case lrc::api::call::Status::TERMINATING:
{
ui->callStackWidget->hide();
showConversationView();
break;
}
default:
break;
}
});
auto& contactModel = LRCInstance::getCurrentAccountInfo().contactModel;
disconnect(contactAddedConnection_);
contactAddedConnection_ = connect(contactModel.get(), &lrc::api::ContactModel::contactAdded,
[this, &contactModel](const std::string & contactId) {
auto convModel = LRCInstance::getCurrentConversationModel();
auto currentConversation = Utils::getConversationFromUid(LRCInstance::getSelectedConvUid(),
*convModel);
if (currentConversation == convModel->allFilteredConversations().end()) {
return;
}
if (contactId == contactModel.get()->getContact((*currentConversation).participants.at(0)).profileInfo.uri) {
ui->messageView->clear();
ui->messageView->printHistory(*convModel, currentConversation->interactions);
}
});
}
\ No newline at end of file
......@@ -133,8 +133,7 @@ private:
void setConversationFilter(lrc::api::profile::Type filter);
void updateConversationsFilterWidget();
void updateComboBox();
const std::string& selectedAccountId();
const std::string& selectedConvUid();
void connectAccount(const std::string& accId);
QMenu* menu_;
......@@ -166,5 +165,6 @@ private:
QMetaObject::Connection smartlistSelectionConnection_;
QMetaObject::Connection interactionRemovedConnection_;
QMetaObject::Connection contactAddedConnection_;
QMetaObject::Connection callStatusChangedConnection_;
};
......@@ -381,6 +381,12 @@
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<attribute name="headerDefaultSectionSize">
<number>0</number>
</attribute>
<attribute name="headerMinimumSectionSize">
<number>0</number>
</attribute>
</widget>
</item>
</layout>
......
......@@ -62,9 +62,15 @@ ConversationItemDelegate::paint(QPainter* painter
// menu is open
auto rowHighlight = highlightMap_.find(index.row());
if (selected) {
painter->fillRect(option.rect, RingTheme::smartlistSelection_);
painter->fillRect(option.rect, RingTheme::smartlistSelection_);
} else if (rowHighlight != highlightMap_.end() && (*rowHighlight).second) {
painter->fillRect(option.rect, RingTheme::smartlistHighlight_);
painter->fillRect(option.rect, RingTheme::smartlistHighlight_);
}
auto convUid = index.data(static_cast<int>(SmartListModel::Role::UID)).value<QString>().toStdString();
auto conversation = Utils::getConversationFromUid(convUid, *LRCInstance::getCurrentConversationModel());
if (LRCInstance::getCurrentCallModel()->hasCall(conversation->callId)) {
auto color = QColor(RingTheme::blue_.lighter(180)); color.setAlpha(128);
painter->fillRect(option.rect, color);
}
QRect &rect = opt.rect;
......
......@@ -30,17 +30,19 @@
// Client
#include "pixbufmanipulator.h"
#include "utils.h"
#include "lrcinstance.h"
SmartListModel::SmartListModel(const lrc::api::account::Info &acc, QObject *parent)
SmartListModel::SmartListModel(const std::string& accId, QObject *parent)
: QAbstractItemModel(parent),
acc_(acc)
accId_(accId)
{
}
int SmartListModel::rowCount(const QModelIndex &parent) const
{
if (!parent.isValid()) {
return acc_.conversationModel->allFilteredConversations().size();
auto& accInfo = LRCInstance::accountModel().getAccountInfo(accId_);
return accInfo.conversationModel->allFilteredConversations().size();
}
return 0; // A valid QModelIndex returns 0 as no entry has sub-elements
}
......@@ -57,32 +59,33 @@ QVariant SmartListModel::data(const QModelIndex &index, int role) const
return QVariant();
}
const auto& item = acc_.conversationModel->filteredConversation(index.row());
auto& accInfo = LRCInstance::accountModel().getAccountInfo(accId_);
const auto& item = accInfo.conversationModel->filteredConversation(index.row());
if (item.participants.size() > 0) {
try {
switch (role) {
case Role::Picture:
case Qt::DecorationRole:
return GlobalInstances::pixmapManipulator().decorationRole(item, acc_);
return GlobalInstances::pixmapManipulator().decorationRole(item, accInfo);
case Role::DisplayName:
case Qt::DisplayRole:
{
auto& contact = acc_.contactModel->getContact(item.participants[0]);
auto& contact = accInfo.contactModel->getContact(item.participants[0]);
return QVariant(QString::fromStdString(Utils::bestNameForContact(contact)));
}
case Role::DisplayID:
{
auto& contact = acc_.contactModel->getContact(item.participants[0]);
auto& contact = accInfo.contactModel->getContact(item.participants[0]);
return QVariant(QString::fromStdString(Utils::bestIdForContact(contact)));
}
case Role::Presence:
{
auto& contact = acc_.contactModel->getContact(item.participants[0]);
auto& contact = accInfo.contactModel->getContact(item.participants[0]);
return QVariant(contact.isPresent);
}
case Role::URI:
{
auto& contact = acc_.contactModel->getContact(item.participants[0]);
auto& contact = accInfo.contactModel->getContact(item.participants[0]);
return QVariant(QString::fromStdString(contact.profileInfo.uri));
}
case Role::UnreadMessagesCount:
......@@ -98,7 +101,7 @@ QVariant SmartListModel::data(const QModelIndex &index, int role) const
return QVariant(Utils::toUnderlyingValue(item.interactions.at(item.lastMessageUid).type));
case Role::ContactType:
{
auto& contact = acc_.contactModel->getContact(item.participants[0]);
auto& contact = accInfo.contactModel->getContact(item.participants[0]);
return QVariant(Utils::toUnderlyingValue(contact.profileInfo.type));
}
case Role::UID:
......@@ -144,3 +147,9 @@ Qt::ItemFlags SmartListModel::flags(const QModelIndex &index) const
}
return flags;
}
void
SmartListModel::setAccount(const std::string& accId)
{
accId_ = accId;
}
......@@ -51,7 +51,7 @@ public:
ContextMenuOpen
};
explicit SmartListModel(const lrc::api::account::Info& acc, QObject *parent = 0);
explicit SmartListModel(const std::string& accId, QObject *parent = 0);
// QAbstractItemModel
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
......@@ -61,9 +61,11 @@ public:
QModelIndex parent(const QModelIndex &child) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
void setAccount(const std::string& accId);
// hack for context menu highlight retention
bool isContextMenuOpen{ false };
private:
const AccountInfo& acc_;
std::string accId_;
};
......@@ -42,6 +42,7 @@
#include "pixbufmanipulator.h"
#include "globalsystemtray.h"
#include "lrcinstance.h"
bool
Utils::CreateStartupLink()
......@@ -428,4 +429,18 @@ Utils::generateTintedPixmap(const QString& filename, QColor color)
}
}
return QPixmap::fromImage(tmpImage);
}
std::string
Utils::getConversationFromCallId(const std::string& callId)
{
auto convModel = LRCInstance::getCurrentConversationModel();
auto conversations = convModel->allFilteredConversations();
std::string convUid;
for (auto conversation : conversations) {
if (conversation.callId == callId) {
return conversation.uid;
}
}
return "";
}
\ No newline at end of file
......@@ -78,6 +78,7 @@ namespace Utils
QImage conversationPhoto(const std::string& convUid, const lrc::api::account::Info& accountInfo);
QByteArray QByteArrayFromFile(const QString& filename);
QPixmap generateTintedPixmap(const QString& filename, QColor color);
std::string getConversationFromCallId(const std::string& callId);
template<typename E>
constexpr inline typename std::enable_if< std::is_enum<E>::value,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment