[apps/graph] Copy/Cut events on the values controller turn the "(1;3)"

notation into "[[1][3]]" in order to create a matrix layout when paste
into a layout field
This commit is contained in:
Émilie Feral
2019-09-26 10:35:11 +02:00
committed by LeaNumworks
parent c982b4c452
commit ff6eb7525f
6 changed files with 64 additions and 11 deletions

View File

@@ -11,6 +11,7 @@ namespace Graph {
ValuesController::ValuesController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, ButtonRowController * header) :
Shared::ValuesController(parentResponder, header),
m_selectableTableView(this),
m_functionTitleCells{},
m_floatCells{},
m_abscissaTitleCells{},
@@ -38,7 +39,7 @@ ValuesController::ValuesController(Responder * parentResponder, InputEventHandle
m_functionTitleCells[i].setOrientation(FunctionTitleCell::Orientation::HorizontalIndicator);
m_functionTitleCells[i].setFont(KDFont::SmallFont);
}
setupAbscissaCellsAndTitleCells(inputEventHandlerDelegate);
setupSelectableTableViewAndCells(inputEventHandlerDelegate);
m_selectableTableView.setDelegate(this);
}
@@ -286,4 +287,42 @@ void ValuesController::updateNumberOfColumns() const {
}
}
int writeMatrixBrakets(char * buffer, const int bufferSize, int type) {
/* Write the double brackets required in matrix notation.
* - type == 1: "[["
* - type == 0: "]["
* - type == -1: "]]"
*/
int currentChar = 0;
assert(currentChar < bufferSize-1);
buffer[currentChar++] = type < 0 ? '[' : ']';
assert(currentChar < bufferSize-1);
buffer[currentChar++] = type <= 0 ? '[' : ']';
return currentChar;
}
bool ValuesController::ValuesSelectableTableView::handleEvent(Ion::Events::Event event) {
bool handledEvent = SelectableTableView::handleEvent(event);
if (handledEvent && (event == Ion::Events::Copy || event == Ion::Events::Cut)) {
const char * text = Clipboard::sharedClipboard()->storedText();
if (text[0] == '(') {
constexpr int bufferSize = 2*PrintFloat::k_maxFloatCharSize + 6; // "[[a][b]]" gives 6 characters in addition to the 2 floats
char buffer[bufferSize];
int currentChar = 0;
currentChar += writeMatrixBrakets(buffer + currentChar, bufferSize - currentChar, -1);
assert(currentChar < bufferSize-1);
size_t semiColonPosition = UTF8Helper::CopyUntilCodePoint(buffer+currentChar, TextField::maxBufferSize() - currentChar, text+1, ';');
currentChar += semiColonPosition;
currentChar += writeMatrixBrakets(buffer + currentChar, bufferSize - currentChar, 0);
assert(currentChar < bufferSize-1);
currentChar += UTF8Helper::CopyUntilCodePoint(buffer+currentChar, TextField::maxBufferSize() - currentChar, text+1+semiColonPosition+1, ')');
currentChar += writeMatrixBrakets(buffer + currentChar, bufferSize - currentChar, 1);
assert(currentChar < bufferSize-1);
buffer[currentChar] = 0;
Clipboard::sharedClipboard()->store(buffer);
}
}
return handledEvent;
}
}