blob: c040a9178d7cb8fb02b54fe65c3fd1c6d797cab5 [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{
Anthony Léonard314c2a42016-10-20 10:39:56 -0400379 ui->ringIdLabel->clear();
Edric Milaret57467842016-08-30 13:06:11 -0400380
Edric Milareta3e47282015-10-23 15:20:30 -0400381 auto a_count = AccountModel::instance().rowCount();
Edric Milaret627500d2015-03-27 16:41:40 -0400382 for (int i = 0; i < a_count; ++i) {
Edric Milareta3e47282015-10-23 15:20:30 -0400383 auto idx = AccountModel::instance().index(i, 0);
Edric Milaret627500d2015-03-27 16:41:40 -0400384 auto protocol = idx.data(static_cast<int>(Account::Role::Proto));
Edric Milaret74474f52016-05-16 13:36:23 -0400385 if (static_cast<Account::Protocol>(protocol.toUInt()) == Account::Protocol::RING) {
Edric Milareta3e47282015-10-23 15:20:30 -0400386 auto account = AccountModel::instance().getAccountByModelIndex(idx);
Edric Milaret68779c42015-07-09 16:53:03 -0400387 if (account->displayName().isEmpty())
388 account->displayName() = account->alias();
Edric Milaret57467842016-08-30 13:06:11 -0400389 if (account->needsMigration()) {
390 WizardDialog dlg(WizardDialog::MIGRATION, account);
391 dlg.exec();
392 }
393 if (ui->ringIdLabel->text().isEmpty()) {
394 auto username = account->username();
395 ui->ringIdLabel->setText(username);
396 setupQRCode();
397 }
Edric Milaret627500d2015-03-27 16:41:40 -0400398 }
399 }
Edric Milaret57467842016-08-30 13:06:11 -0400400 if (ui->ringIdLabel->text().isEmpty()) {
401 ui->ringIdLabel->setText(tr("NO RING ACCOUNT FOUND"));
402 WizardDialog wizardDialog;
403 wizardDialog.exec();
404 }
Edric Milaret627500d2015-03-27 16:41:40 -0400405}
406
407void
Edric Milaret00d34f22016-05-09 16:30:29 -0400408CallWidget::callChangedSlot()
409{
410 if (not actualCall_)
411 return;
Edric Milaret41941582016-09-14 12:59:04 -0400412 ui->callerIdLabel->setText(QString("%1")
Edric Milaret00d34f22016-05-09 16:30:29 -0400413 .arg(actualCall_->formattedName()));
414 ui->callerPhoto->setPixmap(
415 QPixmap::fromImage(
416 GlobalInstances::pixmapManipulator()
417 .callPhoto(actualCall_, QSize(130,130)).value<QImage>()));
418}
419
420void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500421CallWidget::callIncoming(Call* call)
Edric Milaret627500d2015-03-27 16:41:40 -0400422{
Edric Milaret00a32252016-01-19 10:37:13 -0500423 if (!QApplication::focusWidget()) {
424 GlobalSystemTray::instance()
425 .showMessage("Ring",
426 QString(tr("Call incoming from %1")).arg(call->formattedName()));
Edric Milaret2cf34292015-06-22 16:27:03 -0400427 QApplication::alert(this, 5000);
428 }
429
Edric Milaret6456baa2015-05-21 12:18:07 -0400430 setActualCall(call);
Edric Milaret627500d2015-03-27 16:41:40 -0400431}
432
433void
434CallWidget::on_acceptButton_clicked()
435{
436 if (actualCall_ != nullptr)
Edric Milaret53f57b62015-05-11 11:02:17 -0400437 actualCall_->performAction(Call::Action::ACCEPT);
Edric Milaret627500d2015-03-27 16:41:40 -0400438}
439
440void
441CallWidget::on_refuseButton_clicked()
442{
443 if (actualCall_ == nullptr)
444 return;
445 actualCall_->performAction(Call::Action::REFUSE);
Nicolas Jager13745062016-02-12 18:56:40 -0500446 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Edric Milaret6456baa2015-05-21 12:18:07 -0400447 setActualCall(nullptr);
Edric Milaret627500d2015-03-27 16:41:40 -0400448}
449
450void
Edric Milaret67007d12015-05-07 09:40:09 -0400451CallWidget::callStateChanged(Call* call, Call::State previousState)
452{
Edric Milaret627500d2015-03-27 16:41:40 -0400453 Q_UNUSED(previousState)
Edric Milaret4b1be4a2016-01-15 16:49:20 -0500454 if (call == nullptr
455 || call != actualCall_)
Edric Milaretb5b49072015-05-08 11:56:07 -0400456 return;
Edric Milareted0b2802015-10-01 15:10:02 -0400457
Edric Milaret4b1be4a2016-01-15 16:49:20 -0500458 if (call->state() == Call::State::OVER) {
Edric Milaret6456baa2015-05-21 12:18:07 -0400459 setActualCall(nullptr);
Edric Milaret6b68a482016-02-01 15:23:44 -0500460 RecentModel::instance().selectionModel()->clear();
Edric Milaret627500d2015-03-27 16:41:40 -0400461 }
Edric Milaret6b68a482016-02-01 15:23:44 -0500462 callStateToView(call);
Edric Milaret627500d2015-03-27 16:41:40 -0400463}
464
465void
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400466CallWidget::atExit()
467{
Edric Milaret627500d2015-03-27 16:41:40 -0400468}
Edric Milaret67007d12015-05-07 09:40:09 -0400469
470void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500471CallWidget::on_contactView_doubleClicked(const QModelIndex& index)
Edric Milaret67007d12015-05-07 09:40:09 -0400472{
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400473 if (not index.isValid())
474 return;
475
Edric Milaret7d40a4a2015-05-13 13:01:15 -0400476 auto var = index.child(0,0).data(
477 static_cast<int>(Person::Role::Object));
478 if (var.isValid()) {
479 Person* person = var.value<Person*>();
Edric Milaret74474f52016-05-16 13:36:23 -0400480 ContactMethod* uri = nullptr;
Edric Milaret2afd2bf2015-07-21 17:12:25 -0400481 if (person->phoneNumbers().size() == 1) {
482 uri = person->phoneNumbers().at(0);
483 } else if (person->phoneNumbers().size() > 1) {
484 ContactMethodPicker dlg(person->phoneNumbers());
485 auto pos = QCursor::pos();
486 dlg.move(pos.x(), pos.y());
487 if (dlg.exec())
488 uri = dlg.getSelected();
489 }
490 if (uri) {
Edric Milareta3e47282015-10-23 15:20:30 -0400491 auto outCall = CallModel::instance().dialingCall(uri);
Edric Milaret2afd2bf2015-07-21 17:12:25 -0400492 outCall->performAction(Call::Action::ACCEPT);
Edric Milareted0b2802015-10-01 15:10:02 -0400493 ui->mainTabMenu->setCurrentIndex(0);
494 ui->smartList->setFocus();
Edric Milaret67007d12015-05-07 09:40:09 -0400495 }
496 }
Edric Milaret67007d12015-05-07 09:40:09 -0400497}
Edric Milaret53f57b62015-05-11 11:02:17 -0400498
Edric Milaret6456baa2015-05-21 12:18:07 -0400499void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500500CallWidget::on_historyList_doubleClicked(const QModelIndex& index)
Edric Milaret53f57b62015-05-11 11:02:17 -0400501{
Edric Milaret12353822015-05-14 14:41:09 -0400502 if (not index.isValid())
503 return;
504
Edric Milaret43f3c1e2015-07-16 17:52:47 -0400505 auto number = index.data(static_cast<int>(Call::Role::ContactMethod)).value<ContactMethod*>();
506 if (number) {
Edric Milareta3e47282015-10-23 15:20:30 -0400507 auto outCall = CallModel::instance().dialingCall(number);
Edric Milaret53f57b62015-05-11 11:02:17 -0400508 outCall->performAction(Call::Action::ACCEPT);
Edric Milareted0b2802015-10-01 15:10:02 -0400509 ui->mainTabMenu->setCurrentIndex(0);
510 ui->smartList->setFocus();
Edric Milaret53f57b62015-05-11 11:02:17 -0400511 }
512}
Edric Milaret6456baa2015-05-21 12:18:07 -0400513
Edric Milaret6b68a482016-02-01 15:23:44 -0500514void CallWidget::callStateToView(Call* value)
515{
516 if (value) {
517 switch (value->state()) {
518 case Call::State::INCOMING:
519 if (not value->account()->isAutoAnswer())
520 ui->stackedWidget->setCurrentWidget(ui->callInvitePage);
521 else
522 ui->stackedWidget->setCurrentWidget(ui->videoPage);
523 break;
524 case Call::State::CURRENT:
Edric Milareta86e3f52016-03-14 16:28:57 -0400525 case Call::State::CONFERENCE:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500526 case Call::State::HOLD:
Edric Milaret6b68a482016-02-01 15:23:44 -0500527 ui->stackedWidget->setCurrentWidget(ui->videoPage);
528 break;
529 case Call::State::OVER:
530 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
531 break;
532 case Call::State::INITIALIZATION:
533 case Call::State::CONNECTED:
534 case Call::State::RINGING:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500535 case Call::State::FAILURE:
Edric Milaret6b68a482016-02-01 15:23:44 -0500536 case Call::State::ERROR:
537 ui->stackedWidget->setCurrentWidget(ui->outboundCallPage);
538 break;
539 default:
Edric Milaret854c6b44d2016-03-08 11:00:48 -0500540 qWarning() << "Call state not handled doing nothing : "
541 << value->toHumanStateName();
Edric Milaret6b68a482016-02-01 15:23:44 -0500542 break;
543 }
Nicolas Jager13745062016-02-12 18:56:40 -0500544 }
Edric Milaret6b68a482016-02-01 15:23:44 -0500545}
546
Edric Milaret6456baa2015-05-21 12:18:07 -0400547void
548CallWidget::setActualCall(Call* value)
549{
550 actualCall_ = value;
Edric Milaret80e0b212015-10-16 10:07:43 -0400551 CallModel::instance().selectCall(value);
552 ui->videoWidget->pushRenderer(value);
Edric Milareta86e3f52016-03-14 16:28:57 -0400553 ui->instantMessagingWidget->setMediaText(actualCall_);
Edric Milaret6b68a482016-02-01 15:23:44 -0500554 callStateToView(value);
Edric Milaret00d34f22016-05-09 16:30:29 -0400555 if (actualCall_) {
556 callChangedConnection_ = connect(actualCall_,
557 SIGNAL(changed()),
558 this,
559 SLOT(callChangedSlot()));
560 } else
561 disconnect(callChangedConnection_);
562
Edric Milaret6456baa2015-05-21 12:18:07 -0400563}
Edric Milaretc7ab5502015-06-15 11:18:02 -0400564
565void
Edric Milareted0b2802015-10-01 15:10:02 -0400566CallWidget::on_cancelButton_clicked()
Edric Milaretd8528fa2015-07-07 14:13:51 -0400567{
568 if (actualCall_)
569 actualCall_->performAction(Call::Action::REFUSE);
570}
Edric Milareted0b2802015-10-01 15:10:02 -0400571
572void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500573CallWidget::on_smartList_doubleClicked(const QModelIndex& index)
Edric Milareted0b2802015-10-01 15:10:02 -0400574{
Edric Milareta3e47282015-10-23 15:20:30 -0400575 auto realIndex = RecentModel::instance().peopleProxy()->mapToSource(index);
576 if (RecentModel::instance().hasActiveCall(realIndex))
Edric Milareted0b2802015-10-01 15:10:02 -0400577 return;
578
579 ContactMethod* m = nullptr;
580 if (auto cm = realIndex.data((int)Call::Role::ContactMethod).value<ContactMethod*>()) {
581 m = cm;
582 } else {
583 if (auto person = realIndex.data((int)Person::Role::Object).value<Person*>()) {
584 m = person->phoneNumbers().first();
585 }
586 }
Edric Milareta3e47282015-10-23 15:20:30 -0400587 if (m && !RecentModel::instance().index(0, 0, realIndex).isValid()) {
588 Call* c = CallModel::instance().dialingCall(m);
Edric Milareted0b2802015-10-01 15:10:02 -0400589 c->performAction(Call::Action::ACCEPT);
Edric Milaret6b68a482016-02-01 15:23:44 -0500590 setActualCall(c);
Edric Milareted0b2802015-10-01 15:10:02 -0400591 }
592}
593
594void
Nicolas Jager97a21b42015-12-03 16:55:45 -0500595CallWidget::smartListSelectionChanged(const QItemSelection& newSel, const QItemSelection& oldSel) {
Edric Milareted0b2802015-10-01 15:10:02 -0400596
597 Q_UNUSED(oldSel)
598
Edric Milaret25236d92016-03-28 09:40:58 -0400599 if (newSel.indexes().empty()) {
600 setActualCall(nullptr);
Edric Milaret6b68a482016-02-01 15:23:44 -0500601 return ui->stackedWidget->setCurrentWidget(ui->welcomePage);
Edric Milaret25236d92016-03-28 09:40:58 -0400602 }
Edric Milaret6b68a482016-02-01 15:23:44 -0500603
Edric Milareted0b2802015-10-01 15:10:02 -0400604 auto newIdx = newSel.indexes().first();
Edric Milaret80e0b212015-10-16 10:07:43 -0400605 if (not newIdx.isValid())
Edric Milareted0b2802015-10-01 15:10:02 -0400606 return;
607
Edric Milaret6b68a482016-02-01 15:23:44 -0500608 auto newIdxCall = RecentModel::instance().getActiveCall(newIdx);
Edric Milareta0ebd062016-01-13 12:18:23 -0500609 if (newIdxCall && newIdxCall != actualCall_) {
Edric Milareted0b2802015-10-01 15:10:02 -0400610 setActualCall(newIdxCall);
Edric Milareta0ebd062016-01-13 12:18:23 -0500611 } else if (newIdxCall == nullptr){
612 setActualCall(nullptr);
Edric Milaretf6f608d2016-02-02 15:06:33 -0500613 ui->instantMessagingWidget->hide();
Edric Milaret6b68a482016-02-01 15:23:44 -0500614 showIMOutOfCall(newIdx);
Edric Milareted0b2802015-10-01 15:10:02 -0400615 } else {
616 setActualCall(nullptr);
Edric Milaretf6f608d2016-02-02 15:06:33 -0500617 ui->instantMessagingWidget->hide();
Edric Milaret7ef617b2016-02-01 15:40:57 -0500618 if (imConnection_)
619 disconnect(imConnection_);
Edric Milareted0b2802015-10-01 15:10:02 -0400620 ui->stackedWidget->setCurrentWidget(ui->welcomePage);
621 }
622}
623
624void
625CallWidget::placeCall()
626{
Nicolas Jager97a21b42015-12-03 16:55:45 -0500627 if (ui->ringContactLineEdit->text().isEmpty())
Edric Milareted0b2802015-10-01 15:10:02 -0400628 return;
Nicolas Jager97a21b42015-12-03 16:55:45 -0500629 Call* c = CallModel::instance().dialingCall(PhoneDirectoryModel::instance().getNumber(ui->ringContactLineEdit->text()));
Edric Milareted0b2802015-10-01 15:10:02 -0400630 c->performAction(Call::Action::ACCEPT);
Nicolas Jager97a21b42015-12-03 16:55:45 -0500631 ui->ringContactLineEdit->clear();
Edric1bed3f92016-05-19 10:24:48 -0400632 ui->callingPhoto->setPixmap(
633 QPixmap::fromImage(
634 GlobalInstances::pixmapManipulator()
635 .callPhoto(c, QSize(130,130)).value<QImage>()));
Edric Milareted0b2802015-10-01 15:10:02 -0400636}
637
638void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500639CallWidget::settingsButtonClicked()
Edric Milareted0b2802015-10-01 15:10:02 -0400640{
641 emit NavigationRequested(ScreenEnum::ConfScreen);
642}
643
644void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500645CallWidget::contactButtonClicked(bool checked)
Edric Milareted0b2802015-10-01 15:10:02 -0400646{
Edric Milareted0b2802015-10-01 15:10:02 -0400647 ui->mainTabMenu->setCurrentIndex(checked ? 1 : 0);
648}
649
650void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500651CallWidget::historicButtonClicked(bool checked)
Edric Milareted0b2802015-10-01 15:10:02 -0400652{
Edric Milareted0b2802015-10-01 15:10:02 -0400653 ui->mainTabMenu->setCurrentIndex(checked ? 2 : 0);
654}
Nicolas Jager97a21b42015-12-03 16:55:45 -0500655
656void
657CallWidget::on_ringContactLineEdit_returnPressed()
658{
Edric Milaret00593d12016-01-19 11:57:46 -0500659 auto cm = PhoneDirectoryModel::instance().getNumber(ui->ringContactLineEdit->text());
660 time_t currentTime;
661 ::time(&currentTime);
662 cm->setLastUsed(currentTime);
Edric Milaret8001f6f2016-01-27 09:55:12 -0500663 ui->ringContactLineEdit->clear();
Nicolas Jager5e845d52016-02-18 13:26:12 -0500664
665 QModelIndex index = RecentModel::instance().getIndex(cm);
666 RecentModel::instance().selectionModel()->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect);
Nicolas Jager97a21b42015-12-03 16:55:45 -0500667}
668
669void
670CallWidget::on_btnCall_clicked()
671{
672 placeCall();
673}
674
675void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500676CallWidget::btnComBarVideoClicked()
Nicolas Jager97a21b42015-12-03 16:55:45 -0500677{
678 if (not highLightedIndex_.isValid())
679 return;
680
681 on_smartList_doubleClicked(highLightedIndex_);
682}
Edric Milaretab12d022015-12-04 16:09:44 -0500683
684void
Edric Milaret6b68a482016-02-01 15:23:44 -0500685CallWidget::showIMOutOfCall(const QModelIndex& nodeIdx)
Edric Milaretab12d022015-12-04 16:09:44 -0500686{
Edric Milaretab12d022015-12-04 16:09:44 -0500687 ui->contactMethodComboBox->clear();
688
Edric Milareta0ebd062016-01-13 12:18:23 -0500689 ui->imNameLabel->setText(QString(tr("Conversation with %1", "%1 is the contact name"))
690 .arg(nodeIdx.data(static_cast<int>(Ring::Role::Name)).toString()));
Edric Milaretab12d022015-12-04 16:09:44 -0500691 auto cmVector = RecentModel::instance().getContactMethods(nodeIdx);
Edric Milareta0ebd062016-01-13 12:18:23 -0500692 ui->contactMethodComboBox->setEnabled(cmVector.size() > 1);
Edric Milaretab12d022015-12-04 16:09:44 -0500693 foreach (const ContactMethod* cm, cmVector) {
Edric Milareta0ebd062016-01-13 12:18:23 -0500694 ui->contactMethodComboBox->addItem(cm->uri());
Edric Milaretab12d022015-12-04 16:09:44 -0500695 }
Edric Milaret6b68a482016-02-01 15:23:44 -0500696 slidePage(ui->messagingPage, true);
Edric Milaret70ae8782016-04-18 16:10:44 -0400697 disconnect(imClickedConnection_);
698 imClickedConnection_ = connect(ui->listMessageView, &QListView::clicked, [this](const QModelIndex& index) {
699 auto urlList = index.data(static_cast<int>(Media::TextRecording::Role::LinkList)).value<QList<QUrl>>();
700 if (urlList.size() == 1)
701 QDesktopServices::openUrl(urlList.at(0));
702 else if (urlList.size()) {
703 //TODO Handle multiple url in one message
704 }
705 });
Edric Milaretab12d022015-12-04 16:09:44 -0500706}
707
708void
Edric Milaret6a785af2016-03-07 15:39:30 -0500709CallWidget::on_sendIMButton_clicked()
Edric Milaretab12d022015-12-04 16:09:44 -0500710{
Edric Milaret6a785af2016-03-07 15:39:30 -0500711 if (ui->imMessageEdit->text().trimmed().isEmpty())
Edric Milaretab12d022015-12-04 16:09:44 -0500712 return;
713 auto number = ui->contactMethodComboBox->currentText();
714 if (auto cm = PhoneDirectoryModel::instance().getNumber(number)) {
715 QMap<QString, QString> msg;
Edric Milaret6a785af2016-03-07 15:39:30 -0500716 msg["text/plain"] = ui->imMessageEdit->text();
Edric Milaretab12d022015-12-04 16:09:44 -0500717 cm->sendOfflineTextMessage(msg);
Edric Milaret6a785af2016-03-07 15:39:30 -0500718 ui->imMessageEdit->clear();
Edric Milaretab12d022015-12-04 16:09:44 -0500719 } else {
720 qWarning() << "Contact Method not found for " << number;
721 }
722}
723
724void
Edric Milaret6a785af2016-03-07 15:39:30 -0500725CallWidget::on_imMessageEdit_returnPressed()
Edric Milaretab12d022015-12-04 16:09:44 -0500726{
Edric Milaret6a785af2016-03-07 15:39:30 -0500727 on_sendIMButton_clicked();
Edric Milaretab12d022015-12-04 16:09:44 -0500728}
729
730void
731CallWidget::on_contactMethodComboBox_currentIndexChanged(const QString& number)
732{
733 auto cm = PhoneDirectoryModel::instance().getNumber(number);
734 if (auto txtRecording = cm->textRecording()) {
735 ui->listMessageView->setModel(txtRecording->instantMessagingModel());
Edric Milaret7ef617b2016-02-01 15:40:57 -0500736 if (imConnection_)
737 disconnect(imConnection_);
Edric Milaretab12d022015-12-04 16:09:44 -0500738 imConnection_ = connect(txtRecording,
Edric Milareta0ebd062016-01-13 12:18:23 -0500739 SIGNAL(messageInserted(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)),
740 this,
741 SLOT(slotAccountMessageReceived(QMap<QString,QString>,ContactMethod*,Media::Media::Direction)));
Edric Milaret4be72022016-01-19 10:24:13 -0500742 auto messagesPresent = txtRecording->instantMessagingModel()->rowCount() > 0;
743 if (messagesPresent) {
744 ui->listMessageView->scrollToBottom();
745 txtRecording->setAllRead();
746 }
747 ui->listMessageView->setVisible(messagesPresent);
748 ui->noMessagesLabel->setVisible(!messagesPresent);
749 if (not messagesPresent) {
Edric Milaret49130472016-01-22 10:39:37 -0500750 imVisibleConnection_ = connect(txtRecording->instantMessagingModel(),
751 &QAbstractItemModel::rowsInserted,
752 [this, txtRecording]() {
753 if (imVisibleConnection_)
754 disconnect(imVisibleConnection_);
755 auto messagesPresent = txtRecording->instantMessagingModel()->rowCount() > 0;
Edric Milaret4be72022016-01-19 10:24:13 -0500756 ui->listMessageView->setVisible(messagesPresent);
757 ui->noMessagesLabel->setVisible(!messagesPresent);
Edric Milaret4be72022016-01-19 10:24:13 -0500758 });
759 }
Edric Milaretab12d022015-12-04 16:09:44 -0500760 }
761}
762
763void
764CallWidget::slotAccountMessageReceived(const QMap<QString,QString> message,
765 ContactMethod* cm,
766 Media::Media::Direction dir)
767{
768 Q_UNUSED(message)
Edric Milaretab12d022015-12-04 16:09:44 -0500769 Q_UNUSED(dir)
770
771 ui->listMessageView->scrollToBottom();
Edric Milaret23fd3fa2016-01-15 15:37:35 -0500772 cm->textRecording()->setAllRead();
Edric Milaretab12d022015-12-04 16:09:44 -0500773}
Edric Milaretfa05d972016-01-13 16:22:04 -0500774
775void
Edric Milaret8001f6f2016-01-27 09:55:12 -0500776CallWidget::on_ringContactLineEdit_textChanged(const QString& text)
Edric Milaretfa05d972016-01-13 16:22:04 -0500777{
778 RecentModel::instance().peopleProxy()->setFilterWildcard(text);
779}
Edric Milareta0ebd062016-01-13 12:18:23 -0500780
Nicolas Jagerca850292016-01-17 14:11:10 -0500781void
782CallWidget::on_imBackButton_clicked()
Edric Milareta0ebd062016-01-13 12:18:23 -0500783{
Edric Milaret6b68a482016-02-01 15:23:44 -0500784 RecentModel::instance().selectionModel()->clear();
785 slidePage(ui->welcomePage);
Nicolas Jagerca850292016-01-17 14:11:10 -0500786}
787
788void
Edric Milaret6b68a482016-02-01 15:23:44 -0500789CallWidget::slidePage(QWidget* widget, bool toRight)
Nicolas Jagerca850292016-01-17 14:11:10 -0500790{
Edric Milaret6b68a482016-02-01 15:23:44 -0500791 short dir = (toRight ? -1 : 1);
Nicolas Jagerca850292016-01-17 14:11:10 -0500792 ui->stackedWidget->setCurrentWidget(widget);
Edric Milaret6b68a482016-02-01 15:23:44 -0500793 pageAnim_->setTargetObject(widget);
794 pageAnim_->setDuration(animDuration_);
795 pageAnim_->setStartValue(QPoint(widget->width() * dir, widget->y()));
796 pageAnim_->setEndValue(QPoint(widget->x(), widget->y()));
797 pageAnim_->setEasingCurve(QEasingCurve::OutQuad);
798 pageAnim_->start();
Nicolas Jagerca850292016-01-17 14:11:10 -0500799}
800
801void
Edric Milaret6b68a482016-02-01 15:23:44 -0500802CallWidget::on_smartList_clicked(const QModelIndex& index)
Nicolas Jagerca850292016-01-17 14:11:10 -0500803{
Edric Milaret6b68a482016-02-01 15:23:44 -0500804 RecentModel::instance().selectionModel()->setCurrentIndex(
805 RecentModel::instance().peopleProxy()->mapToSource(index),
806 QItemSelectionModel::ClearAndSelect);
Edric Milareta0ebd062016-01-13 12:18:23 -0500807}
Edric Milaret7cf39e22016-02-02 12:44:03 -0500808
809void
810CallWidget::on_copyCMButton_clicked()
811{
812 auto text = ui->contactMethodComboBox->currentText();
813 QApplication::clipboard()->setText(text);
814}
Edric Milaret4097d2f2016-02-09 14:41:50 -0500815
816void
Edric Milaret1e598592016-09-02 10:10:01 -0400817CallWidget::on_qrButton_toggled(bool checked)
818{
819 ui->qrLabel->setVisible(checked);
820}
821
822void
Edric Milaret4097d2f2016-02-09 14:41:50 -0500823CallWidget::on_shareButton_clicked()
824{
Edric Milaret1e598592016-09-02 10:10:01 -0400825 Utils::InvokeMailto(tr("Contact me on Ring"), tr("My RingId is : ") + ui->ringIdLabel->text());
Edric Milaret4097d2f2016-02-09 14:41:50 -0500826}