From 191535d626ffd18d1da1e39308db15f6730843ba Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 20 Nov 2019 22:09:29 +0100 Subject: [PATCH] LibGUI: Make the GTableView column headers behave like proper buttons Previously they would resort based on the column immediately when you mousedown on them. Now we track the click event and show the header in a pressed state, etc. The usual button stuff :^) --- Libraries/LibGUI/GTableView.cpp | 55 +++++++++++++++++++++++++++------ Libraries/LibGUI/GTableView.h | 3 ++ 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/Libraries/LibGUI/GTableView.cpp b/Libraries/LibGUI/GTableView.cpp index 51981c5644..b6c4ecd104 100644 --- a/Libraries/LibGUI/GTableView.cpp +++ b/Libraries/LibGUI/GTableView.cpp @@ -151,7 +151,8 @@ void GTableView::mousedown_event(GMouseEvent& event) return; if (event.y() < header_height()) { - for (int i = 0; i < model()->column_count(); ++i) { + int column_count = model()->column_count(); + for (int i = 0; i < column_count; ++i) { if (column_resize_grabbable_rect(i).contains(event.position())) { m_resizing_column = i; m_in_column_resize = true; @@ -162,12 +163,9 @@ void GTableView::mousedown_event(GMouseEvent& event) auto header_rect = this->header_rect(i); auto column_metadata = model()->column_metadata(i); if (header_rect.contains(event.position()) && column_metadata.sortable == GModel::ColumnMetadata::Sortable::True) { - auto new_sort_order = GSortOrder::Ascending; - if (model()->key_column() == i) - new_sort_order = model()->sort_order() == GSortOrder::Ascending - ? GSortOrder::Descending - : GSortOrder::Ascending; - model()->set_key_column_and_sort_order(i, new_sort_order); + m_pressed_column_header_index = i; + m_pressed_column_header_is_pressed = true; + update_headers(); return; } } @@ -223,6 +221,20 @@ void GTableView::mousemove_event(GMouseEvent& event) return; } + if (m_pressed_column_header_index != -1) { + auto header_rect = this->header_rect(m_pressed_column_header_index); + if (header_rect.contains(event.position())) { + if (!m_pressed_column_header_is_pressed) + update_headers(); + m_pressed_column_header_is_pressed = true; + } else { + if (m_pressed_column_header_is_pressed) + update_headers(); + m_pressed_column_header_is_pressed = false; + } + return; + } + if (event.buttons() == 0) { for (int i = 0; i < model()->column_count(); ++i) { if (column_resize_grabbable_rect(i).contains(event.position())) { @@ -243,6 +255,20 @@ void GTableView::mouseup_event(GMouseEvent& event) window()->set_override_cursor(GStandardCursor::None); m_in_column_resize = false; } + if (m_pressed_column_header_index != -1) { + auto header_rect = this->header_rect(m_pressed_column_header_index); + if (header_rect.contains(event.position())) { + auto new_sort_order = GSortOrder::Ascending; + if (model()->key_column() == m_pressed_column_header_index) + new_sort_order = model()->sort_order() == GSortOrder::Ascending + ? GSortOrder::Descending + : GSortOrder::Ascending; + model()->set_key_column_and_sort_order(m_pressed_column_header_index, new_sort_order); + } + m_pressed_column_header_index = -1; + m_pressed_column_header_is_pressed = false; + update_headers(); + } } } @@ -347,13 +373,15 @@ void GTableView::paint_headers(Painter& painter) painter.draw_line({ 0, 0 }, { exposed_width - 1, 0 }, Color::White); painter.draw_line({ 0, header_height() - 1 }, { exposed_width - 1, header_height() - 1 }, Color::MidGray); int x_offset = 0; - for (int column_index = 0; column_index < model()->column_count(); ++column_index) { + int column_count = model()->column_count(); + for (int column_index = 0; column_index < column_count; ++column_index) { if (is_column_hidden(column_index)) continue; int column_width = this->column_width(column_index); bool is_key_column = model()->key_column() == column_index; Rect cell_rect(x_offset, 0, column_width + horizontal_padding() * 2, header_height()); - StylePainter::paint_button(painter, cell_rect, ButtonStyle::Normal, false); + bool pressed = column_index == m_pressed_column_header_index && m_pressed_column_header_is_pressed; + StylePainter::paint_button(painter, cell_rect, ButtonStyle::Normal, pressed); String text; if (is_key_column) { StringBuilder builder; @@ -368,6 +396,8 @@ void GTableView::paint_headers(Painter& painter) text = model()->column_name(column_index); } auto text_rect = cell_rect.translated(horizontal_padding(), 0); + if (pressed) + text_rect.move_by(1, 1); painter.draw_text(text_rect, text, header_font(), TextAlignment::CenterLeft, Color::Black); x_offset += column_width + horizontal_padding() * 2; } @@ -551,3 +581,10 @@ void GTableView::set_cell_painting_delegate(int column, OwnPtr m_header_context_menu;