]> Devoid-pointer.net GitWeb - FFBChecker.git/commitdiff
Enable the option to remove effect.
authorMichal Malý <madcatxster@prifuk.cz>
Mon, 29 Jul 2013 13:12:26 +0000 (15:12 +0200)
committerMichal Malý <madcatxster@prifuk.cz>
Mon, 29 Jul 2013 13:12:26 +0000 (15:12 +0200)
ffbdevice.cpp
ffbdevice.h
mainwindow.cpp
mainwindow.h

index 8314a3abe6abb851170000bc64748045a04641ac..4dfe71288078a56cb6b2eea43fa0742e670b6033 100644 (file)
@@ -180,11 +180,28 @@ bool FFBDevice::queryDeviceCapabilities()
   return true;
 }
 
-bool FFBDevice::removeEffect(const int idx)
+bool FFBDevice::removeAndEraseEffect(const int idx)
 {
   if (m_effects[idx]->status() == FFBEffect::FFBEffectStatus::NOT_LOADED)
     return true;
 
+  if (removeEffect(idx)) {
+    m_effects[idx] = FFBEffectFactory::createEffect(FFBEffectTypes::NONE);
+    if (m_effects[idx]->type() != FFBEffectTypes::NONE) {
+      qCritical("Unable to empty the effect slot.");
+      return false;
+    }
+  } else {
+    qCritical("Unable to stop the effect.");
+    return false;
+  }
+
+  m_effects[idx]->setStatus(FFBEffect::FFBEffectStatus::NOT_LOADED);
+  return true;
+}
+
+bool FFBDevice::removeEffect(const int idx)
+{
   if (!stopEffect(idx))
     return false;
 
@@ -192,15 +209,13 @@ bool FFBDevice::removeEffect(const int idx)
   int ret = ioctl(c_fd, EVIOCRMFF, internalIdx);
   if (ret < 0)
     return false;
-
-  m_effects[idx]->setStatus(FFBEffect::FFBEffectStatus::NOT_LOADED);
   return true;
 }
 
 bool FFBDevice::startEffect(const int idx, FFBEffectTypes type, std::shared_ptr<FFBEffectParameters> params)
 {
   if (idx < 0 || idx > c_maxEffectCount) {
-    qDebug() << "Effect index out of bounds";
+    qCritical() << "Effect index out of bounds";
     return false;
   }
 
index 80f2744c693d4e449b6a5d4001999ec25d939e0e..f63e5cec137bed251d5129c05143dcd2b070ff1a 100644 (file)
@@ -30,7 +30,7 @@ public:
   inline const QString& id() const { return c_id; }
   inline int maxEffectCount() const { return c_maxEffectCount; }
   bool queryDeviceCapabilities();
-  bool removeEffect(const int idx);
+  bool removeAndEraseEffect(const int idx);
   bool startEffect(const int idx, FFBEffectTypes type, std::shared_ptr<FFBEffectParameters> params);
   bool stopEffect(const int idx);
   QString waveformName(const PeriodicWaveforms waveform) const;
@@ -38,6 +38,7 @@ public:
 
 private:
   bool isEffectUpdateable(const std::shared_ptr<FFBEffect> effect, const std::shared_ptr<FFBEffectParameters> params, const FFBEffectTypes type);
+  bool removeEffect(const int idx);
   int uploadEffect(struct ff_effect* effect);
   std::vector<FFBEffectTypes> m_availableEffects;
   std::vector<PeriodicWaveforms> m_availablePeriodicWaveforms;
index 7a3ee0f03af3b5e28f3fdb2715556bdbadaa6445..7c246d0a5ad6b544f295242a2f73badbcc5585b0 100644 (file)
@@ -3,6 +3,7 @@
 #include <QtWidgets/QMessageBox>
 #include <QDebug>
 
+const QString MainWindow::res_deviceErrorCap("Device error");
 const QString MainWindow::res_effectNotLoaded("Not loaded");
 const QString MainWindow::res_effectPlaying("Playing");
 const QString MainWindow::res_effectStopped("Stopped");
@@ -26,6 +27,7 @@ MainWindow::MainWindow(std::shared_ptr<DeviceProber> prober, const QString& titl
   connect(ui->cbox_effectSlots, SIGNAL(activated(const int)), this, SLOT(onEffectSlotSelected(const int)));
   connect(ui->cbox_effectTypes, SIGNAL(activated(const int)), this, SLOT(onEffectTypeSelected(const int)));
   connect(ui->qpb_refreshDevices, SIGNAL(clicked()), this, SLOT(onRefreshDevicesClicked()));
+  connect(ui->qpb_remove, SIGNAL(clicked()), this, SLOT(onRemoveEffectClicked()));
   connect(ui->qpb_start, SIGNAL(clicked()), this, SLOT(onStartEffectClicked()));
   connect(ui->qpb_stop, SIGNAL(clicked()), this, SLOT(onStopEffectClicked()));
 }
@@ -119,6 +121,16 @@ void MainWindow::onRefreshDevicesClicked()
   fillDeviceList();
 }
 
+void MainWindow::onRemoveEffectClicked()
+{
+  if (m_activeDevice == nullptr)
+    return;
+  if (!m_activeDevice->removeAndEraseEffect(ui->cbox_effectSlots->currentIndex()))
+    QMessageBox::warning(this, res_deviceErrorCap, "Unable to remove the effect.");
+  else
+    setEffectStatusText(FFBEffect::FFBEffectStatus::NOT_LOADED);
+}
+
 void MainWindow::onStartEffectClicked()
 {
   if (m_activeDevice == nullptr)
@@ -134,6 +146,8 @@ void MainWindow::onStartEffectClicked()
   bool ret = m_activeDevice->startEffect(effectSlot, type, params);
   if (ret)
     setEffectStatusText(m_activeDevice->effectStatusByIdx(effectSlot));
+  else
+    QMessageBox::warning(this, res_deviceErrorCap, "Unable to start the effect.");
 }
 
 void MainWindow::onStopEffectClicked()
index f134b9f0a4adad42dd0507b6547ec6c7754b4458..95d33f46b478e2cdeccbcc660253f8256e99d594 100644 (file)
@@ -38,6 +38,7 @@ private:
   std::shared_ptr<DeviceProber> m_prober;
   Ui::MainWindow* ui;
 
+  static const QString res_deviceErrorCap;
   static const QString res_effectNotLoaded;
   static const QString res_effectPlaying;
   static const QString res_effectStopped;
@@ -48,6 +49,7 @@ private slots:
   void onEffectSlotSelected(const int idx);
   void onEffectTypeSelected(const int idx);
   void onRefreshDevicesClicked();
+  void onRemoveEffectClicked();
   void onStartEffectClicked();
   void onStopEffectClicked();
 };