Initial import from the monolithic Qt.
[profile/ivi/qtdeclarative.git] / examples / declarative / cppextensions / plugins / plugin.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the examples of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:BSD$
10 ** You may use this file under the terms of the BSD license as follows:
11 **
12 ** "Redistribution and use in source and binary forms, with or without
13 ** modification, are permitted provided that the following conditions are
14 ** met:
15 **   * Redistributions of source code must retain the above copyright
16 **     notice, this list of conditions and the following disclaimer.
17 **   * Redistributions in binary form must reproduce the above copyright
18 **     notice, this list of conditions and the following disclaimer in
19 **     the documentation and/or other materials provided with the
20 **     distribution.
21 **   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
22 **     the names of its contributors may be used to endorse or promote
23 **     products derived from this software without specific prior written
24 **     permission.
25 **
26 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40
41 #include <QtDeclarative/QDeclarativeExtensionPlugin>
42 #include <QtDeclarative/qdeclarative.h>
43 #include <qdebug.h>
44 #include <qdatetime.h>
45 #include <qbasictimer.h>
46 #include <qapplication.h>
47
48 // Implements a "TimeModel" class with hour and minute properties
49 // that change on-the-minute yet efficiently sleep the rest
50 // of the time.
51
52 class MinuteTimer : public QObject
53 {
54     Q_OBJECT
55 public:
56     MinuteTimer(QObject *parent) : QObject(parent)
57     {
58     }
59
60     void start()
61     {
62         if (!timer.isActive()) {
63             time = QTime::currentTime();
64             timer.start(60000-time.second()*1000, this);
65         }
66     }
67
68     void stop()
69     {
70         timer.stop();
71     }
72
73     int hour() const { return time.hour(); }
74     int minute() const { return time.minute(); }
75
76 signals:
77     void timeChanged();
78
79 protected:
80     void timerEvent(QTimerEvent *)
81     {
82         QTime now = QTime::currentTime();
83         if (now.second() == 59 && now.minute() == time.minute() && now.hour() == time.hour()) {
84             // just missed time tick over, force it, wait extra 0.5 seconds
85             time.addSecs(60);
86             timer.start(60500, this);
87         } else {
88             time = now;
89             timer.start(60000-time.second()*1000, this);
90         }
91         emit timeChanged();
92     }
93
94 private:
95     QTime time;
96     QBasicTimer timer;
97 };
98
99 //![0]
100 class TimeModel : public QObject
101 {
102     Q_OBJECT
103     Q_PROPERTY(int hour READ hour NOTIFY timeChanged)
104     Q_PROPERTY(int minute READ minute NOTIFY timeChanged)
105 //![0]
106
107 public:
108     TimeModel(QObject *parent=0) : QObject(parent)
109     {
110         if (++instances == 1) {
111             if (!timer)
112                 timer = new MinuteTimer(qApp);
113             connect(timer, SIGNAL(timeChanged()), this, SIGNAL(timeChanged()));
114             timer->start();
115         }
116     }
117
118     ~TimeModel()
119     {
120         if (--instances == 0) {
121             timer->stop();
122         }
123     }
124
125     int minute() const { return timer->minute(); }
126     int hour() const { return timer->hour(); }
127
128 signals:
129     void timeChanged();
130
131 private:
132     QTime t;
133     static MinuteTimer *timer;
134     static int instances;
135 };
136
137 int TimeModel::instances=0;
138 MinuteTimer *TimeModel::timer=0;
139
140 //![plugin]
141 class QExampleQmlPlugin : public QDeclarativeExtensionPlugin
142 {
143     Q_OBJECT
144 public:
145     void registerTypes(const char *uri)
146     {
147         Q_ASSERT(uri == QLatin1String("com.nokia.TimeExample"));
148         qmlRegisterType<TimeModel>(uri, 1, 0, "Time");
149     }
150 };
151 //![plugin]
152
153 #include "plugin.moc"
154
155 //![export]
156 Q_EXPORT_PLUGIN2(qmlqtimeexampleplugin, QExampleQmlPlugin);
157 //![export]