fix: Umbenennen und Löschen in der Notizbuchverwaltung reagieren (Issue #9)
Die Klickfläche zum Öffnen lag über der ganzen Zeile und wurde nach den Knöpfen angelegt; egui gibt Klicks dem zuletzt angelegten Element, die Knöpfe ✏ und 🗑 bekamen daher nie einen Klick. Jetzt öffnet nur der Titelbereich das Notizbuch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -3089,14 +3089,18 @@ pub fn render_ui(
|
|||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
let frame_resp = egui::Frame::none()
|
// Nur der Titelbereich öffnet das Notizbuch: Eine Klickfläche über der
|
||||||
|
// ganzen Zeile würde (als zuletzt angelegtes Element) die Klicks auf
|
||||||
|
// Umbenennen und Löschen abfangen
|
||||||
|
let mut open_clicked = false;
|
||||||
|
egui::Frame::none()
|
||||||
.fill(bg)
|
.fill(bg)
|
||||||
.stroke(border)
|
.stroke(border)
|
||||||
.rounding(egui::Rounding::same(8.0))
|
.rounding(egui::Rounding::same(8.0))
|
||||||
.inner_margin(egui::Margin::symmetric(10.0, 8.0))
|
.inner_margin(egui::Margin::symmetric(10.0, 8.0))
|
||||||
.show(ui, |ui| {
|
.show(ui, |ui| {
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
ui.vertical(|ui| {
|
let title_area = ui.vertical(|ui| {
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
ui.label(
|
ui.label(
|
||||||
egui::RichText::new(&summary.title)
|
egui::RichText::new(&summary.title)
|
||||||
@@ -3121,6 +3125,11 @@ pub fn render_ui(
|
|||||||
.color(egui::Color32::from_gray(160)),
|
.color(egui::Color32::from_gray(160)),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
open_clicked = title_area
|
||||||
|
.response
|
||||||
|
.interact(egui::Sense::click())
|
||||||
|
.on_hover_cursor(egui::CursorIcon::PointingHand)
|
||||||
|
.clicked();
|
||||||
|
|
||||||
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
||||||
if summary.status == crate::storage::NotebookStatus::Damaged {
|
if summary.status == crate::storage::NotebookStatus::Damaged {
|
||||||
@@ -3161,7 +3170,7 @@ pub fn render_ui(
|
|||||||
});
|
});
|
||||||
|
|
||||||
if summary.status != crate::storage::NotebookStatus::Damaged
|
if summary.status != crate::storage::NotebookStatus::Damaged
|
||||||
&& frame_resp.response.interact(egui::Sense::click()).clicked()
|
&& open_clicked
|
||||||
&& !is_current
|
&& !is_current
|
||||||
{
|
{
|
||||||
actions.push(UiAction::OpenNotebook(summary.id.clone()));
|
actions.push(UiAction::OpenNotebook(summary.id.clone()));
|
||||||
@@ -3969,6 +3978,81 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_notebook_rename_delete_and_open_are_clickable() {
|
||||||
|
let notebook = Notebook::new();
|
||||||
|
let fresh = || {
|
||||||
|
let mut state = UiState::new();
|
||||||
|
state.is_document_menu_open = true;
|
||||||
|
state.available_notebooks = ["default", "zweites"]
|
||||||
|
.iter()
|
||||||
|
.map(|id| NotebookSummary {
|
||||||
|
id: id.to_string(),
|
||||||
|
title: format!("Notizbuch {id}"),
|
||||||
|
page_count: 1,
|
||||||
|
modified_at: 0,
|
||||||
|
status: Default::default(),
|
||||||
|
error: None,
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
state
|
||||||
|
};
|
||||||
|
let mut probe = fresh();
|
||||||
|
render_frames(&mut probe, ¬ebook, 10);
|
||||||
|
let modal = probe.document_modal_rect.expect("Notizbuch-Dialog offen");
|
||||||
|
|
||||||
|
let updater = crate::updater::UpdaterController::new();
|
||||||
|
let (mut deleted, mut renamed, mut opened) = (false, false, false);
|
||||||
|
let mut y = modal.min.y + 4.0;
|
||||||
|
while y < modal.max.y && !(deleted && renamed && opened) {
|
||||||
|
let mut x = modal.min.x + 4.0;
|
||||||
|
while x < modal.max.x {
|
||||||
|
let mut state = fresh();
|
||||||
|
let ctx = render_frames(&mut state, ¬ebook, 3);
|
||||||
|
let pos = egui::pos2(x, y);
|
||||||
|
let mut actions = Vec::new();
|
||||||
|
for pressed in [true, false] {
|
||||||
|
ctx.begin_frame(egui::RawInput {
|
||||||
|
screen_rect: Some(egui::Rect::from_min_size(
|
||||||
|
egui::Pos2::ZERO,
|
||||||
|
egui::vec2(1280.0, 850.0),
|
||||||
|
)),
|
||||||
|
events: vec![
|
||||||
|
egui::Event::PointerMoved(pos),
|
||||||
|
egui::Event::PointerButton {
|
||||||
|
pos,
|
||||||
|
button: egui::PointerButton::Primary,
|
||||||
|
pressed,
|
||||||
|
modifiers: egui::Modifiers::default(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
..Default::default()
|
||||||
|
});
|
||||||
|
actions.extend(render_ui(
|
||||||
|
&ctx,
|
||||||
|
&mut state,
|
||||||
|
¬ebook,
|
||||||
|
AutosaveStatus::Saved,
|
||||||
|
&updater,
|
||||||
|
));
|
||||||
|
let _ = ctx.end_frame();
|
||||||
|
}
|
||||||
|
deleted |= actions
|
||||||
|
.iter()
|
||||||
|
.any(|a| matches!(a, UiAction::DeleteNotebook(_)));
|
||||||
|
opened |= actions
|
||||||
|
.iter()
|
||||||
|
.any(|a| matches!(a, UiAction::OpenNotebook(_)));
|
||||||
|
renamed |= state.renaming_notebook_id.is_some();
|
||||||
|
x += 8.0;
|
||||||
|
}
|
||||||
|
y += 6.0;
|
||||||
|
}
|
||||||
|
assert!(deleted, "Löschen-Knopf reagiert nicht");
|
||||||
|
assert!(renamed, "Umbenennen-Knopf reagiert nicht");
|
||||||
|
assert!(opened, "Titel öffnet das Notizbuch nicht");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_sidebar_buttons_react_to_raw_pointer_events() {
|
fn test_sidebar_buttons_react_to_raw_pointer_events() {
|
||||||
// Gleicher Weg wie die Stift-Eingabe: PointerMoved + PointerButton in die RawInput
|
// Gleicher Weg wie die Stift-Eingabe: PointerMoved + PointerButton in die RawInput
|
||||||
|
|||||||
Reference in New Issue
Block a user