Skip to content
This repository was archived by the owner on Jun 25, 2020. It is now read-only.

Commit 4746eff

Browse files
committed
feature: auto reload plugins on save and expand api
1 parent d9e5222 commit 4746eff

File tree

4 files changed

+48
-8
lines changed

4 files changed

+48
-8
lines changed

src/menu.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <iostream>
55

66
//TODO: if Ubuntu ever gets fixed, cleanup the Ubuntu specific code
7-
Menu::Menu() {
7+
Menu::Menu() : plugin_menu(nullptr) {
88
auto accels=Config::get().menu.keys;
99
for(auto &accel: accels) {
1010
#ifdef JUCI_UBUNTU

src/menu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class Menu {
2222

2323
Glib::RefPtr<Gio::Menu> juci_menu;
2424
Glib::RefPtr<Gio::Menu> window_menu;
25+
Glib::RefPtr<Gio::Menu> plugin_menu;
2526

2627
private:
2728
Glib::RefPtr<Gtk::Builder> builder;

src/python_interpreter.cc

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include "config.h"
44
#include <iostream>
55
#include <pygobject.h>
6+
#include "menu.h"
7+
#include "directories.h"
68

79
inline pybind11::module pyobject_from_gobj(gpointer ptr){
810
auto obj=G_OBJECT(ptr);
@@ -13,14 +15,35 @@ inline pybind11::module pyobject_from_gobj(gpointer ptr){
1315

1416
PythonInterpreter::PythonInterpreter(){
1517
auto init_juci_api=[](){
16-
pybind11::module(pygobject_init(-1,-1,-1), false);
17-
pybind11::module api("jucpp", "Python bindings for juCi++");
18-
api.def("get_current_text_buffer", [](){
18+
pybind11::module(pygobject_init(-1,-1,-1),false);
19+
pybind11::module api("jucpp","Python bindings for juCi++");
20+
api.def("get_juci_home",[](){return Config::get().juci_home_path().string();})
21+
.def("get_plugin_folder",[](){return Config::get().python.plugin_directory;})
22+
.def("get_current_gtk_source_view",[](){
1923
auto view=Notebook::get().get_current_view();
2024
if(view)
2125
return pyobject_from_gobj(view->gobj());
22-
return pybind11::module(Py_None, false);
23-
});
26+
return pybind11::module(Py_None,false);
27+
})
28+
.def("get_gio_plugin_menu",[](){
29+
auto &plugin_menu=Menu::get().plugin_menu;
30+
if(!plugin_menu){
31+
plugin_menu=Gio::Menu::create();
32+
plugin_menu->append("<empty>");
33+
Menu::get().window_menu->append_submenu("_Plugins",plugin_menu);
34+
}
35+
return pyobject_from_gobj(plugin_menu->gobj());
36+
})
37+
.def("get_gio_window_menu",[](){return pyobject_from_gobj(Menu::get().window_menu->gobj());})
38+
.def("get_gio_juci_menu",[](){return pyobject_from_gobj(Menu::get().juci_menu->gobj());})
39+
.def("get_gtk_notebook",[](){return pyobject_from_gobj(Notebook::get().gobj());})
40+
.def_submodule("terminal")
41+
.def("get_gtk_text_view",[](){return pyobject_from_gobj(Terminal::get().gobj());})
42+
.def("println", [](const std::string &message){ Terminal::get().print(message +"\n"); });
43+
api.def_submodule("directories")
44+
.def("get_gtk_treeview",[](){return pyobject_from_gobj(Directories::get().gobj());})
45+
.def("open",[](const std::string &directory){Directories::get().open(directory);})
46+
.def("update",[](){Directories::get().update();});
2447
return api.ptr();
2548
};
2649
PyImport_AppendInittab("jucipp", init_juci_api);

src/window.cc

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include "config.h"
44
#include "menu.h"
55
#include "directories.h"
6-
//#include "api.h"
6+
#include "python_interpreter.h"
77
#include "dialogs.h"
88
#include "filesystem.h"
99
#include "project.h"
@@ -244,13 +244,29 @@ void Window::set_menu_actions() {
244244
if(notebook.get_current_page()!=-1) {
245245
if(notebook.save_current()) {
246246
if(notebook.get_current_page()!=-1) {
247-
if(notebook.get_current_view()->file_path==Config::get().juci_home_path()/"config"/"config.json") {
247+
auto file_path=notebook.get_current_view()->file_path;
248+
if(file_path==Config::get().juci_home_path()/"config"/"config.json") {
248249
configure();
249250
for(int c=0;c<notebook.size();c++) {
250251
notebook.get_view(c)->configure();
251252
notebook.configure(c);
252253
}
253254
}
255+
if(file_path>Config::get().python.plugin_directory){
256+
auto stem=file_path.stem().string();
257+
auto module=PythonInterpreter::get().get_loaded_module(stem);
258+
if(module){
259+
auto module_new=pybind11::module(PyImport_ReloadModule(module.ptr()),false);
260+
if(module_new)
261+
Terminal::get().print("Python module "+stem + " has been reloaded \n");
262+
else PythonError();
263+
}else{
264+
PythonError();
265+
module=PythonInterpreter::get().import(stem);
266+
if(module)
267+
Terminal::get().print("Python module "+stem + " has been reloaded \n");
268+
}
269+
}
254270
}
255271
}
256272
}

0 commit comments

Comments
 (0)