1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-25 18:55:08 +00:00

Spreadsheet: Implement drag-to-select

To initiate drag-to-select, the user can move the mouse to near the edge
of a cell, and click-and-drag when the cursor changes to a crosshair.
Fixes #4167.
This commit is contained in:
AnotherTest 2020-11-30 10:02:20 +03:30 committed by Andreas Kling
parent b2d698472b
commit c1276559ba
2 changed files with 55 additions and 0 deletions

View file

@ -79,6 +79,56 @@ void InfinitelyScrollableTableView::did_scroll()
}
}
void InfinitelyScrollableTableView::mousemove_event(GUI::MouseEvent& event)
{
if (auto model = this->model()) {
auto index = index_at_event_position(event.position());
if (!index.is_valid())
return;
auto holding_left_button = !!(event.buttons() & GUI::MouseButton::Left);
auto rect = content_rect(index);
auto distance = rect.center().absolute_relative_distance_to(event.position());
if (distance.x() > rect.width() / 2 || distance.y() > rect.height() / 2) {
set_override_cursor(Gfx::StandardCursor::Crosshair);
if (!holding_left_button) {
m_starting_selection_index = index;
} else {
m_should_intercept_drag = true;
m_might_drag = false;
}
} else if (!m_should_intercept_drag) {
set_override_cursor(Gfx::StandardCursor::Arrow);
}
if (holding_left_button && m_should_intercept_drag) {
if (!m_starting_selection_index.is_valid())
m_starting_selection_index = index;
Vector<GUI::ModelIndex> new_selection;
for (auto i = min(m_starting_selection_index.row(), index.row()), imax = max(m_starting_selection_index.row(), index.row()); i <= imax; ++i) {
for (auto j = min(m_starting_selection_index.column(), index.column()), jmax = max(m_starting_selection_index.column(), index.column()); j <= jmax; ++j) {
auto index = model->index(i, j);
if (index.is_valid())
new_selection.append(move(index));
}
}
if (!event.ctrl())
selection().clear();
selection().add_all(new_selection);
}
}
TableView::mousemove_event(event);
}
void InfinitelyScrollableTableView::mouseup_event(GUI::MouseEvent& event)
{
m_should_intercept_drag = false;
TableView::mouseup_event(event);
}
void SpreadsheetView::update_with_model()
{
m_table_view->model()->update();