Merge branch 'master' of github.com:royqh1979/RedPanda-CPP

This commit is contained in:
Roy Qu 2022-12-16 09:10:57 +08:00
commit 7ddc30967d
29 changed files with 1324 additions and 1185 deletions

View File

@ -1,3 +1,9 @@
Red Panda C++ Version 2.7
- enhancement: Remove multiple problems in the problem set view
- enhancement: Clear the proble view after a new problem set created
- enhancement: "Remove trailing spaces" in options / editor / misc
Red Panda C++ Version 2.6
- enhancement: Highlighter for makefiles

View File

@ -10,7 +10,7 @@ isEmpty(APP_NAME) {
}
isEmpty(APP_VERSION) {
APP_VERSION = 2.6
APP_VERSION = 2.7
}
macos: {

View File

@ -265,6 +265,8 @@ bool Editor::save(bool force, bool doReparse) {
try {
if (pSettings->editor().autoFormatWhenSaved()) {
reformat(false);
} else if (pSettings->editor().removeTrailingSpacesWhenSaved()) {
trimTrailingSpaces();
}
saveFile(mFilename);
pMainWindow->fileSystemWatcher()->addPath(mFilename);
@ -356,6 +358,8 @@ bool Editor::saveAs(const QString &name, bool fromProject){
if (pSettings->editor().autoFormatWhenSaved()) {
reformat(false);
} else if (pSettings->editor().removeTrailingSpacesWhenSaved()) {
trimTrailingSpaces();
}
try {
mFilename = newName;
@ -521,7 +525,7 @@ void Editor::undoSymbolCompletion(int pos)
(pSettings->editor().completeBrace() && (DeletedChar == '{') && (NextChar == '}')) ||
(pSettings->editor().completeSingleQuote() && (DeletedChar == '\'') && (NextChar == '\'')) ||
(pSettings->editor().completeDoubleQuote() && (DeletedChar == '\"') && (NextChar == '\"'))) {
commandProcessor(QSynedit::EditCommand::ecDeleteChar);
processCommand(QSynedit::EditCommand::DeleteChar);
}
}
@ -723,7 +727,7 @@ void Editor::keyPressEvent(QKeyEvent *event)
if (mParser && mParser->isIncludeLine(lineText())
&& mLastIdCharPressed==pSettings->codeCompletion().minCharRequired()) {
// is a #include line
commandProcessor(QSynedit::EditCommand::ecChar,ch,nullptr);
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showHeaderCompletion(false);
handled=true;
return;
@ -731,12 +735,12 @@ void Editor::keyPressEvent(QKeyEvent *event)
QString lastWord = getPreviousWordAtPositionForSuggestion(caretXY());
if (mParser && !lastWord.isEmpty()) {
if (lastWord == "using") {
commandProcessor(QSynedit::EditCommand::ecChar,ch,nullptr);
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion(lastWord,false, CodeCompletionType::ComplexKeyword);
handled=true;
return;
} else if (lastWord == "namespace") {
commandProcessor(QSynedit::EditCommand::ecChar,ch,nullptr);
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion(lastWord,false, CodeCompletionType::Namespaces);
handled=true;
return;
@ -747,7 +751,7 @@ void Editor::keyPressEvent(QKeyEvent *event)
}
if (!currentScope || currentScope->kind == StatementKind::skNamespace) {
//may define a function
commandProcessor(QSynedit::EditCommand::ecChar,ch,nullptr);
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion(lastWord,false,CodeCompletionType::FunctionWithoutDefinition);
handled=true;
return;
@ -757,7 +761,7 @@ void Editor::keyPressEvent(QKeyEvent *event)
lastWord == "signed" ||
lastWord == "unsigned"
) {
commandProcessor(QSynedit::EditCommand::ecChar,ch,nullptr);
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion(lastWord,false, CodeCompletionType::ComplexKeyword);
handled=true;
return;
@ -783,7 +787,7 @@ void Editor::keyPressEvent(QKeyEvent *event)
}
if (!currentScope || currentScope->kind == StatementKind::skNamespace) {
//may define a function
commandProcessor(QSynedit::EditCommand::ecChar,ch,nullptr);
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion("",false,CodeCompletionType::FunctionWithoutDefinition);
handled=true;
return;
@ -801,13 +805,13 @@ void Editor::keyPressEvent(QKeyEvent *event)
}
if (!currentScope || currentScope->kind == StatementKind::skNamespace) {
//may define a function
commandProcessor(QSynedit::EditCommand::ecChar,ch,nullptr);
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion("",false,CodeCompletionType::FunctionWithoutDefinition);
handled=true;
return;
}
}
commandProcessor(QSynedit::EditCommand::ecChar,ch,nullptr);
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion("",false,CodeCompletionType::Normal);
handled=true;
return;
@ -819,7 +823,7 @@ void Editor::keyPressEvent(QKeyEvent *event)
if (pSettings->codeCompletion().enabled()
&& pSettings->codeCompletion().showCompletionWhileInput() ) {
mLastIdCharPressed++;
commandProcessor(QSynedit::EditCommand::ecChar,ch,nullptr);
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion("",false,CodeCompletionType::Normal);
handled=true;
return;
@ -831,7 +835,7 @@ void Editor::keyPressEvent(QKeyEvent *event)
if (pSettings->codeCompletion().enabled()
&& pSettings->codeCompletion().showCompletionWhileInput() ) {
mLastIdCharPressed++;
commandProcessor(QSynedit::EditCommand::ecChar,ch,nullptr);
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion("",false,CodeCompletionType::Normal);
handled=true;
return;
@ -1877,52 +1881,52 @@ bool Editor::notParsed()
void Editor::insertLine()
{
commandProcessor(QSynedit::EditCommand::ecInsertLine,QChar(),nullptr);
processCommand(QSynedit::EditCommand::InsertLine,QChar(),nullptr);
}
void Editor::deleteWord()
{
commandProcessor(QSynedit::EditCommand::ecDeleteWord,QChar(),nullptr);
processCommand(QSynedit::EditCommand::DeleteWord,QChar(),nullptr);
}
void Editor::deleteToWordStart()
{
commandProcessor(QSynedit::EditCommand::ecDeleteWordStart,QChar(),nullptr);
processCommand(QSynedit::EditCommand::DeleteWordStart,QChar(),nullptr);
}
void Editor::deleteToWordEnd()
{
commandProcessor(QSynedit::EditCommand::ecDeleteWordEnd,QChar(),nullptr);
processCommand(QSynedit::EditCommand::DeleteWordEnd,QChar(),nullptr);
}
void Editor::deleteLine()
{
commandProcessor(QSynedit::EditCommand::ecDeleteLine,QChar(),nullptr);
processCommand(QSynedit::EditCommand::DeleteLine,QChar(),nullptr);
}
void Editor::duplicateLine()
{
commandProcessor(QSynedit::EditCommand::ecDuplicateLine,QChar(),nullptr);
processCommand(QSynedit::EditCommand::DuplicateLine,QChar(),nullptr);
}
void Editor::deleteToEOL()
{
commandProcessor(QSynedit::EditCommand::ecDeleteEOL,QChar(),nullptr);
processCommand(QSynedit::EditCommand::DeleteEOL,QChar(),nullptr);
}
void Editor::deleteToBOL()
{
commandProcessor(QSynedit::EditCommand::ecDeleteBOL,QChar(),nullptr);
processCommand(QSynedit::EditCommand::DeleteBOL,QChar(),nullptr);
}
void Editor::gotoBlockStart()
{
commandProcessor(QSynedit::EditCommand::ecBlockStart,QChar(),nullptr);
processCommand(QSynedit::EditCommand::BlockStart,QChar(),nullptr);
}
void Editor::gotoBlockEnd()
{
commandProcessor(QSynedit::EditCommand::ecBlockEnd,QChar(),nullptr);
processCommand(QSynedit::EditCommand::BlockEnd,QChar(),nullptr);
}
QStringList Editor::getOwnerExpressionAndMemberAtPositionForCompletion(
@ -2302,17 +2306,17 @@ bool Editor::handleParentheseCompletion()
QString text=selText();
beginUpdate();
beginUndoBlock();
commandProcessor(QSynedit::EditCommand::ecChar,'(');
processCommand(QSynedit::EditCommand::Char,'(');
setSelText(text);
commandProcessor(QSynedit::EditCommand::ecChar,')');
processCommand(QSynedit::EditCommand::Char,')');
endUndoBlock();
endUpdate();
} else {
beginUpdate();
beginUndoBlock();
commandProcessor(QSynedit::EditCommand::ecChar,'(');
processCommand(QSynedit::EditCommand::Char,'(');
QSynedit::BufferCoord oldCaret = caretXY();
commandProcessor(QSynedit::EditCommand::ecChar,')');
processCommand(QSynedit::EditCommand::Char,')');
setCaretXY(oldCaret);
endUndoBlock();
endUpdate();
@ -2363,17 +2367,17 @@ bool Editor::handleBracketCompletion()
QString text=selText();
beginUpdate();
beginUndoBlock();
commandProcessor(QSynedit::EditCommand::ecChar,'[');
processCommand(QSynedit::EditCommand::Char,'[');
setSelText(text);
commandProcessor(QSynedit::EditCommand::ecChar,']');
processCommand(QSynedit::EditCommand::Char,']');
endUndoBlock();
endUpdate();
} else {
beginUpdate();
beginUndoBlock();
commandProcessor(QSynedit::EditCommand::ecChar,'[');
processCommand(QSynedit::EditCommand::Char,'[');
QSynedit::BufferCoord oldCaret = caretXY();
commandProcessor(QSynedit::EditCommand::ecChar,']');
processCommand(QSynedit::EditCommand::Char,']');
setCaretXY(oldCaret);
endUndoBlock();
endUpdate();
@ -2411,14 +2415,14 @@ bool Editor::handleMultilineCommentCompletion()
QString text=selText();
beginUpdate();
beginUndoBlock();
commandProcessor(QSynedit::EditCommand::ecChar,'*');
processCommand(QSynedit::EditCommand::Char,'*');
QSynedit::BufferCoord oldCaret;
if (text.isEmpty())
oldCaret = caretXY();
else
setSelText(text);
commandProcessor(QSynedit::EditCommand::ecChar,'*');
commandProcessor(QSynedit::EditCommand::ecChar,'/');
processCommand(QSynedit::EditCommand::Char,'*');
processCommand(QSynedit::EditCommand::Char,'/');
if (text.isEmpty())
setCaretXY(oldCaret);
endUndoBlock();
@ -2439,16 +2443,16 @@ bool Editor::handleBraceCompletion()
QString text=selText();
beginUpdate();
beginUndoBlock();
commandProcessor(QSynedit::EditCommand::ecChar,'{');
processCommand(QSynedit::EditCommand::Char,'{');
QSynedit::BufferCoord oldCaret;
if (text.isEmpty()) {
oldCaret = caretXY();
} else {
commandProcessor(QSynedit::EditCommand::ecInsertLine);
processCommand(QSynedit::EditCommand::InsertLine);
setSelText(text);
commandProcessor(QSynedit::EditCommand::ecInsertLine);
processCommand(QSynedit::EditCommand::InsertLine);
}
commandProcessor(QSynedit::EditCommand::ecChar,'}');
processCommand(QSynedit::EditCommand::Char,'}');
if (
( (s.startsWith("struct")
|| s.startsWith("class")
@ -2459,7 +2463,7 @@ bool Editor::handleBraceCompletion()
|| s.startsWith("enum") )
&& !s.contains(';')
) || s.endsWith('=')) {
commandProcessor(QSynedit::EditCommand::ecChar,';');
processCommand(QSynedit::EditCommand::Char,';');
}
if (text.isEmpty())
setCaretXY(oldCaret);
@ -2481,7 +2485,7 @@ bool Editor::handleBraceSkip()
if (lastLineState.braceLevel==0) {
bool oldInsertMode = insertMode();
setInsertMode(false); //set mode to overwrite
commandProcessor(QSynedit::EditCommand::ecChar,'}');
processCommand(QSynedit::EditCommand::Char,'}');
setInsertMode(oldInsertMode);
return true;
}
@ -2490,7 +2494,7 @@ bool Editor::handleBraceSkip()
if (pos.line != 0) {
bool oldInsertMode = insertMode();
setInsertMode(false); //set mode to overwrite
commandProcessor(QSynedit::EditCommand::ecChar,'}');
processCommand(QSynedit::EditCommand::Char,'}');
setInsertMode(oldInsertMode);
return true;
}
@ -2513,9 +2517,9 @@ bool Editor::handleSingleQuoteCompletion()
QString text=selText();
beginUpdate();
beginUndoBlock();
commandProcessor(QSynedit::EditCommand::ecChar,'\'');
processCommand(QSynedit::EditCommand::Char,'\'');
setSelText(text);
commandProcessor(QSynedit::EditCommand::ecChar,'\'');
processCommand(QSynedit::EditCommand::Char,'\'');
endUndoBlock();
endUpdate();
return true;
@ -2524,9 +2528,9 @@ bool Editor::handleSingleQuoteCompletion()
// insert ''
beginUpdate();
beginUndoBlock();
commandProcessor(QSynedit::EditCommand::ecChar,'\'');
processCommand(QSynedit::EditCommand::Char,'\'');
QSynedit::BufferCoord oldCaret = caretXY();
commandProcessor(QSynedit::EditCommand::ecChar,'\'');
processCommand(QSynedit::EditCommand::Char,'\'');
setCaretXY(oldCaret);
endUndoBlock();
endUpdate();
@ -2553,9 +2557,9 @@ bool Editor::handleDoubleQuoteCompletion()
QString text=selText();
beginUpdate();
beginUndoBlock();
commandProcessor(QSynedit::EditCommand::ecChar,'"');
processCommand(QSynedit::EditCommand::Char,'"');
setSelText(text);
commandProcessor(QSynedit::EditCommand::ecChar,'"');
processCommand(QSynedit::EditCommand::Char,'"');
endUndoBlock();
endUpdate();
return true;
@ -2564,9 +2568,9 @@ bool Editor::handleDoubleQuoteCompletion()
// insert ""
beginUpdate();
beginUndoBlock();
commandProcessor(QSynedit::EditCommand::ecChar,'"');
processCommand(QSynedit::EditCommand::Char,'"');
QSynedit::BufferCoord oldCaret = caretXY();
commandProcessor(QSynedit::EditCommand::ecChar,'"');
processCommand(QSynedit::EditCommand::Char,'"');
setCaretXY(oldCaret);
endUndoBlock();
endUpdate();
@ -2586,9 +2590,9 @@ bool Editor::handleGlobalIncludeCompletion()
return false;
beginUpdate();
beginUndoBlock();
commandProcessor(QSynedit::EditCommand::ecChar,'<');
processCommand(QSynedit::EditCommand::Char,'<');
QSynedit::BufferCoord oldCaret = caretXY();
commandProcessor(QSynedit::EditCommand::ecChar,'>');
processCommand(QSynedit::EditCommand::Char,'>');
setCaretXY(oldCaret);
endUpdate();
endUndoBlock();
@ -2617,17 +2621,17 @@ bool Editor::handleCodeCompletion(QChar key)
if (mParser) {
switch(key.unicode()) {
case '.':
commandProcessor(QSynedit::EditCommand::ecChar, key);
processCommand(QSynedit::EditCommand::Char, key);
showCompletion("",false,CodeCompletionType::Normal);
return true;
case '>':
commandProcessor(QSynedit::EditCommand::ecChar, key);
processCommand(QSynedit::EditCommand::Char, key);
if ((caretX() > 2) && (lineText().length() >= 2) &&
(lineText()[caretX() - 3] == '-'))
showCompletion("",false,CodeCompletionType::Normal);
return true;
case ':':
commandProcessor(QSynedit::EditCommand::ecChar,':',nullptr);
processCommand(QSynedit::EditCommand::Char,':',nullptr);
//setSelText(key);
if ((caretX() > 2) && (lineText().length() >= 2) &&
(lineText()[caretX() - 3] == ':'))
@ -2635,7 +2639,7 @@ bool Editor::handleCodeCompletion(QChar key)
return true;
case '/':
case '\\':
commandProcessor(QSynedit::EditCommand::ecChar, key);
processCommand(QSynedit::EditCommand::Char, key);
if (mParser->isIncludeLine(lineText())) {
showHeaderCompletion(false);
}
@ -3395,8 +3399,8 @@ bool Editor::onCompletionKeyPressed(QKeyEvent *event)
//ignore it
return true;
case Qt::Key_Backspace:
commandProcessor(
QSynedit::EditCommand::ecDeleteLastChar,
processCommand(
QSynedit::EditCommand::DeleteLastChar,
QChar(), nullptr); // Simulate backspace in editor
if (purpose == WordPurpose::wpCompletion) {
phrase = getWordForCompletionSearch(caretXY(), mCompletionPopup->memberOperator()=="::");
@ -3429,7 +3433,7 @@ bool Editor::onCompletionKeyPressed(QKeyEvent *event)
}
QChar ch = event->text().front();
if (isIdentChar(ch)) {
commandProcessor(QSynedit::EditCommand::ecChar, ch);
processCommand(QSynedit::EditCommand::Char, ch);
if (purpose == WordPurpose::wpCompletion) {
phrase = getWordForCompletionSearch(caretXY(),mCompletionPopup->memberOperator()=="::");
} else
@ -3457,8 +3461,8 @@ bool Editor::onHeaderCompletionKeyPressed(QKeyEvent *event)
QSynedit::BufferCoord pBeginPos,pEndPos;
switch (event->key()) {
case Qt::Key_Backspace:
commandProcessor(
QSynedit::EditCommand::ecDeleteLastChar,
processCommand(
QSynedit::EditCommand::DeleteLastChar,
QChar(), nullptr); // Simulate backspace in editor
phrase = getWordAtPosition(this,caretXY(),
pBeginPos,pEndPos,
@ -3489,7 +3493,7 @@ bool Editor::onHeaderCompletionKeyPressed(QKeyEvent *event)
if (isIdentChar(ch) || ch == '.'
|| ch =='_' || ch=='+') {
commandProcessor(QSynedit::EditCommand::ecChar, ch);
processCommand(QSynedit::EditCommand::Char, ch);
phrase = getWordAtPosition(this,caretXY(),
pBeginPos,pEndPos,
WordPurpose::wpHeaderCompletion);
@ -4698,7 +4702,10 @@ void Editor::applySettings()
{
QSynedit::EditorOptions options = QSynedit::eoAltSetsColumnMode |
QSynedit::eoDragDropEditing | QSynedit::eoDropFiles | QSynedit::eoKeepCaretX | QSynedit::eoTabsToSpaces |
QSynedit::eoRightMouseMovesCursor | QSynedit::eoScrollByOneLess | QSynedit::eoTabIndent | QSynedit::eoHideShowScrollbars | QSynedit::eoGroupUndo;
QSynedit::eoRightMouseMovesCursor | QSynedit::eoScrollByOneLess | QSynedit::eoTabIndent | QSynedit::eoHideShowScrollbars | QSynedit::eoGroupUndo
| QSynedit::eoSelectWordByDblClick;
options.setFlag(QSynedit::eoShowSpecialChars, false);
//options
options.setFlag(QSynedit::eoAutoIndent,pSettings->editor().autoIndent());

View File

@ -7789,6 +7789,7 @@ void MainWindow::on_btnNewProblemSet_clicked()
mOJProblemSetNameCounter++;
mOJProblemSetModel.create(tr("Problem Set %1").arg(mOJProblemSetNameCounter));
ui->lblProblemSet->setText(mOJProblemSetModel.name());
onProblemSetIndexChanged(QModelIndex(),QModelIndex());
}
@ -7810,10 +7811,17 @@ void MainWindow::on_btnAddProblem_clicked()
void MainWindow::on_btnRemoveProblem_clicked()
{
QModelIndex idx = ui->lstProblemSet->currentIndex();
if (!idx.isValid())
return;
mOJProblemSetModel.removeProblem(idx.row());
QList<int> idxList;
foreach (const QModelIndex idx,ui->lstProblemSet->selectionModel()->selectedIndexes()) {
idxList.append(idx.row());
}
std::sort(idxList.begin(),idxList.end(),[](int i1, int i2){
return i1>i2;
});
foreach (int id,idxList) {
mOJProblemSetModel.removeProblem(id);
}
}

View File

@ -879,6 +879,9 @@
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>

View File

@ -720,6 +720,16 @@ void Settings::Editor::setEnableCustomCTypeKeywords(bool newEnableCustomCTypeKey
mEnableCustomCTypeKeywords = newEnableCustomCTypeKeywords;
}
bool Settings::Editor::removeTrailingSpacesWhenSaved() const
{
return mRemoveTrailingSpacesWhenSaved;
}
void Settings::Editor::setRemoveTrailingSpacesWhenSaved(bool newRemoveTrailingSpacesWhenSaved)
{
mRemoveTrailingSpacesWhenSaved = newRemoveTrailingSpacesWhenSaved;
}
bool Settings::Editor::highlightCurrentWord() const
{
return mHighlightCurrentWord;
@ -1301,6 +1311,7 @@ void Settings::Editor::doSave()
saveValue("undo_limit",mUndoLimit);
saveValue("undo_memory_usage", mUndoMemoryUsage);
saveValue("auto_format_when_saved", mAutoFormatWhenSaved);
saveValue("remove_trailing_spaces_when_saved",mRemoveTrailingSpacesWhenSaved);
saveValue("parse_todos",mParseTodos);
saveValue("custom_c_type_keywords", mCustomCTypeKeywords);
@ -1448,6 +1459,7 @@ void Settings::Editor::doLoad()
mUndoLimit = intValue("undo_limit",0);
mUndoMemoryUsage = intValue("undo_memory_usage", 10);
mAutoFormatWhenSaved = boolValue("auto_format_when_saved", false);
mRemoveTrailingSpacesWhenSaved = boolValue("remove_trailing_spaces_when_saved",false);
mParseTodos = boolValue("parse_todos",true);
mCustomCTypeKeywords = stringListValue("custom_c_type_keywords");

View File

@ -379,6 +379,9 @@ public:
bool enableCustomCTypeKeywords() const;
void setEnableCustomCTypeKeywords(bool newEnableCustomCTypeKeywords);
bool removeTrailingSpacesWhenSaved() const;
void setRemoveTrailingSpacesWhenSaved(bool newRemoveTrailingSpacesWhenSaved);
private:
//General
// indents
@ -488,6 +491,7 @@ public:
int mUndoLimit;
int mUndoMemoryUsage;
bool mAutoFormatWhenSaved;
bool mRemoveTrailingSpacesWhenSaved;
bool mParseTodos;
QStringList mCustomCTypeKeywords;

View File

@ -66,7 +66,13 @@ void EditorMiscWidget::doLoad()
}
ui->spinMaxUndo->setValue(pSettings->editor().undoLimit());
ui->spinMaxUndoMemory->setValue(pSettings->editor().undoMemoryUsage());
ui->chkAutoReformat->setChecked(pSettings->editor().autoFormatWhenSaved());
if (pSettings->editor().removeTrailingSpacesWhenSaved())
ui->rbRemoveTrailingSpaces->setChecked(true);
else if (pSettings->editor().autoFormatWhenSaved())
ui->rbAutoReformat->setChecked(true);
else
ui->rbNone->setChecked(true);
ui->chkParseTodos->setChecked(pSettings->editor().parseTodos());
}
@ -84,7 +90,8 @@ void EditorMiscWidget::doSave()
}
pSettings->editor().setUndoLimit(ui->spinMaxUndo->value());
pSettings->editor().setUndoMemoryUsage(ui->spinMaxUndoMemory->value());
pSettings->editor().setAutoFormatWhenSaved(ui->chkAutoReformat->isChecked());
pSettings->editor().setAutoFormatWhenSaved(ui->rbAutoReformat->isChecked());
pSettings->editor().setRemoveTrailingSpacesWhenSaved(ui->rbRemoveTrailingSpaces->isChecked());
pSettings->editor().setParseTodos(ui->chkParseTodos->isChecked());

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>515</width>
<height>408</height>
<height>510</height>
</rect>
</property>
<property name="windowTitle">
@ -36,10 +36,55 @@
</widget>
</item>
<item>
<widget class="QCheckBox" name="chkAutoReformat">
<property name="text">
<string>Auto reformat code before saving files</string>
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>Limits for Undo</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Memory Usage</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinMaxUndo">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>1000000000</number>
</property>
<property name="singleStep">
<number>50</number>
</property>
<property name="value">
<number>10000</number>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Steps</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QSpinBox" name="spinMaxUndoMemory">
<property name="suffix">
<string>MB</string>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
@ -57,42 +102,6 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Max Undo Steps</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinMaxUndo">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>1000000000</number>
</property>
<property name="singleStep">
<number>50</number>
</property>
<property name="value">
<number>10000</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
@ -111,28 +120,38 @@
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Action before saving files</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1">
<widget class="QRadioButton" name="rbAutoReformat">
<property name="text">
<string>Max Undo Memory Usage</string>
<string>Reformat Code</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinMaxUndoMemory">
<property name="suffix">
<string>MB</string>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
<item row="0" column="2">
<widget class="QRadioButton" name="rbRemoveTrailingSpaces">
<property name="text">
<string>Remove Trailing Spaces</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<item row="0" column="0">
<widget class="QRadioButton" name="rbNone">
<property name="text">
<string>None</string>
</property>
</widget>
</item>
<item row="0" column="3">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -187,7 +206,14 @@
<property name="title">
<string>Default file type</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QRadioButton" name="rbCFile">
<property name="text">
<string>C files</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbCppFile">
<property name="text">
@ -196,11 +222,17 @@
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbCFile">
<property name="text">
<string>C files</string>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>

View File

@ -1433,7 +1433,7 @@
</message>
<message>
<source>Max Undo Steps</source>
<translation>Quantidade máxima de passos a serem desfeitos</translation>
<translation type="vanished">Quantidade máxima de passos a serem desfeitos</translation>
</message>
<message>
<source>Default file encoding</source>
@ -1463,20 +1463,40 @@
<source>UTF-8 BOM</source>
<translation>UTF-8 BOM</translation>
</message>
<message>
<source>Max Undo Memory Usage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MB</source>
<translation type="unfinished">MB</translation>
</message>
<message>
<source>Auto reformat code before saving files</source>
<source>Parse TODOs</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Parse TODOs</source>
<source>Memory Usage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Steps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Action before saving files</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reformat Code</source>
<translation type="unfinished">Reformatar código</translation>
</message>
<message>
<source>Remove Trailing Spaces</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Limits for Undo</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -6947,6 +6967,10 @@
<source>Command: %1 %2</source>
<translation>Comando: %1 %2</translation>
</message>
<message>
<source>Compiling...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SymbolUsageManager</name>

File diff suppressed because it is too large Load Diff

View File

@ -1324,10 +1324,6 @@
<source>Auto detect encoding when openning files</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Max Undo Steps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Default file encoding</source>
<translation type="unfinished"></translation>
@ -1356,20 +1352,40 @@
<source>UTF-8 BOM</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Max Undo Memory Usage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MB</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto reformat code before saving files</source>
<source>Parse TODOs</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Parse TODOs</source>
<source>Memory Usage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Steps</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Action before saving files</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reformat Code</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove Trailing Spaces</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Limits for Undo</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -6560,6 +6576,10 @@
<source>Command: %1 %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Compiling...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SymbolUsageManager</name>

View File

@ -33,7 +33,7 @@ RedPandaIDE.depends += redpanda-git-askpass
APP_NAME = RedPandaCPP
APP_VERSION = 2.6
APP_VERSION = 2.7
linux: {
isEmpty(PREFIX) {

View File

@ -24,7 +24,7 @@ EditKeyStroke::EditKeyStroke()
mKeyModifiers = Qt::NoModifier;
mKey2 = 0;
mKeyModifiers2 = Qt::NoModifier;
mCommand = EditCommand::ecNone;
mCommand = EditCommand::None;
}
QKeySequence EditKeyStroke::keySequence() const
@ -181,105 +181,71 @@ void EditKeyStrokes::clear()
void EditKeyStrokes::resetDefaults()
{
clear();
add(EditCommand::ecUp, Qt::Key_Up, Qt::NoModifier);
add(EditCommand::ecSelUp, Qt::Key_Up, Qt::ShiftModifier);
add(EditCommand::ecSelUp, Qt::Key_Up, Qt::ShiftModifier | Qt::AltModifier);
add(EditCommand::ecScrollUp, Qt::Key_Up, Qt::ControlModifier);
add(EditCommand::ecDown, Qt::Key_Down, Qt::NoModifier);
add(EditCommand::ecSelDown, Qt::Key_Down, Qt::ShiftModifier);
add(EditCommand::ecSelDown, Qt::Key_Down, Qt::ShiftModifier | Qt::AltModifier);
add(EditCommand::ecScrollDown, Qt::Key_Down, Qt::ControlModifier);
add(EditCommand::ecLeft, Qt::Key_Left, Qt::NoModifier);
add(EditCommand::ecSelLeft, Qt::Key_Left, Qt::ShiftModifier);
add(EditCommand::ecWordLeft, Qt::Key_Left, Qt::ControlModifier);
add(EditCommand::ecSelWordLeft, Qt::Key_Left, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::ecRight, Qt::Key_Right, Qt::NoModifier);
add(EditCommand::ecSelRight, Qt::Key_Right, Qt::ShiftModifier);
add(EditCommand::ecWordRight, Qt::Key_Right, Qt::ControlModifier);
add(EditCommand::ecSelWordRight, Qt::Key_Right, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::Up, Qt::Key_Up, Qt::NoModifier);
add(EditCommand::SelUp, Qt::Key_Up, Qt::ShiftModifier);
add(EditCommand::SelUp, Qt::Key_Up, Qt::ShiftModifier | Qt::AltModifier);
add(EditCommand::ScrollUp, Qt::Key_Up, Qt::ControlModifier);
add(EditCommand::Down, Qt::Key_Down, Qt::NoModifier);
add(EditCommand::SelDown, Qt::Key_Down, Qt::ShiftModifier);
add(EditCommand::SelDown, Qt::Key_Down, Qt::ShiftModifier | Qt::AltModifier);
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::WordLeft, Qt::Key_Left, Qt::ControlModifier);
add(EditCommand::SelWordLeft, Qt::Key_Left, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::Right, Qt::Key_Right, Qt::NoModifier);
add(EditCommand::SelRight, Qt::Key_Right, Qt::ShiftModifier);
add(EditCommand::WordRight, Qt::Key_Right, Qt::ControlModifier);
add(EditCommand::SelWordRight, Qt::Key_Right, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::ecBlockStart, Qt::Key_Up, Qt::MetaModifier|Qt::ControlModifier);
add(EditCommand::ecSelBlockStart, Qt::Key_Up, Qt::ShiftModifier|Qt::ControlModifier|Qt::MetaModifier);
add(EditCommand::ecBlockEnd, Qt::Key_Down, Qt::MetaModifier|Qt::ControlModifier);
add(EditCommand::ecSelBlockEnd, Qt::Key_Down, Qt::ShiftModifier|Qt::ControlModifier|Qt::MetaModifier);
add(EditCommand::BlockStart, Qt::Key_Up, Qt::MetaModifier|Qt::ControlModifier);
add(EditCommand::SelBlockStart, Qt::Key_Up, Qt::ShiftModifier|Qt::ControlModifier|Qt::MetaModifier);
add(EditCommand::BlockEnd, Qt::Key_Down, Qt::MetaModifier|Qt::ControlModifier);
add(EditCommand::SelBlockEnd, Qt::Key_Down, Qt::ShiftModifier|Qt::ControlModifier|Qt::MetaModifier);
// add(SynEditorCommand::ecExpandSelection, Qt::Key_Right, Qt::ShiftModifier|Qt::AltModifier);
// add(SynEditorCommand::ecShrinkSelection, Qt::Key_Left, Qt::ShiftModifier | Qt::AltModifier);
add(EditCommand::PageDown, Qt::Key_PageDown, Qt::NoModifier);
add(EditCommand::SelPageDown, Qt::Key_PageDown, Qt::ShiftModifier);
add(EditCommand::PageBottom, Qt::Key_PageDown, Qt::ControlModifier);
add(EditCommand::SelPageBottom, Qt::Key_PageDown, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::PageUp, Qt::Key_PageUp, Qt::NoModifier);
add(EditCommand::SelPageUp, Qt::Key_PageUp, Qt::ShiftModifier);
add(EditCommand::PageTop, Qt::Key_PageUp, Qt::ControlModifier);
add(EditCommand::SelPageTop, Qt::Key_PageUp, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::LineStart, Qt::Key_Home, Qt::NoModifier);
add(EditCommand::SelLineStart, Qt::Key_Home, Qt::ShiftModifier);
add(EditCommand::EditorStart, Qt::Key_Home, Qt::ControlModifier);
add(EditCommand::SelEditorStart, Qt::Key_Home, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::LineEnd, Qt::Key_End, Qt::NoModifier);
add(EditCommand::SelLineEnd, Qt::Key_End, Qt::ShiftModifier);
add(EditCommand::EditorEnd, Qt::Key_End, Qt::ControlModifier);
add(EditCommand::SelEditorEnd, Qt::Key_End, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::ToggleMode, Qt::Key_Insert, Qt::NoModifier);
add(EditCommand::DeleteChar, Qt::Key_Delete, Qt::NoModifier);
add(EditCommand::DeleteLastChar, Qt::Key_Backspace, Qt::NoModifier);
add(EditCommand::LineBreak, Qt::Key_Return, Qt::NoModifier);
add(EditCommand::LineBreak, Qt::Key_Return, Qt::ShiftModifier);
add(EditCommand::LineBreakAtEnd, Qt::Key_Return, Qt::ControlModifier);
add(EditCommand::LineBreak, Qt::Key_Enter, Qt::NoModifier);
add(EditCommand::LineBreak, Qt::Key_Enter, Qt::ShiftModifier);
add(EditCommand::LineBreakAtEnd, Qt::Key_Enter, Qt::ControlModifier);
add(EditCommand::ecPageDown, Qt::Key_PageDown, Qt::NoModifier);
add(EditCommand::ecSelPageDown, Qt::Key_PageDown, Qt::ShiftModifier);
add(EditCommand::ecPageBottom, Qt::Key_PageDown, Qt::ControlModifier);
add(EditCommand::ecSelPageBottom, Qt::Key_PageDown, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::ecPageUp, Qt::Key_PageUp, Qt::NoModifier);
add(EditCommand::ecSelPageUp, Qt::Key_PageUp, Qt::ShiftModifier);
add(EditCommand::ecPageTop, Qt::Key_PageUp, Qt::ControlModifier);
add(EditCommand::ecSelPageTop, Qt::Key_PageUp, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::ecLineStart, Qt::Key_Home, Qt::NoModifier);
add(EditCommand::ecSelLineStart, Qt::Key_Home, Qt::ShiftModifier);
add(EditCommand::ecEditorStart, Qt::Key_Home, Qt::ControlModifier);
add(EditCommand::ecSelEditorStart, Qt::Key_Home, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::ecLineEnd, Qt::Key_End, Qt::NoModifier);
add(EditCommand::ecSelLineEnd, Qt::Key_End, Qt::ShiftModifier);
add(EditCommand::ecEditorEnd, Qt::Key_End, Qt::ControlModifier);
add(EditCommand::ecSelEditorEnd, Qt::Key_End, Qt::ShiftModifier|Qt::ControlModifier);
add(EditCommand::ecToggleMode, Qt::Key_Insert, Qt::NoModifier);
// add(SynEditorCommand::ecCopy, Qt::Key_Insert, Qt::ControlModifier);
// add(SynEditorCommand::ecCut, Qt::Key_Delete, Qt::ShiftModifier);
// add(SynEditorCommand::ecPaste, Qt::Key_Insert, Qt::ShiftModifier);
add(EditCommand::ecDeleteChar, Qt::Key_Delete, Qt::NoModifier);
add(EditCommand::ecDeleteLastChar, Qt::Key_Backspace, Qt::NoModifier);
// add(SynEditorCommand::ecDeleteLastChar, Qt::Key_Backspace, Qt::ShiftModifier);
// add(SynEditorCommand::ecDeleteWordStart, Qt::Key_Backspace, Qt::ControlModifier);
// add(SynEditorCommand::ecDeleteWordEnd, Qt::Key_Delete, Qt::ControlModifier);
// add(SynEditorCommand::ecUndo, Qt::Key_Backspace, Qt::AltModifier);
// add(SynEditorCommand::ecRedo, Qt::Key_Backspace, Qt::AltModifier|Qt::ShiftModifier);
add(EditCommand::ecLineBreak, Qt::Key_Return, Qt::NoModifier);
add(EditCommand::ecLineBreak, Qt::Key_Return, Qt::ShiftModifier);
add(EditCommand::ecLineBreakAtEnd, Qt::Key_Return, Qt::ControlModifier);
add(EditCommand::ecLineBreak, Qt::Key_Enter, Qt::NoModifier);
add(EditCommand::ecLineBreak, Qt::Key_Enter, Qt::ShiftModifier);
add(EditCommand::ecLineBreakAtEnd, Qt::Key_Enter, Qt::ControlModifier);
// add(SynEditorCommand::ecTab, Qt::Key_Tab, Qt::NoModifier);
// add(SynEditorCommand::ecShiftTab, Qt::Key_Backtab, Qt::ShiftModifier);
// add(SynEditorCommand::ecShiftTab, Qt::Key_Tab, Qt::ShiftModifier);
add(EditCommand::ecContextHelp, Qt::Key_F1, Qt::NoModifier);
// add(SynEditorCommand::ecSelectAll, Qt::Key_A, Qt::ControlModifier);
// add(SynEditorCommand::ecCopy, Qt::Key_C, Qt::ControlModifier);
// add(SynEditorCommand::ecPaste, Qt::Key_V, Qt::ControlModifier);
// add(SynEditorCommand::ecCut, Qt::Key_X, Qt::ControlModifier);
// add(SynEditorCommand::ecBlockIndent, Qt::Key_I, Qt::ControlModifier|Qt::ShiftModifier);
// add(SynEditorCommand::ecBlockUnindent, Qt::Key_U, Qt::ControlModifier|Qt::ShiftModifier);
// add(SynEditorCommand::ecLineBreak, Qt::Key_M, Qt::ControlModifier);
// add(SynEditorCommand::ecInsertLine, Qt::Key_N, Qt::ControlModifier);
// add(SynEditorCommand::ecDeleteWord, Qt::Key_T, Qt::ControlModifier);
// add(SynEditorCommand::ecDeleteLine, Qt::Key_Y, Qt::ControlModifier);
// add(SynEditorCommand::ecDeleteEOL, Qt::Key_Y, Qt::ControlModifier|Qt::ShiftModifier);
// add(SynEditorCommand::ecDuplicateLine, Qt::Key_D, Qt::ControlModifier);
// add(SynEditorCommand::ecUndo, Qt::Key_Z, Qt::ControlModifier);
// add(SynEditorCommand::ecRedo, Qt::Key_Z, Qt::ControlModifier|Qt::ShiftModifier);
// add(SynEditorCommand::ecNormalSelect, Qt::Key_N, Qt::ControlModifier | Qt::ShiftModifier);
// add(SynEditorCommand::ecColumnSelect, Qt::Key_C, Qt::ControlModifier | Qt::ShiftModifier);
// add(SynEditorCommand::ecLineSelect, Qt::Key_L, Qt::ControlModifier | Qt::ShiftModifier);
// add(SynEditorCommand::ecMatchBracket, Qt::Key_B, Qt::ControlModifier | Qt::ShiftModifier);
}
void EditKeyStrokes::setExtraKeyStrokes()
{
add(EditCommand::ecDeleteWordStart, Qt::Key_Backspace, Qt::ControlModifier);
add(EditCommand::ecDeleteWordEnd, Qt::Key_Delete, Qt::ControlModifier);
add(EditCommand::DeleteWordStart, Qt::Key_Backspace, Qt::ControlModifier);
add(EditCommand::DeleteWordEnd, Qt::Key_Delete, Qt::ControlModifier);
add(EditCommand::ecDuplicateLine, Qt::Key_D, Qt::ControlModifier);
add(EditCommand::ecDeleteLine, Qt::Key_E, Qt::ControlModifier);
add(EditCommand::DuplicateLine, Qt::Key_D, Qt::ControlModifier);
add(EditCommand::DeleteLine, Qt::Key_E, Qt::ControlModifier);
add(EditCommand::ecSelectAll, Qt::Key_A, Qt::ControlModifier);
add(EditCommand::ecCopy, Qt::Key_C, Qt::ControlModifier);
add(EditCommand::ecPaste, Qt::Key_V, Qt::ControlModifier);
add(EditCommand::ecCut, Qt::Key_X, Qt::ControlModifier);
add(EditCommand::SelectAll, Qt::Key_A, Qt::ControlModifier);
add(EditCommand::Copy, Qt::Key_C, Qt::ControlModifier);
add(EditCommand::Paste, Qt::Key_V, Qt::ControlModifier);
add(EditCommand::Cut, Qt::Key_X, Qt::ControlModifier);
add(EditCommand::ecUndo, Qt::Key_Z, Qt::ControlModifier);
add(EditCommand::ecRedo, Qt::Key_Y, Qt::ControlModifier);
add(EditCommand::Undo, Qt::Key_Z, Qt::ControlModifier);
add(EditCommand::Redo, Qt::Key_Y, Qt::ControlModifier);
}
}

View File

@ -39,144 +39,139 @@ namespace QSynedit {
// read-only mode
enum class EditCommand {
ecNone = 0, // Nothing. Useful for user event to handle command
ecViewCommandFirst = 0,
ecViewCommandLast = 500,
ecEditCommandFirst = 501,
ecEditCommandLast = 1000,
None = 0, // Nothing. Useful for user event to handle command
ecLeft = 1, // Move cursor left one char
ecRight = 2, // Move cursor right one char
ecUp = 3, // Move cursor up one line
ecDown = 4, // Move cursor down one line
ecWordLeft = 5, // Move cursor left one word
ecWordRight = 6, // Move cursor right one word
ecLineStart = 7, // Move cursor to beginning of line
ecLineEnd = 8, // Move cursor to end of line
ecPageUp = 9, // Move cursor up one page
ecPageDown = 10, // Move cursor down one page
ecPageLeft = 11, // Move cursor right one page
ecPageRight = 12, // Move cursor left one page
ecPageTop = 13, // Move cursor to top of page
ecPageBottom = 14, // Move cursor to bottom of page
ecEditorStart = 15, // Move cursor to absolute beginning
ecEditorEnd = 16, // Move cursor to absolute end
ecGotoXY = 17, // Move cursor to specific coordinates, Data = PPoint
ecBlockStart = 18, // Move cursor to begin of block
ecBlockEnd = 19, // Move cursor to end of block
Left = 1, // Move cursor left one char
Right = 2, // Move cursor right one char
Up = 3, // Move cursor up one line
Down = 4, // Move cursor down one line
WordLeft = 5, // Move cursor left one word
WordRight = 6, // Move cursor right one word
LineStart = 7, // Move cursor to beginning of line
LineEnd = 8, // Move cursor to end of line
PageUp = 9, // Move cursor up one page
PageDown = 10, // Move cursor down one page
PageLeft = 11, // Move cursor right one page
PageRight = 12, // Move cursor left one page
PageTop = 13, // Move cursor to top of page
PageBottom = 14, // Move cursor to bottom of page
EditorStart = 15, // Move cursor to absolute beginning
EditorEnd = 16, // Move cursor to absolute end
GotoXY = 17, // Move cursor to specific coordinates, Data = PPoint
BlockStart = 18, // Move cursor to begin of block
BlockEnd = 19, // Move cursor to end of block
//******************************************************************************
// Maybe the command processor should just take a boolean that signifies if
// selection is affected or not?
//******************************************************************************
ecSelection = 100, // Add this to ecXXX command to get equivalent
Selection = 100, // Add this to ecXXX command to get equivalent
// command, but with selection enabled. This is not
// a command itself.
// Same as commands above, except they affect selection, too
ecSelLeft = ecLeft + ecSelection,
ecSelRight = ecRight + ecSelection,
ecSelUp = ecUp + ecSelection,
ecSelDown = ecDown + ecSelection,
ecSelWordLeft = ecWordLeft + ecSelection,
ecSelWordRight = ecWordRight + ecSelection,
ecSelLineStart = ecLineStart + ecSelection,
ecSelLineEnd = ecLineEnd + ecSelection,
ecSelPageUp = ecPageUp + ecSelection,
ecSelPageDown = ecPageDown + ecSelection,
ecSelPageLeft = ecPageLeft + ecSelection,
ecSelPageRight = ecPageRight + ecSelection,
ecSelPageTop = ecPageTop + ecSelection,
ecSelPageBottom = ecPageBottom + ecSelection,
ecSelEditorStart = ecEditorStart + ecSelection,
ecSelEditorEnd = ecEditorEnd + ecSelection,
ecSelGotoXY = ecGotoXY + ecSelection, // Data = PPoint
ecSelBlockStart = ecBlockStart + ecSelection, // Move cursor to begin of scope
ecSelBlockEnd = ecBlockEnd + ecSelection, // Move cursor to end of scope
SelLeft = Left + Selection,
SelRight = Right + Selection,
SelUp = Up + Selection,
SelDown = Down + Selection,
SelWordLeft = WordLeft + Selection,
SelWordRight = WordRight + Selection,
SelLineStart = LineStart + Selection,
SelLineEnd = LineEnd + Selection,
SelPageUp = PageUp + Selection,
SelPageDown = PageDown + Selection,
SelPageLeft = PageLeft + Selection,
SelPageRight = PageRight + Selection,
SelPageTop = PageTop + Selection,
SelPageBottom = PageBottom + Selection,
SelEditorStart = EditorStart + Selection,
SelEditorEnd = EditorEnd + Selection,
SelGotoXY = GotoXY + Selection, // Data = PPoint
SelBlockStart = BlockStart + Selection, // Move cursor to begin of scope
SelBlockEnd = BlockEnd + Selection, // Move cursor to end of scope
ecCopy = 201, // Copy selection to clipboard
ecSelWord = 202,
ecSelectAll = 203, // Select entire contents of editor, cursor to end
ecExpandSelection = 204, // expand selection
ecShrinkSelection = 205, // shrink selection
Copy = 201, // Copy selection to clipboard
SelWord = 202,
SelectAll = 203, // Select entire contents of editor, cursor to end
ExpandSelection = 204, // expand selection
ShrinkSelection = 205, // shrink selection
ecScrollUp = 211, // Scroll up one line leaving cursor position unchanged.
ecScrollDown = 212, // Scroll down one line leaving cursor position unchanged.
ecScrollLeft = 213, // Scroll left one char leaving cursor position unchanged.
ecScrollRight = 214, // Scroll right one char leaving cursor position unchanged.
ScrollUp = 211, // Scroll up one line leaving cursor position unchanged.
ScrollDown = 212, // Scroll down one line leaving cursor position unchanged.
ScrollLeft = 213, // Scroll left one char leaving cursor position unchanged.
ScrollRight = 214, // Scroll right one char leaving cursor position unchanged.
ecInsertMode = 221, // Set insert mode
ecOverwriteMode = 222, // Set overwrite mode
ecToggleMode = 223, // Toggle ins/ovr mode
InsertMode = 221, // Set insert mode
OverwriteMode = 222, // Set overwrite mode
ToggleMode = 223, // Toggle ins/ovr mode
ecNormalSelect = 231, // Normal selection mode
ecColumnSelect = 232, // Column selection mode
ecLineSelect = 233, // Line selection mode
NormalSelect = 231, // Normal selection mode
ColumnSelect = 232, // Column selection mode
LineSelect = 233, // Line selection mode
ecMatchBracket = 250, // Go to matching bracket
MatchBracket = 250, // Go to matching bracket
ecContextHelp = 490, // Help on Word, Data = Word
ContextHelp = 490, // Help on Word, Data = Word
ecDeleteLastChar = 501, // Delete last char (i.e. backspace key)
ecDeleteChar = 502, // Delete char at cursor (i.e. delete key)
ecDeleteWordEnd = 503, // Delete from cursor to end of word
ecDeleteWordStart = 504, // Delete from cursor to start of word
ecDeleteBOL = 505, // Delete from cursor to beginning of line
ecDeleteEOL = 506, // Delete from cursor to end of line
ecDeleteLine = 507, // Delete current line
ecClearAll = 508, // Delete everything
ecLineBreak = 509, // Break line at current position, move caret to new line
ecInsertLine = 510, // Break line at current position, leave caret
ecChar = 511, // Insert a character at current position
ecDuplicateLine = 512, // Duplicate current line
ecMoveSelUp = 513, // Move selection up
ecMoveSelDown = 514, // Move selection down
ecImeStr = 550, // Insert character(s) from IME
ecDeleteWord = 551, // Delete current Word
DeleteLastChar = 501, // Delete last char (i.e. backspace key)
DeleteChar = 502, // Delete char at cursor (i.e. delete key)
DeleteWordEnd = 503, // Delete from cursor to end of word
DeleteWordStart = 504, // Delete from cursor to start of word
DeleteBOL = 505, // Delete from cursor to beginning of line
DeleteEOL = 506, // Delete from cursor to end of line
DeleteLine = 507, // Delete current line
ClearAll = 508, // Delete everything
LineBreak = 509, // Break line at current position, move caret to new line
InsertLine = 510, // Break line at current position, leave caret
Char = 511, // Insert a character at current position
DuplicateLine = 512, // Duplicate current line
MoveSelUp = 513, // Move selection up
MoveSelDown = 514, // Move selection down
ImeStr = 550, // Insert character(s) from IME
DeleteWord = 551, // Delete current Word
ecUndo = 601, // Perform undo if available
ecRedo = 602, // Perform redo if available
ecCut = 603, // Cut selection to clipboard
ecPaste = 604, // Paste clipboard to current position
Undo = 601, // Perform undo if available
Redo = 602, // Perform redo if available
Cut = 603, // Cut selection to clipboard
Paste = 604, // Paste clipboard to current position
ecBlockIndent = 610, // Indent selection
ecBlockUnindent = 611, // Unindent selection
ecTab = 612, // Tab key
ecShiftTab = 613, // Shift+Tab key
ecComment = 614,
ecUncomment = 615,
ecToggleComment = 616,
ecToggleBlockComment = 617,
BlockIndent = 610, // Indent selection
BlockUnindent = 611, // Unindent selection
Tab = 612, // Tab key
ShiftTab = 613, // Shift+Tab key
Comment = 614,
Uncomment = 615,
ToggleComment = 616,
ToggleBlockComment = 617,
ecUpperCase = 620, // apply to the current or previous word
ecLowerCase = 621,
ecToggleCase = 622,
ecTitleCase = 623,
ecUpperCaseBlock = 625, // apply to current selection, or current char if no selection
ecLowerCaseBlock = 626,
ecToggleCaseBlock = 627,
UpperCase = 620, // apply to the current or previous word
LowerCase = 621,
ToggleCase = 622,
TitleCase = 623,
UpperCaseBlock = 625, // apply to current selection, or current char if no selection
LowerCaseBlock = 626,
ToggleCaseBlock = 627,
ecString = 630, //Insert a whole string
ecZoomOut = 631, //Increase Font Size
ecZoomIn = 632, //Decrease Font Size
String = 630, //Insert a whole string
ZoomOut = 631, //Increase Font Size
ZoomIn = 632, //Decrease Font Size
ecLineBreakAtBegin = 651, //add a line break at the begin of the line
ecLineBreakAtEnd = 652,
LineBreakAtBegin = 651, //add a line break at the begin of the line
LineBreakAtEnd = 652,
TrimTrailingSpaces = 653,
//### Code Folding ###
ecCollapse = 700,
ecUncollapse = 701,
ecCollapseLevel = 702,
ecUncollapseLevel = 703,
ecCollapseAll = 704,
ecUncollapseAll = 705,
Collapse = 700,
Uncollapse = 701,
CollapseLevel = 702,
UncollapseLevel = 703,
CollapseAll = 704,
UncollapseAll = 705,
//### End Code Folding ###
ecUserFirst = 1001, // Start of user-defined commands
UserFirst = 1001, // Start of user-defined commands
};
class KeyError: public BaseError {

View File

@ -462,6 +462,65 @@ void SynEdit::addSelectionToUndo()
mBlockEnd,QStringList(),mActiveSelectionMode);
}
void SynEdit::doTrimTrailingSpaces()
{
if (mDocument->count()<=0)
return;
if (mSyntaxer) {
for (int i=0;i<mDocument->count();i++) {
if (mDocument->ranges(i).hasTrailingSpaces) {
int line = i+1;
QString oldLine = mDocument->getString(i);
QString newLine = trimRight(oldLine);
if (newLine.isEmpty())
continue;
properSetLine(i,newLine);
mUndoList->addChange(
ChangeReason::Delete,
BufferCoord{1,line},
BufferCoord{oldLine.length()+1, line},
QStringList(oldLine),
SelectionMode::Normal
);
mUndoList->addChange(
ChangeReason::Insert,
BufferCoord{1, line},
BufferCoord{newLine.length()+1, line},
QStringList(),
SelectionMode::Normal
);
}
}
} else {
for (int i=0;i<mDocument->count();i++) {
int line = i+1;
QString oldLine = mDocument->getString(i);
QString newLine = trimRight(oldLine);
if (newLine.isEmpty())
continue;
properSetLine(i,newLine);
mUndoList->addChange(
ChangeReason::Delete,
BufferCoord{1,line},
BufferCoord{oldLine.length()+1, line},
QStringList(oldLine),
SelectionMode::Normal
);
mUndoList->addChange(
ChangeReason::Insert,
BufferCoord{1, line},
BufferCoord{newLine.length()+1, line},
QStringList(),
SelectionMode::Normal
);
}
}
mUndoList->endBlock();
}
void SynEdit::beginUpdate()
{
incPaintLock();
@ -2025,8 +2084,6 @@ void SynEdit::doDeleteLastChar()
internalSetCaretX(mDocument->getString(mCaretY - 1).length() + 1);
mDocument->deleteAt(mCaretY);
doLinesDeleted(mCaretY+1, 1);
if (mOptions.testFlag(eoTrimTrailingSpaces))
Temp = trimRight(Temp);
setLineText(lineText() + Temp);
helper.append("");
helper.append("");
@ -3021,18 +3078,8 @@ void SynEdit::doCopyToClipboard()
bool selected=selAvail();
if (!selected)
doSelecteLine();
bool ChangeTrim = (mActiveSelectionMode == SelectionMode::Column) &&
mOptions.testFlag(eoTrimTrailingSpaces);
QString sText;
{
auto action = finally([&,this] {
if (ChangeTrim)
mOptions.setFlag(eoTrimTrailingSpaces);
});
if (ChangeTrim)
mOptions.setFlag(eoTrimTrailingSpaces,false);
sText = selText();
}
internalDoCopyToClipboard(sText);
if (!selected) {
setBlockBegin(caretXY());
@ -3867,7 +3914,7 @@ EditCommand SynEdit::TranslateKeyCode(int key, Qt::KeyboardModifiers modifiers)
{
PEditKeyStroke keyStroke = mKeyStrokes.findKeycode2(mLastKey,mLastKeyModifiers,
key, modifiers);
EditCommand cmd=EditCommand::ecNone;
EditCommand cmd=EditCommand::None;
if (keyStroke)
cmd = keyStroke->command();
else {
@ -3875,7 +3922,7 @@ EditCommand SynEdit::TranslateKeyCode(int key, Qt::KeyboardModifiers modifiers)
if (keyStroke)
cmd = keyStroke->command();
}
if (cmd == EditCommand::ecNone) {
if (cmd == EditCommand::None) {
mLastKey = key;
mLastKeyModifiers = modifiers;
} else {
@ -4147,9 +4194,9 @@ void SynEdit::setOptions(const EditorOptions &Value)
//if (!mOptions.testFlag(eoScrollPastEof))
setTopLine(mTopLine);
bool bUpdateAll = Value.testFlag(eoShowSpecialChars) != mOptions.testFlag(eoShowSpecialChars);
if (!bUpdateAll)
bUpdateAll = Value.testFlag(eoShowRainbowColor) != mOptions.testFlag(eoShowRainbowColor);
bool bUpdateAll =
(Value.testFlag(eoShowSpecialChars) != mOptions.testFlag(eoShowSpecialChars))
|| (Value.testFlag(eoShowRainbowColor) != mOptions.testFlag(eoShowRainbowColor));
//bool bUpdateScroll = (Options * ScrollOptions)<>(Value * ScrollOptions);
bool bUpdateScroll = true;
mOptions = Value;
@ -4525,7 +4572,7 @@ void SynEdit::doRedoItem()
item->changeEndPos(),item->changeText(),
item->changeSelMode(),item->changeNumber());
setCaretAndSelection(CaretPt, CaretPt, CaretPt);
commandProcessor(EditCommand::ecLineBreak);
processCommand(EditCommand::LineBreak);
break;
}
default:
@ -4791,11 +4838,11 @@ bool SynEdit::empty()
return mDocument->empty();
}
void SynEdit::commandProcessor(EditCommand Command, QChar AChar, void *pData)
void SynEdit::processCommand(EditCommand Command, QChar AChar, void *pData)
{
// first the program event handler gets a chance to process the command
onProcessCommand(Command, AChar, pData);
if (Command != EditCommand::ecNone)
if (Command != EditCommand::None)
executeCommand(Command, AChar, pData);
onCommandProcessed(Command, AChar, pData);
}
@ -5306,11 +5353,7 @@ void SynEdit::doLinesInserted(int firstLine, int count)
void SynEdit::properSetLine(int ALine, const QString &ALineText, bool notify)
{
if (mOptions.testFlag(eoTrimTrailingSpaces)) {
mDocument->putString(ALine,trimRight(ALineText),notify);
} else {
mDocument->putString(ALine,ALineText,notify);
}
}
void SynEdit::doDeleteText(BufferCoord startPos, BufferCoord endPos, SelectionMode mode)
@ -5520,9 +5563,6 @@ int SynEdit::doInsertTextByNormalMode(const BufferCoord& pos, const QStringList&
if (bChangeScroll)
mOptions.setFlag(eoScrollPastEol,false);
});
if (mOptions.testFlag(eoTrimTrailingSpaces) && (sRightSide == "")) {
newPos=BufferCoord{mDocument->getString(caretY-1).length()+1,caretY};
} else
newPos=BufferCoord{str.length() - sRightSide.length()+1,caretY};
onLinesPutted(startLine-1,result+1);
if (!mUndoing) {
@ -5699,43 +5739,43 @@ void SynEdit::executeCommand(EditCommand command, QChar ch, void *pData)
});
switch(command) {
//horizontal caret movement or selection
case EditCommand::ecLeft:
case EditCommand::ecSelLeft:
moveCaretHorz(-1, command == EditCommand::ecSelLeft);
case EditCommand::Left:
case EditCommand::SelLeft:
moveCaretHorz(-1, command == EditCommand::SelLeft);
break;
case EditCommand::ecRight:
case EditCommand::ecSelRight:
moveCaretHorz(1, command == EditCommand::ecSelRight);
case EditCommand::Right:
case EditCommand::SelRight:
moveCaretHorz(1, command == EditCommand::SelRight);
break;
case EditCommand::ecPageLeft:
case EditCommand::ecSelPageLeft:
moveCaretHorz(-mCharsInWindow, command == EditCommand::ecSelPageLeft);
case EditCommand::PageLeft:
case EditCommand::SelPageLeft:
moveCaretHorz(-mCharsInWindow, command == EditCommand::SelPageLeft);
break;
case EditCommand::ecPageRight:
case EditCommand::ecSelPageRight:
moveCaretHorz(mCharsInWindow, command == EditCommand::ecSelPageRight);
case EditCommand::PageRight:
case EditCommand::SelPageRight:
moveCaretHorz(mCharsInWindow, command == EditCommand::SelPageRight);
break;
case EditCommand::ecLineStart:
case EditCommand::ecSelLineStart:
moveCaretToLineStart(command == EditCommand::ecSelLineStart);
case EditCommand::LineStart:
case EditCommand::SelLineStart:
moveCaretToLineStart(command == EditCommand::SelLineStart);
break;
case EditCommand::ecLineEnd:
case EditCommand::ecSelLineEnd:
moveCaretToLineEnd(command == EditCommand::ecSelLineEnd);
case EditCommand::LineEnd:
case EditCommand::SelLineEnd:
moveCaretToLineEnd(command == EditCommand::SelLineEnd);
break;
// vertical caret movement or selection
case EditCommand::ecUp:
case EditCommand::ecSelUp:
moveCaretVert(-1, command == EditCommand::ecSelUp);
case EditCommand::Up:
case EditCommand::SelUp:
moveCaretVert(-1, command == EditCommand::SelUp);
break;
case EditCommand::ecDown:
case EditCommand::ecSelDown:
moveCaretVert(1, command == EditCommand::ecSelDown);
case EditCommand::Down:
case EditCommand::SelDown:
moveCaretVert(1, command == EditCommand::SelDown);
break;
case EditCommand::ecPageUp:
case EditCommand::ecSelPageUp:
case EditCommand::ecPageDown:
case EditCommand::ecSelPageDown:
case EditCommand::PageUp:
case EditCommand::SelPageUp:
case EditCommand::PageDown:
case EditCommand::SelPageDown:
{
int counter = mLinesInWindow;
if (mOptions.testFlag(eoHalfPageScroll))
@ -5745,112 +5785,112 @@ void SynEdit::executeCommand(EditCommand command, QChar ch, void *pData)
}
if (counter<0)
break;
if (command == EditCommand::ecPageUp || command == EditCommand::ecSelPageUp) {
if (command == EditCommand::PageUp || command == EditCommand::SelPageUp) {
counter = -counter;
}
moveCaretVert(counter, command == EditCommand::ecSelPageUp || command == EditCommand::ecSelPageDown);
moveCaretVert(counter, command == EditCommand::SelPageUp || command == EditCommand::SelPageDown);
break;
}
case EditCommand::ecPageTop:
case EditCommand::ecSelPageTop:
moveCaretVert(mTopLine-mCaretY, command == EditCommand::ecSelPageTop);
case EditCommand::PageTop:
case EditCommand::SelPageTop:
moveCaretVert(mTopLine-mCaretY, command == EditCommand::SelPageTop);
break;
case EditCommand::ecPageBottom:
case EditCommand::ecSelPageBottom:
moveCaretVert(mTopLine+mLinesInWindow-1-mCaretY, command == EditCommand::ecSelPageBottom);
case EditCommand::PageBottom:
case EditCommand::SelPageBottom:
moveCaretVert(mTopLine+mLinesInWindow-1-mCaretY, command == EditCommand::SelPageBottom);
break;
case EditCommand::ecEditorStart:
case EditCommand::ecSelEditorStart:
doGotoEditorStart(command == EditCommand::ecSelEditorStart);
case EditCommand::EditorStart:
case EditCommand::SelEditorStart:
doGotoEditorStart(command == EditCommand::SelEditorStart);
break;
case EditCommand::ecEditorEnd:
case EditCommand::ecSelEditorEnd:
doGotoEditorEnd(command == EditCommand::ecSelEditorEnd);
case EditCommand::EditorEnd:
case EditCommand::SelEditorEnd:
doGotoEditorEnd(command == EditCommand::SelEditorEnd);
break;
case EditCommand::ecBlockStart:
case EditCommand::ecSelBlockStart:
doGotoBlockStart(command == EditCommand::ecSelBlockStart);
case EditCommand::BlockStart:
case EditCommand::SelBlockStart:
doGotoBlockStart(command == EditCommand::SelBlockStart);
break;
case EditCommand::ecBlockEnd:
case EditCommand::ecSelBlockEnd:
doGotoBlockEnd(command == EditCommand::ecSelBlockEnd);
case EditCommand::BlockEnd:
case EditCommand::SelBlockEnd:
doGotoBlockEnd(command == EditCommand::SelBlockEnd);
break;
// goto special line / column position
case EditCommand::ecGotoXY:
case EditCommand::ecSelGotoXY:
case EditCommand::GotoXY:
case EditCommand::SelGotoXY:
if (pData)
moveCaretAndSelection(caretXY(), *((BufferCoord *)(pData)), command == EditCommand::ecSelGotoXY);
moveCaretAndSelection(caretXY(), *((BufferCoord *)(pData)), command == EditCommand::SelGotoXY);
break;
// word selection
case EditCommand::ecWordLeft:
case EditCommand::ecSelWordLeft:
case EditCommand::WordLeft:
case EditCommand::SelWordLeft:
{
BufferCoord CaretNew = prevWordPos();
moveCaretAndSelection(caretXY(), CaretNew, command == EditCommand::ecSelWordLeft);
moveCaretAndSelection(caretXY(), CaretNew, command == EditCommand::SelWordLeft);
break;
}
case EditCommand::ecWordRight:
case EditCommand::ecSelWordRight:
case EditCommand::WordRight:
case EditCommand::SelWordRight:
{
BufferCoord CaretNew = nextWordPos();
moveCaretAndSelection(caretXY(), CaretNew, command == EditCommand::ecSelWordRight);
moveCaretAndSelection(caretXY(), CaretNew, command == EditCommand::SelWordRight);
break;
}
case EditCommand::ecSelWord:
case EditCommand::SelWord:
setSelWord();
break;
case EditCommand::ecSelectAll:
case EditCommand::SelectAll:
doSelectAll();
break;
case EditCommand::ecExpandSelection:
case EditCommand::ExpandSelection:
doExpandSelection(caretXY());
break;
case EditCommand::ecShrinkSelection:
case EditCommand::ShrinkSelection:
doShrinkSelection(caretXY());
break;
case EditCommand::ecDeleteLastChar:
case EditCommand::DeleteLastChar:
doDeleteLastChar();
break;
case EditCommand::ecDeleteChar:
case EditCommand::DeleteChar:
doDeleteCurrentChar();
break;
case EditCommand::ecDeleteWord:
case EditCommand::DeleteWord:
doDeleteWord();
break;
case EditCommand::ecDeleteEOL:
case EditCommand::DeleteEOL:
doDeleteToEOL();
break;
case EditCommand::ecDeleteWordStart:
case EditCommand::DeleteWordStart:
doDeleteToWordStart();
break;
case EditCommand::ecDeleteWordEnd:
case EditCommand::DeleteWordEnd:
doDeleteToWordEnd();
break;
case EditCommand::ecDeleteBOL:
case EditCommand::DeleteBOL:
doDeleteFromBOL();
break;
case EditCommand::ecDeleteLine:
case EditCommand::DeleteLine:
doDeleteLine();
break;
case EditCommand::ecDuplicateLine:
case EditCommand::DuplicateLine:
doDuplicateLine();
break;
case EditCommand::ecMoveSelUp:
case EditCommand::MoveSelUp:
doMoveSelUp();
break;
case EditCommand::ecMoveSelDown:
case EditCommand::MoveSelDown:
doMoveSelDown();
break;
case EditCommand::ecClearAll:
case EditCommand::ClearAll:
clearAll();
break;
case EditCommand::ecInsertLine:
case EditCommand::InsertLine:
insertLine(false);
break;
case EditCommand::ecLineBreak:
case EditCommand::LineBreak:
insertLine(true);
break;
case EditCommand::ecLineBreakAtEnd:
case EditCommand::LineBreakAtEnd:
mUndoList->beginBlock();
addCaretToUndo();
addSelectionToUndo();
@ -5858,98 +5898,102 @@ void SynEdit::executeCommand(EditCommand command, QChar ch, void *pData)
insertLine(true);
mUndoList->endBlock();
break;
case EditCommand::ecTab:
case EditCommand::Tab:
doTabKey();
break;
case EditCommand::ecShiftTab:
case EditCommand::ShiftTab:
doShiftTabKey();
break;
case EditCommand::ecChar:
case EditCommand::Char:
doAddChar(ch);
break;
case EditCommand::ecInsertMode:
case EditCommand::InsertMode:
if (!mReadOnly)
setInsertMode(true);
break;
case EditCommand::ecOverwriteMode:
case EditCommand::OverwriteMode:
if (!mReadOnly)
setInsertMode(false);
break;
case EditCommand::ecToggleMode:
case EditCommand::ToggleMode:
if (!mReadOnly) {
setInsertMode(!mInserting);
}
break;
case EditCommand::ecCut:
case EditCommand::Cut:
if (!mReadOnly)
doCutToClipboard();
break;
case EditCommand::ecCopy:
case EditCommand::Copy:
doCopyToClipboard();
break;
case EditCommand::ecPaste:
case EditCommand::Paste:
if (!mReadOnly)
doPasteFromClipboard();
break;
case EditCommand::ecImeStr:
case EditCommand::ecString:
case EditCommand::ImeStr:
case EditCommand::String:
if (!mReadOnly)
doAddStr(*((QString*)pData));
break;
case EditCommand::ecUndo:
case EditCommand::Undo:
if (!mReadOnly)
doUndo();
break;
case EditCommand::ecRedo:
case EditCommand::Redo:
if (!mReadOnly)
doRedo();
break;
case EditCommand::ecZoomIn:
case EditCommand::ZoomIn:
doZoomIn();
break;
case EditCommand::ecZoomOut:
case EditCommand::ZoomOut:
doZoomOut();
break;
case EditCommand::ecComment:
case EditCommand::Comment:
doComment();
break;
case EditCommand::ecUncomment:
case EditCommand::Uncomment:
doUncomment();
break;
case EditCommand::ecToggleComment:
case EditCommand::ToggleComment:
doToggleComment();
break;
case EditCommand::ecToggleBlockComment:
case EditCommand::ToggleBlockComment:
doToggleBlockComment();
break;
case EditCommand::ecNormalSelect:
case EditCommand::NormalSelect:
setSelectionMode(SelectionMode::Normal);
break;
case EditCommand::ecLineSelect:
case EditCommand::LineSelect:
setSelectionMode(SelectionMode::Line);
break;
case EditCommand::ecColumnSelect:
case EditCommand::ColumnSelect:
setSelectionMode(SelectionMode::Column);
break;
case EditCommand::ecScrollLeft:
case EditCommand::ScrollLeft:
horizontalScrollBar()->setValue(horizontalScrollBar()->value()-mMouseWheelScrollSpeed);
break;
case EditCommand::ecScrollRight:
case EditCommand::ScrollRight:
horizontalScrollBar()->setValue(horizontalScrollBar()->value()+mMouseWheelScrollSpeed);
break;
case EditCommand::ecScrollUp:
case EditCommand::ScrollUp:
verticalScrollBar()->setValue(verticalScrollBar()->value()-mMouseWheelScrollSpeed);
break;
case EditCommand::ecScrollDown:
case EditCommand::ScrollDown:
verticalScrollBar()->setValue(verticalScrollBar()->value()+mMouseWheelScrollSpeed);
break;
case EditCommand::ecMatchBracket:
case EditCommand::MatchBracket:
{
BufferCoord coord = getMatchingBracket();
if (coord.ch!=0 && coord.line!=0)
internalSetCaretXY(coord);
}
break;
case EditCommand::TrimTrailingSpaces:
if (!mReadOnly)
doTrimTrailingSpaces();
break;
default:
break;
}
@ -6169,13 +6213,13 @@ void SynEdit::keyPressEvent(QKeyEvent *event)
event->accept();
} else {
EditCommand cmd=TranslateKeyCode(event->key(),event->modifiers());
if (cmd!=EditCommand::ecNone) {
commandProcessor(cmd,QChar(),nullptr);
if (cmd!=EditCommand::None) {
processCommand(cmd,QChar(),nullptr);
event->accept();
} else if (!event->text().isEmpty()) {
QChar c = event->text().at(0);
if (c=='\t' || c.isPrint()) {
commandProcessor(EditCommand::ecChar,c,nullptr);
processCommand(EditCommand::Char,c,nullptr);
event->accept();
}
}
@ -6306,6 +6350,7 @@ void SynEdit::mouseDoubleClickEvent(QMouseEvent *event)
QAbstractScrollArea::mouseDoubleClickEvent(event);
QPoint ptMouse = event->pos();
if (ptMouse.x() >= mGutterWidth + 2) {
if (mOptions.testFlag(EditorOption::eoSelectWordByDblClick))
setSelWord();
mStateFlags.setFlag(StateFlag::sfDblClicked);
}
@ -6328,7 +6373,7 @@ void SynEdit::inputMethodEvent(QInputMethodEvent *event)
}
QString s = event->commitString();
if (!s.isEmpty()) {
commandProcessor(EditCommand::ecImeStr,QChar(),&s);
processCommand(EditCommand::ImeStr,QChar(),&s);
// for (QChar ch:s) {
// CommandProcessor(SynEditorCommand::ecChar,ch);
// }

View File

@ -83,7 +83,7 @@ enum EditorOption {
eoEnhanceEndKey = 0x00000040, //enhances End key positioning, similar to JDeveloper
eoGroupUndo = 0x00000080, //When undoing/redoing actions, handle all continous changes of the same kind in one call instead undoing/redoing each command separately
eoHalfPageScroll = 0x00000100, //When scrolling with page-up and page-down commands, only scroll a half page at a time
eoHideShowScrollbars =0x00000200, //if enabled, then the scrollbars will only show when necessary. If you have ScrollPastEOL, then it the horizontal bar will always be there (it uses MaxLength instead)
eoHideShowScrollbars = 0x00000200, //if enabled, then the scrollbars will only show when necessary. If you have ScrollPastEOL, then it the horizontal bar will always be there (it uses MaxLength instead)
eoKeepCaretX = 0x00000400 , //When moving through lines w/o Cursor Past EOL, keeps the X position of the cursor
eoRightMouseMovesCursor= 0x00000800, //When clicking with the right mouse for a popup menu, move the cursor to that location
eoScrollByOneLess = 0x00001000, //Forces scrolling to be one less
@ -94,16 +94,7 @@ enum EditorOption {
eoTabIndent = 0x00020000, //When active <Tab> and <Shift><Tab> act as block indent, unindent when text is selected
eoTabsToSpaces = 0x00040000, //Converts a tab character to a specified number of space characters
eoShowRainbowColor = 0x00080000,
eoTrimTrailingSpaces =0x00100000, //Spaces at the end of lines will be trimmed and not saved
eoSelectWordByDblClick=0x00200000,
// eoNoSelection = 0x00400000, //Disables selecting text
//eoAutoSizeMaxScrollWidth = 0x00000008, //Automatically resizes the MaxScrollWidth property when inserting text
//eoDisableScrollArrows = 0x00000010 , //Disables the scroll bar arrow buttons when you can't scroll in that direction any more
// eoScrollHintFollows = 0x00020000, //The scroll hint follows the mouse when scrolling vertically
// eoShowScrollHint = 0x00100000, //Shows a hint of the visible line numbers when scrolling vertically
// eoSmartTabDelete = 0x00400000, //similar to Smart Tabs, but when you delete characters
// eoSmartTabs = 0x00800000, //When tabbing, the cursor will go to the next non-white space character of the previous line
// eoNoCaret = 0x00000800, //Makes it so the caret is never visible
eoSelectWordByDblClick= 0x00100000,
};
Q_DECLARE_FLAGS(EditorOptions, EditorOption)
@ -215,7 +206,7 @@ public:
BufferCoord prevWordPos();
BufferCoord prevWordPosEx(const BufferCoord& XY);
void commandProcessor(EditCommand Command, QChar AChar = QChar(), void * pData = nullptr);
void processCommand(EditCommand Command, QChar AChar = QChar(), void * pData = nullptr);
//Caret
void showCaret();
void hideCaret();
@ -261,28 +252,31 @@ public:
selectAll();
setSelText(text);
}
void trimTrailingSpaces() {
processCommand(EditCommand::TrimTrailingSpaces);
}
//Commands
virtual void cutToClipboard() { commandProcessor(EditCommand::ecCut);}
virtual void copyToClipboard() { commandProcessor(EditCommand::ecCopy);}
virtual void pasteFromClipboard() { commandProcessor(EditCommand::ecPaste);}
virtual void undo() { commandProcessor(EditCommand::ecUndo);}
virtual void redo() { commandProcessor(EditCommand::ecRedo);}
virtual void zoomIn() { commandProcessor(EditCommand::ecZoomIn);}
virtual void zoomOut() { commandProcessor(EditCommand::ecZoomOut);}
virtual void cutToClipboard() { processCommand(EditCommand::Cut);}
virtual void copyToClipboard() { processCommand(EditCommand::Copy);}
virtual void pasteFromClipboard() { processCommand(EditCommand::Paste);}
virtual void undo() { processCommand(EditCommand::Undo);}
virtual void redo() { processCommand(EditCommand::Redo);}
virtual void zoomIn() { processCommand(EditCommand::ZoomIn);}
virtual void zoomOut() { processCommand(EditCommand::ZoomOut);}
virtual void selectAll() {
commandProcessor(EditCommand::ecSelectAll);
processCommand(EditCommand::SelectAll);
}
virtual void selectWord() {
commandProcessor(EditCommand::ecSelWord);
processCommand(EditCommand::SelWord);
}
virtual void tab() { commandProcessor(EditCommand::ecTab);}
virtual void shifttab() { commandProcessor(EditCommand::ecShiftTab);}
virtual void toggleComment() { commandProcessor(EditCommand::ecToggleComment);}
virtual void toggleBlockComment() { commandProcessor(EditCommand::ecToggleBlockComment);}
virtual void matchBracket() { commandProcessor(EditCommand::ecMatchBracket);}
virtual void moveSelUp(){ commandProcessor(EditCommand::ecMoveSelUp);}
virtual void moveSelDown(){ commandProcessor(EditCommand::ecMoveSelDown);}
virtual void tab() { processCommand(EditCommand::Tab);}
virtual void shifttab() { processCommand(EditCommand::ShiftTab);}
virtual void toggleComment() { processCommand(EditCommand::ToggleComment);}
virtual void toggleBlockComment() { processCommand(EditCommand::ToggleBlockComment);}
virtual void matchBracket() { processCommand(EditCommand::MatchBracket);}
virtual void moveSelUp(){ processCommand(EditCommand::MoveSelUp);}
virtual void moveSelDown(){ processCommand(EditCommand::MoveSelDown);}
virtual void beginUpdate();
virtual void endUpdate();
@ -555,6 +549,7 @@ private:
int doInsertTextByColumnMode(const BufferCoord& pos, const QStringList& text, BufferCoord &newPos, int startLine, int endLine);
int doInsertTextByLineMode(const BufferCoord& pos, const QStringList& text, BufferCoord &newPos);
void doTrimTrailingSpaces();
void deleteFromTo(const BufferCoord& start, const BufferCoord& end);
void setSelWord();
void setWordBlock(BufferCoord value);

View File

@ -338,7 +338,7 @@ int SynEditTextPainter::columnToXValue(int col)
void SynEditTextPainter::paintToken(const QString &token, int tokenCols, int columnsBefore,
int first, int last, bool /*isSelection*/, const QFont& font,
const QFont& fontForNonAscii)
const QFont& fontForNonAscii, bool showGlyphs)
{
bool startPaint;
int nX;
@ -389,9 +389,26 @@ void SynEditTextPainter::paintToken(const QString &token, int tokenCols, int col
drawed = true;
}
if (!drawed) {
if (token[i].unicode()<=0xFF)
painter->drawText(nX,rcToken.bottom()-painter->fontMetrics().descent() , token[i]);
else {
if (token[i].unicode()<=0xFF) {
QChar ch;
int padding=0;
if (showGlyphs) {
switch(token[i].unicode()) {
case '\t':
ch=TabGlyph;
padding=(charCols-1)/2*edit->mCharWidth;
break;
case ' ':
ch=SpaceGlyph;
break;
default:
ch=token[i];
}
} else {
ch=token[i];
}
painter->drawText(nX+padding,rcToken.bottom()-painter->fontMetrics().descent() , ch);
} else {
painter->setFont(fontForNonAscii);
painter->drawText(nX,rcToken.bottom()-painter->fontMetrics().descent() , token[i]);
painter->setFont(font);
@ -513,24 +530,25 @@ void SynEditTextPainter::paintHighlightToken(bool bFillToEOL)
if (bU1) {
setDrawingColors(false);
rcToken.setRight(columnToXValue(nLineSelStart));
paintToken(TokenAccu.s,TokenAccu.Columns,TokenAccu.ColumnsBefore,nC1,nLineSelStart,false,font,nonAsciiFont);
paintToken(
TokenAccu.s,TokenAccu.Columns,TokenAccu.ColumnsBefore,nC1,nLineSelStart,false,font,nonAsciiFont, TokenAccu.showSpecialGlyphs);
}
// selected part of the token
setDrawingColors(true);
nC1Sel = std::max(nLineSelStart, nC1);
nC2Sel = std::min(nLineSelEnd, nC2);
rcToken.setRight(columnToXValue(nC2Sel));
paintToken(TokenAccu.s, TokenAccu.Columns, TokenAccu.ColumnsBefore, nC1Sel, nC2Sel,true,font,nonAsciiFont);
paintToken(TokenAccu.s, TokenAccu.Columns, TokenAccu.ColumnsBefore, nC1Sel, nC2Sel,true,font,nonAsciiFont, TokenAccu.showSpecialGlyphs);
// second unselected part of the token
if (bU2) {
setDrawingColors(false);
rcToken.setRight(columnToXValue(nC2));
paintToken(TokenAccu.s, TokenAccu.Columns, TokenAccu.ColumnsBefore,nLineSelEnd, nC2,false,font,nonAsciiFont);
paintToken(TokenAccu.s, TokenAccu.Columns, TokenAccu.ColumnsBefore,nLineSelEnd, nC2,false,font,nonAsciiFont, TokenAccu.showSpecialGlyphs);
}
} else {
setDrawingColors(bSel);
rcToken.setRight(columnToXValue(nC2));
paintToken(TokenAccu.s, TokenAccu.Columns, TokenAccu.ColumnsBefore, nC1, nC2,bSel,font,nonAsciiFont);
paintToken(TokenAccu.s, TokenAccu.Columns, TokenAccu.ColumnsBefore, nC1, nC2,bSel,font,nonAsciiFont, TokenAccu.showSpecialGlyphs);
}
}
@ -572,22 +590,6 @@ void SynEditTextPainter::paintHighlightToken(bool bFillToEOL)
}
}
bool SynEditTextPainter::tokenIsSpaces(bool &bSpacesTest, const QString& token, bool& bIsSpaces)
{
if (!bSpacesTest) {
bSpacesTest = true;
for (QChar ch:token) {
//todo: should include tabs?
if (ch!= ' ') {
bIsSpaces = false;
return bIsSpaces;
}
}
bIsSpaces = true;
}
return bIsSpaces;
}
// Store the token chars with the attributes in the TokenAccu
// record. This will paint any chars already stored if there is
// a (visible) change in the attributes.
@ -597,12 +599,15 @@ void SynEditTextPainter::addHighlightToken(const QString &Token, int columnsBefo
bool bCanAppend;
QColor foreground, background;
FontStyles style;
bool bSpacesTest,bIsSpaces;
bool isSpaces=false;
bool showGlyphs=false;
if (p_Attri) {
foreground = p_Attri->foreground();
background = p_Attri->background();
style = p_Attri->styles();
isSpaces = p_Attri->tokenType() == TokenType::Space;
showGlyphs = isSpaces && edit->mOptions.testFlag(eoShowSpecialChars);
} else {
foreground = colFG;
background = colBG;
@ -624,19 +629,20 @@ void SynEditTextPainter::addHighlightToken(const QString &Token, int columnsBefo
// Do we have to paint the old chars first, or can we just append?
bCanAppend = false;
bSpacesTest = false;
if (TokenAccu.Columns > 0) {
if (TokenAccu.Columns > 0 ) {
if (showGlyphs == TokenAccu.showSpecialGlyphs) {
// font style must be the same or token is only spaces
if (TokenAccu.Style == style || ( (style & FontStyle::fsUnderline) == (TokenAccu.Style & fsUnderline)
&& tokenIsSpaces(bSpacesTest,Token,bIsSpaces)) ) {
&& isSpaces)) {
if (
// background color must be the same and
((TokenAccu.BG == background) &&
(TokenAccu.BG == background) &&
// foreground color must be the same or token is only spaces
((TokenAccu.FG == foreground) || (tokenIsSpaces(bSpacesTest,Token,bIsSpaces) && !edit->mOptions.testFlag(eoShowSpecialChars))))) {
((TokenAccu.FG == foreground) || isSpaces)) {
bCanAppend = true;
}
}
}
// If we can't append it, then we have to paint the old token chars first.
if (!bCanAppend)
paintHighlightToken(false);
@ -652,6 +658,7 @@ void SynEditTextPainter::addHighlightToken(const QString &Token, int columnsBefo
TokenAccu.FG = foreground;
TokenAccu.BG = background;
TokenAccu.Style = style;
TokenAccu.showSpecialGlyphs = showGlyphs;
}
}
@ -909,17 +916,17 @@ void SynEditTextPainter::paintLines()
setDrawingColors(true);
rcToken.setLeft(std::max(rcLine.left(), columnToXValue(nLineSelStart)));
rcToken.setRight(std::min(rcLine.right(), columnToXValue(nLineSelEnd)));
paintToken(sToken, nTokenColumnLen, 0, nLineSelStart, nLineSelEnd,false,edit->font(),edit->fontForNonAscii());
paintToken(sToken, nTokenColumnLen, 0, nLineSelStart, nLineSelEnd,false,edit->font(),edit->fontForNonAscii(),false);
setDrawingColors(false);
rcToken.setLeft(std::max(rcLine.left(), columnToXValue(FirstCol)));
rcToken.setRight(std::min(rcLine.right(), columnToXValue(nLineSelStart)));
paintToken(sToken, nTokenColumnLen, 0, FirstCol, nLineSelStart,false,edit->font(),edit->fontForNonAscii());
paintToken(sToken, nTokenColumnLen, 0, FirstCol, nLineSelStart,false,edit->font(),edit->fontForNonAscii(),false);
rcToken.setLeft(std::max(rcLine.left(), columnToXValue(nLineSelEnd)));
rcToken.setRight(std::min(rcLine.right(), columnToXValue(LastCol)));
paintToken(sToken, nTokenColumnLen, 0, nLineSelEnd, LastCol,true,edit->font(),edit->fontForNonAscii());
paintToken(sToken, nTokenColumnLen, 0, nLineSelEnd, LastCol,true,edit->font(),edit->fontForNonAscii(),false);
} else {
setDrawingColors(bLineSelected);
paintToken(sToken, nTokenColumnLen, 0, FirstCol, LastCol,bLineSelected,edit->font(),edit->fontForNonAscii());
paintToken(sToken, nTokenColumnLen, 0, FirstCol, LastCol,bLineSelected,edit->font(),edit->fontForNonAscii(),false);
}
//Paint editingAreaBorders
if (bCurrentLine && edit->mInputPreeditString.length()>0) {
@ -1030,8 +1037,10 @@ void SynEditTextPainter::paintLines()
}
}
// Draw LineBreak glyph.
if (edit->mOptions.testFlag(eoShowSpecialChars) && (!bLineSelected) &&
(!bSpecialLine) && (edit->mDocument->lineColumns(vLine-1) < vLastChar)) {
if (edit->mOptions.testFlag(eoShowSpecialChars)
// && (!bLineSelected)
// && (!bSpecialLine)
&& (edit->mDocument->lineColumns(vLine-1) < vLastChar)) {
addHighlightToken(LineBreakGlyph,
edit->mDocument->lineColumns(vLine-1) - (vFirstChar - FirstCol),
edit->charColumns(LineBreakGlyph),vLine, edit->mSyntaxer->whitespaceAttribute());

View File

@ -35,6 +35,7 @@ class SynEditTextPainter
QColor FG;
QColor BG;
FontStyles Style;
bool showSpecialGlyphs;
};
public:
@ -50,10 +51,9 @@ private:
int columnToXValue(int col);
void paintToken(const QString& token, int tokenLen, int columnsBefore,
int first, int last, bool isSelection, const QFont& font,
const QFont& fontForNonAscii);
const QFont& fontForNonAscii, bool showGlyphs);
void paintEditAreas(const EditingAreaList& areaList);
void paintHighlightToken(bool bFillToEOL);
bool tokenIsSpaces(bool& bSpacesTest, const QString& token, bool& bIsSpaces);
void addHighlightToken(const QString& token, int columnsBefore, int tokenColumns,
int cLine, PTokenAttribute p_Attri);

View File

@ -242,6 +242,8 @@ void ASMSyntaxer::SpaceProc()
if (mLine[mRun] > 32)
break;
}
if (mRun>=mStringLen)
mHasTrailingSpaces = true;
}
void ASMSyntaxer::StringProc()
@ -441,17 +443,19 @@ bool ASMSyntaxer::isLastLineStringNotFinished(int /*state*/) const
SyntaxerState ASMSyntaxer::getState() const
{
return SyntaxerState();
SyntaxerState state;
state.hasTrailingSpaces = mHasTrailingSpaces;
return state;
}
void ASMSyntaxer::setState(const SyntaxerState&)
{
mHasTrailingSpaces = false;
}
void ASMSyntaxer::resetState()
{
mHasTrailingSpaces = false;
}
QSet<QString> ASMSyntaxer::keywords() const

View File

@ -61,6 +61,7 @@ private:
QChar mToIdent;
int mTokenPos;
TokenId mTokenID;
bool mHasTrailingSpaces;
PTokenAttribute mNumberAttribute;
PTokenAttribute mDirectiveAttribute;
PTokenAttribute mRegisterAttribute;

View File

@ -290,20 +290,17 @@ void CppSyntaxer::andSymbolProc()
void CppSyntaxer::ansiCppProc()
{
mTokenId = TokenId::Comment;
if (mRun>=mLineSize) {
nullProc();
if ( (mRun-1<0) || (mLine[mRun-1]!='\\')) {
mRange.state = RangeState::rsUnknown;
}
return;
}
while (mRun<mLineSize) {
mRun+=1;
if (isSpaceChar(mLine[mRun]))
break;
mRun++;
}
mRange.state = RangeState::rsCppCommentEnded;
if (mRun == mLineSize-1 && mLine[mRun-1] == '\\' ) { // continues on next line
if (mRun<mLineSize) {
mRange.state = RangeState::rsCppComment;
}
} else if (mRun-1>=0 && mLine[mRun-1] == '\\' ) { // continues on next line
mRange.state = RangeState::rsCppComment;
} else
mRange.state = RangeState::rsUnknown;
}
void CppSyntaxer::ansiCProc()
@ -316,6 +313,9 @@ void CppSyntaxer::ansiCProc()
}
while (mRun<mLineSize) {
switch(mLine[mRun].unicode()) {
case ' ':
case '\t':
return;
case '*':
if (mRun+1<mLineSize && mLine[mRun+1] == '/') {
mRun += 2;
@ -449,10 +449,7 @@ void CppSyntaxer::directiveProc()
mRun+=1;
}
if (directive == "define") {
while(mRun < mLineSize && isSpaceChar(mLine[mRun]))
mRun++;
mRange.state = RangeState::rsDefineIdentifier;
return;
} else
mRange.state = RangeState::rsUnknown;
}
@ -460,6 +457,7 @@ void CppSyntaxer::directiveProc()
void CppSyntaxer::defineIdentProc()
{
mTokenId = TokenId::Identifier;
while(mRun < mLineSize && isIdentChar(mLine[mRun]))
mRun++;
mRange.state = RangeState::rsDefineRemaining;
@ -468,8 +466,11 @@ void CppSyntaxer::defineIdentProc()
void CppSyntaxer::defineRemainingProc()
{
mTokenId = TokenId::Directive;
do {
while (mRun<mLineSize) {
switch(mLine[mRun].unicode()) {
case ' ':
case '\t':
return;
case '/': //comment?
if (mRun+1<mLineSize) {
switch (mLine[mRun+1].unicode()) {
@ -491,7 +492,7 @@ void CppSyntaxer::defineRemainingProc()
break;
}
mRun+=1;
} while (mRun<mLineSize);
}
mRange.state=RangeState::rsUnknown;
}
@ -642,17 +643,6 @@ void CppSyntaxer::notSymbolProc()
void CppSyntaxer::nullProc()
{
if (
(mRange.state == RangeState::rsCppComment
|| mRange.state == RangeState::rsDirective
|| mRange.state == RangeState::rsString
|| mRange.state == RangeState::rsMultiLineString
|| mRange.state == RangeState::rsMultiLineDirective)
&& (mRun-1>=0)
&& (mRun-1<mLineSize)
&& isSpaceChar(mLine[mRun-1]) ) {
mRange.state = RangeState::rsUnknown;
} else
mTokenId = TokenId::Null;
}
@ -882,21 +872,23 @@ void CppSyntaxer::questionProc()
void CppSyntaxer::rawStringProc()
{
bool noEscaping = false;
if (mRange.state == RangeState::rsRawStringNotEscaping)
noEscaping = true;
mTokenId = TokenId::RawString;
mRange.state = RangeState::rsRawString;
while (mRun<mLineSize) {
if ((!noEscaping) && (mLine[mRun]=='"')) {
if (!noEscaping && (mLine[mRun]=='"')) {
mRun+=1;
break;
}
switch (mLine[mRun].unicode()) {
case ' ':
case '\t':
return;
case '(':
if (!noEscaping)
noEscaping = true;
break;
case ')':
if (noEscaping)
noEscaping = false;
break;
}
@ -984,7 +976,8 @@ void CppSyntaxer::spaceProc()
mTokenId = TokenId::Space;
while (mRun<mLineSize && mLine[mRun]>=1 && mLine[mRun]<=32)
mRun+=1;
mRange.state = RangeState::rsUnknown;
if (mRun>=mLineSize)
mRange.hasTrailingSpaces = true;
}
void CppSyntaxer::squareCloseProc()
@ -1015,60 +1008,62 @@ void CppSyntaxer::starProc()
}
}
void CppSyntaxer::stringEndProc()
{
mTokenId = TokenId::String;
if (mRun>=mLineSize) {
nullProc();
return;
}
mRange.state = RangeState::rsUnknown;
//void CppSyntaxer::stringEndProc()
//{
// mTokenId = TokenId::String;
// if (mRun>=mLineSize) {
// nullProc();
// return;
// }
// mRange.state = RangeState::rsUnknown;
while (mRun<mLineSize) {
if (mLine[mRun]=='"') {
mRun += 1;
break;
}
if (mLine[mRun]=='\\') {
if (mRun == mLineSize-1) {
mRun+=1;
mRange.state = RangeState::rsMultiLineString;
return;
}
if (mRun+1<mLineSize) {
switch(mLine[mRun+1].unicode()) {
case '\'':
case '"':
case '\\':
case '?':
case 'a':
case 'b':
case 'f':
case 'n':
case 'r':
case 't':
case 'v':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'x':
case 'u':
case 'U':
mRange.state = RangeState::rsMultiLineStringEscapeSeq;
return;
}
}
}
mRun += 1;
}
}
// while (mRun<mLineSize) {
// if (mLine[mRun]=='"') {
// mRun += 1;
// break;
// } else if (isSpaceChar(mLine[mRun])) {
// mRange.state = RangeState::rsString;
// return;
// } else if (mLine[mRun]=='\\') {
// if (mRun == mLineSize-1) {
// mRun+=1;
// mRange.state = RangeState::rsMultiLineString;
// return;
// }
// if (mRun+1<mLineSize) {
// switch(mLine[mRun+1].unicode()) {
// case '\'':
// case '"':
// case '\\':
// case '?':
// case 'a':
// case 'b':
// case 'f':
// case 'n':
// case 'r':
// case 't':
// case 'v':
// case '0':
// case '1':
// case '2':
// case '3':
// case '4':
// case '5':
// case '6':
// case '7':
// case '8':
// case '9':
// case 'x':
// case 'u':
// case 'U':
// mRange.state = RangeState::rsMultiLineStringEscapeSeq;
// return;
// }
// }
// }
// mRun += 1;
// }
//}
void CppSyntaxer::stringEscapeSeqProc()
{
@ -1156,9 +1151,6 @@ void CppSyntaxer::stringEscapeSeqProc()
break;
}
}
if (mRange.state == RangeState::rsMultiLineStringEscapeSeq)
mRange.state = RangeState::rsMultiLineString;
else
mRange.state = RangeState::rsString;
}
@ -1169,16 +1161,14 @@ void CppSyntaxer::stringProc()
return;
}
mTokenId = TokenId::String;
mRange.state = RangeState::rsString;
while (mRun < mLineSize) {
if (mLine[mRun]=='"') {
mRun+=1;
mRun++;
break;
}
if (mLine[mRun]=='\\') {
} else if (mLine[mRun]=='\\') {
if (mRun == mLineSize-1) {
mRun+=1;
mRange.state = RangeState::rsMultiLineString;
mRun++;
mRange.state = RangeState::rsString;
return;
}
if (mRun+1<mLineSize) {
@ -1271,10 +1261,6 @@ void CppSyntaxer::processChar()
case '{':
braceOpenProc();
break;
case '\r':
case '\n':
spaceProc();
break;
case ':':
colonProc();
break;
@ -1362,8 +1348,6 @@ void CppSyntaxer::processChar()
default:
if (isIdentChar(mLine[mRun])) {
identProc();
} else if (isSpaceChar(mLine[mRun])) {
spaceProc();
} else {
unknownProc();
}
@ -1429,7 +1413,7 @@ bool CppSyntaxer::isLastLineCommentNotFinished(int state) const
bool CppSyntaxer::isLastLineStringNotFinished(int state) const
{
return state == RangeState::rsMultiLineString;
return state == RangeState::rsString;
}
bool CppSyntaxer::eol() const
@ -1493,6 +1477,10 @@ void CppSyntaxer::next()
mAsmStart = false;
mTokenPos = mRun;
do {
if (mRun<mLineSize && isSpaceChar(mLine[mRun])) {
spaceProc();
break;
}
switch (mRange.state) {
case RangeState::rsAnsiC:
case RangeState::rsAnsiCAsm:
@ -1513,17 +1501,11 @@ void CppSyntaxer::next()
//qDebug()<<"*3-0-0*";
directiveEndProc();
break;
case RangeState::rsMultiLineString:
//qDebug()<<"*4-0-0*";
stringEndProc();
break;
case RangeState::rsRawStringEscaping:
case RangeState::rsRawStringNotEscaping:
//qDebug()<<"*5-0-0*";
rawStringProc();
break;
// case RangeState::rsMultiLineString:
// //qDebug()<<"*4-0-0*";
// stringEndProc();
// break;
case RangeState::rsStringEscapeSeq:
case RangeState::rsMultiLineStringEscapeSeq:
//qDebug()<<"*6-0-0*";
stringEscapeSeqProc();
break;
@ -1601,6 +1583,7 @@ void CppSyntaxer::setState(const SyntaxerState& rangeState)
mRange.blockEnded = 0;
mRange.blockEndedLastLine = 0;
mRange.firstIndentThisLine = mRange.indents.length();
mRange.hasTrailingSpaces = false;
mRange.matchingIndents.clear();
}
@ -1617,6 +1600,7 @@ void CppSyntaxer::resetState()
mRange.indents.clear();
mRange.firstIndentThisLine = 0;
mRange.matchingIndents.clear();
mRange.hasTrailingSpaces = false;
mAsmStart = false;
}

View File

@ -48,9 +48,9 @@ class CppSyntaxer: public Syntaxer
rsUnknown, rsAnsiC, rsAnsiCAsm, rsAnsiCAsmBlock, rsAsm,
rsAsmBlock, rsDirective, rsDirectiveComment, rsString,
rsMultiLineString, rsMultiLineDirective, rsCppComment,
rsStringEscapeSeq, rsMultiLineStringEscapeSeq,
rsRawString, rsSpace,rsRawStringEscaping,rsRawStringNotEscaping,rsChar,
rsCppCommentEnded, rsDefineStart, rsDefineIdentifier, rsDefineRemaining
rsStringEscapeSeq,
rsRawString, rsSpace,rsRawStringNotEscaping,rsRawStringEnd,rsChar,
rsDefineIdentifier, rsDefineRemaining
};
public:
@ -124,7 +124,7 @@ private:
void squareCloseProc();
void squareOpenProc();
void starProc();
void stringEndProc();
// void stringEndProc();
void stringEscapeSeqProc();
void stringProc();
void stringStartProc();

View File

@ -203,13 +203,7 @@ const PTokenAttribute &GLSLSyntaxer::localVarAttribute() const
GLSLSyntaxer::TokenId GLSLSyntaxer::getTokenId()
{
if ((mRange.state == RangeState::rsAsm || mRange.state == RangeState::rsAsmBlock)
&& !mAsmStart && !(mTokenId == TokenId::Comment || mTokenId == TokenId::Space
|| mTokenId == TokenId::Null)) {
return TokenId::Asm;
} else {
return mTokenId;
}
}
void GLSLSyntaxer::andSymbolProc()
@ -259,11 +253,7 @@ void GLSLSyntaxer::ansiCProc()
case '*':
if (mLine[mRun+1] == '/') {
mRun += 2;
if (mRange.state == RangeState::rsAnsiCAsm) {
mRange.state = RangeState::rsAsm;
} else if (mRange.state == RangeState::rsAnsiCAsmBlock){
mRange.state = RangeState::rsAsmBlock;
} else if (mRange.state == RangeState::rsDirectiveComment &&
if (mRange.state == RangeState::rsDirectiveComment &&
mLine[mRun] != 0 && mLine[mRun]!='\r' && mLine[mRun]!='\n') {
mRange.state = RangeState::rsMultiLineDirective;
} else {
@ -307,10 +297,6 @@ void GLSLSyntaxer::braceCloseProc()
{
mRun += 1;
mTokenId = TokenId::Symbol;
if (mRange.state == RangeState::rsAsmBlock) {
mRange.state = rsUnknown;
}
mRange.braceLevel -= 1;
mRange.blockLevel -= 1;
if (mRange.braceLevel<0) {
@ -329,10 +315,6 @@ void GLSLSyntaxer::braceOpenProc()
{
mRun += 1;
mTokenId = TokenId::Symbol;
if (mRange.state == RangeState::rsAsm) {
mRange.state = RangeState::rsAsmBlock;
mAsmStart = true;
}
mRange.braceLevel += 1;
mRange.blockLevel += 1;
mRange.blockStarted += 1;
@ -836,8 +818,6 @@ void GLSLSyntaxer::semiColonProc()
{
mRun += 1;
mTokenId = TokenId::Symbol;
if (mRange.state == RangeState::rsAsm)
mRange.state = RangeState::rsUnknown;
while (mRange.getLastIndent() == IndentForStatement) {
popIndents(IndentForStatement);
}
@ -853,11 +833,7 @@ void GLSLSyntaxer::slashProc()
return;
case '*': // C style comment
mTokenId = TokenId::Comment;
if (mRange.state == RangeState::rsAsm) {
mRange.state = RangeState::rsAnsiCAsm;
} else if (mRange.state == RangeState::rsAsmBlock) {
mRange.state = RangeState::rsAnsiCAsmBlock;
} else if (mRange.state == RangeState::rsDirective) {
if (mRange.state == RangeState::rsDirective) {
mRange.state = RangeState::rsDirectiveComment;
} else {
mRange.state = RangeState::rsAnsiC;
@ -883,6 +859,8 @@ void GLSLSyntaxer::spaceProc()
while (mLine[mRun]>=1 && mLine[mRun]<=32)
mRun+=1;
mRange.state = RangeState::rsUnknown;
if (mRun>=mLineSize)
mRange.hasTrailingSpaces=true;
}
void GLSLSyntaxer::squareCloseProc()
@ -1284,8 +1262,6 @@ bool GLSLSyntaxer::getTokenFinished() const
bool GLSLSyntaxer::isLastLineCommentNotFinished(int state) const
{
return (state == RangeState::rsAnsiC ||
state == RangeState::rsAnsiCAsm ||
state == RangeState::rsAnsiCAsmBlock ||
state == RangeState::rsDirectiveComment||
state == RangeState::rsCppComment);
}
@ -1353,13 +1329,10 @@ int GLSLSyntaxer::getTokenPos()
void GLSLSyntaxer::next()
{
mAsmStart = false;
mTokenPos = mRun;
do {
switch (mRange.state) {
case RangeState::rsAnsiC:
case RangeState::rsAnsiCAsm:
case RangeState::rsAnsiCAsmBlock:
case RangeState::rsDirectiveComment:
ansiCProc();
break;
@ -1439,6 +1412,7 @@ void GLSLSyntaxer::setState(const SyntaxerState& rangeState)
mRange.blockEndedLastLine = 0;
mRange.firstIndentThisLine = mRange.indents.length();
mRange.matchingIndents.clear();
mRange.hasTrailingSpaces = false;
}
void GLSLSyntaxer::resetState()
@ -1454,7 +1428,7 @@ void GLSLSyntaxer::resetState()
mRange.indents.clear();
mRange.firstIndentThisLine = 0;
mRange.matchingIndents.clear();
mAsmStart = false;
mRange.hasTrailingSpaces = false;
}
QString GLSLSyntaxer::languageName()

View File

@ -45,8 +45,7 @@ class GLSLSyntaxer: public Syntaxer
};
enum RangeState {
rsUnknown, rsAnsiC, rsAnsiCAsm, rsAnsiCAsmBlock, rsAsm,
rsAsmBlock, rsDirective, rsDirectiveComment, rsString,
rsUnknown, rsAnsiC, rsDirective, rsDirectiveComment, rsString,
rsMultiLineString, rsMultiLineDirective, rsCppComment,
rsStringEscapeSeq, rsMultiLineStringEscapeSeq,
rsRawString, rsSpace,rsRawStringEscaping,rsRawStringNotEscaping,rsChar,
@ -133,7 +132,6 @@ private:
void pushIndents(int indentType);
private:
bool mAsmStart;
SyntaxerState mRange;
// SynRangeState mSpaceRange;
QString mLineString;

View File

@ -201,6 +201,8 @@ void MakefileSyntaxer::procSpace()
mTokenID = TokenId::Space;
while (mLine[mRun]!=0 && mLine[mRun]<=32)
mRun++;
if (mRun>=mStringLen)
mHasTrailingSpaces = true;
}
void MakefileSyntaxer::procNumber()
@ -666,6 +668,7 @@ SyntaxerState MakefileSyntaxer::getState() const
{
SyntaxerState state;
state.state = (int)mState;
state.hasTrailingSpaces = mHasTrailingSpaces;
return state;
}
@ -673,12 +676,14 @@ void MakefileSyntaxer::setState(const SyntaxerState & rangeState)
{
mState = (RangeState)rangeState.state;
mStates.clear();
mHasTrailingSpaces = false;
}
void MakefileSyntaxer::resetState()
{
mState = RangeState::Unknown;
mStates.clear();
mHasTrailingSpaces = false;
}
QSet<QString> MakefileSyntaxer::keywords() const

View File

@ -79,6 +79,7 @@ private:
QVector<RangeState> mStates;
RangeState mState;
TokenId mTokenID;
bool mHasTrailingSpaces;
PTokenAttribute mTargetAttribute;
PTokenAttribute mCommandAttribute;

View File

@ -274,7 +274,8 @@ SyntaxerState::SyntaxerState():
parenthesisLevel(0),
// leftBraces(0),
// rightBraces(0),
firstIndentThisLine(0)
firstIndentThisLine(0),
hasTrailingSpaces(false)
{
}
}

View File

@ -51,6 +51,7 @@ struct SyntaxerState {
QVector<int> matchingIndents; /* the indent matched ( and removed )
but not started at this line
(need by auto indent) */
bool hasTrailingSpaces;
bool operator==(const SyntaxerState& s2);
int getLastIndent();
SyntaxerState();