Properly revert FormatSpec changes on "cancel"
[ardour.git] / gtk2_ardour / interthread_progress_window.cc
index 5067b769c545644655cded006744760adfa99255..eb32d3e8faac27f6a144fcf7bf322090c3b033fe 100644 (file)
 
 #include <glibmm/main.h>
 #include <gtkmm/stock.h>
+#include "gtkmm2ext/utils.h"
 #include "ardour/import_status.h"
 #include "interthread_progress_window.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -34,6 +35,8 @@ InterthreadProgressWindow::InterthreadProgressWindow (ARDOUR::InterThreadInfo* i
        : ArdourDialog (t, true)
        , _interthread_info (i)
 {
+       _interthread_info->cancel = false;
+
        _bar.set_orientation (Gtk::PROGRESS_LEFT_TO_RIGHT);
 
        set_border_width (12);
@@ -53,6 +56,15 @@ InterthreadProgressWindow::InterthreadProgressWindow (ARDOUR::InterThreadInfo* i
        Glib::signal_timeout().connect (sigc::mem_fun (*this, &InterthreadProgressWindow::update), 100);
 }
 
+void
+InterthreadProgressWindow::on_hide ()
+{
+       if (_interthread_info && !_interthread_info->done) {
+               //catch user pressing 'esc' or WM close
+               _interthread_info->cancel = true;
+       }
+}
+
 void
 InterthreadProgressWindow::cancel_clicked ()
 {
@@ -86,12 +98,20 @@ bool
 ImportProgressWindow::update ()
 {
        _cancel_button.set_sensitive (!_import_status->freeze);
-       _label.set_markup ("<i>" + _import_status->doing_what + "</i>");
+       _label.set_markup ("<i>" + Gtkmm2ext::markup_escape_text (_import_status->doing_what) + "</i>");
 
        /* use overall progress for the bar, rather than that for individual files */
        _bar.set_fraction ((_import_status->current - 1 + _import_status->progress) / _import_status->total);
 
-       _bar.set_text (string_compose (_("Importing file: %1 of %2"), _import_status->current, _import_status->total));
-       
-       return !(_import_status->done || _import_status->cancel);
+       /* some of the code which sets up _import_status->current may briefly increment it too far
+          at the end of an import, so check for that to avoid a visual glitch
+       */
+       uint32_t c = _import_status->current;
+       if (c > _import_status->total) {
+               c = _import_status->total;
+       }
+
+       _bar.set_text (string_compose (_("Importing file: %1 of %2"), c, _import_status->total));
+
+       return !(_import_status->all_done || _import_status->cancel);
 }