summaryrefslogtreecommitdiffstats
path: root/src/gui/widgets/ProgressDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/widgets/ProgressDialog.cpp')
-rw-r--r--src/gui/widgets/ProgressDialog.cpp209
1 files changed, 209 insertions, 0 deletions
diff --git a/src/gui/widgets/ProgressDialog.cpp b/src/gui/widgets/ProgressDialog.cpp
new file mode 100644
index 0000000..1f6811f
--- /dev/null
+++ b/src/gui/widgets/ProgressDialog.cpp
@@ -0,0 +1,209 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ProgressDialog.h"
+#include "CurrentProgressDialog.h"
+#include "misc/Debug.h"
+#include "gui/application/RosegardenApplication.h"
+#include <klocale.h>
+#include <qcursor.h>
+#include <qprogressdialog.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+bool ProgressDialog::m_modalVisible = false;
+
+
+ProgressDialog::ProgressDialog(QWidget *creator,
+ const char *name,
+ bool modal):
+ KProgressDialog(creator, name,
+ i18n("Processing..."), QString::null, modal),
+ m_wasVisible(false),
+ m_frozen(false),
+ m_modal(modal)
+{
+ setCaption(i18n("Processing..."));
+ RG_DEBUG << "ProgressDialog::ProgressDialog type 1 - "
+ << labelText() << " - modal : " << modal << endl;
+
+ connect(progressBar(), SIGNAL(percentageChanged (int)),
+ this, SLOT(slotCheckShow(int)));
+
+ m_chrono.start();
+
+ CurrentProgressDialog::set
+ (this);
+
+ setMinimumDuration(500); // set a default value for this
+}
+
+ProgressDialog::ProgressDialog(
+ const QString &labelText,
+ int totalSteps,
+ QWidget *creator,
+ const char *name,
+ bool modal) :
+ KProgressDialog(creator,
+ name,
+ i18n("Processing..."),
+ labelText,
+ modal),
+ m_wasVisible(false),
+ m_frozen(false),
+ m_modal(modal)
+{
+ progressBar()->setTotalSteps(totalSteps);
+
+ RG_DEBUG << "ProgressDialog::ProgressDialog type 2 - "
+ << labelText << " - modal : " << modal << endl;
+
+ connect(progressBar(), SIGNAL(percentageChanged (int)),
+ this, SLOT(slotCheckShow(int)));
+
+ m_chrono.start();
+
+ CurrentProgressDialog::set
+ (this);
+
+ setMinimumDuration(500); // set a default value for this
+}
+
+ProgressDialog::~ProgressDialog()
+{
+ m_modalVisible = false;
+}
+
+void
+ProgressDialog::polish()
+{
+ KProgressDialog::polish();
+
+ if (allowCancel())
+ setCursor(Qt::ArrowCursor);
+ else
+ QApplication::setOverrideCursor(QCursor(Qt::waitCursor));
+}
+
+void ProgressDialog::hideEvent(QHideEvent* e)
+{
+ if (!allowCancel())
+ QApplication::restoreOverrideCursor();
+
+ KProgressDialog::hideEvent(e);
+ m_modalVisible = false;
+}
+
+void
+ProgressDialog::slotSetOperationName(QString name)
+{
+ // RG_DEBUG << "ProgressDialog::slotSetOperationName("
+ // << name << ") visible : " << isVisible() << endl;
+
+ setLabel(name);
+ // Little trick stolen from QProgressDialog
+ // increase resize only, never shrink
+ int w = QMAX( isVisible() ? width() : 0, sizeHint().width() );
+ int h = QMAX( isVisible() ? height() : 0, sizeHint().height() );
+ resize( w, h );
+}
+
+void ProgressDialog::slotCancel()
+{
+ RG_DEBUG << "ProgressDialog::slotCancel()\n";
+ KProgressDialog::slotCancel();
+ slotFreeze();
+}
+
+void ProgressDialog::slotCheckShow(int)
+{
+ // RG_DEBUG << "ProgressDialog::slotCheckShow() : "
+ // << m_chrono.elapsed() << " - " << minimumDuration()
+ // << endl;
+
+ if (!isVisible() &&
+ !m_frozen &&
+ m_chrono.elapsed() > minimumDuration()) {
+ RG_DEBUG << "ProgressDialog::slotCheckShow() : showing dialog\n";
+ show();
+ if (m_modal)
+ m_modalVisible = true;
+ processEvents();
+ }
+}
+
+void ProgressDialog::slotFreeze()
+{
+ RG_DEBUG << "ProgressDialog::slotFreeze()\n";
+
+ m_wasVisible = isVisible();
+ if (isVisible()) {
+ m_modalVisible = false;
+ hide();
+ }
+
+ // This is also a convenient place to ensure the wait cursor (if
+ // currently shown) returns to the original cursor to ensure that
+ // the user can respond to whatever's freezing the progress dialog
+ QApplication::restoreOverrideCursor();
+
+ mShowTimer->stop();
+ m_frozen = true;
+}
+
+void ProgressDialog::slotThaw()
+{
+ RG_DEBUG << "ProgressDialog::slotThaw()\n";
+
+ if (m_wasVisible) {
+ if (m_modal)
+ m_modalVisible = true;
+ show();
+ }
+
+ // Restart timer
+ mShowTimer->start(minimumDuration());
+ m_frozen = false;
+ m_chrono.restart();
+}
+
+void ProgressDialog::processEvents()
+{
+ // RG_DEBUG << "ProgressDialog::processEvents: modalVisible is "
+ // << m_modalVisible << endl;
+ if (m_modalVisible) {
+ kapp->processEvents(50);
+ } else {
+ rgapp->refreshGUI(50);
+ }
+}
+
+}
+#include "ProgressDialog.moc"