QCodeEdit now can comment/uncomment on ctrl+/

This commit is contained in:
2020-10-07 21:38:16 +03:00
parent cb86646457
commit aa906610b4
2 changed files with 82 additions and 1 deletions

View File

@@ -45,6 +45,7 @@ QCodeEdit::QCodeEdit(QWidget * parent): QWidget(parent) {
timer_parse = 0;
_ignore_focus_out = _destructor = _replacing = cursor_state = block_sel_state = false;
_first = true;
comment_text = "//";
qRegisterMetaType<QTextCursor>();
qRegisterMetaType<QCodeEdit::ACEntry>();
ui = new Ui::QCodeEdit();
@@ -279,6 +280,16 @@ bool QCodeEdit::isHelpHintVisible() const {
}
QString QCodeEdit::commentText() const {
return comment_text;
}
void QCodeEdit::setCommentText(QString t) {
comment_text = t;
}
void QCodeEdit::setEditorFont(QFont f) {
ui->textCode->setFont(f);
ui->textLines->setFont(f);
@@ -577,6 +588,12 @@ bool QCodeEdit::codeKeyEvent(QKeyEvent * ke) {
return true;
}
break;
case Qt::Key_Slash:
if (ke->modifiers().testFlag(Qt::ControlModifier)) {
toggleComment();
return true;
}
break;
case Qt::Key_Escape:
hideHelp();
if (completer->isVisible())
@@ -683,7 +700,7 @@ bool QCodeEdit::codeKeyEvent(QKeyEvent * ke) {
default: break;
}
if (!ke->text().isEmpty()) {
if (hasBlockSelection() && (ke->modifiers() == 0 || ke->modifiers() == Qt::ShiftModifier)) {
if (hasBlockSelection() && (ke->modifiers() == 0 || ke->modifiers() == Qt::ShiftModifier || ke->modifiers() == Qt::KeypadModifier)) {
insertBlockSelection(ke->text());
return true;
}
@@ -700,6 +717,66 @@ bool QCodeEdit::codeKeyEvent(QKeyEvent * ke) {
}
void QCodeEdit::toggleComment() {
QTextCursor tc = ui->textCode->textCursor();
tc.beginEditBlock();
int ss = tc.selectionStart(), ss_ = ss, se = tc.selectionEnd(), se_ = se;
QString st_ = tc.selection().toPlainText();
if (st_.endsWith("\n")) {
st_.chop(1);
se--; se_--;
}
tc.setPosition(ss); tc.movePosition(QTextCursor::StartOfLine); ss = tc.position();
tc.setPosition(se); tc.movePosition(QTextCursor::EndOfLine ); se = tc.position();
tc.setPosition(ss);
bool need_comment = false;
QMap<int, bool> comms;
while (tc.position() <= se_) {
int line = tc.blockNumber();
tc.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, comment_text.size());
if (line == tc.blockNumber()) {
if (tc.selectedText() == comment_text) {
comms[line] = true;
} else {
need_comment = true;
comms[line] = false;
}
} else
comms[line] = false;
tc.movePosition(QTextCursor::StartOfLine);
if (!tc.movePosition(QTextCursor::Down))
break;
}
tc.setPosition(ss);
bool first = true;
while (tc.position() <= se_) {
int line = tc.blockNumber();
if (need_comment) {
if (!comms[line]) {
tc.insertText("//");
se_ += comment_text.size();
if (first) ss_ += comment_text.size();
}
} else {
if (comms[line]) {
tc.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, comment_text.size());
tc.removeSelectedText();
se_ -= comment_text.size();
if (first) ss_ -= comment_text.size();
}
}
first = false;
tc.movePosition(QTextCursor::StartOfLine);
if (!tc.movePosition(QTextCursor::Down))
break;
}
tc.setPosition(ss_);
tc.setPosition(se_, QTextCursor::KeepAnchor);
ui->textCode->setTextCursor(tc);
tc.endEditBlock();
}
char antiBracket(char c) {
switch (c) {
case '(': return ')';