From f879204aaf32551fe6ae7b8624d9110dba2f3931 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Quentin?=
 <jquentin@jquentin-laptop-kub2.(none)>
Date: Mon, 16 Mar 2009 11:26:06 -0400
Subject: [PATCH] Commiting before putting Automate class in Call class.

---
 sflphone_kde/Call.cpp                  |  14 ++
 sflphone_kde/Call.h                    |   5 +-
 sflphone_kde/CallList.cpp              |   7 +
 sflphone_kde/CallList.h                |   1 +
 sflphone_kde/SFLPhone.cpp              | 289 ++++++++++++++++++++++---
 sflphone_kde/SFLPhone.h                |  27 ++-
 sflphone_kde/main.cpp                  |   2 +
 sflphone_kde/resources.qrc             |  88 ++++++++
 sflphone_kde/sflphone-qt.ui            | 254 ++++++++++++----------
 sflphone_kde/sflphone_const.h          |  13 ++
 sflphone_kde/sflphone_kde.kdevelop.pcs | Bin 165570 -> 180763 bytes
 sflphone_kde/sflphone_kde.kdevses      |  38 ++--
 12 files changed, 563 insertions(+), 175 deletions(-)
 create mode 100644 sflphone_kde/resources.qrc

diff --git a/sflphone_kde/Call.cpp b/sflphone_kde/Call.cpp
index 4f2ad96ab9..f9edbac647 100644
--- a/sflphone_kde/Call.cpp
+++ b/sflphone_kde/Call.cpp
@@ -8,6 +8,14 @@ Call::Call(call_state startState, QString callId)
 	this->item = new QListWidgetItem("");
 }
 
+Call::Call(call_state startState, QString callId, QString from, Account & account)
+{
+	this->automate = new Automate(startState);
+	this->id = callId;
+	this->item = new QListWidgetItem(from);
+	this->account = & account;
+}
+
 Call::~Call()
 {
 	delete item;
@@ -20,6 +28,12 @@ Call * Call::buildDialingCall(QString callId)
 	return call;
 }
 
+Call * Call::buildIncomingCall(QString callId, QString from, Account & account)
+{
+	Call * call = new Call(CALL_STATE_INCOMING, callId, from, account);
+	return call;
+}
+
 QListWidgetItem * Call::getItem()
 {
 	return item;
diff --git a/sflphone_kde/Call.h b/sflphone_kde/Call.h
index cd03f6f6ea..2a8a25ef62 100644
--- a/sflphone_kde/Call.h
+++ b/sflphone_kde/Call.h
@@ -10,7 +10,7 @@
 class Call
 {
 private:
-	//Account * account;
+	Account * account;
 	QString id;
 	QString from;
 	QString to;
@@ -25,7 +25,8 @@ private:
 public:
 	
 	~Call();
-	static Call * buildDialingCall(QString calllId);
+	static Call * buildDialingCall(QString callId);
+	static Call * buildIncomingCall(QString callId, QString from, Account & account);
 	QListWidgetItem * getItem();
 	call_state getState() const;
 	QString getCallId();
diff --git a/sflphone_kde/CallList.cpp b/sflphone_kde/CallList.cpp
index 7d39d88af3..d4461fdb4c 100644
--- a/sflphone_kde/CallList.cpp
+++ b/sflphone_kde/CallList.cpp
@@ -36,4 +36,11 @@ QListWidgetItem * CallList::addDialingCall()
 	Call * call = Call::buildDialingCall(getAndIncCallId());
 	calls->append(call);
 	return call->getItem();
+}
+
+QListWidgetItem * CallList::addIncomingCall(QString callId, QString from, Account & account)
+{
+	Call * call = Call::buildIncomingCall(callId, from, account);
+	calls->append(call);
+	return call->getItem();
 }
\ No newline at end of file
diff --git a/sflphone_kde/CallList.h b/sflphone_kde/CallList.h
index 2817f5c74f..7f43e6dc6d 100644
--- a/sflphone_kde/CallList.h
+++ b/sflphone_kde/CallList.h
@@ -17,6 +17,7 @@ public:
 	Call * operator[](QListWidgetItem * item);
 
 	QListWidgetItem * addDialingCall();
+	QListWidgetItem * addIncomingCall(QString callId, QString from, Account & account);
 
 	QString getAndIncCallId();
 	int size();
diff --git a/sflphone_kde/SFLPhone.cpp b/sflphone_kde/SFLPhone.cpp
index 53b0b86b7c..95cab2bbc4 100644
--- a/sflphone_kde/SFLPhone.cpp
+++ b/sflphone_kde/SFLPhone.cpp
@@ -12,6 +12,23 @@ SFLPhone::SFLPhone(QMainWindow *parent) : QMainWindow(parent)
     
 	configDialog = new ConfigurationDialog(this);
 	configDialog->setModal(true);
+	
+	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+	connect(&callManager, SIGNAL(callStateChanged(const QString &, const QString &)),
+	        this,         SLOT(on_callStateChanged(const QString &, const QString &)));
+	connect(&callManager, SIGNAL(error(MapStringString)),
+	        this,         SLOT(on_error(MapStringString)));
+	connect(&callManager, SIGNAL(incomingCall(const QString &, const QString &, const QString &)),
+	        this,         SLOT(on_incomingCall(const QString &, const QString &, const QString &)));
+	connect(&callManager, SIGNAL(incomingMessage(const QString &, const QString &)),
+	        this,         SLOT(on_incomingMessage(const QString &, const QString &)));
+	connect(&callManager, SIGNAL(voiceMailNotify(const QString &, int)),
+	        this,         SLOT(on_voiceMailNotify(const QString &, int)));
+	connect(&callManager, SIGNAL(volumeChanged(const QString &, double)),
+	        this,         SLOT(on_volumeChanged(const QString &, double)));
+   //QDBusConnection::sessionBus().connect("org.sflphone.SFLphone", "/org/sflphone/SFLphone/CallManager", "org.sflphone.SFLphone.CallManager", "incomingCall",
+   //             this, SLOT(on_incomingCall(const QString &accountID, const QString &callID, const QString &from)));
+
     
 	loadWindow();
 
@@ -28,22 +45,55 @@ void SFLPhone::loadWindow()
 	actionAfficher_les_barres_de_volume->setChecked(daemon.getVolumeControls());
 	actionAfficher_le_clavier->setChecked(daemon.getDialpad());
 	updateWindowCallState();
+	updateRecordButton();
+	updateVolumeButton();
+	updateRecordBar();
+	updateVolumeBar();
+	updateVolumeControls();
+	updateDialpad();
 }
 
-void SFLPhone::on_actionAfficher_les_barres_de_volume_toggled()
+QString SFLPhone::firstAccount()
 {
 	ConfigurationManagerInterface & daemon = ConfigurationManagerInterfaceSingleton::getInstance();
-	daemon.setVolumeControls();
+	//ask for the list of accounts ids to the daemon
+	QStringList accountIds = daemon.getAccountList().value();
+	for (int i = 0; i < accountIds.size(); ++i){
+		MapStringString accountDetails = daemon.getAccountDetails(accountIds[i]);
+		if(accountDetails[QString(ACCOUNT_STATUS)] == QString(ACCOUNT_STATE_REGISTERED))
+		{
+			return accountIds[i];
+		}
+	}
+	return "";
 }
 
-void SFLPhone::on_actionAfficher_le_clavier_toggled()
+void SFLPhone::typeChar(QChar c)
 {
-	ConfigurationManagerInterface & daemon = ConfigurationManagerInterfaceSingleton::getInstance();
-	daemon.setDialpad();
+	QListWidgetItem * item = listWidget_callList->currentItem();
+	if(!item)
+	{
+		qDebug() << "Typing when no item is selected. Opening an item.";
+		item = callList->addDialingCall();
+		listWidget_callList->addItem(item);
+		listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+	}
+	listWidget_callList->currentItem()->setText(listWidget_callList->currentItem()->text() + c);
+}
+
+void SFLPhone::action(QListWidgetItem * item, call_action action)
+{
+	(*callList)[item]->action(action, item->text());
+	updateWindowCallState();
 }
 
+/*******************************************
+******** Update Display Functions **********
+*******************************************/
+
 void SFLPhone::updateWindowCallState()
 {
+	qDebug() << "updateWindowCallState";
 	QListWidgetItem * item = listWidget_callList->currentItem();
 	
 	bool enabledActions[5]= {true,true,true,true,true};
@@ -151,27 +201,108 @@ void SFLPhone::updateWindowCallState()
 	actionRaccrocher->setIcon(QIcon(buttonIconFiles[1]));
 	actionMettre_en_attente->setIcon(QIcon(buttonIconFiles[2]));
 	
-	//actionTransferer->setChecked(transfer);
+	actionTransferer->setChecked(transfer);
 	//actionRecord->setChecked(record);
 }
 
-void SFLPhone::typeChar(QChar c)
+void SFLPhone::updateRecordButton()
 {
-	QListWidgetItem * item = listWidget_callList->currentItem();
-	if(!item)
+	qDebug() << "updateRecordButton";
+	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+	double recVol = callManager.getVolume(RECORD_DEVICE);
+	if(recVol == 0.00)
 	{
-		qDebug() << "Typing when no item is selected. Opening an item.";
-		item = callList->addDialingCall();
-		listWidget_callList->addItem(item);
-		listWidget_callList->setCurrentRow(listWidget_callList->count() - 1);
+		toolButton_recVol->setIcon(QIcon(ICON_REC_VOL_0));
 	}
-	listWidget_callList->currentItem()->setText(listWidget_callList->currentItem()->text() + c);
+	else if(recVol < 0.33)
+	{
+		toolButton_recVol->setIcon(QIcon(ICON_REC_VOL_1));
+	}
+	else if(recVol < 0.67)
+	{
+		toolButton_recVol->setIcon(QIcon(ICON_REC_VOL_2));
+	}
+	else
+	{
+		toolButton_recVol->setIcon(QIcon(ICON_REC_VOL_3));
+	}
+	if(recVol > 0)
+		toolButton_recVol->setChecked(false);
+}
+void SFLPhone::updateVolumeButton()
+{
+	qDebug() << "updateVolumeButton";
+	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+	double sndVol = callManager.getVolume(SOUND_DEVICE);
+	if(sndVol == 0.00)
+	{
+		toolButton_sndVol->setIcon(QIcon(ICON_SND_VOL_0));
+	}
+	else if(sndVol < 0.33)
+	{
+		toolButton_sndVol->setIcon(QIcon(ICON_SND_VOL_1));
+	}
+	else if(sndVol < 0.67)
+	{
+		toolButton_sndVol->setIcon(QIcon(ICON_SND_VOL_2));
+	}
+	else
+	{
+		toolButton_sndVol->setIcon(QIcon(ICON_SND_VOL_3));
+	}
+	if(sndVol > 0)
+		toolButton_sndVol->setChecked(false);
+}
+void SFLPhone::updateRecordBar()
+{
+	qDebug() << "updateRecordBar";
+	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+	double recVol = callManager.getVolume(RECORD_DEVICE);
+	slider_recVol->setValue((int)(recVol * 100));
+}
+void SFLPhone::updateVolumeBar()
+{
+	qDebug() << "updateVolumeBar";
+	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+	double sndVol = callManager.getVolume(SOUND_DEVICE);
+	slider_sndVol->setValue((int)(sndVol * 100));
 }
 
-void SFLPhone::action(QListWidgetItem * item, call_action action)
+void SFLPhone::updateVolumeControls()
 {
-	(*callList)[item]->action(action, item->text());
-	updateWindowCallState();
+	qDebug() << "updateVolumeControls";
+	ConfigurationManagerInterface & daemon = ConfigurationManagerInterfaceSingleton::getInstance();
+	int display = daemon.getVolumeControls();
+	widget_recVol->setVisible(display);
+	widget_sndVol->setVisible(display);
+}
+
+void SFLPhone::updateDialpad()
+{
+	qDebug() << "updateDialpad";
+	ConfigurationManagerInterface & daemon = ConfigurationManagerInterfaceSingleton::getInstance();
+	int display = daemon.getDialpad();
+	widget_dialpad->setVisible(display);
+}
+
+
+
+/************************************************************
+************            Autoconnect             *************
+************************************************************/
+
+void SFLPhone::on_actionAfficher_les_barres_de_volume_toggled()
+{
+	ConfigurationManagerInterface & daemon = ConfigurationManagerInterfaceSingleton::getInstance();
+	daemon.setVolumeControls();
+	updateVolumeControls();
+}
+
+void SFLPhone::on_actionAfficher_le_clavier_toggled()
+{
+	ConfigurationManagerInterface & daemon = ConfigurationManagerInterfaceSingleton::getInstance();
+	daemon.setDialpad();
+	updateDialpad();
 }
 
 void SFLPhone::on_pushButton_1_clicked()      { typeChar('1'); }
@@ -187,6 +318,82 @@ void SFLPhone::on_pushButton_0_clicked()      { typeChar('0'); }
 void SFLPhone::on_pushButton_diese_clicked()  { typeChar('#'); }
 void SFLPhone::on_pushButton_etoile_clicked() { typeChar('*'); }
 
+void SFLPhone::on_slider_recVol_valueChanged(int value)
+{
+	qDebug() << "on_slider_recVol_valueChanged(" << value << ")";
+	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+	callManager.setVolume(RECORD_DEVICE, (double)value / 100.0);
+	updateRecordButton();
+}
+void SFLPhone::on_slider_sndVol_valueChanged(int value)
+{
+	qDebug() << "on_slider_sndVol_valueChanged(" << value << ")";
+	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+	callManager.setVolume(SOUND_DEVICE, (double)value / 100.0);
+	updateVolumeButton();
+}
+	
+void SFLPhone::on_toolButton_recVol_clicked()
+{
+	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+	qDebug() << "on_toolButton_recVol_clicked().";
+	if(! toolButton_recVol->isChecked())
+	{
+		qDebug() << "checked";
+		toolButton_recVol->setChecked(false);
+		slider_recVol->setEnabled(true);
+		callManager.setVolume(RECORD_DEVICE, (double)slider_recVol->value() / 100.0);
+	}
+	else
+	{
+		qDebug() << "unchecked";
+		toolButton_recVol->setChecked(true);
+		slider_recVol->setEnabled(false);
+		callManager.setVolume(RECORD_DEVICE, 0.0);
+	}
+	updateRecordButton();
+	/*
+	qDebug() << "on_toolButton_recVol_clicked(). checked = " << toolButton_recVol->isChecked();
+	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+	toolButton_recVol->setChecked(toolButton_recVol->isChecked());
+	//toolButton_recVol->setChecked(true);
+	slider_recVol->setEnabled(! toolButton_recVol->isChecked());
+	callManager.setVolume(RECORD_DEVICE, toolButton_recVol->isChecked() ? (double)slider_recVol->value() / 100.0 : 0.0);
+	updateRecordButton();
+	*/
+}
+
+void SFLPhone::on_toolButton_sndVol_clicked()
+{
+	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+	qDebug() << "on_toolButton_sndVol_clicked().";
+	if(! toolButton_sndVol->isChecked())
+	{
+		qDebug() << "checked";
+		toolButton_sndVol->setChecked(false);
+		slider_sndVol->setEnabled(true);
+		callManager.setVolume(SOUND_DEVICE, (double)slider_sndVol->value() / 100.0);
+	}
+	else
+	{
+		qDebug() << "unchecked";
+		toolButton_sndVol->setChecked(true);
+		slider_sndVol->setEnabled(false);
+		callManager.setVolume(SOUND_DEVICE, 0.0);
+	}
+	updateVolumeButton();
+	/*
+	qDebug() << "on_toolButton_sndVol_clicked(). checked = " << toolButton_recVol->isChecked();
+	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
+	toolButton_sndVol->setChecked(toolButton_sndVol->isChecked());
+	slider_sndVol->setEnabled(! toolButton_sndVol->isChecked());
+	//callManager.setVolume(SOUND_DEVICE, toolButton_recVol->isChecked() ? 0.0 : (double)slider_sndVol->value() / 100.0);
+	callManager.setVolume(SOUND_DEVICE, 0.0);
+	updateVolumeButton();
+	*/
+}
+
+
 void SFLPhone::on_listWidget_callList_currentItemChanged()
 {
 	updateWindowCallState();
@@ -291,24 +498,46 @@ void SFLPhone::on_actionBoite_vocale_triggered()
 
 }
 
-void SFLPhone::on_actionAbout()
+void SFLPhone::on_callStateChanged(const QString &callID, const QString &state)
 {
+	qDebug() << "on_callStateChanged !";
+}
 
+void SFLPhone::on_error(MapStringString details)
+{
+	qDebug() << "on_error !";
 }
 
-QString SFLPhone::firstAccount()
+void SFLPhone::on_incomingCall(const QString &accountID, const QString &callID, const QString &from)
 {
-	ConfigurationManagerInterface & daemon = ConfigurationManagerInterfaceSingleton::getInstance();
-	//ask for the list of accounts ids to the daemon
-	QStringList accountIds = daemon.getAccountList().value();
-	for (int i = 0; i < accountIds.size(); ++i){
-		MapStringString accountDetails = daemon.getAccountDetails(accountIds[i]);
-		if(accountDetails[QString(ACCOUNT_STATUS)] == QString(ACCOUNT_STATE_REGISTERED))
-		{
-			return accountIds[i];
-		}
-	}
-	return "";
+	qDebug() << "Incoming Call !";
+}
+
+void SFLPhone::on_incomingMessage(const QString &accountID, const QString &message)
+{
+	qDebug() << "on_incomingMessage !";
 }
 
+void SFLPhone::on_voiceMailNotify(const QString &accountID, int count)
+{
+	qDebug() << "on_voiceMailNotify !";
+}
+
+void SFLPhone::on_volumeChanged(const QString &device, double value)
+{
+	qDebug() << "on_volumeChanged !";
+	if(! (toolButton_recVol->isChecked() && value == 0.0))
+		updateRecordBar();
+	if(! (toolButton_sndVol->isChecked() && value == 0.0))
+		updateVolumeBar();
+}
+
+
+/*void SFLPhone::on_actionAbout()
+{
+
+}*/
+
+
+
 
diff --git a/sflphone_kde/SFLPhone.h b/sflphone_kde/SFLPhone.h
index 3ae81d393f..2502d7bb91 100644
--- a/sflphone_kde/SFLPhone.h
+++ b/sflphone_kde/SFLPhone.h
@@ -21,14 +21,20 @@ public:
 	SFLPhone(QMainWindow *parent = 0);
 	~SFLPhone();
 	void loadWindow();
-	QAbstractButton * getDialpadButton(int ind);
 	static QString firstAccount();
 
 private slots:
 	void typeChar(QChar c);
 	void action(QListWidgetItem * item, call_action action);
+	
 	void updateWindowCallState();
-
+	void updateRecordButton();
+	void updateVolumeButton();
+	void updateRecordBar();
+	void updateVolumeBar();
+	void updateVolumeControls();
+	void updateDialpad();
+	
 	void on_actionAfficher_les_barres_de_volume_toggled();
 	void on_actionAfficher_le_clavier_toggled();
 	void on_actionConfigurer_les_comptes_triggered();
@@ -41,7 +47,9 @@ private slots:
 	void on_actionRecord_triggered();
 	void on_actionHistorique_triggered();
 	void on_actionBoite_vocale_triggered();
-	void on_actionAbout();
+	//void on_actionAbout();
+	
+
 
 	void on_pushButton_1_clicked();
 	void on_pushButton_2_clicked();
@@ -56,8 +64,21 @@ private slots:
 	void on_pushButton_diese_clicked();
 	void on_pushButton_etoile_clicked();
 	
+	void on_slider_recVol_valueChanged(int value);
+	void on_slider_sndVol_valueChanged(int value);
+	
+	void on_toolButton_recVol_clicked();
+	void on_toolButton_sndVol_clicked();
+	
 	void on_listWidget_callList_currentItemChanged();
 
+	void on_callStateChanged(const QString &callID, const QString &state);
+	void on_error(MapStringString details);
+	void on_incomingCall(const QString &accountID, const QString &callID, const QString &from);
+	void on_incomingMessage(const QString &accountID, const QString &message);
+	void on_voiceMailNotify(const QString &accountID, int count);
+	void on_volumeChanged(const QString &device, double value);
+
 };
 
 #endif
diff --git a/sflphone_kde/main.cpp b/sflphone_kde/main.cpp
index 1ea20a93f0..da4fa231ff 100644
--- a/sflphone_kde/main.cpp
+++ b/sflphone_kde/main.cpp
@@ -16,6 +16,8 @@ int main(int argc, char *argv[])
 		app.installTranslator(&translator);
 	
 		SFLPhone fenetre;
+		
+
 		fenetre.show();
 	
 		return app.exec();	
diff --git a/sflphone_kde/resources.qrc b/sflphone_kde/resources.qrc
new file mode 100644
index 0000000000..5a7a305aab
--- /dev/null
+++ b/sflphone_kde/resources.qrc
@@ -0,0 +1,88 @@
+<RCC>
+  <qresource prefix="images" >
+    <file>icons/accept.svg</file>
+    <file>icons/busy.svg</file>
+    <file>icons/call.svg</file>
+    <file>icons/current.svg</file>
+    <file>icons/dial.svg</file>
+    <file>icons/fail.svg</file>
+    <file>icons/hang_up.svg</file>
+    <file>icons/history2.svg</file>
+    <file>icons/history.svg</file>
+    <file>icons/hold.svg</file>
+    <file>icons/icon_accept.svg</file>
+    <file>icons/icon_call.svg</file>
+    <file>icons/icon_dialpad_off.svg</file>
+    <file>icons/icon_dialpad.svg</file>
+    <file>icons/icon_hangup.svg</file>
+    <file>icons/icon_hold.svg</file>
+    <file>icons/icon_rec.svg</file>
+    <file>icons/icon_unhold.svg</file>
+    <file>icons/icon_volume_off.svg</file>
+    <file>icons/icon_volume.svg</file>
+    <file>icons/incoming.svg</file>
+    <file>icons/mailbox.svg</file>
+    <file>icons/Makefile</file>
+    <file>icons/Makefile.am</file>
+    <file>icons/Makefile.in</file>
+    <file>icons/mic_25.svg</file>
+    <file>icons/mic_50.svg</file>
+    <file>icons/mic_75.svg</file>
+    <file>icons/mic.svg</file>
+    <file>icons/missed.svg</file>
+    <file>icons/outgoing.svg</file>
+    <file>icons/rec_call.svg</file>
+    <file>icons/refuse.svg</file>
+    <file>icons/ring.svg</file>
+    <file>icons/sflphone.png</file>
+    <file>icons/speaker_25.svg</file>
+    <file>icons/speaker_50.svg</file>
+    <file>icons/speaker_75.svg</file>
+    <file>icons/speaker.svg</file>
+    <file>icons/stock_person.svg</file>
+    <file>icons/transfert.svg</file>
+    <file>icons/unhold.svg</file>
+    <file>icons/accept.svg</file>
+    <file>icons/busy.svg</file>
+    <file>icons/call.svg</file>
+    <file>icons/current.svg</file>
+    <file>icons/dial.svg</file>
+    <file>icons/fail.svg</file>
+    <file>icons/hang_up.svg</file>
+    <file>icons/history2.svg</file>
+    <file>icons/history.svg</file>
+    <file>icons/hold.svg</file>
+    <file>icons/icon_accept.svg</file>
+    <file>icons/icon_call.svg</file>
+    <file>icons/icon_dialpad_off.svg</file>
+    <file>icons/icon_dialpad.svg</file>
+    <file>icons/icon_hangup.svg</file>
+    <file>icons/icon_hold.svg</file>
+    <file>icons/icon_rec.svg</file>
+    <file>icons/icon_unhold.svg</file>
+    <file>icons/icon_volume_off.svg</file>
+    <file>icons/icon_volume.svg</file>
+    <file>icons/incoming.svg</file>
+    <file>icons/mailbox.svg</file>
+    <file>icons/Makefile</file>
+    <file>icons/Makefile.am</file>
+    <file>icons/Makefile.in</file>
+    <file>icons/mic_25.svg</file>
+    <file>icons/mic_50.svg</file>
+    <file>icons/mic_75.svg</file>
+    <file>icons/mic.svg</file>
+    <file>icons/missed.svg</file>
+    <file>icons/outgoing.svg</file>
+    <file>icons/rec_call.svg</file>
+    <file>icons/refuse.svg</file>
+    <file>icons/ring.svg</file>
+    <file>icons/sflphone.png</file>
+    <file>icons/speaker_25.svg</file>
+    <file>icons/speaker_50.svg</file>
+    <file>icons/speaker_75.svg</file>
+    <file>icons/speaker.svg</file>
+    <file>icons/stock_person.svg</file>
+    <file>icons/transfert.svg</file>
+    <file>icons/unhold.svg</file>
+  </qresource>
+</RCC>
diff --git a/sflphone_kde/sflphone-qt.ui b/sflphone_kde/sflphone-qt.ui
index 944f60098d..90b1481506 100644
--- a/sflphone_kde/sflphone-qt.ui
+++ b/sflphone_kde/sflphone-qt.ui
@@ -26,67 +26,77 @@
        <number>0</number>
       </property>
       <item>
-       <layout class="QVBoxLayout" name="verticalLayout_2" >
-        <property name="spacing" >
-         <number>0</number>
+       <widget class="QWidget" native="1" name="widget_recVol" >
+        <property name="layoutDirection" >
+         <enum>Qt::RightToLeft</enum>
         </property>
-        <property name="sizeConstraint" >
-         <enum>QLayout::SetDefaultConstraint</enum>
-        </property>
-        <property name="rightMargin" >
-         <number>0</number>
-        </property>
-        <item>
-         <widget class="QSlider" name="verticalSlider_2" >
-          <property name="sizePolicy" >
-           <sizepolicy vsizetype="Expanding" hsizetype="Fixed" >
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="minimumSize" >
-           <size>
-            <width>0</width>
-            <height>50</height>
-           </size>
-          </property>
-          <property name="layoutDirection" >
-           <enum>Qt::RightToLeft</enum>
-          </property>
-          <property name="autoFillBackground" >
-           <bool>false</bool>
-          </property>
-          <property name="orientation" >
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="invertedAppearance" >
-           <bool>false</bool>
-          </property>
-          <property name="invertedControls" >
-           <bool>false</bool>
-          </property>
-          <property name="tickPosition" >
-           <enum>QSlider::NoTicks</enum>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QToolButton" name="toolButton" >
-          <property name="text" >
-           <string>...</string>
-          </property>
-          <property name="icon" >
-           <iconset>
-            <normaloff>:/Images/mic_75.svg</normaloff>:/Images/mic_75.svg</iconset>
-          </property>
-         </widget>
-        </item>
-       </layout>
+        <layout class="QVBoxLayout" name="verticalLayout_4" >
+         <property name="spacing" >
+          <number>0</number>
+         </property>
+         <property name="margin" >
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QSlider" name="slider_recVol" >
+           <property name="sizePolicy" >
+            <sizepolicy vsizetype="Expanding" hsizetype="Fixed" >
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize" >
+            <size>
+             <width>0</width>
+             <height>50</height>
+            </size>
+           </property>
+           <property name="layoutDirection" >
+            <enum>Qt::RightToLeft</enum>
+           </property>
+           <property name="autoFillBackground" >
+            <bool>false</bool>
+           </property>
+           <property name="maximum" >
+            <number>100</number>
+           </property>
+           <property name="orientation" >
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="invertedAppearance" >
+            <bool>false</bool>
+           </property>
+           <property name="invertedControls" >
+            <bool>false</bool>
+           </property>
+           <property name="tickPosition" >
+            <enum>QSlider::NoTicks</enum>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QToolButton" name="toolButton_recVol" >
+           <property name="text" >
+            <string>...</string>
+           </property>
+           <property name="icon" >
+            <iconset>
+             <normaloff>:/Images/mic_75.svg</normaloff>:/Images/mic_75.svg</iconset>
+           </property>
+           <property name="checkable" >
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+        <zorder>toolButton_recVol</zorder>
+        <zorder>slider_recVol</zorder>
+       </widget>
       </item>
       <item>
-       <widget class="QWidget" native="1" name="widget" >
+       <widget class="QWidget" native="1" name="widget_dialpad" >
         <layout class="QGridLayout" name="gridLayout" >
-         <item row="0" column="0" >
+         <item row="0" column="1" >
           <widget class="QPushButton" name="pushButton_1" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -99,7 +109,7 @@
            </property>
           </widget>
          </item>
-         <item row="0" column="1" >
+         <item row="0" column="2" >
           <widget class="QPushButton" name="pushButton_2" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -115,7 +125,7 @@
            </property>
           </widget>
          </item>
-         <item row="0" column="2" >
+         <item row="0" column="3" >
           <widget class="QPushButton" name="pushButton_3" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -128,7 +138,7 @@
            </property>
           </widget>
          </item>
-         <item row="1" column="0" >
+         <item row="1" column="1" >
           <widget class="QPushButton" name="pushButton_4" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -141,7 +151,7 @@
            </property>
           </widget>
          </item>
-         <item row="1" column="1" >
+         <item row="1" column="2" >
           <widget class="QPushButton" name="pushButton_5" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -154,7 +164,7 @@
            </property>
           </widget>
          </item>
-         <item row="1" column="2" >
+         <item row="1" column="3" >
           <widget class="QPushButton" name="pushButton_6" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -167,7 +177,7 @@
            </property>
           </widget>
          </item>
-         <item row="2" column="0" >
+         <item row="2" column="1" >
           <widget class="QPushButton" name="pushButton_7" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -180,7 +190,7 @@
            </property>
           </widget>
          </item>
-         <item row="2" column="1" >
+         <item row="2" column="2" >
           <widget class="QPushButton" name="pushButton_8" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -193,7 +203,7 @@
            </property>
           </widget>
          </item>
-         <item row="2" column="2" >
+         <item row="2" column="3" >
           <widget class="QPushButton" name="pushButton_9" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -206,7 +216,7 @@
            </property>
           </widget>
          </item>
-         <item row="3" column="0" >
+         <item row="3" column="1" >
           <widget class="QPushButton" name="pushButton_etoile" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -219,7 +229,7 @@
            </property>
           </widget>
          </item>
-         <item row="3" column="1" >
+         <item row="3" column="2" >
           <widget class="QPushButton" name="pushButton_0" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -232,7 +242,7 @@
            </property>
           </widget>
          </item>
-         <item row="3" column="2" >
+         <item row="3" column="3" >
           <widget class="QPushButton" name="pushButton_diese" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@@ -249,56 +259,64 @@
        </widget>
       </item>
       <item>
-       <layout class="QVBoxLayout" name="verticalLayout_3" >
-        <property name="spacing" >
-         <number>4</number>
-        </property>
-        <property name="sizeConstraint" >
-         <enum>QLayout::SetDefaultConstraint</enum>
-        </property>
-        <property name="rightMargin" >
-         <number>0</number>
-        </property>
-        <item>
-         <widget class="QSlider" name="verticalSlider_3" >
-          <property name="sizePolicy" >
-           <sizepolicy vsizetype="Expanding" hsizetype="Fixed" >
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="minimumSize" >
-           <size>
-            <width>0</width>
-            <height>50</height>
-           </size>
-          </property>
-          <property name="layoutDirection" >
-           <enum>Qt::LeftToRight</enum>
-          </property>
-          <property name="autoFillBackground" >
-           <bool>false</bool>
-          </property>
-          <property name="orientation" >
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="tickPosition" >
-           <enum>QSlider::NoTicks</enum>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QToolButton" name="toolButton_2" >
-          <property name="text" >
-           <string>...</string>
-          </property>
-          <property name="icon" >
-           <iconset>
-            <normaloff>:/Images/speaker_75.svg</normaloff>:/Images/speaker_75.svg</iconset>
-          </property>
-         </widget>
-        </item>
-       </layout>
+       <widget class="QWidget" native="1" name="widget_sndVol" >
+        <layout class="QVBoxLayout" name="verticalLayout_2" >
+         <property name="spacing" >
+          <number>0</number>
+         </property>
+         <property name="margin" >
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QSlider" name="slider_sndVol" >
+           <property name="sizePolicy" >
+            <sizepolicy vsizetype="Expanding" hsizetype="Fixed" >
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize" >
+            <size>
+             <width>0</width>
+             <height>50</height>
+            </size>
+           </property>
+           <property name="layoutDirection" >
+            <enum>Qt::LeftToRight</enum>
+           </property>
+           <property name="autoFillBackground" >
+            <bool>false</bool>
+           </property>
+           <property name="maximum" >
+            <number>100</number>
+           </property>
+           <property name="orientation" >
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="tickPosition" >
+            <enum>QSlider::NoTicks</enum>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QToolButton" name="toolButton_sndVol" >
+           <property name="text" >
+            <string>...</string>
+           </property>
+           <property name="icon" >
+            <iconset>
+             <normaloff>:/Images/speaker_75.svg</normaloff>:/Images/speaker_75.svg</iconset>
+           </property>
+           <property name="checkable" >
+            <bool>true</bool>
+           </property>
+           <property name="checked" >
+            <bool>false</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
       </item>
      </layout>
     </item>
diff --git a/sflphone_kde/sflphone_const.h b/sflphone_kde/sflphone_const.h
index 93f56bbc12..6712987d46 100644
--- a/sflphone_kde/sflphone_const.h
+++ b/sflphone_kde/sflphone_const.h
@@ -57,6 +57,19 @@
 #define ICON_REFUSE ":/images/icons/refuse.svg"
 #define ICON_EXEC_TRANSF ":/images/icons/call.svg"
 
+#define ICON_REC_VOL_0 ":/images/icons/mic.svg"
+#define ICON_REC_VOL_1 ":/images/icons/mic_25.svg"
+#define ICON_REC_VOL_2 ":/images/icons/mic_50.svg"
+#define ICON_REC_VOL_3 ":/images/icons/mic_75.svg"
+
+#define ICON_SND_VOL_0 ":/images/icons/speaker.svg"
+#define ICON_SND_VOL_1 ":/images/icons/speaker_25.svg"
+#define ICON_SND_VOL_2 ":/images/icons/speaker_50.svg"
+#define ICON_SND_VOL_3 ":/images/icons/speaker_75.svg"
+
+#define RECORD_DEVICE "mic"
+#define SOUND_DEVICE "speaker"
+
 #define ACCOUNT_TYPE          "Account.type"
 #define ACCOUNT_ALIAS		   "Account.alias"
 #define ACCOUNT_ENABLED		   "Account.enable"
diff --git a/sflphone_kde/sflphone_kde.kdevelop.pcs b/sflphone_kde/sflphone_kde.kdevelop.pcs
index c5020e28ff72d6064ad325af97884b8f7e129b73..138d43272375023ed724ff6185edf28f20cf4bae 100644
GIT binary patch
delta 11240
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
M?ga{eSh8aP0H!&}-~a#s

delta 4485
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
W>F*aXae$h7@{DrZRhKY5;{^aP*S2Q>

diff --git a/sflphone_kde/sflphone_kde.kdevses b/sflphone_kde/sflphone_kde.kdevses
index d7f8147c1a..4e3fa3cbed 100644
--- a/sflphone_kde/sflphone_kde.kdevses
+++ b/sflphone_kde/sflphone_kde.kdevses
@@ -1,37 +1,31 @@
 <?xml version = '1.0' encoding = 'UTF-8'?>
 <!DOCTYPE KDevPrjSession>
 <KDevPrjSession>
- <DocsAndViews NumberOfDocuments="10" >
+ <DocsAndViews NumberOfDocuments="8" >
   <Doc0 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/SFLPhone.cpp" >
-   <View0 Encoding="" Type="Source" />
+   <View0 Encoding="" line="526" Type="Source" />
   </Doc0>
-  <Doc1 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/SFLPhone.h" >
-   <View0 Encoding="" Type="Source" />
+  <Doc1 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/callmanager_interface_singleton.cpp" >
+   <View0 Encoding="" line="0" Type="Source" />
   </Doc1>
-  <Doc2 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/Automate.cpp" >
-   <View0 Encoding="" Type="Source" />
+  <Doc2 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/callmanager_interface_p.h" >
+   <View0 Encoding="" line="135" Type="Source" />
   </Doc2>
-  <Doc3 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/Automate.h" >
-   <View0 Encoding="" Type="Source" />
+  <Doc3 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/callmanager_interface.cpp" >
+   <View0 Encoding="" line="17" Type="Source" />
   </Doc3>
-  <Doc4 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/CallList.h" >
-   <View0 Encoding="" Type="Source" />
+  <Doc4 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/main.cpp" >
+   <View0 Encoding="" line="19" Type="Source" />
   </Doc4>
-  <Doc5 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/CallList.cpp" >
-   <View0 Encoding="" Type="Source" />
+  <Doc5 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/SFLPhone.h" >
+   <View0 Encoding="" line="74" Type="Source" />
   </Doc5>
-  <Doc6 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/Call.h" >
-   <View0 Encoding="" Type="Source" />
+  <Doc6 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/callmanager-introspec.xml" >
+   <View0 Encoding="" line="78" Type="Source" />
   </Doc6>
-  <Doc7 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/Call.cpp" >
-   <View0 Encoding="" Type="Source" />
+  <Doc7 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/build/moc_SFLPhone.cpp" >
+   <View0 Encoding="" line="191" Type="Source" />
   </Doc7>
-  <Doc8 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/sflphone_const.h" >
-   <View0 Encoding="" Type="Source" />
-  </Doc8>
-  <Doc9 NumberOfViews="1" URL="file:///home/jquentin/sflphone/sflphone_kde/CMakeLists.txt" >
-   <View0 Encoding="" line="22" Type="Source" />
-  </Doc9>
  </DocsAndViews>
  <pluginList>
   <kdevdebugger>
-- 
GitLab