summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
Diffstat (limited to 'ui')
-rw-r--r--ui/main_window.py20
-rw-r--r--ui/windows/settings_window.py12
2 files changed, 27 insertions, 5 deletions
diff --git a/ui/main_window.py b/ui/main_window.py
index d0e0ac4..95cdb84 100644
--- a/ui/main_window.py
+++ b/ui/main_window.py
@@ -296,10 +296,22 @@ class MainWindow(QMainWindow):
def plugin_enable(self, plugin_id: str):
"""Called by SettingsWindow when user enables a plugin."""
- ctx = self._make_plugin_context()
- plugin = self._plugin_mgr.enable(plugin_id, ctx)
- if plugin:
- self._install_plugin(plugin)
+ missing = self._plugin_mgr.get_missing_dependencies(plugin_id)
+ if missing:
+ from PyQt6.QtWidgets import QMessageBox
+ QMessageBox.warning(
+ self, "Missing Plugin Dependencies",
+ f"Can't enable this plugin — missing Python packages:\n\n"
+ f" {', '.join(missing)}\n\n"
+ f"Install with:\n pip install {' '.join(missing)}"
+ )
+ else:
+ ctx = self._make_plugin_context()
+ plugin = self._plugin_mgr.enable(plugin_id, ctx)
+ if plugin:
+ self._install_plugin(plugin)
+ if self._win_settings:
+ self._win_settings.sync_plugin_button(plugin_id)
def plugin_disable(self, plugin_id: str):
"""Called by SettingsWindow when user disables a plugin."""
diff --git a/ui/windows/settings_window.py b/ui/windows/settings_window.py
index 1630efa..553a3a7 100644
--- a/ui/windows/settings_window.py
+++ b/ui/windows/settings_window.py
@@ -50,6 +50,7 @@ class SettingsWindow(QWidget):
self.registry = registry
self.engine = engine
self._plugin_mgr = plugin_manager
+ self._plugin_buttons: dict = {} # plugin_id -> QPushButton
self.cfg = dict(self._defaults)
if current:
self.cfg.update(current)
@@ -233,6 +234,7 @@ class SettingsWindow(QWidget):
toggle.clicked.connect(
lambda _, pid=manifest.plugin_id, btn=toggle: self._toggle_plugin(pid, btn)
)
+ self._plugin_buttons[manifest.plugin_id] = toggle
hdr.addWidget(toggle)
cl.addLayout(hdr)
@@ -261,8 +263,16 @@ class SettingsWindow(QWidget):
self.plugin_disable_requested.emit(plugin_id)
btn.setText("Enable")
else:
+ # Don't flip to "Disable" yet — enabling can fail (missing
+ # dependencies, bad plugin code). main_window confirms the
+ # real outcome via sync_plugin_button() once enable() returns.
self.plugin_enable_requested.emit(plugin_id)
- btn.setText("Disable")
+
+ def sync_plugin_button(self, plugin_id: str):
+ """Refresh one plugin's toggle button to match its actual enabled state."""
+ btn = self._plugin_buttons.get(plugin_id)
+ if btn is not None and self._plugin_mgr is not None:
+ btn.setText("Disable" if self._plugin_mgr.is_enabled(plugin_id) else "Enable")
# ── Actions ───────────────────────────────────────────────────────────