diff options
author | Christian Kamm <christian.d.kamm@nokia.com> | 2010-11-03 14:12:17 +0100 |
---|---|---|
committer | Christian Kamm <christian.d.kamm@nokia.com> | 2010-11-03 14:20:14 +0100 |
commit | 863c859c25509452c3cea462a88c022b03c6bd20 (patch) | |
tree | fdf9be9eb92bae87c926970ee59f176d4a308e1b | |
parent | 22a92c06e1cb452401c1188901d17cbd6bbb0fb6 (diff) |
Feedback: Implement adding and removing of actuators.
-rw-r--r-- | src/mobility/feedback.cpp | 84 | ||||
-rw-r--r-- | src/mobility/feedback.h | 6 | ||||
-rw-r--r-- | src/mobility/mobilitymanager.cpp | 4 | ||||
-rw-r--r-- | src/ui/feedbackui.cpp | 66 | ||||
-rw-r--r-- | src/ui/feedbackui.h | 11 |
5 files changed, 152 insertions, 19 deletions
diff --git a/src/mobility/feedback.cpp b/src/mobility/feedback.cpp index 1711891..8bf7791 100644 --- a/src/mobility/feedback.cpp +++ b/src/mobility/feedback.cpp @@ -109,6 +109,7 @@ int Feedback::startEffect(int actuatorId, const QString &info, int duration) effect.info = info; effect.duration = duration; effect.state = QFeedbackEffect::Running; + effect.runTime = 0; QTimer *timer = new QTimer(this); effect.timer = timer; @@ -133,9 +134,6 @@ bool Feedback::resumeEffect(int effectId) return false; EffectData &effect = mEffects[effectId]; - if (effect.state != QFeedbackEffect::Paused) - return false; - effect.state = QFeedbackEffect::Running; effect.lastStartTime.start(); if (effect.duration != QFeedbackEffect::Infinite && effect.timer) { @@ -148,16 +146,28 @@ bool Feedback::resumeEffect(int effectId) return true; } -bool Feedback::stopEffect(int effectId) +bool Feedback::pauseEffect(int effectId) { if (!mEffects.contains(effectId)) return false; EffectData &effect = mEffects[effectId]; - if (effect.state != QFeedbackEffect::Running - && effect.state != QFeedbackEffect::Paused) { - return false; + if (effect.state == QFeedbackEffect::Running) { + effect.runTime += effect.lastStartTime.elapsed(); + effect.timer->stop(); } + effect.state = QFeedbackEffect::Paused; + + emit effectStateChanged(effectId, effect.state); + + return true; +} + +bool Feedback::stopEffect(int effectId) +{ + if (!mEffects.contains(effectId)) + return false; + EffectData &effect = mEffects[effectId]; ActuatorData &actuator = mActuators[effect.actuatorId]; actuator.state = QFeedbackActuator::Ready; @@ -237,6 +247,66 @@ void Feedback::setActuatorData(const ActuatorData &data) emit actuatorChanged(data); } +void Feedback::setEffectState(int actuatorId, QFeedbackEffect::State state) +{ + const EffectData &activeEffect = effectForActuator(actuatorId); + if (activeEffect.actuatorId != actuatorId) + return; + + if (state == activeEffect.state) + return; + + const int effectId = mTimerToEffectId.value(activeEffect.timer); + if (state == QFeedbackEffect::Stopped) { + stopEffect(effectId); + } else if (state == QFeedbackEffect::Running) { + resumeEffect(effectId); + } else if (state == QFeedbackEffect::Paused) { + pauseEffect(effectId); + } else if (state == QFeedbackEffect::Loading) { + EffectData &mutableEffect = mEffects[effectId]; + if (mutableEffect.state == QFeedbackEffect::Running) { + mutableEffect.runTime += mutableEffect.lastStartTime.elapsed(); + mutableEffect.timer->stop(); + } + mutableEffect.state = state; + emit effectStateChanged(effectId, state); + } +} + +void Feedback::addActuator(const QtMobility::ActuatorData &data) +{ + QtMobility::ActuatorData actuator = data; + actuator.id = mNextActuatorId++; + mActuators.insert(actuator.id, actuator); + + emit actuatorAdded(actuator); + + if (mDefaultActuator == -1 && mActuators.size() == 1) { + mDefaultActuator = actuator.id; + emit defaultActuatorIdChanged(mDefaultActuator); + } +} + +void Feedback::removeActuator(int actuatorId) +{ + if (!mActuators.contains(actuatorId)) + return; + + foreach (const EffectData &effect, mEffects) { + if (effect.actuatorId == actuatorId) + stopEffect(mTimerToEffectId.value(effect.timer)); + } + + if (mDefaultActuator == actuatorId) { + mDefaultActuator = -1; + emit defaultActuatorIdChanged(mDefaultActuator); + } + + mActuators.remove(actuatorId); + emit actuatorRemoved(actuatorId); +} + void Feedback::doneWithEffect() { QTimer *timer = qobject_cast<QTimer *>(sender()); diff --git a/src/mobility/feedback.h b/src/mobility/feedback.h index 01d1e73..b520f56 100644 --- a/src/mobility/feedback.h +++ b/src/mobility/feedback.h @@ -62,12 +62,17 @@ public: int startEffect(int actuatorId, const QString &info, int duration); bool resumeEffect(int effectId); + bool pauseEffect(int effectId); bool stopEffect(int effectId); void setEffectDuration(int effectId, int duration); void setActuatorEnabled(int actuatorId, bool enabled); void setDefaultActuatorId(int actuatorId); void setActuatorData(const QtMobility::ActuatorData &data); + void setEffectState(int actuatorId, QtMobility::QFeedbackEffect::State state); + + void addActuator(const QtMobility::ActuatorData &data); + void removeActuator(int actuatorId); public slots: void setInitialData(); @@ -75,6 +80,7 @@ public slots: signals: void actuatorAdded(QtMobility::ActuatorData data); void actuatorChanged(QtMobility::ActuatorData data); + void actuatorRemoved(int actuatorId); void defaultActuatorIdChanged(int actuatorId); void effectStateChanged(int effectId, QtMobility::QFeedbackEffect::State state); diff --git a/src/mobility/mobilitymanager.cpp b/src/mobility/mobilitymanager.cpp index cc5deac..5a033df 100644 --- a/src/mobility/mobilitymanager.cpp +++ b/src/mobility/mobilitymanager.cpp @@ -480,6 +480,10 @@ void MobilityClient::setRequestsFeedback() connect(feedback, SIGNAL(actuatorChanged(QtMobility::ActuatorData)), this, SLOT(sendActuatorChange(QtMobility::ActuatorData))); + connect(feedback, SIGNAL(actuatorAdded(QtMobility::ActuatorData)), + this, SLOT(sendActuatorChange(QtMobility::ActuatorData))); + // We do not listen to actuatorRemoved on purpose, the api does not allow for + // removing actuators at runtime. connect(feedback, SIGNAL(effectStateChanged(int,QtMobility::QFeedbackEffect::State)), this, SLOT(sendEffectStateChange(int,QtMobility::QFeedbackEffect::State))); connect(feedback, SIGNAL(defaultActuatorIdChanged(int)), diff --git a/src/ui/feedbackui.cpp b/src/ui/feedbackui.cpp index 8f718c9..6dc5096 100644 --- a/src/ui/feedbackui.cpp +++ b/src/ui/feedbackui.cpp @@ -37,6 +37,7 @@ #include <QtGui/QCheckBox> #include <QtGui/QGroupBox> #include <QtGui/QLabel> +#include <QtGui/QInputDialog> FeedbackUi::FeedbackUi(Feedback *feedback, QWidget *parent) : ToolBoxPage(parent) @@ -46,11 +47,11 @@ FeedbackUi::FeedbackUi(Feedback *feedback, QWidget *parent) QList<OptionsItem *> optionsList; mActuators = new QComboBox; - QPushButton *addActuator = new QPushButton(tr("Add")); - QPushButton *removeActuator = new QPushButton(tr("Remove")); + mAddActuatorButton = new QPushButton(tr("Add")); + mRemoveActuatorButton = new QPushButton(tr("Remove")); QHBoxLayout *hLayout = new QHBoxLayout; - hLayout->addWidget(addActuator); - hLayout->addWidget(removeActuator); + hLayout->addWidget(mRemoveActuatorButton); + hLayout->addWidget(mAddActuatorButton); QVBoxLayout *vLayout = new QVBoxLayout; vLayout->addWidget(mActuators); vLayout->addLayout(hLayout); @@ -87,16 +88,15 @@ FeedbackUi::FeedbackUi(Feedback *feedback, QWidget *parent) connect(mActuators, SIGNAL(activated(int)), SLOT(showActuatorInfo())); connect(mFeedback, SIGNAL(actuatorChanged(QtMobility::ActuatorData)), SLOT(showActuatorInfo())); connect(mFeedback, SIGNAL(effectStateChanged(int,QtMobility::QFeedbackEffect::State)), SLOT(showActuatorInfo())); + connect(mFeedback, SIGNAL(defaultActuatorIdChanged(int)), SLOT(showActuatorInfo())); connect(mFeedback, SIGNAL(actuatorAdded(QtMobility::ActuatorData)), SLOT(addActuator(QtMobility::ActuatorData))); + connect(mFeedback, SIGNAL(actuatorRemoved(int)), SLOT(removeActuator(int))); connect(mActuatorDefault, SIGNAL(toggled(bool)), SLOT(changeActuatorData())); connect(mActuatorEnabled, SIGNAL(toggled(bool)), SLOT(changeActuatorData())); connect(mActuatorState, SIGNAL(currentIndexChanged(int)), SLOT(changeActuatorData())); -// connect(systemInfoAddDrive, SIGNAL(clicked()), SLOT(addDriveClicked())); -// connect(systemInfoRemoveDrive, SIGNAL(clicked()), SLOT(removeDriveClicked())); -// connect(systemInfoChangeDriveName, SIGNAL(clicked()), SLOT(renameDriveClicked())); -// connect(systemInfoDriveType, SIGNAL(activated(int)), SLOT(editDriveInfo())); -// connect(systemInfoDriveTotalSpace, SIGNAL(editingFinished()), SLOT(editDriveInfo())); -// connect(systemInfoDriveAvailableSpace, SIGNAL(editingFinished()), SLOT(editDriveInfo())); + connect(mEffectState, SIGNAL(currentIndexChanged(int)), SLOT(changeEffectState())); + connect(mAddActuatorButton, SIGNAL(clicked()), SLOT(newActuatorClicked())); + connect(mRemoveActuatorButton, SIGNAL(clicked()), SLOT(removeActuatorClicked())); OptionsItem *item = new OptionsItem("", feedbackWidget, true); item->setTags(tags); @@ -152,12 +152,46 @@ void FeedbackUi::addActuator(const QtMobility::ActuatorData &data) showActuatorInfo(); } +void FeedbackUi::removeActuator(int actuatorId) +{ + for (int i = mActuators->count()-1; i >= 0; --i) { + const int itemActuatorId = mActuators->itemData(i).toInt(); + if (itemActuatorId == actuatorId) + mActuators->removeItem(i); + } + + showActuatorInfo(); +} + +void FeedbackUi::newActuatorClicked() +{ + const QString newName = QInputDialog::getText(0, + tr("Add New Actuator"), tr("Enter a name for the new actuator:")); + if (newName.isEmpty()) + return; + + QtMobility::ActuatorData data; + data.enabled = true; + data.name = newName; + data.state = QtMobility::QFeedbackActuator::Ready; + mFeedback->addActuator(data); +} + +void FeedbackUi::removeActuatorClicked() +{ + if (mActuators->count() == 0) + return; + + const int actuatorId = mActuators->itemData(mActuators->currentIndex()).toInt(); + mFeedback->removeActuator(actuatorId); +} + void FeedbackUi::changeActuatorData() { if (mActuators->count() == 0) return; - int actuatorId = mActuators->itemData(mActuators->currentIndex()).toInt(); + const int actuatorId = mActuators->itemData(mActuators->currentIndex()).toInt(); const QtMobility::ActuatorData &actuator = mFeedback->actuator(actuatorId); if (actuator.id != actuatorId) return; @@ -173,6 +207,15 @@ void FeedbackUi::changeActuatorData() mFeedback->setActuatorData(newData); } +void FeedbackUi::changeEffectState() +{ + if (mActuators->count() == 0) + return; + + const int actuatorId = mActuators->itemData(mActuators->currentIndex()).toInt(); + mFeedback->setEffectState(actuatorId, static_cast<QtMobility::QFeedbackEffect::State>(mEffectState->currentIndex())); +} + void FeedbackUi::initializeOptions() { // must match enums @@ -189,6 +232,7 @@ void FeedbackUi::initializeOptions() void FeedbackUi::setEnabled(bool enabled) { mActuators->setEnabled(enabled); + mRemoveActuatorButton->setEnabled(enabled); mActuatorDefault->setEnabled(enabled); mActuatorEnabled->setEnabled(enabled); mActuatorState->setEnabled(enabled); diff --git a/src/ui/feedbackui.h b/src/ui/feedbackui.h index beb7e14..0bb58b4 100644 --- a/src/ui/feedbackui.h +++ b/src/ui/feedbackui.h @@ -37,6 +37,7 @@ QT_FORWARD_DECLARE_CLASS(QComboBox) QT_FORWARD_DECLARE_CLASS(QCheckBox) QT_FORWARD_DECLARE_CLASS(QLabel) +QT_FORWARD_DECLARE_CLASS(QPushButton) class FeedbackUi : public ToolBoxPage { @@ -48,14 +49,22 @@ signals: private slots: void showActuatorInfo(); - void addActuator(const QtMobility::ActuatorData &data); + void newActuatorClicked(); + void removeActuatorClicked(); void changeActuatorData(); + void changeEffectState(); + + // changes from Feedback + void addActuator(const QtMobility::ActuatorData &data); // from Feedback + void removeActuator(int actuatorId); private: void initializeOptions(); void setEnabled(bool enabled); QComboBox *mActuators; + QPushButton *mAddActuatorButton; + QPushButton *mRemoveActuatorButton; QCheckBox *mActuatorDefault; QCheckBox *mActuatorEnabled; QComboBox *mActuatorState; |