From dd4bd0943aa9d131441722369ba07a99d77f89c0 Mon Sep 17 00:00:00 2001 From: AnotherTest Date: Thu, 27 Aug 2020 01:30:24 +0430 Subject: [PATCH] Spreadsheet: Track selections across sheet switches --- Applications/Spreadsheet/Spreadsheet.h | 5 +++-- Applications/Spreadsheet/SpreadsheetView.cpp | 22 ++++++++++++++++++++ Applications/Spreadsheet/SpreadsheetView.h | 3 +++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Applications/Spreadsheet/Spreadsheet.h b/Applications/Spreadsheet/Spreadsheet.h index 505525922c..c711624ce4 100644 --- a/Applications/Spreadsheet/Spreadsheet.h +++ b/Applications/Spreadsheet/Spreadsheet.h @@ -150,7 +150,8 @@ public: JsonObject gather_documentation() const; - Optional selected_cell() const { return m_selected_cell; } + const HashTable& selected_cells() const { return m_selected_cells; } + HashTable& selected_cells() { return m_selected_cells; } const HashMap>& cells() const { return m_cells; } HashMap>& cells() { return m_cells; } @@ -200,7 +201,7 @@ private: Vector m_columns; size_t m_rows { 0 }; HashMap> m_cells; - Optional m_selected_cell; // FIXME: Make this a collection. + HashTable m_selected_cells; Workbook& m_workbook; mutable SheetGlobalObject* m_global_object; diff --git a/Applications/Spreadsheet/SpreadsheetView.cpp b/Applications/Spreadsheet/SpreadsheetView.cpp index dbfee44263..ac63e61965 100644 --- a/Applications/Spreadsheet/SpreadsheetView.cpp +++ b/Applications/Spreadsheet/SpreadsheetView.cpp @@ -79,6 +79,12 @@ SpreadsheetView::SpreadsheetView(Sheet& sheet) }; m_table_view->on_selection_change = [&] { + m_sheet->selected_cells().clear(); + for (auto& index : m_table_view->selection().indexes()) { + Position position {m_sheet->column(index.column()), (size_t)index.row()}; + m_sheet->selected_cells().set(position); + } + if (m_table_view->selection().is_empty() && on_selection_dropped) return on_selection_dropped(); @@ -94,6 +100,22 @@ SpreadsheetView::SpreadsheetView(Sheet& sheet) }; } +void SpreadsheetView::hide_event(GUI::HideEvent&) +{ + if (on_selection_dropped) + on_selection_dropped(); +} + +void SpreadsheetView::show_event(GUI::ShowEvent&) +{ + if (on_selection_changed && !m_table_view->selection().is_empty()) { + auto selection = m_table_view->selection().first(); + Position position { m_sheet->column(selection.column()), (size_t)selection.row() }; + auto& cell = m_sheet->ensure(position); + on_selection_changed(position, cell); + } +} + void SpreadsheetView::TableCellPainter::paint(GUI::Painter& painter, const Gfx::IntRect& rect, const Gfx::Palette& palette, const GUI::ModelIndex& index) { // Draw a border. diff --git a/Applications/Spreadsheet/SpreadsheetView.h b/Applications/Spreadsheet/SpreadsheetView.h index 88192d5961..8760cae123 100644 --- a/Applications/Spreadsheet/SpreadsheetView.h +++ b/Applications/Spreadsheet/SpreadsheetView.h @@ -47,6 +47,9 @@ public: Function on_selection_dropped; private: + virtual void hide_event(GUI::HideEvent&) override; + virtual void show_event(GUI::ShowEvent&) override; + SpreadsheetView(Sheet&); class EditingDelegate : public GUI::StringModelEditingDelegate {