void UITextInput::dragSelectionTo(Number x, Number y) { x -= padding * 2.0; y -= padding; int lineOffset = y / (lineHeight+lineSpacing); if(lineOffset > lines.size()-1) lineOffset = lines.size()-1; ScreenLabel *selectToLine = lines[lineOffset]; int len = selectToLine->getText().length(); Number slen; int caretPosition = selectToLine->getLabel()->getTextWidthForString(selectToLine->getText().substr(0,len)); for(int i=0; i < len; i++) { slen = selectToLine->getLabel()->getTextWidthForString(selectToLine->getText().substr(0,i)); if(slen > x) { caretPosition = i; break; } } if(x > slen) caretPosition = len; // if(multiLine) // caretPosition++; if(caretPosition < 0) caretPosition = 0; setSelection(this->lineOffset, lineOffset, this->caretPosition, caretPosition); }
void UITextInput::dragSelectionTo(Number x, Number y) { x -= padding; y -= padding; int lineOffset = y / (lineHeight+lineSpacing); if(lineOffset > lines.size()-1) lineOffset = lines.size()-1; ScreenLabel *selectToLine = lines[lineOffset]; int len = selectToLine->getText().length(); Number slen; int caretPosition = selectToLine->getLabel()->getTextWidth(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), selectToLine->getText().substr(0,len), fontSize); for(int i=0; i < len; i++) { slen = selectToLine->getLabel()->getTextWidth(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), selectToLine->getText().substr(0,i), fontSize); if(slen > x) { caretPosition = i; break; } } if(x > slen) caretPosition = len; if(caretPosition < 0) caretPosition = 0; setSelection(this->lineOffset, lineOffset, this->caretPosition, caretPosition); }
void UITextInput::deleteSelection() { if(selectionTop == selectionBottom) { String ctext = lines[selectionTop]->getText(); String newText = ctext.substr(0, selectionL); int rside = selectionR; if(rside > ctext.length()-1) rside = ctext.length() - 1; newText += ctext.substr(rside,ctext.length() - selectionR); lines[selectionTop]->setText(newText); } else { String ctext = lines[selectionTop]->getText(); String newText = ctext.substr(0, selectionL); lines[selectionTop]->setText(newText); ScreenLabel *bottomLine = lines[selectionBottom]; // if whole lines to remove, do it vector<ScreenLabel*> linesToRemove; if(selectionBottom > selectionTop + 1) { for(int i=selectionTop+1; i < selectionBottom; i++) { linesToRemove.push_back(lines[i]); } for(int i=0; i < linesToRemove.size(); i++) { removeLine(linesToRemove[i]); } } ctext = bottomLine->getText(); int rside = selectionR; if(rside > ctext.length()-1) rside = ctext.length() - 1; newText = ctext.substr(rside,ctext.length() - selectionR); lineOffset = selectionTop; selectLineFromOffset(); caretPosition = currentLine->getText().length(); updateCaretPosition(); currentLine->setText(currentLine->getText() + newText); removeLine(bottomLine); } clearSelection(); caretPosition = selectionL; updateCaretPosition(); changedText(); }
void UITextInput::setSelection(int lineStart, int lineEnd, int colStart, int colEnd) { if(lineStart == lineEnd && colStart == colEnd) { clearSelection(); return; } if(lineStart == lineOffset) { selectionLine = lineEnd; } else { selectionLine = lineStart; } if(colStart == caretPosition) { selectionCaretPosition = colEnd; } else { selectionCaretPosition = colStart; } // printf("SET lineStart:%d lineEnd:%d colStart:%d colEnd:%d\n", lineStart, lineEnd, colStart, colEnd); if(lineStart > lineEnd) { int tmp = lineStart; lineStart = lineEnd; lineEnd = tmp; tmp = colStart; colStart = colEnd; colEnd = tmp; } if(colStart > colEnd && lineStart == lineEnd) { int tmp = colStart; colStart = colEnd; colEnd = tmp; } clearSelection(); if(lineStart > lines.size()-1) return; ScreenLabel *topLine = lines[lineStart]; if(colStart+1 > topLine->getText().length()) { colStart = topLine->getText().length(); } Number fColEnd = colEnd; if(colEnd > topLine->getText().length() || lineStart != lineEnd) fColEnd = topLine->getText().length(); Number topSize, topHeight, topX; selectorRectTop->visible = true; topSize = topLine->getLabel()->getTextWidthForString(topLine->getText().substr(colStart,fColEnd-colStart)) ; topHeight = lineHeight+lineSpacing; if(colStart >= 0) { topX = topLine->getLabel()->getTextWidthForString(topLine->getText().substr(0,colStart)) + 2; } else { topX = 0; } selectorRectTop->setScale(topSize, topHeight); selectorRectTop->setPosition(decoratorOffset + topX + padding + (topSize/2.0), padding + (lineStart * (lineHeight+lineSpacing)) + (topHeight/2.0)); if(lineEnd > lineStart && lineEnd < lines.size()) { ScreenLabel *bottomLine = lines[lineEnd]; selectorRectBottom->visible = true; Number bottomSize = bottomLine->getLabel()->getTextWidthForString(bottomLine->getText().substr(0,colEnd)) ; if(bottomSize < 0) bottomSize = this->width-padding; Number bottomHeight = lineHeight+lineSpacing; selectorRectBottom->setScale(bottomSize, bottomHeight); selectorRectBottom->setPosition(decoratorOffset + padding + (bottomSize/2.0), padding + (lineEnd * (lineHeight+lineSpacing)) + (bottomHeight/2.0)); if(lineEnd != lineStart+1) { // need filler selectorRectMiddle->visible = true; Number midSize = this->width-padding; Number midHeight = 0; for(int i=lineStart+1; i < lineEnd;i++) { midHeight += lineHeight+lineSpacing; } selectorRectMiddle->setScale(midSize, midHeight); selectorRectMiddle->setPosition(decoratorOffset + padding + (midSize/2.0), padding + ((lineStart+1) * (lineHeight+lineSpacing)) + (midHeight/2.0)); } } hasSelection = true; selectionTop = lineStart; selectionBottom = lineEnd; selectionL = colStart; selectionR = colEnd; }
void UITextInput::setSelection(int lineStart, int lineEnd, int colStart, int colEnd) { if(lineStart == lineOffset) { selectionLine = lineEnd; } else { selectionLine = lineStart; } if(colStart == caretPosition) { selectionCaretPosition = colEnd; } else { selectionCaretPosition = colStart; } // Logger::log("SET lineStart:%d lineEnd:%d colStart:%d colEnd:%d\n", lineStart, lineEnd, colStart, colEnd); if(lineStart > lineEnd) { int tmp = lineStart; lineStart = lineEnd; lineEnd = tmp; tmp = colStart; colStart = colEnd; colEnd = tmp; } if(colStart > colEnd && lineStart == lineEnd) { int tmp = colStart; colStart = colEnd; colEnd = tmp; } clearSelection(); if(lineStart > lines.size()-1) return; ScreenLabel *topLine = lines[lineStart]; if(colStart+1 > topLine->getText().length()) return; Number fColEnd = colEnd; if(colEnd > topLine->getText().length() || lineStart != lineEnd) fColEnd = topLine->getText().length(); Number topSize, topHeight, topX; selectorRectTop->visible = true; topSize = topLine->getLabel()->getTextWidth(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), topLine->getText().substr(colStart,fColEnd-colStart), fontSize) - 4; topHeight = lineHeight+lineSpacing; if(colStart > 0) { topX = topLine->getLabel()->getTextWidth(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), topLine->getText().substr(0,colStart-1), fontSize); ; } else { topX = 0; } selectorRectTop->setScale(topSize, topHeight); selectorRectTop->setPosition(topX + padding + (topSize/2.0)+ 1, padding + (lineStart * (lineHeight+lineSpacing)) + (topHeight/2.0)); if(lineEnd > lineStart && lineEnd < lines.size()) { ScreenLabel *bottomLine = lines[lineEnd]; selectorRectBottom->visible = true; Number bottomSize = bottomLine->getLabel()->getTextWidth(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), bottomLine->getText().substr(0,colEnd), fontSize) - 4; Number bottomHeight = lineHeight+lineSpacing; selectorRectBottom->setScale(bottomSize, bottomHeight); selectorRectBottom->setPosition(padding + (bottomSize/2.0) + 1, padding + (lineEnd * (lineHeight+lineSpacing)) + (bottomHeight/2.0)); if(lineEnd != lineStart+1) { // need filler selectorRectMiddle->visible = true; Number midSize = this->width-padding; Number midHeight = 0; for(int i=lineStart+1; i < lineEnd;i++) { midHeight += lineHeight+lineSpacing; } selectorRectMiddle->setScale(midSize, midHeight); selectorRectMiddle->setPosition(padding + (midSize/2.0), padding + ((lineStart+1) * (lineHeight+lineSpacing)) + (midHeight/2.0)); } } hasSelection = true; selectionTop = lineStart; selectionBottom = lineEnd; selectionL = colStart; selectionR = colEnd; }