Skip to content
Snippets Groups Projects
Select Git revision
  • 5123d41343087d54f45a77aba3020af132b59ad9
  • master default protected
  • release/202106
  • release/202104
  • release/202101
  • release/202012
  • release/202005
  • release/202001
  • release/201912
  • release/201911
  • release/windows-test/201910
  • release/201908
  • release/201906
  • release/201905
  • release/201904
  • release/201903
  • release/201902
  • release/201901
  • release/201812
  • release/201811
  • release/201808
  • 1.0.0
  • 0.3.0
  • 0.2.1
  • 0.2.0
  • 0.1.0
26 results

conversationpopupmenu.cpp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    historytimecategorymodel.cpp 7.61 KiB
    /****************************************************************************
     *   Copyright (C) 2012-2016 by Savoir-faire Linux                          *
     *   Author : Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> *
     *   Author : Alexandre Lision <alexandre.lision@savoirfairelinux.com>      *
     *                                                                          *
     *   This library is free software; you can redistribute it and/or          *
     *   modify it under the terms of the GNU Lesser General Public             *
     *   License as published by the Free Software Foundation; either           *
     *   version 2.1 of the License, or (at your option) any later version.     *
     *                                                                          *
     *   This library 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      *
     *   Lesser 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 "historytimecategorymodel.h"
    
    #include <QtCore/QDate>
    #include <time.h>
    
    class HistoryTimeCategoryModelPrivate
    {
    public:
       QVector<QString> m_lCategories;
       static HistoryTimeCategoryModel& instance();
    };
    
    HistoryTimeCategoryModel& HistoryTimeCategoryModelPrivate::instance()
    {
       static auto instance = new HistoryTimeCategoryModel();
       return *instance;
    }
    
    HistoryTimeCategoryModel::HistoryTimeCategoryModel(QObject* parent) : QAbstractListModel(parent),
    d_ptr(new HistoryTimeCategoryModelPrivate)
    {
       d_ptr->m_lCategories << tr("Today")                                 ;//0
       d_ptr->m_lCategories << tr("Yesterday")                             ;//1
       d_ptr->m_lCategories << QDate::currentDate().addDays(-2).toString("dddd");//2
       d_ptr->m_lCategories << QDate::currentDate().addDays(-3).toString("dddd");//3
       d_ptr->m_lCategories << QDate::currentDate().addDays(-4).toString("dddd");//4
       d_ptr->m_lCategories << QDate::currentDate().addDays(-5).toString("dddd");//5
       d_ptr->m_lCategories << QDate::currentDate().addDays(-6).toString("dddd");//6
       d_ptr->m_lCategories << tr("A week ago")                            ;//7
       d_ptr->m_lCategories << tr("Two weeks ago")                         ;//8
       d_ptr->m_lCategories << tr("Three weeks ago")                       ;//9
       d_ptr->m_lCategories << tr("A month ago")                           ;//10
       d_ptr->m_lCategories << tr("Two months ago")                        ;//11
       d_ptr->m_lCategories << tr("Three months ago")                      ;//12
       d_ptr->m_lCategories << tr("Four months ago")                       ;//13
       d_ptr->m_lCategories << tr("Five months ago")                       ;//14
       d_ptr->m_lCategories << tr("Six months ago")                        ;//15
       d_ptr->m_lCategories << tr("Seven months ago")                      ;//16
       d_ptr->m_lCategories << tr("Eight months ago")                      ;//17
       d_ptr->m_lCategories << tr("Nine months ago")                       ;//18
       d_ptr->m_lCategories << tr("Ten months ago")                        ;//19
       d_ptr->m_lCategories << tr("Eleven months ago")                     ;//20
       d_ptr->m_lCategories << tr("Twelve months ago")                     ;//21
       d_ptr->m_lCategories << tr("A year ago")                            ;//22
       d_ptr->m_lCategories << tr("Very long time ago")                    ;//23
       d_ptr->m_lCategories << tr("Never")                                 ;//24
    }
    
    HistoryTimeCategoryModel::~HistoryTimeCategoryModel()
    {
       delete d_ptr;
    }
    
    QHash<int,QByteArray> HistoryTimeCategoryModel::roleNames() const
    {
       static QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
       /*static bool initRoles = false;
       if (!initRoles) {
          initRoles = true;
    
       }*/
       return roles;
    }
    
    //Abstract model member
    QVariant HistoryTimeCategoryModel::data(const QModelIndex& index, int role ) const
    {
       if (!index.isValid()) return QVariant();
       switch (role) {
          case Qt::DisplayRole:
             return d_ptr->m_lCategories[index.row()];
       }
       return QVariant();
    }
    
    int HistoryTimeCategoryModel::rowCount(const QModelIndex& parent ) const
    {
       if (parent.isValid()) return 0;
       return d_ptr->m_lCategories.size();
    }
    
    Qt::ItemFlags HistoryTimeCategoryModel::flags(const QModelIndex& index ) const
    {
       Q_UNUSED(index)
       return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
    }
    
    bool HistoryTimeCategoryModel::setData(const QModelIndex& index, const QVariant &value, int role)
    {
       Q_UNUSED(index)
       Q_UNUSED(value)
       Q_UNUSED(role)
       return false;
    }
    
    
    QString HistoryTimeCategoryModel::timeToHistoryCategory(const time_t time)
    {
       static int categoriesSize = HistoryTimeCategoryModelPrivate::instance().d_ptr->m_lCategories.size();
       int period = (int)HistoryTimeCategoryModel::timeToHistoryConst(time);
       if (period >= 0 && period < categoriesSize)
          return HistoryTimeCategoryModelPrivate::instance().d_ptr->m_lCategories[period];
       else
          return HistoryTimeCategoryModelPrivate::instance().d_ptr->m_lCategories[categoriesSize - 1];
    }
    
    HistoryTimeCategoryModel::HistoryConst HistoryTimeCategoryModel::timeToHistoryConst(const time_t time)
    {
       if (!time || time < 0)
          return HistoryTimeCategoryModel::HistoryConst::Never;
    
       time_t currentTime;
       ::time(&currentTime);
    
       /*
       * Struct tm description of fields used below:
       *  tm_yday   int   days since January 1  0-365
       *  tm_mon    int   months since January  0-11
       *  tm_year   int   years since 1900
       *  tm_wday   int   days since Sunday     0-6
       */
       struct tm localCurrentTime;
       struct tm localPastTime;
    
       ::localtime_r(&currentTime, &localCurrentTime);
       ::localtime_r(&time, &localPastTime);
    
       int diffYears = localCurrentTime.tm_year - localPastTime.tm_year;
       int diffMonths = localCurrentTime.tm_mon - localPastTime.tm_mon;
       int diffDays = localCurrentTime.tm_yday - localPastTime.tm_yday;
    
       if (diffYears == 1 && diffMonths < 0) {
          diffMonths += 12;
          diffDays += 365;
          diffYears = 0;
       }
    
       //Sanity check for future dates
       if (diffYears < 0 || (diffYears == 0 && (diffDays < 0 || diffMonths < 0))) {
           return HistoryTimeCategoryModel::HistoryConst::Never;
       }
       //Check for past 6 days
       if (diffYears == 0 && diffDays < 7) {
          return (HistoryTimeCategoryModel::HistoryConst)(diffDays); //Today to Six_days_ago
       }
       //Check for last month
       else if (diffYears == 0 && diffMonths <= 1 && (diffDays / 7 <= 4)) {
          return (HistoryTimeCategoryModel::HistoryConst)(diffDays / 7 + ((int)HistoryTimeCategoryModel::HistoryConst::A_week_ago) - 1); //A_week_ago to Three_weeks_ago
       }
       //Check for last year
       else if (diffYears == 0 && diffMonths > 0) {
          return (HistoryTimeCategoryModel::HistoryConst)(diffMonths + ((int)HistoryTimeCategoryModel::HistoryConst::A_month_ago) - 1); //A_month_ago to Twelve_months ago
       }
       else if (diffYears == 1)
          return HistoryConst::A_year_ago;
    
       //Every other senario
       return HistoryTimeCategoryModel::HistoryConst::Very_long_time_ago;
    }
    
    QString HistoryTimeCategoryModel::indexToName(int idx)
    {
       static int size = HistoryTimeCategoryModelPrivate::instance().d_ptr->m_lCategories.size();
       if (idx < 0 || idx >= size)
          return HistoryTimeCategoryModelPrivate::instance().d_ptr->m_lCategories.last();
       return HistoryTimeCategoryModelPrivate::instance().d_ptr->m_lCategories[idx];
    }