[Sv1-commits] SF.net SVN: sv1:[1686] sonic-visualiser/trunk
Brought to you by:
cannam
From: <ca...@us...> - 2010-03-12 15:34:24
|
Revision: 1686 http://sv1.svn.sourceforge.net/sv1/?rev=1686&view=rev Author: cannam Date: 2010-03-12 15:34:18 +0000 (Fri, 12 Mar 2010) Log Message: ----------- * Pop view progress bars back into "indeterminate" mode if they are not updated for a couple of seconds (useful for plugins with very active getRemainingFeatures()) Modified Paths: -------------- sonic-visualiser/trunk/audioio/AudioCallbackPlaySource.cpp sonic-visualiser/trunk/view/View.cpp sonic-visualiser/trunk/view/View.h Modified: sonic-visualiser/trunk/audioio/AudioCallbackPlaySource.cpp =================================================================== --- sonic-visualiser/trunk/audioio/AudioCallbackPlaySource.cpp 2010-03-12 15:06:38 UTC (rev 1685) +++ sonic-visualiser/trunk/audioio/AudioCallbackPlaySource.cpp 2010-03-12 15:34:18 UTC (rev 1686) @@ -394,7 +394,9 @@ startFrame = m_viewManager->alignReferenceToPlaybackFrame(startFrame); +#ifdef DEBUG_AUDIO_PLAY_SOURCE std::cerr << startFrame << std::endl; +#endif // The fill thread will automatically empty its buffers before // starting again if we have not so far been playing, but not if Modified: sonic-visualiser/trunk/view/View.cpp =================================================================== --- sonic-visualiser/trunk/view/View.cpp 2010-03-12 15:06:38 UTC (rev 1685) +++ sonic-visualiser/trunk/view/View.cpp 2010-03-12 15:34:18 UTC (rev 1686) @@ -531,22 +531,27 @@ m_layers.push_back(layer); -// m_progressBars[layer] = new LayerProgressBar(this); - m_progressBars[layer] = new QProgressBar(this); - m_progressBars[layer]->setMinimum(0); - m_progressBars[layer]->setMaximum(0); -// m_progressBars[layer]->setMaximum(100); -// m_progressBars[layer]->setMinimumWidth(80); - m_progressBars[layer]->setFixedWidth(80); -// m_progressBars[layer]->setText(""); //!!! - m_progressBars[layer]->setTextVisible(false); + QProgressBar *pb = new QProgressBar(this); + pb->setMinimum(0); + pb->setMaximum(0); + pb->setFixedWidth(80); + pb->setTextVisible(false); - QFont f(m_progressBars[layer]->font()); + ProgressBarRec pbr; + pbr.bar = pb; + pbr.lastCheck = 0; + pbr.checkTimer = new QTimer(); + connect(pbr.checkTimer, SIGNAL(timeout()), this, + SLOT(progressCheckStalledTimerElapsed())); + + m_progressBars[layer] = pbr; + + QFont f(pb->font()); int fs = Preferences::getInstance()->getViewFontSize(); f.setPointSize(std::min(fs, int(ceil(fs * 0.85)))); - m_progressBars[layer]->setFont(f); - m_progressBars[layer]->hide(); + pb->setFont(f); + pb->hide(); connect(layer, SIGNAL(layerParametersChanged()), this, SLOT(layerParametersChanged())); @@ -586,7 +591,8 @@ if (*i == layer) { m_layers.erase(i); if (m_progressBars.find(layer) != m_progressBars.end()) { - delete m_progressBars[layer]; + delete m_progressBars[layer].bar; + delete m_progressBars[layer].checkTimer; m_progressBars.erase(layer); } break; @@ -1406,11 +1412,18 @@ int ph = height(); - for (ProgressMap::const_iterator i = m_progressBars.begin(); + for (ProgressMap::iterator i = m_progressBars.begin(); i != m_progressBars.end(); ++i) { + QProgressBar *pb = i->second.bar; + if (i->first == object) { + // The timer is used to test for stalls. If the progress + // bar does not get updated for some length of time, the + // timer prompts it to go back into "indeterminate" mode + QTimer *timer = i->second.checkTimer; + int completion = i->first->getCompletion(this); QString text = i->first->getPropertyContainerName(); @@ -1419,7 +1432,7 @@ dynamic_cast<RangeSummarisableTimeValueModel *>(model); if (completion > 0) { - i->second->setMaximum(100); // was 0, for indeterminate start + pb->setMaximum(100); // was 0, for indeterminate start } if (completion >= 100) { @@ -1441,34 +1454,62 @@ if (completion >= 100) { - i->second->hide(); + pb->hide(); + timer->stop(); } else { -// i->second->setText(text); +// std::cerr << "progress = " << completion << std::endl; - i->second->setValue(completion); - i->second->move(0, ph - i->second->height()); + if (!pb->isVisible()) { + i->second.lastCheck = 0; + timer->setInterval(2000); + timer->start(); + } - i->second->show(); - i->second->update(); + pb->setValue(completion); + pb->move(0, ph - pb->height()); - ph -= i->second->height(); + pb->show(); + pb->update(); + + ph -= pb->height(); } } else { - if (i->second->isVisible()) { - ph -= i->second->height(); + if (pb->isVisible()) { + ph -= pb->height(); } } } } +void +View::progressCheckStalledTimerElapsed() +{ + QObject *s = sender(); + QTimer *t = qobject_cast<QTimer *>(s); + if (!t) return; + for (ProgressMap::iterator i = m_progressBars.begin(); + i != m_progressBars.end(); ++i) { + if (i->second.checkTimer == t) { + int value = i->second.bar->value(); + if (value > 0 && value == i->second.lastCheck) { + i->second.bar->setMaximum(0); // indeterminate + } + i->second.lastCheck = value; + return; + } + } +} + int View::getProgressBarWidth() const { for (ProgressMap::const_iterator i = m_progressBars.begin(); i != m_progressBars.end(); ++i) { - if (i->second && i->second->isVisible()) return i->second->width(); + if (i->second.bar && i->second.bar->isVisible()) { + return i->second.bar->width(); + } } return 0; Modified: sonic-visualiser/trunk/view/View.h =================================================================== --- sonic-visualiser/trunk/view/View.h 2010-03-12 15:06:38 UTC (rev 1685) +++ sonic-visualiser/trunk/view/View.h 2010-03-12 15:34:18 UTC (rev 1686) @@ -305,6 +305,8 @@ virtual void overlayModeChanged(); virtual void zoomWheelsEnabledChanged(); + virtual void progressCheckStalledTimerElapsed(); + protected: View(QWidget *, bool showProgress); virtual void paintEvent(QPaintEvent *e); @@ -373,8 +375,12 @@ QString m_text; }; -// typedef std::map<Layer *, LayerProgressBar *> ProgressMap; - typedef std::map<Layer *, QProgressBar *> ProgressMap; + struct ProgressBarRec { + QProgressBar *bar; + int lastCheck; + QTimer *checkTimer; + }; + typedef std::map<Layer *, ProgressBarRec> ProgressMap; ProgressMap m_progressBars; // I own the ProgressBars ViewManager *m_manager; // I don't own this This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |