replace ::cast_dynamic() with relevant ActionManager::get_*_action() calls
[ardour.git] / gtk2_ardour / script_selector.cc
index 794d57797ad225a7d38e9107c38de72943303324..94233021dc74f955df3d2c1c5b972c8594077e4a 100644 (file)
@@ -31,28 +31,26 @@ using namespace ARDOUR;
 
 ScriptSelector::ScriptSelector (std::string title, LuaScriptInfo::ScriptType type)
        : ArdourDialog (title)
+       , _type_label ("<b>Type:</b>", Gtk::ALIGN_END, Gtk::ALIGN_CENTER)
        , _type ("", Gtk::ALIGN_START, Gtk::ALIGN_CENTER)
+       , _author_label ("<b>Author:</b>", Gtk::ALIGN_END, Gtk::ALIGN_CENTER)
        , _author ("", Gtk::ALIGN_START, Gtk::ALIGN_CENTER)
        , _description ("", Gtk::ALIGN_START, Gtk::ALIGN_START)
        , _scripts (LuaScripting::instance ().scripts (type))
        , _script_type (type)
 {
-       Gtk::Label* l;
-
        Table* t = manage (new Table (3, 2));
        t->set_spacings (6);
 
        int ty = 0;
 
-       l = manage (new Label (_("<b>Type:</b>"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
-       l->set_use_markup ();
-       t->attach (*l, 0, 1, ty, ty+1, FILL|EXPAND, SHRINK);
+       _type_label.set_use_markup ();
+       t->attach (_type_label, 0, 1, ty, ty+1, FILL|EXPAND, SHRINK);
        t->attach (_type, 1, 2, ty, ty+1, FILL|EXPAND, SHRINK);
        ++ty;
 
-       l = manage (new Label (_("<b>Author:</b>"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
-       l->set_use_markup ();
-       t->attach (*l, 0, 1, ty, ty+1, FILL|EXPAND, SHRINK);
+       _author_label.set_use_markup ();
+       t->attach (_author_label, 0, 1, ty, ty+1, FILL|EXPAND, SHRINK);
        t->attach (_author, 1, 2, ty, ty+1, FILL|EXPAND, SHRINK);
        ++ty;
 
@@ -81,36 +79,80 @@ ScriptSelector::ScriptSelector (std::string title, LuaScriptInfo::ScriptType typ
 
        setup_list ();
        show_all ();
+
+       script_combo_changed();
+}
+
+bool
+ScriptSelector::script_separator (const Glib::RefPtr<Gtk::TreeModel> &, const Gtk::TreeModel::iterator &i)
+{
+       _script_combo.set_active (i);
+
+       return _script_combo.get_active_text () == "--separator--";
 }
 
 void
 ScriptSelector::setup_list ()
 {
        _combocon.block();
+
        vector<string> script_names;
        for (LuaScriptList::const_iterator s = _scripts.begin(); s != _scripts.end(); ++s) {
-               script_names.push_back ((*s)->name);
+               if ((*s)->name != "Shortcut" || _script_type != LuaScriptInfo::EditorAction) {
+                       script_names.push_back ((*s)->name);
+               }
+       }
+
+       _script_combo.clear();
+       _script_combo.set_row_separator_func (sigc::mem_fun (*this, &ScriptSelector::script_separator));
+
+       if (_script_type == LuaScriptInfo::EditorAction) {
+               _script_combo.append_text ("Shortcut");
+               _script_combo.append_text ("--separator--");
        }
 
-       Gtkmm2ext::set_popdown_strings (_script_combo, script_names);
-       if (script_names.size() > 0) {
-               _script_combo.set_active(0);
-               script_combo_changed ();
+       vector<string>::const_iterator i;
+       for (i = script_names.begin(); i != script_names.end(); ++i) {
+               _script_combo.append_text (*i);
        }
+
+       _script_combo.set_active(0);
+       script_combo_changed ();
+
        _combocon.unblock();
 }
 
 void
 ScriptSelector::script_combo_changed ()
 {
-       int i = _script_combo.get_active_row_number();
-       _script = _scripts[i];
+       std::string nm = _script_combo.get_active_text();
+
+       for (LuaScriptList::const_iterator s = _scripts.begin(); s != _scripts.end(); ++s) {
+               if ((*s)->name == nm) {
+                       _script = (*s);
+               }
+       }
+
+       if (_script) {
 
-       _type.set_text(LuaScriptInfo::type2str (_script->type));
-       _author.set_text (_script->author);
-       _description.set_text (_script->description);
+               if (_script->name == "Shortcut") {
+                       _type.hide();
+                       _type_label.hide();
+                       _author.hide();
+                       _author_label.hide();
+                       _description.set_text (_script->description);
+               } else {
+                       _type.show();
+                       _type_label.show();
+                       _author.show();
+                       _author_label.show();
+                       _type.set_text(LuaScriptInfo::type2str (_script->type));
+                       _author.set_text (_script->author);
+                       _description.set_text (_script->description);
+               }
 
-       _add->set_sensitive (Glib::file_test(_script->path, Glib::FILE_TEST_EXISTS));
+               _add->set_sensitive (Glib::file_test(_script->path, Glib::FILE_TEST_EXISTS));
+       }
 }
 
 void
@@ -162,6 +204,13 @@ ScriptParameterDialog::ScriptParameterDialog (std::string title,
        t->set_spacings (6);
 
        _name_entry.set_text (spi->name);
+
+       for (size_t i = 0; i < _lsp.size(); ++i) {
+               if (_lsp[i]->preseeded && _lsp[i]->name == "x-script-name" && !_lsp[i]->value.empty ()) {
+                       _name_entry.set_text (_lsp[i]->value);
+               }
+       }
+
        _name_entry.signal_changed().connect (sigc::mem_fun (*this, &ScriptParameterDialog::update_sensitivity));
 
        int ty = 0;
@@ -211,13 +260,15 @@ ScriptParameterDialog::ScriptParameterDialog (std::string title,
 bool
 ScriptParameterDialog::need_interation () const
 {
-       if (_lsp.size () > 0) {
-               return false;
-       }
        if (!parameters_ok ()) {
-               return false;
+               return true;
        }
-       return true;
+       for (size_t i = 0; i < _lsp.size(); ++i) {
+               if (!_lsp[i]->optional && !_lsp[i]->preseeded) {
+                       return true;
+               }
+       }
+       return false;
 }
 
 bool