diff --git a/qad/widgets/qcodeedit.cpp b/qad/widgets/qcodeedit.cpp index 7cffc13..9c807f4 100644 --- a/qad/widgets/qcodeedit.cpp +++ b/qad/widgets/qcodeedit.cpp @@ -19,7 +19,7 @@ QCodeEdit::QCodeEdit(QWidget * parent): QWidget(parent) { ui = new Ui::QCodeEdit(); ui->setupUi(this); ui->widgetSearch->hide(); - prev_lc = auto_comp_pl = cur_search_ind = -1; + prev_lc = auto_comp_pl = cur_search_ind = pos_press = pos_el_press = -1; timer = 0; _ignore_focus_out = _destructor = _replacing = false; _first = true; @@ -277,7 +277,7 @@ bool QCodeEdit::eventFilter(QObject * o, QEvent * e) { return QWidget::eventFilter(o, e); } if (ui->textLines) { - if (o == ui->textLines->viewport()) { + if (o == ui->textLines->viewport()) {/* if (e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseMove || e->type() == QEvent::MouseButtonDblClick) { #if (QT_VERSION < 0x050000) @@ -287,10 +287,42 @@ bool QCodeEdit::eventFilter(QObject * o, QEvent * e) { #endif QApplication::sendEvent(ui->textCode->viewport(), e); return true; - } - if (e->type() == QEvent::Wheel) { + }*/ + QTextCursor tc; + int tcpos = 0; + switch (e->type()) { + case QEvent::MouseButtonPress: + tc = ui->textCode->cursorForPosition(((QMouseEvent*)e)->pos()); + tc.movePosition(QTextCursor::EndOfLine); + pos_el_press = tc.anchor(); + tc.movePosition(QTextCursor::StartOfLine); + pos_press = tc.anchor(); + if (!tc.movePosition(QTextCursor::Down, QTextCursor::KeepAnchor)) + tc.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); + ui->textCode->setTextCursor(tc); + return true; + case QEvent::MouseMove: + tc = ui->textCode->cursorForPosition(((QMouseEvent*)e)->pos()); + tc.movePosition(QTextCursor::StartOfLine); + if (pos_press == tc.anchor()) { + if (!tc.movePosition(QTextCursor::Down, QTextCursor::KeepAnchor)) + tc.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); + ui->textCode->setTextCursor(tc); + return true; + } + if (pos_press < tc.anchor()) { + if (!tc.movePosition(QTextCursor::Down, QTextCursor::KeepAnchor)) + tc.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); + } + tcpos = tc.position(); + tc.setPosition(pos_press < tc.anchor() ? pos_press : pos_el_press); + tc.setPosition(tcpos, QTextCursor::KeepAnchor); + ui->textCode->setTextCursor(tc); + return true; + case QEvent::Wheel: QApplication::sendEvent(ui->textCode->viewport(), e); return true; + default: break; } } } diff --git a/qad/widgets/qcodeedit.h b/qad/widgets/qcodeedit.h index 744e347..86096ab 100644 --- a/qad/widgets/qcodeedit.h +++ b/qad/widgets/qcodeedit.h @@ -92,7 +92,7 @@ private: QList es_selected, es_custom, es_brackets, es_search_list; QMap ac_classes; QStringList cursor_scope; - int prev_lc, auto_comp_pl, timer, cur_search_ind; + int prev_lc, auto_comp_pl, timer, cur_search_ind, pos_press, pos_el_press; bool spaces_, _ignore_focus_out, _first, _destructor, _replacing; bool eventFilter(QObject * o, QEvent * e);