blob: c18f75321e3430f655007f03d6031491d2825dbb [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
2 * Copyright (C) 2011-2015 by Savoir-Faire Linux *
3 * 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 "accountdetails.h"
20#include "ui_accountdetails.h"
21
22#include <QSortFilterProxyModel>
23
24#include "accountmodel.h"
25#include "account.h"
26#include "accountdetails.h"
27#include "audio/codecmodel.h"
28
29AccountDetails::AccountDetails(QWidget *parent) :
30 QWidget(parent),
31 ui(new Ui::AccountDetails),
32 codecModel_(nullptr),
33 codecModelModified(false)
34{
35 ui->setupUi(this);
36
37 ui->audioCodecView->setColumnCount(4);
38 QStringList audioHeader {"Enabled", "Name", "Bitrate", "Samplerate"};
39 ui->audioCodecView->setHorizontalHeaderLabels(audioHeader);
40 ui->audioCodecView->verticalHeader()->hide();
41 ui->audioCodecView->setSelectionBehavior(QAbstractItemView::SelectRows);
42 ui->audioCodecView->setShowGrid(false);
43
44 ui->videoCodecView->setColumnCount(3);
45 QStringList videoHeader {"Enabled", "Name", "Bitrate"};
46 ui->videoCodecView->setHorizontalHeaderLabels(videoHeader);
47 ui->videoCodecView->verticalHeader()->hide();
48 ui->videoCodecView->setSelectionBehavior(QAbstractItemView::SelectRows);
49 ui->videoCodecView->setShowGrid(false);
50
51 ui->hashValue->setAlignment(Qt::AlignCenter);
52
53 connect(ui->audioCodecView, SIGNAL(cellChanged(int,int)),
54 this, SLOT(audio_codec_checked(int, int)));
55 connect(ui->videoCodecView, SIGNAL(cellChanged(int,int)),
56 this, SLOT(video_codec_checked(int,int)));
57 connect(ui->videoEnabledCheckBox, SIGNAL(toggled(bool)),
58 this, SLOT(setVideoEnabled(bool)));
59 connect(ui->autoAnswerCheckBox, SIGNAL(toggled(bool)),
60 this, SLOT(setAutoAnswer(bool)));
61 connect(ui->aliasValue, SIGNAL(editingFinished()),
62 this, SLOT(aliasChanged()));
63 connect(ui->bootstrapLineEdit, SIGNAL(editingFinished()),
64 this, SLOT(bootstrapChanged()));
65}
66
67AccountDetails::~AccountDetails()
68{
69 delete ui;
70}
71
72void
73AccountDetails::reloadCodec(CodecType type)
74{
75 auto selectedIdx = codecModel_->selectionModel()->currentIndex();
76
77 if (type != CodecType::VIDEO) {
78 ui->audioCodecView->clearContents();
79 ui->audioCodecView->setRowCount(codecModel_->audioCodecs()->rowCount());
80
81 for (int i = 0; i < codecModel_->audioCodecs()->rowCount(); i++) {
82
83 auto idx = codecModel_->audioCodecs()->index(i, 0);
84
85 auto checkBoxItem = new QTableWidgetItem();
86 checkBoxItem->setCheckState(
87 codecModel_->audioCodecs()->data(idx ,
88 Qt::CheckStateRole).toBool()
89 ? Qt::Checked : Qt::Unchecked);
90 ui->audioCodecView->setItem(i, 0, checkBoxItem);
91
92 auto item = new QTableWidgetItem(
93 codecModel_->audioCodecs()->data(idx).toString());
94 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
95 ui->audioCodecView->setItem(i, 1, item);
96
97 item = new QTableWidgetItem(
98 codecModel_->audioCodecs()->
99 data(idx,CodecModel::Role::BITRATE).toString());
100 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
101 ui->audioCodecView->setItem(i, 2, item);
102
103 item = new QTableWidgetItem(
104 codecModel_->audioCodecs()->
105 data(idx, CodecModel::Role::SAMPLERATE).toString());
106 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
107 ui->audioCodecView->setItem(i, 3, item);
108
109 if (codecModel_->audioCodecs()->mapToSource(idx) == selectedIdx) {
110 ui->audioCodecView->setCurrentCell(i, 0);
111 }
112 }
113 }
114 if (type != CodecType::AUDIO) {
115 ui->videoCodecView->clearContents();
116 ui->videoCodecView->setRowCount(codecModel_->videoCodecs()->rowCount());
117 for (int i = 0; i < codecModel_->videoCodecs()->rowCount(); i++) {
118
119 auto idx = codecModel_->videoCodecs()->index(i, 0);
120
121 auto checkBoxItem = new QTableWidgetItem();
122 checkBoxItem->setCheckState(codecModel_->videoCodecs()->
123 data(idx , Qt::CheckStateRole).toBool()
124 ? Qt::Checked : Qt::Unchecked);
125 ui->videoCodecView->setItem(i, 0, checkBoxItem);
126
127 auto item = new QTableWidgetItem(
128 codecModel_->videoCodecs()->data(idx).toString());
129 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
130 ui->videoCodecView->setItem(i, 1, item);
131
132 item = new QTableWidgetItem(codecModel_->videoCodecs()->
133 data(idx,CodecModel::Role::BITRATE).toString());
134 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
135 ui->videoCodecView->setItem(i, 2, item);
136
137 if (codecModel_->videoCodecs()->mapToSource(idx) == selectedIdx) {
138 ui->videoCodecView->setCurrentCell(i, 0);
139 }
140 }
141 }
142}
143
144void
145AccountDetails::setAccount(Account* currentAccount) {
146
147 currentAccount_ = currentAccount;
148
149 if (codecModel_ && codecModelModified)
150 codecModel_->save();
151
152 codecModel_ = currentAccount->codecModel();
153
154 //FIX ME : Reorganize this in group
155 ui->hashValue->hide();
156 ui->hashLabel->hide();
157 ui->aliasValue->hide();
158 ui->aliasLabel->hide();
159 ui->bootstrapLabel->hide();
160 ui->bootstrapLineEdit->hide();
161 ui->hostnameLabel->hide();
162 ui->hostnameEdit->hide();
163 ui->usernameEdit->hide();
164 ui->usernameLabel->hide();
165 ui->passwordEdit->hide();
166 ui->passwordLabel->hide();
167 ui->proxyEdit->hide();
168 ui->proxyLabel->hide();
169 ui->voicemailLabel->hide();
170 ui->voicemailEdit->hide();
171
172 switch (currentAccount_->protocol()) {
173 case Account::Protocol::SIP:
174 if (currentAccount_ != AccountModel::instance()->ip2ip()) {
175 ui->typeValueLabel->setText("SIP");
176 ui->aliasValue->setText(currentAccount_->alias());
177 ui->hostnameEdit->setText(currentAccount_->hostname());
178 ui->usernameEdit->setText(currentAccount_->username());
179 ui->passwordEdit->setText(currentAccount_->password());
180 ui->proxyEdit->setText(currentAccount_->proxy());
181 ui->voicemailEdit->setText(currentAccount_->mailbox());
182
183 ui->aliasLabel->show();
184 ui->aliasValue->show();
185 ui->hostnameLabel->show();
186 ui->hostnameEdit->show();
187 ui->usernameEdit->show();
188 ui->usernameLabel->show();
189 ui->passwordEdit->show();
190 ui->passwordLabel->show();
191 ui->proxyEdit->show();
192 ui->proxyLabel->show();
193 ui->voicemailLabel->show();
194 ui->voicemailEdit->show();
195 } else {
196 ui->typeValueLabel->setText("IP2IP");
197 }
198 break;
199 case Account::Protocol::IAX:
200 ui->typeValueLabel->setText("IAX");
201 break;
202 case Account::Protocol::RING:
203 ui->typeValueLabel->setText("RING");
204 ui->aliasValue->setText(currentAccount_->alias());
205 ui->hashValue->setText(currentAccount_->username());
206 ui->bootstrapLineEdit->setText(currentAccount_->hostname());
207 ui->hashValue->show();
208 ui->hashLabel->show();
209 ui->aliasLabel->show();
210 ui->aliasValue->show();
211 ui->bootstrapLabel->show();
212 ui->bootstrapLineEdit->show();
213 break;
214 default:
215 break;
216 }
217
218 reloadCodec();
219
220 ui->videoEnabledCheckBox->setChecked(currentAccount_->isVideoEnabled());
221 ui->autoAnswerCheckBox->setChecked(currentAccount_->isAutoAnswer());
222}
223
224void
225AccountDetails::audio_codec_checked(int row, int column) {
226 if (column != 0)
227 return;
228 auto item = ui->audioCodecView->item(row, 0);
229 auto idx = codecModel_->audioCodecs()->index(row, 0);
230 codecModel_->audioCodecs()->setData(idx, item->checkState(),
231 Qt::CheckStateRole);
232 codecModelModified = true;
233}
234
235void
236AccountDetails::video_codec_checked(int row, int column) {
237 if (column != 0)
238 return;
239 auto item = ui->videoCodecView->item(row, 0);
240 auto idx = codecModel_->videoCodecs()->index(row, 0);
241 codecModel_->videoCodecs()->setData(idx, item->checkState(),
242 Qt::CheckStateRole);
243 codecModelModified = true;
244}
245
246void
247AccountDetails::setVideoEnabled(bool enabled) {
248 currentAccount_->setVideoEnabled(enabled);
249}
250
251void
252AccountDetails::setAutoAnswer(bool enabled) {
253 currentAccount_->setAutoAnswer(enabled);
254}
255
256void
257AccountDetails::aliasChanged() {
258 currentAccount_->setAlias(ui->aliasValue->text());
259}
260
261void
262AccountDetails::bootstrapChanged() {
263 currentAccount_->setHostname(ui->bootstrapLineEdit->text());
264}
265
266void
267AccountDetails::on_upAudioButton_clicked()
268{
269 codecModel_->moveUp();
270 reloadCodec(CodecType::AUDIO);
271 codecModelModified = true;
272}
273
274void
275AccountDetails::on_downAudioButton_clicked()
276{
277 codecModel_->moveDown();
278 reloadCodec(CodecType::AUDIO);
279 codecModelModified = true;
280}
281
282void
283AccountDetails::on_upVideoButton_clicked()
284{
285 codecModel_->moveUp();
286 reloadCodec(CodecType::VIDEO);
287 codecModelModified = true;
288}
289
290void
291AccountDetails::on_downVideoButton_clicked()
292{
293 codecModel_->moveDown();
294 reloadCodec(CodecType::VIDEO);
295 codecModelModified = true;
296}
297
298void
299AccountDetails::on_audioCodecView_itemSelectionChanged()
300{
301 int row = ui->audioCodecView->currentRow();
302 auto idx = codecModel_->audioCodecs()->index(row, 0);
303 auto srcIdx = codecModel_->audioCodecs()->mapToSource(idx);
304 codecModel_->selectionModel()->setCurrentIndex(srcIdx,
305 QItemSelectionModel::Select);
306}
307
308void
309AccountDetails::on_videoCodecView_itemSelectionChanged()
310{
311 int row = ui->videoCodecView->currentRow();
312 auto idx = codecModel_->videoCodecs()->index(row, 0);
313 auto srcIdx = codecModel_->videoCodecs()->mapToSource(idx);
314 codecModel_->selectionModel()->setCurrentIndex(srcIdx,
315 QItemSelectionModel::Select);
316}
317
318void
319AccountDetails::save() {
320 if (codecModelModified)
321 codecModel_->save();
322}
323
324void
325AccountDetails::on_hostnameEdit_editingFinished()
326{
327 currentAccount_->setHostname(ui->hostnameEdit->text());
328}
329
330void
331AccountDetails::on_usernameEdit_editingFinished()
332{
333 currentAccount_->setUsername(ui->usernameEdit->text());
334}
335
336void
337AccountDetails::on_passwordEdit_editingFinished()
338{
339 currentAccount_->setPassword(ui->passwordEdit->text());
340}
341
342void
343AccountDetails::on_proxyEdit_editingFinished()
344{
345 currentAccount_->setProxy(ui->proxyEdit->text());
346}
347
348void
349AccountDetails::on_voicemailEdit_editingFinished()
350{
351 currentAccount_->setMailbox(ui->voicemailEdit->text());
352}
353
354void
355AccountDetails::on_tabWidget_currentChanged(int index)
356{
357 if (index == 1) {
358 ui->audioCodecView->setCurrentItem(ui->audioCodecView->item(0, 0));
359 } else if (index == 2) {
360 ui->videoCodecView->setCurrentItem(ui->videoCodecView->item(0, 0));
361 }
362}