Fix flicker in short context menus that have documentation aside (#38074)
Menu items in the context menu component have the ability to display a documentation aside popover. However, because this docs aside popover was setup as a sibling flex container to the actual menu popover, if the menu had a short amount of items and the docs popover is bigger than the menu, this flickering would happen, making it essentially unusable: https://github.com/user-attachments/assets/74956254-fff6-4c5c-9f79-02998c64a105 So, this PR makes the docs aside popover in wide window sizes absolutely-positioned relative to the menu container, which removes all flickering. On top of that, I'm adding a `DocumentationEdge` enum that allows to control the edge anchor of the docs aside, which is useful in this particular mode selector example to make the layout work well. https://github.com/user-attachments/assets/a3e811e1-86b4-4839-a219-c3b0734532b3 When the window is small, the docs aside continue to be a sibling flex container, which causes a super subtle shift in the items within the menu popover. This is something I want to pursue fixing, but didn't want to delay this PR too much. Release Notes: - N/A
This commit is contained in:
@@ -24,8 +24,8 @@ use std::{
|
||||
};
|
||||
use supermaven::{AccountStatus, Supermaven};
|
||||
use ui::{
|
||||
Clickable, ContextMenu, ContextMenuEntry, DocumentationSide, IconButton, IconButtonShape,
|
||||
Indicator, PopoverMenu, PopoverMenuHandle, ProgressBar, Tooltip, prelude::*,
|
||||
Clickable, ContextMenu, ContextMenuEntry, DocumentationEdge, DocumentationSide, IconButton,
|
||||
IconButtonShape, Indicator, PopoverMenu, PopoverMenuHandle, ProgressBar, Tooltip, prelude::*,
|
||||
};
|
||||
use workspace::{
|
||||
StatusItemView, Toast, Workspace, create_and_open_local_file, item::ItemHandle,
|
||||
@@ -447,7 +447,7 @@ impl EditPredictionButton {
|
||||
menu = menu.item(
|
||||
entry
|
||||
.disabled(true)
|
||||
.documentation_aside(DocumentationSide::Left, move |_cx| {
|
||||
.documentation_aside(DocumentationSide::Left, DocumentationEdge::Top, move |_cx| {
|
||||
Label::new(format!("Edit predictions cannot be toggled for this buffer because they are disabled for {}", language.name()))
|
||||
.into_any_element()
|
||||
})
|
||||
@@ -499,7 +499,7 @@ impl EditPredictionButton {
|
||||
.item(
|
||||
ContextMenuEntry::new("Eager")
|
||||
.toggleable(IconPosition::Start, eager_mode)
|
||||
.documentation_aside(DocumentationSide::Left, move |_| {
|
||||
.documentation_aside(DocumentationSide::Left, DocumentationEdge::Top, move |_| {
|
||||
Label::new("Display predictions inline when there are no language server completions available.").into_any_element()
|
||||
})
|
||||
.handler({
|
||||
@@ -512,7 +512,7 @@ impl EditPredictionButton {
|
||||
.item(
|
||||
ContextMenuEntry::new("Subtle")
|
||||
.toggleable(IconPosition::Start, subtle_mode)
|
||||
.documentation_aside(DocumentationSide::Left, move |_| {
|
||||
.documentation_aside(DocumentationSide::Left, DocumentationEdge::Top, move |_| {
|
||||
Label::new("Display predictions inline only when holding a modifier key (alt by default).").into_any_element()
|
||||
})
|
||||
.handler({
|
||||
@@ -543,7 +543,7 @@ impl EditPredictionButton {
|
||||
.toggleable(IconPosition::Start, data_collection.is_enabled())
|
||||
.icon(icon_name)
|
||||
.icon_color(icon_color)
|
||||
.documentation_aside(DocumentationSide::Left, move |cx| {
|
||||
.documentation_aside(DocumentationSide::Left, DocumentationEdge::Top, move |cx| {
|
||||
let (msg, label_color, icon_name, icon_color) = match (is_open_source, is_collecting) {
|
||||
(true, true) => (
|
||||
"Project identified as open source, and you're sharing data.",
|
||||
@@ -626,7 +626,7 @@ impl EditPredictionButton {
|
||||
ContextMenuEntry::new("Configure Excluded Files")
|
||||
.icon(IconName::LockOutlined)
|
||||
.icon_color(Color::Muted)
|
||||
.documentation_aside(DocumentationSide::Left, |_| {
|
||||
.documentation_aside(DocumentationSide::Left, DocumentationEdge::Top, |_| {
|
||||
Label::new(indoc!{"
|
||||
Open your settings to add sensitive paths for which Zed will never predict edits."}).into_any_element()
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user