diff options
author | Robin Gareus <robin@gareus.org> | 2019-09-02 05:17:55 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2019-09-02 05:17:55 +0200 |
commit | 9e1154282864577148e39328fb2242ea957cc34f (patch) | |
tree | f0f77d794f64a94ef110cef3c26d641f38dd4cd1 /gtk2_ardour/luainstance.cc | |
parent | cf507828bd512a3c054a60cd56333dddc43a1478 (diff) |
Add Lua progress dialog
Diffstat (limited to 'gtk2_ardour/luainstance.cc')
-rw-r--r-- | gtk2_ardour/luainstance.cc | 91 |
1 files changed, 90 insertions, 1 deletions
diff --git a/gtk2_ardour/luainstance.cc b/gtk2_ardour/luainstance.cc index c0deb3aaeb..248891d0ac 100644 --- a/gtk2_ardour/luainstance.cc +++ b/gtk2_ardour/luainstance.cc @@ -23,6 +23,9 @@ #include <cairomm/surface.h> #include <pango/pangocairo.h> +#include <gtkmm/progressbar.h> +#include <gtkmm/stock.h> + #include "pbd/file_utils.h" #include "pbd/strsplit.h" @@ -40,6 +43,7 @@ #include "LuaBridge/LuaBridge.h" +#include "ardour_dialog.h" #include "ardour_http.h" #include "ardour_ui.h" #include "public_editor.h" @@ -459,6 +463,85 @@ lua_exec (std::string cmd) //////////////////////////////////////////////////////////////////////////////// +/** Synchronous GUI-thread Progress dialog + * + * This shows a modal progress dialog with an optional + * "Cancel" button. Since it runs in the UI thread + * the script needs to regularly call progress(), + * as well as close the dialog, as needed. + */ +class LuaProgressWindow : public ArdourDialog +{ +public: + /** Create a new progress window. + * @param title Window title + * @param allow_cancel include a "Cancel" option + */ + LuaProgressWindow (std::string const& title, bool allow_cancel) + : ArdourDialog (title, true) + , _canceled (false) + { + _bar.set_orientation (Gtk::PROGRESS_LEFT_TO_RIGHT); + + set_border_width (12); + get_vbox()->set_spacing (6); + get_vbox()->pack_start (_bar, false, false); + + if (allow_cancel) { + using namespace Gtk; + Button* b = add_button (Stock::CANCEL, RESPONSE_CANCEL); + b->signal_clicked().connect (sigc::mem_fun (*this, &LuaProgressWindow::cancel_clicked)); + } + + set_default_size (200, -1); + show_all (); + } + + /** Report progress and update GUI. + * @param prog progress in range 0..1 show a bar, values outside this range show a pulsing dialog. + * @param text optional text to show on the progress-bar + * @return true if cancel was clicked, false otherwise + */ + bool progress (float prog, std::string const& text = "") + { + if (!text.empty ()) { + _bar.set_text (text); + } + if (prog < 0 || prog > 1) { + std::cerr << "pulse\n"; + _bar.set_pulse_step(.1); + _bar.pulse(); + } else { + _bar.set_fraction (prog); + } + ARDOUR::GUIIdle (); + return _canceled; + } + + bool canceled () const { + return _canceled; + } + + /** Close and hide the dialog. + * + * This is required to be at the end, since the dialog + * is modal and prevents other UI operations while visible. + */ + void done () { + Gtk::Dialog::response(_canceled ? Gtk::RESPONSE_CANCEL : Gtk::RESPONSE_OK); + } + +private: + void cancel_clicked () { + _canceled = true; + } + + Gtk::ProgressBar _bar; + bool _canceled; +}; + +//////////////////////////////////////////////////////////////////////////////// + static int lua_actionlist (lua_State *L) { @@ -758,8 +841,14 @@ LuaInstance::bind_dialog (lua_State* L) .addConst ("None", -1) .endNamespace () - .endNamespace (); + .beginClass <LuaProgressWindow> ("LuaProgressWindow") + .addConstructor <void (*) (std::string const&, bool)> () + .addFunction ("progress", &LuaProgressWindow::progress) + .addFunction ("done", &LuaProgressWindow::done) + .addFunction ("canceled", &LuaProgressWindow::canceled) + .endClass () + .endNamespace (); } void |