Skip to content

Commit 1061d60

Browse files
committed
Fix events handling when focusing cell
1 parent 0a95016 commit 1061d60

File tree

2 files changed

+132
-122
lines changed

2 files changed

+132
-122
lines changed

src/array_table.rs

Lines changed: 95 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1588,89 +1588,90 @@ impl<'array> ArrayTable<'array> {
15881588
if i.consume_shortcut(&SHORTCUT_REPLACE) {
15891589
self.open_replace_panel(None);
15901590
}
1591-
let hovered_cell = array_response.hover_data.hovered_cell;
1592-
for event in i.events.iter().filter(|e| match e {
1593-
egui::Event::Copy => hovered_cell.is_some(),
1594-
egui::Event::Paste(_) => hovered_cell.is_some(),
1591+
1592+
}
1593+
let hovered_cell = array_response.hover_data.hovered_cell;
1594+
for event in i.events.iter().filter(|e| match e {
1595+
egui::Event::Copy => hovered_cell.is_some(),
1596+
egui::Event::Paste(_) => hovered_cell.is_some(),
1597+
egui::Event::Key {
1598+
key: Key::Delete, ..
1599+
} => hovered_cell.is_some(),
1600+
_ => false,
1601+
}) {
1602+
let cell_location = hovered_cell.unwrap();
1603+
let row_index = self.filtered_nodes[cell_location.row_index];
1604+
let index = self.get_pointer_index_from_cache(
1605+
cell_location.is_pinned_column_table,
1606+
&&self.nodes[row_index],
1607+
cell_location.column_index,
1608+
);
1609+
1610+
match event {
15951611
egui::Event::Key {
15961612
key: Key::Delete, ..
1597-
} => hovered_cell.is_some(),
1598-
_ => false,
1599-
}) {
1600-
let cell_location = hovered_cell.unwrap();
1601-
let row_index = self.filtered_nodes[cell_location.row_index];
1602-
let index = self.get_pointer_index_from_cache(
1603-
cell_location.is_pinned_column_table,
1604-
&&self.nodes[row_index],
1605-
cell_location.column_index,
1606-
);
1607-
1608-
match event {
1609-
egui::Event::Key {
1610-
key: Key::Delete, ..
1611-
} => {
1612-
let columns = self.columns(cell_location.is_pinned_column_table);
1613-
let pointer = Self::pointer_key(
1614-
&self.parent_pointer.pointer,
1615-
row_index,
1616-
columns
1617-
.get(cell_location.column_index)
1618-
.as_ref()
1619-
.unwrap()
1620-
.name
1621-
.as_str(),
1622-
);
1623-
let flat_json_value = FlatJsonValue::<String> {
1624-
pointer: PointerKey {
1625-
pointer,
1626-
value_type: columns[cell_location.column_index].value_type,
1627-
depth: columns[cell_location.column_index].depth,
1628-
position: 0,
1629-
column_id: columns[cell_location.column_index].id,
1630-
},
1631-
value: None,
1632-
};
1633-
self.update_value(flat_json_value, row_index, !self.is_sub_table);
1634-
}
1635-
egui::Event::Paste(v) => {
1636-
let columns = self.columns(cell_location.is_pinned_column_table);
1637-
let pointer = Self::pointer_key(
1638-
&self.parent_pointer.pointer,
1639-
row_index,
1640-
&columns
1641-
.get(cell_location.column_index)
1642-
.as_ref()
1643-
.unwrap()
1644-
.name,
1645-
);
1646-
let mut flat_json_value = FlatJsonValue::<String> {
1647-
pointer: PointerKey {
1648-
pointer,
1649-
value_type: columns[cell_location.column_index].value_type,
1650-
depth: columns[cell_location.column_index].depth,
1651-
position: 0,
1652-
column_id: columns[cell_location.column_index].id,
1653-
},
1654-
value: Some(v.clone()),
1655-
};
1656-
match flat_json_value.pointer.value_type {
1657-
// When we paste an object it should not be considered as parsed
1658-
ValueType::Object(..) => {
1659-
flat_json_value.pointer.value_type = ValueType::Object(false, 0)
1660-
}
1661-
_ => {}
1613+
} => {
1614+
let columns = self.columns(cell_location.is_pinned_column_table);
1615+
let pointer = Self::pointer_key(
1616+
&self.parent_pointer.pointer,
1617+
row_index,
1618+
columns
1619+
.get(cell_location.column_index)
1620+
.as_ref()
1621+
.unwrap()
1622+
.name
1623+
.as_str(),
1624+
);
1625+
let flat_json_value = FlatJsonValue::<String> {
1626+
pointer: PointerKey {
1627+
pointer,
1628+
value_type: columns[cell_location.column_index].value_type,
1629+
depth: columns[cell_location.column_index].depth,
1630+
position: 0,
1631+
column_id: columns[cell_location.column_index].id,
1632+
},
1633+
value: None,
1634+
};
1635+
self.update_value(flat_json_value, row_index, !self.is_sub_table);
1636+
}
1637+
egui::Event::Paste(v) => {
1638+
let columns = self.columns(cell_location.is_pinned_column_table);
1639+
let pointer = Self::pointer_key(
1640+
&self.parent_pointer.pointer,
1641+
row_index,
1642+
&columns
1643+
.get(cell_location.column_index)
1644+
.as_ref()
1645+
.unwrap()
1646+
.name,
1647+
);
1648+
let mut flat_json_value = FlatJsonValue::<String> {
1649+
pointer: PointerKey {
1650+
pointer,
1651+
value_type: columns[cell_location.column_index].value_type,
1652+
depth: columns[cell_location.column_index].depth,
1653+
position: 0,
1654+
column_id: columns[cell_location.column_index].id,
1655+
},
1656+
value: Some(v.clone()),
1657+
};
1658+
match flat_json_value.pointer.value_type {
1659+
// When we paste an object it should not be considered as parsed
1660+
ValueType::Object(..) => {
1661+
flat_json_value.pointer.value_type = ValueType::Object(false, 0)
16621662
}
1663-
self.edit_cell(array_response, flat_json_value, row_index);
1663+
_ => {}
16641664
}
1665-
egui::Event::Copy => {
1666-
if let Some(index) = index {
1667-
if let Some(value) = &self.nodes[row_index].entries()[index].value {
1668-
copied_value = Some(value.clone());
1669-
}
1665+
self.edit_cell(array_response, flat_json_value, row_index);
1666+
}
1667+
egui::Event::Copy => {
1668+
if let Some(index) = index {
1669+
if let Some(value) = &self.nodes[row_index].entries()[index].value {
1670+
copied_value = Some(value.clone());
16701671
}
16711672
}
1672-
_ => {}
16731673
}
1674+
_ => {}
16741675
}
16751676
}
16761677
});
@@ -1681,22 +1682,30 @@ impl<'array> ArrayTable<'array> {
16811682

16821683
pub fn get_typed_alphanum_from_events(i: &mut InputState) -> Option<String> {
16831684
let mut typed_alphanum: Option<String> = None;
1684-
i.events.iter().any(|e| match e {
1685-
egui::Event::Key { key, modifiers, .. } if matches!(
1685+
i.events.retain(|e| {
1686+
match e {
1687+
egui::Event::Key { key, modifiers, .. } if matches!(
16861688
key,
16871689
Key::A | Key::B | Key::C | Key::D | Key::E | Key::F | Key::G | Key::H
16881690
| Key::I | Key::J | Key::K | Key::L | Key::M | Key::N | Key::O | Key::P | Key::Q | Key::R | Key::S
16891691
| Key::T | Key::U | Key::V | Key::W | Key::X | Key::Y | Key::Z
16901692
| Key::Num0 | Key::Num1 | Key::Num2 | Key::Num3 | Key::Num4 | Key::Num5 | Key::Num6 | Key::Num7 | Key::Num8 | Key::Num9
16911693
) => {
1692-
let mut typed_char = key.name().to_string();
1693-
if !matches!(modifiers, &Modifiers::SHIFT) {
1694-
typed_char = typed_char.to_lowercase();
1695-
}
1696-
typed_alphanum = Some(typed_char);
1697-
true
1698-
},
1699-
_ => false
1694+
1695+
if modifiers.ctrl || modifiers.command || modifiers.alt || modifiers.mac_cmd {
1696+
typed_alphanum = None;
1697+
return true;
1698+
} else {
1699+
let mut typed_char = key.name().to_string();
1700+
if !matches!(modifiers, &Modifiers::SHIFT) {
1701+
typed_char = typed_char.to_lowercase();
1702+
}
1703+
typed_alphanum = Some(typed_char);
1704+
}
1705+
false
1706+
},
1707+
_ => true
1708+
}
17001709
});
17011710
typed_alphanum
17021711
}

src/object_table.rs

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -316,45 +316,46 @@ impl ObjectTable {
316316
modifiers: Default::default(),
317317
})
318318
}
319-
for event in i.events.iter().filter(|e| match e {
320-
egui::Event::Copy => has_hovered_cell,
321-
egui::Event::Paste(_) => has_hovered_cell,
322-
egui::Event::Key {
323-
key: Key::Delete, ..
324-
} => has_hovered_cell,
325-
_ => false,
326-
}) {
327-
let cell_location = array_response.hover_data.hovered_cell.unwrap();
328-
let row_index = self.filtered_nodes[cell_location.row_index];
329319

330-
let is_value_column = cell_location.column_index == 1;
331-
if is_value_column {
332-
match event {
333-
egui::Event::Key {
334-
key: Key::Delete, ..
335-
} => {
336-
self.update_value(
337-
array_response,
338-
self.nodes[row_index].pointer.clone(),
339-
"".to_string(),
340-
row_index,
341-
);
342-
}
343-
egui::Event::Paste(v) => {
344-
self.update_value(
345-
array_response,
346-
self.nodes[row_index].pointer.clone(),
347-
v.clone(),
348-
row_index,
349-
);
350-
}
351-
egui::Event::Copy => {
352-
if let Some(value) = &self.nodes[row_index].value {
353-
copied_value = Some(value.clone());
354-
}
320+
}
321+
for event in i.events.iter().filter(|e| match e {
322+
egui::Event::Copy => has_hovered_cell,
323+
egui::Event::Paste(_) => has_hovered_cell,
324+
egui::Event::Key {
325+
key: Key::Delete, ..
326+
} => has_hovered_cell,
327+
_ => false,
328+
}) {
329+
let cell_location = array_response.hover_data.hovered_cell.unwrap();
330+
let row_index = self.filtered_nodes[cell_location.row_index];
331+
332+
let is_value_column = cell_location.column_index == 1;
333+
if is_value_column {
334+
match event {
335+
egui::Event::Key {
336+
key: Key::Delete, ..
337+
} => {
338+
self.update_value(
339+
array_response,
340+
self.nodes[row_index].pointer.clone(),
341+
"".to_string(),
342+
row_index,
343+
);
344+
}
345+
egui::Event::Paste(v) => {
346+
self.update_value(
347+
array_response,
348+
self.nodes[row_index].pointer.clone(),
349+
v.clone(),
350+
row_index,
351+
);
352+
}
353+
egui::Event::Copy => {
354+
if let Some(value) = &self.nodes[row_index].value {
355+
copied_value = Some(value.clone());
355356
}
356-
_ => {}
357357
}
358+
_ => {}
358359
}
359360
}
360361
}

0 commit comments

Comments
 (0)