Skip to content
Snippets Groups Projects
Select Git revision
  • 9b4fffcdbcc43a368ddcce98e1f935a0161d2138
  • master default protected
  • release/202005
  • release/202001
  • release/201912
  • release/201911
  • release/releaseWindowsTestOne
  • release/windowsReleaseTest
  • release/releaseTest
  • release/releaseWindowsTest
  • release/201910
  • release/qt/201910
  • release/windows-test/201910
  • release/201908
  • release/201906
  • release/201905
  • release/201904
  • release/201903
  • release/201902
  • release/201901
  • release/201812
  • 4.0.0
  • 2.2.0
  • 2.1.0
  • 2.0.1
  • 2.0.0
  • 1.4.1
  • 1.4.0
  • 1.3.0
  • 1.2.0
  • 1.1.0
31 results

HistoryDock.cpp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    To find the state of this project's repository at the time of any of these versions, check out the tags.
    HistoryDock.cpp 10.73 KiB
    #include "HistoryDock.h"
    
    #include <QtGui/QVBoxLayout>
    #include <kicon.h>
    #include <klineedit.h>
    #include <QtGui/QTreeWidget>
    #include <QtGui/QComboBox>
    #include <QtGui/QPushButton>
    #include <QtGui/QLabel>
    #include <kdatewidget.h>
    #include <QHeaderView>
    #include <QtGui/QCheckBox>
    #include <QDate>
    #include "SFLPhone.h"
    #include "widgets/HistoryTreeItem.h"
    #include "conf/ConfigurationSkeleton.h"
    #include "AkonadiBackend.h"
    #include "lib/sflphone_const.h"
    
    class QNumericTreeWidgetItem : public QTreeWidgetItem {
       public:
          QNumericTreeWidgetItem(QTreeWidget* parent):QTreeWidgetItem(parent),widget(0),weight(-1){}
          QNumericTreeWidgetItem(QTreeWidgetItem* parent):QTreeWidgetItem(parent),widget(0),weight(-1){}
          HistoryTreeItem* widget;
          int weight;
       private:
          bool operator<(const QTreeWidgetItem & other) const {
             int column = treeWidget()->sortColumn();
             if (dynamic_cast<QNumericTreeWidgetItem*>((QTreeWidgetItem*)&other)) {
                if (widget !=0 && dynamic_cast<QNumericTreeWidgetItem*>((QTreeWidgetItem*)&other)->widget != 0)
                   return widget->getTimeStamp() < dynamic_cast<QNumericTreeWidgetItem*>((QTreeWidgetItem*)&other)->widget->getTimeStamp();
                else if (weight > 0 && dynamic_cast<QNumericTreeWidgetItem*>((QTreeWidgetItem*)&other)->weight > 0)
                   return weight > dynamic_cast<QNumericTreeWidgetItem*>((QTreeWidgetItem*)&other)->weight;
             }
             return text(column) < other.text(column);
          }
    };
    
    HistoryDock::HistoryDock(QWidget* parent) : QDockWidget(parent)
    {
       setMinimumSize(250,0);
       setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
       m_pFilterLE   = new KLineEdit();
       m_pItemView   = new HistoryTree(this);
       m_pSortByCBB  = new QComboBox();
       m_pSortByL    = new QLabel("Sort by:");
       m_pFromL      = new QLabel("From:");
       m_pToL        = new QLabel("To:");
       m_pFromDW     = new KDateWidget();
       m_pToDW       = new KDateWidget();
       m_pAllTimeCB  = new QCheckBox("Display all");
       m_pLinkPB     = new QPushButton(this);
       
       m_pAllTimeCB->setChecked(ConfigurationSkeleton::displayDataRange());
    
       m_pSortByL->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Preferred);
       m_pSortByCBB->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred);
       m_pLinkPB->setMaximumSize(20,9999999);
       m_pLinkPB->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Expanding);
       m_pLinkPB->setCheckable(true);
       
       m_pItemView->headerItem()->setText(0,"Calls"          );
       m_pItemView->header    ()->setClickable(true          );
       m_pItemView->header    ()->setSortIndicatorShown(true );
       m_pItemView->setAlternatingRowColors(true             );
       m_pItemView->setAcceptDrops( true                     );
       m_pItemView->setDragEnabled( true                     );
    
       m_pFilterLE->setPlaceholderText("Filter");
       m_pFilterLE->setClearButtonShown(true);
       
       QStringList sortBy;
       sortBy << "Date" << "Name" << "Popularity" << "Duration";
       m_pSortByCBB->addItems(sortBy);
    
       QWidget* mainWidget = new QWidget(this);
       setWidget(mainWidget);
    
       QGridLayout* mainLayout = new QGridLayout(mainWidget);
    
       mainLayout->addWidget(m_pSortByL   ,0,0     );
       mainLayout->addWidget(m_pSortByCBB ,0,1,1,2 );
       mainLayout->addWidget(m_pAllTimeCB ,1,0,1,3 );
       mainLayout->addWidget(m_pLinkPB    ,3,2,3,1 );
       mainLayout->addWidget(m_pFromL     ,2,0,1,2 );
       mainLayout->addWidget(m_pFromDW    ,3,0,1,2 );
       mainLayout->addWidget(m_pToL       ,4,0,1,2 );
       mainLayout->addWidget(m_pToDW      ,5,0,1,2 );
       mainLayout->addWidget(m_pItemView  ,6,0,1,3 );
       mainLayout->addWidget(m_pFilterLE  ,7,0,1,3 );
       
       setWindowTitle("History");
    
       QDate date(2000,1,1);
       m_pFromDW->setDate(date);
       
       reload();
       m_pCurrentFromDate = m_pFromDW->date();
       m_pCurrentToDate   = m_pToDW->date();
    
       connect(m_pAllTimeCB,                  SIGNAL(toggled(bool)),            this, SLOT(enableDateRange(bool)       ));
       connect(m_pFilterLE,                   SIGNAL(textChanged(QString)),     this, SLOT(filter(QString)             ));
       connect(m_pFromDW  ,                   SIGNAL(changed(QDate)),           this, SLOT(updateLinkedFromDate(QDate) ));
       connect(m_pToDW    ,                   SIGNAL(changed(QDate)),           this, SLOT(updateLinkedToDate(QDate)   ));
       connect(m_pSortByCBB,                  SIGNAL(currentIndexChanged(int)), this, SLOT(reload()                    ));
       connect(AkonadiBackend::getInstance(), SIGNAL(collectionChanged()),      this, SLOT(updateContactInfo()         ));
    }
    
    HistoryDock::~HistoryDock()
    {
    }
    
    QString HistoryDock::getIdentity(HistoryTreeItem* item)
    {
       if (item->getName().trimmed().isEmpty())
          return item->getPhoneNumber();
       else
          return item->getName();
    }
    
    void HistoryDock::updateContactInfo()
    {
       foreach(HistoryTreeItem* hitem, m_pHistory) {
          hitem->updated();
       }
    }
    
    void HistoryDock::reload()
    {
       m_pItemView->clear();
       foreach(HistoryTreeItem* hitem, m_pHistory) {
          delete hitem;
       }
       m_pHistory.clear();
       foreach (Call* call, SFLPhone::app()->model()->getHistory()) {
          if (!m_pAllTimeCB->isChecked() || (QDateTime(m_pFromDW->date()).toTime_t() < call->getStartTimeStamp().toUInt() && QDateTime(m_pToDW->date().addDays(1)).toTime_t() > call->getStartTimeStamp().toUInt() )) {
             HistoryTreeItem* callItem = new HistoryTreeItem(m_pItemView);
             callItem->setCall(call);
             m_pHistory << callItem;
          }
       }
       switch (m_pSortByCBB->currentIndex()) {
          case Date:
             foreach(HistoryTreeItem* hitem, m_pHistory) {
                QNumericTreeWidgetItem* item = new QNumericTreeWidgetItem(m_pItemView);
                item->widget = hitem;
                hitem->setItem(item);
                m_pItemView->addTopLevelItem(item);
                m_pItemView->setItemWidget(item,0,hitem);
             }
             break;
          case Name: {
             QHash<QString,QTreeWidgetItem*> group;
             foreach(HistoryTreeItem* item, m_pHistory) {
                if (!group[getIdentity(item)]) {
                   group[getIdentity(item)] = new QTreeWidgetItem(m_pItemView);
                   group[getIdentity(item)]->setText(0,getIdentity(item));
                   m_pItemView->addTopLevelItem(group[getIdentity(item)]);
                }
                QNumericTreeWidgetItem* twItem = new QNumericTreeWidgetItem(group[getIdentity(item)]);
                item->setItem(twItem);
                twItem->widget = item;
                m_pItemView->setItemWidget(twItem,0,item);
             }
             break;
          }
          case Popularity: {
             QHash<QString,QNumericTreeWidgetItem*> group;
             foreach(HistoryTreeItem* item, m_pHistory) {
                if (!group[getIdentity(item)]) {
                   group[getIdentity(item)] = new QNumericTreeWidgetItem(m_pItemView);
                   group[getIdentity(item)]->weight = 0;
                   m_pItemView->addTopLevelItem(group[getIdentity(item)]);
                }
                group[getIdentity(item)]->weight++;
                group[getIdentity(item)]->setText(0,getIdentity(item)+" ("+QString::number(group[getIdentity(item)]->weight)+")");
                QNumericTreeWidgetItem* twItem = new QNumericTreeWidgetItem(group[getIdentity(item)]);
                item->setItem(twItem);
                twItem->widget = item;
                m_pItemView->setItemWidget(twItem,0,item);
             }
             break;
          }
          case Duration:
             foreach(HistoryTreeItem* hitem, m_pHistory) {
                QNumericTreeWidgetItem* item = new QNumericTreeWidgetItem(m_pItemView);
                item->weight = hitem->getDuration();
                hitem->setItem(item);
                m_pItemView->addTopLevelItem(item);
                m_pItemView->setItemWidget(item,0,hitem);
             }
             break;
       }
       m_pItemView->sortItems(0,Qt::AscendingOrder);
    }
    
    void HistoryDock::enableDateRange(bool enable)
    {
       m_pFromL->setVisible(enable);
       m_pToL->setVisible(enable);
       m_pFromDW->setVisible(enable);
       m_pToDW->setVisible(enable);
       m_pLinkPB->setVisible(enable);
       
       ConfigurationSkeleton::setDisplayDataRange(enable);
    }
    
    void HistoryDock::filter(QString text)
    {
       foreach(HistoryTreeItem* item, m_pHistory) {
          bool visible = (item->getName().toLower().indexOf(text) != -1) || (item->getPhoneNumber().toLower().indexOf(text) != -1);
          item->getItem()-> setHidden(!visible);
       }
       m_pItemView->expandAll();
    }
    
    void HistoryDock::updateLinkedDate(KDateWidget* item, QDate& prevDate, QDate& newDate)
    {
       if (m_pLinkPB->isChecked()) {
          if (prevDate.day() != newDate.day()) {
             QDate tmp = item->date();
             tmp = tmp.addDays(newDate.day() - prevDate.day());
             item->setDate(tmp);
          }
          if (prevDate.month() != newDate.month()) {
             QDate tmp = item->date();
             tmp = tmp.addMonths(newDate.month() - prevDate.month());
             item->setDate(tmp);
          }
          if (prevDate.year() != newDate.year()) {
             QDate tmp = item->date();
             tmp = tmp.addYears(newDate.year() - prevDate.year());
             item->setDate(tmp);
          }
       }
       prevDate = newDate;
    }
    
    void HistoryDock::updateLinkedFromDate(QDate date)
    {
       disconnect(m_pToDW  ,  SIGNAL(changed(QDate)),       this, SLOT(updateLinkedToDate(QDate)));
       updateLinkedDate(m_pToDW,m_pCurrentFromDate,date);
       connect(m_pToDW  ,  SIGNAL(changed(QDate)),       this, SLOT(updateLinkedToDate(QDate)));
    }
    
    void HistoryDock::updateLinkedToDate(QDate date)
    {
       disconnect(m_pFromDW  ,  SIGNAL(changed(QDate)),       this, SLOT(updateLinkedFromDate(QDate)));
       updateLinkedDate(m_pFromDW,m_pCurrentToDate,date);
       connect(m_pFromDW  ,  SIGNAL(changed(QDate)),       this, SLOT(updateLinkedFromDate(QDate)));
    }
    
    QMimeData* HistoryTree::mimeData( const QList<QTreeWidgetItem *> items) const
    {
       qDebug() << "An history call is being dragged";
       if (items.size() < 1) {
          return NULL;
       }
    
       QMimeData *mimeData = new QMimeData();
    
       //Contact
       if (dynamic_cast<QNumericTreeWidgetItem*>(items[0])) {
          QNumericTreeWidgetItem* item = dynamic_cast<QNumericTreeWidgetItem*>(items[0]);
          if (item->widget != 0) {
             mimeData->setData(MIME_PHONENUMBER, item->widget->call()->getPeerPhoneNumber().toUtf8());
          }
       }
       else {
          qDebug() << "the item is not a call";
       }
    
    // 
    //    //Plain text for other applications
    //    mimeData->setData(MIME_PLAIN_TEXT, QString(getCall(items[0])->getPeerName()+"\n"+getCall(items[0])->getPeerPhoneNumber()).toAscii());
    // 
    //    //TODO Comment this line if you don't want to see ugly artefact, but the caller details will not be visible while dragged
    //    items[0]->setText(0, getCall(items[0])->getPeerName() + "\n" + getCall(items[0])->getPeerPhoneNumber());
       return mimeData;
    }
    
    bool HistoryTree::dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action)
    {
       Q_UNUSED(index)
       Q_UNUSED(action)
    
       QByteArray encodedData = data->data(MIME_CALLID);
    
       qDebug() << "In history import"<< QString(encodedData);
    
       return false;
    }