Commit ab12d02e authored by Edric Milaret's avatar Edric Milaret Committed by gerrit2

im: add off call instant messaging

- Add a non-designed page for out of call messaging
accesible by a button on smartlist.
- Use a combobox to select the contact method in case
there is more than one.
- Connect to message inserted signal to scroll to bottom
the message view.

Change-Id: I84c99403054fb8a64aecb93b87c7c68c1e34f4ac
Tuleap: #153
parent 79d3f687
......@@ -37,6 +37,7 @@
#include "media/recording.h"
#include "media/textrecording.h"
#include "recentmodel.h"
#include "contactmethod.h"
#include "wizarddialog.h"
#include "windowscontactbackend.h"
......@@ -46,11 +47,13 @@
#include "historydelegate.h"
#include "contactdelegate.h"
#include "smartlistdelegate.h"
#include "imdelegate.h"
CallWidget::CallWidget(QWidget* parent) :
NavWidget(END ,parent),
ui(new Ui::CallWidget),
menu_(new QMenu())
menu_(new QMenu()),
imDelegate_(new ImDelegate())
{
setMouseTracking(true);
......@@ -166,6 +169,7 @@ CallWidget::CallWidget(QWidget* parent) :
});
findRingAccount();
ui->listMessageView->setItemDelegate(imDelegate_);
} catch (const std::exception& e) {
qDebug() << "INIT ERROR" << e.what();
......@@ -177,6 +181,7 @@ CallWidget::~CallWidget()
delete ui;
delete menu_;
delete contactDelegate_;
delete imDelegate_;
}
void
......@@ -397,11 +402,17 @@ CallWidget::smartListSelectionChanged(const QItemSelection& newSel, const QItemS
Q_UNUSED(oldSel)
if (newSel.indexes().empty())
{
ui->stackedWidget->setCurrentWidget(ui->welcomePage);
return;
}
auto newIdx = newSel.indexes().first();
if (not newIdx.isValid())
return;
auto newIdxCall = RecentModel::instance().getActiveCall(RecentModel::instance().peopleProxy()->mapToSource(newIdx));
auto nodeIdx = RecentModel::instance().peopleProxy()->mapToSource(newIdx);
auto newIdxCall = RecentModel::instance().getActiveCall(nodeIdx);
if (newIdxCall == actualCall_)
return;
......@@ -462,3 +473,73 @@ CallWidget::on_btnvideo_clicked()
on_smartList_doubleClicked(highLightedIndex_);
}
void
CallWidget::on_btnchat_clicked()
{
if (not highLightedIndex_.isValid())
return;
ui->smartList->selectionModel()->select(highLightedIndex_, QItemSelectionModel::ClearAndSelect);
ui->contactMethodComboBox->clear();
auto nodeIdx = RecentModel::instance().peopleProxy()->mapToSource(highLightedIndex_);
auto cmVector = RecentModel::instance().getContactMethods(nodeIdx);
foreach (const ContactMethod* cm, cmVector) {
ui->contactMethodComboBox->addItem(cm->uri());
}
ui->stackedWidget->currentWidget() == ui->messagingPage ?
ui->stackedWidget->setCurrentWidget(ui->welcomePage) :
ui->stackedWidget->setCurrentWidget(ui->messagingPage);
}
void
CallWidget::on_sendButton_clicked()
{
if (ui->messageEdit->text().isEmpty())
return;
auto number = ui->contactMethodComboBox->currentText();
if (auto cm = PhoneDirectoryModel::instance().getNumber(number)) {
QMap<QString, QString> msg;
msg["text/plain"] = ui->messageEdit->text();
cm->sendOfflineTextMessage(msg);
ui->messageEdit->clear();
} else {
qWarning() << "Contact Method not found for " << number;
}
}
void
CallWidget::on_messageEdit_returnPressed()
{
on_sendButton_clicked();
}
void
CallWidget::on_contactMethodComboBox_currentIndexChanged(const QString& number)
{
auto cm = PhoneDirectoryModel::instance().getNumber(number);
if (auto txtRecording = cm->textRecording()) {
ui->listMessageView->setModel(txtRecording->instantMessagingModel());
disconnect(imConnection_);
imConnection_ = connect(txtRecording,
SIGNAL(messageInserted(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)),
this,
SLOT(slotAccountMessageReceived(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)));
ui->listMessageView->scrollToBottom();
}
}
void
CallWidget::slotAccountMessageReceived(const QMap<QString,QString> message,
ContactMethod* cm,
Media::Media::Direction dir)
{
Q_UNUSED(message)
Q_UNUSED(cm)
Q_UNUSED(dir)
ui->listMessageView->scrollToBottom();
}
......@@ -37,6 +37,7 @@
class ContactDelegate;
class HistoryDelegate;
class SmartListDelegate;
class ImDelegate;
namespace Ui {
class CallWidget;
......@@ -59,6 +60,7 @@ public slots:
void on_ringContactLineEdit_returnPressed();
void on_btnCall_clicked();
void on_btnvideo_clicked();
void on_btnchat_clicked();
inline void on_entered(const QModelIndex& i){highLightedIndex_ = i;};
//UI SLOTS
......@@ -69,6 +71,9 @@ private slots:
void on_cancelButton_clicked();
void on_smartList_doubleClicked(const QModelIndex& index);
void on_historyList_doubleClicked(const QModelIndex& index);
void on_sendButton_clicked();
void on_messageEdit_returnPressed();
void on_contactMethodComboBox_currentIndexChanged(const QString& number);
private slots:
void callIncoming(Call* call);
......@@ -76,6 +81,7 @@ private slots:
void callStateChanged(Call* call, Call::State previousState);
void findRingAccount(QModelIndex idx1, QModelIndex idx2, QVector<int> vec);
void smartListSelectionChanged(const QItemSelection& newSel, const QItemSelection& oldSel);
void slotAccountMessageReceived(const QMap<QString,QString> message,ContactMethod* cm,Media::Media::Direction dir);
private:
Ui::CallWidget* ui;
......@@ -89,6 +95,8 @@ private:
HistoryDelegate* historyDelegate_;
SmartListDelegate* smartListDelegate_;
QModelIndex highLightedIndex_;
ImDelegate* imDelegate_;
QMetaObject::Connection imConnection_;
private:
void findRingAccount();
......
......@@ -261,6 +261,46 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="messagingPage">
<layout class="QVBoxLayout" name="verticalLayout_11">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QListView" name="listMessageView">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="contactMethodComboBox"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLineEdit" name="messageEdit"/>
</item>
<item>
<widget class="QPushButton" name="sendButton">
<property name="text">
<string>Send</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="callInvitePage">
<layout class="QVBoxLayout" name="verticalLayout_9">
<property name="spacing">
......
......@@ -26,7 +26,6 @@ ComBar::ComBar(QWidget* parent) :
ui->setupUi(this);
// [jn] these buttons are for further uses
ui->btnchat->hide();
ui->btncontactinfo->hide();
}
......
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