blob: 0951222bf45ee52ca609a29fcc4498f5828f5016 [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Edric Milaretbab169d2016-01-07 15:13:33 -05002 * Copyright (C) 2015-2016 by Savoir-faire Linux *
Edric Milaret627500d2015-03-27 16:41:40 -04003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 3 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
17 **************************************************************************/
18
19#include "callwidget.h"
20#include "ui_callwidget.h"
21
Edric Milaret43f3c1e2015-07-16 17:52:47 -040022#include <QClipboard>
23
Edric Milaret53f57b62015-05-11 11:02:17 -040024#include <memory>
Edric Milaret627500d2015-03-27 16:41:40 -040025
Edric Milaret43f3c1e2015-07-16 17:52:47 -040026//ERROR is defined in windows.h
27#include "utils.h"
28#undef ERROR
29
Edric Milaret627500d2015-03-27 16:41:40 -040030#include "audio/settings.h"
31#include "personmodel.h"
Edric Milaret43f3c1e2015-07-16 17:52:47 -040032#include "person.h"
Edric Milaret627500d2015-03-27 16:41:40 -040033#include "fallbackpersoncollection.h"
Edric Milaret67007d12015-05-07 09:40:09 -040034#include "categorizedcontactmodel.h"
Edric Milaret6a642e22015-05-27 15:06:30 -040035#include "localhistorycollection.h"
Edric Milaret1b197eb2015-06-01 15:09:56 -040036#include "media/text.h"
37#include "media/recording.h"
38#include "media/textrecording.h"
Edric Milareted0b2802015-10-01 15:10:02 -040039#include "recentmodel.h"
Edric Milaretab12d022015-12-04 16:09:44 -050040#include "contactmethod.h"
Edric Milareted0b2802015-10-01 15:10:02 -040041
Edric Milaret559bda52015-04-29 17:02:31 -040042#include "wizarddialog.h"
Edric Milaret83b248c2015-06-02 11:42:23 -040043#include "windowscontactbackend.h"
Edric Milaret43f3c1e2015-07-16 17:52:47 -040044#include "contactpicker.h"
Edric Milaret2afd2bf2015-07-21 17:12:25 -040045#include "contactmethodpicker.h"
Edric Milaret2cf34292015-06-22 16:27:03 -040046#include "globalsystemtray.h"
Edric Milareted0b2802015-10-01 15:10:02 -040047#include "historydelegate.h"
48#include "contactdelegate.h"
49#include "smartlistdelegate.h"
Edric Milaretab12d022015-12-04 16:09:44 -050050#include "imdelegate.h"
Edric Milaret627500d2015-03-27 16:41:40 -040051
Nicolas Jager97a21b42015-12-03 16:55:45 -050052CallWidget::CallWidget(QWidget* parent) :
Edric Milareted0b2802015-10-01 15:10:02 -040053 NavWidget(END ,parent),
Edric Milaret7d40a4a2015-05-13 13:01:15 -040054 ui(new Ui::CallWidget),
Edric Milaretab12d022015-12-04 16:09:44 -050055 menu_(new QMenu()),
56 imDelegate_(new ImDelegate())
Edric Milaret627500d2015-03-27 16:41:40 -040057{
Nicolas Jager97a21b42015-12-03 16:55:45 -050058 setMouseTracking(true);
59
Edric Milaret627500d2015-03-27 16:41:40 -040060 ui->setupUi(this);
61
Nicolas Jager97a21b42015-12-03 16:55:45 -050062 // TODO : add this in style sheet forms
63 QPalette palette;
64 palette.setColor(QPalette::WindowText, QColor(255,255,255));
65 ui->callerIdLabel->setPalette(palette);
66
67 QPalette palette2;
68 palette2.setColor(QPalette::WindowText, QColor(141,141,141));
69
70 ui->wantToTalkLabel->setPalette(palette2);
71 ui->outboundCallLabel->setPalette(palette2);
72 ui->cancelCallLabel->setPalette(palette2);
73 ui->acceptLabel->setPalette(palette2);
74 ui->refuseLabel->setPalette(palette2);
75
76 QFont font = ui->callerIdLabel->font();
77 font.setPointSize(20);
78
79 ui->callerIdLabel->setFont(font);
80 // end of TODO : add this in style sheet forms
81
Edric Milaret627500d2015-03-27 16:41:40 -040082 ui->callInvite->setVisible(false);
83
Edric Milaret6456baa2015-05-21 12:18:07 -040084 setActualCall(nullptr);
Edric Milaret627500d2015-03-27 16:41:40 -040085 videoRenderer_ = nullptr;
86
Edric Milaret3aca8e32015-06-12 10:01:40 -040087 connect(ui->videoWidget, SIGNAL(setChatVisibility(bool)),
88 ui->instantMessagingWidget, SLOT(setVisible(bool)));
89
Edric Milareted0b2802015-10-01 15:10:02 -040090 QPixmap logo(":/images/logo-ring-standard-coul.png");
91 ui->ringLogo->setPixmap(logo.scaledToHeight(100, Qt::SmoothTransformation));
92 ui->ringLogo->setAlignment(Qt::AlignHCenter);
93
Edric Milaret627500d2015-03-27 16:41:40 -040094 try {
Edric Milareta3e47282015-10-23 15:20:30 -040095 callModel_ = &CallModel::instance();
Edric Milaret627500d2015-03-27 16:41:40 -040096
97 connect(callModel_, SIGNAL(incomingCall(Call*)),
98 this, SLOT(callIncoming(Call*)));
99 connect(callModel_, SIGNAL(callAdded(Call*,Call*)),
100 this, SLOT(addedCall(Call*, Call*)));
101 connect(callModel_, SIGNAL(callStateChanged(Call*, Call::State)),
102 this, SLOT(callStateChanged(Call*, Call::State)));
103
Edric Milareta3e47282015-10-23 15:20:30 -0400104 connect(&AccountModel::instance()
Edric Milaret67007d12015-05-07 09:40:09 -0400105 , SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>))
106 , this
107 , SLOT(findRingAccount(QModelIndex, QModelIndex, QVector<int>)));
108
Edric Milareta3e47282015-10-23 15:20:30 -0400109 ui->smartList->setModel(RecentModel::instance().peopleProxy());
Edric Milareted0b2802015-10-01 15:10:02 -0400110 connect(ui->smartList->selectionModel(),
111 SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
112 this,
113 SLOT(smartListSelectionChanged(QItemSelection,QItemSelection)));
Nicolas Jager97a21b42015-12-03 16:55:45 -0500114
115 connect(ui->smartList, &QTreeView::entered, this, &CallWidget::on_entered);
116
Edric Milareted0b2802015-10-01 15:10:02 -0400117 smartListDelegate_ = new SmartListDelegate();
Nicolas Jager97a21b42015-12-03 16:55:45 -0500118 ui->smartList->setSmartListItemDelegate(smartListDelegate_);
Edric Milaret627500d2015-03-27 16:41:40 -0400119
Edric Milareta3e47282015-10-23 15:20:30 -0400120 PersonModel::instance().
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400121 addCollection<WindowsContactBackend>(LoadOptions::FORCE_ENABLED);
122
Edric Milareta3e47282015-10-23 15:20:30 -0400123 CategorizedContactModel::instance().setSortAlphabetical(false);
124 CategorizedContactModel::instance().setUnreachableHidden(true);
125 ui->contactView->setModel(&CategorizedContactModel::instance());
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400126 contactDelegate_ = new ContactDelegate();
127 ui->contactView->setItemDelegate(contactDelegate_);
128
Edric Milareta3e47282015-10-23 15:20:30 -0400129 CategorizedHistoryModel::instance().
Edric Milaret6a642e22015-05-27 15:06:30 -0400130 addCollection<LocalHistoryCollection>(LoadOptions::FORCE_ENABLED);
Edric Milaret627500d2015-03-27 16:41:40 -0400131
Edric Milareta3e47282015-10-23 15:20:30 -0400132 ui->historyList->setModel(CategorizedHistoryModel::SortedProxy::instance().model());
133 CategorizedHistoryModel::SortedProxy::instance().model()->sort(0, Qt::DescendingOrder);
Edric Milaret53f57b62015-05-11 11:02:17 -0400134 ui->historyList->setHeaderHidden(true);
Edric Milaret01f23842015-06-22 14:46:01 -0400135 historyDelegate_ = new HistoryDelegate();
136 ui->historyList->setItemDelegate(historyDelegate_);
Edric Milaret77dd6982015-07-07 16:45:41 -0400137
Edric Milareta3e47282015-10-23 15:20:30 -0400138 connect(CategorizedHistoryModel::SortedProxy::instance().model(), &QSortFilterProxyModel::layoutChanged, [=]() {
139 auto idx = CategorizedHistoryModel::SortedProxy::instance().model()->index(0,0);
Edric Milaret77dd6982015-07-07 16:45:41 -0400140 if (idx.isValid())
141 ui->historyList->setExpanded(idx, true);
142 });
143
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400144 ui->historyList->setContextMenuPolicy(Qt::CustomContextMenu);
145 connect(ui->historyList, &QListView::customContextMenuRequested, [=](const QPoint& pos){
146 if (ui->historyList->currentIndex().parent().isValid()) {
147 QPoint globalPos = ui->historyList->mapToGlobal(pos);
148 QMenu menu;
149
150 ContactMethod* contactMethod = ui->historyList->currentIndex()
151 .data(static_cast<int>(Call::Role::ContactMethod)).value<ContactMethod*>();
152
Edric Milaret53ac6e52015-09-14 13:37:06 -0400153 auto copyAction = new QAction(tr("Copy number"), this);
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400154 menu.addAction(copyAction);
155 connect(copyAction, &QAction::triggered, [=]() {
156 QApplication::clipboard()->setText(contactMethod->uri());
157 });
Edric Milaretbe0aa5a2015-07-31 15:08:39 -0400158 if (not contactMethod->contact() || contactMethod->contact()->isPlaceHolder()) {
Edric Milaret53ac6e52015-09-14 13:37:06 -0400159 auto addExisting = new QAction(tr("Add to contact"), this);
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400160 menu.addAction(addExisting);
161 connect(addExisting, &QAction::triggered, [=]() {
Edric Milaretbe0aa5a2015-07-31 15:08:39 -0400162 ContactPicker contactPicker(contactMethod);
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400163 contactPicker.move(globalPos.x(), globalPos.y() - (contactPicker.height()/2));
Edric Milaretbe0aa5a2015-07-31 15:08:39 -0400164 contactPicker.exec();
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400165 });
166 }
167 menu.exec(globalPos);
168 }
169 });
Edric Milaret53f57b62015-05-11 11:02:17 -0400170
Edric Milaret627500d2015-03-27 16:41:40 -0400171 findRingAccount();
Edric Milaretab12d022015-12-04 16:09:44 -0500172 ui->listMessageView->setItemDelegate(imDelegate_);
Edric Milaret627500d2015-03-27 16:41:40 -0400173
Edric Milaret80e0b212015-10-16 10:07:43 -0400174 } catch (const std::exception& e) {
175 qDebug() << "INIT ERROR" << e.what();
Edric Milaret627500d2015-03-27 16:41:40 -0400176 }
177}
178
179CallWidget::~CallWidget()
180{
181 delete ui;
Edric Milaretc7ab5502015-06-15 11:18:02 -0400182 delete menu_;
Edric Milaret01f23842015-06-22 14:46:01 -0400183 delete contactDelegate_;
Edric Milaretab12d022015-12-04 16:09:44 -0500184 delete imDelegate_;
Edric Milaret627500d2015-03-27 16:41:40 -0400185}
186
187void
Edric Milaret67007d12015-05-07 09:40:09 -0400188CallWidget::findRingAccount(QModelIndex idx1, QModelIndex idx2, QVector<int> vec)
189{
190 Q_UNUSED(idx1)
191 Q_UNUSED(idx2)
192 Q_UNUSED(vec)
193
Edric Milareta3e47282015-10-23 15:20:30 -0400194 auto a_count = AccountModel::instance().rowCount();
Edric Milaret67007d12015-05-07 09:40:09 -0400195 auto found = false;
196 for (int i = 0; i < a_count; ++i) {
Edric Milareta3e47282015-10-23 15:20:30 -0400197 auto idx = AccountModel::instance().index(i, 0);
Edric Milaret67007d12015-05-07 09:40:09 -0400198 auto protocol = idx.data(static_cast<int>(Account::Role::Proto));
199 if ((Account::Protocol)protocol.toUInt() == Account::Protocol::RING) {
200 auto username = idx.data(static_cast<int>(Account::Role::Username));
Edric Milareted0b2802015-10-01 15:10:02 -0400201 ui->ringIdLabel->setText(username.toString());
Edric Milaret67007d12015-05-07 09:40:09 -0400202 found = true;
203 return;
204 }
205 }
Nicolas Jager97a21b42015-12-03 16:55:45 -0500206 if (not found) {
Edric Milaret53ac6e52015-09-14 13:37:06 -0400207 ui->ringIdLabel->setText(tr("NO RING ACCOUNT FOUND"));
Edric Milaret67007d12015-05-07 09:40:09 -0400208 }
209}
210
211void
212CallWidget::findRingAccount()
213{
Edric Milaret559bda52015-04-29 17:02:31 -0400214
Edric Milareta3e47282015-10-23 15:20:30 -0400215 auto a_count = AccountModel::instance().rowCount();
Edric Milaret627500d2015-03-27 16:41:40 -0400216 auto found = false;
217 for (int i = 0; i < a_count; ++i) {
Edric Milareta3e47282015-10-23 15:20:30 -0400218 auto idx = AccountModel::instance().index(i, 0);
Edric Milaret627500d2015-03-27 16:41:40 -0400219 auto protocol = idx.data(static_cast<int>(Account::Role::Proto));
220 if ((Account::Protocol)protocol.toUInt() == Account::Protocol::RING) {
Edric Milareta3e47282015-10-23 15:20:30 -0400221 auto account = AccountModel::instance().getAccountByModelIndex(idx);
Edric Milaret68779c42015-07-09 16:53:03 -0400222 if (account->displayName().isEmpty())
223 account->displayName() = account->alias();
224 auto username = account->username();
Edric Milareted0b2802015-10-01 15:10:02 -0400225 ui->ringIdLabel->setText(username);
Edric Milaret627500d2015-03-27 16:41:40 -0400226 found = true;
227 return;
228 }
229 }
230 if (!found) {
Edric Milareted0b2802015-10-01 15:10:02 -0400231 ui->ringIdLabel->setText(tr("NO RING ACCOUNT FOUND"));
Edric Milaret559bda52015-04-29 17:02:31 -0400232 WizardDialog *wizardDialog = new WizardDialog();
233 wizardDialog->exec();
234 delete wizardDialog;
Edric Milaret627500d2015-03-27 16:41:40 -0400235 }
236}
237
238void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500239CallWidget::callIncoming(Call* call)
Edric Milaret627500d2015-03-27 16:41:40 -0400240{
Nicolas Jager97a21b42015-12-03 16:55:45 -0500241 ui->outboundCall->hide();
242
Edric Milaret2cf34292015-06-22 16:27:03 -0400243 if (!QApplication::activeWindow()) {
244 GlobalSystemTray::instance().showMessage("Ring", "Call incoming from " + call->formattedName());
245 QApplication::alert(this, 5000);
246 }
247
Edric Milaret435cdfc2015-06-01 16:15:50 -0400248 if (!call->account()->isAutoAnswer()) {
Nicolas Jager97a21b42015-12-03 16:55:45 -0500249 ui->callerIdLabel->setText(QString(tr("%1", "%1 is the name of the caller"))
Edric Milaret1a9495d2015-09-18 10:11:32 -0400250 .arg(call->formattedName()));
Edric Milareted0b2802015-10-01 15:10:02 -0400251 ui->stackedWidget->setCurrentWidget(ui->callInvitePage);
Edric Milaret627500d2015-03-27 16:41:40 -0400252 ui->callInvite->setVisible(true);
Edric Milaret435cdfc2015-06-01 16:15:50 -0400253 ui->callInvite->raise();
254 }
Edric Milaret6456baa2015-05-21 12:18:07 -0400255 setActualCall(call);
Edric Milaret627500d2015-03-27 16:41:40 -0400256}
257
258void
259CallWidget::on_acceptButton_clicked()
260{
261 if (actualCall_ != nullptr)
Edric Milaret53f57b62015-05-11 11:02:17 -0400262 actualCall_->performAction(Call::Action::ACCEPT);
Edric Milaret627500d2015-03-27 16:41:40 -0400263 ui->callInvite->setVisible(false);
Edric Milareted0b2802015-10-01 15:10:02 -0400264 ui->stackedWidget->setCurrentWidget(ui->videoPage);
Edric Milaret627500d2015-03-27 16:41:40 -0400265}
266
267void
268CallWidget::on_refuseButton_clicked()
269{
270 if (actualCall_ == nullptr)
271 return;
272 actualCall_->performAction(Call::Action::REFUSE);
Edric Milaret6456baa2015-05-21 12:18:07 -0400273 setActualCall(nullptr);
Edric Milaret627500d2015-03-27 16:41:40 -0400274 ui->callInvite->setVisible(false);
Edric Milareted0b2802015-10-01 15:10:02 -0400275 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Edric Milaret627500d2015-03-27 16:41:40 -0400276}
277
278void
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400279CallWidget::addedCall(Call* call, Call* parent)
280{
Edric Milaret627500d2015-03-27 16:41:40 -0400281 Q_UNUSED(parent);
282 if (call->direction() == Call::Direction::OUTGOING) {
Edric Milaret6456baa2015-05-21 12:18:07 -0400283 setActualCall(call);
Edric Milareted0b2802015-10-01 15:10:02 -0400284 ui->stackedWidget->setCurrentWidget(ui->callInvitePage);
Edric Milaret627500d2015-03-27 16:41:40 -0400285 }
286}
287
288void
Edric Milaret67007d12015-05-07 09:40:09 -0400289CallWidget::callStateChanged(Call* call, Call::State previousState)
290{
Edric Milaret627500d2015-03-27 16:41:40 -0400291 Q_UNUSED(previousState)
Edric Milaretb5b49072015-05-08 11:56:07 -0400292 if (call == nullptr)
293 return;
Edric Milareted0b2802015-10-01 15:10:02 -0400294
Edric Milaretc7ab5502015-06-15 11:18:02 -0400295 if (call->state() == Call::State::OVER
296 || call->state() == Call::State::ERROR
297 || call->state() == Call::State::FAILURE
298 || call->state() == Call::State::ABORTED) {
Edric Milaret6456baa2015-05-21 12:18:07 -0400299 setActualCall(nullptr);
Edric Milaretc54e2272015-10-01 10:14:00 -0400300 ui->instantMessagingWidget->setMediaText(nullptr);
Edric Milareted0b2802015-10-01 15:10:02 -0400301 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Edric Milareted0b2802015-10-01 15:10:02 -0400302//TODO : Link this so that recentModel get selected correctly
303// auto onHoldCall = callModel_->getActiveCalls().first();
304// if (onHoldCall != nullptr && onHoldCall->state() == Call::State::HOLD) {
305// setActualCall(onHoldCall);
306// onHoldCall->performAction(Call::Action::HOLD);
307// }
Edric Milaret53f57b62015-05-11 11:02:17 -0400308 } else if (call->state() == Call::State::CURRENT) {
Edric Milaretc54e2272015-10-01 10:14:00 -0400309 ui->instantMessagingWidget->setMediaText(actualCall_);
Edric Milareted0b2802015-10-01 15:10:02 -0400310 ui->stackedWidget->setCurrentWidget(ui->videoPage);
Edric Milaret627500d2015-03-27 16:41:40 -0400311 }
Edric Milaret627500d2015-03-27 16:41:40 -0400312}
313
314void
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400315CallWidget::atExit()
316{
Edric Milaret627500d2015-03-27 16:41:40 -0400317}
Edric Milaret67007d12015-05-07 09:40:09 -0400318
319void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500320CallWidget::on_contactView_doubleClicked(const QModelIndex& index)
Edric Milaret67007d12015-05-07 09:40:09 -0400321{
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400322 if (not index.isValid())
323 return;
324
Edric Milaret2afd2bf2015-07-21 17:12:25 -0400325 ContactMethod* uri = nullptr;
Edric Milaret67007d12015-05-07 09:40:09 -0400326
Edric Milaret7d40a4a2015-05-13 13:01:15 -0400327 auto var = index.child(0,0).data(
328 static_cast<int>(Person::Role::Object));
329 if (var.isValid()) {
330 Person* person = var.value<Person*>();
Edric Milaret2afd2bf2015-07-21 17:12:25 -0400331 if (person->phoneNumbers().size() == 1) {
332 uri = person->phoneNumbers().at(0);
333 } else if (person->phoneNumbers().size() > 1) {
334 ContactMethodPicker dlg(person->phoneNumbers());
335 auto pos = QCursor::pos();
336 dlg.move(pos.x(), pos.y());
337 if (dlg.exec())
338 uri = dlg.getSelected();
339 }
340 if (uri) {
Edric Milareta3e47282015-10-23 15:20:30 -0400341 auto outCall = CallModel::instance().dialingCall(uri);
Edric Milaret2afd2bf2015-07-21 17:12:25 -0400342 outCall->performAction(Call::Action::ACCEPT);
Edric Milareted0b2802015-10-01 15:10:02 -0400343 ui->mainTabMenu->setCurrentIndex(0);
344 ui->smartList->setFocus();
Edric Milaret67007d12015-05-07 09:40:09 -0400345 }
346 }
Edric Milaret67007d12015-05-07 09:40:09 -0400347}
Edric Milaret53f57b62015-05-11 11:02:17 -0400348
Edric Milaret6456baa2015-05-21 12:18:07 -0400349void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500350CallWidget::on_historyList_doubleClicked(const QModelIndex& index)
Edric Milaret53f57b62015-05-11 11:02:17 -0400351{
Edric Milaret12353822015-05-14 14:41:09 -0400352 if (not index.isValid())
353 return;
354
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400355 auto number = index.data(static_cast<int>(Call::Role::ContactMethod)).value<ContactMethod*>();
356 if (number) {
Edric Milareta3e47282015-10-23 15:20:30 -0400357 auto outCall = CallModel::instance().dialingCall(number);
Edric Milaret53f57b62015-05-11 11:02:17 -0400358 outCall->performAction(Call::Action::ACCEPT);
Edric Milareted0b2802015-10-01 15:10:02 -0400359 ui->mainTabMenu->setCurrentIndex(0);
360 ui->smartList->setFocus();
Edric Milaret53f57b62015-05-11 11:02:17 -0400361 }
362}
Edric Milaret6456baa2015-05-21 12:18:07 -0400363
364void
365CallWidget::setActualCall(Call* value)
366{
367 actualCall_ = value;
Edric Milaret80e0b212015-10-16 10:07:43 -0400368 CallModel::instance().selectCall(value);
369 ui->videoWidget->pushRenderer(value);
Edric Milaret6456baa2015-05-21 12:18:07 -0400370}
Edric Milaretc7ab5502015-06-15 11:18:02 -0400371
372void
Edric Milareted0b2802015-10-01 15:10:02 -0400373CallWidget::on_cancelButton_clicked()
Edric Milaretd8528fa2015-07-07 14:13:51 -0400374{
375 if (actualCall_)
376 actualCall_->performAction(Call::Action::REFUSE);
377}
Edric Milareted0b2802015-10-01 15:10:02 -0400378
379void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500380CallWidget::on_smartList_doubleClicked(const QModelIndex& index)
Edric Milareted0b2802015-10-01 15:10:02 -0400381{
Edric Milareta3e47282015-10-23 15:20:30 -0400382 auto realIndex = RecentModel::instance().peopleProxy()->mapToSource(index);
383 if (RecentModel::instance().hasActiveCall(realIndex))
Edric Milareted0b2802015-10-01 15:10:02 -0400384 return;
385
386 ContactMethod* m = nullptr;
387 if (auto cm = realIndex.data((int)Call::Role::ContactMethod).value<ContactMethod*>()) {
388 m = cm;
389 } else {
390 if (auto person = realIndex.data((int)Person::Role::Object).value<Person*>()) {
391 m = person->phoneNumbers().first();
392 }
393 }
Edric Milareta3e47282015-10-23 15:20:30 -0400394 if (m && !RecentModel::instance().index(0, 0, realIndex).isValid()) {
395 Call* c = CallModel::instance().dialingCall(m);
Edric Milareted0b2802015-10-01 15:10:02 -0400396 c->performAction(Call::Action::ACCEPT);
397 }
398}
399
400void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500401CallWidget::smartListSelectionChanged(const QItemSelection& newSel, const QItemSelection& oldSel) {
Edric Milareted0b2802015-10-01 15:10:02 -0400402
403 Q_UNUSED(oldSel)
404
Edric Milaretab12d022015-12-04 16:09:44 -0500405 if (newSel.indexes().empty())
406 {
407 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
408 return;
409 }
Edric Milareted0b2802015-10-01 15:10:02 -0400410 auto newIdx = newSel.indexes().first();
Edric Milaret80e0b212015-10-16 10:07:43 -0400411 if (not newIdx.isValid())
Edric Milareted0b2802015-10-01 15:10:02 -0400412 return;
413
Edric Milaretab12d022015-12-04 16:09:44 -0500414 auto nodeIdx = RecentModel::instance().peopleProxy()->mapToSource(newIdx);
415 auto newIdxCall = RecentModel::instance().getActiveCall(nodeIdx);
Edric Milareted0b2802015-10-01 15:10:02 -0400416
417 if (newIdxCall == actualCall_)
418 return;
Edric Milareted0b2802015-10-01 15:10:02 -0400419 if (newIdxCall) {
Edric Milareted0b2802015-10-01 15:10:02 -0400420 setActualCall(newIdxCall);
421 ui->stackedWidget->setCurrentWidget(ui->videoPage);
422 } else {
423 setActualCall(nullptr);
424 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
425 }
426}
427
428void
429CallWidget::placeCall()
430{
Nicolas Jager97a21b42015-12-03 16:55:45 -0500431 if (ui->ringContactLineEdit->text().isEmpty())
Edric Milareted0b2802015-10-01 15:10:02 -0400432 return;
Nicolas Jager97a21b42015-12-03 16:55:45 -0500433 Call* c = CallModel::instance().dialingCall(PhoneDirectoryModel::instance().getNumber(ui->ringContactLineEdit->text()));
Edric Milareted0b2802015-10-01 15:10:02 -0400434 c->performAction(Call::Action::ACCEPT);
Nicolas Jager97a21b42015-12-03 16:55:45 -0500435 ui->ringContactLineEdit->clear();
Edric Milareted0b2802015-10-01 15:10:02 -0400436}
437
438void
Edric Milaret33cb4832016-01-08 10:14:14 -0500439CallWidget::settingsButton_clicked()
Edric Milareted0b2802015-10-01 15:10:02 -0400440{
441 emit NavigationRequested(ScreenEnum::ConfScreen);
442}
443
444void
Edric Milaret33cb4832016-01-08 10:14:14 -0500445CallWidget::contactButton_clicked(bool checked)
Edric Milareted0b2802015-10-01 15:10:02 -0400446{
Edric Milareted0b2802015-10-01 15:10:02 -0400447 ui->mainTabMenu->setCurrentIndex(checked ? 1 : 0);
448}
449
450void
Edric Milaret33cb4832016-01-08 10:14:14 -0500451CallWidget::historicButton_clicked(bool checked)
Edric Milareted0b2802015-10-01 15:10:02 -0400452{
Edric Milareted0b2802015-10-01 15:10:02 -0400453 ui->mainTabMenu->setCurrentIndex(checked ? 2 : 0);
454}
Nicolas Jager97a21b42015-12-03 16:55:45 -0500455
456void
457CallWidget::on_ringContactLineEdit_returnPressed()
458{
459 placeCall();
460}
461
462void
463CallWidget::on_btnCall_clicked()
464{
465 placeCall();
466}
467
468void
469CallWidget::on_btnvideo_clicked()
470{
471 if (not highLightedIndex_.isValid())
472 return;
473
474 on_smartList_doubleClicked(highLightedIndex_);
475}
Edric Milaretab12d022015-12-04 16:09:44 -0500476
477void
478CallWidget::on_btnchat_clicked()
479{
480 if (not highLightedIndex_.isValid())
481 return;
482
483 ui->smartList->selectionModel()->select(highLightedIndex_, QItemSelectionModel::ClearAndSelect);
484
485 ui->contactMethodComboBox->clear();
486
487 auto nodeIdx = RecentModel::instance().peopleProxy()->mapToSource(highLightedIndex_);
488 auto cmVector = RecentModel::instance().getContactMethods(nodeIdx);
489 foreach (const ContactMethod* cm, cmVector) {
490 ui->contactMethodComboBox->addItem(cm->uri());
491 }
492
493 ui->stackedWidget->currentWidget() == ui->messagingPage ?
494 ui->stackedWidget->setCurrentWidget(ui->welcomePage) :
495 ui->stackedWidget->setCurrentWidget(ui->messagingPage);
496}
497
498void
499CallWidget::on_sendButton_clicked()
500{
501 if (ui->messageEdit->text().isEmpty())
502 return;
503 auto number = ui->contactMethodComboBox->currentText();
504 if (auto cm = PhoneDirectoryModel::instance().getNumber(number)) {
505 QMap<QString, QString> msg;
506 msg["text/plain"] = ui->messageEdit->text();
507 cm->sendOfflineTextMessage(msg);
508 ui->messageEdit->clear();
509 } else {
510 qWarning() << "Contact Method not found for " << number;
511 }
512}
513
514void
515CallWidget::on_messageEdit_returnPressed()
516{
517 on_sendButton_clicked();
518}
519
520void
521CallWidget::on_contactMethodComboBox_currentIndexChanged(const QString& number)
522{
523 auto cm = PhoneDirectoryModel::instance().getNumber(number);
524 if (auto txtRecording = cm->textRecording()) {
525 ui->listMessageView->setModel(txtRecording->instantMessagingModel());
526 disconnect(imConnection_);
527 imConnection_ = connect(txtRecording,
528 SIGNAL(messageInserted(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)),
529 this,
530 SLOT(slotAccountMessageReceived(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)));
531 ui->listMessageView->scrollToBottom();
532 }
533}
534
535void
536CallWidget::slotAccountMessageReceived(const QMap<QString,QString> message,
537 ContactMethod* cm,
538 Media::Media::Direction dir)
539{
540 Q_UNUSED(message)
541 Q_UNUSED(cm)
542 Q_UNUSED(dir)
543
544 ui->listMessageView->scrollToBottom();
545}