diff --git a/RingWinClient.pro b/RingWinClient.pro index 7b3c9969f9a005242039ef96d8dced2b7e51cba9..fd52a65f1f2dcacc1777f3a982f4b7b4dadfa0d6 100644 --- a/RingWinClient.pro +++ b/RingWinClient.pro @@ -39,7 +39,8 @@ SOURCES += main.cpp\ videowidget.cpp \ utils.cpp \ wizarddialog.cpp \ - windowscontactbackend.cpp + windowscontactbackend.cpp \ + historydelegate.cpp HEADERS += mainwindow.h \ callwidget.h \ @@ -56,7 +57,8 @@ HEADERS += mainwindow.h \ 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 100fa4a55d30ffe20e1d03babb52133ef84c0d2a..52b055c9cbad33ad4911b58e17c09b8951e2f9ca 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 @@ CallWidget::CallWidget(QWidget *parent) : 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 @@ void 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 @@ CallWidget::callStateChanged(Call* call, Call::State previousState) 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 @@ CallWidget::on_contactView_doubleClicked(const QModelIndex &index) 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 ee31f78dc32a8ee8399f4a4cdb31f33e999a1f13..726a067efeed6939962003b1a95385e1f6353328 100644 --- a/callwidget.h +++ b/callwidget.h @@ -65,6 +65,7 @@ private slots: 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 d8b657f5f3f87f1c8ced77ac986f261c56e00da0..99dbbaf6f5ea71baa289c32890504c55d418ffba 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 0000000000000000000000000000000000000000..99488ba483ed52c998a79461ce81e31c6ba3de75 --- /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 0000000000000000000000000000000000000000..d15424f0f49a590c7c3d5c668a5af335b88925b4 --- /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