/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
//USER
#include "logsrecentcallsview.h"
#include "logscomponentrepository.h"
#include "logsabstractviewmanager.h"
#include "logsmodel.h"
#include "logsdefs.h"
#include "logslogger.h"
#include "logscall.h"
#include "logsmessage.h"
#include "logscontact.h"
#include "logseffecthandler.h"
#include "logsmatchesmodel.h"
#include "logspageindicator.h"
//SYSTEM
#include <hbview.h>
#include <hblistview.h>
#include <hbabstractviewitem.h>
#include <hblabel.h>
#include <hbmenu.h>
#include <hbaction.h>
#include <hbtoolbar.h>
#include <dialpad.h>
#include <hblineedit.h>
#include <hbgroupbox.h>
#include <hbmessagebox.h>
#include <hbmainwindow.h>
#include <QTimer>
Q_DECLARE_METATYPE(LogsMatchesModel*)
const int logsMissedCallsMarkingDelayMs = 1000;
const int logsSwipeAngleDelta = 30; // angle is from 0 to 360
// -----------------------------------------------------------------------------
// LogsRecentCallsView::LogsRecentCallsView
// -----------------------------------------------------------------------------
//
LogsRecentCallsView::LogsRecentCallsView(
LogsComponentRepository& repository, LogsAbstractViewManager& viewManager )
: LogsBaseView(LogsRecentViewId, repository, viewManager),
mViewName(0),
mListView(0),
mFilter(0),
mCurrentView(LogsServices::ViewAll),
mAppearingView(LogsServices::ViewAll),
mMoveLeftInList(false),
mEffectHandler(0),
mListViewX(0),
mMatchesModel(0),
mMarkingMissedAsSeen(false),
mPageIndicator(0),
mResetted(false)
{
LOGS_QDEBUG( "logs [UI] <-> LogsRecentCallsView::LogsRecentCallsView()" );
mModel = mRepository.model();
//TODO: taking away due to toolbar bug. If toolbar visibility changes on view
//activation, there will be a crash due to previous view effect is playing
//addViewSwitchingEffects();
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::~LogsRecentCallsView
// -----------------------------------------------------------------------------
//
LogsRecentCallsView::~LogsRecentCallsView()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::~LogsRecentCallsView()" );
delete mMatchesModel;
mModel = 0;
delete mEffectHandler;
delete mFilter;
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::~LogsRecentCallsView()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::activated
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::activated(bool showDialer, QVariant args)
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::activated()" );
// base class handling first
LogsBaseView::activated(showDialer, args);
LogsServices::LogsView view = static_cast<LogsServices::LogsView>( args.toInt() );
// View update is needed when we activate view for the first time (!mFilter)
// or if view has to be changed
if ( !mFilter || ( !args.isNull() && (mCurrentView != view) ) ) {
updateView( view );
}
activateEmptyListIndicator(mFilter);
mDialpad->editor().setText(QString());
mPageIndicator->setActiveItemIndex(mConversionMap.value(mCurrentView));
if ( mResetted ){
// After reset, first data addition should cause scrolling to topitem
connect( mFilter, SIGNAL(rowsInserted(const QModelIndex&,int,int)),
this, SLOT(scrollToTopItem()) );
mResetted = false;
}
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::activated()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::deactivated
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::deactivated()
{
//base class handling first
LogsBaseView::deactivated();
deactivateEmptyListIndicator(mFilter);
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::handleExit()
{
markMissedCallsSeen();
LogsBaseView::handleExit();
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::isExitAllowed
// -----------------------------------------------------------------------------
//
bool LogsRecentCallsView::isExitAllowed()
{
return !mMarkingMissedAsSeen;
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::resetView()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::resetView()" );
LogsBaseView::resetView();
mResetted = true;
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::resetView()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::initView
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::initView()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::initView()" );
//base class handling first
LogsBaseView::initView();
mViewName =
qobject_cast<HbGroupBox*>(mRepository.findWidget(logsGroupboxViewNameId));
addStringsToMap();
initListWidget();
mEffectHandler = new LogsEffectHandler;
connect(mEffectHandler, SIGNAL(dissappearByMovingComplete()),
this, SLOT(dissappearByMovingComplete()));
connect(mEffectHandler, SIGNAL(dissappearByFadingComplete()),
this, SLOT(dissappearByFadingComplete()));
mPageIndicator = qobject_cast<LogsPageIndicator*>
(mRepository.findWidget(logsPageIndicatorId));
mPageIndicator->initialize(mTitleMap.count(), mConversionMap.value(mCurrentView));
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::initView()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::model
// -----------------------------------------------------------------------------
//
QAbstractItemModel* LogsRecentCallsView::model() const
{
return mFilter;
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::callKeyPressed
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::callKeyPressed()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::callKeyPressed()" );
// Call to topmost item in current list
if ( mListView && mFilter && mFilter->hasIndex(0,0) ) {
QModelIndex topIndex = mFilter->index(0,0);
mListView->scrollTo( topIndex );
mListView->setCurrentIndex( topIndex, QItemSelectionModel::Select );
initiateCallback(topIndex);
}
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::callKeyPressed()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::markingCompleted
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::markingCompleted(int err)
{
LOGS_QDEBUG_2( "logs [UI] -> LogsRecentCallsView::markingCompleted(), err", err );
Q_UNUSED(err);
mMarkingMissedAsSeen = false;
emit exitAllowed();
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::markingCompleted()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::openDialpad
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::openDialpad()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::openDialpad()" );
LogsBaseView::openDialpad();
// Create matches model already before any input to optimize
// first search
if ( !mMatchesModel ){
mMatchesModel = mModel->logsMatchesModel();
}
updateCallButton();
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::openDialpad()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::dialpadEditorTextChanged
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::dialpadEditorTextChanged()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::dialpadEditorTextChanged()" );
if ( mDialpad->editor().text().length() > 0 ) {
QVariant arg = qVariantFromValue( mMatchesModel );
if ( mViewManager.activateView( LogsMatchesViewId, true, arg ) ){
mMatchesModel = 0; // Ownership was given to matches view
}
} else {
updateCallButton();
}
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::dialpadEditorTextChanged()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::clearList
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::clearList()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::clearList()->" );
if ( mFilter ) {
if ( askConfirmation( hbTrId("txt_dialer_ui_title_clear_list"),
hbTrId("txt_dialer_ui_info_all_call_events_will_be_remo"))){
mModel->clearList( mFilter->clearType() );
}
}
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::clearList()<-" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::updateView
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::updateView(LogsServices::LogsView view)
{
LOGS_QDEBUG_2( "logs [UI] -> LogsRecentCallsView::updateView(), view:", view );
mCurrentView = view;
LogsFilter::FilterType filter = getFilter( view );
updateFilter(filter);
updateViewName();
updateContextMenuItems(mCurrentView);
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateView()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::changeFilter
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::changeFilter(HbAction* action)
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::changeFilter()" );
LogsServices::LogsView view = mActionMap.key( action->objectName(),
LogsServices::ViewAll );
updateContextMenuItems(view);
changeView(view);
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::changeFilter()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::handleBackSoftkey
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::handleBackSoftkey()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::handleBackSoftkey()" );
handleExit();
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::handleBackSoftkey()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::addStringsToMap
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::addStringsToMap()
{
mTitleMap.insert(LogsBaseView::ViewAll, hbTrId("txt_dialer_subhead_recent_calls"));
mTitleMap.insert(LogsBaseView::ViewCalled, hbTrId("txt_dialer_subhead_dialled_calls"));
mTitleMap.insert(LogsBaseView::ViewReceived, hbTrId("txt_dial_subhead_received_calls"));
mTitleMap.insert(LogsBaseView::ViewMissed, hbTrId("txt_dialer_subhead_missed_calls"));
mConversionMap.insert(LogsServices::ViewAll, LogsBaseView::ViewAll);
mConversionMap.insert(LogsServices::ViewCalled, LogsBaseView::ViewCalled);
mConversionMap.insert(LogsServices::ViewReceived, LogsBaseView::ViewReceived);
mConversionMap.insert(LogsServices::ViewMissed, LogsBaseView::ViewMissed);
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::initListWidget
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::initListWidget()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::initListWidget()" );
mListView = qobject_cast<HbListView*>
( mRepository.findWidget( logsListWidgetId ) );
Q_ASSERT_X(mListView != 0, "logs [UI] ", "couldn't find list widget !!");
// Optimize memory usage, list reserves only memory for visible items
mListView->setItemRecycling(true);
connect(mListView, SIGNAL(activated(const QModelIndex)),
this, SLOT(initiateCallback(const QModelIndex)));
connect(mListView,
SIGNAL(longPressed(HbAbstractViewItem*, const QPointF&)),
this,
SLOT(showListItemMenu(HbAbstractViewItem*, const QPointF&)));
mListView->setScrollingStyle(HbScrollArea::PanOrFlick);
mListView->setFrictionEnabled(true);
mListViewX = mListView->pos().x();
grabGesture(Qt::SwipeGesture);
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::initListWidget() " );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::updateFilter
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::updateFilter(LogsFilter::FilterType type)
{
if ( mListView ) {
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::updateFilter()" );
deactivateEmptyListIndicator(mFilter);
handleMissedCallsMarking();
delete mFilter;
mFilter = 0;
mFilter = new LogsFilter( type );
mFilter->setSourceModel( mModel );
mListView->setModel( mFilter );//ownership not transferred
scrollToTopItem();
activateEmptyListIndicator(mFilter);
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateFilter() " );
} else {
LOGS_QWARNING( "logs [UI] LogsRecentCallsView::updateFilter(), !no list widget!" );
}
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::updateViewName
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::updateViewName()
{
if ( mViewName ) {
mViewName->setHeading( mTitleMap.value(mConversionMap.value(mCurrentView)));
}
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::updateContextMenuItems
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::updateContextMenuItems(LogsServices::LogsView view)
{
LOGS_QDEBUG_2(
"logs [UI] -> LogsRecentCallsView::updateContextMenuItems(), view:", view );
if ( mShowFilterMenu ) {
QString activeActionName = mActionMap.value(view);
foreach (QAction* action, mShowFilterMenu->actions() ) {
action->setChecked( action->objectName() == activeActionName );
}
}
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateContextMenuItems()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::getFilter
// -----------------------------------------------------------------------------
//
LogsFilter::FilterType LogsRecentCallsView::getFilter(LogsServices::LogsView view)
{
LogsFilter::FilterType filter = LogsFilter::All;
switch (view){
case LogsServices::ViewAll:
filter = LogsFilter::All;
break;
case LogsServices::ViewReceived:
filter = LogsFilter::Received;
break;
case LogsServices::ViewCalled:
filter = LogsFilter::Called;
break;
case LogsServices::ViewMissed:
filter = LogsFilter::Missed;
break;
default:
break;
}
return filter;
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::gestureEvent
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::gestureEvent(QGestureEvent *event)
{
QGesture* gesture = event->gesture(Qt::SwipeGesture);
if (gesture) {
QSwipeGesture* swipe = static_cast<QSwipeGesture *>(gesture);
if (swipe->state() == Qt::GestureFinished) {
QSwipeGesture::SwipeDirection direction = swipeAngleToDirection(
swipe->swipeAngle(), logsSwipeAngleDelta);
if (mViewManager.mainWindow().orientation() == Qt::Vertical) {
if (direction == QSwipeGesture::Left) {
leftFlick();
event->accept(Qt::SwipeGesture);
} else if (direction == QSwipeGesture::Right) {
rightFlick();
event->accept(Qt::SwipeGesture);
}
} else {
if (direction == QSwipeGesture::Down) {
rightFlick();
event->accept(Qt::SwipeGesture);
} else if (direction == QSwipeGesture::Up) {
leftFlick();
event->accept(Qt::SwipeGesture);
}
}
}
}
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::swipeAngleToDirection
// -----------------------------------------------------------------------------
//
QSwipeGesture::SwipeDirection LogsRecentCallsView::swipeAngleToDirection(
int angle, int delta)
{
QSwipeGesture::SwipeDirection direction(QSwipeGesture::NoDirection);
if ((angle > 90-delta) && (angle < 90+delta)) {
direction = QSwipeGesture::Up;
} else if ((angle > 270-delta) && (angle < 270+delta)) {
direction = QSwipeGesture::Down;
} else if (((angle >= 0) && (angle < delta))
|| ((angle > 360-delta) && (angle <= 360))) {
direction = QSwipeGesture::Right;
} else if ((angle > 180-delta) && (angle < 180+delta)) {
direction = QSwipeGesture::Left;
}
LOGS_QDEBUG_4( "logs [UI] LogsRecentCallsView::swipeAngleToDirection() angle: ",
angle, " direction: ", direction );
return direction;
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::leftFlick
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::leftFlick()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::leftFlick()" );
if ( mConversionMap.value(mCurrentView) + 1 < mTitleMap.count() ){
LogsBaseView::LogsViewMap viewmap =
static_cast<LogsBaseView::LogsViewMap>(mConversionMap.value(mCurrentView) +1);
changeView( mConversionMap.key(viewmap) );
} else {
if (model() && model()->rowCount() > 0) {
mEffectHandler->startMoveNotPossibleEffect(*mListView, false, mListViewX);
} else {
mEffectHandler->startMoveNotPossibleEffect(*mEmptyListLabel, false, mListViewX);
}
}
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::leftFlick()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::rightFlick
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::rightFlick()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::rightFlick()" );
if ( mConversionMap.value(mCurrentView) > 0 ){
LogsBaseView::LogsViewMap viewmap =
static_cast<LogsBaseView::LogsViewMap>(mConversionMap.value(mCurrentView) - 1);
changeView( mConversionMap.key(viewmap) );
} else {
if (model() && model()->rowCount() > 0) {
mEffectHandler->startMoveNotPossibleEffect(*mListView, true, mListViewX);
} else {
mEffectHandler->startMoveNotPossibleEffect(*mEmptyListLabel, true, mListViewX);
}
}
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::rightFlick()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::changeView
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::changeView(LogsServices::LogsView view)
{
LOGS_QDEBUG_2( "logs [UI] -> LogsRecentCallsView::changeView(), view:", view );
if ( view == mCurrentView ){
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::changeView(), view already correct" );
// Already correct view, running animation can continue but make sure that
// appearing view is then correct.
mAppearingView = view;
return;
}
mMoveLeftInList = mConversionMap.value(view) < mConversionMap.value(mCurrentView);
mAppearingView = view;
mEffectHandler->startDissappearAppearByFadingEffect(*mViewName);
mEffectHandler->startDissappearAppearByMovingEffect(
*mListView, *mEmptyListLabel, !mMoveLeftInList, mListViewX);
mPageIndicator->setActiveItemIndex(mConversionMap.value(mAppearingView));
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::changeView()" );
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::dissappearByFadingComplete()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::dissappearByFadingComplete()" )
// Previous view name has dissappeared by fading, set new view name
// as it is brought visible by effect
mViewName->setHeading( mTitleMap.value(mConversionMap.value(mAppearingView)) );
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::dissappearByFadingComplete()" )
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::dissappearByMovingComplete()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::dissappearByMovingComplete()" )
updateView( mAppearingView );
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::dissappearByMovingComplete()" )
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::updateMenu
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::updateMenu()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::updateMenu()" );
HbAction* action = qobject_cast<HbAction*>(
mRepository.findObject( logsRecentViewClearListMenuActionId ) );
if ( action && model() ) {
bool visible( model()->rowCount() > 0 );
action->setVisible( visible );
}
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateMenu()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::updateEmptyListWidgetsVisibility
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::updateEmptyListWidgetsVisibility()
{
updateMenu();
updateEmptyListLabelVisibility();
updateCallButton();
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::updateWidgetsSizeAndLayout
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::updateWidgetsSizeAndLayout()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::updateWidgetsSizeAndLayout()" );
if ( mListView ) {
updateListLayoutName(*mListView);
updateListSize();
}
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateWidgetsSizeAndLayout()" );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::updateCallButton
// If dialpad contains text or there is items in list, call button is enabled
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::updateCallButton()
{
bool isVisible = !mDialpad->editor().text().isEmpty();
if ( !isVisible && mFilter ) {
isVisible = ( mFilter->rowCount() > 0 );
}
mDialpad->setCallButtonEnabled( isVisible );
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::handleMissedCallsMarking
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::handleMissedCallsMarking()
{
if ( mFilter && !mMarkingMissedAsSeen && !mResetted &&
( mFilter->filterType() == LogsFilter::Missed ||
mFilter->filterType() == LogsFilter::All ) ){
// Don't care if timer would be already running, slot's implementation
// takes care that marking is done only once
LOGS_QDEBUG( "logs [UI] <-> LogsRecentCallsView::handleMissedCallsMarking()" );
QTimer::singleShot(
logsMissedCallsMarkingDelayMs, this, SLOT(markMissedCallsSeen()) );
}
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::markMissedCallsSeen
// -----------------------------------------------------------------------------
//
bool LogsRecentCallsView::markMissedCallsSeen()
{
if ( !mMarkingMissedAsSeen ){
connect( mModel, SIGNAL(markingCompleted(int)),
this, SLOT(markingCompleted(int)) );
mMarkingMissedAsSeen =
mModel->markEventsSeen(LogsModel::TypeLogsClearMissed);
}
return mMarkingMissedAsSeen;
}
// -----------------------------------------------------------------------------
// LogsRecentCallsView::scrollToTopItem
// -----------------------------------------------------------------------------
//
void LogsRecentCallsView::scrollToTopItem()
{
LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::scrollToTopItem()" );
disconnect( mFilter, SIGNAL(rowsInserted(const QModelIndex&,int,int)),
this, SLOT(scrollToTopItem()));
if ( mFilter && mFilter->hasIndex(0,0) ) {
mListView->scrollTo( mFilter->index(0,0) );
}
LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::scrollToTopItem()" );
}