diff --git a/NEWS.md b/NEWS.md index e86b69c8..8cac1ec1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,10 @@ +Version 0.9.3 For Dev-C++ 7 Beta + - fix: the count in the title of issues view isn't correct + - fix: columns calculation not correct when paint lines containing chinese characters + - fix: restore caret position after reformat code + - enhancement: ask user to rebuild project, when run/debug the project and it has been modified + - fix: correct set the enabled state of "delete line"/"insert line"/"delete word"/"delete to BOL"/"delete to EOL" menu items + Version 0.9.2 For Dev-C++ 7 Beta - fix: gutter of the disassembly code control in the cpu info dialog is grayed - fix: problem set & problem views not correctly hidden when disabled in the executor / problem set options diff --git a/RedPandaIDE/compiler/compilermanager.cpp b/RedPandaIDE/compiler/compilermanager.cpp index ebc96c31..c9ddc372 100644 --- a/RedPandaIDE/compiler/compilermanager.cpp +++ b/RedPandaIDE/compiler/compilermanager.cpp @@ -330,8 +330,9 @@ void CompilerManager::onSyntaxCheckIssue(PCompileIssue issue) { if (issue->type == CompileIssueType::Error) mSyntaxCheckErrorCount++; - mSyntaxCheckIssueCount++; - + if (issue->type == CompileIssueType::Error || + issue->type == CompileIssueType::Warning) + mSyntaxCheckIssueCount++; } int CompilerManager::syntaxCheckIssueCount() const diff --git a/RedPandaIDE/compiler/projectcompiler.cpp b/RedPandaIDE/compiler/projectcompiler.cpp index 90a04d91..379053f7 100644 --- a/RedPandaIDE/compiler/projectcompiler.cpp +++ b/RedPandaIDE/compiler/projectcompiler.cpp @@ -265,9 +265,9 @@ void ProjectCompiler::writeMakeClean(QFile &file) { writeln(file, "clean: clean-custom"); if (mProject->options().type == ProjectType::DynamicLib) - writeln(file, "\t${RM} $(CLEANOBJ) $(BIN) $(DEF) $(STATIC) > NUL 2>&1 "); + writeln(file, "\t${RM} $(CLEANOBJ) $(BIN) $(DEF) $(STATIC) > NUL 2>&1"); else - writeln(file, "\t${RM} $(CLEANOBJ) $(BIN) > NUL 2>&1 "); + writeln(file, "\t${RM} $(CLEANOBJ) $(BIN) > NUL 2>&1"); writeln(file); } diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 7873cbb1..5755af9e 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -876,7 +876,6 @@ void Editor::onPreparePaintHighlightToken(int line, int aChar, const QString &to if (token.isEmpty()) return; -// qDebug()<name()<<" - "<identifierAttribute())) { BufferCoord p{aChar,line}; BufferCoord pBeginPos,pEndPos; @@ -3569,6 +3568,8 @@ void Editor::reformat() pSettings->dirs().app(), args, content); + int oldTopLine = topLine(); + BufferCoord mOldCaret = caretXY(); selectAll(); SynEditorOptions oldOptions = getOptions(); @@ -3576,6 +3577,8 @@ void Editor::reformat() newOptions.setFlag(SynEditorOption::eoAutoIndent,false); setOptions(newOptions); setSelText(QString::fromUtf8(newContent)); + setCaretXY(mOldCaret); + setTopLine(oldTopLine); setOptions(oldOptions); reparse(); checkSyntaxInBack(); diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 89568946..dd964017 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -339,6 +339,12 @@ void MainWindow::updateEditorActions() ui->actionUnIndent->setEnabled(false); ui->actionUndo->setEnabled(false); ui->actionUnfoldAll->setEnabled(false); + ui->actionDelete_Line->setEnabled(false); + ui->actionDelete_Word->setEnabled(false); + ui->actionDuplicate_Line->setEnabled(false); + ui->actionDelete_to_BOL->setEnabled(false); + ui->actionDelete_to_EOL->setEnabled(false); + ui->actionFind->setEnabled(false); ui->actionReplace->setEnabled(false); ui->actionFind_Next->setEnabled(false); @@ -379,6 +385,11 @@ void MainWindow::updateEditorActions() ui->actionToggleComment->setEnabled(!e->readOnly() && e->lines()->count()>0); ui->actionUnIndent->setEnabled(!e->readOnly() && e->lines()->count()>0); ui->actionUnfoldAll->setEnabled(e->lines()->count()>0); + ui->actionDelete_Line->setEnabled(!e->readOnly() && e->lines()->count()>0); + ui->actionDelete_Word->setEnabled(!e->readOnly() && e->lines()->count()>0); + ui->actionDuplicate_Line->setEnabled(!e->readOnly() && e->lines()->count()>0); + ui->actionDelete_to_BOL->setEnabled(!e->readOnly() && e->lines()->count()>0); + ui->actionDelete_to_EOL->setEnabled(!e->readOnly() && e->lines()->count()>0); ui->actionFind->setEnabled(true); ui->actionReplace->setEnabled(true); @@ -1079,30 +1090,14 @@ void MainWindow::checkSyntaxInBack(Editor *e) mCompilerManager->checkSyntax(e->filename(),e->text(), e->fileEncoding() == ENCODING_ASCII, nullptr); } -// if not PrepareForCompile(cttStdin,True) then begin -// fCheckSyntaxInBack:=False; -// Exit; -// end; -// if e.InProject then begin -// if not assigned(MainForm.fProject) then -// Exit; -// fSyntaxChecker.Project := MainForm.fProject; -// end; - // fSyntaxChecker.CheckSyntax(True); } bool MainWindow::compile(bool rebuild) { CompileTarget target =getCompileTarget(); if (target == CompileTarget::Project) { - if (!mProject->saveUnits()) - return false; - // Check if saves have been succesful - for (int i=0; ipageCount();i++) { - Editor * e= (*(mEditorList))[i]; - if (e->inProject() && e->modified()) - return false; - } + if (mProject->modified()) + mProject->saveAll(); clearIssues(); // Increment build number automagically @@ -1209,6 +1204,18 @@ void MainWindow::runExecutable(RunType runType) { CompileTarget target =getCompileTarget(); if (target == CompileTarget::Project) { + if (mProject->modified() && + QMessageBox::question( + this, + tr("Rebuild Project"), + tr("Project has been modified, do you want to rebuild it?") + ) == QMessageBox::Yes) { + mProject->saveAll(); + mCompileSuccessionTask=std::make_shared(); + mCompileSuccessionTask->type = CompileSuccessionTaskType::RunNormal; + compile(); + return; + } runExecutable(mProject->executable(),mProject->filename(),runType); } else { Editor * editor = mEditorList->getEditor(); @@ -1277,6 +1284,17 @@ void MainWindow::debug() } return; } + if (mProject->modified() && + QMessageBox::question( + this, + tr("Compile Project"), + tr("Project has been modified, do you want to rebuild it?") + ) == QMessageBox::Yes) { + mCompileSuccessionTask=std::make_shared(); + mCompileSuccessionTask->type = CompileSuccessionTaskType::Debug; + compile(); + return; + } // Did we choose a host application for our DLL? if (mProject->options().type == ProjectType::DynamicLib) { if (mProject->options().hostApplication.isEmpty()) { @@ -5703,7 +5721,6 @@ void MainWindow::on_actionDelete_Line_triggered() } } - void MainWindow::on_actionDuplicate_Line_triggered() { Editor *e=mEditorList->getEditor(); diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui index 52bd5973..d45c3e17 100644 --- a/RedPandaIDE/mainwindow.ui +++ b/RedPandaIDE/mainwindow.ui @@ -506,7 +506,7 @@ QTabWidget::South - 6 + 0 @@ -702,7 +702,7 @@ QTabWidget::North - 2 + 0 @@ -1381,7 +1381,7 @@ 0 0 1114 - 25 + 30 @@ -2613,26 +2613,41 @@ Delete Line + + Ctrl+D + Duplicate Line + + Ctrl+E + Delete Word + + Ctrl+Shift+D + Delete to EOL + + Ctrl+Del + Delete to BOL + + Ctrl+Backspace + diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index 5194d8f3..3c1793f3 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -250,6 +250,10 @@ void SynEdit::setCaretXYEx(bool CallEnsureCursorPos, BufferCoord value) invalidateLine(mCaretY); invalidateLine(oldCaretY); } + if (mGutter.activeLineTextColor().isValid()) { + invalidateGutterLine(mCaretY); + invalidateGutterLine(oldCaretY); + } mStatusChanges.setFlag(SynStatusChange::scCaretY); } // Call UpdateLastCaretX before DecPaintLock because the event handler it @@ -829,7 +833,7 @@ int SynEdit::columnToChar(int aLine, int aColumn) const int SynEdit::stringColumns(const QString &line, int colsBefore) const { - int columns = colsBefore; + int columns = std::max(0,colsBefore); int charCols; for (int i=0;imHighlighter->next(); } // Don't assume HL.GetTokenPos is valid after HL.GetEOL == True. - nTokenColumnsBefore += edit->stringColumns(sToken,nTokenColumnsBefore-1); + nTokenColumnsBefore += edit->stringColumns(sToken,nTokenColumnsBefore); if (edit->mHighlighter->eol() && (nTokenColumnsBefore < vLastChar)) { int lineColumns = edit->mLines->lineColumns(vLine-1); // Draw text that couldn't be parsed by the highlighter, if any.