forked from 1b-agent/opencadstudio-upstream
Command line: hovered history lines stay until the pointer leaves
Lines still showing when the pointer reaches the overlay history no longer fade under it; leaving restarts their COMMANDLINEFADETIME. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
2c329b2889
commit
ec603f1c8f
3 files changed
+51
-11
No files matched your search
@@ -3059,6 +3059,8 @@ pub enum Message {
|
|||||||
/// User clicked a command-line option button — feed its keyword to the
|
/// User clicked a command-line option button — feed its keyword to the
|
||||||
/// active command as if typed (empty keyword = Enter). (#304)
|
/// active command as if typed (empty keyword = Enter). (#304)
|
||||||
CommandOptionPick(String),
|
CommandOptionPick(String),
|
||||||
|
/// The pointer entered (true) or left the command line's overlay history.
|
||||||
|
CommandHistoryHover(bool),
|
||||||
ToggleLayers,
|
ToggleLayers,
|
||||||
/// Open/focus (or close) the Reference Manager palette.
|
/// Open/focus (or close) the Reference Manager palette.
|
||||||
ToggleXrefManager,
|
ToggleXrefManager,
|
||||||
|
|||||||
@@ -2857,6 +2857,11 @@ impl OpenCADStudio {
|
|||||||
self.focus_cmd_input()
|
self.focus_cmd_input()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Message::CommandHistoryHover(hovered) => {
|
||||||
|
self.command_line.set_history_hover(hovered);
|
||||||
|
Task::none()
|
||||||
|
}
|
||||||
|
|
||||||
Message::CommandHistoryToggle => {
|
Message::CommandHistoryToggle => {
|
||||||
self.command_line.toggle_history();
|
self.command_line.toggle_history();
|
||||||
if !self.command_line.history_open {
|
if !self.command_line.history_open {
|
||||||
|
|||||||
+44
-11
@@ -194,6 +194,9 @@ pub struct CommandLine {
|
|||||||
/// COMMANDLINEOPACITY: how opaque the command line's panels are, in
|
/// COMMANDLINEOPACITY: how opaque the command line's panels are, in
|
||||||
/// percent (20–100, default 80), so the drawing shows through.
|
/// percent (20–100, default 80), so the drawing shows through.
|
||||||
opacity_percent: u8,
|
opacity_percent: u8,
|
||||||
|
/// Since when the pointer rests on the overlay history: lines still
|
||||||
|
/// showing then stay until it leaves, and fade from that moment.
|
||||||
|
hover_since: Option<Instant>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for CommandLine {
|
impl Default for CommandLine {
|
||||||
@@ -221,6 +224,7 @@ impl Default for CommandLine {
|
|||||||
cliprompt_lines: 3,
|
cliprompt_lines: 3,
|
||||||
fade_ms: DEFAULT_COMMANDLINE_FADE_MS,
|
fade_ms: DEFAULT_COMMANDLINE_FADE_MS,
|
||||||
opacity_percent: 80,
|
opacity_percent: 80,
|
||||||
|
hover_since: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -527,7 +531,32 @@ impl CommandLine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn entry_visible(&self, e: &HistoryEntry) -> bool {
|
fn entry_visible(&self, e: &HistoryEntry) -> bool {
|
||||||
e.pinned || self.fade_ms == 0 || e.created_at.elapsed().as_secs_f32() < self.fade_secs()
|
let held = self.hover_since.is_some_and(|since| {
|
||||||
|
since.saturating_duration_since(e.created_at).as_secs_f32() < self.fade_secs()
|
||||||
|
});
|
||||||
|
e.pinned
|
||||||
|
|| self.fade_ms == 0
|
||||||
|
|| held
|
||||||
|
|| e.created_at.elapsed().as_secs_f32() < self.fade_secs()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The pointer entered or left the overlay history. Leaving restarts the
|
||||||
|
/// fade of every line it held.
|
||||||
|
pub fn set_history_hover(&mut self, hovered: bool) {
|
||||||
|
if hovered {
|
||||||
|
self.hover_since.get_or_insert_with(Instant::now);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let Some(since) = self.hover_since.take() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let fade = self.fade_secs();
|
||||||
|
let now = Instant::now();
|
||||||
|
for entry in &mut self.history {
|
||||||
|
if since.saturating_duration_since(entry.created_at).as_secs_f32() < fade {
|
||||||
|
entry.created_at = now;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Height of the overlaid prompt lines currently shown above the input
|
/// Height of the overlaid prompt lines currently shown above the input
|
||||||
@@ -1144,16 +1173,20 @@ impl CommandLine {
|
|||||||
let recent_history: Element<'a, Message> = if self.history_open || !has_recent_history {
|
let recent_history: Element<'a, Message> = if self.history_open || !has_recent_history {
|
||||||
container(column![]).height(0).into()
|
container(column![]).height(0).into()
|
||||||
} else {
|
} else {
|
||||||
container(history_rows)
|
iced::widget::mouse_area(
|
||||||
.style(move |theme: &Theme| container::Style {
|
container(history_rows)
|
||||||
background: Some(Background::Color(
|
.style(move |theme: &Theme| container::Style {
|
||||||
theme.palette().background.base.color.scale_alpha(opacity),
|
background: Some(Background::Color(
|
||||||
)),
|
theme.palette().background.base.color.scale_alpha(opacity),
|
||||||
..Default::default()
|
)),
|
||||||
})
|
..Default::default()
|
||||||
.width(Length::Fill)
|
})
|
||||||
.padding([2, 0])
|
.width(Length::Fill)
|
||||||
.into()
|
.padding([2, 0]),
|
||||||
|
)
|
||||||
|
.on_enter(Message::CommandHistoryHover(true))
|
||||||
|
.on_exit(Message::CommandHistoryHover(false))
|
||||||
|
.into()
|
||||||
};
|
};
|
||||||
let history_divider: Element<'a, Message> = if self.history_open {
|
let history_divider: Element<'a, Message> = if self.history_open {
|
||||||
rule::horizontal(1).into()
|
rule::horizontal(1).into()
|
||||||
|
|||||||
Reference in new issue
Block a user