diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 063353f2c9..0b2c4a40c8 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -272,7 +272,7 @@ Editor::do_import (vector paths, ImportDisposition disposition, ImportMo import_status.total = paths.size (); import_status.all_done = false; - ImportProgressWindow ipw (&import_status, _("Import"), _("Cancel Import")); + ImportProgressWindow ipw (&import_status); bool ok = true; diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index f633ad82f2..2f85909ea1 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -3731,7 +3731,7 @@ Editor::freeze_route () InterThreadInfo itt; current_interthread_info = &itt; - InterthreadProgressWindow ipw (current_interthread_info, _("Freeze"), _("Cancel Freeze")); + InterthreadProgressWindow ipw (current_interthread_info); pthread_create_and_store (X_("freezer"), &itt.thread, _freeze_thread, this); diff --git a/gtk2_ardour/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc index 259e3e36e1..f22bcda7b5 100644 --- a/gtk2_ardour/editor_videotimeline.cc +++ b/gtk2_ardour/editor_videotimeline.cc @@ -89,8 +89,7 @@ Editor::embed_audio_from_video (std::string path, framepos_t n, bool lock_positi import_status.total = paths.size (); import_status.all_done = false; - ImportProgressWindow ipw (&import_status, _("Import"), _("Cancel Import")); - ipw.show (); + ImportProgressWindow ipw (&import_status); boost::shared_ptr track; bool ok = (import_sndfiles (paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, false) == 0); diff --git a/gtk2_ardour/interthread_progress_window.cc b/gtk2_ardour/interthread_progress_window.cc index cfce66757a..dee78374ab 100644 --- a/gtk2_ardour/interthread_progress_window.cc +++ b/gtk2_ardour/interthread_progress_window.cc @@ -22,85 +22,80 @@ #include "ardour/import_status.h" #include "interthread_progress_window.h" #include "i18n.h" +#include "progress_dialog.h" +#include "gtkmm2ext/gui_thread.h" using namespace std; using namespace Gtk; /** @param i Status information. - * @param t Window title. - * @param c Label to use for Cancel button. + */ -InterthreadProgressWindow::InterthreadProgressWindow (ARDOUR::InterThreadInfo* i, string const & t, string const & c) - : ArdourDialog (t, true) - , _interthread_info (i) + +InterthreadProgressWindow::InterthreadProgressWindow (ARDOUR::InterThreadInfo* i) + : _interthread_info (i) { - _bar.set_orientation (Gtk::PROGRESS_LEFT_TO_RIGHT); + _timeout_connection = Glib::signal_timeout().connect (sigc::mem_fun (*this, &InterthreadProgressWindow::update), 100); + _progress_dialog.CancelClicked.connect (_cancel_connection, MISSING_INVALIDATOR, boost::bind (&InterthreadProgressWindow::cancel_clicked, this), gui_context()); +} - set_border_width (12); - get_vbox()->set_spacing (6); - - get_vbox()->pack_start (_bar, false, false); - - Button* b = add_button ("CANCEL", RESPONSE_CANCEL); - b->signal_clicked().connect (sigc::mem_fun (*this, &InterthreadProgressWindow::cancel_clicked)); - - _cancel_label.set_text (c); - _cancel_button.add (_cancel_label); - - set_default_size (200, 100); - show_all (); - hide (); - - Glib::signal_timeout().connect (sigc::mem_fun (*this, &InterthreadProgressWindow::update), 100); +InterthreadProgressWindow::~InterthreadProgressWindow () +{ + _timeout_connection.disconnect (); + _cancel_connection.disconnect (); + _progress_dialog.hide_cancel_button (); + _progress_dialog.hide_pd (); } void InterthreadProgressWindow::cancel_clicked () { - _interthread_info->cancel = true; + _interthread_info->cancel = true; +} + +void +InterthreadProgressWindow::show () +{ + _progress_dialog.show_pd (); + _progress_dialog.show_cancel_button (); } bool InterthreadProgressWindow::update () { - _bar.set_fraction (_interthread_info->progress); - return !(_interthread_info->done || _interthread_info->cancel); + _progress_dialog.set_progress (_interthread_info->progress); + return !(_interthread_info->done || _interthread_info->cancel); } -/** @param i Status information. - * @param t Window title. - * @param c Label to use for Cancel button. - */ -ImportProgressWindow::ImportProgressWindow (ARDOUR::ImportStatus* s, string const & t, string const & c) - : InterthreadProgressWindow (s, t, c) - , _import_status (s) +/** @param s Status information. + */ + +ImportProgressWindow::ImportProgressWindow (ARDOUR::ImportStatus* s) +: InterthreadProgressWindow (s) +, _import_status (s) { - _label.set_alignment (0, 0.5); - _label.set_use_markup (true); - - get_vbox()->pack_start (_label, false, false); - - _label.show (); } bool ImportProgressWindow::update () { - _cancel_button.set_sensitive (!_import_status->freeze); - _label.set_markup ("" + _import_status->doing_what + ""); + _progress_dialog.set_cancel_button_sensitive (!_import_status->freeze); - /* 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); + /* use overall progress for the bar, rather than that for individual files */ + double fraction = (_import_status->current - 1 + _import_status->progress) / _import_status->total; + + /* 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 */ - /* 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; + 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); + + _progress_dialog.update_info ( fraction, + _("Importing files"), + (string_compose (_("Importing file: %1 of %2"), c, _import_status->total)).c_str(), + (_import_status->doing_what).c_str() ); + + return !(_import_status->all_done || _import_status->cancel); } diff --git a/gtk2_ardour/interthread_progress_window.h b/gtk2_ardour/interthread_progress_window.h index 653ec46420..7ab6f9f7a1 100644 --- a/gtk2_ardour/interthread_progress_window.h +++ b/gtk2_ardour/interthread_progress_window.h @@ -22,7 +22,10 @@ #include #include +#include "pbd/signals.h" #include "ardour_dialog.h" +#include "waves_button.h" +#include "progress_dialog.h" namespace ARDOUR { class InterThreadInfo; @@ -34,35 +37,35 @@ namespace ARDOUR { * automagically updated using a Glib timer, and a cancel button. */ -class InterthreadProgressWindow : public ArdourDialog +class InterthreadProgressWindow { public: - InterthreadProgressWindow (ARDOUR::InterThreadInfo *, std::string const &, std::string const &); + InterthreadProgressWindow (ARDOUR::InterThreadInfo *); + virtual ~InterthreadProgressWindow (); + void show (); protected: virtual bool update (); - - Gtk::Button _cancel_button; - Gtk::Label _cancel_label; - Gtk::ProgressBar _bar; + ProgressDialog _progress_dialog; private: void cancel_clicked (); - + ARDOUR::InterThreadInfo* _interthread_info; + PBD::ScopedConnection _cancel_connection; + sigc::connection _timeout_connection; }; /** Progress dialogue for importing sound files */ class ImportProgressWindow : public InterthreadProgressWindow { public: - ImportProgressWindow (ARDOUR::ImportStatus *, std::string const &, std::string const &); + ImportProgressWindow (ARDOUR::ImportStatus *); private: bool update (); - Gtk::Label _label; ARDOUR::ImportStatus* _import_status; };