Skip to content
Snippets Groups Projects
Select Git revision
  • e72856b765aa80f5cc7ce1a5f40e20a3fa89c8a0
  • master default protected
  • release/201811
  • release/201812
  • release/201901
  • release/201902
  • release/201903
  • release/201904
  • release/201905
  • release/201906
  • release/201908
  • release/201912
  • release/202001
  • release/202005
  • release/windows-test/201910
  • release/201808
  • wip/smartlist_refacto
  • wip/patches_poly_2017/JimmyHamel/MathieuGirouxHuppe
18 results

VideoManager.h

Blame
    • Andreas Traczyk's avatar
      14ba30c4
      video: add video · 14ba30c4
      Andreas Traczyk authored and Andreas Traczyk's avatar Andreas Traczyk committed
      - adds incoming video
      - adds webcam preview
      - adds device enumeration
      - adds daemon video signal handlers
      - adds outgoing video
      
      Tuleap: #1200
      Change-Id: Ife5f6acc2ee400665e096e44e2111e03cab0299a
      14ba30c4
      History
      video: add video
      Andreas Traczyk authored and Andreas Traczyk's avatar Andreas Traczyk committed
      - adds incoming video
      - adds webcam preview
      - adds device enumeration
      - adds daemon video signal handlers
      - adds outgoing video
      
      Tuleap: #1200
      Change-Id: Ife5f6acc2ee400665e096e44e2111e03cab0299a
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    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;
    }