X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fluawindow.cc;h=4733bcbeec482ea1b3121781176ef0e7c70500f8;hb=d883d4623ab326b921e6a26d5ea47bf609bd4a85;hp=a95376c3a6586a4aa9ed5ef10c67b2846d76241b;hpb=e063e4bf1de2d523f70b7a42950653c06ad6a02a;p=ardour.git diff --git a/gtk2_ardour/luawindow.cc b/gtk2_ardour/luawindow.cc index a95376c3a6..4733bcbeec 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 @@ -33,9 +34,11 @@ #include "pbd/md5.h" #include "gtkmm2ext/gtk_ui.h" +#include "gtkmm2ext/pane.h" #include "gtkmm2ext/utils.h" #include "gtkmm2ext/window_title.h" +#include "ardour/filesystem_paths.h" #include "ardour/luabindings.h" #include "LuaBridge/LuaBridge.h" @@ -48,7 +51,7 @@ #include "utils.h" #include "utils_videotl.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace ARDOUR_UI_UTILS; @@ -92,7 +95,7 @@ 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")) @@ -153,9 +156,9 @@ LuaWindow::LuaWindow () 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); + Gtkmm2ext::VPane *vpane = manage (new Gtkmm2ext::VPane ()); + vpane->add (*vbox); + vpane->add (scrollout); vpane->show_all (); add (*vpane); @@ -331,7 +334,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); @@ -342,10 +355,15 @@ 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 @@ -362,7 +380,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()); @@ -415,6 +433,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)); @@ -462,9 +481,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 @@ -518,12 +539,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 (); } @@ -547,8 +568,16 @@ 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, + 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) { @@ -577,7 +606,7 @@ LuaWindow::script_selection_changed (ScriptBufferPtr n, bool force) Glib::RefPtr tb (entry.get_buffer()); - if ((n->flags & Buffer_Valid)) { + if (_current_buffer->flags & Buffer_Valid) { _current_buffer->script = tb->get_text(); } @@ -619,8 +648,13 @@ 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)); } @@ -638,6 +672,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"; } @@ -651,6 +686,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 @@ -671,11 +710,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; }