When hovering between tray icons, update menu content in-place
instead of calling toggleDropdown which closes the visible menu.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Enlarge tray icon hit areas and add HoverHandler on tray row
to keep dropdown alive while moving between icons.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use PanelWindow with overlay layer instead of PopupWindow for toast.
Rename notifServer id to avoid binding loop with Bar property.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Accumulate scan results into a temp array, swap to wifiNetworks
in one assignment when the process finishes. No more clearing
the list before each scan.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Hover-only MouseArea (Qt.NoButton) for switch-on-hover, separate
click MouseArea for right-click menus. Prevents hover tracking
from consuming click events.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Skip toggle when hovering back to the icon whose menu is
already open — checks trayItem identity, not just dropdown.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Auto-close timer called animateClose() directly, leaving
activeDropdown set — next hover opened a menu without click.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
on-failure doesn't restart after SIGTERM (killall). always
ensures quickshell comes back regardless of how it stopped.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace hl.exec_cmd("qs") with a systemd user service bound to
hyprland-session.target. xdg.configFile onChange restarts the
service when the QML config changes during a rebuild.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When a dropdown is open, hovering another bar icon (clock,
network, battery, tray) instantly switches to that dropdown.
Also handles cancelling a close animation to reopen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reads energy_now/energy_full to calculate hours remaining.
Shows "Xh Ym left" when discharging, "Xh Ym to full" when
charging, alongside the wattage draw.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
BarDropdown.animateClose() morphs height to 0 then hides after
230ms. Used by auto-close timer, icon toggle, and switching
between dropdowns — old slides up while new slides down.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3s timer starts when dropdown opens or mouse leaves. Hovering
the dropdown stops the timer. Leaves instantly on mouse exit.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove grabFocus from BarDropdown. Centralized toggleDropdown()
closes the active dropdown before opening a new one, so clicking
between network/battery/calendar/tray is instant — no double-click.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Click battery to see charge %, wattage draw, and switch between
power-saver/balanced/performance profiles via power-profiles-daemon.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reset state before each poll so disconnected state is detected.
Immediately update icon on disconnect, and trigger a delayed
re-poll (2s) after connect/disconnect actions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Track actual wifi device name instead of hardcoded wlan0
- Use writeShellScript for wifi-connect with zenity password fallback
- Fix wifiNetworks array mutation for proper QML reactivity
- Add zenity to system packages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Click network icon to see available wifi networks with signal
strength. Click to connect, disconnect button for active network.
Uses BarDropdown component for consistent styling.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Inline QML component encapsulating PopupWindow + concave
corners + morphing animation + dismiss guard. Calendar and
tray context menu both use it now.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Same morphing animation, concave corners, and dismiss behavior
as the calendar popup. Menu drops down from bar at icon position.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Clicking clock while popup open triggered grabFocus dismiss
then immediately reopened. Add justDismissed guard so the
click handler ignores the click that caused the dismiss.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>