first Qt-based client version

Refs #68886

Change-Id: I69b44506dc52a18c47f102466472c68fbf08600b
diff --git a/accountdetails.cpp b/accountdetails.cpp
new file mode 100644
index 0000000..c18f753
--- /dev/null
+++ b/accountdetails.cpp
@@ -0,0 +1,362 @@
+/***************************************************************************
+ * Copyright (C) 2011-2015 by Savoir-Faire Linux                           *
+ * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License as published by    *
+ * the Free Software Foundation; either version 3 of the License, or       *
+ * (at your option) any later version.                                     *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License       *
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.   *
+ **************************************************************************/
+
+#include "accountdetails.h"
+#include "ui_accountdetails.h"
+
+#include <QSortFilterProxyModel>
+
+#include "accountmodel.h"
+#include "account.h"
+#include "accountdetails.h"
+#include "audio/codecmodel.h"
+
+AccountDetails::AccountDetails(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::AccountDetails),
+    codecModel_(nullptr),
+    codecModelModified(false)
+{
+    ui->setupUi(this);
+
+    ui->audioCodecView->setColumnCount(4);
+    QStringList audioHeader {"Enabled", "Name", "Bitrate", "Samplerate"};
+    ui->audioCodecView->setHorizontalHeaderLabels(audioHeader);
+    ui->audioCodecView->verticalHeader()->hide();
+    ui->audioCodecView->setSelectionBehavior(QAbstractItemView::SelectRows);
+    ui->audioCodecView->setShowGrid(false);
+
+    ui->videoCodecView->setColumnCount(3);
+    QStringList videoHeader {"Enabled", "Name", "Bitrate"};
+    ui->videoCodecView->setHorizontalHeaderLabels(videoHeader);
+    ui->videoCodecView->verticalHeader()->hide();
+    ui->videoCodecView->setSelectionBehavior(QAbstractItemView::SelectRows);
+    ui->videoCodecView->setShowGrid(false);
+
+    ui->hashValue->setAlignment(Qt::AlignCenter);
+
+    connect(ui->audioCodecView, SIGNAL(cellChanged(int,int)),
+            this, SLOT(audio_codec_checked(int, int)));
+    connect(ui->videoCodecView, SIGNAL(cellChanged(int,int)),
+            this, SLOT(video_codec_checked(int,int)));
+    connect(ui->videoEnabledCheckBox, SIGNAL(toggled(bool)),
+            this, SLOT(setVideoEnabled(bool)));
+    connect(ui->autoAnswerCheckBox, SIGNAL(toggled(bool)),
+            this, SLOT(setAutoAnswer(bool)));
+    connect(ui->aliasValue, SIGNAL(editingFinished()),
+            this, SLOT(aliasChanged()));
+    connect(ui->bootstrapLineEdit, SIGNAL(editingFinished()),
+            this, SLOT(bootstrapChanged()));
+}
+
+AccountDetails::~AccountDetails()
+{
+    delete ui;
+}
+
+void
+AccountDetails::reloadCodec(CodecType type)
+{
+    auto selectedIdx = codecModel_->selectionModel()->currentIndex();
+
+    if (type != CodecType::VIDEO) {
+        ui->audioCodecView->clearContents();
+        ui->audioCodecView->setRowCount(codecModel_->audioCodecs()->rowCount());
+
+        for (int i = 0; i < codecModel_->audioCodecs()->rowCount(); i++) {
+
+            auto idx = codecModel_->audioCodecs()->index(i, 0);
+
+            auto checkBoxItem = new QTableWidgetItem();
+            checkBoxItem->setCheckState(
+                        codecModel_->audioCodecs()->data(idx ,
+                                                         Qt::CheckStateRole).toBool()
+                        ? Qt::Checked : Qt::Unchecked);
+            ui->audioCodecView->setItem(i, 0, checkBoxItem);
+
+            auto item = new QTableWidgetItem(
+                        codecModel_->audioCodecs()->data(idx).toString());
+            item->setFlags(item->flags() ^ Qt::ItemIsEditable);
+            ui->audioCodecView->setItem(i, 1, item);
+
+            item = new QTableWidgetItem(
+                        codecModel_->audioCodecs()->
+                        data(idx,CodecModel::Role::BITRATE).toString());
+            item->setFlags(item->flags() ^ Qt::ItemIsEditable);
+            ui->audioCodecView->setItem(i, 2, item);
+
+            item = new QTableWidgetItem(
+                        codecModel_->audioCodecs()->
+                        data(idx, CodecModel::Role::SAMPLERATE).toString());
+            item->setFlags(item->flags() ^ Qt::ItemIsEditable);
+            ui->audioCodecView->setItem(i, 3, item);
+
+            if (codecModel_->audioCodecs()->mapToSource(idx) == selectedIdx) {
+                ui->audioCodecView->setCurrentCell(i, 0);
+            }
+        }
+    }
+    if (type != CodecType::AUDIO) {
+        ui->videoCodecView->clearContents();
+        ui->videoCodecView->setRowCount(codecModel_->videoCodecs()->rowCount());
+        for (int i = 0; i < codecModel_->videoCodecs()->rowCount(); i++) {
+
+            auto idx = codecModel_->videoCodecs()->index(i, 0);
+
+            auto checkBoxItem = new QTableWidgetItem();
+            checkBoxItem->setCheckState(codecModel_->videoCodecs()->
+                                        data(idx , Qt::CheckStateRole).toBool()
+                                        ? Qt::Checked : Qt::Unchecked);
+            ui->videoCodecView->setItem(i, 0, checkBoxItem);
+
+            auto item = new QTableWidgetItem(
+                        codecModel_->videoCodecs()->data(idx).toString());
+            item->setFlags(item->flags() ^ Qt::ItemIsEditable);
+            ui->videoCodecView->setItem(i, 1, item);
+
+            item = new QTableWidgetItem(codecModel_->videoCodecs()->
+                                        data(idx,CodecModel::Role::BITRATE).toString());
+            item->setFlags(item->flags() ^ Qt::ItemIsEditable);
+            ui->videoCodecView->setItem(i, 2, item);
+
+            if (codecModel_->videoCodecs()->mapToSource(idx) == selectedIdx) {
+                ui->videoCodecView->setCurrentCell(i, 0);
+            }
+        }
+    }
+}
+
+void
+AccountDetails::setAccount(Account* currentAccount) {
+
+    currentAccount_ = currentAccount;
+
+    if (codecModel_ && codecModelModified)
+        codecModel_->save();
+
+    codecModel_ = currentAccount->codecModel();
+
+    //FIX ME : Reorganize this in group
+    ui->hashValue->hide();
+    ui->hashLabel->hide();
+    ui->aliasValue->hide();
+    ui->aliasLabel->hide();
+    ui->bootstrapLabel->hide();
+    ui->bootstrapLineEdit->hide();
+    ui->hostnameLabel->hide();
+    ui->hostnameEdit->hide();
+    ui->usernameEdit->hide();
+    ui->usernameLabel->hide();
+    ui->passwordEdit->hide();
+    ui->passwordLabel->hide();
+    ui->proxyEdit->hide();
+    ui->proxyLabel->hide();
+    ui->voicemailLabel->hide();
+    ui->voicemailEdit->hide();
+
+    switch (currentAccount_->protocol()) {
+    case Account::Protocol::SIP:
+        if (currentAccount_ != AccountModel::instance()->ip2ip()) {
+            ui->typeValueLabel->setText("SIP");
+            ui->aliasValue->setText(currentAccount_->alias());
+            ui->hostnameEdit->setText(currentAccount_->hostname());
+            ui->usernameEdit->setText(currentAccount_->username());
+            ui->passwordEdit->setText(currentAccount_->password());
+            ui->proxyEdit->setText(currentAccount_->proxy());
+            ui->voicemailEdit->setText(currentAccount_->mailbox());
+
+            ui->aliasLabel->show();
+            ui->aliasValue->show();
+            ui->hostnameLabel->show();
+            ui->hostnameEdit->show();
+            ui->usernameEdit->show();
+            ui->usernameLabel->show();
+            ui->passwordEdit->show();
+            ui->passwordLabel->show();
+            ui->proxyEdit->show();
+            ui->proxyLabel->show();
+            ui->voicemailLabel->show();
+            ui->voicemailEdit->show();
+        } else {
+            ui->typeValueLabel->setText("IP2IP");
+        }
+        break;
+    case Account::Protocol::IAX:
+        ui->typeValueLabel->setText("IAX");
+        break;
+    case Account::Protocol::RING:
+        ui->typeValueLabel->setText("RING");
+        ui->aliasValue->setText(currentAccount_->alias());
+        ui->hashValue->setText(currentAccount_->username());
+        ui->bootstrapLineEdit->setText(currentAccount_->hostname());
+        ui->hashValue->show();
+        ui->hashLabel->show();
+        ui->aliasLabel->show();
+        ui->aliasValue->show();
+        ui->bootstrapLabel->show();
+        ui->bootstrapLineEdit->show();
+        break;
+    default:
+        break;
+    }
+
+    reloadCodec();
+
+    ui->videoEnabledCheckBox->setChecked(currentAccount_->isVideoEnabled());
+    ui->autoAnswerCheckBox->setChecked(currentAccount_->isAutoAnswer());
+}
+
+void
+AccountDetails::audio_codec_checked(int row, int column) {
+    if (column != 0)
+        return;
+    auto item = ui->audioCodecView->item(row, 0);
+    auto idx = codecModel_->audioCodecs()->index(row, 0);
+    codecModel_->audioCodecs()->setData(idx, item->checkState(),
+                                        Qt::CheckStateRole);
+    codecModelModified = true;
+}
+
+void
+AccountDetails::video_codec_checked(int row, int column) {
+    if (column != 0)
+        return;
+    auto item = ui->videoCodecView->item(row, 0);
+    auto idx = codecModel_->videoCodecs()->index(row, 0);
+    codecModel_->videoCodecs()->setData(idx, item->checkState(),
+                                        Qt::CheckStateRole);
+    codecModelModified = true;
+}
+
+void
+AccountDetails::setVideoEnabled(bool enabled) {
+    currentAccount_->setVideoEnabled(enabled);
+}
+
+void
+AccountDetails::setAutoAnswer(bool enabled) {
+    currentAccount_->setAutoAnswer(enabled);
+}
+
+void
+AccountDetails::aliasChanged() {
+    currentAccount_->setAlias(ui->aliasValue->text());
+}
+
+void
+AccountDetails::bootstrapChanged() {
+    currentAccount_->setHostname(ui->bootstrapLineEdit->text());
+}
+
+void
+AccountDetails::on_upAudioButton_clicked()
+{
+    codecModel_->moveUp();
+    reloadCodec(CodecType::AUDIO);
+    codecModelModified = true;
+}
+
+void
+AccountDetails::on_downAudioButton_clicked()
+{
+    codecModel_->moveDown();
+    reloadCodec(CodecType::AUDIO);
+    codecModelModified = true;
+}
+
+void
+AccountDetails::on_upVideoButton_clicked()
+{
+    codecModel_->moveUp();
+    reloadCodec(CodecType::VIDEO);
+    codecModelModified = true;
+}
+
+void
+AccountDetails::on_downVideoButton_clicked()
+{
+    codecModel_->moveDown();
+    reloadCodec(CodecType::VIDEO);
+    codecModelModified = true;
+}
+
+void
+AccountDetails::on_audioCodecView_itemSelectionChanged()
+{
+    int row = ui->audioCodecView->currentRow();
+    auto idx = codecModel_->audioCodecs()->index(row, 0);
+    auto srcIdx = codecModel_->audioCodecs()->mapToSource(idx);
+    codecModel_->selectionModel()->setCurrentIndex(srcIdx,
+                                                   QItemSelectionModel::Select);
+}
+
+void
+AccountDetails::on_videoCodecView_itemSelectionChanged()
+{
+    int row = ui->videoCodecView->currentRow();
+    auto idx = codecModel_->videoCodecs()->index(row, 0);
+    auto srcIdx = codecModel_->videoCodecs()->mapToSource(idx);
+    codecModel_->selectionModel()->setCurrentIndex(srcIdx,
+                                                   QItemSelectionModel::Select);
+}
+
+void
+AccountDetails::save() {
+    if (codecModelModified)
+        codecModel_->save();
+}
+
+void
+AccountDetails::on_hostnameEdit_editingFinished()
+{
+    currentAccount_->setHostname(ui->hostnameEdit->text());
+}
+
+void
+AccountDetails::on_usernameEdit_editingFinished()
+{
+    currentAccount_->setUsername(ui->usernameEdit->text());
+}
+
+void
+AccountDetails::on_passwordEdit_editingFinished()
+{
+    currentAccount_->setPassword(ui->passwordEdit->text());
+}
+
+void
+AccountDetails::on_proxyEdit_editingFinished()
+{
+    currentAccount_->setProxy(ui->proxyEdit->text());
+}
+
+void
+AccountDetails::on_voicemailEdit_editingFinished()
+{
+    currentAccount_->setMailbox(ui->voicemailEdit->text());
+}
+
+void
+AccountDetails::on_tabWidget_currentChanged(int index)
+{
+    if (index == 1) {
+        ui->audioCodecView->setCurrentItem(ui->audioCodecView->item(0, 0));
+    } else if (index == 2) {
+        ui->videoCodecView->setCurrentItem(ui->videoCodecView->item(0, 0));
+    }
+}