/** Redefined to be able to move TagButton when typing. */ void TagLineEdit::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Left || event->key() == Qt::Key_Right) { /// TODO cursorWordForward / cursorWordBackard to stop on TagButton if (QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier)) { qDebug() << "cursorWordForward / backward"; } LineEdit::keyPressEvent(event); for (TagButton *t : _tags) { if (t->frameGeometry().contains(cursorRect().center())) { if (event->key() == Qt::Key_Left) { cursorBackward(false, t->spaceCount() - 1); } else { cursorForward(false, t->spaceCount() - 1); } break; } } } else { QString k = event->text(); int w = fontMetrics().width(k); if (event->key() == Qt::Key_Delete) { qDebug() << Q_FUNC_INFO << "Key_Delete"; w = -w; } for (TagButton *t : _tags) { if (t->frameGeometry().x() > cursorRect().center().x()) { t->move(t->x() + w, 0); } } LineEdit::keyPressEvent(event); } }
void GuidLineEdit::keyPressEvent(QKeyEvent * event) { if (event == QKeySequence::Delete || event->key() == Qt::Key_Backspace) { int pos = cursorPosition(); if (event->key() == Qt::Key_Backspace && pos > 0) { cursorBackward(false); pos = cursorPosition(); } QString txt = text(); QString selected = selectedText(); if (!selected.isEmpty()) { pos = QLineEdit::selectionStart(); for (int i = pos; i < pos + selected.count(); i++) if (txt[i] != QChar('-')) txt[i] = QChar('.'); } else txt[pos] = QChar('.'); setCursorPosition(0); insert(txt); setCursorPosition(pos); return; } // Call original event handler QLineEdit::keyPressEvent(event); }
void CharLineEdit::keyPressEvent(QKeyEvent* event) { bool handled = false; if (selectionStart() == -1) { switch (event->key()) { case Qt::Key_Backspace: if (isAtEndOfSeparator()) { // Delete separator characters in a single keypress. // Don't use setText This method maintains the undo history backspace(); backspace(); backspace(); handled = true; } break; case Qt::Key_Delete: if (isAtStartOfSeparator()) { del(); del(); del(); handled = true; } break; case Qt::Key_Left: if (isAtEndOfSeparator()) { cursorBackward(false, 3); handled = true; } break; case Qt::Key_Right: if (isAtStartOfSeparator()) { cursorForward(false, 3); handled = true; } break; } } if (handled) { event->ignore(); } else { QLineEdit::keyPressEvent(event); } emit keyPressed(event); }
/** Redefined to be able to move tag buttons. * Backspace method is not virtual in QLineEdit, therefore keyPressEvent must be intercepted and eaten. */ void TagLineEdit::backspace() { bool oneTagNeedToBeRemoved = false; TagButton *tag = nullptr; QPoint cursorCenter; cursorBackward(false); int dx = fontMetrics().width(text().at(cursorPosition())); for (TagButton *button : _tags) { cursorCenter = cursorRect().center(); // One tag button need to be removed if (button->frameGeometry().contains(cursorCenter)) { oneTagNeedToBeRemoved = true; tag = button; } // Tags need to be moved to the left if (button->x() > cursorCenter.x()) { button->move(button->x() - dx, 0); button->setPosition(cursorPosition()); } } cursorForward(false); if (oneTagNeedToBeRemoved) { for (int i = 0; i < tag->spaceCount(); i++) { LineEdit::backspace(); } dx = fontMetrics().width(" ") * tag->spaceCount(); for (TagButton *button : _tags) { if (button != tag && button->x() > cursorCenter.x()) { button->move(button->x() - dx, 0); button->setPosition(cursorPosition()); } } _tags.removeOne(tag); delete tag; /// FIXME //emit taglistHasChanged(this->toStringList()); } else { LineEdit::backspace(); } }
int LineEditHistory::beginOfWord( bool mark ) { int pos = cursorPosition(); if( pos == 0 ) return 0; int move = 0; QString text = this->text(); pos--; while( !text[ pos ].isSpace() && ( text[ pos ].isLetter() || text[ pos ].isNumber() || ( text[ pos ] == '_' ) ) ) { move++; if( pos == 0 ) break; pos--; } cursorBackward( mark, move ); return move; }
/** Redefined to automatically move cursor outside TagButton. */ void TagLineEdit::mousePressEvent(QMouseEvent *event) { LineEdit::mousePressEvent(event); for (TagButton *t : _tags) { QRect r = t->frameGeometry(); if (r.contains(event->pos())) { if (r.x() + r.width() / 2 >= event->pos().x()) { while (r.contains(cursorRect().center()) && cursorPosition() > 0) { cursorBackward(false); //qDebug() << "cursorBackward" << "pos" << t->position() << "spaces" << t->spaceCount(); } } else { while (r.contains(cursorRect().center()) && cursorPosition() < text().length()) { cursorForward(false); //qDebug() << "cursorForward" << "pos" << t->position() << "spaces" << t->spaceCount(); } } break; } } }
////////////////////////////////////////////////////////////// /// \brief QQPalmiLineEditInt::insertText /// \param str /// void QQPalmiLineEditInt::insertText(const QString &str) { QString newStr = str; int moveCursorCount = 0; if(str.contains("%s")) { if(!hasFocus()) setSelection(m_savedSelection.first, m_savedSelection.second); QString selection = selectedText(); newStr.replace("%s", selection); if(selection.length() == 0) moveCursorCount = str.length() - (str.indexOf("%s") + 2); } insert(newStr); if(moveCursorCount > 0) cursorBackward(false, moveCursorCount); m_postHistory.last() = text(); m_indexInPostHistory = m_postHistory.size() - 1; //last }