- Adds a Popup at startup about Plugins that failed to load.
- Adds entry about broken Plugins in the Settings - Plugins tab.
- Adds corresponding translation entries.
1. EDDB plugin needs to track the system name, but we're moving all of that
into monitor.py.
2. monitor.py was tracking this in monitor.system, but it needs to be in
monitor.state['SystemName'] in order for plugins to access it.
So, move monitor.system to monitor.state['SystemName'] and update all uses.
1. `io.edcd.EDMarketConnector.desktop` based on the flathub one, but with
reference to v1.5 of the spec (linked in a file comment).
2. As the Icon is specified using `io.edcd.EDMarketConnector`, not only
`EDMarketConnector`, renamed the .png file and updated the single code
reference to it.
It was observed that some text in the EDMC-Canonn plugin was wrapping in
this branch when the same text doesn't in `develop. So, tweaked the
plugin_frame setup to match the main UI frame setup:
* `tk.NSEW` not `tk.EW` - didn't fix the problem, but we should match this.
* `.columnconfigure(1, weight=1)` - this actually fixed the problem.
These are used in the non-default themes, as the OS ones are hidden and
replaced by them.
They're created after the rest of the main UI, so come last in the 'children'
list.
Unfortunately we can't name the plugin ones, as that's entirely up to their
`plugin_app()` code, and widget names can't be changed after creation.
NB: Each `plugin_hr_X` frame is `grid()`'d to be *before* the plugin in
question, despite being listed *after* in:
>>> self.w.children['edmarketconnector'].children
Typing this as `update.Updater | None` and having the check
`if self.updater is not None:` causes the menu entry to not even get added,
because `import update` was coming later.
I can't recall why that import/setup was later, but I might be about to find
out again....
In testing the *first* hit on this does have `monitor.cmdr` set, but neither
`monitor.system` or `monitor.station`. So:
1. Allow those to be `None` in the function signature,
2. Guard against only `monitor.cmdr` being falsey before the call.
3. Move the `if err:` to the same scope.
Technically `theme.startup_ui_scale` should be `float` to match with
`default_ui_scale` from tkinter, but we store it in the config as `int`,
so go with that.
Also, the killswitch popup ends up un-themed *anyway*, so don't even call
`theme.apply()`. That function expects a `tk.Tk` not, `Toplevel`, and
doesn't even do anything for a `Toplevel` anyway.