diff options
author | Robin Gareus <robin@gareus.org> | 2016-02-23 15:42:13 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-02-23 15:42:13 +0100 |
commit | 6b940afa36104e9d9d6c46828abb1182100689e3 (patch) | |
tree | c2f0143565e1ca65170fe67065971d5c015f470b /gtk2_ardour/luawindow.cc | |
parent | 28017b4751cb5b4a8806f74b269730e8d2e37e8c (diff) |
Lua Script Console Window
Diffstat (limited to 'gtk2_ardour/luawindow.cc')
-rw-r--r-- | gtk2_ardour/luawindow.cc | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/gtk2_ardour/luawindow.cc b/gtk2_ardour/luawindow.cc new file mode 100644 index 0000000000..5fda4f2e24 --- /dev/null +++ b/gtk2_ardour/luawindow.cc @@ -0,0 +1,224 @@ +/* + Copyright (C) 2016 Robin Gareus <robin@gareus.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifdef WAF_BUILD +#include "gtk2ardour-config.h" +#endif + +#include <gtkmm2ext/gtk_ui.h> +#include <gtkmm2ext/utils.h> +#include <gtkmm2ext/window_title.h> + +#include "ardour_ui.h" +#include "gui_thread.h" +#include "luainstance.h" +#include "luawindow.h" +#include "public_editor.h" +#include "utils.h" + +#include "ardour/luabindings.h" +#include "LuaBridge/LuaBridge.h" + +#include "i18n.h" + +using namespace ARDOUR; +using namespace ARDOUR_UI_UTILS; +using namespace PBD; +using namespace Gtk; +using namespace Glib; +using namespace Gtkmm2ext; +using namespace std; + + +LuaWindow* LuaWindow::_instance = 0; + +LuaWindow* +LuaWindow::instance () +{ + if (!_instance) { + _instance = new LuaWindow; + } + + return _instance; +} + +LuaWindow::LuaWindow () + : Window (Gtk::WINDOW_TOPLEVEL) + , VisibilityTracker (*((Gtk::Window*) this)) + , _visible (false) +{ + set_name ("Lua"); + + update_title (); + set_wmclass (X_("ardour_mixer"), PROGRAM_NAME); + + set_border_width (0); + + outtext.set_editable (false); + outtext.set_wrap_mode (Gtk::WRAP_WORD); + + signal_delete_event().connect (sigc::mem_fun (*this, &LuaWindow::hide_window)); + signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); + + scrollwin.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_ALWAYS); + scrollwin.add (outtext); + + Gtk::Button *btn_clr = manage (new Button ("Clear")); + btn_clr->signal_clicked().connect (sigc::mem_fun(*this, &LuaWindow::clear_output)); + + Gtk::HBox *hbox = manage (new HBox()); + + hbox->pack_start (entry, true, true, 2); + hbox->pack_start (*btn_clr, false, false, 0); + + Gtk::VBox *vbox = manage (new VBox()); + vbox->pack_start (scrollwin, true, true, 0); + vbox->pack_start (*hbox, false, false, 2); + + entry.signal_activate().connect (sigc::mem_fun (*this, &LuaWindow::entry_activated)); + + lua.Print.connect (sigc::mem_fun (*this, &LuaWindow::append_text)); + + vbox->show_all (); + add (*vbox); + set_size_request (640, 480); // XXX + + LuaInstance::register_classes (lua.getState()); + // TODO register some callback functions. + + lua_State* L = lua.getState(); + luabridge::push <PublicEditor *> (L, &PublicEditor::instance()); + lua_setglobal (L, "Editor"); + // TODO + // - allow to load files + // - allow to run files directly + // - history buffer + // - multi-line input ?? +} + +LuaWindow::~LuaWindow () +{ +} + +void +LuaWindow::show_window () +{ + present(); + _visible = true; +} + +bool +LuaWindow::hide_window (GdkEventAny *ev) +{ + if (!_visible) return 0; + _visible = false; + return just_hide_it (ev, static_cast<Gtk::Window *>(this)); +} + +void LuaWindow::set_session (Session* s) +{ + SessionHandlePtr::set_session (s); + if (!_session) { + return; + } + + update_title (); + _session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&LuaWindow::update_title, this), gui_context()); + + // expose "Session" point directly + lua_State* L = lua.getState(); + LuaBindings::set_session (L, _session); +} + +void +LuaWindow::session_going_away () +{ + ENSURE_GUI_THREAD (*this, &LuaWindow::session_going_away); + lua.do_command ("collectgarbage();"); + //TODO: re-init lua-engine (drop all references) ?? + + SessionHandlePtr::session_going_away (); + _session = 0; + update_title (); + + lua_State* L = lua.getState(); + LuaBindings::set_session (L, _session); +} + +void +LuaWindow::update_title () +{ + if (_session) { + string n; + + if (_session->snap_name() != _session->name()) { + n = _session->snap_name (); + } else { + n = _session->name (); + } + + if (_session->dirty ()) { + n = "*" + n; + } + + WindowTitle title (n); + title += S_("Window|Lua"); + title += Glib::get_application_name (); + set_title (title.get_string()); + + } else { + WindowTitle title (S_("Window|Lua")); + title += Glib::get_application_name (); + set_title (title.get_string()); + } +} + +void +LuaWindow::scroll_to_bottom () +{ + Gtk::Adjustment *adj; + adj = scrollwin.get_vadjustment(); + adj->set_value (MAX(0,(adj->get_upper() - adj->get_page_size()))); +} + +void +LuaWindow::entry_activated () +{ + std::string cmd = entry.get_text(); + append_text ("> " + cmd); + + if (0 == lua.do_command (cmd)) { + entry.set_text(""); + } +} + +void +LuaWindow::append_text (std::string s) +{ + Glib::RefPtr<Gtk::TextBuffer> tb (outtext.get_buffer()); + tb->insert (tb->end(), s + "\n"); + scroll_to_bottom (); +} + +void +LuaWindow::clear_output () +{ + Glib::RefPtr<Gtk::TextBuffer> tb (outtext.get_buffer()); + tb->set_text (""); +} |