Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 22 additions & 15 deletions geany/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@ class PluginLoader(object):
def __init__(self, plugin_dirs):

self.plugin_dirs = plugin_dirs

self.loaded = []
self.available_plugins = []
for plugin in self.iter_plugin_info():
self.available_plugins.append(plugin)

self.restore_loaded_plugins()



def update_loaded_plugins_file(self):
for path in self.plugin_dirs:
if os.path.isdir(path):
Expand Down Expand Up @@ -63,16 +64,9 @@ def load_all_plugins(self):


def unload_all_plugins(self):

for plugin in self.plugins:
self.unload_plugin(plugin)


def reload_all_plugins(self):

self.unload_all_plugins()
self.load_all_plugins()

tloaded = list(self.loaded)
for filename in tloaded:
self.unload_plugin(filename)

def iter_plugin_info(self):

Expand All @@ -87,13 +81,13 @@ def iter_plugin_info(self):
#loop around results if its fails to load will never reach yield
for p in self.load_plugin_info(current_path,plugin_folder_file):
yield p

#not a sub directory so if it ends with .py lets just attempt to load it as a plugin
if current_file.endswith('.py'):
#loop around results if its fails to load will never reach yield
for p in self.load_plugin_info(d,current_file):
yield p

def load_plugin_info(self,d,f):
filename = os.path.abspath(os.path.join(d, f))
if filename.endswith("test.py"):
Expand All @@ -105,7 +99,7 @@ def load_plugin_info(self,d,f):
except ImportError as exc:
print "Error: failed to import settings module ({})".format(exc)
module=None
if module:
if module:
for k, v in module.__dict__.iteritems():
if k == geany.Plugin.__name__:
continue
Expand All @@ -119,7 +113,7 @@ def load_plugin_info(self,d,f):
getattr(v, '__plugin_author__', ''),
v)
yield inf

except TypeError:
continue

Expand All @@ -128,6 +122,7 @@ def load_plugin(self, filename):

for avail in self.available_plugins:
if avail.filename == filename:
self.loaded.append(filename)
inst = avail.cls()
self.plugins[filename] = inst
self.update_loaded_plugins_file()
Expand All @@ -142,6 +137,7 @@ def unload_plugin(self, filename):
plugin = self.plugins[filename]
name = plugin.name
plugin.cleanup()
self.loaded.remove(filename)
del self.plugins[filename]
self.update_loaded_plugins_file()
geany.ui_utils.set_statusbar('GeanyPy: plugin deactivated: %s' %
Expand Down Expand Up @@ -170,3 +166,14 @@ def plugin_has_configure(self, filename):
return hasattr(self.plugins[filename], 'show_configure')
except KeyError:
return None

def refresh_plugins(self):

tloaded = list(self.loaded)
self.unload_all_plugins()
self.available_plugins = []
for plugin in self.iter_plugin_info():
self.available_plugins.append(plugin)
if plugin.filename in tloaded:
self.load_plugin(plugin.filename)
print 'refreshed ' + plugin.filename
75 changes: 42 additions & 33 deletions geany/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ def __init__(self, plugin_dirs=[]):
action_area.pack_start(btn, False, True, 0)
btn.show()

btn_refresh = gtk.Button(stock=gtk.STOCK_REFRESH)
btn_refresh.set_border_width(6)
btn_refresh.connect("clicked", self.on_refresh_plugins)
action_area.pack_start(btn_refresh, False, True, 0)
btn_refresh.show()

self.btn_help = gtk.Button(stock=gtk.STOCK_HELP)
self.btn_help.set_border_width(6)
self.btn_help.set_no_show_all(True)
Expand All @@ -63,11 +69,13 @@ def __init__(self, plugin_dirs=[]):

self.load_plugins_list()

def on_refresh_plugins(self, button):
self.loader.refresh_plugins()

def on_help_button_clicked(self, button, treeview, model):
path = treeview.get_cursor()[0]
iter = model.get_iter(path)
filename = model.get_value(iter, 2)
def on_help_button_clicked(self, button):
path = self.treeview.get_cursor()[0]
iter = self.liststore.get_iter(path)
filename = self.liststore.get_value(iter, 2)
for plugin in self.loader.available_plugins:
if plugin.filename == filename:
plugin.cls.show_help()
Expand All @@ -76,10 +84,10 @@ def on_help_button_clicked(self, button, treeview, model):
print("Plugin does not support help function")


def on_preferences_button_clicked(self, button, treeview, model):
path = treeview.get_cursor()[0]
iter = model.get_iter(path)
filename = model.get_value(iter, 2)
def on_preferences_button_clicked(self, button):
path = self.treeview.get_cursor()[0]
iter = self.liststore.get_iter(path)
filename = self.liststore.get_value(iter, 2)
try:
self.loader.plugins[filename].show_configure()
except KeyError:
Expand All @@ -89,27 +97,27 @@ def on_preferences_button_clicked(self, button, treeview, model):
def activate_plugin(self, filename):
self.loader.load_plugin(filename)


def deactivate_plugin(self, filename):
self.loader.unload_plugin(filename)

def deactivate_all_plugins(self):
self.response(gtk.RESPONSE_CLOSE)
self.loader.unload_all_plugins()

def load_plugins_list(self):
liststore = gtk.ListStore(gobject.TYPE_BOOLEAN, str, str)
self.liststore = gtk.ListStore(gobject.TYPE_BOOLEAN, str, str)

self.btn_help.connect("clicked",
self.on_help_button_clicked, self.treeview, liststore)
self.btn_help.connect("clicked", self.on_help_button_clicked)

self.btn_prefs.connect("clicked",
self.on_preferences_button_clicked, self.treeview, liststore)
self.btn_prefs.connect("clicked", self.on_preferences_button_clicked)

self.treeview.set_model(liststore)
self.treeview.set_model(self.liststore)
self.treeview.set_headers_visible(False)
self.treeview.set_grid_lines(True)

check_renderer = gtk.CellRendererToggle()
check_renderer.set_radio(False)
check_renderer.connect('toggled', self.on_plugin_load_toggled, liststore)
check_renderer.connect('toggled', self.on_plugin_load_toggled)
text_renderer = gtk.CellRendererText()

check_column = gtk.TreeViewColumn(None, check_renderer, active=0)
Expand All @@ -119,15 +127,16 @@ def load_plugins_list(self):
self.treeview.append_column(text_column)

self.treeview.connect('row-activated',
self.on_row_activated, check_renderer, liststore)
self.on_row_activated, check_renderer)
self.treeview.connect('cursor-changed',
self.on_selected_plugin_changed, liststore)
self.on_selected_plugin_changed)

self.load_sorted_plugins_info(liststore)
self.load_sorted_plugins_info()


def load_sorted_plugins_info(self, list_store):
def load_sorted_plugins_info(self):

self.liststore.clear()
plugin_info_list = list(self.loader.iter_plugin_info())
#plugin_info_list.sort(key=lambda pi: pi[1])

Expand All @@ -144,15 +153,15 @@ def load_sorted_plugins_info(self, list_store):

loaded = plugin_info.filename in self.loader.plugins

list_store.append([loaded, lbl, plugin_info.filename])
self.liststore.append([loaded, lbl, plugin_info.filename])


def on_selected_plugin_changed(self, treeview, model):
def on_selected_plugin_changed(self, treeview):

path = treeview.get_cursor()[0]
iter = model.get_iter(path)
filename = model.get_value(iter, 2)
active = model.get_value(iter, 0)
path = self.treeview.get_cursor()[0]
iter = self.liststore.get_iter(path)
filename = self.liststore.get_value(iter, 2)
active = self.liststore.get_value(iter, 0)

if self.loader.plugin_has_configure(filename):
self.btn_prefs.set_visible(True)
Expand All @@ -165,15 +174,15 @@ def on_selected_plugin_changed(self, treeview, model):
self.btn_help.set_visible(False)


def on_plugin_load_toggled(self, cell, path, model):
def on_plugin_load_toggled(self, cell, path):
active = not cell.get_active()
iter = model.get_iter(path)
model.set_value(iter, 0, active)
iter = self.liststore.get_iter(path)
self.liststore.set_value(iter, 0, active)
if active:
self.activate_plugin(model.get_value(iter, 2))
self.activate_plugin(self.liststore.get_value(iter, 2))
else:
self.deactivate_plugin(model.get_value(iter, 2))
self.deactivate_plugin(self.liststore.get_value(iter, 2))


def on_row_activated(self, tvw, path, view_col, cell, model):
self.on_plugin_load_toggled(cell, path, model)
def on_row_activated(self, tvw, path, view_col, cell):
self.on_plugin_load_toggled(cell, path)