feat: migrate pills to Panel.qml — fix left-click + right-click menus - #118
Merged
Conversation
Replace QtQuick.Controls.Popup (incompatible with LayerShell bar windows) with pluginApi.togglePanel() + Panel.qml for left-click, and NPopupContextMenu + PanelService.showContextMenu() for right-click. - stoa-doctor-pill: new Panel.qml (status header + Run Doctor / Open Log) - stoa-drive-pill: new Panel.qml (per-drive rows, cache bars, footer actions) - Both BarWidget.qml rewritten: left-click opens panel, right-click context menu - Both manifest.json updated with "panel" entryPoint https://claude.ai/code/session_01JH7MsJFvce1eEde8DJiCfe
VictorGSchneider
added a commit
that referenced
this pull request
May 31, 2026
## Problema Duas regressões introduzidas pela rodada de install.sh + PR #118: ### 1. Stoa Memento Mori duplicado (×N) no Desktop Widgets A função `_link` em `install.sh` não era idempotente: toda re-execução fazia `mv` do symlink existente para `.bak.TIMESTAMP` e criava um novo. O diretório `.bak.*` continuava apontando para o mesmo plugin, e o Noctalia escaneava a pasta `plugins/` e carregava **todas** as entradas — incluindo os backups — como instâncias separadas do mesmo plugin. Resultado: N cópias de "Stoa Memento Mori" no picker. **Fix:** antes de fazer backup, verifica se o symlink já aponta para o source correto. Se sim, retorna imediatamente — sem backup, sem re-link. ### 2. Bar widgets do doctor e drive sumiam após `install.sh` `stoa-doctor-pill/Panel.qml` usava `NIcon`, que não existe no `qs.Widgets` do Noctalia. Se o Noctalia valida os entry points no registro do plugin, um erro de QML faz o plugin inteiro falhar — derrubando o bar widget junto. **Fix:** removido `NIcon`; as linhas de ação ficam só com `NText`. ## Resumo das mudanças - `install.sh`: `_link` agora é idempotente (skip se symlink já está correto) - `stoa-doctor-pill/Panel.qml`: removido `NIcon` e campo `icon` do model ## Para limpar os `.bak.*` existentes ```bash rm ~/.config/noctalia/plugins/*.bak.* ``` Reinicie o Noctalia depois. https://claude.ai/code/session_01JH7MsJFvce1eEde8DJiCfe --- _Generated by [Claude Code](https://claude.ai/code/session_01JH7MsJFvce1eEde8DJiCfe)_
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
QtQuick.Controls.Popup(broken in LayerShell bar windows) with the correct Noctalia architecture:pluginApi.togglePanel()+Panel.qmlfor left-click, andNPopupContextMenu+PanelService.showContextMenu()for right-clickstoa-doctor-pillandstoa-drive-pillnow have aPanel.qmlregistered in theirmanifest.jsonstoa-doctor-pill
pluginApi.togglePanel(), right-click → context menu with Run Doctor / Open Logstoa-doctor-statuson openstoa-drive-pill
Popup driveMenu; left-click →pluginApi.togglePanel(), right-click → context menu with Mount All / Unmount All / Open ~/Drive; pill only trackstotal/mounted(no_drivesarray needed here)stoa-drive-statuson openTest plan
stoa-doctor, re-polls status after finishhttps://claude.ai/code/session_01JH7MsJFvce1eEde8DJiCfe
Generated by Claude Code