| 1 | /**************************************************************************** |
| 2 | ** |
| 3 | ** Copyright (C) 2016 The Qt Company Ltd. |
| 4 | ** Contact: http://www.qt.io/licensing/ |
| 5 | ** |
| 6 | ** This file is part of the QtFeedback module of the Qt Toolkit. |
| 7 | ** |
| 8 | ** $QT_BEGIN_LICENSE:LGPL3$ |
| 9 | ** Commercial License Usage |
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in |
| 11 | ** accordance with the commercial license agreement provided with the |
| 12 | ** Software or, alternatively, in accordance with the terms contained in |
| 13 | ** a written agreement between you and The Qt Company. For licensing terms |
| 14 | ** and conditions see http://www.qt.io/terms-conditions. For further |
| 15 | ** information use the contact form at http://www.qt.io/contact-us. |
| 16 | ** |
| 17 | ** GNU Lesser General Public License Usage |
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
| 19 | ** General Public License version 3 as published by the Free Software |
| 20 | ** Foundation and appearing in the file LICENSE.LGPLv3 included in the |
| 21 | ** packaging of this file. Please review the following information to |
| 22 | ** ensure the GNU Lesser General Public License version 3 requirements |
| 23 | ** will be met: https://www.gnu.org/licenses/lgpl.html. |
| 24 | ** |
| 25 | ** GNU General Public License Usage |
| 26 | ** Alternatively, this file may be used under the terms of the GNU |
| 27 | ** General Public License version 2.0 or later as published by the Free |
| 28 | ** Software Foundation and appearing in the file LICENSE.GPL included in |
| 29 | ** the packaging of this file. Please review the following information to |
| 30 | ** ensure the GNU General Public License version 2.0 requirements will be |
| 31 | ** met: http://www.gnu.org/licenses/gpl-2.0.html. |
| 32 | ** |
| 33 | ** $QT_END_LICENSE$ |
| 34 | ** |
| 35 | ****************************************************************************/ |
| 36 | |
| 37 | #include "qdeclarativefeedbackeffect_p.h" |
| 38 | |
| 39 | /*! |
| 40 | \qmltype FeedbackEffect |
| 41 | \instantiates QDeclarativeFeedbackEffect |
| 42 | \brief The FeedbackEffect element is the base class for all feedback effects. |
| 43 | \ingroup qml-feedback-api |
| 44 | |
| 45 | You can't create one of these elements directly, but several other elements |
| 46 | inherit the methods and properties of these elements. |
| 47 | |
| 48 | There are several predefined enumerations and constants provided in this class: |
| 49 | |
| 50 | 1. Duration |
| 51 | This enum describes the possible predefined duration types. Generally a specific |
| 52 | value in milliseconds can be supplied instead of one of these values. |
| 53 | \list |
| 54 | \li Feedback.Infinite - Infinite effect duration |
| 55 | \endlist |
| 56 | |
| 57 | 2. State |
| 58 | This enum describes the state of the effect. An effect will be in one of these states. |
| 59 | \list |
| 60 | \li Feedback.Stopped - The effect is not running. This is the initial state. |
| 61 | \li Feedback.Paused - The effect is paused. |
| 62 | \li Feedback.Running - The effect is running. |
| 63 | \li Feedback.Loading - The effect is loading. |
| 64 | \endlist |
| 65 | |
| 66 | 3. ErrorType |
| 67 | This enum describes the possible errors happening on the effect. |
| 68 | \list |
| 69 | \li Feedback.UnknownError - An unknown error occurred. |
| 70 | \li Feedback.DeviceBusy - The feedback could not start because the device is busy, |
| 71 | the device could be busy if a higher-priority client is using the haptics/actuator device. |
| 72 | \endlist |
| 73 | |
| 74 | |
| 75 | \sa FileEffect, ThemeEffect, HapticsEffect, {QFeedbackEffect} |
| 76 | */ |
| 77 | |
| 78 | QDeclarativeFeedbackEffect::QDeclarativeFeedbackEffect(QObject *parent) |
| 79 | : QObject(parent), m_running(false), m_paused(false), m_error(UnknownError) |
| 80 | { |
| 81 | } |
| 82 | |
| 83 | void QDeclarativeFeedbackEffect::setFeedbackEffect(QFeedbackEffect* effect) |
| 84 | { |
| 85 | m_effect = effect; |
| 86 | QObject::connect(sender: m_effect, SIGNAL(stateChanged()), receiver: this, SLOT(updateState())); |
| 87 | QObject::connect(sender: m_effect, SIGNAL(error(QFeedbackEffect::ErrorType)), receiver: this, SLOT(_error(QFeedbackEffect::ErrorType))); |
| 88 | } |
| 89 | QFeedbackEffect* QDeclarativeFeedbackEffect::feedbackEffect() |
| 90 | { |
| 91 | return m_effect; |
| 92 | } |
| 93 | |
| 94 | /*! |
| 95 | \qmlproperty bool FeedbackEffect::running |
| 96 | |
| 97 | This property is true if this feedback effect is running. |
| 98 | */ |
| 99 | bool QDeclarativeFeedbackEffect::isRunning() const |
| 100 | { |
| 101 | return m_running; |
| 102 | } |
| 103 | void QDeclarativeFeedbackEffect::setRunning(bool running) |
| 104 | { |
| 105 | QDeclarativeFeedbackEffect::State currentState = static_cast<QDeclarativeFeedbackEffect::State>(m_effect->state()); |
| 106 | if (currentState != QDeclarativeFeedbackEffect::Running && running) { |
| 107 | m_running = true; |
| 108 | m_effect->start(); |
| 109 | emit runningChanged(); |
| 110 | } else if (currentState != QDeclarativeFeedbackEffect::Stopped && !running) { |
| 111 | m_running = false; |
| 112 | m_effect->stop(); |
| 113 | emit runningChanged(); |
| 114 | } |
| 115 | } |
| 116 | |
| 117 | /*! |
| 118 | \qmlproperty bool FeedbackEffect::paused |
| 119 | |
| 120 | This property is true if this feedback effect is paused. |
| 121 | */ |
| 122 | bool QDeclarativeFeedbackEffect::isPaused() const |
| 123 | { |
| 124 | return m_paused; |
| 125 | } |
| 126 | void QDeclarativeFeedbackEffect::setPaused(bool paused) |
| 127 | { |
| 128 | QDeclarativeFeedbackEffect::State currentState = static_cast<QDeclarativeFeedbackEffect::State>(m_effect->state()); |
| 129 | if (currentState == QDeclarativeFeedbackEffect::Paused && !paused) { |
| 130 | m_paused = true; |
| 131 | m_effect->start(); |
| 132 | emit pausedChanged(); |
| 133 | } else if (currentState == QDeclarativeFeedbackEffect::Running && paused) { |
| 134 | paused = false; |
| 135 | m_effect->pause(); |
| 136 | emit pausedChanged(); |
| 137 | } |
| 138 | } |
| 139 | |
| 140 | |
| 141 | /*! |
| 142 | \qmlproperty int FeedbackEffect::duration |
| 143 | |
| 144 | The duration of the effect, in milliseconds. This is 0 for effects of unknown |
| 145 | duration, or Feedback.Infinite for effects that don't stop. |
| 146 | \sa Feedback |
| 147 | */ |
| 148 | int QDeclarativeFeedbackEffect::duration() const |
| 149 | { |
| 150 | return m_effect->duration(); |
| 151 | } |
| 152 | void QDeclarativeFeedbackEffect::setDuration(int newDuration) |
| 153 | { |
| 154 | Q_UNUSED(newDuration) |
| 155 | //default do nothing |
| 156 | } |
| 157 | |
| 158 | /*! |
| 159 | \qmlproperty FeedbackEffect::State FeedbackEffect::state |
| 160 | |
| 161 | This is the current state of the effect. It is one of: |
| 162 | \list |
| 163 | \li Feedback.Stopped - the effect is not playing. |
| 164 | \li Feedback.Loading - the effect is being loaded. |
| 165 | \li Feedback.Running - the effect is playing. |
| 166 | \li Feedback.Paused - the effect was being played, but is now paused. |
| 167 | \endlist |
| 168 | \sa Feedback |
| 169 | */ |
| 170 | QDeclarativeFeedbackEffect::State QDeclarativeFeedbackEffect::state() const |
| 171 | { |
| 172 | return static_cast<QDeclarativeFeedbackEffect::State>(m_effect->state()); |
| 173 | } |
| 174 | |
| 175 | void QDeclarativeFeedbackEffect::setState(QDeclarativeFeedbackEffect::State newState) |
| 176 | { |
| 177 | Q_UNUSED(newState) |
| 178 | //default do nothing |
| 179 | } |
| 180 | /*! |
| 181 | \qmlproperty Feedback::ErrorType FeedbackEffect::error |
| 182 | |
| 183 | This property holds the error status of the FeedbackEffect. |
| 184 | The error is one of the following values: |
| 185 | \list |
| 186 | \li Feedback.UnknownError - An unknown error occurred. |
| 187 | \li Feedback.DeviceBusy - The device resource is already being used. |
| 188 | \endlist |
| 189 | |
| 190 | \sa Feedback, QFeedbackEffect::ErrorType |
| 191 | */ |
| 192 | QDeclarativeFeedbackEffect::ErrorType QDeclarativeFeedbackEffect::error() const |
| 193 | { |
| 194 | return m_error; |
| 195 | } |
| 196 | |
| 197 | /*! |
| 198 | \qmlmethod Feedback::updateState() |
| 199 | |
| 200 | updates the state of the effect. |
| 201 | */ |
| 202 | void QDeclarativeFeedbackEffect::updateState() { |
| 203 | bool running = m_effect->state() == QFeedbackEffect::Running; |
| 204 | bool paused = m_effect->state() == QFeedbackEffect::Paused; |
| 205 | if (running != m_running) { |
| 206 | m_running = running; |
| 207 | emit runningChanged(); |
| 208 | } |
| 209 | if (paused != m_paused) { |
| 210 | m_paused = paused; |
| 211 | emit pausedChanged(); |
| 212 | } |
| 213 | emit stateChanged(); |
| 214 | } |
| 215 | |
| 216 | /*! |
| 217 | \qmlmethod Feedback::start() |
| 218 | |
| 219 | makes sure that the effect associated with the feedback object is started. |
| 220 | \sa QFeedbackEffect::start() |
| 221 | */ |
| 222 | void QDeclarativeFeedbackEffect::start() { |
| 223 | m_effect->start(); |
| 224 | } |
| 225 | |
| 226 | /*! |
| 227 | \qmlmethod Feedback::stop() |
| 228 | |
| 229 | makes sure that the effect associated with the feedback object is stoped. |
| 230 | \sa QFeedbackEffect::stop() |
| 231 | */ |
| 232 | void QDeclarativeFeedbackEffect::stop() { |
| 233 | m_effect->stop(); |
| 234 | } |
| 235 | |
| 236 | /*! |
| 237 | \qmlmethod Feedback::pause() |
| 238 | |
| 239 | makes sure that the effect associated with the feedback object is paused. |
| 240 | \sa QFeedbackEffect::pause() |
| 241 | */ |
| 242 | void QDeclarativeFeedbackEffect::pause() { |
| 243 | m_effect->pause(); |
| 244 | } |
| 245 | |
| 246 | void QDeclarativeFeedbackEffect::_error(QFeedbackEffect::ErrorType err) |
| 247 | { |
| 248 | if (static_cast<ErrorType>(err) != m_error) { |
| 249 | m_error = static_cast<ErrorType>(err); |
| 250 | emit errorChanged(); |
| 251 | } |
| 252 | } |
| 253 | |