X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdialogs%2Fstoreprogress.cpp;h=9f4279cea8557a20423c799f0f6abe5785e142ee;hp=7853173f7d0507e7af029ff609391fa5a6b8206d;hb=1df756a190693295995a938e64333ddbda4ca3cf;hpb=bfc9f61ebfb8d9c14c2786b34373816758d52e9f diff --git a/pv/dialogs/storeprogress.cpp b/pv/dialogs/storeprogress.cpp index 7853173f..9f4279ce 100644 --- a/pv/dialogs/storeprogress.cpp +++ b/pv/dialogs/storeprogress.cpp @@ -14,34 +14,64 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * along with this program; if not, see . */ -#include "storeprogress.h" +#include +#include #include +#include "pv/session.hpp" + +#include "storeprogress.hpp" + +using std::map; +using std::pair; +using std::shared_ptr; +using std::string; + +using Glib::VariantBase; + namespace pv { namespace dialogs { StoreProgress::StoreProgress(const QString &file_name, - const SigSession &session, QWidget *parent) : + const shared_ptr output_format, + const map &options, + const pair sample_range, + const Session &session, QWidget *parent) : QProgressDialog(tr("Saving..."), tr("Cancel"), 0, 0, parent), - _session(file_name.toStdString(), session) + session_(file_name.toStdString(), output_format, options, sample_range, + session) { - connect(&_session, SIGNAL(progress_updated()), + connect(&session_, SIGNAL(progress_updated()), this, SLOT(on_progress_updated())); + connect(&session_, SIGNAL(store_successful()), + &session, SLOT(on_data_saved())); + + // Since we're not setting any progress in case of an error, the dialog + // will pop up after the minimumDuration time has been reached - 4000 ms + // by default. + // We do not want this as it overlaps with the error message box, so we + // set the minimumDuration to 0 so that it only appears when we feed it + // progress data. Then, call reset() to prevent the progress dialog from + // popping up anyway. This would happen in Qt5 because the behavior was + // changed in such a way that the duration timer is started by the + // constructor. We don't want that and reset() stops the timer, so we + // use it. + setMinimumDuration(0); + reset(); } StoreProgress::~StoreProgress() { - _session.wait(); + session_.wait(); } void StoreProgress::run() { - if (_session.start()) + if (session_.start()) show(); else show_error(); @@ -49,36 +79,42 @@ void StoreProgress::run() void StoreProgress::show_error() { + qDebug() << "Error trying to save:" << session_.error(); + QMessageBox msg(parentWidget()); msg.setText(tr("Failed to save session.")); - msg.setInformativeText(_session.error()); + msg.setInformativeText(session_.error()); msg.setStandardButtons(QMessageBox::Ok); msg.setIcon(QMessageBox::Warning); msg.exec(); + + close(); } void StoreProgress::closeEvent(QCloseEvent*) { - _session.cancel(); + session_.cancel(); + + // Closing doesn't mean we're going to be destroyed because our parent + // still owns our handle. Make sure this stale instance doesn't hang around. + deleteLater(); } void StoreProgress::on_progress_updated() { - const std::pair p = _session.progress(); + const pair p = session_.progress(); assert(p.first <= p.second); - setValue(p.first); - setMaximum(p.second); - - const QString err = _session.error(); - if (!err.isEmpty()) { - show_error(); + if (p.second) { + setValue(p.first); + setMaximum(p.second); + } else { + const QString err = session_.error(); + if (!err.isEmpty()) + show_error(); close(); } - - if (p.first == p.second) - close(); } -} // dialogs -} // pv +} // namespace dialogs +} // namespace pv