~ubuntu-clock-dev/ubuntu-clock-app/reboot-packaging

« back to all changes in this revision

Viewing changes to backend/modules/Timezone/timezonemodel.cpp

  • Committer: Nekhelesh Ramananthan
  • Date: 2014-07-15 12:50:49 UTC
  • mfrom: (20.1.24 10-world-clocks)
  • Revision ID: krnekhelesh@gmail.com-20140715125049-hhsn7hpe6tqrn3vz
- Added a page to select world cities. It provides search as you type using the new SDK SortFilterModel feature.
- Added a XML file with a list of popular cities.
- The local time at the cities are retrieved using QTimezone and QDateTime classes and used via a QAbstractListModel to automatically update the city list every second.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2014 Canonical Ltd
 
3
 *
 
4
 * This program is free software: you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License version 3 as
 
6
 * published by the Free Software Foundation.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful,
 
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
 * GNU General Public License for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU General Public License
 
14
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
15
 */
 
16
 
 
17
#include <QDateTime>
 
18
#include <QTimeZone>
 
19
#include <QDebug>
 
20
 
 
21
#include "timezonemodel.h"
 
22
 
 
23
TimeZoneModel::TimeZoneModel(QObject *parent):
 
24
    QAbstractListModel(parent)
 
25
{
 
26
    m_updateTimer.setInterval(0);
 
27
    connect(&m_updateTimer, &QTimer::timeout, this, &TimeZoneModel::update);
 
28
}
 
29
 
 
30
/*
 
31
 In order for Qt/QML to know how many entries our model has, we need to
 
32
 implement rowCount() and return the amount of rows.
 
33
*/
 
34
int TimeZoneModel::rowCount(const QModelIndex &parent) const
 
35
{
 
36
    /*
 
37
     QT's models also handle tables and tree views, so the index is not just a
 
38
     integer but consists of a parent, row and a column. Since we using a simple
 
39
     list model, let's ignore the parent. Q_UNUSED(parent) gets rid of the
 
40
     compiler warning about the unused variable.
 
41
    */
 
42
    Q_UNUSED(parent)
 
43
 
 
44
    return m_timeZones.count();
 
45
}
 
46
 
 
47
/*
 
48
 Main function to get the data out of the model. We need to return our stuff
 
49
 here.
 
50
*/
 
51
QVariant TimeZoneModel::data(const QModelIndex &index, int role) const
 
52
{
 
53
    /*
 
54
     Again, ignore everything from the index except row. Were' not into tables
 
55
     and trees.
 
56
    */
 
57
    int row = index.row();
 
58
 
 
59
    /*
 
60
     Now, each cell can have multiple values, e.g. a text value, a color value,
 
61
     an icon value and what not. Those things are selected by using "roles".
 
62
     We have defined Roles in our .h file. Lets use them here.
 
63
    */
 
64
 
 
65
    switch (role) {
 
66
    case RoleCityName:
 
67
        return m_timeZones.at(row).cityName;
 
68
    case RoleCountryName:
 
69
        return m_timeZones.at(row).country;
 
70
    case RoleTimeZoneId:
 
71
        return m_timeZones.at(row).timeZoneId;
 
72
    case RoleTimeString:
 
73
        QTimeZone zone(m_timeZones.at(row).timeZoneId.toLatin1());
 
74
        // TODO: pass formatting options as parameter to toString().
 
75
        // see: http://qt-project.org/doc/qt-5/qdate.html#toString
 
76
        return QDateTime::currentDateTime().toTimeZone(zone).toString("hh:mm");
 
77
    }
 
78
 
 
79
    /*
 
80
     In case the method was called with an invalid index or role, let's
 
81
     return an empty QVariant
 
82
    */
 
83
    return QVariant();
 
84
}
 
85
 
 
86
QHash<int, QByteArray> TimeZoneModel::roleNames() const
 
87
{
 
88
    QHash<int, QByteArray> roles;
 
89
    roles.insert(RoleCityName, "city");
 
90
    roles.insert(RoleCountryName, "country");
 
91
    roles.insert(RoleTimeZoneId, "timezoneID");
 
92
    roles.insert(RoleTimeString, "localTime");
 
93
    return roles;
 
94
}
 
95
 
 
96
int TimeZoneModel::updateInterval() const
 
97
{
 
98
    return m_updateTimer.interval();
 
99
}
 
100
 
 
101
void TimeZoneModel::setUpdateInterval(int updateInterval)
 
102
{
 
103
    if (m_updateTimer.interval() != updateInterval) {
 
104
        m_updateTimer.setInterval(updateInterval);
 
105
        emit updateIntervalChanged();
 
106
 
 
107
        if (m_updateTimer.interval() > 0) {
 
108
            m_updateTimer.start();
 
109
        }
 
110
        else {
 
111
            m_updateTimer.stop();
 
112
        }
 
113
    }
 
114
}
 
115
 
 
116
void TimeZoneModel::update()
 
117
{
 
118
    /*
 
119
     All we have to do is to emit notifications for the view's to re-request
 
120
     the data for role timezoneID because the time will be calculated on the
 
121
     fly anyways. For that we emit dataChanged with a startIndex of 0, an
 
122
     endIndex for the last item and the RoleTimeString as the changed roles.
 
123
    */
 
124
 
 
125
    QModelIndex startIndex = index(0);
 
126
    QModelIndex endIndex = index(m_timeZones.count() - 1);
 
127
    QVector<int> roles;
 
128
    roles << RoleTimeString;
 
129
    emit dataChanged(startIndex, endIndex, roles);
 
130
}