diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 8be745f2..da871032 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -2259,6 +2259,34 @@ sys.path: {sys.path}''' app = AppWindow(root) + def messagebox_broken_plugins(): + """Display message about plugins not updated for Python 3.x.""" + if plug.PLUGINS_broken: + # LANG: Popup-text about 'broken' plugins that failoed to load + popup_text = _( + "One or more of your enabled plugins failed to load. Please see the list on the '{PLUGINS}' " + "tab of '{FILE}' > '{SETTINGS}'. This could be caused by a wrong folder structure. The load.py " + "file should be located under plugins/PLUGIN_NAME/load.py.\r\n\r\nYou can disable a plugin by " + "renaming its folder to have '{DISABLED}' on the end of the name." + ) + + # Substitute in the other words. + popup_text = popup_text.format( + PLUGINS=_('Plugins'), # LANG: Settings > Plugins tab + FILE=_('File'), # LANG: 'File' menu + SETTINGS=_('Settings'), # LANG: File > Settings + DISABLED='.disabled' + ) + # And now we do need these to be actual \r\n + popup_text = popup_text.replace('\\n', '\n') + popup_text = popup_text.replace('\\r', '\r') + + tk.messagebox.showinfo( + # LANG: Popup window title for list of 'broken' plugins that failoed to load + _('EDMC: Broken Plugins'), + popup_text + ) + def messagebox_not_py3(): """Display message about plugins not updated for Python 3.x.""" plugins_not_py3_last = config.get_int('plugins_not_py3_last', default=0) @@ -2297,9 +2325,11 @@ sys.path: {sys.path}''' root.wm_attributes('-alpha', ui_transparency / 100) # Display message box about plugins without Python 3.x support - root.after(0, messagebox_not_py3) + root.after(0, messagebox_broken_plugins) + # Display message box about plugins without Python 3.x support + root.after(1, messagebox_not_py3) # Show warning popup for killswitches matching current version - root.after(1, show_killswitch_poppup, root) + root.after(2, show_killswitch_poppup, root) # Start the main event loop root.mainloop() diff --git a/L10n/en.template b/L10n/en.template index a3432d6d..52398f25 100644 --- a/L10n/en.template +++ b/L10n/en.template @@ -213,12 +213,18 @@ /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name."; +/* EDMarketConnector.py: Popup-text about 'broken' plugins without Python 3.x support; In files: EDMarketConnector.py:2266:2271; */ +"One or more of your enabled plugins failed to load. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. This could be caused by a wrong folder structure. The load.py file should be located under plugins/PLUGIN_NAME/load.py.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "One or more of your enabled plugins failed to load. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. This could be caused by a wrong folder structure. The load.py file should be located under plugins/PLUGIN_NAME/load.py.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name."; + /* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:2263; prefs.py:986; */ "Plugins" = "Plugins"; /* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2274; */ "EDMC: Plugins Without Python 3.x Support" = "EDMC: Plugins Without Python 3.x Support"; +/* EDMarketConnector.py: Popup window title for list of 'broken' plugins that failoed to load; In files: EDMarketConnector.py:2285; */ +"EDMC: Broken Plugins" = "EDMC: Broken Plugins"; + /* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:208; */ "Journal directory already locked" = "Journal directory already locked"; @@ -471,12 +477,15 @@ /* prefs.py: Label on list of enabled plugins; In files: prefs.py:934; */ "Enabled Plugins" = "Enabled Plugins"; - /* prefs.py: Plugins - Label for list of 'enabled' plugins that don't work with Python 3.x; In files: prefs.py:954; */ "Plugins Without Python 3.x Support:" = "Plugins Without Python 3.x Support:"; + /* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:962; */ "Information on migrating plugins" = "Information on migrating plugins"; +/* prefs.py: Plugins - Label for list of 'broken' plugins that failed to load; In files: prefs.py:1039; */ +"Broken Plugins" = "Broken Plugins"; + /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Disabled Plugins"; diff --git a/plug.py b/plug.py index b343677b..aa34ce77 100644 --- a/plug.py +++ b/plug.py @@ -27,6 +27,7 @@ logger = get_main_logger() # List of loaded Plugins PLUGINS = [] PLUGINS_not_py3 = [] +PLUGINS_broken = [] # For asynchronous error display @@ -198,6 +199,7 @@ def _load_found_plugins(): plugin_logger = EDMCLogging.get_plugin_logger(name) found.append(Plugin(name, os.path.join(config.plugin_dir_path, name, 'load.py'), plugin_logger)) except Exception: + PLUGINS_broken.append(Plugin(name, None, logger)) logger.exception(f'Failure loading found Plugin "{name}"') pass return found diff --git a/prefs.py b/prefs.py index 6e423acc..6c2722b6 100644 --- a/prefs.py +++ b/prefs.py @@ -1029,6 +1029,23 @@ class PreferencesDialog(tk.Toplevel): nb.Label(plugins_frame, text=plugin.name).grid( columnspan=2, padx=self.LISTX, pady=self.PADY, sticky=tk.W, row=row.get() ) + ############################################################ + # Show plugins that failed to load + ############################################################ + if len(plug.PLUGINS_broken): + ttk.Separator(plugins_frame, orient=tk.HORIZONTAL).grid( + columnspan=3, padx=self.PADX, pady=self.SEPY, sticky=tk.EW, row=row.get() + ) + # LANG: Plugins - Label for list of 'broken' plugins that failed to load + nb.Label(plugins_frame, text=_('Broken Plugins')+':').grid( + padx=self.PADX, pady=self.PADY, sticky=tk.W, row=row.get() + ) + + for plugin in plug.PLUGINS_broken: + if plugin.folder: # 'system' ones have this set to None to suppress listing in Plugins prefs tab + nb.Label(plugins_frame, text=plugin.name).grid( + columnspan=2, padx=self.LISTX, pady=self.PADY, sticky=tk.W, row=row.get() + ) # LANG: Label on Settings > Plugins tab notebook.add(plugins_frame, text=_('Plugins')) # Tab heading in settings