Make vertical tab close (×) buttons reliably hittable
Two issues kept the close button unusable: - The launcher-row close button lacked flex_shrink_0, so on narrow sidebars the title swallowed the 16 px hit target before flex laid it out. - The handler did select_tab(close_id) → close_active_tab(); if the newly-selected tab routed through split-view close logic the call silently no-op'd against the user's intent. Add flex_shrink_0 on both launcher and tab close buttons, and route the click through a new close_tab_by_id helper that calls BrowserCore::close_tab(tab_id) directly.
This commit is contained in:
@@ -271,6 +271,7 @@ impl ElyShell {
|
|||||||
.id(close_id)
|
.id(close_id)
|
||||||
.size(px(16.0))
|
.size(px(16.0))
|
||||||
.rounded(px(4.0))
|
.rounded(px(4.0))
|
||||||
|
.flex_shrink_0()
|
||||||
.flex()
|
.flex()
|
||||||
.items_center()
|
.items_center()
|
||||||
.justify_center()
|
.justify_center()
|
||||||
@@ -280,11 +281,7 @@ impl ElyShell {
|
|||||||
.hover(|style| style.bg(rgba(0x281e1414)).text_color(rgb(colors::INK)))
|
.hover(|style| style.bg(rgba(0x281e1414)).text_color(rgb(colors::INK)))
|
||||||
.cursor_pointer()
|
.cursor_pointer()
|
||||||
.on_click(cx.listener(move |shell, _, window, cx| {
|
.on_click(cx.listener(move |shell, _, window, cx| {
|
||||||
// Close the tab without bubbling to the launcher row's
|
shell.close_tab_by_id(&close_tab_id, window, cx);
|
||||||
// own on_click — otherwise the row tries to re-select
|
|
||||||
// the tab right after we've closed it.
|
|
||||||
shell.select_tab(&close_tab_id, window, cx);
|
|
||||||
shell.close_active_tab(window, cx);
|
|
||||||
cx.stop_propagation();
|
cx.stop_propagation();
|
||||||
}))
|
}))
|
||||||
.child(IconName::Close),
|
.child(IconName::Close),
|
||||||
@@ -386,8 +383,7 @@ impl ElyShell {
|
|||||||
.hover(|style| style.bg(rgba(0x281e1414)).text_color(rgb(colors::INK)))
|
.hover(|style| style.bg(rgba(0x281e1414)).text_color(rgb(colors::INK)))
|
||||||
.cursor_pointer()
|
.cursor_pointer()
|
||||||
.on_click(cx.listener(move |shell, _, window, cx| {
|
.on_click(cx.listener(move |shell, _, window, cx| {
|
||||||
shell.select_tab(&close_tab_id, window, cx);
|
shell.close_tab_by_id(&close_tab_id, window, cx);
|
||||||
shell.close_active_tab(window, cx);
|
|
||||||
cx.stop_propagation();
|
cx.stop_propagation();
|
||||||
}))
|
}))
|
||||||
.child(IconName::Close),
|
.child(IconName::Close),
|
||||||
|
|||||||
@@ -33,4 +33,24 @@ impl ElyShell {
|
|||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Close a specific tab by id. Used by the per-row close (×) on
|
||||||
|
/// vertical tabs and launcher rows: closing the tab the user
|
||||||
|
/// targeted directly, instead of the prior select-then-close
|
||||||
|
/// dance which depended on `close_active_tab` doing the right
|
||||||
|
/// thing after a fresh selection (and which silently no-op'd if
|
||||||
|
/// the active tab routed into split-view close logic).
|
||||||
|
pub(super) fn close_tab_by_id(
|
||||||
|
&mut self,
|
||||||
|
tab_id: &TabId,
|
||||||
|
window: &mut Window,
|
||||||
|
cx: &mut Context<Self>,
|
||||||
|
) {
|
||||||
|
if let ShellState::Ready(core) = &mut self.state
|
||||||
|
&& core.close_tab(tab_id).is_ok()
|
||||||
|
{
|
||||||
|
self.sync_address_input(window, cx);
|
||||||
|
cx.notify();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user