blob: 9e30be748677c81c00ff1b1a2766818abbbe8a3c [file] [log] [blame]
Edric Milaret029b95a2015-06-09 09:51:44 -04001/***************************************************************************
Anthony LĂ©onard2fde81d2017-04-17 10:06:55 -04002 * Copyright (C) 2015-2017 by Savoir-faire Linux *
Edric Milaret029b95a2015-06-09 09:51:44 -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 "videooverlay.h"
20#include "ui_videooverlay.h"
21
Edric Milaret31484f12016-02-02 14:26:27 -050022#include "contactpicker.h"
23
Edric Milaret029b95a2015-06-09 09:51:44 -040024#include "callmodel.h"
Edric Milaret31484f12016-02-02 14:26:27 -050025#include "contactmethod.h"
26#include "person.h"
Edric Milaret029b95a2015-06-09 09:51:44 -040027
Edric Milaret80e0b212015-10-16 10:07:43 -040028VideoOverlay::VideoOverlay(QWidget* parent) :
Edric Milaret029b95a2015-06-09 09:51:44 -040029 QWidget(parent),
Edric Milaret5cbf2b62015-07-09 11:36:53 -040030 ui(new Ui::VideoOverlay),
Edric Milaret864a2052016-01-14 15:45:03 -050031 transferDialog_(new CallUtilsDialog()),
32 qualityDialog_(new QualityDialog())
Edric Milaret029b95a2015-06-09 09:51:44 -040033{
34 ui->setupUi(this);
35
Edric Milaret3aca8e32015-06-12 10:01:40 -040036 ui->chatButton->setCheckable(true);
37
Edric Milareta3e47282015-10-23 15:20:30 -040038 actionModel_ = CallModel::instance().userActionModel();
Edric Milaret029b95a2015-06-09 09:51:44 -040039 setAttribute(Qt::WA_NoSystemBackground);
Edric Milaret5927d042015-06-15 12:45:29 -040040
Nicolas Jager97a21b42015-12-03 16:55:45 -050041 ui->noMicButton->setCheckable(true);
Edric Milaret5927d042015-06-15 12:45:29 -040042
43 connect(actionModel_,&UserActionModel::dataChanged, [=](const QModelIndex& tl, const QModelIndex& br) {
44 const int first(tl.row()),last(br.row());
45 for(int i = first; i <= last;i++) {
46 const QModelIndex& idx = actionModel_->index(i,0);
47 switch (idx.data(UserActionModel::Role::ACTION).value<UserActionModel::Action>()) {
Nicolas Jager97a21b42015-12-03 16:55:45 -050048 case UserActionModel::Action::MUTE_AUDIO:
49 ui->noMicButton->setChecked(idx.data(Qt::CheckStateRole).value<bool>());
50 ui->noMicButton->setEnabled(idx.flags() & Qt::ItemIsEnabled);
Edric Milaret5927d042015-06-15 12:45:29 -040051 break;
52 case UserActionModel::Action::MUTE_VIDEO:
Nicolas Jager97a21b42015-12-03 16:55:45 -050053 ui->noVideoButton->setChecked(idx.data(Qt::CheckStateRole).value<bool>());
54 ui->noVideoButton->setEnabled(idx.flags() & Qt::ItemIsEnabled);
Edric Milaret5927d042015-06-15 12:45:29 -040055 break;
Edric Milaret80e0b212015-10-16 10:07:43 -040056 case UserActionModel::Action::HOLD:
57 ui->holdButton->setChecked(idx.data(Qt::CheckStateRole).value<bool>());
58 ui->holdButton->setEnabled(idx.flags() & Qt::ItemIsEnabled);
Edric Milaret31484f12016-02-02 14:26:27 -050059 ui->onHoldLabel->setVisible(idx.data(Qt::CheckStateRole).value<bool>());
Edric Milaret80e0b212015-10-16 10:07:43 -040060 break;
Edric Milareta5fe70f2016-02-05 15:03:31 -050061 case UserActionModel::Action::RECORD:
62 ui->recButton->setChecked(idx.data(Qt::CheckStateRole).value<bool>());
63 ui->recButton->setEnabled(idx.flags() & Qt::ItemIsEnabled);
Edric Milaret5927d042015-06-15 12:45:29 -040064 default:
65 break;
66 }
67 }
68 });
69
Edric Milaret80e0b212015-10-16 10:07:43 -040070 connect(CallModel::instance().selectionModel(), &QItemSelectionModel::currentChanged, [=](const QModelIndex &current, const QModelIndex &previous) {
71 Q_UNUSED(previous)
72 Call* c = current.data(static_cast<int>(Call::Role::Object)).value<Call*>();
73 if (c) {
74 if (c->hasParentCall()) {
75 ui->holdButton->hide();
Edric Milaret80e0b212015-10-16 10:07:43 -040076 ui->transferButton->hide();
77 ui->addPersonButton->hide();
78 ui->chatButton->hide();
79
80 ui->joinButton->show();
81 } else {
82 ui->holdButton->show();
Edric Milaret80e0b212015-10-16 10:07:43 -040083 ui->transferButton->show();
84 ui->addPersonButton->show();
85 ui->chatButton->show();
86
87 ui->joinButton->hide();
88 }
Edric Milaret31484f12016-02-02 14:26:27 -050089 if (auto contactMethod = c->peerContactMethod())
90 ui->addToContactButton->setVisible(not contactMethod->contact()
91 || contactMethod->contact()->isPlaceHolder());
Edric Milaret80e0b212015-10-16 10:07:43 -040092 }
93 });
Nicolas Jager0a9fc602016-03-11 18:35:42 -050094
95 transferDialog_->setAttribute(Qt::WA_TranslucentBackground);
96 connect(transferDialog_, &CallUtilsDialog::isVisible, [this] (bool visible) {
97 dialogVisible_ = visible;
98 });
99
100 qualityDialog_->setAttribute(Qt::WA_TranslucentBackground);
101 connect(qualityDialog_, &QualityDialog::isVisible, [this] (bool visible) {
102 dialogVisible_ = visible;
103 });
Edric Milaret029b95a2015-06-09 09:51:44 -0400104}
105
106VideoOverlay::~VideoOverlay()
107{
108 delete ui;
Edric Milaret5cbf2b62015-07-09 11:36:53 -0400109 delete transferDialog_;
Edric Milaret864a2052016-01-14 15:45:03 -0500110 delete qualityDialog_;
Edric Milaret029b95a2015-06-09 09:51:44 -0400111}
112
113void
114VideoOverlay::setName(const QString& name)
115{
116 ui->nameLabel->setText(name);
117}
118
119void
120VideoOverlay::setTime(const QString& time)
121{
122 ui->timerLabel->setText(time);
123}
124
125void
Edric Milaret029b95a2015-06-09 09:51:44 -0400126VideoOverlay::on_hangupButton_clicked()
127{
128 actionModel_->execute(UserActionModel::Action::HANGUP);
Edric Milaret3aca8e32015-06-12 10:01:40 -0400129 ui->chatButton->setChecked(false);
Edric Milaret029b95a2015-06-09 09:51:44 -0400130}
131
132void
133VideoOverlay::on_chatButton_toggled(bool checked)
134{
Edric Milaret3aca8e32015-06-12 10:01:40 -0400135 emit setChatVisibility(checked);
Edric Milaret029b95a2015-06-09 09:51:44 -0400136}
137
Edric Milaret5cbf2b62015-07-09 11:36:53 -0400138void
Edric Milaret80e0b212015-10-16 10:07:43 -0400139VideoOverlay::on_transferButton_clicked()
Edric Milaret5cbf2b62015-07-09 11:36:53 -0400140{
Edric Milaret80e0b212015-10-16 10:07:43 -0400141 transferDialog_->setConfMode(false);
Edric Milaret5cbf2b62015-07-09 11:36:53 -0400142 auto pos = this->mapToGlobal(ui->transferButton->pos());
Edric Milaret80e0b212015-10-16 10:07:43 -0400143 transferDialog_->move(pos.x()
144 - transferDialog_->size().width()/2
145 + ui->transferButton->size().width()/2,
146 pos.y() - (transferDialog_->height()));
147 transferDialog_->show();
148}
149
150void
151VideoOverlay::on_addPersonButton_clicked()
152{
153 transferDialog_->setConfMode(true);
154 auto pos = this->mapToGlobal(ui->addPersonButton->pos());
155 transferDialog_->move(pos.x()
156 - transferDialog_->size().width()/2
157 + ui->addPersonButton->size().width()/2,
158 pos.y() - (transferDialog_->height()));
159 transferDialog_->show();
160}
161
162void
163VideoOverlay::on_holdButton_clicked()
164{
165 actionModel_->execute(UserActionModel::Action::HOLD);
166}
167
Nicolas Jager97a21b42015-12-03 16:55:45 -0500168void
169VideoOverlay::on_noMicButton_clicked()
170{
171 actionModel_->execute(UserActionModel::Action::MUTE_AUDIO);
172}
173
174void
175VideoOverlay::on_noVideoButton_clicked()
176{
177 actionModel_->execute(UserActionModel::Action::MUTE_VIDEO);
178}
179
180
Edric Milaret80e0b212015-10-16 10:07:43 -0400181void VideoOverlay::on_joinButton_clicked()
182{
183 CallModel::instance().selectedCall()->joinToParent();
Edric Milaret5cbf2b62015-07-09 11:36:53 -0400184}
Edric Milaret864a2052016-01-14 15:45:03 -0500185
186void
187VideoOverlay::on_qualityButton_clicked()
188{
189 auto pos = this->mapToGlobal(ui->qualityButton->pos());
190 qualityDialog_->move(pos.x()
191 - qualityDialog_->size().width()/2
192 + ui->qualityButton->size().width()/2,
193 pos.y() - (qualityDialog_->height()));
194 qualityDialog_->show();
195}
Edric Milaret31484f12016-02-02 14:26:27 -0500196
197void
198VideoOverlay::on_addToContactButton_clicked()
199{
200 QPoint globalPos = mapToGlobal(ui->addToContactButton->pos());
201 if (auto contactMethod = CallModel::instance().selectedCall()->peerContactMethod()) {
202 ContactPicker contactPicker(contactMethod);
203 contactPicker.move(globalPos.x(),
204 globalPos.y() + ui->addToContactButton->height());
205 contactPicker.exec();
206 }
207}
Edric Milareta5fe70f2016-02-05 15:03:31 -0500208
209void
210VideoOverlay::on_recButton_clicked()
211{
212 actionModel_->execute(UserActionModel::Action::RECORD);
213}
Olivier SOLDANO2bcdfd72017-05-02 14:37:19 -0400214
215void VideoOverlay::on_videoBackBtn_clicked()
216{
217 emit videoBackBtnClicked();
218}
219
220void VideoOverlay::on_videoCfgBtn_clicked()
221{
222 emit videoCfgBtnClicked();
223}