Element* TextBase::drop(EditData& ed) { TextCursor* _cursor = cursor(ed); Element* e = ed.element; switch (e->type()) { case ElementType::SYMBOL: { SymId id = toSymbol(e)->sym(); delete e; deleteSelectedText(ed); insertSym(ed, id); } break; case ElementType::FSYMBOL: { uint code = toFSymbol(e)->code(); delete e; QString s = QString::fromUcs4(&code, 1); deleteSelectedText(ed); score()->undo(new InsertText(_cursor, s), &ed); } break; default: break; } return 0; }
void EditableTextComponent::overwriteSelection(const std::string& Text) { //Delete selected text deleteSelectedText(); //Write to Caret position insert(Text, getCaretPosition()); }
void TextBase::insertSym(EditData& ed, SymId id) { TextEditData* ted = static_cast<TextEditData*>(ed.getData(this)); TextCursor* _cursor = &ted->cursor; deleteSelectedText(ed); QString s = score()->scoreFont()->toString(id); CharFormat fmt = *_cursor->format(); // save format // uint code = ScoreFont::fallbackFont()->sym(id).code(); _cursor->format()->setFontFamily("ScoreText"); _cursor->format()->setBold(false); _cursor->format()->setItalic(false); score()->undo(new InsertText(_cursor, s), &ed); _cursor->setFormat(fmt); // restore format }
MyQTextEdit::MyQTextEdit(QWidget *parent):QTextEdit(parent) { this->setFontPointSize(10.0); this->setupFileActions(); this->setupEditActions(); this->setupTextActions(); connect(this, SIGNAL(currentCharFormatChanged(const QTextCharFormat &)) , this, SLOT(currentCharFormatChanged(const QTextCharFormat &))); connect(this, SIGNAL(cursorPositionChanged()) , this, SLOT(cursorPositionChanged())); this->setFocus(); this->setCurrentFileName(QString()); this->fontChanged(this->font()); this->colorChanged(this->textColor()); this->alignmentChanged(this->alignment()); this->connectDocument(); this->setWindowModified(this->document()->isModified()); this->actionSaveAs->setEnabled(this->document()->isModified()); this->actionUndo->setEnabled(this->document()->isUndoAvailable()); this->actionRedo->setEnabled(this->document()->isRedoAvailable()); connect(actionUndo, SIGNAL(triggered()), this, SLOT(undo())); connect(actionRedo, SIGNAL(triggered()), this, SLOT(redo())); connect(actionSelectAll, SIGNAL(triggered()), this, SLOT(selectAll())); this->actionCut->setEnabled(false); this->actionCopy->setEnabled(false); this->actionDelete->setEnabled(false); connect(actionCut, SIGNAL(triggered()), this, SLOT(cut())); connect(actionCopy, SIGNAL(triggered()), this, SLOT(copy())); connect(actionPaste, SIGNAL(triggered()), this, SLOT(paste())); connect(actionDelete, SIGNAL(triggered()), this, SLOT(deleteSelectedText())); connect(this, SIGNAL(copyAvailable(bool)), actionCut, SLOT(setEnabled(bool))); connect(this, SIGNAL(copyAvailable(bool)), actionCopy, SLOT(setEnabled(bool))); connect(this, SIGNAL(copyAvailable(bool)), actionDelete, SLOT(setEnabled(bool))); connect(QApplication::clipboard(), SIGNAL(dataChanged()), this , SLOT(clipboardDataChanged())); }
void EditableTextComponent::keyTyped(const KeyEventUnrecPtr e) { if(getEnabled() && getEditable() && !(e->getModifiers() &( KeyEvent::KEY_MODIFIER_ALT | KeyEvent::KEY_MODIFIER_CONTROL | KeyEvent::KEY_MODIFIER_META ))) { if(e->getKeyChar()>31 && e->getKeyChar() < 127) { if(hasSelection()) { deleteSelectedText(); setCaretPosition(_TextSelectionStart); } insert(std::string( 1,e->getKeyChar() ), _TextSelectionStart); _TextSelectionStart = getCaretPosition(); _TextSelectionEnd = _TextSelectionStart; } if(e->getKey()== e->KEY_BACK_SPACE) { if(hasSelection()) { deleteSelectedText(); } else { //erase at the current caret position Int32 DeleteIndex(getCaretPosition()); if(DeleteIndex != 0) { moveCaret(-1); deleteRange(DeleteIndex-1, DeleteIndex); } } } if(e->getKey()== e->KEY_DELETE) { if(hasSelection()) { deleteSelectedText(); } else if(getText().size()>0) { //erase at the current caret position deleteRange(getCaretPosition(), getCaretPosition()+1); _TextSelectionStart = getCaretPosition(); _TextSelectionEnd = _TextSelectionStart; } } } switch(e->getKey()) { case KeyEvent::KEY_RIGHT: case KeyEvent::KEY_KEYPAD_RIGHT: moveCaret(1); break; case KeyEvent::KEY_LEFT: case KeyEvent::KEY_KEYPAD_LEFT: moveCaret(-1); break; case KeyEvent::KEY_V: if(e->getModifiers() & KeyEvent::KEY_MODIFIER_COMMAND) { paste(); } break; case KeyEvent::KEY_C: if(e->getModifiers() & KeyEvent::KEY_MODIFIER_COMMAND) { copy(); } break; case KeyEvent::KEY_X: if(e->getModifiers() & KeyEvent::KEY_MODIFIER_COMMAND) { cut(); } break; case KeyEvent::KEY_A: if(e->getModifiers() & KeyEvent::KEY_MODIFIER_COMMAND) { selectAll(); } break; } Inherited::keyTyped(e); }
void EditableTextComponent::cut(void) { copy(); deleteSelectedText(); }
void TextBase::paste(EditData& ed) { QString txt = QApplication::clipboard()->text(QClipboard::Clipboard); if (MScore::debugMode) qDebug("<%s>", qPrintable(txt)); int state = 0; QString token; QString sym; bool symState = false; score()->startCmd(); for (int i = 0; i < txt.length(); i++ ) { QChar c = txt[i]; if (state == 0) { if (c == '<') { state = 1; token.clear(); } else if (c == '&') { state = 2; token.clear(); } else { if (symState) sym += c; else { deleteSelectedText(ed); if (c.isHighSurrogate()) { QChar highSurrogate = c; Q_ASSERT(i + 1 < txt.length()); i++; QChar lowSurrogate = txt[i]; insertText(ed, QString(QChar::surrogateToUcs4(highSurrogate, lowSurrogate))); } else { insertText(ed, QString(QChar(c.unicode()))); } } } } else if (state == 1) { if (c == '>') { state = 0; if (token == "sym") { symState = true; sym.clear(); } else if (token == "/sym") { symState = false; insertSym(ed, Sym::name2id(sym)); } } else token += c; } else if (state == 2) { if (c == ';') { state = 0; if (token == "lt") insertText(ed, "<"); else if (token == "gt") insertText(ed, ">"); else if (token == "amp") insertText(ed, "&"); else if (token == "quot") insertText(ed, "\""); else insertSym(ed, Sym::name2id(token)); } else if (!c.isLetter()) { state = 0; insertText(ed, "&"); insertText(ed, token); insertText(ed, c); } else token += c; } } if (state == 2) { insertText(ed, "&"); insertText(ed, token); } score()->endCmd(); }
bool TextBase::edit(EditData& ed) { TextEditData* ted = static_cast<TextEditData*>(ed.getData(this)); TextCursor* _cursor = &ted->cursor; // do nothing on Shift, it messes up IME on Windows. See #64046 if (ed.key == Qt::Key_Shift) return false; QString s = ed.s; bool ctrlPressed = ed.modifiers & Qt::ControlModifier; bool shiftPressed = ed.modifiers & Qt::ShiftModifier; QTextCursor::MoveMode mm = shiftPressed ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor; bool wasHex = false; if (hexState >= 0) { if (ed.modifiers == (Qt::ControlModifier | Qt::ShiftModifier | Qt::KeypadModifier)) { switch (ed.key) { case Qt::Key_0: case Qt::Key_1: case Qt::Key_2: case Qt::Key_3: case Qt::Key_4: case Qt::Key_5: case Qt::Key_6: case Qt::Key_7: case Qt::Key_8: case Qt::Key_9: s = QChar::fromLatin1(ed.key); ++hexState; wasHex = true; break; default: break; } } else if (ed.modifiers == (Qt::ControlModifier | Qt::ShiftModifier)) { switch (ed.key) { case Qt::Key_A: case Qt::Key_B: case Qt::Key_C: case Qt::Key_D: case Qt::Key_E: case Qt::Key_F: s = QChar::fromLatin1(ed.key); ++hexState; wasHex = true; break; default: break; } } } if (!wasHex) { // printf("======%x\n", s.isEmpty() ? -1 : s[0].unicode()); switch (ed.key) { case Qt::Key_Z: // happens when the undo stack is empty if (ed.modifiers == Qt::ControlModifier) return true; break; case Qt::Key_Enter: case Qt::Key_Return: deleteSelectedText(ed); score()->undo(new SplitText(_cursor), &ed); return true; case Qt::Key_Delete: if (!deleteSelectedText(ed)) score()->undo(new RemoveText(_cursor, QString(_cursor->currentCharacter())), &ed); return true; case Qt::Key_Backspace: if (!deleteSelectedText(ed)) { if (_cursor->column() == 0 && _cursor->row() != 0) score()->undo(new JoinText(_cursor), &ed); else { if (!_cursor->movePosition(QTextCursor::Left)) return false; score()->undo(new RemoveText(_cursor, QString(_cursor->currentCharacter())), &ed); } } return true; case Qt::Key_Left: if (!_cursor->movePosition(ctrlPressed ? QTextCursor::WordLeft : QTextCursor::Left, mm) && type() == ElementType::LYRICS) return false; s.clear(); break; case Qt::Key_Right: if (!_cursor->movePosition(ctrlPressed ? QTextCursor::NextWord : QTextCursor::Right, mm) && type() == ElementType::LYRICS) return false; s.clear(); break; case Qt::Key_Up: #if defined(Q_OS_MAC) if (!_cursor->movePosition(QTextCursor::Up, mm)) _cursor->movePosition(QTextCursor::StartOfLine, mm); #else _cursor->movePosition(QTextCursor::Up, mm); #endif s.clear(); break; case Qt::Key_Down: #if defined(Q_OS_MAC) if (!_cursor->movePosition(QTextCursor::Down, mm)) _cursor->movePosition(QTextCursor::EndOfLine, mm); #else _cursor->movePosition(QTextCursor::Down, mm); #endif s.clear(); break; case Qt::Key_Home: if (ctrlPressed) _cursor->movePosition(QTextCursor::Start, mm); else _cursor->movePosition(QTextCursor::StartOfLine, mm); s.clear(); break; case Qt::Key_End: if (ctrlPressed) _cursor->movePosition(QTextCursor::End, mm); else _cursor->movePosition(QTextCursor::EndOfLine, mm); s.clear(); break; case Qt::Key_Tab: s = " "; ed.modifiers = 0; break; case Qt::Key_Space: if (ed.modifiers & CONTROL_MODIFIER) s = QString(QChar(0xa0)); // non-breaking space else s = " "; ed.modifiers = 0; break; case Qt::Key_Minus: if (ed.modifiers == 0) s = "-"; break; case Qt::Key_Underscore: if (ed.modifiers == 0) s = "_"; break; case Qt::Key_A: if (ctrlPressed) { selectAll(_cursor); s.clear(); } break; default: break; } if (ctrlPressed && shiftPressed) { switch (ed.key) { case Qt::Key_U: if (hexState == -1) { hexState = 0; s = "u"; } break; case Qt::Key_B: insertSym(ed, SymId::accidentalFlat); return true; case Qt::Key_NumberSign: insertSym(ed, SymId::accidentalSharp); return true; case Qt::Key_H: insertSym(ed, SymId::accidentalNatural); return true; case Qt::Key_Space: insertSym(ed, SymId::space); return true; case Qt::Key_F: insertSym(ed, SymId::dynamicForte); return true; case Qt::Key_M: insertSym(ed, SymId::dynamicMezzo); return true; case Qt::Key_N: insertSym(ed, SymId::dynamicNiente); return true; case Qt::Key_P: insertSym(ed, SymId::dynamicPiano); return true; case Qt::Key_S: insertSym(ed, SymId::dynamicSforzando); return true; case Qt::Key_R: insertSym(ed, SymId::dynamicRinforzando); return true; case Qt::Key_Z: // Ctrl+Z is normally "undo" // but this code gets hit even if you are also holding Shift // so Shift+Ctrl+Z works insertSym(ed, SymId::dynamicZ); return true; } } } if (!s.isEmpty()) { deleteSelectedText(ed); score()->undo(new InsertText(_cursor, s), &ed); } return true; }