X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fluawindow.cc;h=72f0af6980195e820793800344d2dcf9eac8682c;hb=26c88b2a3ea2dba06197c8f353dfa3af25b342e0;hp=15c7fb69a650eb4b87e0a7994dd26f99db04aa05;hpb=8af8fcab8438b42fe124d82cfe53184a2875e367;p=ardour.git diff --git a/gtk2_ardour/luawindow.cc b/gtk2_ardour/luawindow.cc index 15c7fb69a6..72f0af6980 100644 --- a/gtk2_ardour/luawindow.cc +++ b/gtk2_ardour/luawindow.cc @@ -25,6 +25,7 @@ #include "gtk2ardour-config.h" #endif +#include "pbd/gstdio_compat.h" #include #include @@ -36,6 +37,10 @@ #include "gtkmm2ext/utils.h" #include "gtkmm2ext/window_title.h" +#include "widgets/pane.h" +#include "widgets/tooltips.h" + +#include "ardour/filesystem_paths.h" #include "ardour/luabindings.h" #include "LuaBridge/LuaBridge.h" @@ -44,14 +49,12 @@ #include "luainstance.h" #include "luawindow.h" #include "public_editor.h" -#include "tooltips.h" #include "utils.h" #include "utils_videotl.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; -using namespace ARDOUR_UI_UTILS; using namespace PBD; using namespace Gtk; using namespace Glib; @@ -92,10 +95,11 @@ LuaWindow::LuaWindow () , _menu_snippet (0) , _menu_actions (0) , _btn_run (_("Run")) - , _btn_clear (_("Clear Outtput")) + , _btn_clear (_("Clear Output")) , _btn_open (_("Import")) , _btn_save (_("Save")) , _btn_delete (_("Delete")) + , _btn_revert (_("Revert")) , _current_buffer () { set_name ("Lua"); @@ -120,10 +124,12 @@ LuaWindow::LuaWindow () _btn_open.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::import_script)); _btn_save.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::save_script)); _btn_delete.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::delete_script)); + _btn_revert.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::revert_script)); _btn_open.set_sensitive (false); // TODO _btn_save.set_sensitive (false); _btn_delete.set_sensitive (false); + _btn_revert.set_sensitive (false); // layout @@ -143,20 +149,22 @@ LuaWindow::LuaWindow () hbox->pack_start (_btn_open, false, false, 2); hbox->pack_start (_btn_save, false, false, 2); hbox->pack_start (_btn_delete, false, false, 2); + hbox->pack_start (_btn_revert, false, false, 2); hbox->pack_start (script_select, false, false, 2); Gtk::VBox *vbox = manage (new VBox()); vbox->pack_start (*scrollin, true, true, 0); vbox->pack_start (*hbox, false, false, 2); - Gtk::VPaned *vpane = manage (new Gtk::VPaned ()); - vpane->pack1 (*vbox, true, false); - vpane->pack2 (scrollout, false, true); + ArdourWidgets::VPane *vpane = manage (new ArdourWidgets::VPane ()); + vpane->add (*vbox); + vpane->add (scrollout); + vpane->set_divider (0, 0.75); vpane->show_all (); add (*vpane); set_size_request (640, 480); // XXX - ARDOUR_UI_UTILS::set_tooltip (script_select, _("Select Editor Buffer")); + ArdourWidgets::set_tooltip (script_select, _("Select Editor Buffer")); setup_buffers (); LuaScripting::instance().scripts_changed.connect (*this, invalidator (*this), boost::bind (&LuaWindow::refresh_scriptlist, this), gui_context()); @@ -182,14 +190,16 @@ LuaWindow::hide_window (GdkEventAny *ev) { if (!_visible) return 0; _visible = false; - return just_hide_it (ev, static_cast(this)); + return ARDOUR_UI_UTILS::just_hide_it (ev, static_cast(this)); } void LuaWindow::reinit_lua () { + ENSURE_GUI_THREAD (*this, &LuaWindow::session_going_away); delete lua; lua = new LuaState(); lua->Print.connect (sigc::mem_fun (*this, &LuaWindow::append_text)); + lua->sandbox (false); lua_State* L = lua->getState(); LuaInstance::register_classes (L); @@ -304,6 +314,7 @@ LuaWindow::append_text (std::string s) Glib::RefPtr tb (outtext.get_buffer()); tb->insert (tb->end(), s + "\n"); scroll_to_bottom (); + Gtkmm2ext::UI::instance()->flush_pending (0.05); } void @@ -313,6 +324,17 @@ LuaWindow::clear_output () tb->set_text (""); } +void +LuaWindow::edit_script (const std::string& name, const std::string& script) +{ + ScriptBuffer* sb = new LuaWindow::ScriptBuffer (name); + sb->script = script; + script_buffers.push_back (ScriptBufferPtr (sb)); + script_selection_changed (script_buffers.back ()); + refresh_scriptlist (); + show_window (); +} + void LuaWindow::new_script () { @@ -326,7 +348,17 @@ LuaWindow::new_script () void LuaWindow::delete_script () { - assert (_current_buffer->flags & Buffer_Scratch); + assert ((_current_buffer->flags & Buffer_Scratch) || !(_current_buffer->flags & Buffer_ReadOnly)); + bool refresh = false; + bool neednew = true; + if (_current_buffer->flags & Buffer_HasFile) { + if (0 == ::g_unlink (_current_buffer->path.c_str())) { + append_text (X_("> ") + string_compose (_("Deleted %1"), _current_buffer->path)); + refresh = true; + } else { + append_text (X_("> ") + string_compose (_("Failed to delete %1"), _current_buffer->path)); + } + } for (ScriptBufferList::iterator i = script_buffers.begin (); i != script_buffers.end (); ++i) { if ((*i) == _current_buffer) { script_buffers.erase (i); @@ -337,10 +369,22 @@ LuaWindow::delete_script () for (ScriptBufferList::const_iterator i = script_buffers.begin (); i != script_buffers.end (); ++i) { if ((*i)->flags & Buffer_Scratch) { script_selection_changed (*i); - return; + neednew = false; } } - new_script (); + if (neednew) { + new_script (); + } + if (refresh) { + LuaScripting::instance ().refresh (true); + } +} + +void +LuaWindow::revert_script () +{ + _current_buffer->flags &= BufferFlags(~Buffer_Valid); + script_selection_changed (_current_buffer, true); } void @@ -350,7 +394,7 @@ LuaWindow::import_script () // TODO convert a few URL (eg. pastebin) to raw. #if 0 char *url = "http://pastebin.com/raw/3UMkZ6nV"; - char *rv = a3_curl_http_get (url, 0); + char *rv = ArdourCurl::http_get (url, 0); if (rv) { new_script (); Glib::RefPtr tb (entry.get_buffer()); @@ -403,6 +447,7 @@ LuaWindow::save_script () if ((sb.flags & Buffer_HasFile) && !(sb.flags & Buffer_ReadOnly)) { try { Glib::file_set_contents (sb.path, script); + sb.name = lsi->name; sb.flags &= BufferFlags(~Buffer_Dirty); update_gui_state (); // XXX here? append_text (X_("> ") + string_compose (_("Saved as %1"), sb.path)); @@ -450,9 +495,11 @@ LuaWindow::save_script () try { Glib::file_set_contents (path, script); sb.path = path; + sb.name = lsi->name; sb.flags |= Buffer_HasFile; sb.flags &= BufferFlags(~Buffer_Dirty); - update_gui_state (); // XXX here? + sb.flags &= BufferFlags(~Buffer_ReadOnly); + update_gui_state (); // XXX here? .refresh (true) may trigger this, too LuaScripting::instance().refresh (true); append_text (X_("> ") + string_compose (_("Saved as %1"), path)); return; // OK @@ -506,12 +553,12 @@ LuaWindow::refresh_scriptlist () } LuaScriptList& lsa (LuaScripting::instance ().scripts (LuaScriptInfo::EditorAction)); for (LuaScriptList::const_iterator s = lsa.begin(); s != lsa.end(); ++s) { - script_buffers.push_back (ScriptBufferPtr ( new LuaWindow::ScriptBuffer(*s))); + script_buffers.push_back (ScriptBufferPtr (new LuaWindow::ScriptBuffer(*s))); } LuaScriptList& lss (LuaScripting::instance ().scripts (LuaScriptInfo::Snippet)); for (LuaScriptList::const_iterator s = lss.begin(); s != lss.end(); ++s) { - script_buffers.push_back (ScriptBufferPtr ( new LuaWindow::ScriptBuffer(*s))); + script_buffers.push_back (ScriptBufferPtr (new LuaWindow::ScriptBuffer(*s))); } rebuild_menu (); } @@ -535,9 +582,17 @@ LuaWindow::rebuild_menu () items_scratch.push_back(elem); } + items_scratch.push_back(SeparatorElem()); + for (ScriptBufferList::const_iterator i = script_buffers.begin (); i != script_buffers.end (); ++i) { - Menu_Helpers::MenuElem elem = Gtk::Menu_Helpers::MenuElem((*i)->name, - sigc::bind(sigc::mem_fun(*this, &LuaWindow::script_selection_changed), (*i))); + std::string name; + if ((*i)->flags & Buffer_ReadOnly) { + name = "[R] " + (*i)->name; + } else { + name = (*i)->name; + } + Menu_Helpers::MenuElem elem = Gtk::Menu_Helpers::MenuElem(name, + sigc::bind(sigc::mem_fun(*this, &LuaWindow::script_selection_changed), (*i), false)); if ((*i)->flags & Buffer_Scratch) { items_scratch.push_back(elem); @@ -557,14 +612,17 @@ LuaWindow::rebuild_menu () } void -LuaWindow::script_selection_changed (ScriptBufferPtr n) +LuaWindow::script_selection_changed (ScriptBufferPtr n, bool force) { - if (n == _current_buffer) { + if (n == _current_buffer && !force) { return; } Glib::RefPtr tb (entry.get_buffer()); - _current_buffer->script = tb->get_text(); + + if (_current_buffer->flags & Buffer_Valid) { + _current_buffer->script = tb->get_text(); + } if (!(n->flags & Buffer_Valid)) { if (!n->load()) { @@ -604,8 +662,14 @@ LuaWindow::update_gui_state () } script_select.set_text(name); + if (sb.flags & Buffer_ReadOnly) { + _btn_save.set_text (_("Save as")); + } else { + _btn_save.set_text (_("Save")); + } _btn_save.set_sensitive (sb.flags & Buffer_Dirty); - _btn_delete.set_sensitive (sb.flags & Buffer_Scratch); // TODO allow to remove user-scripts + _btn_delete.set_sensitive (sb.flags & Buffer_Scratch || ((sb.flags & (Buffer_ReadOnly | Buffer_HasFile)) == Buffer_HasFile)); + _btn_revert.set_sensitive ((sb.flags & Buffer_Dirty) && (sb.flags & Buffer_HasFile)); } void @@ -622,6 +686,7 @@ LuaWindow::ScriptBuffer::ScriptBuffer (const std::string& n) , flags (Buffer_Scratch | Buffer_Valid) { script = + "---- this header is (only) required to save the script\n" "-- ardour { [\"type\"] = \"Snippet\", name = \"\" }\n" "-- function factory () return function () -- -- end end\n"; } @@ -635,6 +700,10 @@ LuaWindow::ScriptBuffer::ScriptBuffer (LuaScriptInfoPtr p) if (!PBD::exists_and_writable (path)) { flags |= Buffer_ReadOnly; } + if (path.find (user_config_directory ()) != 0) { + // mark non-user scripts as read-only + flags |= Buffer_ReadOnly; + } } #if 0 @@ -655,11 +724,12 @@ LuaWindow::ScriptBuffer::~ScriptBuffer () bool LuaWindow::ScriptBuffer::load () { + assert (!(flags & Buffer_Valid)); if (!(flags & Buffer_HasFile)) return false; - if (flags & Buffer_Valid) return true; try { script = Glib::file_get_contents (path); flags |= Buffer_Valid; + flags &= BufferFlags(~Buffer_Dirty); } catch (Glib::FileError e) { return false; }