From a1ff41d9816609be87385f3f4d02ebec55d78ad3 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 23 Apr 2026 16:42:29 +0200 Subject: [PATCH] fix tab switching on selection, tickets first in sidebar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extension listens to its own selection channel and activates the detail tab in the context panel — fixes the chicken-and-egg where the controller only subscribes after the widget builds. Registration order in main.dart now determines sidebar icon rail order: tickets first, then decisions, files, git, pql, problems. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/builtin/decisions/src/extension.dart | 17 ++++++++++++++++- lib/builtin/tickets/src/extension.dart | 17 ++++++++++++++++- lib/main.dart | 24 +++++++++++++++--------- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/lib/builtin/decisions/src/extension.dart b/lib/builtin/decisions/src/extension.dart index a15385b3..dcd4e778 100644 --- a/lib/builtin/decisions/src/extension.dart +++ b/lib/builtin/decisions/src/extension.dart @@ -1,7 +1,10 @@ +import 'dart:async'; + import 'package:clide/builtin/decisions/src/decision_detail_view.dart'; import 'package:clide/builtin/decisions/src/decisions_view.dart'; import 'package:clide/extension/extension.dart'; import 'package:clide/kernel/kernel.dart'; +import 'package:clide/kernel/src/events/message_bus.dart'; import 'package:clide/widgets/widgets.dart'; class DecisionsExtension extends ClideExtension { @@ -10,10 +13,22 @@ class DecisionsExtension extends ClideExtension { @override String get title => 'Decisions'; @override - String get version => '0.5.0'; + String get version => '0.6.0'; @override List get dependsOn => const []; + StreamSubscription? _sub; + + @override + Future activate(ClideExtensionContext ctx) async { + _sub = ctx.messages.subscribe(publisher: id, channel: 'selection').listen((_) { + ctx.panels.activateTab(Slots.contextPanel, 'decisions.detail'); + }); + } + + @override + Future deactivate() async => _sub?.cancel(); + @override List get contributions => [ TabContribution( diff --git a/lib/builtin/tickets/src/extension.dart b/lib/builtin/tickets/src/extension.dart index e5f0f903..d63f29b6 100644 --- a/lib/builtin/tickets/src/extension.dart +++ b/lib/builtin/tickets/src/extension.dart @@ -1,7 +1,10 @@ +import 'dart:async'; + import 'package:clide/builtin/tickets/src/ticket_detail_view.dart'; import 'package:clide/builtin/tickets/src/tickets_view.dart'; import 'package:clide/extension/extension.dart'; import 'package:clide/kernel/kernel.dart'; +import 'package:clide/kernel/src/events/message_bus.dart'; import 'package:clide/widgets/widgets.dart'; class TicketsExtension extends ClideExtension { @@ -10,10 +13,22 @@ class TicketsExtension extends ClideExtension { @override String get title => 'Tickets'; @override - String get version => '0.5.0'; + String get version => '0.6.0'; @override List get dependsOn => const []; + StreamSubscription? _sub; + + @override + Future activate(ClideExtensionContext ctx) async { + _sub = ctx.messages.subscribe(publisher: id, channel: 'selection').listen((_) { + ctx.panels.activateTab(Slots.contextPanel, 'tickets.detail'); + }); + } + + @override + Future deactivate() async => _sub?.cancel(); + @override List get contributions => [ TabContribution( diff --git a/lib/main.dart b/lib/main.dart index 62fc48b8..c77e5db2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -81,29 +81,35 @@ Future main() async { // Register every built-in. Tier 0 activates only the four that do // real work; the rest compile in as stubs so the extensions-ui can // list them when Tier 6 lands. + // Registration order = default icon rail order (left to right). + // User can override via project.layout.sidebar.order in settings. services.extensions ..register(DefaultLayoutExtension()) ..register(WelcomeExtension()) ..register(IpcStatusExtension()) ..register(ThemePickerExtension()) - ..register(ClaudeExtension()) - ..register(TerminalExtension()) + // Sidebar: tickets first, then decisions, files, git, pql, problems + ..register(TicketsExtension()) + ..register(DecisionsExtension()) ..register(FilesExtension()) - ..register(EditorExtension()) - ..register(GrammarsCoreExtension()) - ..register(MarkdownExtension()) - ..register(DiffExtension()) ..register(GitExtension()) ..register(PqlExtension()) - ..register(TodosExtension()) ..register(ProblemsExtension()) + // Workspace + ..register(ClaudeExtension()) + ..register(TerminalExtension()) + ..register(EditorExtension()) + ..register(DiffExtension()) + // Format engines + stubs + ..register(GrammarsCoreExtension()) + ..register(MarkdownExtension()) + ..register(TodosExtension()) ..register(CanvasExtension()) ..register(GraphExtension()) + // UI extensions ..register(SettingsUiExtension()) ..register(ExtensionsUiExtension()) ..register(KeybindingsUiExtension()) - ..register(DecisionsExtension()) - ..register(TicketsExtension()) ..register(ClaudeControlExtension()); await services.extensions.activateAll();