From 12cf3e13c0fd7a1b68251d605d5a29d1e77e2526 Mon Sep 17 00:00:00 2001 From: AnotherTest Date: Mon, 24 Aug 2020 19:51:25 +0430 Subject: [PATCH] Spreadsheet: Add a topbar with a text editor --- Applications/Spreadsheet/Spreadsheet.cpp | 1 + Applications/Spreadsheet/SpreadsheetView.cpp | 14 +++++ Applications/Spreadsheet/SpreadsheetView.h | 4 ++ .../Spreadsheet/SpreadsheetWidget.cpp | 56 ++++++++++++++++++- Applications/Spreadsheet/SpreadsheetWidget.h | 1 + 5 files changed, 74 insertions(+), 2 deletions(-) diff --git a/Applications/Spreadsheet/Spreadsheet.cpp b/Applications/Spreadsheet/Spreadsheet.cpp index 40c92ac3411..e38c34564bb 100644 --- a/Applications/Spreadsheet/Spreadsheet.cpp +++ b/Applications/Spreadsheet/Spreadsheet.cpp @@ -208,6 +208,7 @@ JS::Value Sheet::evaluate(const StringView& source, Cell* on_behalf_of) void Cell::update_data() { + dbg() << "Update cell " << this << ", dirty=" << dirty; TemporaryChange cell_change { sheet->current_evaluated_cell(), this }; if (!dirty) return; diff --git a/Applications/Spreadsheet/SpreadsheetView.cpp b/Applications/Spreadsheet/SpreadsheetView.cpp index 42ac1422a7e..6c042127233 100644 --- a/Applications/Spreadsheet/SpreadsheetView.cpp +++ b/Applications/Spreadsheet/SpreadsheetView.cpp @@ -71,6 +71,20 @@ SpreadsheetView::SpreadsheetView(Sheet& sheet) m_table_view->aid_create_editing_delegate = [&](auto&) { return make(*m_sheet); }; + + m_table_view->on_selection_change = [&] { + if (m_table_view->selection().is_empty() && on_selection_dropped) + return on_selection_dropped(); + + auto selection = m_table_view->selection().first(); + Position position { m_sheet->column(selection.column() - 1), (size_t)selection.row() }; + auto& cell = m_sheet->ensure(position); + if (on_selection_changed) + on_selection_changed(position, cell); + + m_table_view->model()->update(); + m_table_view->update(); + }; } void SpreadsheetView::TableCellPainter::paint(GUI::Painter& painter, const Gfx::IntRect& rect, const Gfx::Palette& palette, const GUI::ModelIndex& index) diff --git a/Applications/Spreadsheet/SpreadsheetView.h b/Applications/Spreadsheet/SpreadsheetView.h index eecfe67bb34..88192d59613 100644 --- a/Applications/Spreadsheet/SpreadsheetView.h +++ b/Applications/Spreadsheet/SpreadsheetView.h @@ -41,6 +41,10 @@ public: ~SpreadsheetView(); const Sheet& sheet() const { return *m_sheet; } + Sheet& sheet() { return *m_sheet; } + + Function on_selection_changed; + Function on_selection_dropped; private: SpreadsheetView(Sheet&); diff --git a/Applications/Spreadsheet/SpreadsheetWidget.cpp b/Applications/Spreadsheet/SpreadsheetWidget.cpp index da1cc3bae1e..64759054e05 100644 --- a/Applications/Spreadsheet/SpreadsheetWidget.cpp +++ b/Applications/Spreadsheet/SpreadsheetWidget.cpp @@ -30,8 +30,11 @@ #include #include #include +#include #include +#include #include +#include #include namespace Spreadsheet { @@ -40,11 +43,60 @@ SpreadsheetWidget::SpreadsheetWidget() { set_fill_with_background_color(true); set_layout().set_margins({ 2, 2, 2, 2 }); - m_tab_widget = add(); + auto& container = add(); + + auto& top_bar = container.add(); + top_bar.set_layout().set_spacing(1); + top_bar.set_preferred_size(0, 50); + top_bar.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed); + auto& current_cell_label = top_bar.add(""); + current_cell_label.set_preferred_size(50, 0); + current_cell_label.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill); + auto& cell_value_editor = top_bar.add(GUI::TextEditor::Type::SingleLine); + cell_value_editor.set_scrollbars_enabled(false); + + cell_value_editor.set_enabled(false); + current_cell_label.set_enabled(false); + + m_tab_widget = container.add(); m_tab_widget->set_tab_position(GUI::TabWidget::TabPosition::Bottom); m_sheets.append(Sheet::construct("Sheet 1")); - m_tab_widget->add_tab(m_sheets.first().name(), m_sheets.first()); + auto& tab = m_tab_widget->add_tab(m_sheets.first().name(), m_sheets.first()); + + auto change = [&](auto& selected_widget) { + if (m_selected_view) { + m_selected_view->on_selection_changed = nullptr; + m_selected_view->on_selection_dropped = nullptr; + }; + m_selected_view = &static_cast(selected_widget); + m_selected_view->on_selection_changed = [&](const Position& position, Cell& cell) { + StringBuilder builder; + builder.append(position.column); + builder.appendf("%zu", position.row); + current_cell_label.set_enabled(true); + current_cell_label.set_text(builder.string_view()); + + cell_value_editor.on_change = nullptr; + cell_value_editor.set_text(cell.source()); + cell_value_editor.on_change = [&] { + cell.set_data(cell_value_editor.text()); + m_selected_view->sheet().update(); + }; + cell_value_editor.set_enabled(true); + }; + m_selected_view->on_selection_dropped = [&]() { + cell_value_editor.set_enabled(false); + cell_value_editor.set_text(""); + current_cell_label.set_enabled(false); + current_cell_label.set_text(""); + }; + }; + + change(tab); + m_tab_widget->on_change = [change = move(change)](auto& selected_widget) { + change(selected_widget); + }; } SpreadsheetWidget::~SpreadsheetWidget() diff --git a/Applications/Spreadsheet/SpreadsheetWidget.h b/Applications/Spreadsheet/SpreadsheetWidget.h index aa14c0a8e2c..22c27308832 100644 --- a/Applications/Spreadsheet/SpreadsheetWidget.h +++ b/Applications/Spreadsheet/SpreadsheetWidget.h @@ -44,6 +44,7 @@ private: SpreadsheetWidget(); NonnullRefPtrVector m_sheets; + SpreadsheetView* m_selected_view { nullptr }; RefPtr m_tab_widget; };