diff --git a/geany/loader.py b/geany/loader.py index 14b9b73..126072a 100644 --- a/geany/loader.py +++ b/geany/loader.py @@ -13,7 +13,7 @@ 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) @@ -21,6 +21,7 @@ def __init__(self, plugin_dirs): self.restore_loaded_plugins() + def update_loaded_plugins_file(self): for path in self.plugin_dirs: if os.path.isdir(path): @@ -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): @@ -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"): @@ -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 @@ -119,7 +113,7 @@ def load_plugin_info(self,d,f): getattr(v, '__plugin_author__', ''), v) yield inf - + except TypeError: continue @@ -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() @@ -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' % @@ -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 diff --git a/geany/manager.py b/geany/manager.py index 9c7e9a4..60bac66 100644 --- a/geany/manager.py +++ b/geany/manager.py @@ -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) @@ -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() @@ -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: @@ -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) @@ -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]) @@ -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) @@ -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)