diff --git a/sflphone-client-kde/src/CMakeLists.txt b/sflphone-client-kde/src/CMakeLists.txt old mode 100644 new mode 100755 index cb06b3bd53e8c09726f134a53334cc5374666542..a8e8bd4eb35310714edf5c32c372367fca34df95 --- a/sflphone-client-kde/src/CMakeLists.txt +++ b/sflphone-client-kde/src/CMakeLists.txt @@ -26,13 +26,13 @@ SET( sflphone_client_kde_SRCS Account.cpp AccountList.cpp Call.cpp - CallList.cpp - CallTreeView.cpp - CallTreeModel.cpp + #CallList.cpp + #CallTreeView.cpp + #CallTreeModel.cpp CallTreeItem.cpp configurationmanager_interface_singleton.cpp callmanager_interface_singleton.cpp - calllist_interface_singleton.cpp + #calllist_interface_singleton.cpp instance_interface_singleton.cpp AccountWizard.cpp AccountItemWidget.cpp @@ -51,6 +51,8 @@ SET( sflphone_client_kde_SRCS Codec.cpp Item.cpp AccountListModel.cpp + CallModel.cpp + #CallTreeWidget.cpp ) diff --git a/sflphone-client-kde/src/Call.cpp b/sflphone-client-kde/src/Call.cpp index 06a8777e61ef34b8c4a1519c74ff04790e0c9231..8942159b8ae21face7107cca4ef9a6ee9b7efb08 100644 --- a/sflphone-client-kde/src/Call.cpp +++ b/sflphone-client-kde/src/Call.cpp @@ -680,7 +680,11 @@ void Call::backspaceItemText() void Call::changeCurrentState(call_state newState) { + qDebug() << "Call state changed to: " << newState; currentState = newState; emit changed(); + + if (currentState == CALL_STATE_OVER) + emit isOver(this); } \ No newline at end of file diff --git a/sflphone-client-kde/src/Call.h b/sflphone-client-kde/src/Call.h index 0dea1e1f7fe218a76a2c98e6289d22d02745360a..2eb1b8798ad2204bf28f6956ac45e43ea6dae389 100644 --- a/sflphone-client-kde/src/Call.h +++ b/sflphone-client-kde/src/Call.h @@ -279,6 +279,7 @@ public: signals: void changed(); + void isOver(Call*); }; #endif diff --git a/sflphone-client-kde/src/CallList.cpp b/sflphone-client-kde/src/CallList.cpp index 2d8c0bc5b02d3e52d4dd490c9b2a9b78c3b5b972..60cc00770dbe79121393e7c49e501960b7f8977f 100644 --- a/sflphone-client-kde/src/CallList.cpp +++ b/sflphone-client-kde/src/CallList.cpp @@ -36,7 +36,8 @@ CallList::CallList(QObject * parent) for(int i = 0 ; i < callList.size() ; i++) { calls->append(Call::buildExistingCall(callList[i])); } - MapStringString historyMap = configurationManager.getHistory().value(); + + MapStringString historyMap = configurationManager.getHistory().value(); qDebug() << "Call History = " << historyMap; QMapIterator<QString, QString> i(historyMap); while (i.hasNext()) { @@ -184,7 +185,7 @@ void CallList::clearHistory() } } -Call * CallList::createConversationFromCall(Call* call1, Call* call2) { +Call* CallList::createConversationFromCall(Call* call1, Call* call2) { qDebug() << "Need to join calls"; CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance(); //callManager.joinConference(call1->getCallId(),call2->getCallId()); diff --git a/sflphone-client-kde/src/CallList.h b/sflphone-client-kde/src/CallList.h index 9aea1f74728128a6b8298e638618589beb5a581d..e55aa94913012d87a744d42efb680059d45bfbdf 100644 --- a/sflphone-client-kde/src/CallList.h +++ b/sflphone-client-kde/src/CallList.h @@ -34,7 +34,7 @@ Q_OBJECT private: - QVector<Call *> * calls; + QVector<Call*>* calls; public: @@ -53,10 +53,10 @@ public: MapStringString getHistoryMap(); //Setters - Call * addDialingCall(const QString & peerName = "", QString account = ""); - Call * addIncomingCall(const QString & callId/*, const QString & from, const QString & account*/); - Call * addRingingCall(const QString & callId); - Call * createConversationFromCall(Call* call1, Call* call2); + Call* addDialingCall(const QString & peerName = "", QString account = ""); + Call* addIncomingCall(const QString & callId/*, const QString & from, const QString & account*/); + Call* addRingingCall(const QString & callId); + Call* createConversationFromCall(Call* call1, Call* call2); //GSetter QString generateCallId(); diff --git a/sflphone-client-kde/src/CallModel.cpp b/sflphone-client-kde/src/CallModel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9d11984f50fb9a96a0c22302a824167da7669e69 --- /dev/null +++ b/sflphone-client-kde/src/CallModel.cpp @@ -0,0 +1,333 @@ +/*************************************************************************** + * Copyright (C) 2009-2010 by Savoir-Faire Linux * + * Author : Emmanuel Lepage Valle <emmanuel.lepage@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, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include <CallModel.h> +#include <QDebug> +#include <unistd.h> + +#include "callmanager_interface_singleton.h" +#include "configurationmanager_interface_singleton.h" + +CallModel::CallModel(ModelType type, QWidget* parent) : QTreeWidget(parent) { + CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance(); + ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance(); + QStringList callList = callManager.getCallList(); + qDebug() << "Call List = " << callList; + for(int i = 0 ; i < callList.size() ; i++) { + Call* tmpCall = Call::buildExistingCall(callList[i]); + activeCalls[tmpCall->getCallId()] = tmpCall; + if (type == ActiveCall) + addCall(tmpCall); + } + + //Add older calls + MapStringString historyMap = configurationManager.getHistory().value(); + qDebug() << "Call History = " << historyMap; + QMapIterator<QString, QString> i(historyMap); + while (i.hasNext()) { + i.next(); + uint startTimeStamp = i.key().toUInt(); + QStringList param = i.value().split("|"); + QString type = param[0]; + QString number = param[1]; + QString name = param[2]; + uint stopTimeStamp = param[3].toUInt(); + QString account = param[4]; + historyCalls[QString::number(startTimeStamp)] = Call::buildHistoryCall(generateCallId(), startTimeStamp, stopTimeStamp, account, name, number, type); + //if (type == ActiveCall) //TODO undelete + //addCall(historyCalls[QString::number(startTimeStamp)]); + } + + //Widget part + setAcceptDrops(true); + setDragEnabled(true); + CallTreeItemDelegate *delegate = new CallTreeItemDelegate(); + setItemDelegate(delegate); +} + +void CallModel::setTitle(QString title) { + headerItem()->setText(0,title); +} + +Call* CallModel::addCall(Call* call, Call* parent) { + InternalCallModelStruct* aNewStruct = new InternalCallModelStruct; + aNewStruct->call_real = call; + + QTreeWidgetItem* callItem = new QTreeWidgetItem(); + aNewStruct->currentItem = callItem; + + privateCallList_item[callItem] = aNewStruct; + privateCallList_call[call] = aNewStruct; + privateCallList_callId[call->getCallId()] = aNewStruct; + + aNewStruct->call = insertItem(callItem,parent); + privateCallList_widget[aNewStruct->call] = aNewStruct; + + setCurrentItem(callItem); + + connect(call, SIGNAL(isOver(Call*)), this, SLOT(destroyCall(Call*))); + return call; +} + +MapStringString CallModel::getHistoryMap() { + MapStringString toReturn; + foreach(Call* call, historyCalls) { + toReturn[historyCalls.key(call)] = Call::getTypeFromHistoryState(call->getHistoryState()) + "|" + call->getPeerPhoneNumber() + "|" + call->getPeerName() + "|" + call->getStopTimeStamp() + "|" + call->getAccountId(); + } +} + +Call* CallModel::addDialingCall(const QString & peerName, QString account) +{ + Call* call = Call::buildDialingCall(generateCallId(), peerName, account); + activeCalls[call->getCallId()] = call; + addCall(call); + selectItem(call); + return call; +} + +Call* CallModel::addIncomingCall(const QString & callId) +{ + Call* call = Call::buildIncomingCall(callId); + activeCalls[call->getCallId()] = call; + addCall(call); + selectItem(call); + return call; +} + +Call* CallModel::addRingingCall(const QString & callId) +{ + Call* call = Call::buildRingingCall(callId); + activeCalls[call->getCallId()] = call; + addCall(call); + selectItem(call); + return call; +} + +Call* CallModel::addConference(const QString & confID) { + qDebug() << "Notified of a new conference " << confID; + CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); + sleep(2); + QStringList callList = callManager.getParticipantList(confID); + qDebug() << "Paticiapants are:" << callList; +} + +Call* CallModel::createConferenceFromCall(Call* call1, Call* call2) { + qDebug() << "Need to join call: " << call1->getCallId() << " and " << call2->getCallId(); + CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance(); + //callManager.joinConference(call1->getCallId(),call2->getCallId()); + callManager.joinParticipant(call1->getCallId(),call2->getCallId()); +} + +Call* CallModel::addParticipant(Call* call2, Call* conference) { + +} + +int CallModel::size() { + return activeCalls.size(); +} + +Call* CallModel::findCallByCallId(QString callId) { + return activeCalls[callId]; +} + +QList<Call*> CallModel::getCallList() { + QList<Call*> callList; + foreach(Call* call, activeCalls) { + callList.push_back(call); + } + return callList; +} + +void CallModel::mergeCall(Call* call1, Call* call2) { + +} + +uint CallModel::countChild(Call* call) { + +} + +bool CallModel::isConference(Call* call) { + +} + +QList<Call*> CallModel::children(Call* call) { + +} + +bool CallModel::endCall(Call* call, Call* endConference) { + +} + +InternalCallModelStruct CallModel::find(const CallTreeItem* call) { + +} + +bool CallModel::selectItem(Call* item) { + if (privateCallList_call[item]->currentItem) { + setCurrentItem(privateCallList_call[item]->currentItem); + return true; + } + else + return false; +} + +Call* CallModel::getCurrentItem() { + if (currentItem() && privateCallList_item[QTreeWidget::currentItem()]) + return privateCallList_item[QTreeWidget::currentItem()]->call_real; + else + return false; +} + +bool CallModel::removeItem(Call* item) { + if (indexOfTopLevelItem(privateCallList_call[item]->currentItem) != -1) //TODO To remove once safe + removeItemWidget(privateCallList_call[item]->currentItem,0); +} + +QWidget* CallModel::getWidget() { + return this; +} + +void CallModel::destroyCall(Call* toDestroy) { + if (privateCallList_call[toDestroy]->currentItem == currentItem()) + setCurrentItem(0); + + if (indexOfTopLevelItem(privateCallList_call[toDestroy]->currentItem) != -1) + takeTopLevelItem(indexOfTopLevelItem(privateCallList_call[toDestroy]->currentItem)); + else + privateCallList_call[toDestroy]->currentItem->parent()->removeChild(privateCallList_call[toDestroy]->currentItem); +} + +QTreeWidgetItem* CallModel::extractItem(QString callId) { + QTreeWidgetItem* currentItem = privateCallList_callId[callId]->currentItem; + return extractItem(currentItem); +} + +QTreeWidgetItem* CallModel::extractItem(QTreeWidgetItem* item) { + QTreeWidgetItem* parentItem = item->parent(); + + if (parentItem) { + QTreeWidgetItem* toReturn = parentItem->takeChild(parentItem->indexOfChild(item)); + if (parentItem->childCount() == 1) { + insertItem(extractItem(parentItem->child(0))); + takeTopLevelItem(indexOfTopLevelItem(parentItem)); + delete parentItem; + } + return toReturn; + } + else + return takeTopLevelItem(indexOfTopLevelItem(item)); +} + +CallTreeItem* CallModel::insertItem(QTreeWidgetItem* item, Call* parent) { + return insertItem(item,(parent)?privateCallList_call[parent]->currentItem:0); +} + +CallTreeItem* CallModel::insertItem(QTreeWidgetItem* item, QTreeWidgetItem* parent) { + if (!parent) + insertTopLevelItem(0,item); + else + parent->addChild(item); + + privateCallList_widget.remove(privateCallList_item[item]->call); + privateCallList_item[item]->call = new CallTreeItem(); + privateCallList_item[item]->call->setCall(privateCallList_item[item]->call_real); + privateCallList_widget[privateCallList_item[item]->call] = privateCallList_item[item]; + setItemWidget(item,0,privateCallList_item[item]->call); + + //TODO check to destroy 1 participant conferences + expandAll(); + return privateCallList_item[item]->call; +} + +void CallModel::clearArtefact(QTreeWidgetItem* item) { + item->setText(0,""); +} + +bool CallModel::dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action) { + QByteArray encodedData = data->data("text/sflphone.call.id"); + + clearArtefact(privateCallList_callId[encodedData]->currentItem); + + if (!parent) { + qDebug() << "Call dropped on empty space"; + insertItem(extractItem(encodedData)); + return true; //TODO this call may be (or not) in a conversation, if yes, split it + } + + if (privateCallList_item[parent]->call_real->getCallId() == QString(encodedData)) { + qDebug() << "Call dropped on itself"; + return true; //Item dropped on itself + } + + if ((parent->parent()) || (parent->childCount())) { + qDebug() << "Call dropped on a conference"; + if (privateCallList_callId[encodedData]->currentItem->parent()) + if (privateCallList_callId[encodedData]->currentItem->parent() == parent->parent()) { + qDebug() << "Call dropped on it's own conversation"; + return true; + } + + QTreeWidgetItem* call1 = extractItem(encodedData); + QTreeWidgetItem* call2 = (parent->parent())?parent->parent():parent; + insertItem(call1,call2); + createConferenceFromCall(privateCallList_item[call1]->call_real,privateCallList_item[call2]->call_real); + + return true; //TODO this is a conference call, need to check if the call is in the conversation, if not, add it + } + + //Create a conference + QTreeWidgetItem* newConference = new QTreeWidgetItem(this); + newConference->setText(0,"Conference"); + qDebug() << "Call dropped on another call"; + + QTreeWidgetItem* call1 = extractItem(encodedData); + insertItem(call1,newConference); + insertItem(extractItem(parent),newConference); + + createConferenceFromCall(privateCallList_item[call1]->call_real,privateCallList_item[parent]->call_real); + + return true; +} + + +QMimeData* CallModel::mimeData(const QList<QTreeWidgetItem *> items) const { + QMimeData *mimeData = new QMimeData(); + + //Call ID for internal call merging and spliting + mimeData->setData("text/sflphone.call.id", privateCallList_item[items[0]]->call_real->getCallId().toAscii()); + + //Plain text for other applications + mimeData->setData("text/plain", QString(privateCallList_item[items[0]]->call_real->getPeerName()+"\n"+privateCallList_item[items[0]]->call_real->getPeerPhoneNumber()).toAscii()); + + //BUG Comment this line if you don't want to see ugly artefact + items[0]->setText(0, privateCallList_item[items[0]]->call_real->getPeerName() + "\n" + privateCallList_item[items[0]]->call_real->getPeerPhoneNumber()); + return mimeData; +} + +QString CallModel::generateCallId() +{ + int id = qrand(); + QString res = QString::number(id); + return res; +} + +void CallModel::clearHistory() +{ + historyCalls.clear(); +} \ No newline at end of file diff --git a/sflphone-client-kde/src/CallModel.h b/sflphone-client-kde/src/CallModel.h new file mode 100644 index 0000000000000000000000000000000000000000..4335a143e9ff851fb7a6ce8d118496d8aa95963d --- /dev/null +++ b/sflphone-client-kde/src/CallModel.h @@ -0,0 +1,123 @@ +/*************************************************************************** + * Copyright (C) 2009-2010 by Savoir-Faire Linux * + * Author : Emmanuel Lepage Valle <emmanuel.lepage@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, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef CALL_MODEL +#define CALL_MODEL + +#include <QObject> +#include <QHash> +#include <QTreeWidgetItem> +#include <QVector> + +#include "CallTreeItem.h" +#include "Call.h" +#include "CallTreeWidget.h" +#include "dbus/metatypes.h" + +/** Note from the author: It was previously done by a QAbstractModel + QTreeView, but the sip-call use case is incompatible + * with the MVC model. The MVC never got to a point were it was bug-free and the code was getting dirty. The QTreeWidget + * solution may be less "clean" than MVC, but is 3 time smaller and easier to improve. + * + * This model is the view itself (private inheritance) so drag and drop can interact directly with the model without cross + * layer hack. This call merge the content of 4 previous classes (CallTreeModel, CallTreeView, CallList and most of the + * previous CallTreeItem). + */ + +struct InternalCallModelStruct { + InternalCallModelStruct* parent; + CallTreeItem* call; + Call* call_real; + QTreeWidgetItem* currentItem; + QList<InternalCallModelStruct*> children; +}; + +struct InternalCallModelStruct; + + +class CallTreeItemDelegate : public QItemDelegate +{ + public: + CallTreeItemDelegate() { } + QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const { return QSize(0,60); } +}; + + + +class CallModel : private QTreeWidget { + Q_OBJECT + public: + enum ModelType { + ActiveCall, + History + }; + + CallModel(ModelType type, QWidget* parent =0); + Call* addCall(Call* call, Call* parent =0); + int size(); + Call* findCallByCallId(QString callId); + void mergeCall(Call* call1, Call* call2); + uint countChild(Call* call); + bool isConference(Call* call); + QList<Call*> children(Call* call); + QList<Call*> getCallList(); + bool endCall(Call* call, Call* endConference = false); + bool selectItem(Call* item); + Call* getCurrentItem(); + bool removeItem(Call* item); + QWidget* getWidget(); + void setTitle(QString title); + bool dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action); + QMimeData *mimeData(const QList<QTreeWidgetItem *> items) const; + + Call* addDialingCall(const QString & peerName = "", QString account = ""); + Call* addIncomingCall(const QString & callId/*, const QString & from, const QString & account*/); + Call* addRingingCall(const QString & callId); + Call* createConferenceFromCall(Call* call1, Call* call2); + Call* addConference(const QString &confID); + Call* addParticipant(Call* call2, Call* conference); + + MapStringString getHistoryMap(); + + protected: + void dragEnterEvent(QDragEnterEvent *e) { e->accept(); } + void dragMoveEvent(QDragMoveEvent *e) { e->accept(); } + + private: + QHash<QString, Call*> activeCalls; + QHash<QString, Call*> historyCalls; + QHash<CallTreeItem* , InternalCallModelStruct*> privateCallList_widget; + QHash<QTreeWidgetItem* , InternalCallModelStruct*> privateCallList_item; + QHash<Call* , InternalCallModelStruct*> privateCallList_call; + QHash<QString , InternalCallModelStruct*> privateCallList_callId; + InternalCallModelStruct find(const CallTreeItem* call); + QTreeWidgetItem* extractItem(QString callId); + QTreeWidgetItem* extractItem(QTreeWidgetItem* item); + CallTreeItem* insertItem(QTreeWidgetItem* item, QTreeWidgetItem* parent=0); + CallTreeItem* insertItem(QTreeWidgetItem* item, Call* parent); + QString generateCallId(); + void clearArtefact(QTreeWidgetItem* item); + + private slots: + void destroyCall(Call* toDestroy); + + public slots: + void clearHistory(); +}; +#endif \ No newline at end of file diff --git a/sflphone-client-kde/src/CallTreeItem.cpp b/sflphone-client-kde/src/CallTreeItem.cpp index 202b178a761ceecd487f4362271d4bfbd17c7d00..2e195cbb986aa0801cd55ad3ec53e9bf12786a49 100644 --- a/sflphone-client-kde/src/CallTreeItem.cpp +++ b/sflphone-client-kde/src/CallTreeItem.cpp @@ -29,157 +29,33 @@ #include "sflphone_const.h" #include "CallTreeItem.h" -const char * CallTreeItem::callStateIcons[11] = {ICON_INCOMING, ICON_RINGING, ICON_CURRENT, ICON_DIALING, ICON_HOLD, ICON_FAILURE, ICON_BUSY, ICON_TRANSFER, ICON_TRANSF_HOLD, "", ""}; - -CallTreeItem::CallTreeItem(const QVector<QVariant> &data, CallTreeItem *parent) - : parentItem(parent), - itemCall(0), - itemWidget(0), - itemData(data) - { - - } - -CallTreeItem::CallTreeItem(const CallTreeItem *toCopy, CallTreeItem *parent) - : parentItem(parent), - itemCall(toCopy->itemCall), - itemWidget(toCopy->itemWidget), - itemData(toCopy->itemData) +const char * CallTreeItem::callStateIcons[12] = {ICON_INCOMING, ICON_RINGING, ICON_CURRENT, ICON_DIALING, ICON_HOLD, ICON_FAILURE, ICON_BUSY, ICON_TRANSFER, ICON_TRANSF_HOLD, "", "", ICON_CONFERENCE}; + +CallTreeItem::CallTreeItem(QWidget *parent) + : itemCall(0), QWidget(parent) { - + } - CallTreeItem::~CallTreeItem() - { - qDeleteAll(childItems); - } - - CallTreeItem *CallTreeItem::child(int number) - { - return childItems.value(number); - } - - int CallTreeItem::childCount() const - { - return childItems.count(); - } - - int CallTreeItem::childNumber() const - { - if (parentItem) - return parentItem->childItems.indexOf(const_cast<CallTreeItem*>(this)); - return 0; - } - - int CallTreeItem::columnCount() const - { - return itemData.count(); - } - - QVariant CallTreeItem::data(int column) const - { - return itemData.value(column); - } - -Call* CallTreeItem::call() const +CallTreeItem::~CallTreeItem() { - return itemCall; + } -QWidget* CallTreeItem::widget() const +Call* CallTreeItem::call() const { - return itemWidget; + return itemCall; } - bool CallTreeItem::insertChildren(int position, int count, int columns) - { - if (position < 0 || position > childItems.size()) - return false; - - for (int row = 0; row < count; ++row) { - QVector<QVariant> data(columns); - CallTreeItem *item = new CallTreeItem(data, this); - childItems.insert(position, item); - } - - return true; - } - - bool CallTreeItem::insertColumns(int position, int columns) - { - if (position < 0 || position > itemData.size()) - return false; - - for (int column = 0; column < columns; ++column) { - itemData.insert(position, QVariant()); - } - - foreach (CallTreeItem *child, childItems) { - child->insertColumns(position, columns); - } - - return true; - } - - CallTreeItem *CallTreeItem::parent() - { - return parentItem; - } - - bool CallTreeItem::removeChildren(int position, int count) - { - if (position < 0 || position + count > childItems.size()) - return false; - - for (int row = 0; row < count; ++row) { - delete childItems.takeAt(position); - } - - return true; - } - - bool CallTreeItem::removeColumns(int position, int columns) - { - if (position < 0 || position + columns > itemData.size()) - return false; - - for (int column = 0; column < columns; ++column) { - itemData.remove(position); - } - - foreach (CallTreeItem *child, childItems) { - child->removeColumns(position, columns); - } - - return true; - } - - bool CallTreeItem::setData(int column, const QVariant &value) - { - itemData.resize(10); - if (column < 0 || column >= itemData.size()) { - qDebug() << "Je suis ici!!!! " << itemData; - return false; - } - - itemData[column] = value; - return true; - } - - void CallTreeItem::setCall(Call *call) { itemCall = call; - itemWidget = new QWidget(); - labelIcon = new QLabel(); - //labelCallNumber = new QLabel("123"/*itemCall->getPeerPhoneNumber()*/); - labelCallNumber2 = new QLabel(itemCall->getPeerPhoneNumber()); + labelCallNumber2 = new QLabel(itemCall->getPeerPhoneNumber()); labelTransferPrefix = new QLabel(i18n("Transfer to : ")); labelTransferNumber = new QLabel(); - QSpacerItem * horizontalSpacer = new QSpacerItem(16777215, 20, QSizePolicy::Preferred, QSizePolicy::Minimum); - QSpacerItem * verticalSpacer = new QSpacerItem(16777215, 20, QSizePolicy::Expanding, QSizePolicy::Expanding); + QSpacerItem * verticalSpacer = new QSpacerItem(16777215, 20, QSizePolicy::Expanding, QSizePolicy::Expanding); QHBoxLayout * mainLayout = new QHBoxLayout(); mainLayout->setContentsMargins ( 3, 1, 2, 1); @@ -202,24 +78,22 @@ void CallTreeItem::setCall(Call *call) transfer->addWidget(labelTransferPrefix); transfer->addWidget(labelTransferNumber); descr->addLayout(transfer); - descr->addItem(verticalSpacer); + descr->addItem(verticalSpacer); mainLayout->addLayout(descr); - //mainLayout->addItem(horizontalSpacer); - itemWidget->setLayout(mainLayout); - itemWidget->setMinimumSize(QSize(50, 30)); + setLayout(mainLayout); + setMinimumSize(QSize(50, 30)); connect(itemCall, SIGNAL(changed()), - this, SLOT(updated())); + this, SLOT(updated())); - updated(); + updated(); } void CallTreeItem::updated() { call_state state = itemCall->getState(); bool recording = itemCall->getRecording(); - if(state != CALL_STATE_OVER) { if(state == CALL_STATE_CURRENT && recording) { labelIcon->setPixmap(QPixmap(ICON_CURRENT_REC)); @@ -235,19 +109,23 @@ void CallTreeItem::updated() if(!transfer) { labelTransferNumber->setText(""); } - //labelTransferNumber->setText(itemCall->getTransferNumber()); + labelTransferNumber->setText(itemCall->getTransferNumber()); labelCallNumber2->setText(itemCall->getPeerPhoneNumber()); - if(state == CALL_STATE_DIALING) { - labelCallNumber2->setText(itemCall->getCallNumber()); - } + if(state == CALL_STATE_DIALING) { + labelCallNumber2->setText(itemCall->getCallNumber()); + } } else { - emit over(itemCall); - itemWidget->setVisible(false); - qDebug() << "Updating item of call of state OVER. Doing nothing."; + qDebug() << "Updating item of call of state OVER. Doing nothing."; } +} - +void CallTreeItem::setConference(bool value) { + conference = value; } +bool CallTreeItem::isConference() { + return conference; +} + \ No newline at end of file diff --git a/sflphone-client-kde/src/CallTreeItem.h b/sflphone-client-kde/src/CallTreeItem.h index 128a14ab88c583f7ef3a1617e74e0ee9c0b7475d..57587b9a4f7d83694bc348809aba3aa63ed99a8e 100644 --- a/sflphone-client-kde/src/CallTreeItem.h +++ b/sflphone-client-kde/src/CallTreeItem.h @@ -37,55 +37,42 @@ #include <QtGui/QSpacerItem> #include <QtGui/QHBoxLayout> #include <QtGui/QVBoxLayout> +#include <KIcon> #include "Call.h" -class CallTreeItem : public QObject - { +class CallTreeItem : public QWidget +{ Q_OBJECT public: - CallTreeItem(const QVector<QVariant> &data, CallTreeItem *parent); - CallTreeItem(const CallTreeItem *toCopy, CallTreeItem *parent); + CallTreeItem(QWidget* parent =0); ~CallTreeItem(); - - CallTreeItem *child(int number); - int childCount() const; - int columnCount() const; - QVariant data(int column) const; + Call* call() const; - QWidget* widget() const; - bool insertChildren(int position, int count, int columns); - bool insertColumns(int position, int columns); - CallTreeItem *parent(); - bool removeChildren(int position, int count); - bool removeColumns(int position, int columns); - int childNumber() const; - bool setData(int column, const QVariant &value); void setCall(Call *call); - - static const char * callStateIcons[11]; + static const char * callStateIcons[12]; + void setConference(bool value); + bool isConference(); + private: - QList<CallTreeItem*> childItems; - QVector<QVariant> itemData; - CallTreeItem *parentItem; Call *itemCall; - QWidget *itemWidget; - QLabel * labelIcon; - QLabel * labelPeerName; - QLabel * labelCallNumber2; - QLabel * labelTransferPrefix; - QLabel * labelTransferNumber; + QLabel* labelIcon; + QLabel* labelPeerName; + QLabel* labelCallNumber2; + QLabel* labelTransferPrefix; + QLabel* labelTransferNumber; - QWidget * historyItemWidget; - QLabel * labelHistoryIcon; - QLabel * labelHistoryPeerName; - QLabel * labelHistoryCallNumber; - QLabel * labelHistoryTime; - friend class CallTreeItem; + QWidget* historyItemWidget; + QLabel* labelHistoryIcon; + QLabel* labelHistoryPeerName; + QLabel* labelHistoryCallNumber; + QLabel* labelHistoryTime; + friend class CallTreeItem; + bool conference; public slots: - void updated(); + void updated(); signals: void over(Call*); }; diff --git a/sflphone-client-kde/src/CallTreeModel.h b/sflphone-client-kde/src/CallTreeModel.h index 57b06ba1fecd3e1a706e05702e8d516f7225ea7a..c04fdc36f68a2e646b4377c58e86c54810670950 100644 --- a/sflphone-client-kde/src/CallTreeModel.h +++ b/sflphone-client-kde/src/CallTreeModel.h @@ -64,10 +64,10 @@ public: bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex()); - Qt::DropActions supportedDropActions(); - virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); - QStringList mimeTypes() const; - QMimeData* mimeData(const QModelIndexList &indexes) const; + Qt::DropActions supportedDropActions(); + virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); + QStringList mimeTypes() const; + QMimeData* mimeData(const QModelIndexList &indexes) const; CallTreeItem *getItem(const QModelIndex &index) const; diff --git a/sflphone-client-kde/src/CallTreeView.cpp b/sflphone-client-kde/src/CallTreeView.cpp index 0eb21530b71d1e2d041484d5a6d9fdb7b5b74fff..2f2a3f4903e9f7e7abb3e20128ad4c7779d3a59e 100644 --- a/sflphone-client-kde/src/CallTreeView.cpp +++ b/sflphone-client-kde/src/CallTreeView.cpp @@ -32,8 +32,8 @@ CallTreeView::CallTreeView(QWidget * parent) { treeModel = new CallTreeModel(this); setModel(treeModel); - CallTreeItemDelegate *delegate = new CallTreeItemDelegate(); - setItemDelegate(delegate); +// CallTreeItemDelegate *delegate = new CallTreeItemDelegate(); +// setItemDelegate(delegate); setHeaderHidden(true); setRootIsDecorated(false); setSelectionMode(QAbstractItemView::SingleSelection); @@ -41,17 +41,17 @@ CallTreeView::CallTreeView(QWidget * parent) setAcceptDrops(true); setUniformRowHeights(true); setDropIndicatorShown(true); - //setDragDropMode(QAbstractItemView::DragDrop); - setSelectionMode(QAbstractItemView::ExtendedSelection); - - setDragEnabled(TRUE); - setAcceptDrops(TRUE); - setDropIndicatorShown(TRUE); - - connect(this , SIGNAL(clicked(QModelIndex)), this, SLOT(itemClicked(QModelIndex))); - connect(treeModel, SIGNAL(joinCall(QString,QString)), this, SLOT(joinCall(QString, QString))); - connect(treeModel, SIGNAL(joinCall(QString,QString)), this, SLOT(expandAll())); - connect(treeModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex& ) ), this, SLOT(adaptColumns(const QModelIndex &, const QModelIndex&) ) ); + //setDragDropMode(QAbstractItemView::DragDrop); + setSelectionMode(QAbstractItemView::ExtendedSelection); + + setDragEnabled(TRUE); + setAcceptDrops(TRUE); + setDropIndicatorShown(TRUE); + + connect(this , SIGNAL(clicked(QModelIndex)), this, SLOT(itemClicked(QModelIndex))); + connect(treeModel, SIGNAL(joinCall(QString,QString)), this, SLOT(joinCall(QString, QString))); + connect(treeModel, SIGNAL(joinCall(QString,QString)), this, SLOT(expandAll())); + connect(treeModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex& ) ), this, SLOT(adaptColumns(const QModelIndex &, const QModelIndex&) ) ); } CallTreeView::~CallTreeView() diff --git a/sflphone-client-kde/src/CallTreeView.h b/sflphone-client-kde/src/CallTreeView.h index d2e9b8e6c51e3e6a90108b241eccfdc19aba6ee4..c72bba8cc1235f3bc56e533ad3f70a7352b88d29 100644 --- a/sflphone-client-kde/src/CallTreeView.h +++ b/sflphone-client-kde/src/CallTreeView.h @@ -36,12 +36,12 @@ class QModelIndex; class QTreeWidgetItem; class QMimeData; -class CallTreeItemDelegate : public QItemDelegate -{ -public: - CallTreeItemDelegate() { } - QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const { return QSize(0,50); } -}; +// class CallTreeItemDelegate : public QItemDelegate +// { +// public: +// CallTreeItemDelegate() { } +// QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const { return QSize(0,50); } +// }; class CallTreeView : public QTreeView { @@ -57,8 +57,8 @@ public: int count(); QStringList mimeTypes() const; Qt::DropActions supportedDropActions () const; - CallTreeItem* insert(Call* call); - CallTreeItem* insert(CallTreeItem *item, Call* call); + CallTreeItem* insert(Call* call); + CallTreeItem* insert(CallTreeItem *item, Call* call); // protected: // void dropEvent(QDropEvent* event); diff --git a/sflphone-client-kde/src/SFLPhone.cpp b/sflphone-client-kde/src/SFLPhone.cpp index aa2003eb739f26a189664d76ccaaafe9f398d4f7..df60ebc66bfcffbef5e620704786b3b467bfe6db 100644 --- a/sflphone-client-kde/src/SFLPhone.cpp +++ b/sflphone-client-kde/src/SFLPhone.cpp @@ -220,11 +220,11 @@ bool SFLPhone::queryClose() void SFLPhone::quitButton() { InstanceInterface & instance = InstanceInterfaceSingleton::getInstance(); - qDebug() << "quitButton : " << view->callTree->count() << " calls open."; + //qDebug() << "quitButton : " << view->callTree->count() << " calls open."; - if(view->callTree->count() > 0 && instance.getRegistrationCount() <= 1) { - qDebug() << "Attempting to quit when still having some calls open."; - } + //if(view->callTree->count() > 0 && instance.getRegistrationCount() <= 1) { + //qDebug() << "Attempting to quit when still having some calls open."; + //} view->saveState(); instance.Unregister(getpid()); qApp->quit(); diff --git a/sflphone-client-kde/src/SFLPhoneView.cpp b/sflphone-client-kde/src/SFLPhoneView.cpp index 74e03f322a75941fc382fe54b89f494fca6fe16d..8d0e503e9eb97ea61fc6764e77d8da8e4c259cde 100644 --- a/sflphone-client-kde/src/SFLPhoneView.cpp +++ b/sflphone-client-kde/src/SFLPhoneView.cpp @@ -60,7 +60,9 @@ AccountList * SFLPhoneView::accountList; QString SFLPhoneView::priorAccountId; SFLPhoneView::SFLPhoneView(QWidget *parent) - : QWidget(parent) + : QWidget(parent), + callTreeModel(CallModel::ActiveCall), + historyTreeModel(CallModel::History) { setupUi(this); @@ -69,25 +71,29 @@ SFLPhoneView::SFLPhoneView(QWidget *parent) errorWindow = new QErrorMessage(this); - callList = & CallListInterfaceSingleton::getInstance(); //CallList(this); + //callList = & CallListInterfaceSingleton::getInstance(); //CallList(this); - callTree = new CallTreeView(page_callList); - historyTree = new CallTreeView(page_callHistory); + //callTree = new CallTreeView(page_callList); + //historyTree = new CallTreeWidget(page_callHistory); + //callTree = new CallTreeWidget(this); + //historyTree = new CallTreeWidget(this); + callTreeModel.setTitle("Calls"); + historyTreeModel.setTitle("History"); - page_callList->layout()->addWidget(callTree); - page_callHistory->layout()->addWidget(historyTree); + page_callList->layout()->addWidget(callTreeModel.getWidget()); + page_callHistory->layout()->addWidget(historyTreeModel.getWidget()); historyLoaded = false; - for(int i = 0 ; i < callList->size() ; i++) { - Call * call = (*callList)[i]; - if(call->getState() == CALL_STATE_OVER) { - addCallToCallHistory(call); - } - else { - addCallToCallList(call); - } - } +// for(int i = 0 ; i < callTreeModel.size() ; i++) { +// Call * call = (*callList)[i]; +// if(call->getState() == CALL_STATE_OVER) { +// addCallToCallHistory(call); +// } +// else { +// addCallToCallList(call); +// } +// } accountList = new AccountList(false); accountList->updateAccounts(); @@ -109,6 +115,8 @@ SFLPhoneView::SFLPhoneView(QWidget *parent) this, SLOT(on1_callStateChanged(const QString &, const QString &))); connect(&callManager, SIGNAL(incomingCall(const QString &, const QString &, const QString &)), this, SLOT(on1_incomingCall(const QString &, const QString &))); + connect(&callManager, SIGNAL(conferenceCreated(const QString &)), + this, SLOT(on1_incommingConference(const QString &))); connect(&callManager, SIGNAL(incomingMessage(const QString &, const QString &)), this, SLOT(on1_incomingMessage(const QString &, const QString &))); connect(&callManager, SIGNAL(voiceMailNotify(const QString &, int)), @@ -122,8 +130,8 @@ SFLPhoneView::SFLPhoneView(QWidget *parent) connect(&configurationManager, SIGNAL(audioManagerChanged()), this, SLOT(on1_audioManagerChanged())); - connect(configDialog, SIGNAL(clearCallHistoryAsked()), - callList, SLOT(clearHistory())); +// connect(configDialog, SIGNAL(clearCallHistoryAsked()), //TODO restore +// &callTreeModel, SLOT(clearHistory())); connect(configDialog, SIGNAL(changesApplied()), this, SLOT(loadWindow())); @@ -133,11 +141,11 @@ SFLPhoneView::SFLPhoneView(QWidget *parent) connect(accountList, SIGNAL(accountListUpdated()), this, SLOT(updateWindowCallState())); - connect(callTree, SIGNAL(itemChanged()), //currentItemChanged + connect(callTreeModel.getWidget(), SIGNAL(itemChanged()), //currentItemChanged this, SLOT(on_callTree_currentItemChanged())); - connect(callTree, SIGNAL(itemChanged()), //ITem changed + connect(callTreeModel.getWidget(), SIGNAL(itemChanged()), //ITem changed this, SLOT(on_callTree_itemChanged())); - connect(callTree, SIGNAL(doubleClicked(const QModelIndex &)), + connect(callTreeModel.getWidget(), SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(on_callTree_itemDoubleClicked(const QModelIndex&))); @@ -152,7 +160,7 @@ SFLPhoneView::~SFLPhoneView() void SFLPhoneView::saveState() { ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance(); - configurationManager.setHistory(callList->getHistoryMap()); + configurationManager.setHistory(callTreeModel.getHistoryMap()); } void SFLPhoneView::loadWindow() @@ -206,16 +214,18 @@ QErrorMessage * SFLPhoneView::getErrorWindow() return errorWindow; } -CallTreeItem* SFLPhoneView::addCallToCallList(Call * call) -{ - return callTree->insert(call); -} +// Call* SFLPhoneView::addCallToCallList(Call * call) +// { +// // return callTree->insert(call); +// return callTreeModel.addCall(call); +// } -CallTreeItem* SFLPhoneView::addCallToCallHistory(Call * call) -{ - return historyTree->insert(call); - -} +// Call* SFLPhoneView::addCallToCallHistory(Call * call) +// { +// //return historyTree->insert(call); //TODO restore +// return historyTree.addCall(call); +// +// } void SFLPhoneView::addContactToContactList(Contact * contact) { @@ -233,39 +243,37 @@ void SFLPhoneView::typeString(QString str) CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance(); if(stackedWidget_screen->currentWidget() == page_callList) { - CallTreeItem * item = callTree->currentItem(); + Call* call = callTreeModel.getCurrentItem(); callManager.playDTMF(str); Call *currentCall = 0; Call *candidate = 0; - if(item) { - Call *call = item->call(); - - if (call) { - if(call->getState() == CALL_STATE_CURRENT) { - currentCall = call; - } + if(call) { + if(call->getState() == CALL_STATE_CURRENT) { + currentCall = call; } } - for(int i = callList->size() - 1 ; i >= 0 ; i--) - { - Call *call = (*callList)[i]; - - if(currentCall != call && call->getState() == CALL_STATE_CURRENT) { - - action(call, CALL_ACTION_HOLD); +// for(int i = callTreeModel.size() - 1 ; i >= 0 ; i--) +// { +// Call *call2 = (*callList)[i]; +// +// +// } + foreach (Call* call2, callTreeModel.getCallList()) { + if(currentCall != call2 && call2->getState() == CALL_STATE_CURRENT) { + action(call2, CALL_ACTION_HOLD); } - else if(call->getState() == CALL_STATE_DIALING) { - candidate = call; + else if(call2->getState() == CALL_STATE_DIALING) { + candidate = call2; } } if(!currentCall && !candidate) { qDebug() << "Typing when no item is selected. Opening an item."; - candidate = callList->addDialingCall(); - addCallToCallList(candidate); - callTree->setCurrentRow(callTree->count() + 1); + candidate = callTreeModel.addDialingCall(); + //callTree->setCurrentRow(callTree->count() + 1); //TODO + //callTreeModel.selectItem(addCallToCallList(candidate)); } if(!currentCall && candidate) { @@ -289,23 +297,18 @@ void SFLPhoneView::backspace() qDebug() << "backspace"; if(stackedWidget_screen->currentWidget() == page_callList) { qDebug() << "In call list."; - CallTreeItem * item = callTree->currentItem(); - if(!item) { - qDebug() << "Backspace when no item is selected. Doing nothing."; + Call* call = callTreeModel.getCurrentItem(); + if(!call) { + qDebug() << "Error : Backspace on unexisting call."; } else { - Call * call = callTree->currentItem()->call(); - if(!call) { - qDebug() << "Error : Backspace on unexisting call."; - } - else { - call->backspaceItemText(); - if(call->getState() == CALL_STATE_OVER) { - callTree->removeCurrent(); + call->backspaceItemText(); + if(call->getState() == CALL_STATE_OVER) { + callTreeModel.removeItem(callTreeModel.getCurrentItem()); - if(call->getHistoryState() != NONE) { - historyTree->insert(call); - } + if(call->getHistoryState() != NONE) { + //historyTree->insert(call); + historyTreeModel.addCall(call); } } } @@ -317,25 +320,16 @@ void SFLPhoneView::escape() qDebug() << "escape"; if(stackedWidget_screen->currentWidget() == page_callList ) { qDebug() << "In call list."; - CallTreeItem * item = callTree->currentItem(); - if(!item) { + Call* call = callTreeModel.getCurrentItem(); + if(!call) { qDebug() << "Escape when no item is selected. Doing nothing."; } else { - Call * call = item->call(); - - if(!call) { - qDebug() << "Error : Escape on unexisting call."; + if(call->getState() == CALL_STATE_TRANSFER || call->getState() == CALL_STATE_TRANSF_HOLD) { + action(call, CALL_ACTION_TRANSFER); } else { - if(call->getState() == CALL_STATE_TRANSFER ||call->getState() == CALL_STATE_TRANSF_HOLD) - { - action(call, CALL_ACTION_TRANSFER); - } - else - { - action(call, CALL_ACTION_REFUSE); - } + action(call, CALL_ACTION_REFUSE); } } } @@ -354,44 +348,35 @@ void SFLPhoneView::enter() qDebug() << "enter"; if(stackedWidget_screen->currentWidget() == page_callList ) { qDebug() << "In call list."; - CallTreeItem * item = callTree->currentItem(); - if(!item) { - qDebug() << "Enter when no item is selected. Doing nothing."; + Call* call = callTreeModel.getCurrentItem(); + if(!call) { + qDebug() << "Error : Enter on unexisting call."; } else { - Call * call = item->call(); - if(!call) { - qDebug() << "Error : Enter on unexisting call."; + int state = call->getState(); + if(state == CALL_STATE_INCOMING || state == CALL_STATE_DIALING || state == CALL_STATE_TRANSFER || state == CALL_STATE_TRANSF_HOLD) { + action(call, CALL_ACTION_ACCEPT); } else { - int state = call->getState(); - if(state == CALL_STATE_INCOMING || state == CALL_STATE_DIALING || state == CALL_STATE_TRANSFER || state == CALL_STATE_TRANSF_HOLD) { - action(call, CALL_ACTION_ACCEPT); - } - else { - qDebug() << "Enter when call selected not in appropriate state. Doing nothing."; - } + qDebug() << "Enter when call selected not in appropriate state. Doing nothing."; } } } if(stackedWidget_screen->currentWidget() == page_callHistory) { qDebug() << "In call history."; - CallTreeItem * item = historyTree->currentItem(); - if(!item) { - qDebug() << "Enter when no item is selected. Doing nothing."; + + Call * pastCall = historyTreeModel.getCurrentItem(); + if (!pastCall) { + qDebug() << "pastCall null"; } else { changeScreen(SCREEN_MAIN); - - Call * pastCall = item->call(); - if (!pastCall) - { - qDebug() << "pastCall null"; - } - Call * call = callList->addDialingCall(pastCall->getPeerName(), pastCall->getAccountId()); + Call * call = callTreeModel.addDialingCall(pastCall->getPeerName(), pastCall->getAccountId()); call->appendText(pastCall->getPeerPhoneNumber()); - addCallToCallList(call); - callTree->setCurrentRow(callTree->count() - 1); + //addCallToCallList(call); + //callTree->setCurrentRow(callTree->count() - 1); + //callTree->setCurrentItem(addCallToCallList(call)); + //callTreeModel.selectItem(addCallToCallList(call)); action(call, CALL_ACTION_ACCEPT); } } @@ -404,10 +389,9 @@ void SFLPhoneView::enter() else { changeScreen(SCREEN_MAIN); ContactItemWidget * w = (ContactItemWidget *) (listWidget_addressBook->itemWidget(item)); - Call * call = callList->addDialingCall(w->getContactName()); + Call * call = callTreeModel.addDialingCall(w->getContactName()); call->appendText(w->getContactNumber()); - addCallToCallList(call); - callTree->setCurrentRow(callTree->count() - 1); + //callTreeModel.selectItem(addCallToCallList(call)); action(call, CALL_ACTION_ACCEPT); } } @@ -444,7 +428,7 @@ void SFLPhoneView::updateWindowCallState() QString buttonIconFiles[6] = {ICON_CALL, ICON_HANGUP, ICON_HOLD, ICON_TRANSFER, ICON_REC_DEL_OFF, ICON_MAILBOX}; QString actionTexts[6] = {ACTION_LABEL_CALL, ACTION_LABEL_HANG_UP, ACTION_LABEL_HOLD, ACTION_LABEL_TRANSFER, ACTION_LABEL_RECORD, ACTION_LABEL_MAILBOX}; - CallTreeItem * item; + Call* call; bool transfer = false; bool recordActivated = false; //tells whether the call is in recording position @@ -453,8 +437,8 @@ void SFLPhoneView::updateWindowCallState() if(stackedWidget_screen->currentWidget() == page_callList) { - item = callTree->currentItem(); - if (!item) { + call = callTreeModel.getCurrentItem(); + if (!call) { qDebug() << "No item selected."; enabledActions[SFLPhone::Refuse] = false; enabledActions[SFLPhone::Hold] = false; @@ -462,13 +446,10 @@ void SFLPhoneView::updateWindowCallState() enabledActions[SFLPhone::Record] = false; } else { - Call * call = item->call(); + call_state state = call->getState(); + recordActivated = call->getRecording(); - if (call) { - call_state state = call->getState(); - recordActivated = call->getRecording(); - - switch (state) { + switch (state) { case CALL_STATE_INCOMING: qDebug() << "Reached CALL_STATE_INCOMING with call " << call->getCallId(); buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT; @@ -537,15 +518,14 @@ void SFLPhoneView::updateWindowCallState() default: qDebug() << "Error : Reached unexisting state for call " << call->getCallId() << "!"; break; - } } } } if(stackedWidget_screen->currentWidget() == page_callHistory) { - item = historyTree->currentItem(); + call = historyTreeModel.getCurrentItem(); buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT; actionTexts[SFLPhone::Accept] = ACTION_LABEL_CALL_BACK; - if (!item) { + if (!call) { qDebug() << "No item selected."; enabledActions[SFLPhone::Accept] = false; enabledActions[SFLPhone::Refuse] = false; @@ -561,22 +541,22 @@ void SFLPhoneView::updateWindowCallState() } } if(stackedWidget_screen->currentWidget() == page_addressBook) { - item = addressBookTree->currentItem(); - buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT; - if (!item) { - qDebug() << "No item selected."; - enabledActions[SFLPhone::Accept] = false; - enabledActions[SFLPhone::Refuse] = false; - enabledActions[SFLPhone::Hold] = false; - enabledActions[SFLPhone::Transfer] = false; - enabledActions[SFLPhone::Record] = false; - } - else { - enabledActions[SFLPhone::Refuse] = false; - enabledActions[SFLPhone::Hold] = false; - enabledActions[SFLPhone::Transfer] = false; - enabledActions[SFLPhone::Record] = false; - } + //TODO uncomment item = addressBookTree->currentItem(); +// buttonIconFiles[SFLPhone::Accept] = ICON_ACCEPT; +// if (!item) { +// qDebug() << "No item selected."; +// enabledActions[SFLPhone::Accept] = false; +// enabledActions[SFLPhone::Refuse] = false; +// enabledActions[SFLPhone::Hold] = false; +// enabledActions[SFLPhone::Transfer] = false; +// enabledActions[SFLPhone::Record] = false; +// } +// else { +// enabledActions[SFLPhone::Refuse] = false; +// enabledActions[SFLPhone::Hold] = false; +// enabledActions[SFLPhone::Transfer] = false; +// enabledActions[SFLPhone::Record] = false; +// } } qDebug() << "Updating Window."; @@ -604,12 +584,12 @@ void SFLPhoneView::updateCallHistory() listWidget_callHistory->takeItem(0); } QString textSearched = lineEdit_searchHistory->text(); - for(int i = callList->size() - 1 ; i >= 0 ; i--) { - Call * call = (*callList)[i]; + foreach (Call* call, historyTreeModel.getCallList()) { qDebug() << "" << call->getCallId(); if( call->getState() == CALL_STATE_OVER && call->getHistoryState() != NONE && (call->getPeerPhoneNumber().contains(textSearched) || call->getPeerName().contains(textSearched)) ) { qDebug() << "call->getPeerPhoneNumber()=" << call->getPeerPhoneNumber() << " contains textSearched=" << textSearched; - addCallToCallHistory(call); + //addCallToCallHistory(call); + historyTreeModel.addCall(call); } } // alternateColors(listWidget_callHistory); @@ -805,10 +785,10 @@ void SFLPhoneView::updateVolumeControls() ((SFLPhone*)parent())->action_displayVolumeControls->setChecked(display); //widget_recVol->setVisible(display); //widget_sndVol->setVisible(display); - toolButton_recVol->setVisible(display); - toolButton_sndVol->setVisible(display); - slider_recVol->setVisible(display); - slider_sndVol->setVisible(display); + toolButton_recVol->setVisible(display); + toolButton_sndVol->setVisible(display); + slider_recVol->setVisible(display); + slider_sndVol->setVisible(display); } void SFLPhoneView::updateDialpad() @@ -971,34 +951,32 @@ void SFLPhoneView::on_callTree_itemChanged() stackedWidget_screen->setCurrentWidget(page_callList); } -void SFLPhoneView::on_callTree_itemDoubleClicked(const QModelIndex &index) +void SFLPhoneView::on_callTree_itemDoubleClicked(QTreeWidgetItem* call, int column) { - qDebug() << "on_callTree_itemDoubleClicked"; - CallTreeItem *item = callTree->getItem(index); - Call * call = item->call(); - call_state state = call->getCurrentState(); - switch(state) { - case CALL_STATE_HOLD: - action(call, CALL_ACTION_HOLD); - break; - case CALL_STATE_DIALING: - action(call, CALL_ACTION_ACCEPT); - break; - default: - qDebug() << "Double clicked an item with no action on double click."; - } + //TODO port +// qDebug() << "on_callTree_itemDoubleClicked"; +// call_state state = call->getCurrentState(); +// switch(state) { +// case CALL_STATE_HOLD: +// action(call, CALL_ACTION_HOLD); +// break; +// case CALL_STATE_DIALING: +// action(call, CALL_ACTION_ACCEPT); +// break; +// default: +// qDebug() << "Double clicked an item with no action on double click."; +// } } -void SFLPhoneView::on_listWidget_callHistory_itemDoubleClicked(CallTreeItem * item) +void SFLPhoneView::on_listWidget_callHistory_itemDoubleClicked(Call* call) { qDebug() << "on_listWidget_callHistory_itemDoubleClicked"; changeScreen(SCREEN_MAIN); - Call * pastCall = item->call(); - Call * call = callList->addDialingCall(pastCall->getPeerName(), pastCall->getAccountId()); - call->appendText(pastCall->getPeerPhoneNumber()); - addCallToCallList(call); - callTree->setCurrentRow(callTree->count() - 1); - action(call, CALL_ACTION_ACCEPT); + Call* pastCall = call; + Call* call2 = callTreeModel.addDialingCall(pastCall->getPeerName(), pastCall->getAccountId()); + call2->appendText(pastCall->getPeerPhoneNumber()); + //callTreeModel.selectItem(addCallToCallList(call2)); + action(call2, CALL_ACTION_ACCEPT); } @@ -1088,20 +1066,17 @@ void SFLPhoneView::editBeforeCall() QString name; QString number; if(stackedWidget_screen->currentWidget() == page_callHistory) { - CallTreeItem * item = historyTree->currentItem(); - if(item) { - Call * call = item->call(); - if(call) { - name = call->getPeerName(); - number = call->getPeerPhoneNumber(); - } + Call* call = historyTreeModel.getCurrentItem(); + if(call) { + name = call->getPeerName(); + number = call->getPeerPhoneNumber(); } } else if(stackedWidget_screen->currentWidget() == page_addressBook) { - QListWidgetItem * item = listWidget_addressBook->currentItem(); + QListWidgetItem* item = listWidget_addressBook->currentItem(); if(item) { - ContactItemWidget * w = (ContactItemWidget *) (listWidget_addressBook->itemWidget(listWidget_addressBook->currentItem())); + ContactItemWidget* w = (ContactItemWidget *) (listWidget_addressBook->itemWidget(listWidget_addressBook->currentItem())); name = w->getContactName(); number = w->getContactNumber(); } @@ -1113,10 +1088,9 @@ void SFLPhoneView::editBeforeCall() QString newNumber = QInputDialog::getText(this, i18n("Edit before call"), QString(), QLineEdit::Normal, number, &ok); if(ok) { changeScreen(SCREEN_MAIN); - Call * call = callList->addDialingCall(name); + Call* call = callTreeModel.addDialingCall(name); call->appendText(newNumber); - addCallToCallList(call); - callTree->setCurrentRow(callTree->count() - 1); + //callTreeModel.selectItem(addCallToCallList(call)); action(call, CALL_ACTION_ACCEPT); } } @@ -1161,51 +1135,41 @@ void SFLPhoneView::accountCreationWizard() void SFLPhoneView::accept() { if(stackedWidget_screen->currentWidget() == page_callList) { - CallTreeItem * item = callTree->currentItem(); - if(!item) { + Call* call = callTreeModel.getCurrentItem(); + if(!call) { qDebug() << "Calling when no item is selected. Opening an item."; - Call * call = callList->addDialingCall(); - addCallToCallList(call); - callTree->setCurrentRow(callTree->count() - 1); + Call * newCall = callTreeModel.addDialingCall(); + //callTreeModel.selectItem(addCallToCallList(newCall)); } else { - Call * call = item->call(); - if(!call) { - qDebug() << "Error : Accept triggered on unexisting call."; + int state = call->getState(); + if(state == CALL_STATE_RINGING || state == CALL_STATE_CURRENT || state == CALL_STATE_HOLD || state == CALL_STATE_BUSY) + { + qDebug() << "Calling when item currently ringing, current, hold or busy. Opening an item."; + Call* newCall = callTreeModel.addDialingCall(); + //callTreeModel.selectItem(addCallToCallList(newCall)); } else { - int state = call->getState(); - if(state == CALL_STATE_RINGING || state == CALL_STATE_CURRENT || state == CALL_STATE_HOLD || state == CALL_STATE_BUSY) - { - qDebug() << "Calling when item currently ringing, current, hold or busy. Opening an item."; - Call * call = callList->addDialingCall(); - addCallToCallList(call); - callTree->setCurrentRow(callTree->count() - 1); - } - else { - action(call, CALL_ACTION_ACCEPT); - } + action(call, CALL_ACTION_ACCEPT); } } } if(stackedWidget_screen->currentWidget() == page_callHistory) { changeScreen(SCREEN_MAIN); - Call * pastCall = historyTree->currentItem()->call(); - Call * call = callList->addDialingCall(pastCall->getPeerName()); + Call* pastCall = historyTreeModel.getCurrentItem(); + Call* call = callTreeModel.addDialingCall(pastCall->getPeerName()); call->appendText(pastCall->getPeerPhoneNumber()); - addCallToCallList(call); - callTree->setCurrentRow(callTree->count() - 1); + //callTreeModel.selectItem(addCallToCallList(call)); action(call, CALL_ACTION_ACCEPT); } if(stackedWidget_screen->currentWidget() == page_addressBook) { changeScreen(SCREEN_MAIN); ContactItemWidget * w = (ContactItemWidget *) (listWidget_addressBook->itemWidget(listWidget_addressBook->currentItem())); - Call * call = callList->addDialingCall(w->getContactName()); + Call * call = callTreeModel.addDialingCall(w->getContactName()); call->appendText(w->getContactNumber()); - addCallToCallList(call); - callTree->setCurrentRow(callTree->count() - 1); + //callTreeModel.selectItem(addCallToCallList(call)); action(call, CALL_ACTION_ACCEPT); } } @@ -1213,12 +1177,12 @@ void SFLPhoneView::accept() void SFLPhoneView::refuse() { if(stackedWidget_screen->currentWidget() == page_callList) { - CallTreeItem * item = callTree->currentItem(); - if(!item) { + Call* call = callTreeModel.getCurrentItem(); + if(!call) { qDebug() << "Error : Hanging up when no item selected. Should not happen."; } else { - action(item->call(), CALL_ACTION_REFUSE); + action(call, CALL_ACTION_REFUSE); } } @@ -1233,34 +1197,34 @@ void SFLPhoneView::refuse() void SFLPhoneView::hold() { - CallTreeItem * item = callTree->currentItem(); - if(!item) { + Call* call = callTreeModel.getCurrentItem(); + if(!call) { qDebug() << "Error : Holding when no item selected. Should not happen."; } else { - action(item->call(), CALL_ACTION_HOLD); + action(call, CALL_ACTION_HOLD); } } void SFLPhoneView::transfer() { - CallTreeItem * item = callTree->currentItem(); - if(!item) { + Call* call = callTreeModel.getCurrentItem(); + if(!call) { qDebug() << "Error : Transfering when no item selected. Should not happen."; } else { - action(item->call(), CALL_ACTION_TRANSFER); + action(call, CALL_ACTION_TRANSFER); } } void SFLPhoneView::record() { - CallTreeItem * item = callTree->currentItem(); - if(!item) { + Call* call = callTreeModel.getCurrentItem(); + if(!call) { qDebug() << "Error : Recording when no item selected. Should not happen."; } else { - action(item->call(), CALL_ACTION_RECORD); + action(call, CALL_ACTION_RECORD); } } @@ -1268,21 +1232,20 @@ void SFLPhoneView::mailBox() { Account * account = accountInUse(); QString mailBoxNumber = account->getAccountDetail(ACCOUNT_MAILBOX); - Call * call = callList->addDialingCall(); + Call * call = callTreeModel.addDialingCall(); call->appendText(mailBoxNumber); - addCallToCallList(call); - callTree->setCurrentRow(callTree->count() - 1); + //callTreeModel.selectItem(addCallToCallList(call)); action(call, CALL_ACTION_ACCEPT); } void SFLPhoneView::on1_callStateChanged(const QString &callID, const QString &state) { qDebug() << "Signal : Call State Changed for call " << callID << " . New state : " << state; - Call * call = callList->findCallByCallId(callID); + Call * call = callTreeModel.findCallByCallId(callID); if(!call) { if(state == CALL_STATE_CHANGE_RINGING) { - call = callList->addRingingCall(callID); - addCallToCallList(call); + call = callTreeModel.addRingingCall(callID); + //addCallToCallList(call); } else { qDebug() << "Call doesn't exist in this client. Might have been initialized by another client instance before this one started."; @@ -1304,9 +1267,8 @@ void SFLPhoneView::on1_error(MapStringString details) void SFLPhoneView::on1_incomingCall(const QString & /*accountID*/, const QString & callID) { qDebug() << "Signal : Incoming Call ! ID = " << callID; - Call * call = callList->addIncomingCall(callID); - addCallToCallList(call); - callTree->setCurrentRow(callTree->count() - 1); + Call* call = callTreeModel.addIncomingCall(callID); + //callTreeModel.selectItem(addCallToCallList(call)); changeScreen(SCREEN_MAIN); @@ -1317,6 +1279,10 @@ void SFLPhoneView::on1_incomingCall(const QString & /*accountID*/, const QString emit incomingCall(call); } +void SFLPhoneView::on1_incommingConference(const QString &confID) { + callTreeModel.addConference(confID); +} + void SFLPhoneView::on1_incomingMessage(const QString &accountID, const QString &message) { qDebug() << "Signal : Incoming Message for account " << accountID << " ! \nMessage : " << message; diff --git a/sflphone-client-kde/src/SFLPhoneView.h b/sflphone-client-kde/src/SFLPhoneView.h index a5143757d56158a9ee32b04ca8b3eb609c1728ff..54071266beb7c1b34b19db24b6a71e92fd8f3ac5 100644 --- a/sflphone-client-kde/src/SFLPhoneView.h +++ b/sflphone-client-kde/src/SFLPhoneView.h @@ -33,10 +33,13 @@ #include "ui_SFLPhoneView_base.h" #include "conf/ConfigurationDialog.h" #include "CallList.h" +#include "CallTreeItem.h" #include "CallTreeView.h" +#include "CallTreeWidget.h" #include "AccountWizard.h" #include "Contact.h" #include "AccountList.h" +#include "CallModel.h" class ConfigurationDialog; @@ -136,9 +139,14 @@ public: */ void saveState(); - CallTreeView *callTree; - CallTreeView *historyTree; - CallTreeView *addressBookTree; + //CallTreeView *callTree; + //CallTreeView *historyTree; + //CallTreeView *addressBookTree; + //CallTreeWidget *callTree; + //CallTreeWidget *historyTree; + CallTreeWidget *addressBookTree; + CallModel callTreeModel; + CallModel historyTreeModel; private slots: /** @@ -209,14 +217,14 @@ private slots: * This function doesn't add anything to the callList object. * @param call the call to add to the call-list's listwidget */ - CallTreeItem* addCallToCallList(Call * call); + //Call* addCallToCallList(Call * call); /** * Adds the call's history-item to the call-history's listwidget. * This function doesn't add anything to the callList object. * @param call the past call to add to the call-history's listwidget */ - CallTreeItem* addCallToCallHistory(Call * call); + //Call* addCallToCallHistory(Call * call); /** * Adds the contact's item to the addressbook's listwidget. @@ -325,10 +333,10 @@ public slots: void on_callTree_currentItemChanged(); void on_callTree_itemChanged(); - void on_callTree_itemDoubleClicked(const QModelIndex &index); + void on_callTree_itemDoubleClicked(QTreeWidgetItem* item, int column); void on_listWidget_callHistory_currentItemChanged(); - void on_listWidget_callHistory_itemDoubleClicked(CallTreeItem * item); + void on_listWidget_callHistory_itemDoubleClicked(Call* item); void on_listWidget_addressBook_currentItemChanged(); void on_listWidget_addressBook_itemDoubleClicked(CallTreeItem * item); @@ -342,6 +350,7 @@ public slots: void on1_voiceMailNotify(const QString &accountID, int count); void on1_volumeChanged(const QString &device, double value); void on1_audioManagerChanged(); + void on1_incommingConference(const QString &confID); void changeScreen(int screen); signals: diff --git a/sflphone-client-kde/src/icons/user-group-properties.svgz b/sflphone-client-kde/src/icons/user-group-properties.svgz new file mode 100644 index 0000000000000000000000000000000000000000..edc81b9a6ef2ecc393c402a5def7ebb6ae75e832 Binary files /dev/null and b/sflphone-client-kde/src/icons/user-group-properties.svgz differ diff --git a/sflphone-client-kde/src/sflphone_const.h b/sflphone-client-kde/src/sflphone_const.h index 90026ff145a27744ccce65e50376766911008f5d..04c11772c9bff1be61b5586d8d1e8d56f863a6d2 100644 --- a/sflphone-client-kde/src/sflphone_const.h +++ b/sflphone-client-kde/src/sflphone_const.h @@ -63,6 +63,7 @@ #define ICON_BUSY ":/images/icons/busy.svg" #define ICON_TRANSFER ":/images/icons/transfert.svg" #define ICON_TRANSF_HOLD ":/images/icons/transfert.svg" +#define ICON_CONFERENCE ":/images/icons/user-group-properties.svg" #define ICON_CALL ":/images/icons/call.svg" #define ICON_HANGUP ":/images/icons/hang_up.svg"