Skip to content

feat: implement hierarchical submenu support for BitBar/Argos format#40

Merged
insign merged 4 commits intomainfrom
feat/submenu-support-37
Dec 22, 2025
Merged

feat: implement hierarchical submenu support for BitBar/Argos format#40
insign merged 4 commits intomainfrom
feat/submenu-support-37

Conversation

@insign
Copy link
Copy Markdown
Contributor

@insign insign commented Dec 22, 2025

Summary

Implements support for nested submenus in the system tray menu using the BitBar/Argos format where lines prefixed with -- indicate submenu items.

This feature enables plugins to create complex hierarchical menus, just like BitBar and Argos have always supported.

Changes

Parser (lib/core/output_parser.dart)

  • Modified _parseBitBar() to detect -- prefixes and build hierarchical MenuItem structures
  • Added _parseIndentedLine() to calculate depth from -- prefix count (-- = level 1, ---- = level 2, etc.)
  • Added _parseMenuItemFromLine() for cleaner individual line parsing
  • Fixed separator logic: first --- marks menu start, subsequent separators add visual dividers

Tray Service (lib/services/tray_service.dart)

  • Modified _updateMenu() to recursively convert plugin model MenuItems to tray_manager MenuItems
  • Added _convertMenuItems() for recursive conversion with submenu support
  • Used MenuItem.submenu() factory for proper tray submenu rendering
  • Plugins with menu items now show as expandable submenus in the tray

Tests

  • Added comprehensive unit tests covering 1-5 levels of nesting
  • Tests for submenu with attributes (bash, href, color)
  • Tests for mixed depth levels
  • All existing tests continue to pass (backward compatibility)

Documentation & Examples

  • Created plugins/examples/submenu_demo.30s.sh demonstrating submenu usage
  • Documentation already existed in docs/plugin-development.md (lines 183-195)

Example Usage

echo "📊 System"
echo "---"
echo "Hardware"
echo "--CPU"
echo "----Model: Intel i9"
echo "----Cores: 12"
echo "--Memory"
echo "----Used: 8GB"
echo "----Free: 24GB"

Testing

  • make analyze - No issues
  • make coverage - 45.8% (target: 35-60%)
  • make linux - Build successful
  • make android - Build successful

Closes #37

Implements support for nested submenus in the system tray menu using the
BitBar/Argos format where lines prefixed with -- indicate submenu items.

Changes:
- Modified output_parser.dart to detect -- prefixes and build hierarchical
  MenuItem structures with submenu fields
- Added _parseIndentedLine() to calculate depth from -- prefix count
- Added _parseMenuItemFromLine() for individual line parsing
- Fixed separator logic: first --- marks menu start, subsequent add visual separators
- Modified tray_service.dart to recursively convert plugin model MenuItems
  to tray_manager MenuItems with proper submenu support
- Added _convertMenuItems() for recursive conversion
- Used MenuItem.submenu() factory for proper tray submenu rendering
- Added comprehensive unit tests covering 1-5 levels of nesting
- Created submenu_demo.30s.sh example plugin demonstrating nested menus
- Regenerated l10n files to fix missing widgetUpdateNote getter

Closes #37
@insign insign added the cc label Dec 22, 2025
Create packages/crossbar_core and packages/crossbar_cli to resolve
dart compile exe failures caused by Flutter conditional imports.

Changes:
- packages/crossbar_core: Pure Dart package with shared APIs and models
  - APIs: media_api, network_api, system_api, utils_api
  - Models: plugin, plugin_config, plugin_output
  - Core: output_parser

- packages/crossbar_cli: CLI executable package
  - All 17 CLI commands migrated
  - plugin_manager_cli.dart: Simplified plugin manager for CLI
  - Config values read from JSON plaintext (~/.crossbar/config/)
  - Entry point: bin/crossbar.dart

- Makefile: Updated linux target to compile CLI from package
- AGENTS.md: ADR-001 superseded, ADR-011 added

ADR-011: Monorepo with separate packages resolves dart:ui import issues.

Verified: make linux, make analyze, make coverage all pass.
- AGENTS.md: Update section 3 to reflect Dual-Binary + Monorepo architecture
  - Add documentation for packages/crossbar_core and packages/crossbar_cli
  - Update CLI source path from bin/crossbar.dart to packages/crossbar_cli/bin/crossbar.dart

- README.md: Update Architecture diagram
  - Add packages/ directory structure with crossbar_core and crossbar_cli
  - Mark lib/core as Flutter-specific
  - Document CLI entry point in packages/crossbar_cli/
@insign insign merged commit 3e59f74 into main Dec 22, 2025
6 checks passed
@insign insign deleted the feat/submenu-support-37 branch December 23, 2025 01:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Implement Hierarchical Submenu Support for BitBar/Argos Compatibility (v1.5.0)

1 participant