give the status-bar context slot a flexible share
StatusbarHost laid every item at intrinsic width, so once the focused-pane context line grew long (a model/mode/context/skills summary) the row's content exceeded the bar width and overflowed instead of letting the slot shrink. Add an opt-in flex factor to StatusItemContribution; the host wraps flex>0 items in Flexible(loose) so they yield width when the bar is tight, and the marquee then receives a bounded viewport and scrolls. Drops the fixed maxWidth cap on the pane-context item. T-160. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+7
-1
@@ -1140,10 +1140,16 @@ class StatusbarHost extends StatelessWidget {
|
||||
color: tokens.chromeBackground,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8),
|
||||
alignment: Alignment.center,
|
||||
// Left items with flex > 0 are wrapped in Flexible(loose) so they
|
||||
// yield width when the bar is tight; their contained ClideMarquee
|
||||
// then scrolls within the allotted bounds (T-160). Items with
|
||||
// flex == 0 (default) stay at intrinsic width. Right-side items
|
||||
// (priority >= 100) are always intrinsic-width.
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
for (final item in left) item.build(ctx),
|
||||
for (final item in left)
|
||||
if (item.flex > 0) Flexible(flex: item.flex, fit: FlexFit.loose, child: item.build(ctx)) else item.build(ctx),
|
||||
const Spacer(),
|
||||
for (final item in right) item.build(ctx),
|
||||
],
|
||||
|
||||
@@ -11,9 +11,6 @@ import 'package:clide/kernel/kernel.dart';
|
||||
import 'package:clide/widgets/widgets.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
/// Max width the slot occupies in the status bar before marquee kicks in.
|
||||
const double _slotMaxWidth = 360;
|
||||
|
||||
/// Fixed slot height — panes can render anything, but not blow up the bar.
|
||||
const double _slotHeight = 16;
|
||||
|
||||
@@ -28,14 +25,15 @@ class PaneContextStatusItem extends StatelessWidget {
|
||||
builder: (ctx, _) {
|
||||
final widget = focus.activeStatusWidget;
|
||||
if (widget == null) return const SizedBox.shrink();
|
||||
// The parent StatusbarHost wraps this item in Flexible(loose) so the
|
||||
// Row hands us a bounded maxWidth (T-160). ClideMarquee receives that
|
||||
// constraint via LayoutBuilder and scrolls when content exceeds it —
|
||||
// no ConstrainedBox(maxWidth) cap needed here.
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8),
|
||||
child: SizedBox(
|
||||
height: _slotHeight,
|
||||
child: ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxWidth: _slotMaxWidth),
|
||||
child: ClideMarquee(child: widget),
|
||||
),
|
||||
child: ClideMarquee(child: widget),
|
||||
),
|
||||
);
|
||||
},
|
||||
|
||||
@@ -61,6 +61,7 @@ class StatusItemContribution extends ContributionPoint {
|
||||
required this.build,
|
||||
this.priority = 0,
|
||||
this.listenable,
|
||||
this.flex = 0,
|
||||
});
|
||||
|
||||
@override
|
||||
@@ -68,6 +69,13 @@ class StatusItemContribution extends ContributionPoint {
|
||||
final WidgetBuilder build;
|
||||
final int priority;
|
||||
final Listenable? listenable;
|
||||
|
||||
/// When > 0, the status bar wraps this item in
|
||||
/// `Flexible(flex: flex, fit: FlexFit.loose)` so it yields width when the
|
||||
/// bar is tight and any contained [ClideMarquee] can scroll (T-160).
|
||||
/// Defaults to 0 (intrinsic/non-flex). Only meaningful for left-side items
|
||||
/// (priority < 100); right-side items are always intrinsic-width.
|
||||
final int flex;
|
||||
}
|
||||
|
||||
/// A button in the main toolbar.
|
||||
|
||||
Reference in New Issue
Block a user