summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kamm <christian.d.kamm@nokia.com>2010-11-03 14:12:17 +0100
committerChristian Kamm <christian.d.kamm@nokia.com>2010-11-03 14:20:14 +0100
commit863c859c25509452c3cea462a88c022b03c6bd20 (patch)
treefdf9be9eb92bae87c926970ee59f176d4a308e1b
parent22a92c06e1cb452401c1188901d17cbd6bbb0fb6 (diff)
Feedback: Implement adding and removing of actuators.
-rw-r--r--src/mobility/feedback.cpp84
-rw-r--r--src/mobility/feedback.h6
-rw-r--r--src/mobility/mobilitymanager.cpp4
-rw-r--r--src/ui/feedbackui.cpp66
-rw-r--r--src/ui/feedbackui.h11
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;