1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-16 10:34:58 +00:00

LibGUI: Allow expand/collapse subtrees in TreeView with Alt+Left/Right

This makes TreeView a lot more keyboard friendly.
This commit is contained in:
Andreas Kling 2020-05-21 13:36:08 +02:00
parent 63d98bbd76
commit 9d9a31384e
2 changed files with 46 additions and 0 deletions

View file

@ -109,6 +109,38 @@ void TreeView::doubleclick_event(MouseEvent& event)
}
}
void TreeView::set_open_state_of_all_in_subtree(const ModelIndex& root, bool open)
{
if (root.is_valid())
ensure_metadata_for_index(root).open = open;
int row_count = model()->row_count(root);
int column = model()->tree_column();
for (int row = 0; row < row_count; ++row) {
auto index = model()->index(row, column, root);
set_open_state_of_all_in_subtree(index, open);
}
}
void TreeView::expand_tree(const ModelIndex& root)
{
if (!model())
return;
set_open_state_of_all_in_subtree(root, true);
update_column_sizes();
update_content_size();
update();
}
void TreeView::collapse_tree(const ModelIndex& root)
{
if (!model())
return;
set_open_state_of_all_in_subtree(root, false);
update_column_sizes();
update_content_size();
update();
}
void TreeView::toggle_index(const ModelIndex& index)
{
ASSERT(model()->row_count(index));
@ -426,6 +458,11 @@ void TreeView::keydown_event(KeyEvent& event)
if (event.key() == KeyCode::Key_Left) {
if (cursor_index.is_valid() && model()->row_count(cursor_index)) {
if (event.alt()) {
collapse_tree(cursor_index);
return;
}
auto& metadata = ensure_metadata_for_index(cursor_index);
if (metadata.open) {
open_tree_node(false, metadata);
@ -441,6 +478,11 @@ void TreeView::keydown_event(KeyEvent& event)
if (event.key() == KeyCode::Key_Right) {
if (cursor_index.is_valid() && model()->row_count(cursor_index)) {
if (event.alt()) {
expand_tree(cursor_index);
return;
}
auto& metadata = ensure_metadata_for_index(cursor_index);
if (!metadata.open) {
open_tree_node(true, metadata);