diff --git a/NEWS.md b/NEWS.md index b8b6b0db..a655c66a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -20,6 +20,8 @@ Red Panda C++ Version 2.8 - change: Disable undo limit by default. - fix: "Goto declaration" / "Goto definition" / "Find occurences" not correctly disabled for non-c/c++ files. - fix: Can't save new file using filename with custom suffix. + - fix: alt+shift+left/right can't select + - fix: Input any content will exit column mode. Red Panda C++ Version 2.7 diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index f808b46c..9e2085b6 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -57,13 +57,16 @@ SaveException::SaveException(const QString& reason) { mReason = reason; mReasonBuffer = mReason.toLocal8Bit(); } + SaveException::SaveException(const QString&& reason) { mReason = reason; mReasonBuffer = mReason.toLocal8Bit(); } + const QString& SaveException::reason() const noexcept{ return mReason; } + const char* SaveException::what() const noexcept { return mReasonBuffer; } diff --git a/libs/qsynedit/qsynedit/KeyStrokes.cpp b/libs/qsynedit/qsynedit/KeyStrokes.cpp index f824e08a..232aa30e 100644 --- a/libs/qsynedit/qsynedit/KeyStrokes.cpp +++ b/libs/qsynedit/qsynedit/KeyStrokes.cpp @@ -191,10 +191,12 @@ void EditKeyStrokes::resetDefaults() add(EditCommand::ScrollDown, Qt::Key_Down, Qt::ControlModifier); add(EditCommand::Left, Qt::Key_Left, Qt::NoModifier); add(EditCommand::SelLeft, Qt::Key_Left, Qt::ShiftModifier); + add(EditCommand::SelLeft, Qt::Key_Left, Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::AltModifier)); add(EditCommand::WordLeft, Qt::Key_Left, Qt::ControlModifier); add(EditCommand::SelWordLeft, Qt::Key_Left, Qt::KeyboardModifiers(Qt::ShiftModifier|Qt::ControlModifier)); add(EditCommand::Right, Qt::Key_Right, Qt::NoModifier); add(EditCommand::SelRight, Qt::Key_Right, Qt::ShiftModifier); + add(EditCommand::SelRight, Qt::Key_Right, Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::AltModifier)); add(EditCommand::WordRight, Qt::Key_Right, Qt::ControlModifier); add(EditCommand::SelWordRight, Qt::Key_Right, Qt::KeyboardModifiers(Qt::ShiftModifier|Qt::ControlModifier)); diff --git a/libs/qsynedit/qsynedit/SynEdit.cpp b/libs/qsynedit/qsynedit/SynEdit.cpp index 5166bb7a..931e4e3d 100644 --- a/libs/qsynedit/qsynedit/SynEdit.cpp +++ b/libs/qsynedit/qsynedit/SynEdit.cpp @@ -4364,6 +4364,8 @@ void SynEdit::doUndoItem() item->changeSelMode(), item->changeNumber()); internalSetCaretXY(item->changeStartPos()); + setBlockBegin(caretXY()); + ensureCursorPosVisible(); break; } case ChangeReason::MoveSelectionUp: @@ -4407,6 +4409,7 @@ void SynEdit::doUndoItem() item->changeText(), item->changeSelMode(), item->changeNumber()); + setBlockBegin(caretXY()); ensureCursorPosVisible(); break; } @@ -5487,19 +5490,34 @@ void SynEdit::doInsertText(const BufferCoord& pos, case SelectionMode::Normal: insertedLines = doInsertTextByNormalMode(pos,text, newPos); doLinesInserted(pos.line+1, insertedLines); + internalSetCaretXY(newPos); + setBlockBegin(newPos); + ensureCursorPosVisible(); break; case SelectionMode::Column: - insertedLines = doInsertTextByColumnMode(pos,text, newPos, startLine,endLine); + insertedLines = doInsertTextByColumnMode(pos,text, startLine,endLine); doLinesInserted(endLine-insertedLines+1,insertedLines); + if (!text.isEmpty()) { + int textLen = text.back().length(); + BufferCoord bb=blockBegin(); + BufferCoord be=blockEnd(); + bb.ch+=textLen; + be.ch+=textLen; + internalSetCaretXY(bb); + setBlockBegin(bb); + setBlockEnd(be); + ensureCursorPosVisible(); + } break; case SelectionMode::Line: insertedLines = doInsertTextByLineMode(pos,text, newPos); doLinesInserted(pos.line, insertedLines); + internalSetCaretXY(newPos); + setBlockBegin(newPos); + ensureCursorPosVisible(); break; } - internalSetCaretXY(newPos); - setBlockBegin(newPos); - ensureCursorPosVisible(); + } int SynEdit::doInsertTextByNormalMode(const BufferCoord& pos, const QStringList& text, BufferCoord &newPos) @@ -5594,7 +5612,7 @@ int SynEdit::doInsertTextByNormalMode(const BufferCoord& pos, const QStringList& return result; } -int SynEdit::doInsertTextByColumnMode(const BufferCoord& pos, const QStringList& text, BufferCoord &newPos, int startLine, int endLine) +int SynEdit::doInsertTextByColumnMode(const BufferCoord& pos, const QStringList& text, int startLine, int endLine) { QString str; QString tempString; @@ -5651,12 +5669,6 @@ int SynEdit::doInsertTextByColumnMode(const BufferCoord& pos, const QStringList& } line++; } - newPos=pos; - if (!text[0].isEmpty()) { - newPos.ch+=text[0].length(); -// mCaretX+=firstLineLen; -// mStatusChanges.setFlag(SynStatusChange::scCaretX); - } if (!mUndoing) { mUndoList->endBlock(); } @@ -6761,30 +6773,30 @@ BufferCoord SynEdit::blockEnd() const return mBlockEnd; } -void SynEdit::setBlockEnd(BufferCoord Value) +void SynEdit::setBlockEnd(BufferCoord value) { //setActiveSelectionMode(mSelectionMode); - Value.line = minMax(Value.line, 1, mDocument->count()); + value.line = minMax(value.line, 1, mDocument->count()); if (mActiveSelectionMode == SelectionMode::Normal) { - if (Value.line >= 1 && Value.line <= mDocument->count()) - Value.ch = std::min(Value.ch, getDisplayStringAtLine(Value.line).length() + 1); + if (value.line >= 1 && value.line <= mDocument->count()) + value.ch = std::min(value.ch, getDisplayStringAtLine(value.line).length() + 1); else - Value.ch = 1; + value.ch = 1; } else { int maxLen = mDocument->lengthOfLongestLine(); if (syntaxer()) maxLen = maxLen+stringColumns(syntaxer()->foldString(),maxLen); - Value.ch = minMax(Value.ch, 1, maxLen+1); + value.ch = minMax(value.ch, 1, maxLen+1); } - if (Value.ch != mBlockEnd.ch || Value.line != mBlockEnd.line) { - if (mActiveSelectionMode == SelectionMode::Column && Value.ch != mBlockEnd.ch) { + if (value.ch != mBlockEnd.ch || value.line != mBlockEnd.line) { + if (mActiveSelectionMode == SelectionMode::Column && value.ch != mBlockEnd.ch) { invalidateLines( - std::min(mBlockBegin.line, std::min(mBlockEnd.line, Value.line)), - std::max(mBlockBegin.line, std::max(mBlockEnd.line, Value.line))); - mBlockEnd = Value; + std::min(mBlockBegin.line, std::min(mBlockEnd.line, value.line)), + std::max(mBlockBegin.line, std::max(mBlockEnd.line, value.line))); + mBlockEnd = value; } else { int nLine = mBlockEnd.line; - mBlockEnd = Value; + mBlockEnd = value; if (mActiveSelectionMode != SelectionMode::Column || mBlockBegin.ch != mBlockEnd.ch) invalidateLines(nLine, mBlockEnd.line); } diff --git a/libs/qsynedit/qsynedit/SynEdit.h b/libs/qsynedit/qsynedit/SynEdit.h index 4d202e9a..a11d6fbe 100644 --- a/libs/qsynedit/qsynedit/SynEdit.h +++ b/libs/qsynedit/qsynedit/SynEdit.h @@ -550,7 +550,7 @@ private: void doDeleteText(BufferCoord startPos, BufferCoord endPos, SelectionMode mode); void doInsertText(const BufferCoord& pos, const QStringList& text, SelectionMode mode, int startLine, int endLine); int doInsertTextByNormalMode(const BufferCoord& pos, const QStringList& text, BufferCoord &newPos); - int doInsertTextByColumnMode(const BufferCoord& pos, const QStringList& text, BufferCoord &newPos, int startLine, int endLine); + int doInsertTextByColumnMode(const BufferCoord& pos, const QStringList& text, int startLine, int endLine); int doInsertTextByLineMode(const BufferCoord& pos, const QStringList& text, BufferCoord &newPos); void doTrimTrailingSpaces();