From be510fac1baf23de58cb3961b9279228da5f3eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Mesquita?= Date: Thu, 21 Jan 2010 02:48:53 +0000 Subject: [PATCH] Add a taskbar icon. We need a designer, please... git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16429 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- fscomm/call.cpp | 11 ++++++++ fscomm/call.h | 1 + fscomm/mainwindow.cpp | 40 ++++++++++++++++++++++++------ fscomm/mainwindow.h | 6 +++-- fscomm/resources.qrc | 1 + fscomm/resources/taskbar_icon.png | Bin 0 -> 11743 bytes 6 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 fscomm/resources/taskbar_icon.png diff --git a/fscomm/call.cpp b/fscomm/call.cpp index 8bcd47deea..f177bc3278 100644 --- a/fscomm/call.cpp +++ b/fscomm/call.cpp @@ -28,6 +28,7 @@ */ #include "call.h" +#include #include Call::Call() @@ -67,3 +68,13 @@ switch_status_t Call::toggleRecord(bool startRecord) return status; } + +void Call::sendDTMF(QString digit) +{ + QString result; + QString dtmf_string = QString("dtmf %1").arg(digit); + if (g_FSHost.sendCmd("pa", dtmf_string.toAscii(), &result) == SWITCH_STATUS_FALSE) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not send DTMF digit %s on call[%s]", digit.toAscii().data(), _uuid.toAscii().data()); + QMessageBox::critical(0, QWidget::tr("DTMF Error"), QWidget::tr("There was an error sending DTMF, please report this bug."), QMessageBox::Ok); + } +} diff --git a/fscomm/call.h b/fscomm/call.h index 4e6aeb682d..544882e799 100644 --- a/fscomm/call.h +++ b/fscomm/call.h @@ -63,6 +63,7 @@ public: void setActive(bool isActive) { _isActive = isActive; } bool isActive() { return _isActive == true; } switch_status_t toggleRecord(bool); + void sendDTMF(QString digit); private: int _call_id; diff --git a/fscomm/mainwindow.cpp b/fscomm/mainwindow.cpp index c58fbd5819..d51327e919 100644 --- a/fscomm/mainwindow.cpp +++ b/fscomm/mainwindow.cpp @@ -40,6 +40,11 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); + /* Setup the taskbar icon */ + sysTray = new QSystemTrayIcon(QIcon(":/images/taskbar_icon"), this); + sysTray->setToolTip(tr("FSComm")); + + /* Connect DTMF buttons */ dialpadMapper = new QSignalMapper(this); connect(ui->dtmf0Btn, SIGNAL(clicked()), dialpadMapper, SLOT(map())); connect(ui->dtmf1Btn, SIGNAL(clicked()), dialpadMapper, SLOT(map())); @@ -73,8 +78,9 @@ MainWindow::MainWindow(QWidget *parent) : dialpadMapper->setMapping(ui->dtmfDBtn, QString("D")); dialpadMapper->setMapping(ui->dtmfAstBtn, QString("*")); dialpadMapper->setMapping(ui->dtmfPoundBtn, QString("#")); - connect(dialpadMapper, SIGNAL(mapped(QString)), this, SLOT(dialDTMF(QString))); + connect(dialpadMapper, SIGNAL(mapped(QString)), this, SLOT(sendDTMF(QString))); + /* Connect events related to FreeSWITCH */ connect(&g_FSHost, SIGNAL(ready()),this, SLOT(fshostReady())); connect(&g_FSHost, SIGNAL(ringing(QSharedPointer)), this, SLOT(ringing(QSharedPointer))); connect(&g_FSHost, SIGNAL(answered(QSharedPointer)), this, SLOT(answered(QSharedPointer))); @@ -86,6 +92,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(&g_FSHost, SIGNAL(delAccount(QSharedPointer)), this, SLOT(accountDel(QSharedPointer))); /*connect(&g_FSHost, SIGNAL(coreLoadingError(QString)), this, SLOT(coreLoadingError(QString)));*/ + /* Connect call commands */ connect(ui->newCallBtn, SIGNAL(clicked()), this, SLOT(makeCall())); connect(ui->answerBtn, SIGNAL(clicked()), this, SLOT(paAnswer())); connect(ui->hangupBtn, SIGNAL(clicked()), this, SLOT(paHangup())); @@ -95,6 +102,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->action_Exit, SIGNAL(triggered()), this, SLOT(close())); connect(ui->actionAbout, SIGNAL(triggered()), this, SLOT(showAbout())); connect(ui->actionSetDefaultAccount, SIGNAL(triggered(bool)), this, SLOT(setDefaultAccount())); + connect(sysTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(sysTrayActivated(QSystemTrayIcon::ActivationReason))); /* Set the context menus */ ui->tableAccounts->addAction(ui->actionSetDefaultAccount); @@ -186,13 +194,9 @@ void MainWindow::accountStateChanged(QSharedPointer acc) } } -void MainWindow::dialDTMF(QString dtmf) +void MainWindow::sendDTMF(QString dtmf) { - QString result; - QString dtmf_string = QString("dtmf %1").arg(dtmf); - if (g_FSHost.sendCmd("pa", dtmf_string.toAscii(), &result) == SWITCH_STATUS_FALSE) { - ui->textEdit->setText("Error sending that command"); - } + g_FSHost.getCurrentActiveCall().data()->sendDTMF(dtmf); } void MainWindow::callListDoubleClick(QListWidgetItem *item) @@ -228,6 +232,8 @@ void MainWindow::fshostReady() ui->newCallBtn->setEnabled(true); ui->textEdit->setEnabled(true); ui->textEdit->setText("Ready to dial and receive calls!"); + sysTray->show(); + sysTray->showMessage(tr("Status"), tr("FSComm has initialized!"), QSystemTrayIcon::Information, 5000); } void MainWindow::paAnswer() @@ -464,3 +470,23 @@ void MainWindow::showAbout() "

Compiled FSComm version: %1" "

%2").arg(SWITCH_VERSION_FULL, result)); } + +void MainWindow::sysTrayActivated(QSystemTrayIcon::ActivationReason reason) +{ + switch(reason) + { + case QSystemTrayIcon::Trigger: + { + if (this->isVisible()) + this->hide(); + else { + this->show(); + this->activateWindow(); + this->raise(); + } + break; + } + default: + break; + } +} diff --git a/fscomm/mainwindow.h b/fscomm/mainwindow.h index a895c0876f..ea9c212454 100644 --- a/fscomm/mainwindow.h +++ b/fscomm/mainwindow.h @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -44,7 +45,6 @@ namespace Ui { class MainWindow; } - class MainWindow : public QMainWindow { Q_OBJECT public: @@ -61,7 +61,7 @@ private slots: void showAbout(); void prefTriggered(); void coreLoadingError(QString); - void dialDTMF(QString); + void sendDTMF(QString); void callListDoubleClick(QListWidgetItem *); void makeCall(); void fshostReady(); @@ -78,11 +78,13 @@ private slots: void accountAdd(QSharedPointer); void accountDel(QSharedPointer); void accountStateChanged(QSharedPointer); + void sysTrayActivated(QSystemTrayIcon::ActivationReason reason); private: Ui::MainWindow *ui; QSignalMapper *dialpadMapper; PrefDialog *preferences; + QSystemTrayIcon *sysTray; }; #endif // MAINWINDOW_H diff --git a/fscomm/resources.qrc b/fscomm/resources.qrc index 483fa2528d..5ba703c47f 100644 --- a/fscomm/resources.qrc +++ b/fscomm/resources.qrc @@ -5,6 +5,7 @@ resources/pref_audio.gif resources/pref_general.jpg resources/pref_accounts.jpg + resources/taskbar_icon.png conf/freeswitch.xml diff --git a/fscomm/resources/taskbar_icon.png b/fscomm/resources/taskbar_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1705e6be88a8ec7c82c6192e7dcd31a6ef4aa3fc GIT binary patch literal 11743 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 literal 0 HcmV?d00001