blob: a22cf5dc418aed3b89b9405f78260f865bd10a27 [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Nicolas Jager45bf7c02016-01-20 09:53:02 -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>
Edric Milaret70ae8782016-04-18 16:10:44 -040023#include <QDesktopServices>
Edric Milaret43f3c1e2015-07-16 17:52:47 -040024
Edric Milaret53f57b62015-05-11 11:02:17 -040025#include <memory>
Edric Milaret627500d2015-03-27 16:41:40 -040026
Edric Milarete19c4cd2016-02-12 10:19:44 -050027#include "qrencode.h"
28
Edric Milaret43f3c1e2015-07-16 17:52:47 -040029//ERROR is defined in windows.h
30#include "utils.h"
31#undef ERROR
Edric Milareta0ebd062016-01-13 12:18:23 -050032#undef interface
Edric Milaret43f3c1e2015-07-16 17:52:47 -040033
Edric Milaret627500d2015-03-27 16:41:40 -040034#include "audio/settings.h"
35#include "personmodel.h"
Edric Milaret43f3c1e2015-07-16 17:52:47 -040036#include "person.h"
Edric Milaret627500d2015-03-27 16:41:40 -040037#include "fallbackpersoncollection.h"
Edric Milaret67007d12015-05-07 09:40:09 -040038#include "categorizedcontactmodel.h"
Edric Milaret6a642e22015-05-27 15:06:30 -040039#include "localhistorycollection.h"
Edric Milaret1b197eb2015-06-01 15:09:56 -040040#include "media/text.h"
41#include "media/recording.h"
Edric Milaret00a32252016-01-19 10:37:13 -050042#include "media/recordingmodel.h"
Edric Milareted0b2802015-10-01 15:10:02 -040043#include "recentmodel.h"
Edric Milaretab12d022015-12-04 16:09:44 -050044#include "contactmethod.h"
Edric Milareta0ebd062016-01-13 12:18:23 -050045#include "globalinstances.h"
Edric Milareted0b2802015-10-01 15:10:02 -040046
Edric Milaret559bda52015-04-29 17:02:31 -040047#include "wizarddialog.h"
Edric Milaret83b248c2015-06-02 11:42:23 -040048#include "windowscontactbackend.h"
Edric Milaret43f3c1e2015-07-16 17:52:47 -040049#include "contactpicker.h"
Edric Milaret2afd2bf2015-07-21 17:12:25 -040050#include "contactmethodpicker.h"
Edric Milaret2cf34292015-06-22 16:27:03 -040051#include "globalsystemtray.h"
Edric Milareted0b2802015-10-01 15:10:02 -040052#include "historydelegate.h"
53#include "contactdelegate.h"
54#include "smartlistdelegate.h"
Edric Milaretab12d022015-12-04 16:09:44 -050055#include "imdelegate.h"
Edric Milareta0ebd062016-01-13 12:18:23 -050056#include "pixbufmanipulator.h"
Edric Milaret70ae8782016-04-18 16:10:44 -040057#include "settingskey.h"
Edric Milaret627500d2015-03-27 16:41:40 -040058
Edric Milaret25236d92016-03-28 09:40:58 -040059#include "profilemodel.h"
60#include "peerprofilecollection.h"
61#include "localprofilecollection.h"
62
Nicolas Jager97a21b42015-12-03 16:55:45 -050063CallWidget::CallWidget(QWidget* parent) :
Nicolas Jager74fe46f2016-02-29 14:55:09 -050064 NavWidget(parent),
Edric Milaret7d40a4a2015-05-13 13:01:15 -040065 ui(new Ui::CallWidget),
Edric Milaretab12d022015-12-04 16:09:44 -050066 menu_(new QMenu()),
67 imDelegate_(new ImDelegate())
Edric Milaret627500d2015-03-27 16:41:40 -040068{
69 ui->setupUi(this);
70
Edric Milaret6b68a482016-02-01 15:23:44 -050071 pageAnim_ = new QPropertyAnimation(ui->welcomePage, "pos", this);
Nicolas Jagerca850292016-01-17 14:11:10 -050072
Edric Milaret6456baa2015-05-21 12:18:07 -040073 setActualCall(nullptr);
Edric Milaret627500d2015-03-27 16:41:40 -040074 videoRenderer_ = nullptr;
75
Nicolas Jager74fe46f2016-02-29 14:55:09 -050076 connect(ui->settingsButton, &QPushButton::clicked, this, &CallWidget::settingsButtonClicked);
77
Edric Milaret3aca8e32015-06-12 10:01:40 -040078 connect(ui->videoWidget, SIGNAL(setChatVisibility(bool)),
79 ui->instantMessagingWidget, SLOT(setVisible(bool)));
80
Edric Milareted0b2802015-10-01 15:10:02 -040081 QPixmap logo(":/images/logo-ring-standard-coul.png");
82 ui->ringLogo->setPixmap(logo.scaledToHeight(100, Qt::SmoothTransformation));
83 ui->ringLogo->setAlignment(Qt::AlignHCenter);
84
Edric Milaret1e598592016-09-02 10:10:01 -040085 ui->qrLabel->hide();
Edric Milarete19c4cd2016-02-12 10:19:44 -050086
Edric Milareta0ebd062016-01-13 12:18:23 -050087 GlobalInstances::setPixmapManipulator(std::unique_ptr<Interfaces::PixbufManipulator>(new Interfaces::PixbufManipulator()));
88
Edric Milaret627500d2015-03-27 16:41:40 -040089 try {
Edric Milareta3e47282015-10-23 15:20:30 -040090 callModel_ = &CallModel::instance();
Edric Milaret627500d2015-03-27 16:41:40 -040091
92 connect(callModel_, SIGNAL(incomingCall(Call*)),
93 this, SLOT(callIncoming(Call*)));
Edric Milaret627500d2015-03-27 16:41:40 -040094 connect(callModel_, SIGNAL(callStateChanged(Call*, Call::State)),
95 this, SLOT(callStateChanged(Call*, Call::State)));
96
Edric Milareta3e47282015-10-23 15:20:30 -040097 connect(&AccountModel::instance()
Edric Milaret67007d12015-05-07 09:40:09 -040098 , SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>))
99 , this
100 , SLOT(findRingAccount(QModelIndex, QModelIndex, QVector<int>)));
101
Edric Milaretfa05d972016-01-13 16:22:04 -0500102 RecentModel::instance().peopleProxy()->setFilterRole(static_cast<int>(Ring::Role::Name));
103 RecentModel::instance().peopleProxy()->setFilterCaseSensitivity(Qt::CaseInsensitive);
Edric Milareta3e47282015-10-23 15:20:30 -0400104 ui->smartList->setModel(RecentModel::instance().peopleProxy());
Edric Milaret6816fd72016-01-29 16:36:24 -0500105
106 smartListDelegate_ = new SmartListDelegate();
107 ui->smartList->setSmartListItemDelegate(smartListDelegate_);
Edric Milaret627500d2015-03-27 16:41:40 -0400108
Edric Milaret25236d92016-03-28 09:40:58 -0400109 PersonModel::instance().addCollection<PeerProfileCollection>(LoadOptions::FORCE_ENABLED);
110 ProfileModel::instance().addCollection<LocalProfileCollection>(LoadOptions::FORCE_ENABLED);
111
Edric Milareta3e47282015-10-23 15:20:30 -0400112 PersonModel::instance().
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400113 addCollection<WindowsContactBackend>(LoadOptions::FORCE_ENABLED);
114
Edric Milareta3e47282015-10-23 15:20:30 -0400115 CategorizedContactModel::instance().setSortAlphabetical(false);
116 CategorizedContactModel::instance().setUnreachableHidden(true);
117 ui->contactView->setModel(&CategorizedContactModel::instance());
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400118 contactDelegate_ = new ContactDelegate();
119 ui->contactView->setItemDelegate(contactDelegate_);
120
Edric Milareta3e47282015-10-23 15:20:30 -0400121 CategorizedHistoryModel::instance().
Edric Milaret6a642e22015-05-27 15:06:30 -0400122 addCollection<LocalHistoryCollection>(LoadOptions::FORCE_ENABLED);
Edric Milaret627500d2015-03-27 16:41:40 -0400123
Edric Milareta3e47282015-10-23 15:20:30 -0400124 ui->historyList->setModel(CategorizedHistoryModel::SortedProxy::instance().model());
125 CategorizedHistoryModel::SortedProxy::instance().model()->sort(0, Qt::DescendingOrder);
Edric Milaret53f57b62015-05-11 11:02:17 -0400126 ui->historyList->setHeaderHidden(true);
Edric Milaret01f23842015-06-22 14:46:01 -0400127 historyDelegate_ = new HistoryDelegate();
128 ui->historyList->setItemDelegate(historyDelegate_);
Edric Milaret77dd6982015-07-07 16:45:41 -0400129
Edric Milareta3e47282015-10-23 15:20:30 -0400130 connect(CategorizedHistoryModel::SortedProxy::instance().model(), &QSortFilterProxyModel::layoutChanged, [=]() {
131 auto idx = CategorizedHistoryModel::SortedProxy::instance().model()->index(0,0);
Edric Milaret77dd6982015-07-07 16:45:41 -0400132 if (idx.isValid())
133 ui->historyList->setExpanded(idx, true);
134 });
135
Edric Milaret6b68a482016-02-01 15:23:44 -0500136 connect(ui->smartList, &QTreeView::entered, this, &CallWidget::on_entered);
137
138 smartListDelegate_ = new SmartListDelegate();
139 ui->smartList->setSmartListItemDelegate(smartListDelegate_);
140
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400141 ui->historyList->setContextMenuPolicy(Qt::CustomContextMenu);
142 connect(ui->historyList, &QListView::customContextMenuRequested, [=](const QPoint& pos){
143 if (ui->historyList->currentIndex().parent().isValid()) {
144 QPoint globalPos = ui->historyList->mapToGlobal(pos);
145 QMenu menu;
146
147 ContactMethod* contactMethod = ui->historyList->currentIndex()
148 .data(static_cast<int>(Call::Role::ContactMethod)).value<ContactMethod*>();
149
Edric Milaret53ac6e52015-09-14 13:37:06 -0400150 auto copyAction = new QAction(tr("Copy number"), this);
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400151 menu.addAction(copyAction);
152 connect(copyAction, &QAction::triggered, [=]() {
153 QApplication::clipboard()->setText(contactMethod->uri());
154 });
Edric Milaretbe0aa5a2015-07-31 15:08:39 -0400155 if (not contactMethod->contact() || contactMethod->contact()->isPlaceHolder()) {
Edric Milaret53ac6e52015-09-14 13:37:06 -0400156 auto addExisting = new QAction(tr("Add to contact"), this);
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400157 menu.addAction(addExisting);
158 connect(addExisting, &QAction::triggered, [=]() {
Edric Milaretbe0aa5a2015-07-31 15:08:39 -0400159 ContactPicker contactPicker(contactMethod);
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400160 contactPicker.move(globalPos.x(), globalPos.y() - (contactPicker.height()/2));
Edric Milaretbe0aa5a2015-07-31 15:08:39 -0400161 contactPicker.exec();
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400162 });
163 }
164 menu.exec(globalPos);
165 }
166 });
Edric Milaret53f57b62015-05-11 11:02:17 -0400167
Edric Milaret627500d2015-03-27 16:41:40 -0400168 findRingAccount();
Edric Milareta0ebd062016-01-13 12:18:23 -0500169 setupOutOfCallIM();
170 setupSmartListMenu();
Edric Milaret627500d2015-03-27 16:41:40 -0400171
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500172 connect(ui->smartList, &SmartList::btnVideoClicked, this, &CallWidget::btnComBarVideoClicked);
Nicolas Jager41e4fcf2016-01-28 11:37:03 -0500173
Edric Milaret6b68a482016-02-01 15:23:44 -0500174 connect(RecentModel::instance().selectionModel(),
175 SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
176 this,
177 SLOT(smartListSelectionChanged(QItemSelection,QItemSelection)));
178
179 connect(RecentModel::instance().selectionModel(), &QItemSelectionModel::selectionChanged, [=](const QItemSelection &selected, const QItemSelection &deselected) {
180 Q_UNUSED(deselected)
181 if (selected.size()) {
182 auto idx = selected.indexes().first();
183 auto realIdx = RecentModel::instance().peopleProxy()->mapFromSource(idx);
184 ui->smartList->selectionModel()->setCurrentIndex(realIdx, QItemSelectionModel::ClearAndSelect);
185 } else
186 ui->smartList->clearSelection();
187 });
188
Edric Milaret80e0b212015-10-16 10:07:43 -0400189 } catch (const std::exception& e) {
190 qDebug() << "INIT ERROR" << e.what();
Edric Milaret627500d2015-03-27 16:41:40 -0400191 }
192}
193
194CallWidget::~CallWidget()
195{
196 delete ui;
Edric Milaretc7ab5502015-06-15 11:18:02 -0400197 delete menu_;
Edric Milaret01f23842015-06-22 14:46:01 -0400198 delete contactDelegate_;
Edric Milaretab12d022015-12-04 16:09:44 -0500199 delete imDelegate_;
Edric Milaret6b68a482016-02-01 15:23:44 -0500200 delete pageAnim_;
201 delete smartListDelegate_;
Edric Milarete19c4cd2016-02-12 10:19:44 -0500202 delete shareMenu_;
203}
204
205void
Edric Milareta0ebd062016-01-13 12:18:23 -0500206CallWidget::setupOutOfCallIM()
207{
208 ui->listMessageView->setItemDelegate(imDelegate_);
209 ui->listMessageView->setContextMenuPolicy(Qt::ActionsContextMenu);
210
211 auto copyAction = new QAction(tr("Copy"), this);
212 ui->listMessageView->addAction(copyAction);
213 connect(copyAction, &QAction::triggered, [=]() {
214 auto idx = ui->listMessageView->currentIndex();
215 if (idx.isValid()) {
216 auto text = ui->listMessageView->model()->data(idx);
217 QApplication::clipboard()->setText(text.value<QString>());
218 }
219 });
Edric Milaret70ae8782016-04-18 16:10:44 -0400220 QSettings settings;
Edric Milareta0ebd062016-01-13 12:18:23 -0500221 auto displayDate = new QAction(tr("Display date"), this);
222 displayDate->setCheckable(true);
Edric Milaret70ae8782016-04-18 16:10:44 -0400223 displayDate->setChecked(settings.value(SettingsKey::imShowDate).toBool());
Edric Milareta0ebd062016-01-13 12:18:23 -0500224 ui->listMessageView->addAction(displayDate);
225 auto displayAuthor = new QAction(tr("Display author"), this);
226 displayAuthor->setCheckable(true);
Edric Milaret70ae8782016-04-18 16:10:44 -0400227 displayAuthor->setChecked(settings.value(SettingsKey::imShowAuthor).toBool());
Edric Milareta0ebd062016-01-13 12:18:23 -0500228 ui->listMessageView->addAction(displayAuthor);
229 auto lamdba = [=](){
Edric Milaret70ae8782016-04-18 16:10:44 -0400230 QSettings settings;
231 settings.setValue(SettingsKey::imShowAuthor, displayAuthor->isChecked());
232 settings.setValue(SettingsKey::imShowDate, displayDate->isChecked());
233 emit imDelegate_->sizeHintChanged(QModelIndex());
Edric Milareta0ebd062016-01-13 12:18:23 -0500234 };
235 connect(displayAuthor, &QAction::triggered, lamdba);
236 connect(displayDate, &QAction::triggered, lamdba);
Edric Milaret00a32252016-01-19 10:37:13 -0500237
238 connect(&::Media::RecordingModel::instance(),
239 SIGNAL(newTextMessage(::Media::TextRecording*, ContactMethod*)),
240 this,
241 SLOT(onIncomingMessage(::Media::TextRecording*, ContactMethod*)));
242}
243
244void
245CallWidget::onIncomingMessage(::Media::TextRecording* t, ContactMethod* cm) {
246 Q_UNUSED(cm)
247
248 if (!QApplication::focusWidget()) {
249 auto idx = t->instantTextMessagingModel()->
250 index(t->instantTextMessagingModel()->rowCount()-1, 0);
251 GlobalSystemTray::instance()
252 .showMessage("Ring",
253 QString(tr("Message incoming from %1")).arg(
254 idx.data((int)Media::TextRecording::Role::AuthorDisplayname).toString()));
255 QApplication::alert(this, 5000);
256 }
Edric Milareta0ebd062016-01-13 12:18:23 -0500257}
258
259void
260CallWidget::setupSmartListMenu() {
261 ui->smartList->setContextMenuPolicy(Qt::CustomContextMenu);
262 connect(ui->smartList, &QListView::customContextMenuRequested, [=](const QPoint& pos){
263 auto idx = ui->smartList->currentIndex();
264 if (not idx.isValid())
265 return;
266 QPoint globalPos = ui->smartList->mapToGlobal(pos);
267 QMenu menu;
268
Edric Milaret9949b342016-02-02 12:25:08 -0500269 QVector<ContactMethod*> contactMethods = RecentModel::instance()
270 .getContactMethods(RecentModel::instance().peopleProxy()->mapToSource(idx));
271 if (contactMethods.isEmpty())
Edric Milareta0ebd062016-01-13 12:18:23 -0500272 return;
Edric Milaret9949b342016-02-02 12:25:08 -0500273
274 if (contactMethods.size() == 1) {
275 auto contactMethod = contactMethods.at(0);
276 auto copyAction = new QAction(tr("Copy number"), this);
277 menu.addAction(copyAction);
278 connect(copyAction, &QAction::triggered, [contactMethod]() {
279 QApplication::clipboard()->setText(contactMethod->uri());
Edric Milareta0ebd062016-01-13 12:18:23 -0500280 });
Edric Milaretac21b3d2016-09-01 12:45:49 -0400281 auto copyNameAction = new QAction(tr("Copy name"), this);
282 menu.addAction(copyNameAction);
283 connect(copyNameAction, &QAction::triggered, [contactMethod]() {
284 QApplication::clipboard()->setText(contactMethod->primaryName());
285 });
Edric Milaret9949b342016-02-02 12:25:08 -0500286 if (not contactMethod->contact() || contactMethod->contact()->isPlaceHolder()) {
287 auto addExisting = new QAction(tr("Add to contact"), this);
288 menu.addAction(addExisting);
289 connect(addExisting, &QAction::triggered, [globalPos, contactMethod]() {
290 ContactPicker contactPicker(contactMethod);
291 contactPicker.move(globalPos.x(), globalPos.y() - (contactPicker.height()/2));
292 contactPicker.exec();
293 });
294 }
295 }
296 else {
297 auto callMenu = menu.addMenu(tr("Call Number"));
298 auto copyMenu = menu.addMenu(tr("Copy Number"));
299 for (auto cM : contactMethods) {
300 auto uri = cM->uri();
301 auto copyAction = new QAction(tr("Copy %1").arg(uri), this);
302 copyMenu->addAction(copyAction);
303 connect(copyAction, &QAction::triggered, [uri]() {
304 QApplication::clipboard()->setText(uri);
305 });
306 auto callAction = new QAction(tr("Call %1").arg(uri), this);
307 callMenu->addAction(callAction);
308 connect(callAction, &QAction::triggered, [cM]() {
309 Call* c = CallModel::instance().dialingCall(cM);
310 c->performAction(Call::Action::ACCEPT);
311 });
312 }
Edric Milareta0ebd062016-01-13 12:18:23 -0500313 }
314 menu.exec(globalPos);
315 });
316}
317
318void
Edric Milaret67007d12015-05-07 09:40:09 -0400319CallWidget::findRingAccount(QModelIndex idx1, QModelIndex idx2, QVector<int> vec)
320{
321 Q_UNUSED(idx1)
322 Q_UNUSED(idx2)
323 Q_UNUSED(vec)
324
Edric Milareta3e47282015-10-23 15:20:30 -0400325 auto a_count = AccountModel::instance().rowCount();
Edric Milaret67007d12015-05-07 09:40:09 -0400326 for (int i = 0; i < a_count; ++i) {
Edric Milareta3e47282015-10-23 15:20:30 -0400327 auto idx = AccountModel::instance().index(i, 0);
Edric Milaret67007d12015-05-07 09:40:09 -0400328 auto protocol = idx.data(static_cast<int>(Account::Role::Proto));
Edric Milaret74474f52016-05-16 13:36:23 -0400329 if (static_cast<Account::Protocol>(protocol.toUInt()) == Account::Protocol::RING) {
Edric Milaret67007d12015-05-07 09:40:09 -0400330 auto username = idx.data(static_cast<int>(Account::Role::Username));
Edric Milareted0b2802015-10-01 15:10:02 -0400331 ui->ringIdLabel->setText(username.toString());
Edric Milarete19c4cd2016-02-12 10:19:44 -0500332 setupQRCode();
Edric Milaret67007d12015-05-07 09:40:09 -0400333 return;
334 }
335 }
Edric Milaret74474f52016-05-16 13:36:23 -0400336 ui->ringIdLabel->setText(tr("NO RING ACCOUNT FOUND"));
Edric Milaret67007d12015-05-07 09:40:09 -0400337}
338
Edric Milarete19c4cd2016-02-12 10:19:44 -0500339void CallWidget::setupQRCode()
340{
341 auto rcode = QRcode_encodeString(ui->ringIdLabel->text().toStdString().c_str(),
Edric Milaret6d0e5312016-04-04 16:30:22 -0400342 0, //Let the version be decided by libqrencode
343 QR_ECLEVEL_L, // Lowest level of error correction
Edric Milarete19c4cd2016-02-12 10:19:44 -0500344 QR_MODE_8, // 8-bit data mode
345 1);
346 if (not rcode) {
347 qWarning() << "Failed to generate QR code: " << strerror(errno);
348 return;
349 }
350
351 auto margin = 5;
352 int qrwidth = rcode->width + margin * 2;
353 QImage result(QSize(qrwidth, qrwidth), QImage::Format_Mono);
354 QPainter painter;
355 painter.begin(&result);
356 painter.setClipRect(QRect(0, 0, qrwidth, qrwidth));
357 painter.setPen(QPen(Qt::black, 0.1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
358 painter.setBrush(Qt::black);
359 painter.fillRect(QRect(0, 0, qrwidth, qrwidth), Qt::white);
Edric Milaret74474f52016-05-16 13:36:23 -0400360 unsigned char* p;
Edric Milarete19c4cd2016-02-12 10:19:44 -0500361 p = rcode->data;
362 for(int y = 0; y < rcode->width; y++) {
Edric Milaret74474f52016-05-16 13:36:23 -0400363 unsigned char* row = (p + (y * rcode->width));
Edric Milarete19c4cd2016-02-12 10:19:44 -0500364 for(int x = 0; x < rcode->width; x++) {
365 if(*(row + x) & 0x1) {
366 painter.drawRect(margin + x, margin + y, 1, 1);
367 }
368 }
369
370 }
371 painter.end();
372 QRcode_free(rcode);
Edric Milaret6d0e5312016-04-04 16:30:22 -0400373 ui->qrLabel->setPixmap(QPixmap::fromImage(result.scaled(QSize(qrSize_, qrSize_), Qt::KeepAspectRatio)));
Edric Milarete19c4cd2016-02-12 10:19:44 -0500374}
375
Edric Milaret67007d12015-05-07 09:40:09 -0400376void
377CallWidget::findRingAccount()
378{
Edric Milareta3e47282015-10-23 15:20:30 -0400379 auto a_count = AccountModel::instance().rowCount();
Edric Milaret627500d2015-03-27 16:41:40 -0400380 for (int i = 0; i < a_count; ++i) {
Edric Milareta3e47282015-10-23 15:20:30 -0400381 auto idx = AccountModel::instance().index(i, 0);
Edric Milaret627500d2015-03-27 16:41:40 -0400382 auto protocol = idx.data(static_cast<int>(Account::Role::Proto));
Edric Milaret74474f52016-05-16 13:36:23 -0400383 if (static_cast<Account::Protocol>(protocol.toUInt()) == Account::Protocol::RING) {
Edric Milareta3e47282015-10-23 15:20:30 -0400384 auto account = AccountModel::instance().getAccountByModelIndex(idx);
Edric Milaret68779c42015-07-09 16:53:03 -0400385 if (account->displayName().isEmpty())
386 account->displayName() = account->alias();
387 auto username = account->username();
Edric Milareted0b2802015-10-01 15:10:02 -0400388 ui->ringIdLabel->setText(username);
Edric Milarete19c4cd2016-02-12 10:19:44 -0500389 setupQRCode();
Edric Milaret627500d2015-03-27 16:41:40 -0400390 return;
391 }
392 }
Edric Milaret74474f52016-05-16 13:36:23 -0400393 ui->ringIdLabel->setText(tr("NO RING ACCOUNT FOUND"));
394 auto wizardDialog = new WizardDialog();
395 wizardDialog->exec();
396 delete wizardDialog;
Edric Milaret627500d2015-03-27 16:41:40 -0400397}
398
399void
Edric Milaret00d34f22016-05-09 16:30:29 -0400400CallWidget::callChangedSlot()
401{
402 if (not actualCall_)
403 return;
404 ui->callerIdLabel->setText(QString(tr("%1", "%1 is the name of the caller"))
405 .arg(actualCall_->formattedName()));
406 ui->callerPhoto->setPixmap(
407 QPixmap::fromImage(
408 GlobalInstances::pixmapManipulator()
409 .callPhoto(actualCall_, QSize(130,130)).value<QImage>()));
410}
411
412void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500413CallWidget::callIncoming(Call* call)
Edric Milaret627500d2015-03-27 16:41:40 -0400414{
Edric Milaret00a32252016-01-19 10:37:13 -0500415 if (!QApplication::focusWidget()) {
416 GlobalSystemTray::instance()
417 .showMessage("Ring",
418 QString(tr("Call incoming from %1")).arg(call->formattedName()));
Edric Milaret2cf34292015-06-22 16:27:03 -0400419 QApplication::alert(this, 5000);
420 }
421
Edric Milaret6456baa2015-05-21 12:18:07 -0400422 setActualCall(call);
Edric Milaret627500d2015-03-27 16:41:40 -0400423}
424
425void
426CallWidget::on_acceptButton_clicked()
427{
428 if (actualCall_ != nullptr)
Edric Milaret53f57b62015-05-11 11:02:17 -0400429 actualCall_->performAction(Call::Action::ACCEPT);
Edric Milaret627500d2015-03-27 16:41:40 -0400430}
431
432void
433CallWidget::on_refuseButton_clicked()
434{
435 if (actualCall_ == nullptr)
436 return;
437 actualCall_->performAction(Call::Action::REFUSE);
Nicolas Jager13745062016-02-12 18:56:40 -0500438 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Edric Milaret6456baa2015-05-21 12:18:07 -0400439 setActualCall(nullptr);
Edric Milaret627500d2015-03-27 16:41:40 -0400440}
441
442void
Edric Milaret67007d12015-05-07 09:40:09 -0400443CallWidget::callStateChanged(Call* call, Call::State previousState)
444{
Edric Milaret627500d2015-03-27 16:41:40 -0400445 Q_UNUSED(previousState)
Edric Milaret4b1be4a2016-01-15 16:49:20 -0500446 if (call == nullptr
447 || call != actualCall_)
Edric Milaretb5b49072015-05-08 11:56:07 -0400448 return;
Edric Milareted0b2802015-10-01 15:10:02 -0400449
Edric Milaret4b1be4a2016-01-15 16:49:20 -0500450 if (call->state() == Call::State::OVER) {
Edric Milaret6456baa2015-05-21 12:18:07 -0400451 setActualCall(nullptr);
Edric Milaret6b68a482016-02-01 15:23:44 -0500452 RecentModel::instance().selectionModel()->clear();
Edric Milaret627500d2015-03-27 16:41:40 -0400453 }
Edric Milaret6b68a482016-02-01 15:23:44 -0500454 callStateToView(call);
Edric Milaret627500d2015-03-27 16:41:40 -0400455}
456
457void
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400458CallWidget::atExit()
459{
Edric Milaret627500d2015-03-27 16:41:40 -0400460}
Edric Milaret67007d12015-05-07 09:40:09 -0400461
462void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500463CallWidget::on_contactView_doubleClicked(const QModelIndex& index)
Edric Milaret67007d12015-05-07 09:40:09 -0400464{
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400465 if (not index.isValid())
466 return;
467
Edric Milaret7d40a4a2015-05-13 13:01:15 -0400468 auto var = index.child(0,0).data(
469 static_cast<int>(Person::Role::Object));
470 if (var.isValid()) {
471 Person* person = var.value<Person*>();
Edric Milaret74474f52016-05-16 13:36:23 -0400472 ContactMethod* uri = nullptr;
Edric Milaret2afd2bf2015-07-21 17:12:25 -0400473 if (person->phoneNumbers().size() == 1) {
474 uri = person->phoneNumbers().at(0);
475 } else if (person->phoneNumbers().size() > 1) {
476 ContactMethodPicker dlg(person->phoneNumbers());
477 auto pos = QCursor::pos();
478 dlg.move(pos.x(), pos.y());
479 if (dlg.exec())
480 uri = dlg.getSelected();
481 }
482 if (uri) {
Edric Milareta3e47282015-10-23 15:20:30 -0400483 auto outCall = CallModel::instance().dialingCall(uri);
Edric Milaret2afd2bf2015-07-21 17:12:25 -0400484 outCall->performAction(Call::Action::ACCEPT);
Edric Milareted0b2802015-10-01 15:10:02 -0400485 ui->mainTabMenu->setCurrentIndex(0);
486 ui->smartList->setFocus();
Edric Milaret67007d12015-05-07 09:40:09 -0400487 }
488 }
Edric Milaret67007d12015-05-07 09:40:09 -0400489}
Edric Milaret53f57b62015-05-11 11:02:17 -0400490
Edric Milaret6456baa2015-05-21 12:18:07 -0400491void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500492CallWidget::on_historyList_doubleClicked(const QModelIndex& index)
Edric Milaret53f57b62015-05-11 11:02:17 -0400493{
Edric Milaret12353822015-05-14 14:41:09 -0400494 if (not index.isValid())
495 return;
496
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400497 auto number = index.data(static_cast<int>(Call::Role::ContactMethod)).value<ContactMethod*>();
498 if (number) {
Edric Milareta3e47282015-10-23 15:20:30 -0400499 auto outCall = CallModel::instance().dialingCall(number);
Edric Milaret53f57b62015-05-11 11:02:17 -0400500 outCall->performAction(Call::Action::ACCEPT);
Edric Milareted0b2802015-10-01 15:10:02 -0400501 ui->mainTabMenu->setCurrentIndex(0);
502 ui->smartList->setFocus();
Edric Milaret53f57b62015-05-11 11:02:17 -0400503 }
504}
Edric Milaret6456baa2015-05-21 12:18:07 -0400505
Edric Milaret6b68a482016-02-01 15:23:44 -0500506void CallWidget::callStateToView(Call* value)
507{
508 if (value) {
509 switch (value->state()) {
510 case Call::State::INCOMING:
511 if (not value->account()->isAutoAnswer())
512 ui->stackedWidget->setCurrentWidget(ui->callInvitePage);
513 else
514 ui->stackedWidget->setCurrentWidget(ui->videoPage);
515 break;
516 case Call::State::CURRENT:
Edric Milareta86e3f52016-03-14 16:28:57 -0400517 case Call::State::CONFERENCE:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500518 case Call::State::HOLD:
Edric Milaret6b68a482016-02-01 15:23:44 -0500519 ui->stackedWidget->setCurrentWidget(ui->videoPage);
520 break;
521 case Call::State::OVER:
522 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
523 break;
524 case Call::State::INITIALIZATION:
525 case Call::State::CONNECTED:
526 case Call::State::RINGING:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500527 case Call::State::FAILURE:
Edric Milaret6b68a482016-02-01 15:23:44 -0500528 case Call::State::ERROR:
529 ui->stackedWidget->setCurrentWidget(ui->outboundCallPage);
530 break;
531 default:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500532 qWarning() << "Call state not handled doing nothing : "
533 << value->toHumanStateName();
Edric Milaret6b68a482016-02-01 15:23:44 -0500534 break;
535 }
Nicolas Jager13745062016-02-12 18:56:40 -0500536 }
Edric Milaret6b68a482016-02-01 15:23:44 -0500537}
538
Edric Milaret6456baa2015-05-21 12:18:07 -0400539void
540CallWidget::setActualCall(Call* value)
541{
542 actualCall_ = value;
Edric Milaret80e0b212015-10-16 10:07:43 -0400543 CallModel::instance().selectCall(value);
544 ui->videoWidget->pushRenderer(value);
Edric Milareta86e3f52016-03-14 16:28:57 -0400545 ui->instantMessagingWidget->setMediaText(actualCall_);
Edric Milaret6b68a482016-02-01 15:23:44 -0500546 callStateToView(value);
Edric Milaret00d34f22016-05-09 16:30:29 -0400547 if (actualCall_) {
548 callChangedConnection_ = connect(actualCall_,
549 SIGNAL(changed()),
550 this,
551 SLOT(callChangedSlot()));
552 } else
553 disconnect(callChangedConnection_);
554
Edric Milaret6456baa2015-05-21 12:18:07 -0400555}
Edric Milaretc7ab5502015-06-15 11:18:02 -0400556
557void
Edric Milareted0b2802015-10-01 15:10:02 -0400558CallWidget::on_cancelButton_clicked()
Edric Milaretd8528fa2015-07-07 14:13:51 -0400559{
560 if (actualCall_)
561 actualCall_->performAction(Call::Action::REFUSE);
562}
Edric Milareted0b2802015-10-01 15:10:02 -0400563
564void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500565CallWidget::on_smartList_doubleClicked(const QModelIndex& index)
Edric Milareted0b2802015-10-01 15:10:02 -0400566{
Edric Milareta3e47282015-10-23 15:20:30 -0400567 auto realIndex = RecentModel::instance().peopleProxy()->mapToSource(index);
568 if (RecentModel::instance().hasActiveCall(realIndex))
Edric Milareted0b2802015-10-01 15:10:02 -0400569 return;
570
571 ContactMethod* m = nullptr;
572 if (auto cm = realIndex.data((int)Call::Role::ContactMethod).value<ContactMethod*>()) {
573 m = cm;
574 } else {
575 if (auto person = realIndex.data((int)Person::Role::Object).value<Person*>()) {
576 m = person->phoneNumbers().first();
577 }
578 }
Edric Milareta3e47282015-10-23 15:20:30 -0400579 if (m && !RecentModel::instance().index(0, 0, realIndex).isValid()) {
580 Call* c = CallModel::instance().dialingCall(m);
Edric Milareted0b2802015-10-01 15:10:02 -0400581 c->performAction(Call::Action::ACCEPT);
Edric Milaret6b68a482016-02-01 15:23:44 -0500582 setActualCall(c);
Edric Milareted0b2802015-10-01 15:10:02 -0400583 }
584}
585
586void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500587CallWidget::smartListSelectionChanged(const QItemSelection& newSel, const QItemSelection& oldSel) {
Edric Milareted0b2802015-10-01 15:10:02 -0400588
589 Q_UNUSED(oldSel)
590
Edric Milaret25236d92016-03-28 09:40:58 -0400591 if (newSel.indexes().empty()) {
592 setActualCall(nullptr);
Edric Milaret6b68a482016-02-01 15:23:44 -0500593 return ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Edric Milaret25236d92016-03-28 09:40:58 -0400594 }
Edric Milaret6b68a482016-02-01 15:23:44 -0500595
Edric Milareted0b2802015-10-01 15:10:02 -0400596 auto newIdx = newSel.indexes().first();
Edric Milaret80e0b212015-10-16 10:07:43 -0400597 if (not newIdx.isValid())
Edric Milareted0b2802015-10-01 15:10:02 -0400598 return;
599
Edric Milaret6b68a482016-02-01 15:23:44 -0500600 auto newIdxCall = RecentModel::instance().getActiveCall(newIdx);
Edric Milareta0ebd062016-01-13 12:18:23 -0500601 if (newIdxCall && newIdxCall != actualCall_) {
Edric Milareted0b2802015-10-01 15:10:02 -0400602 setActualCall(newIdxCall);
Edric Milareta0ebd062016-01-13 12:18:23 -0500603 } else if (newIdxCall == nullptr){
604 setActualCall(nullptr);
Edric Milaretf6f608d2016-02-02 15:06:33 -0500605 ui->instantMessagingWidget->hide();
Edric Milaret6b68a482016-02-01 15:23:44 -0500606 showIMOutOfCall(newIdx);
Edric Milareted0b2802015-10-01 15:10:02 -0400607 } else {
608 setActualCall(nullptr);
Edric Milaretf6f608d2016-02-02 15:06:33 -0500609 ui->instantMessagingWidget->hide();
Edric Milaret7ef617b2016-02-01 15:40:57 -0500610 if (imConnection_)
611 disconnect(imConnection_);
Edric Milareted0b2802015-10-01 15:10:02 -0400612 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
613 }
614}
615
616void
617CallWidget::placeCall()
618{
Nicolas Jager97a21b42015-12-03 16:55:45 -0500619 if (ui->ringContactLineEdit->text().isEmpty())
Edric Milareted0b2802015-10-01 15:10:02 -0400620 return;
Nicolas Jager97a21b42015-12-03 16:55:45 -0500621 Call* c = CallModel::instance().dialingCall(PhoneDirectoryModel::instance().getNumber(ui->ringContactLineEdit->text()));
Edric Milareted0b2802015-10-01 15:10:02 -0400622 c->performAction(Call::Action::ACCEPT);
Nicolas Jager97a21b42015-12-03 16:55:45 -0500623 ui->ringContactLineEdit->clear();
Edric1bed3f92016-05-19 10:24:48 -0400624 ui->callingPhoto->setPixmap(
625 QPixmap::fromImage(
626 GlobalInstances::pixmapManipulator()
627 .callPhoto(c, QSize(130,130)).value<QImage>()));
Edric Milareted0b2802015-10-01 15:10:02 -0400628}
629
630void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500631CallWidget::settingsButtonClicked()
Edric Milareted0b2802015-10-01 15:10:02 -0400632{
633 emit NavigationRequested(ScreenEnum::ConfScreen);
634}
635
636void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500637CallWidget::contactButtonClicked(bool checked)
Edric Milareted0b2802015-10-01 15:10:02 -0400638{
Edric Milareted0b2802015-10-01 15:10:02 -0400639 ui->mainTabMenu->setCurrentIndex(checked ? 1 : 0);
640}
641
642void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500643CallWidget::historicButtonClicked(bool checked)
Edric Milareted0b2802015-10-01 15:10:02 -0400644{
Edric Milareted0b2802015-10-01 15:10:02 -0400645 ui->mainTabMenu->setCurrentIndex(checked ? 2 : 0);
646}
Nicolas Jager97a21b42015-12-03 16:55:45 -0500647
648void
649CallWidget::on_ringContactLineEdit_returnPressed()
650{
Edric Milaret00593d12016-01-19 11:57:46 -0500651 auto cm = PhoneDirectoryModel::instance().getNumber(ui->ringContactLineEdit->text());
652 time_t currentTime;
653 ::time(&currentTime);
654 cm->setLastUsed(currentTime);
Edric Milaret8001f6f2016-01-27 09:55:12 -0500655 ui->ringContactLineEdit->clear();
Nicolas Jager5e845d52016-02-18 13:26:12 -0500656
657 QModelIndex index = RecentModel::instance().getIndex(cm);
658 RecentModel::instance().selectionModel()->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect);
Nicolas Jager97a21b42015-12-03 16:55:45 -0500659}
660
661void
662CallWidget::on_btnCall_clicked()
663{
664 placeCall();
665}
666
667void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500668CallWidget::btnComBarVideoClicked()
Nicolas Jager97a21b42015-12-03 16:55:45 -0500669{
670 if (not highLightedIndex_.isValid())
671 return;
672
673 on_smartList_doubleClicked(highLightedIndex_);
674}
Edric Milaretab12d022015-12-04 16:09:44 -0500675
676void
Edric Milaret6b68a482016-02-01 15:23:44 -0500677CallWidget::showIMOutOfCall(const QModelIndex& nodeIdx)
Edric Milaretab12d022015-12-04 16:09:44 -0500678{
Edric Milaretab12d022015-12-04 16:09:44 -0500679 ui->contactMethodComboBox->clear();
680
Edric Milareta0ebd062016-01-13 12:18:23 -0500681 ui->imNameLabel->setText(QString(tr("Conversation with %1", "%1 is the contact name"))
682 .arg(nodeIdx.data(static_cast<int>(Ring::Role::Name)).toString()));
Edric Milaretab12d022015-12-04 16:09:44 -0500683 auto cmVector = RecentModel::instance().getContactMethods(nodeIdx);
Edric Milareta0ebd062016-01-13 12:18:23 -0500684 ui->contactMethodComboBox->setEnabled(cmVector.size() > 1);
Edric Milaretab12d022015-12-04 16:09:44 -0500685 foreach (const ContactMethod* cm, cmVector) {
Edric Milareta0ebd062016-01-13 12:18:23 -0500686 ui->contactMethodComboBox->addItem(cm->uri());
Edric Milaretab12d022015-12-04 16:09:44 -0500687 }
Edric Milaret6b68a482016-02-01 15:23:44 -0500688 slidePage(ui->messagingPage, true);
Edric Milaret70ae8782016-04-18 16:10:44 -0400689 disconnect(imClickedConnection_);
690 imClickedConnection_ = connect(ui->listMessageView, &QListView::clicked, [this](const QModelIndex& index) {
691 auto urlList = index.data(static_cast<int>(Media::TextRecording::Role::LinkList)).value<QList<QUrl>>();
692 if (urlList.size() == 1)
693 QDesktopServices::openUrl(urlList.at(0));
694 else if (urlList.size()) {
695 //TODO Handle multiple url in one message
696 }
697 });
Edric Milaretab12d022015-12-04 16:09:44 -0500698}
699
700void
Edric Milaret6a785af2016-03-07 15:39:30 -0500701CallWidget::on_sendIMButton_clicked()
Edric Milaretab12d022015-12-04 16:09:44 -0500702{
Edric Milaret6a785af2016-03-07 15:39:30 -0500703 if (ui->imMessageEdit->text().trimmed().isEmpty())
Edric Milaretab12d022015-12-04 16:09:44 -0500704 return;
705 auto number = ui->contactMethodComboBox->currentText();
706 if (auto cm = PhoneDirectoryModel::instance().getNumber(number)) {
707 QMap<QString, QString> msg;
Edric Milaret6a785af2016-03-07 15:39:30 -0500708 msg["text/plain"] = ui->imMessageEdit->text();
Edric Milaretab12d022015-12-04 16:09:44 -0500709 cm->sendOfflineTextMessage(msg);
Edric Milaret6a785af2016-03-07 15:39:30 -0500710 ui->imMessageEdit->clear();
Edric Milaretab12d022015-12-04 16:09:44 -0500711 } else {
712 qWarning() << "Contact Method not found for " << number;
713 }
714}
715
716void
Edric Milaret6a785af2016-03-07 15:39:30 -0500717CallWidget::on_imMessageEdit_returnPressed()
Edric Milaretab12d022015-12-04 16:09:44 -0500718{
Edric Milaret6a785af2016-03-07 15:39:30 -0500719 on_sendIMButton_clicked();
Edric Milaretab12d022015-12-04 16:09:44 -0500720}
721
722void
723CallWidget::on_contactMethodComboBox_currentIndexChanged(const QString& number)
724{
725 auto cm = PhoneDirectoryModel::instance().getNumber(number);
726 if (auto txtRecording = cm->textRecording()) {
727 ui->listMessageView->setModel(txtRecording->instantMessagingModel());
Edric Milaret7ef617b2016-02-01 15:40:57 -0500728 if (imConnection_)
729 disconnect(imConnection_);
Edric Milaretab12d022015-12-04 16:09:44 -0500730 imConnection_ = connect(txtRecording,
Edric Milareta0ebd062016-01-13 12:18:23 -0500731 SIGNAL(messageInserted(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)),
732 this,
733 SLOT(slotAccountMessageReceived(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)));
Edric Milaret4be72022016-01-19 10:24:13 -0500734 auto messagesPresent = txtRecording->instantMessagingModel()->rowCount() > 0;
735 if (messagesPresent) {
736 ui->listMessageView->scrollToBottom();
737 txtRecording->setAllRead();
738 }
739 ui->listMessageView->setVisible(messagesPresent);
740 ui->noMessagesLabel->setVisible(!messagesPresent);
741 if (not messagesPresent) {
Edric Milaret49130472016-01-22 10:39:37 -0500742 imVisibleConnection_ = connect(txtRecording->instantMessagingModel(),
743 &QAbstractItemModel::rowsInserted,
744 [this, txtRecording]() {
745 if (imVisibleConnection_)
746 disconnect(imVisibleConnection_);
747 auto messagesPresent = txtRecording->instantMessagingModel()->rowCount() > 0;
Edric Milaret4be72022016-01-19 10:24:13 -0500748 ui->listMessageView->setVisible(messagesPresent);
749 ui->noMessagesLabel->setVisible(!messagesPresent);
Edric Milaret4be72022016-01-19 10:24:13 -0500750 });
751 }
Edric Milaretab12d022015-12-04 16:09:44 -0500752 }
753}
754
755void
756CallWidget::slotAccountMessageReceived(const QMap<QString,QString> message,
757 ContactMethod* cm,
758 Media::Media::Direction dir)
759{
760 Q_UNUSED(message)
Edric Milaretab12d022015-12-04 16:09:44 -0500761 Q_UNUSED(dir)
762
763 ui->listMessageView->scrollToBottom();
Edric Milaret23fd3fa2016-01-15 15:37:35 -0500764 cm->textRecording()->setAllRead();
Edric Milaretab12d022015-12-04 16:09:44 -0500765}
Edric Milaretfa05d972016-01-13 16:22:04 -0500766
767void
Edric Milaret8001f6f2016-01-27 09:55:12 -0500768CallWidget::on_ringContactLineEdit_textChanged(const QString& text)
Edric Milaretfa05d972016-01-13 16:22:04 -0500769{
770 RecentModel::instance().peopleProxy()->setFilterWildcard(text);
771}
Edric Milareta0ebd062016-01-13 12:18:23 -0500772
Nicolas Jagerca850292016-01-17 14:11:10 -0500773void
774CallWidget::on_imBackButton_clicked()
Edric Milareta0ebd062016-01-13 12:18:23 -0500775{
Edric Milaret6b68a482016-02-01 15:23:44 -0500776 RecentModel::instance().selectionModel()->clear();
777 slidePage(ui->welcomePage);
Nicolas Jagerca850292016-01-17 14:11:10 -0500778}
779
780void
Edric Milaret6b68a482016-02-01 15:23:44 -0500781CallWidget::slidePage(QWidget* widget, bool toRight)
Nicolas Jagerca850292016-01-17 14:11:10 -0500782{
Edric Milaret6b68a482016-02-01 15:23:44 -0500783 short dir = (toRight ? -1 : 1);
Nicolas Jagerca850292016-01-17 14:11:10 -0500784 ui->stackedWidget->setCurrentWidget(widget);
Edric Milaret6b68a482016-02-01 15:23:44 -0500785 pageAnim_->setTargetObject(widget);
786 pageAnim_->setDuration(animDuration_);
787 pageAnim_->setStartValue(QPoint(widget->width() * dir, widget->y()));
788 pageAnim_->setEndValue(QPoint(widget->x(), widget->y()));
789 pageAnim_->setEasingCurve(QEasingCurve::OutQuad);
790 pageAnim_->start();
Nicolas Jagerca850292016-01-17 14:11:10 -0500791}
792
793void
Edric Milaret6b68a482016-02-01 15:23:44 -0500794CallWidget::on_smartList_clicked(const QModelIndex& index)
Nicolas Jagerca850292016-01-17 14:11:10 -0500795{
Edric Milaret6b68a482016-02-01 15:23:44 -0500796 RecentModel::instance().selectionModel()->setCurrentIndex(
797 RecentModel::instance().peopleProxy()->mapToSource(index),
798 QItemSelectionModel::ClearAndSelect);
Edric Milareta0ebd062016-01-13 12:18:23 -0500799}
Edric Milaret7cf39e22016-02-02 12:44:03 -0500800
801void
802CallWidget::on_copyCMButton_clicked()
803{
804 auto text = ui->contactMethodComboBox->currentText();
805 QApplication::clipboard()->setText(text);
806}
Edric Milaret4097d2f2016-02-09 14:41:50 -0500807
808void
Edric Milaret1e598592016-09-02 10:10:01 -0400809CallWidget::on_qrButton_toggled(bool checked)
810{
811 ui->qrLabel->setVisible(checked);
812}
813
814void
Edric Milaret4097d2f2016-02-09 14:41:50 -0500815CallWidget::on_shareButton_clicked()
816{
Edric Milaret1e598592016-09-02 10:10:01 -0400817 Utils::InvokeMailto(tr("Contact me on Ring"), tr("My RingId is : ") + ui->ringIdLabel->text());
Edric Milaret4097d2f2016-02-09 14:41:50 -0500818}