diff --git a/callwidget.cpp b/callwidget.cpp index 53b988c114a46d89ab647cb5f83239846fe05769..aa51bd79cc3eca18c96a2309b817c55dea09851e 100644 --- a/callwidget.cpp +++ b/callwidget.cpp @@ -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(); +} diff --git a/callwidget.h b/callwidget.h index 30541fb1220f9717b252475e451a4720ae802ee6..b39d7c8c127fb7b877c3af3fba10054ab3048e11 100644 --- a/callwidget.h +++ b/callwidget.h @@ -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(); diff --git a/callwidget.ui b/callwidget.ui index 0a4d60b88e0296a9498e5a70f9efac24318b8c8d..5d49054546dd7f20575304ca683159a02fc9bf39 100644 --- a/callwidget.ui +++ b/callwidget.ui @@ -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"> diff --git a/combar.cpp b/combar.cpp index c2a458bcf92a861c5b752cd3a5d22f788c04f386..498ef994bdab0af3e486fb271757be9b94905127 100644 --- a/combar.cpp +++ b/combar.cpp @@ -26,7 +26,6 @@ ComBar::ComBar(QWidget* parent) : ui->setupUi(this); // [jn] these buttons are for further uses - ui->btnchat->hide(); ui->btncontactinfo->hide(); }