history : add history block in UI

This patch implements the history model from LRC and
display it in UI.

Refs #72793

Change-Id: Id0bd6a2cb6df8ec2e6d2365e0f0c82810b5c8f6b
diff --git a/RingWinClient.pro b/RingWinClient.pro
index 7b3c996..fd52a65 100644
--- a/RingWinClient.pro
+++ b/RingWinClient.pro
@@ -39,7 +39,8 @@
     videowidget.cpp \
     utils.cpp \
     wizarddialog.cpp \
-    windowscontactbackend.cpp
+    windowscontactbackend.cpp \
+    historydelegate.cpp
 
 HEADERS  += mainwindow.h \
     callwidget.h \
@@ -56,7 +57,8 @@
     videowidget.h \
     utils.h \
     wizarddialog.h \
-    windowscontactbackend.h
+    windowscontactbackend.h \
+    historydelegate.h
 
 FORMS    += mainwindow.ui \
     callwidget.ui \
diff --git a/callwidget.cpp b/callwidget.cpp
index 100fa4a..52b055c 100644
--- a/callwidget.cpp
+++ b/callwidget.cpp
@@ -19,6 +19,7 @@
 #include "callwidget.h"
 #include "ui_callwidget.h"
 
+#include <memory>
 
 #include "imconversationmanager.h"
 #include "instantmessagingmodel.h"
@@ -28,6 +29,7 @@
 #include "accountmodel.h"
 #include "categorizedcontactmodel.h"
 #include "windowscontactbackend.h"
+#include "historydelegate.h"
 
 #include "wizarddialog.h"
 
@@ -71,10 +73,18 @@
         PersonModel::instance()->
                 addCollection<WindowsContactBackend>(LoadOptions::FORCE_ENABLED);
 
-        ui->historyList->setModel(CategorizedHistoryModel::instance());
+        auto historyModel = std::unique_ptr<QSortFilterProxyModel>(new QSortFilterProxyModel());
+        historyModel->setSourceModel(CategorizedHistoryModel::instance());
+        historyModel->setSortRole(static_cast<int>(Call::Role::Date));
+        historyModel->sort(0,Qt::DescendingOrder);
+        ui->historyList->setModel(historyModel.get());
+        ui->historyList->setHeaderHidden(true);
+        ui->historyList->setItemDelegate(new HistoryDelegate());
+        historyModel.release();
+
         CategorizedContactModel::instance()->setSortAlphabetical(false);
         ui->contactView->setModel(CategorizedContactModel::instance());
-        ui->contactView->setHeaderHidden(true);
+
         ui->speakerSlider->setValue(Audio::Settings::instance()->playbackVolume());
         ui->micSlider->setValue(Audio::Settings::instance()->captureVolume());
 
@@ -151,7 +161,7 @@
 CallWidget::on_acceptButton_clicked()
 {
     if (actualCall_ != nullptr)
-       actualCall_->performAction(Call::Action::ACCEPT);
+        actualCall_->performAction(Call::Action::ACCEPT);
     ui->callInvite->setVisible(false);
 }
 
@@ -202,7 +212,7 @@
         ui->videoWidget->hide();
     } else if (call->state() == Call::State::HOLD) {
         ui->videoWidget->hide();
-    } else if (call->state() == Call::State::CURRENT){
+    } else if (call->state() == Call::State::CURRENT) {
         ui->videoWidget->show();
         ui->messageOutput->setModel(
                     IMConversationManager::instance()->getModel(actualCall_));
@@ -289,3 +299,13 @@
         outCall->performAction(Call::Action::ACCEPT);
     }
 }
+
+void CallWidget::on_historyList_doubleClicked(const QModelIndex &index)
+{
+    QString number = index.model()->data(index, static_cast<int>(Call::Role::Number)).toString();
+    if (not number.isEmpty()) {
+        auto outCall = CallModel::instance()->dialingCall(number);
+        outCall->setDialNumber(number);
+        outCall->performAction(Call::Action::ACCEPT);
+    }
+}
diff --git a/callwidget.h b/callwidget.h
index ee31f78..726a067 100644
--- a/callwidget.h
+++ b/callwidget.h
@@ -65,6 +65,7 @@
     void on_micSlider_sliderMoved(int position);
     void on_micSlider_sliderReleased();
     void on_contactView_doubleClicked(const QModelIndex &index);
+    void on_historyList_doubleClicked(const QModelIndex &index);
 
 private slots:
     void callIncoming(Call *call);
diff --git a/callwidget.ui b/callwidget.ui
index d8b657f..99dbbaf 100644
--- a/callwidget.ui
+++ b/callwidget.ui
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>700</width>
-    <height>668</height>
+    <height>695</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -125,7 +125,7 @@
             <number>4</number>
            </property>
            <item>
-            <widget class="QTreeView" name="contactView"/>
+            <widget class="QListView" name="contactView"/>
            </item>
           </layout>
          </widget>
diff --git a/historydelegate.cpp b/historydelegate.cpp
new file mode 100644
index 0000000..99488ba
--- /dev/null
+++ b/historydelegate.cpp
@@ -0,0 +1,71 @@
+/***************************************************************************
+ * Copyright (C) 2015 by Savoir-Faire Linux                                *
+ * Author: Edric Ladent Milaret <edric.ladent-milaret@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, see <http://www.gnu.org/licenses/>.   *
+ **************************************************************************/
+
+#include "historydelegate.h"
+
+#include <QDebug>
+
+HistoryDelegate::HistoryDelegate(QObject *parent) :
+    QStyledItemDelegate(parent)
+{
+
+}
+
+void
+HistoryDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
+                       const QModelIndex &index) const
+{
+    QStyleOptionViewItemV4 opt = option;
+    initStyleOption(&opt, index);
+
+    if (index.column() == 0) {
+        auto name = index.model()->data(index, Qt::DisplayRole).toString();
+        auto number = index.model()->data(index, static_cast<int>(Call::Role::Number)).toString();
+        opt.text = "";
+        QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
+        style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
+        auto rect = opt.rect;
+        QPalette::ColorGroup cg = opt.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
+        if (cg == QPalette::Normal && !(opt.state & QStyle::State_Active))
+            cg = QPalette::Inactive;
+        painter->setPen(opt.palette.color(cg, QPalette::Text));
+        painter->setOpacity(1.0);
+        if (not number.isEmpty()) {
+            painter->drawText(QRect(rect.left(), rect.top(), rect.width(), rect.height()/2),
+                              opt.displayAlignment, name);
+            painter->setOpacity(0.7);
+            painter->drawText(QRect(rect.left(), rect.top() + rect.height()/2, rect.width(), rect.height()/2),
+                              opt.displayAlignment, number);
+        } else {
+            painter->drawText(QRect(rect.left(), rect.top(), rect.width(), rect.height()),
+                              opt.displayAlignment, name);
+        }
+    }
+}
+
+QSize
+HistoryDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const
+{
+    QSize result = QStyledItemDelegate::sizeHint(option, index);
+    if (not index.model()->data(index, static_cast<int>(Call::Role::Number)).toString().isEmpty()) {
+        result.setHeight(result.height()*2);
+    } else {
+        result.setHeight(result.height());
+    }
+    return result;
+}
diff --git a/historydelegate.h b/historydelegate.h
new file mode 100644
index 0000000..d15424f
--- /dev/null
+++ b/historydelegate.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2015 by Savoir-Faire Linux                                *
+ * Author: Edric Ladent Milaret <edric.ladent-milaret@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, see <http://www.gnu.org/licenses/>.   *
+ **************************************************************************/
+
+#ifndef HISTORYDELEGATE_H
+#define HISTORYDELEGATE_H
+
+#include <QObject>
+#include <QString>
+#include <QPainter>
+#include <QApplication>
+#include <QStyledItemDelegate>
+
+#include "categorizedhistorymodel.h"
+
+class HistoryDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT
+public:
+    explicit HistoryDelegate(QObject *parent = 0);
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
+signals:
+
+public slots:
+};
+
+#endif // HISTORYDELEGATE_H