diff --git a/apps/calculation/history_controller.cpp b/apps/calculation/history_controller.cpp index 09646012d..85d931104 100644 --- a/apps/calculation/history_controller.cpp +++ b/apps/calculation/history_controller.cpp @@ -96,7 +96,7 @@ bool HistoryController::handleEvent(Ion::Events::Event event) { app()->setFirstResponder(editController); return true; } - if (event == Ion::Events::Copy) { + if (event == Ion::Events::Copy || event == Ion::Events::Cut) { HistoryViewCell * selectedCell = (HistoryViewCell *)selectableTableView()->selectedCell(); HistoryViewCell::SubviewType subviewType = selectedCell->selectedSubviewType(); int focusRow = selectedRow(); diff --git a/apps/code/console_controller.cpp b/apps/code/console_controller.cpp index 0bc922854..3505b69cb 100644 --- a/apps/code/console_controller.cpp +++ b/apps/code/console_controller.cpp @@ -153,8 +153,6 @@ bool ConsoleController::handleEvent(Ion::Events::Event event) { app()->setFirstResponder(&m_editCell); return m_editCell.insertText(text); } - } else if (event == Ion::Events::Copy) { - return copyCurrentLineToClipboard(); } else if (event == Ion::Events::Clear) { m_selectableTableView.deselectTable(); m_consoleStore.clear(); @@ -392,13 +390,4 @@ StackViewController * ConsoleController::stackViewController() { return static_cast(parentResponder()); } -bool ConsoleController::copyCurrentLineToClipboard() { - int row = m_selectableTableView.selectedRow(); - if (row < m_consoleStore.numberOfLines()) { - Clipboard::sharedClipboard()->store(m_consoleStore.lineAtIndex(row).text()); - return true; - } - return false; -} - } diff --git a/apps/code/console_controller.h b/apps/code/console_controller.h index 0ec6bd690..525ffc038 100644 --- a/apps/code/console_controller.h +++ b/apps/code/console_controller.h @@ -88,7 +88,6 @@ private: void emptyOutputAccumulationBuffer(); size_t firstNewLineCharIndex(const char * text, size_t length); StackViewController * stackViewController(); - bool copyCurrentLineToClipboard(); int m_rowHeight; bool m_importScriptsWhenViewAppears; ConsoleStore m_consoleStore; diff --git a/apps/code/console_edit_cell.h b/apps/code/console_edit_cell.h index 921e1d7c3..536be0b43 100644 --- a/apps/code/console_edit_cell.h +++ b/apps/code/console_edit_cell.h @@ -28,7 +28,7 @@ public: // Edit cell void setEditing(bool isEditing, bool reinitDraftBuffer = false); - const char * text() const { return m_textField.text(); } + const char * text() const override { return m_textField.text(); } void setText(const char * text); bool insertText(const char * text); void setPrompt(const char * prompt); diff --git a/apps/code/console_line_cell.h b/apps/code/console_line_cell.h index 80efdacbe..e192e82cc 100644 --- a/apps/code/console_line_cell.h +++ b/apps/code/console_line_cell.h @@ -24,7 +24,9 @@ public: Responder * responder() override { return this; } - + const char * text() const override { + return m_line.text(); + } /* View */ int numberOfSubviews() const override; View * subviewAtIndex(int index) override; diff --git a/apps/code/script_node_cell.h b/apps/code/script_node_cell.h index 4cc32f9ea..b885b92ac 100644 --- a/apps/code/script_node_cell.h +++ b/apps/code/script_node_cell.h @@ -21,6 +21,7 @@ public: /* HighlightCell */ void setHighlighted(bool highlight) override; void reloadCell() override; + const char * text() const override { return m_scriptNodeView.text(); } constexpr static char k_parentheses[] = "()"; constexpr static char k_parenthesesWithEmpty[] = {'(', Ion::Charset::Empty, ')', 0}; @@ -32,6 +33,9 @@ protected: void setScriptStore(ScriptStore * scriptStore); void drawRect(KDContext * ctx, KDRect rect) const override; virtual KDSize minimalSizeForOptimalDisplay() const override; + const char * text() const override { + return m_scriptStore->scriptAtIndex(m_scriptNode->scriptIndex()).name(); + } private: constexpr static KDText::FontSize k_fontSize = KDText::FontSize::Small; constexpr static KDCoordinate k_verticalMargin = 7; diff --git a/apps/graph/function_title_cell.h b/apps/graph/function_title_cell.h index 6d10b179a..bbc9142a9 100644 --- a/apps/graph/function_title_cell.h +++ b/apps/graph/function_title_cell.h @@ -12,10 +12,13 @@ public: void setHighlighted(bool highlight) override; void setColor(KDColor color) override; void setText(const char * textContent); + const char * text() const override { + return m_bufferTextView.text(); + } +private: int numberOfSubviews() const override; View * subviewAtIndex(int index) override; void layoutSubviews() override; -private: EvenOddBufferTextCell m_bufferTextView; }; diff --git a/apps/probability/calculation_cell.h b/apps/probability/calculation_cell.h index fbb8e00bc..26178b562 100644 --- a/apps/probability/calculation_cell.h +++ b/apps/probability/calculation_cell.h @@ -15,6 +15,9 @@ public: void drawRect(KDContext * ctx, KDRect rect) const override; EditableTextCell * editableTextCell(); MessageTextView * messageTextView(); + const char * text() const override { + return m_calculation.text(); + } private: constexpr static KDCoordinate k_margin = 5; constexpr static KDCoordinate k_minTextFieldWidth = 4*KDText::charSize().width()+TextCursorView::k_width; diff --git a/apps/probability/calculation_controller.cpp b/apps/probability/calculation_controller.cpp index 9146e3612..e76addfee 100644 --- a/apps/probability/calculation_controller.cpp +++ b/apps/probability/calculation_controller.cpp @@ -88,15 +88,6 @@ void CalculationController::didBecomeFirstResponder() { app()->setFirstResponder(&m_selectableTableView); } -bool CalculationController::handleEvent(Ion::Events::Event event) { - if (event == Ion::Events::Copy && selectedColumn() > 0) { - CalculationCell * myCell = static_cast(m_selectableTableView.selectedCell()); - Clipboard::sharedClipboard()->store(myCell->editableTextCell()->textField()->text()); - return true; - } - return false; -} - View * CalculationController::view() { return &m_contentView; } diff --git a/apps/probability/calculation_controller.h b/apps/probability/calculation_controller.h index 7691f0444..6f2db3bc7 100644 --- a/apps/probability/calculation_controller.h +++ b/apps/probability/calculation_controller.h @@ -17,7 +17,6 @@ public: /* Responder */ void didEnterResponderChain(Responder * previousResponder) override; void didBecomeFirstResponder() override; - bool handleEvent(Ion::Events::Event event) override; /* ViewController */ View * view() override; diff --git a/apps/regression/calculation_controller.cpp b/apps/regression/calculation_controller.cpp index 00a7efa23..d8b774acd 100644 --- a/apps/regression/calculation_controller.cpp +++ b/apps/regression/calculation_controller.cpp @@ -42,20 +42,6 @@ bool CalculationController::handleEvent(Ion::Events::Event event) { app()->setFirstResponder(tabController()); return true; } - if (event == Ion::Events::Copy && selectedColumn() == 1 && selectedRow() > 0) { - if (selectedRow() <= k_totalNumberOfDoubleBufferRows) { - EvenOddDoubleBufferTextCell * myCell = (EvenOddDoubleBufferTextCell *)selectableTableView()->selectedCell(); - if (myCell->firstTextSelected()) { - Clipboard::sharedClipboard()->store(myCell->firstText()); - } else { - Clipboard::sharedClipboard()->store(myCell->secondText()); - } - } else { - EvenOddBufferTextCell * myCell = (EvenOddBufferTextCell *)selectableTableView()->selectedCell(); - Clipboard::sharedClipboard()->store(myCell->text()); - } - return true; - } return false; } diff --git a/apps/regression/even_odd_double_buffer_text_cell.cpp b/apps/regression/even_odd_double_buffer_text_cell.cpp index 84776c85c..dd31169b0 100644 --- a/apps/regression/even_odd_double_buffer_text_cell.cpp +++ b/apps/regression/even_odd_double_buffer_text_cell.cpp @@ -48,6 +48,14 @@ void EvenOddDoubleBufferTextCell::setHighlighted(bool highlight) { reloadCell(); } +const char * EvenOddDoubleBufferTextCell::text() const { + if (m_firstTextSelected) { + return m_firstBufferTextView.text(); + } else { + return m_secondBufferTextView.text(); + } +} + void EvenOddDoubleBufferTextCell::setEven(bool even) { m_firstBufferTextView.setEven(even); m_secondBufferTextView.setEven(even); diff --git a/apps/regression/even_odd_double_buffer_text_cell.h b/apps/regression/even_odd_double_buffer_text_cell.h index b3e8b6b2d..8e612e05d 100644 --- a/apps/regression/even_odd_double_buffer_text_cell.h +++ b/apps/regression/even_odd_double_buffer_text_cell.h @@ -13,6 +13,7 @@ public: Responder * responder() override { return this; } + const char * text() const override; void setEven(bool even) override; bool firstTextSelected(); void selectFirstText(bool selectFirstText); diff --git a/apps/sequence/sequence_title_cell.cpp b/apps/sequence/sequence_title_cell.cpp index b3371e88d..20ae8c3f4 100644 --- a/apps/sequence/sequence_title_cell.cpp +++ b/apps/sequence/sequence_title_cell.cpp @@ -13,7 +13,10 @@ SequenceTitleCell::SequenceTitleCell(Orientation orientation) : } void SequenceTitleCell::setExpressionLayout(Poincare::ExpressionLayout * expressionLayout) { - m_titleTextView.setExpressionLayout(expressionLayout); + if (expressionLayout) { + m_titleTextView.setExpressionLayout(expressionLayout); + expressionLayout->writeTextInBuffer(m_storedText, k_maxStoredTextSize); + } } void SequenceTitleCell::setHighlighted(bool highlight) { diff --git a/apps/sequence/sequence_title_cell.h b/apps/sequence/sequence_title_cell.h index 1fe659c07..4c3ed901f 100644 --- a/apps/sequence/sequence_title_cell.h +++ b/apps/sequence/sequence_title_cell.h @@ -12,11 +12,16 @@ public: void setEven(bool even) override; void setHighlighted(bool highlight) override; void setColor(KDColor color) override; + const char * text() const override { + return m_storedText; + } +private: int numberOfSubviews() const override; View * subviewAtIndex(int index) override; void layoutSubviews() override; -private: EvenOddExpressionCell m_titleTextView; + constexpr static int k_maxStoredTextSize = 8; // Worst case u_{n+1} + char m_storedText[k_maxStoredTextSize]; }; } diff --git a/apps/shared/expression_model_list_controller.cpp b/apps/shared/expression_model_list_controller.cpp index cb09deb82..c05cb2a0e 100644 --- a/apps/shared/expression_model_list_controller.cpp +++ b/apps/shared/expression_model_list_controller.cpp @@ -87,7 +87,7 @@ bool ExpressionModelListController::handleEventOnExpression(Ion::Events::Event e editExpression(model, event); return true; } - if (event == Ion::Events::Copy && !isAddEmptyRow(selectedRow())) { + if ((event == Ion::Events::Copy || event == Ion::Events::Cut) && !isAddEmptyRow(selectedRow())) { Clipboard::sharedClipboard()->store(textForRow(selectedRow())); return true; } diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index 4e29b6b51..71ddd028f 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -85,11 +85,6 @@ bool ValuesController::handleEvent(Ion::Events::Event event) { if (selectedRow() == -1) { return header()->handleEvent(event); } - if (event == Ion::Events::Copy && selectedRow() > 0 && selectedColumn() > 0) { - EvenOddBufferTextCell * cell = (EvenOddBufferTextCell *)selectableTableView()->selectedCell(); - Clipboard::sharedClipboard()->store(cell->text()); - return true; - } return false; } diff --git a/apps/statistics/calculation_controller.cpp b/apps/statistics/calculation_controller.cpp index d65b771b6..9c499e33b 100644 --- a/apps/statistics/calculation_controller.cpp +++ b/apps/statistics/calculation_controller.cpp @@ -29,11 +29,6 @@ bool CalculationController::handleEvent(Ion::Events::Event event) { app()->setFirstResponder(tabController()); return true; } - if (event == Ion::Events::Copy && selectedColumn() == 1) { - EvenOddBufferTextCell * myCell = (EvenOddBufferTextCell *)selectableTableView()->selectedCell(); - Clipboard::sharedClipboard()->store(myCell->text()); - return true; - } return false; } diff --git a/apps/variable_box_leaf_cell.h b/apps/variable_box_leaf_cell.h index 9ec1d56a0..dcff304ef 100644 --- a/apps/variable_box_leaf_cell.h +++ b/apps/variable_box_leaf_cell.h @@ -13,6 +13,9 @@ public: void setSubtitle(const char * text); void setExpressionLayout(Poincare::ExpressionLayout * expressionLayout); void drawRect(KDContext * ctx, KDRect rect) const override; + const char * text() const override { + return m_labelView.text(); + } private: constexpr static KDCoordinate k_separatorThickness = 1; constexpr static KDCoordinate k_widthMargin = 10; diff --git a/escher/include/escher/editable_text_cell.h b/escher/include/escher/editable_text_cell.h index 33f1009b9..6b9141565 100644 --- a/escher/include/escher/editable_text_cell.h +++ b/escher/include/escher/editable_text_cell.h @@ -16,6 +16,12 @@ public: Responder * responder() override { return this; } + const char * text() const override { + if (!m_textField.isEditing()) { + return m_textField.text(); + } + return nullptr; + } int numberOfSubviews() const override; View * subviewAtIndex(int index) override; void layoutSubviews() override; diff --git a/escher/include/escher/even_odd_buffer_text_cell.h b/escher/include/escher/even_odd_buffer_text_cell.h index 610fe3787..2b7ddfaa0 100644 --- a/escher/include/escher/even_odd_buffer_text_cell.h +++ b/escher/include/escher/even_odd_buffer_text_cell.h @@ -7,7 +7,7 @@ class EvenOddBufferTextCell : public EvenOddCell { public: EvenOddBufferTextCell(KDText::FontSize size = KDText::FontSize::Small, float horizontalAlignment = 1.0f, float verticalAlignment = 0.5f); - const char * text(); + const char * text() const override; void setFontSize(KDText::FontSize fontSize) { m_bufferTextView.setFontSize(fontSize); } @@ -18,12 +18,10 @@ public: void setHighlighted(bool highlight) override; void setText(const char * textContent); void setTextColor(KDColor textColor); +protected: int numberOfSubviews() const override; View * subviewAtIndex(int index) override; - void layoutSubviews() override; - -protected: - BufferTextView m_bufferTextView; + void layoutSubviews() override; BufferTextView m_bufferTextView; }; #endif diff --git a/escher/include/escher/even_odd_editable_text_cell.h b/escher/include/escher/even_odd_editable_text_cell.h index 5266997a4..635625ee5 100644 --- a/escher/include/escher/even_odd_editable_text_cell.h +++ b/escher/include/escher/even_odd_editable_text_cell.h @@ -14,11 +14,14 @@ public: virtual Responder * responder() override { return this; } + const char * text() const override { + return m_editableCell.text(); + } + void didBecomeFirstResponder() override; +private: int numberOfSubviews() const override; View * subviewAtIndex(int index) override; void layoutSubviews() override; - void didBecomeFirstResponder() override; -private: EditableTextCell m_editableCell; }; diff --git a/escher/include/escher/even_odd_message_text_cell.h b/escher/include/escher/even_odd_message_text_cell.h index 05d87ae61..86233611c 100644 --- a/escher/include/escher/even_odd_message_text_cell.h +++ b/escher/include/escher/even_odd_message_text_cell.h @@ -12,10 +12,10 @@ public: void setHighlighted(bool highlight) override; void setMessage(I18n::Message textContent, KDColor textColor = KDColorBlack); void setAlignment(float horizontalAlignment, float verticalAlignment); +protected: int numberOfSubviews() const override; View * subviewAtIndex(int index) override; void layoutSubviews() override; -protected: MessageTextView m_messageTextView; }; diff --git a/escher/include/escher/highlight_cell.h b/escher/include/escher/highlight_cell.h index 25e19310a..45add701e 100644 --- a/escher/include/escher/highlight_cell.h +++ b/escher/include/escher/highlight_cell.h @@ -13,6 +13,9 @@ public: virtual Responder * responder() { return nullptr; } + virtual const char * text() const { + return nullptr; + } protected: bool m_highlighted; }; diff --git a/escher/include/escher/message_table_cell_with_buffer.h b/escher/include/escher/message_table_cell_with_buffer.h index c10faf334..c88d5512d 100644 --- a/escher/include/escher/message_table_cell_with_buffer.h +++ b/escher/include/escher/message_table_cell_with_buffer.h @@ -14,6 +14,9 @@ public: void setTextColor(KDColor color) override; void setAccessoryTextColor(KDColor color); void setAccessoryFontSize(KDText::FontSize fontSize); + const char * text() const override { + return m_accessoryView.text(); + } protected: BufferTextView m_accessoryView; }; diff --git a/escher/include/escher/message_table_cell_with_editable_text.h b/escher/include/escher/message_table_cell_with_editable_text.h index dbfe11a29..4f4c2fb43 100644 --- a/escher/include/escher/message_table_cell_with_editable_text.h +++ b/escher/include/escher/message_table_cell_with_editable_text.h @@ -17,6 +17,12 @@ public: Responder * responder() override { return this; } + const char * text() const override { + if (!m_textField.isEditing()) { + return m_textField.text(); + } + return nullptr; + } void setAccessoryText(const char * text); void setTextColor(KDColor color) override; constexpr static int k_bufferLength = TextField::maxBufferSize(); diff --git a/escher/src/even_odd_buffer_text_cell.cpp b/escher/src/even_odd_buffer_text_cell.cpp index 0e7ac8b87..051f8712d 100644 --- a/escher/src/even_odd_buffer_text_cell.cpp +++ b/escher/src/even_odd_buffer_text_cell.cpp @@ -7,7 +7,7 @@ EvenOddBufferTextCell::EvenOddBufferTextCell(KDText::FontSize size, float horizo { } -const char * EvenOddBufferTextCell::text() { +const char * EvenOddBufferTextCell::text() const { return m_bufferTextView.text(); } diff --git a/escher/src/selectable_table_view.cpp b/escher/src/selectable_table_view.cpp index 67deb6773..d7b6c3478 100644 --- a/escher/src/selectable_table_view.cpp +++ b/escher/src/selectable_table_view.cpp @@ -1,4 +1,5 @@ #include +#include #include SelectableTableView::SelectableTableView(Responder * parentResponder, TableViewDataSource * dataSource, SelectableTableViewDataSource * selectionDataSource, SelectableTableViewDelegate * delegate) : @@ -117,6 +118,17 @@ bool SelectableTableView::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Right) { return selectCellAtLocation(selectedColumn()+1, selectedRow()); } + if (event == Ion::Events::Copy || event == Ion::Events::Cut) { + HighlightCell * cell = selectedCell(); + if (cell == nullptr) { + return false; + } + const char * text = cell->text(); + if (text) { + Clipboard::sharedClipboard()->store(text); + return true; + } + } return false; }