Working key blocking in transmit text edit for typeahead
This commit is contained in:
parent
9055d50e76
commit
b216063f60
@ -92,6 +92,7 @@ TransmitTextEdit::TransmitTextEdit(QWidget *parent):
|
|||||||
connect(this, &QTextEdit::selectionChanged, this, &TransmitTextEdit::on_selectionChanged);
|
connect(this, &QTextEdit::selectionChanged, this, &TransmitTextEdit::on_selectionChanged);
|
||||||
connect(this, &QTextEdit::cursorPositionChanged, this, &TransmitTextEdit::on_selectionChanged);
|
connect(this, &QTextEdit::cursorPositionChanged, this, &TransmitTextEdit::on_selectionChanged);
|
||||||
connect(this->document(), &QTextDocument::contentsChange, this, &TransmitTextEdit::on_textContentsChanged);
|
connect(this->document(), &QTextDocument::contentsChange, this, &TransmitTextEdit::on_textContentsChanged);
|
||||||
|
installEventFilter(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransmitTextEdit::setCharsSent(int n){
|
void TransmitTextEdit::setCharsSent(int n){
|
||||||
@ -150,9 +151,7 @@ void TransmitTextEdit::setProtected(bool protect){
|
|||||||
m_protected = protect;
|
m_protected = protect;
|
||||||
}
|
}
|
||||||
|
|
||||||
// slot
|
bool TransmitTextEdit::cursorShouldBeProtected(QTextCursor c){
|
||||||
void TransmitTextEdit::on_selectionChanged(){
|
|
||||||
auto c = textCursor();
|
|
||||||
int start = c.selectionStart();
|
int start = c.selectionStart();
|
||||||
int end = c.selectionEnd();
|
int end = c.selectionEnd();
|
||||||
if(end < start){
|
if(end < start){
|
||||||
@ -165,12 +164,23 @@ void TransmitTextEdit::on_selectionChanged(){
|
|||||||
|
|
||||||
if(m_sent && start <= m_sent){
|
if(m_sent && start <= m_sent){
|
||||||
qDebug() << "selection in protected zone" << start << "<=" << m_sent;
|
qDebug() << "selection in protected zone" << start << "<=" << m_sent;
|
||||||
setProtected(true);
|
return true;
|
||||||
} else {
|
} else {
|
||||||
setProtected(false);
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// slot
|
||||||
|
void TransmitTextEdit::on_selectionChanged(){
|
||||||
|
auto c = textCursor();
|
||||||
|
|
||||||
|
auto protect = cursorShouldBeProtected(c);
|
||||||
|
|
||||||
|
setProtected(protect);
|
||||||
|
|
||||||
|
// TODO: when protected and text is selected, remove protected region from selection
|
||||||
|
}
|
||||||
|
|
||||||
// slot
|
// slot
|
||||||
void TransmitTextEdit::on_textContentsChanged(int pos, int rem, int add){
|
void TransmitTextEdit::on_textContentsChanged(int pos, int rem, int add){
|
||||||
if(rem == 0 && add == 0){
|
if(rem == 0 && add == 0){
|
||||||
@ -179,8 +189,13 @@ void TransmitTextEdit::on_textContentsChanged(int pos, int rem, int add){
|
|||||||
|
|
||||||
auto text = toPlainText();
|
auto text = toPlainText();
|
||||||
if(text != m_lastText){
|
if(text != m_lastText){
|
||||||
qDebug() << "text changed" << pos << rem << add << "from" << m_lastText << "to" << text;
|
//qDebug() << "text changed" << pos << rem << add << "from" << m_lastText << "to" << text;
|
||||||
|
|
||||||
highlight();
|
highlight();
|
||||||
|
|
||||||
|
qDebug() << "sent:" << sentText();
|
||||||
|
qDebug() << "unsent:" << unsentText();
|
||||||
|
|
||||||
m_lastText = text;
|
m_lastText = text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -226,3 +241,151 @@ void TransmitTextEdit::highlight(){
|
|||||||
highlightCharsSent();
|
highlightCharsSent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isMovementKeyEvent(QKeyEvent * k){
|
||||||
|
return (
|
||||||
|
k == QKeySequence::MoveToNextChar ||
|
||||||
|
k == QKeySequence::MoveToPreviousChar ||
|
||||||
|
k == QKeySequence::SelectNextChar ||
|
||||||
|
k == QKeySequence::SelectPreviousChar ||
|
||||||
|
k == QKeySequence::SelectNextWord ||
|
||||||
|
k == QKeySequence::SelectPreviousWord ||
|
||||||
|
k == QKeySequence::SelectStartOfLine ||
|
||||||
|
k == QKeySequence::SelectEndOfLine ||
|
||||||
|
k == QKeySequence::SelectStartOfBlock ||
|
||||||
|
k == QKeySequence::SelectEndOfBlock ||
|
||||||
|
k == QKeySequence::SelectStartOfDocument ||
|
||||||
|
k == QKeySequence::SelectEndOfDocument ||
|
||||||
|
k == QKeySequence::SelectPreviousLine ||
|
||||||
|
k == QKeySequence::SelectNextLine ||
|
||||||
|
k == QKeySequence::MoveToNextWord ||
|
||||||
|
k == QKeySequence::MoveToPreviousWord ||
|
||||||
|
k == QKeySequence::MoveToEndOfBlock ||
|
||||||
|
k == QKeySequence::MoveToStartOfBlock ||
|
||||||
|
k == QKeySequence::MoveToNextLine ||
|
||||||
|
k == QKeySequence::MoveToPreviousLine ||
|
||||||
|
k == QKeySequence::MoveToPreviousLine ||
|
||||||
|
k == QKeySequence::MoveToStartOfLine ||
|
||||||
|
k == QKeySequence::MoveToEndOfLine ||
|
||||||
|
k == QKeySequence::MoveToStartOfDocument ||
|
||||||
|
k == QKeySequence::MoveToEndOfDocument
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QTextCursor::MoveOperation movementKeyEventToMoveOperation(QKeyEvent *e){
|
||||||
|
QTextCursor::MoveOperation op = QTextCursor::NoMove;
|
||||||
|
|
||||||
|
if (e == QKeySequence::MoveToNextChar) {
|
||||||
|
op = QTextCursor::Right;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToPreviousChar) {
|
||||||
|
op = QTextCursor::Left;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectNextChar) {
|
||||||
|
op = QTextCursor::Right;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectPreviousChar) {
|
||||||
|
op = QTextCursor::Left;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectNextWord) {
|
||||||
|
op = QTextCursor::WordRight;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectPreviousWord) {
|
||||||
|
op = QTextCursor::WordLeft;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectStartOfLine) {
|
||||||
|
op = QTextCursor::StartOfLine;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectEndOfLine) {
|
||||||
|
op = QTextCursor::EndOfLine;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectStartOfBlock) {
|
||||||
|
op = QTextCursor::StartOfBlock;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectEndOfBlock) {
|
||||||
|
op = QTextCursor::EndOfBlock;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectStartOfDocument) {
|
||||||
|
op = QTextCursor::Start;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectEndOfDocument) {
|
||||||
|
op = QTextCursor::End;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectPreviousLine) {
|
||||||
|
op = QTextCursor::Up;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::SelectNextLine) {
|
||||||
|
op = QTextCursor::Down;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToNextWord) {
|
||||||
|
op = QTextCursor::WordRight;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToPreviousWord) {
|
||||||
|
op = QTextCursor::WordLeft;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToEndOfBlock) {
|
||||||
|
op = QTextCursor::EndOfBlock;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToStartOfBlock) {
|
||||||
|
op = QTextCursor::StartOfBlock;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToNextLine) {
|
||||||
|
op = QTextCursor::Down;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToPreviousLine) {
|
||||||
|
op = QTextCursor::Up;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToPreviousLine) {
|
||||||
|
op = QTextCursor::Up;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToStartOfLine) {
|
||||||
|
op = QTextCursor::StartOfLine;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToEndOfLine) {
|
||||||
|
op = QTextCursor::EndOfLine;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToStartOfDocument) {
|
||||||
|
op = QTextCursor::Start;
|
||||||
|
}
|
||||||
|
else if (e == QKeySequence::MoveToEndOfDocument) {
|
||||||
|
op = QTextCursor::End;
|
||||||
|
}
|
||||||
|
|
||||||
|
return op;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool TransmitTextEdit::eventFilter(QObject */*o*/, QEvent *e){
|
||||||
|
if(e->type() != QEvent::KeyPress){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QKeyEvent *k = static_cast<QKeyEvent *>(e);
|
||||||
|
|
||||||
|
auto c = textCursor();
|
||||||
|
|
||||||
|
auto c2 = QTextCursor(c);
|
||||||
|
c2.movePosition(movementKeyEventToMoveOperation(k));
|
||||||
|
|
||||||
|
bool shouldBeProtected = cursorShouldBeProtected(c2);
|
||||||
|
|
||||||
|
// 0. only filter when in a protected range
|
||||||
|
// 0a. but only if we're not moving/deleting _into_ the protected range :/
|
||||||
|
if(!isProtected() && !shouldBeProtected){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. do not filter movement sequences
|
||||||
|
if(isMovementKeyEvent(k)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. if on the edge, do not filter if not a backspace
|
||||||
|
int start = qMin(c.selectionStart(), c.selectionEnd());
|
||||||
|
if(start == m_sent && k->key() != Qt::Key_Backspace){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -24,6 +24,14 @@ public:
|
|||||||
}
|
}
|
||||||
void setCharsSent(int n);
|
void setCharsSent(int n);
|
||||||
|
|
||||||
|
QString sentText() const {
|
||||||
|
return m_textSent;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString unsentText() const {
|
||||||
|
return toPlainText().mid(charsSent());
|
||||||
|
}
|
||||||
|
|
||||||
QString toPlainText() const;
|
QString toPlainText() const;
|
||||||
void setPlainText(const QString &text);
|
void setPlainText(const QString &text);
|
||||||
void setFont(QFont f);
|
void setFont(QFont f);
|
||||||
@ -34,10 +42,13 @@ public:
|
|||||||
return m_protected;
|
return m_protected;
|
||||||
}
|
}
|
||||||
void setProtected(bool protect);
|
void setProtected(bool protect);
|
||||||
|
bool cursorShouldBeProtected(QTextCursor c);
|
||||||
void highlightBase();
|
void highlightBase();
|
||||||
void highlightCharsSent();
|
void highlightCharsSent();
|
||||||
void highlight();
|
void highlight();
|
||||||
|
|
||||||
|
bool eventFilter(QObject */*o*/, QEvent *e);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void on_selectionChanged();
|
void on_selectionChanged();
|
||||||
void on_textContentsChanged(int pos, int rem, int add);
|
void on_textContentsChanged(int pos, int rem, int add);
|
||||||
|
15
keyeater.cpp
15
keyeater.cpp
@ -12,7 +12,8 @@ bool KeyPressEater::eventFilter(QObject *obj, QEvent *event){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// standard event processing
|
// standard event processing
|
||||||
return QObject::eventFilter(obj, event);
|
//return QObject::eventFilter(obj, event);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EscapeKeyPressEater::eventFilter(QObject *obj, QEvent *event){
|
bool EscapeKeyPressEater::eventFilter(QObject *obj, QEvent *event){
|
||||||
@ -24,7 +25,8 @@ bool EscapeKeyPressEater::eventFilter(QObject *obj, QEvent *event){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// standard event processing
|
// standard event processing
|
||||||
return QObject::eventFilter(obj, event);
|
//return QObject::eventFilter(obj, event);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EnterKeyPressEater::eventFilter(QObject *obj, QEvent *event){
|
bool EnterKeyPressEater::eventFilter(QObject *obj, QEvent *event){
|
||||||
@ -40,7 +42,8 @@ bool EnterKeyPressEater::eventFilter(QObject *obj, QEvent *event){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// standard event processing
|
// standard event processing
|
||||||
return QObject::eventFilter(obj, event);
|
//return QObject::eventFilter(obj, event);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MousePressEater::eventFilter(QObject *obj, QEvent *event){
|
bool MousePressEater::eventFilter(QObject *obj, QEvent *event){
|
||||||
@ -54,7 +57,8 @@ bool MousePressEater::eventFilter(QObject *obj, QEvent *event){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// standard event processing
|
// standard event processing
|
||||||
return QObject::eventFilter(obj, event);
|
//return QObject::eventFilter(obj, event);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MouseDoubleClickEater::eventFilter(QObject *obj, QEvent *event){
|
bool MouseDoubleClickEater::eventFilter(QObject *obj, QEvent *event){
|
||||||
@ -68,5 +72,6 @@ bool MouseDoubleClickEater::eventFilter(QObject *obj, QEvent *event){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// standard event processing
|
// standard event processing
|
||||||
return QObject::eventFilter(obj, event);
|
//return QObject::eventFilter(obj, event);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1095,7 +1095,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
|
|
||||||
toggleTx(true);
|
toggleTx(true);
|
||||||
});
|
});
|
||||||
ui->extFreeTextMsgEdit->installEventFilter(enterFilter);
|
//ui->extFreeTextMsgEdit->installEventFilter(enterFilter);
|
||||||
|
|
||||||
auto doubleClickFilter = new MouseDoubleClickEater();
|
auto doubleClickFilter = new MouseDoubleClickEater();
|
||||||
connect(doubleClickFilter, &MouseDoubleClickEater::mouseDoubleClicked, this, [this](QObject *, QMouseEvent *, bool *){
|
connect(doubleClickFilter, &MouseDoubleClickEater::mouseDoubleClicked, this, [this](QObject *, QMouseEvent *, bool *){
|
||||||
|
Loading…
Reference in New Issue
Block a user