From a6e884628248a306aac442c9891d1de4030652d1 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Sat, 13 Nov 2021 12:33:33 +0800 Subject: [PATCH 01/25] - enhancement: drag & drop text in the editor - enhancement: auto calcuate caret line size basing on font size - enhancement: shift+mouse wheel to scroll horizontally --- NEWS.md | 3 + RedPandaIDE/qsynedit/SynEdit.cpp | 133 ++++++++++++++++++++++++++----- RedPandaIDE/qsynedit/SynEdit.h | 11 +++ 3 files changed, 129 insertions(+), 18 deletions(-) diff --git a/NEWS.md b/NEWS.md index d62addf8..fe25fef1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,9 @@ Version 0.8.7 For Dev-C++ 7 Beta - fix: when enter '{' or '}' at beginning of line, auto indent will remove all contents of the line - fix: auto indent should be turned off when reformat code - fix: auto indent should be turned off when replace in code + - enhancement: drag & drop text in the editor + - enhancement: auto calcuate caret line size basing on font size + - enhancement: shift+mouse wheel to scroll horizontally Version 0.8.6 For Dev-C++ 7 Beta - enhancement: greatly reduces memory usage for symbol parsing ( memory needed for bits/stdc++.h reduced from 150m+ to 80m+) diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index cbaed964..c6bbccaf 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -19,6 +19,8 @@ #include #include #include +#include +#include SynEdit::SynEdit(QWidget *parent) : QAbstractScrollArea(parent) { @@ -142,6 +144,7 @@ SynEdit::SynEdit(QWidget *parent) : QAbstractScrollArea(parent) setAttribute(Qt::WA_InputMethodEnabled); //setMouseTracking(true); + setAcceptDrops(true); } int SynEdit::displayLineCount() const @@ -1208,6 +1211,8 @@ void SynEdit::showCaret() { if (m_blinkTimerId==0) m_blinkTimerId = startTimer(500); + m_blinkStatus = 1; + updateCaret(); } void SynEdit::hideCaret() @@ -3580,25 +3585,40 @@ void SynEdit::paintCaret(QPainter &painter, const QRect rcClip) } else { ct =mOverwriteCaret; } + QColor caretColor; if (mCaretUseTextColor) { - painter.setPen(mForegroundColor); + caretColor = mForegroundColor; } else { - painter.setPen(mCaretColor); + caretColor = mCaretColor; } switch(ct) { - case SynEditCaretType::ctVerticalLine: - painter.drawLine(rcClip.left()+1,rcClip.top(),rcClip.left()+1,rcClip.bottom()); + case SynEditCaretType::ctVerticalLine: { + QRect caretRC; + int size = std::max(1,(rcClip.bottom()-rcClip.top())/15); + caretRC.setLeft(rcClip.left()+1); + caretRC.setTop(rcClip.top()); + caretRC.setBottom(rcClip.bottom()); + caretRC.setRight(rcClip.left()+1+size); + painter.fillRect(caretRC,caretColor); break; - case SynEditCaretType::ctHorizontalLine: - painter.drawLine(rcClip.left(),rcClip.bottom()-1,rcClip.right(),rcClip.bottom()-1); + } + case SynEditCaretType::ctHorizontalLine: { + QRect caretRC; + int size = std::max(1,(rcClip.bottom()-rcClip.top())/15); + caretRC.setLeft(rcClip.left()); + caretRC.setTop(rcClip.bottom()-1+size); + caretRC.setBottom(rcClip.bottom()-1); + caretRC.setRight(rcClip.right()); + painter.fillRect(caretRC,caretColor); break; + } case SynEditCaretType::ctBlock: - painter.fillRect(rcClip, mCaretColor); + painter.fillRect(rcClip, caretColor); break; case SynEditCaretType::ctHalfBlock: QRect rc=rcClip; rc.setTop(rcClip.top()+rcClip.height() / 2); - painter.fillRect(rcClip, mCaretColor); + painter.fillRect(rcClip, caretColor); break; } } @@ -5899,7 +5919,7 @@ void SynEdit::mousePressEvent(QMouseEvent *event) mStateFlags.setFlag(SynStateFlag::sfWaitForDragging,false); if (bWasSel && mOptions.testFlag(eoDragDropEditing) && (X >= mGutterWidth + 2) && (mSelectionMode == SynSelectionMode::smNormal) && isPointInSelection(displayToBufferPos(pixelsToRowColumn(X, Y))) ) { - bStartDrag = true; + bStartDrag = true; } if (bStartDrag) { mStateFlags.setFlag(SynStateFlag::sfWaitForDragging); @@ -5959,7 +5979,15 @@ void SynEdit::mouseMoveEvent(QMouseEvent *event) if ((mStateFlags.testFlag(SynStateFlag::sfWaitForDragging))) { if ( ( event->pos() - mMouseDownPos).manhattanLength()>=QApplication::startDragDistance()) { - mStateFlags.setFlag(SynStateFlag::sfWaitForDragging); + mStateFlags.setFlag(SynStateFlag::sfWaitForDragging,false); + QDrag *drag = new QDrag(this); + QMimeData *mimeData = new QMimeData; + + mimeData->setText(selText()); + drag->setMimeData(mimeData); + + Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction); + //drag->setPixmap(iconPixmap); //BeginDrag(false); } // } else if ((buttons == Qt::LeftButton) && (X > mGutterWidth)) { @@ -6017,14 +6045,26 @@ void SynEdit::leaveEvent(QEvent *) void SynEdit::wheelEvent(QWheelEvent *event) { - if (event->angleDelta().y()>0) { - verticalScrollBar()->setValue(verticalScrollBar()->value()-mMouseWheelScrollSpeed); - event->accept(); - return; - } else if (event->angleDelta().y()<0) { - verticalScrollBar()->setValue(verticalScrollBar()->value()+mMouseWheelScrollSpeed); - event->accept(); - return; + if (event->modifiers() == Qt::ShiftModifier) { + if (event->angleDelta().y()>0) { + horizontalScrollBar()->setValue(horizontalScrollBar()->value()-mMouseWheelScrollSpeed); + event->accept(); + return; + } else if (event->angleDelta().y()<0) { + horizontalScrollBar()->setValue(horizontalScrollBar()->value()+mMouseWheelScrollSpeed); + event->accept(); + return; + } + } else { + if (event->angleDelta().y()>0) { + verticalScrollBar()->setValue(verticalScrollBar()->value()-mMouseWheelScrollSpeed); + event->accept(); + return; + } else if (event->angleDelta().y()<0) { + verticalScrollBar()->setValue(verticalScrollBar()->value()+mMouseWheelScrollSpeed); + event->accept(); + return; + } } QAbstractScrollArea::wheelEvent(event); } @@ -6052,6 +6092,63 @@ QVariant SynEdit::inputMethodQuery(Qt::InputMethodQuery property) const } +void SynEdit::dragEnterEvent(QDragEnterEvent *event) +{ + if (event->mimeData()->hasFormat("text/plain")) { + event->acceptProposedAction(); + mDragCaretSave = caretXY(); + mDragSelBeginSave = blockBegin(); + mDragSelEndSave = blockEnd(); + BufferCoord coord = displayToBufferPos(pixelsToNearestRowColumn(event->pos().x(), + event->pos().y())); + setCaretXY(coord); + setBlockBegin(mDragSelBeginSave); + setBlockEnd(mDragSelEndSave); + showCaret(); + } +} + +void SynEdit::dropEvent(QDropEvent *event) +{ + mUndoList->BeginBlock(); + auto action = finally([this] { + mUndoList->EndBlock(); + }); + if (event->proposedAction() == Qt::DropAction::MoveAction) { + setBlockBegin(mDragSelBeginSave); + setBlockEnd(mDragSelEndSave); + setSelText(""); + } + BufferCoord coord = displayToBufferPos(pixelsToNearestRowColumn(event->pos().x(), + event->pos().y())); + setCaretXY(coord); + setSelText(event->mimeData()->text()); + event->acceptProposedAction(); +} + +void SynEdit::dragMoveEvent(QDragMoveEvent *event) +{ + if (event->keyboardModifiers() == Qt::ControlModifier) { + event->setDropAction(Qt::CopyAction); + } else { + event->setDropAction(Qt::MoveAction); + } + BufferCoord coord = displayToBufferPos(pixelsToNearestRowColumn(event->pos().x(), + event->pos().y())); + setCaretXY(coord); + setBlockBegin(mDragSelBeginSave); + setBlockEnd(mDragSelEndSave); + showCaret(); +} + +void SynEdit::dragLeaveEvent(QDragLeaveEvent *event) +{ + setCaretXY(mDragCaretSave); + setBlockBegin(mDragSelBeginSave); + setBlockEnd(mDragSelEndSave); + showCaret(); +} + int SynEdit::maxScrollHeight() const { if (mOptions.testFlag(eoScrollPastEof)) diff --git a/RedPandaIDE/qsynedit/SynEdit.h b/RedPandaIDE/qsynedit/SynEdit.h index 234c6637..292f081f 100644 --- a/RedPandaIDE/qsynedit/SynEdit.h +++ b/RedPandaIDE/qsynedit/SynEdit.h @@ -696,6 +696,10 @@ private: int mMouseWheelScrollSpeed; + BufferCoord mDragCaretSave; + BufferCoord mDragSelBeginSave; + BufferCoord mDragSelEndSave; + friend class SynEditTextPainter; // QWidget interface @@ -722,6 +726,13 @@ bool viewportEvent(QEvent * event) override; // QWidget interface public: QVariant inputMethodQuery(Qt::InputMethodQuery property) const override; + +// QWidget interface +protected: +void dragEnterEvent(QDragEnterEvent *event) override; +void dropEvent(QDropEvent *event) override; +void dragMoveEvent(QDragMoveEvent *event) override; +void dragLeaveEvent(QDragLeaveEvent *event) override; }; #endif // SYNEDIT_H From be2c1ec77fbc1c65d6bad25da9151690ec43856c Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Sat, 13 Nov 2021 13:03:42 +0800 Subject: [PATCH 02/25] - fix: greatly reduces paste time --- NEWS.md | 1 + RedPandaIDE/qsynedit/SynEdit.cpp | 23 ++++++++++++++--------- RedPandaIDE/qsynedit/SynEdit.h | 2 +- RedPandaIDE/qsynedit/TextBuffer.cpp | 5 +++-- RedPandaIDE/qsynedit/TextBuffer.h | 2 +- RedPandaIDE/systemconsts.h | 2 +- 6 files changed, 21 insertions(+), 14 deletions(-) diff --git a/NEWS.md b/NEWS.md index fe25fef1..c8221482 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,6 +6,7 @@ Version 0.8.7 For Dev-C++ 7 Beta - enhancement: drag & drop text in the editor - enhancement: auto calcuate caret line size basing on font size - enhancement: shift+mouse wheel to scroll horizontally + - fix: greatly reduces paste time Version 0.8.6 For Dev-C++ 7 Beta - enhancement: greatly reduces memory usage for symbol parsing ( memory needed for bits/stdc++.h reduced from 150m+ to 80m+) diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index c6bbccaf..f5f337ed 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -4942,12 +4942,13 @@ void SynEdit::doLinesInserted(int firstLine, int count) // end; } -void SynEdit::properSetLine(int ALine, const QString &ALineText) +void SynEdit::properSetLine(int ALine, const QString &ALineText, bool notify) { - if (mOptions.testFlag(eoTrimTrailingSpaces)) - mLines->putString(ALine,TrimRight(ALineText)); - else - mLines->putString(ALine,ALineText); + if (mOptions.testFlag(eoTrimTrailingSpaces)) { + mLines->putString(ALine,TrimRight(ALineText),notify); + } else { + mLines->putString(ALine,ALineText,notify); + } } void SynEdit::deleteSelection(const BufferCoord &BB, const BufferCoord &BE) @@ -5041,6 +5042,10 @@ void SynEdit::insertText(const QString &Value, SynSelectionMode PasteMode,bool A int SynEdit::insertTextByNormalMode(const QString &Value) { + mLines->beginUpdate(); + auto actionLines = finally([this] { + mLines->endUpdate(); + }); QString sLeftSide; QString sRightSide; QString Str; @@ -5090,9 +5095,9 @@ int SynEdit::insertTextByNormalMode(const QString &Value) Start = P; P = GetEOL(Value,Start); if (P == Start) { - if (PfString = s; mList[Index]->fColumns = -1; - emit putted(Index,1); + if (notify) + emit putted(Index,1); endUpdate(); } } diff --git a/RedPandaIDE/qsynedit/TextBuffer.h b/RedPandaIDE/qsynedit/TextBuffer.h index 50b387dd..4d484c5b 100644 --- a/RedPandaIDE/qsynedit/TextBuffer.h +++ b/RedPandaIDE/qsynedit/TextBuffer.h @@ -67,7 +67,7 @@ public: void setContents(const QStringList& text); QStringList contents(); - void putString(int Index, const QString& s); + void putString(int Index, const QString& s, bool notify=true); void putObject(int Index, void * AObject); void beginUpdate(); diff --git a/RedPandaIDE/systemconsts.h b/RedPandaIDE/systemconsts.h index de3b4b01..cecd1453 100644 --- a/RedPandaIDE/systemconsts.h +++ b/RedPandaIDE/systemconsts.h @@ -3,7 +3,7 @@ #include -#define DEVCPP_VERSION "beta.0.8.6" +#define DEVCPP_VERSION "beta.0.8.8" #define APP_SETTSINGS_FILENAME "redpandacpp.ini" #ifdef Q_OS_WIN From a9aa098c29fb54914d496be567746d4e6c30a1cc Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Sat, 13 Nov 2021 13:09:50 +0800 Subject: [PATCH 03/25] - fix: greatly reduces paste time --- RedPandaIDE/qsynedit/SynEdit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index f5f337ed..d0f88af2 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -1434,7 +1434,7 @@ int SynEdit::calcIndentSpaces(int line, const QString& lineText, bool addIndent) QString s; while (startLine>=1) { s = mLines->getString(startLine-1); - if (!s.trimmed().isEmpty()) { + if (!s.startsWith('#') && !s.trimmed().isEmpty()) { break; } startLine -- ; From 966aac5d4a7afd147e2bef6de3dc6d776c1a3e30 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Sat, 13 Nov 2021 13:10:56 +0800 Subject: [PATCH 04/25] - fix: auto indent shouldn't use preprocessor's indent to calculate --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index c8221482..681e8ba1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -7,6 +7,7 @@ Version 0.8.7 For Dev-C++ 7 Beta - enhancement: auto calcuate caret line size basing on font size - enhancement: shift+mouse wheel to scroll horizontally - fix: greatly reduces paste time + - fix: auto indent shouldn't use preprocessor's indent to calculate Version 0.8.6 For Dev-C++ 7 Beta - enhancement: greatly reduces memory usage for symbol parsing ( memory needed for bits/stdc++.h reduced from 150m+ to 80m+) From c4b61b8985f944be8c68233483006f0ced6a3d82 Mon Sep 17 00:00:00 2001 From: royqh1979 Date: Sat, 13 Nov 2021 17:15:07 +0800 Subject: [PATCH 05/25] - fix: option "don't add leading zeros to line numbers" not work --- NEWS.md | 1 + RedPandaIDE/cpprefacter.cpp | 2 +- RedPandaIDE/qsynedit/MiscClasses.cpp | 11 +++++++---- RedPandaIDE/qsynedit/SynEdit.cpp | 4 ++-- RedPandaIDE/widgets/darkfusionstyle.cpp | 4 ++-- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/NEWS.md b/NEWS.md index 681e8ba1..ccb464bb 100644 --- a/NEWS.md +++ b/NEWS.md @@ -8,6 +8,7 @@ Version 0.8.7 For Dev-C++ 7 Beta - enhancement: shift+mouse wheel to scroll horizontally - fix: greatly reduces paste time - fix: auto indent shouldn't use preprocessor's indent to calculate + - fix: option "don't add leading zeros to line numbers" not work Version 0.8.6 For Dev-C++ 7 Beta - enhancement: greatly reduces memory usage for symbol parsing ( memory needed for bits/stdc++.h reduced from 150m+ to 80m+) diff --git a/RedPandaIDE/cpprefacter.cpp b/RedPandaIDE/cpprefacter.cpp index 37eb56e9..1fcb5958 100644 --- a/RedPandaIDE/cpprefacter.cpp +++ b/RedPandaIDE/cpprefacter.cpp @@ -48,7 +48,7 @@ bool CppRefacter::findOccurence(Editor *editor, const BufferCoord &pos) bool CppRefacter::findOccurence(const QString &statementFullname, SearchFileScope scope) { PCppParser parser; - Editor * editor; + Editor * editor=nullptr; std::shared_ptr project; if (scope == SearchFileScope::currentFile) { editor = pMainWindow->editorList()->getEditor(); diff --git a/RedPandaIDE/qsynedit/MiscClasses.cpp b/RedPandaIDE/qsynedit/MiscClasses.cpp index 823edcd7..01e60b5c 100644 --- a/RedPandaIDE/qsynedit/MiscClasses.cpp +++ b/RedPandaIDE/qsynedit/MiscClasses.cpp @@ -95,7 +95,11 @@ QString SynGutter::formatLineNumber(int line) { line += (mLineNumberStart - 1); QString result = QString::number(line); - return QString(mAutoSizeDigitCount - result.length(),'0') + result; + if (mLeadingZeros) { + return QString(mAutoSizeDigitCount - result.length(),'0') + result; + } else { + return result; + } } int SynGutter::realGutterWidth(int charWidth) @@ -315,10 +319,9 @@ void SynGutter::setBorderColor(const QColor &value) } -SynEditMark::SynEditMark(QObject *parent) +SynEditMark::SynEditMark(QObject * /*parent*/) { mBookmarkNum = -1; - } int SynEditMark::Char() const @@ -405,7 +408,7 @@ void SynEditMark::setLine(int line) } } -SynBookMarkOpt::SynBookMarkOpt(QObject *parent) +SynBookMarkOpt::SynBookMarkOpt(QObject */*parent*/) { mDrawBookmarksFirst = true; mEnableKeys = true; diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index d0f88af2..6b4caa5c 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -5991,7 +5991,7 @@ void SynEdit::mouseMoveEvent(QMouseEvent *event) mimeData->setText(selText()); drag->setMimeData(mimeData); - Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction); + drag->exec(Qt::CopyAction | Qt::MoveAction); //drag->setPixmap(iconPixmap); //BeginDrag(false); } @@ -6146,7 +6146,7 @@ void SynEdit::dragMoveEvent(QDragMoveEvent *event) showCaret(); } -void SynEdit::dragLeaveEvent(QDragLeaveEvent *event) +void SynEdit::dragLeaveEvent(QDragLeaveEvent *) { setCaretXY(mDragCaretSave); setBlockBegin(mDragSelBeginSave); diff --git a/RedPandaIDE/widgets/darkfusionstyle.cpp b/RedPandaIDE/widgets/darkfusionstyle.cpp index ac5560fc..b5cc66c9 100644 --- a/RedPandaIDE/widgets/darkfusionstyle.cpp +++ b/RedPandaIDE/widgets/darkfusionstyle.cpp @@ -807,8 +807,8 @@ void DarkFusionStyle::drawControl(ControlElement element, const QStyleOption *op case CE_MenuItem: // Draws one item in a popup menu. if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast(option)) { - QColor highlightOutline = highlightedOutline; - QColor highlight = option->palette.highlight().color(); + //QColor highlightOutline = highlightedOutline; + //QColor highlight = option->palette.highlight().color(); if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) { painter->save(); int w = 0; From 7c0ee9857baa13316b9e80667863ffa06c4afc26 Mon Sep 17 00:00:00 2001 From: royqh1979 Date: Sat, 13 Nov 2021 17:41:16 +0800 Subject: [PATCH 06/25] - fix: "collapse all" and "uncollapse all" doesn't work --- NEWS.md | 13 ++++++++----- RedPandaIDE/mainwindow.cpp | 5 ++--- RedPandaIDE/qsynedit/SynEdit.cpp | 16 ++++++++++++++++ RedPandaIDE/qsynedit/SynEdit.h | 2 ++ 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/NEWS.md b/NEWS.md index ccb464bb..a87eed53 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,14 +1,17 @@ -Version 0.8.7 For Dev-C++ 7 Beta - - enhancement: auto indent line to column 1 when enter '#' at beginning of line - - fix: when enter '{' or '}' at beginning of line, auto indent will remove all contents of the line - - fix: auto indent should be turned off when reformat code - - fix: auto indent should be turned off when replace in code +Version 0.8.8 For Dev-C++ 7 Beta - enhancement: drag & drop text in the editor - enhancement: auto calcuate caret line size basing on font size - enhancement: shift+mouse wheel to scroll horizontally - fix: greatly reduces paste time - fix: auto indent shouldn't use preprocessor's indent to calculate - fix: option "don't add leading zeros to line numbers" not work + - fix: "collapse all" and "uncollapse all" doesn't work + +Version 0.8.7 For Dev-C++ 7 Beta + - enhancement: auto indent line to column 1 when enter '#' at beginning of line + - fix: when enter '{' or '}' at beginning of line, auto indent will remove all contents of the line + - fix: auto indent should be turned off when reformat code + - fix: auto indent should be turned off when replace in code Version 0.8.6 For Dev-C++ 7 Beta - enhancement: greatly reduces memory usage for symbol parsing ( memory needed for bits/stdc++.h reduced from 150m+ to 80m+) diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 06939749..8c6058df 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -3773,7 +3773,7 @@ void MainWindow::on_actionUnfoldAll_triggered() { Editor * editor = mEditorList->getEditor(); if (editor != NULL ) { - //editor->clearFolds(); + editor->unCollpaseAll(); } } @@ -3781,8 +3781,7 @@ void MainWindow::on_actionFoldAll_triggered() { Editor * editor = mEditorList->getEditor(); if (editor != NULL ) { - //editor->clearFolds(); - //editor->foldAll(); + editor->collapseAll(); } } diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index 6b4caa5c..37590b7a 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -1066,6 +1066,20 @@ void SynEdit::setCaretAndSelection(const BufferCoord &ptCaret, const BufferCoord setBlockEnd(ptAfter); } +void SynEdit::collapseAll() +{ + for (int i = mAllFoldRanges.count()-1;i>=0;i--){ + collapse(mAllFoldRanges[i]); + } +} + +void SynEdit::unCollpaseAll() +{ + for (int i = mAllFoldRanges.count()-1;i>=0;i--){ + uncollapse(mAllFoldRanges[i]); + } +} + void SynEdit::processGutterClick(QMouseEvent *event) { int X = event->pos().x(); @@ -5054,6 +5068,7 @@ int SynEdit::insertTextByNormalMode(const QString &Value) bool bChangeScroll; // int SpaceCount; int Result = 0; + int startLine = mCaretY; sLeftSide = lineText().mid(0, mCaretX - 1); if (mCaretX - 1 > sLeftSide.length()) { if (StringIsBlank(sLeftSide)) @@ -5122,6 +5137,7 @@ int SynEdit::insertTextByNormalMode(const QString &Value) internalSetCaretXY(BufferCoord{lineText().length()+1,caretY}); } else internalSetCaretXY(BufferCoord{Str.length() - sRightSide.length()+1,caretY}); + onLinesPutted(startLine-1,Result+1); return Result; } diff --git a/RedPandaIDE/qsynedit/SynEdit.h b/RedPandaIDE/qsynedit/SynEdit.h index 571848ad..596bdc63 100644 --- a/RedPandaIDE/qsynedit/SynEdit.h +++ b/RedPandaIDE/qsynedit/SynEdit.h @@ -219,6 +219,8 @@ public: const BufferCoord& ptBefore, const BufferCoord& ptAfter); + void collapseAll(); + void unCollpaseAll(); void uncollapseAroundLine(int line); PSynEditFoldRange foldHidesLine(int line); void setSelLength(int Value); From d14a1be2084a13e2725601d58e52ece37141a990 Mon Sep 17 00:00:00 2001 From: royqh1979 Date: Sun, 14 Nov 2021 17:43:25 +0800 Subject: [PATCH 07/25] - fix: text color of labels in statusbar not correctly updated when change theme - change: auto generate gcc version info in the about dialog - change: seperates version info to version.h --- NEWS.md | 3 +++ RedPandaIDE/RedPandaIDE.pro | 1 + RedPandaIDE/compiler/projectcompiler.cpp | 1 + RedPandaIDE/mainwindow.cpp | 5 +++++ RedPandaIDE/systemconsts.h | 2 -- RedPandaIDE/utils.cpp | 1 + RedPandaIDE/version.h | 7 +++++++ RedPandaIDE/widgets/aboutdialog.cpp | 15 ++++++++++++++- 8 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 RedPandaIDE/version.h diff --git a/NEWS.md b/NEWS.md index a87eed53..1af61294 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +Version 0.8.9 For Dev-C++ 7 Beta + - fix: text color of labels in statusbar not correctly updated when change theme + Version 0.8.8 For Dev-C++ 7 Beta - enhancement: drag & drop text in the editor - enhancement: auto calcuate caret line size basing on font size diff --git a/RedPandaIDE/RedPandaIDE.pro b/RedPandaIDE/RedPandaIDE.pro index c3592332..a552b31b 100644 --- a/RedPandaIDE/RedPandaIDE.pro +++ b/RedPandaIDE/RedPandaIDE.pro @@ -197,6 +197,7 @@ HEADERS += \ thememanager.h \ todoparser.h \ toolsmanager.h \ + version.h \ widgets/aboutdialog.h \ widgets/bookmarkmodel.h \ widgets/classbrowser.h \ diff --git a/RedPandaIDE/compiler/projectcompiler.cpp b/RedPandaIDE/compiler/projectcompiler.cpp index 0cefe35a..cfeb7cbd 100644 --- a/RedPandaIDE/compiler/projectcompiler.cpp +++ b/RedPandaIDE/compiler/projectcompiler.cpp @@ -4,6 +4,7 @@ #include "../systemconsts.h" #include "../platform.h" #include "../editor.h" +#include "../version.h" #include diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 8c6058df..70ac0b22 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -20,6 +20,7 @@ #include "widgets/darkfusionstyle.h" #include "problems/problemcasevalidator.h" #include "widgets/ojproblempropertywidget.h" +#include "version.h" #include #include @@ -511,6 +512,10 @@ void MainWindow::applySettings() else QApplication::setStyle("fusion"); qApp->setPalette(appTheme->palette()); + //fix for qstatusbar bug + mFileEncodingStatus->setPalette(appTheme->palette()); + mFileModeStatus->setPalette(appTheme->palette()); + mFileInfoStatus->setPalette(appTheme->palette()); updateEditorColorSchemes(); QFont font(pSettings->environment().interfaceFont(), diff --git a/RedPandaIDE/systemconsts.h b/RedPandaIDE/systemconsts.h index cecd1453..df92700d 100644 --- a/RedPandaIDE/systemconsts.h +++ b/RedPandaIDE/systemconsts.h @@ -3,8 +3,6 @@ #include -#define DEVCPP_VERSION "beta.0.8.8" - #define APP_SETTSINGS_FILENAME "redpandacpp.ini" #ifdef Q_OS_WIN #define GCC_PROGRAM "gcc.exe" diff --git a/RedPandaIDE/utils.cpp b/RedPandaIDE/utils.cpp index 4cb6e285..6132c124 100644 --- a/RedPandaIDE/utils.cpp +++ b/RedPandaIDE/utils.cpp @@ -22,6 +22,7 @@ #include "editorlist.h" #include "editor.h" #include "project.h" +#include "version.h" const QByteArray GuessTextEncoding(const QByteArray& text){ bool allAscii; diff --git a/RedPandaIDE/version.h b/RedPandaIDE/version.h new file mode 100644 index 00000000..feae575c --- /dev/null +++ b/RedPandaIDE/version.h @@ -0,0 +1,7 @@ +#ifndef VERSION_H +#define VERSION_H +#include + +#define DEVCPP_VERSION "beta.0.8.9" + +#endif // VERSION_H diff --git a/RedPandaIDE/widgets/aboutdialog.cpp b/RedPandaIDE/widgets/aboutdialog.cpp index 2f11ac5f..4999f53a 100644 --- a/RedPandaIDE/widgets/aboutdialog.cpp +++ b/RedPandaIDE/widgets/aboutdialog.cpp @@ -1,6 +1,8 @@ #include "aboutdialog.h" #include "ui_aboutdialog.h" #include "../systemconsts.h" +#include "../version.h" + AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent), @@ -8,9 +10,20 @@ AboutDialog::AboutDialog(QWidget *parent) : { ui->setupUi(this); ui->lblTitle->setText(ui->lblTitle->text() + tr("Version: ") + DEVCPP_VERSION); + +#ifdef __GNUC__ ui->lblContent->setText(ui->lblContent->text() .arg(qVersion()) - .arg("GCC 10.3.0",__DATE__, __TIME__)); + .arg(QString("GCC %1.%2") + .arg(__GNUC__) + .arg(__GNUC_MINOR__) + ,__DATE__, __TIME__)); +#else + ui->lblContent->setText(ui->lblContent->text() + .arg(qVersion()) + .arg("Non-GCC Compiler" + ,__DATE__, __TIME__)); +#endif } AboutDialog::~AboutDialog() From c59b9c92839db2e09033c38de9c99ca7722579e4 Mon Sep 17 00:00:00 2001 From: royqh1979 Date: Sun, 14 Nov 2021 18:48:18 +0800 Subject: [PATCH 08/25] update translations - fix: options not translated --- RedPandaIDE/RedPandaIDE_zh_CN.qm | Bin 104694 -> 104937 bytes RedPandaIDE/RedPandaIDE_zh_CN.ts | 634 +++++++++--------- RedPandaIDE/mainwindow.cpp | 6 +- RedPandaIDE/settingsdialog/settingsdialog.cpp | 4 + 4 files changed, 333 insertions(+), 311 deletions(-) diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.qm b/RedPandaIDE/RedPandaIDE_zh_CN.qm index db25ebd2dbd7d472b1dabcda3f32806039ab30e6..0587e6c1a74433895334352184b9b04dd5d60750 100644 GIT binary patch delta 7668 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 M+2n>zXImQnKO@CTTmS$7 delta 7444 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 - + Version: 版本: @@ -1029,12 +1029,12 @@ Are you really want to continue? 失败 - - - - - - + + + + + + Error 错误 @@ -1043,60 +1043,60 @@ Are you really want to continue? 无法写入文件"%1" - + Save As 另存为 - + The text to be copied exceeds count limit! 要复制的内容超过了行数限制! - + The text to be copied exceeds character limit! 要复制的内容超过了字符数限制! - + The text to be cut exceeds count limit! 要剪切的内容超过了行数限制! - + The text to be cut exceeds character limit! 要剪切的内容超过了字符数限制! - + Print Document 打印文档 - - - + + + Ctrl+click for more info Ctrl+单击以获取更多信息 - - + + Symbol '%1' not found! 未找到符号'%1'! - + Break point condition 断点条件 - + Enter the condition of the breakpoint: 输入当前断点的生效条件: - + Readonly 只读 @@ -2857,11 +2857,11 @@ Are you really want to continue? - - - - - + + + + + Issues 编译器 @@ -3012,7 +3012,7 @@ Are you really want to continue? 工具栏2 - + New 新建 @@ -3070,10 +3070,10 @@ Are you really want to continue? - - - - + + + + Compile 编译 @@ -3119,8 +3119,8 @@ Are you really want to continue? - - + + Copy 复制 @@ -3131,7 +3131,7 @@ Are you really want to continue? - + Paste 粘贴 @@ -3142,7 +3142,7 @@ Are you really want to continue? - + Select All 选择全部 @@ -3262,14 +3262,14 @@ Are you really want to continue? - + Problem Set 试题集 - + New Problem Set 新建试题集 @@ -3288,14 +3288,14 @@ Are you really want to continue? - + Save Problem Set 保存试题集 - + Load Problem Set 载入试题集 @@ -3331,7 +3331,7 @@ Are you really want to continue? - + Problem 试题 @@ -3630,7 +3630,7 @@ Are you really want to continue? - + Clear all breakpoints 删除所有断点 @@ -3731,7 +3731,7 @@ Are you really want to continue? - + Rename Symbol 重命名符号 @@ -3752,13 +3752,13 @@ Are you really want to continue? - + Export As RTF 导出为RTF - + Export As HTML 导出为HTML @@ -3824,7 +3824,7 @@ Are you really want to continue? - + Open Folder 打开文件夹 @@ -3834,42 +3834,42 @@ Are you really want to continue? 运行参数... - + File Encoding 文件编码 - + Recent Files 文件历史 - - - - - - + + + + + + Debugging 正在调试 - - - - - - + + + + + + Running 正在运行 - - - - - - + + + + + + Compiling 正在编译 @@ -3878,184 +3878,184 @@ Are you really want to continue? 行:%1 列:%2 已选择:%3 总行数:%4 总长度:%5 - + Line:%1 Col:%2 Selected:%3 Lines:%4 Length:%5 Line: %1 Col: %2 Selected: %3 Lines: %4 Length: %5 行: %1 列: %2 已选择 :%3 总行数: %4 总长度: %5 - + Read Only 只读 - + Insert 插入 - + Overwrite 覆写 - + Close project 关闭项目 - + Are you sure you want to close %1? 你确定要关闭'%1'吗? - - + + Confirm 确认 - - - + + + Source file is not compiled. 源文件尚未编译。 - - + + Compile now? 现在编译? - - - + + + Source file is more recent than executable. 源文件比可执行程序新。 - + Recompile now? 重新编译? - + No compiler set 无编译器设置 - + No compiler set is configured. 没有配置编译器设置。 - + Can't start debugging. 无法启动调试器 - - + + Enable debugging 启用调试参数 - - + + You have not enabled debugging info (-g3) and/or stripped it from the executable (-s) in Compiler Options.<BR /><BR />Do you want to correct this now? 当前编译设置中未启用调试选项(-g3),或启用了信息剥除选项(-s)<br /><br/>是否纠正这一问题? - + Project not built 项目尚未构建 - + Project hasn't been built. Build it now? 项目尚未构建。是否构建? - + Host applcation missing 宿主程序不存在 - + DLL project needs a host application to run. 动态链接库(DLL)需要一个宿主程序来运行。 - + But it's missing. 但它不存在。 - + Host application not exists 宿主程序不存在 - + Host application file '%1' doesn't exist. 宿主程序'%1'不存在。 - + Recompile? 重新编译? - - + + Save last open info error 保存上次打开信息失败 - + Can't remove old last open information file '%1' 无法删除旧上次打开信息文件'%1' - + Can't save last open info file '%1' 无法保存上次打开信息文件'%1' - + Load last open info error 载入上次打开信息失败 - + Can't load last open info file '%1' 无法载入上次打开信息文件'%1' - + Copy all 全部复制 - - + + Clear 清除 - + Export 导出 - + Insert Snippet 插入代码段 - - + + Problem Set %1 试题集%1 @@ -4076,488 +4076,498 @@ Are you really want to continue? 或者选择使用其他的网络端口。 - + Red Panda Dev-C++ 小熊猫Dev-C++ - + + Auto Save Error + 自动保存出错 + + + + Auto save "%1" to "%2" failed:%3 + 自动保存"%1"到"%2"失败:%3 + + + Properties... 试题属性... - + Set Problem Set Name 设置试题集名称 - + Problem Set Name: 试题集名称: - + Remove 删除 - + Remove All Bookmarks 删除全部书签 - + Modify Description 修改描述 - - - + + + Bookmark Description 书签描述 - - - + + + Description: 描述: - + Show debug logs in the debug console 在调试主控台中显示调试器输出 - + Remove this search 清除这次搜索 - + Clear all searches 删除所有搜索 - + Breakpoint condition... 断点条件... - + Break point condition 断点条件 - + Enter the condition of the breakpoint: 输入当前断点的生效条件: - + Remove All Breakpoints Remove all breakpoints 删除所有断点 - + Remove Breakpoint 删除当前断点 - + Rename File 重命名文件 - - + + Add Folder 添加文件夹 - + New folder 新文件夹 - + Folder name: 文件夹: - + Rename Folder 重命名 - + Remove Folder 删除文件夹 - + Sort By Type 按类型排序 - + Sort alphabetically 按名称排序 - + Show inherited members 显示继承的成员 - + Goto declaration 跳转到声明处 - + Goto definition 跳转到定义处 - + Open in Editor 在编辑器中打开 - + Open in External Program 使用外部程序打开 - + Open in Terminal 在终端中打开 - + Open in Windows Explorer 在Windows浏览器中打开 - + Character sets 字符集 - + %1 files autosaved 已自动保存%1个文件 - + Set answer to... 设置答案源代码... - + select other file... 选择其他文件... - + Select Answer Source File 选择答案源代码文件 - + C/C++Source Files (*.c *.cpp *.cc *.cxx) C/C++Source Files (*.c *.cpp *.cc *.cxx C/C++源代码文件 (*.c *.cpp *.cc *.cxx) - + Save project 保存项目 - + The project '%1' has modifications. 项目'%1'有改动。 - - + + Do you want to save it? 需要保存吗? - - - - + + + + Save Error 保存失败 - + Change Project Compiler Set 改变项目编译器配置集 - + Change the project's compiler set will lose all custom compiler set options. 改变项目的编译器配置集会导致所有的自定义编译器选项被重置。 - + Do you really want to do that? 你真的想要做那些吗? - + Do you really want to clear all breakpoints in this file? 您真的要清除该文件的所有断点吗? - + New project 新建项目 - + Close %1 and start new project? 关闭'%1'以打开新项目? - + Folder not exist 文件夹不存在 - + Folder '%1' doesn't exist. Create it now? 文件夹'%1'不存在。是否创建? - + Can't create folder 无法创建文件夹 - + Failed to create folder '%1'. 创建文件夹'%1'失败。 - + Save new project as - + Red panda Dev-C++ project file (*.dev) 小熊猫Dev-C++项目文件 (*.dev) - + New project fail 新建项目失败 - + Can't assign project template 无法使用模板创建项目 - + untitled 无标题 - + New Project File Name 新的项目文件名 - + File Name: 文件名: - + File Already Exists! 文件已存在! - + File '%1' already exists! 文件'%1'已经存在! - + Add to project 添加到项目 - + Rename Error 重命名出错 - + Symbol '%1' is defined in system header. 符号'%1'在系统头文件中定义,无法修改。 - + New Name 新名称 - - + + Replace Error 替换出错 - + Can't open file '%1' for replace! 无法打开文件'%1'进行替换! - + Contents has changed since last search! 内容和上次查找时不一致。 - + Rich Text Format Files (*.rtf) RTF格式文件 (*.rtf) - + HTML Files (*.html) HTML文件 (*.html) - + The current problem set is not empty. 当前的试题集不是空的。 - + Problem %1 试题%1 - + Problem Set Files (*.pbs) 试题集文件 (*.pbs) - + Load Error 载入失败 - - + + Problem Case %1 试题案例%1 - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + Error 错误 - + Recent Projects 项目历史 - + File '%1' was changed. 磁盘文件'%1'已被修改。 - + Reload its content from disk? 是否重新读取它的内容? - + File '%1' was removed. 磁盘文件'%1'已被删除。 - + Keep it open? 是否保持它在小熊猫C++中打开的编辑窗口? - + Open 打开 - + Compile Failed 编译失败 - + Run Failed 运行失败 - - + + Confirm Convertion 确认转换 - - + + The editing file will be saved using %1 encoding. <br />This operation can't be reverted. <br />Are you sure to continue? 当前编辑器中的文件将会使用%1编码保存。<br />这项操作无法被撤回。<br />你确定要继续吗? - + New Watch Expression 新监视表达式 - + Enter Watch Expression (it is recommended to use 'this->' for class members): 输入监视表达式 - + Parsing file %1 of %2: "%3" (%1/%2)正在解析文件"%3" - - + + Done parsing %1 files in %2 seconds 完成%1个文件的解析,用时%2秒 - + (%1 files per second) (每秒%1个文件) @@ -4796,52 +4806,52 @@ Are you really want to continue? ProjectCompiler - + Building makefile... 正在构建makefile... - + - Filename: %1 - 文件名: %1 - + Can't open '%1' for write! 无法写入文件'%1'! - + - Resource File: %1 - 资源文件: %1 - + Compiling project changes... 正在编译项目修改... - + - Project Filename: %1 - 项目文件名: %1 - + - Compiler Set Name: %1 - 编译器配置: %1 - + Processing makefile: 正在处理makefile... - + - makefile processer: %1 - makefile处理器: %1 - + - Command: %1 %2 - 命令: %1 %2 @@ -5382,7 +5392,7 @@ Are you really want to continue? QApplication - + Error 错误 @@ -5723,27 +5733,27 @@ Are you really want to continue? 无标题 - + Index %1 out of range 下标"%1"越界 - + bytes 字节 - + KB KB - + MB MB - + GB GB @@ -6397,8 +6407,9 @@ Are you really want to continue? SettingsDialog + Options - + 选项 @@ -6421,161 +6432,165 @@ Are you really want to continue? 取消 - + Appearence 外观 - - - - - + + + + + Environment 环境 - + File Association 文件关联 - + Shortcuts 快捷键 - + Folders 文件夹 - + Performance 性能 - - + + Compiler Set 编译器配置集 - - + + Compiler 编译器 - + Auto Link 自动链接 - - - - - - - + + + + + + + General 通用 - - - - - - - - - - - + + + + + + + + + + + Editor 编辑器 - + Font 字体 - + Copy & Export 复制/导出 - + Color 配色 - + Code Completion 代码补全 - + Symbol Completion 符号补全 - + Snippet 代码模板 - + Auto Syntax Checking 自动语法检查 - + Tooltips 信息提示 - + Auto save 自动保存 - + Misc 杂项 - - - + + + Program Runner 程序运行 - + Problem Set 试题集 - + Debugger 调试器 - + Code Formatter 代码排版 - + Tools 工具 - + + Project Options + 项目选项 + + @@ -6585,56 +6600,57 @@ Are you really want to continue? + Project 项目 - + Files 文件 - + Custom Compile options 自定义编译选项 - + Directories 文件夹 - + Precompiled Header 预编译头文件 - + Makefile Makefile - + Output 输出 - + DLL host DLL宿主 - + Version info 版本信息 - + Save Changes 保存修改 - + There are changes in the settings, do you want to save them before swtich to other page? 本页中有尚未保存的设置修改,是否保存后再切换到其他页? @@ -6777,12 +6793,12 @@ Are you really want to continue? SynEditStringList - + Can't open file '%1' for read! 无法读取文件'%1'! - + Can't open file '%1' for save! 无法写入文件'%2'! diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 70ac0b22..abbce54d 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -2677,12 +2677,14 @@ void MainWindow::onLstProblemSetContextMenu(const QPoint &pos) QAction * action = new QAction(tr("select other file..."),menuSetAnswer); connect(action, &QAction::triggered, [problem,this](){ + QFileDialog dialog; QString filename = QFileDialog::getOpenFileName( this, tr("Select Answer Source File"), QString(), - tr("C/C++Source Files (*.c *.cpp *.cc *.cxx)") - ); + tr("C/C++Source Files (*.c *.cpp *.cc *.cxx)"), + nullptr, + dialog.options() | QFileDialog::DontUseNativeDialog); if (!filename.isEmpty()) { QDir::setCurrent(extractFileDir(filename)); problem->answerProgram = filename; diff --git a/RedPandaIDE/settingsdialog/settingsdialog.cpp b/RedPandaIDE/settingsdialog/settingsdialog.cpp index 19fda5df..646993ef 100644 --- a/RedPandaIDE/settingsdialog/settingsdialog.cpp +++ b/RedPandaIDE/settingsdialog/settingsdialog.cpp @@ -99,6 +99,8 @@ PSettingsDialog SettingsDialog::optionDialog() { PSettingsDialog dialog = std::make_shared(); + dialog->setWindowTitle(tr("Options")); + SettingsWidget* widget = new EnvironmentAppearenceWidget(tr("Appearence"),tr("Environment")); widget->init(); dialog->addWidget(widget); @@ -206,6 +208,8 @@ PSettingsDialog SettingsDialog::projectOptionDialog() { PSettingsDialog dialog = std::make_shared(); + dialog->setWindowTitle(tr("Project Options")); + SettingsWidget* widget = new ProjectGeneralWidget(tr("General"),tr("Project")); widget->init(); dialog->addWidget(widget); From 2b3f8a644f7b3484b59661153ffa06b810b683fc Mon Sep 17 00:00:00 2001 From: royqh1979 Date: Sun, 14 Nov 2021 18:54:12 +0800 Subject: [PATCH 09/25] - fix: Shouldn't update auto link settings, if the header name to be modified is unchanged --- NEWS.md | 3 +++ RedPandaIDE/settingsdialog/compilerautolinkwidget.cpp | 2 ++ 2 files changed, 5 insertions(+) diff --git a/NEWS.md b/NEWS.md index 1af61294..d407b474 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +Version 0.8.10 For Dev-C++ 7 Beta + - fix: Shouldn't update auto link settings, if the header name to be modified is unchanged + Version 0.8.9 For Dev-C++ 7 Beta - fix: text color of labels in statusbar not correctly updated when change theme diff --git a/RedPandaIDE/settingsdialog/compilerautolinkwidget.cpp b/RedPandaIDE/settingsdialog/compilerautolinkwidget.cpp index 74bf6cae..bb4dc463 100644 --- a/RedPandaIDE/settingsdialog/compilerautolinkwidget.cpp +++ b/RedPandaIDE/settingsdialog/compilerautolinkwidget.cpp @@ -110,6 +110,8 @@ bool AutolinkModel::setData(const QModelIndex &index, const QVariant &value, int if (index.column() == 0) { if (s.isEmpty()) return false; + if (link->header == s) + return false; if (findLink(s)>=0) { QMessageBox::warning(pMainWindow, tr("Header exists"), From 0f130291aa393f09d297ed26a3857d6c174ae2a7 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Mon, 15 Nov 2021 19:30:24 +0800 Subject: [PATCH 10/25] - fix: add unit to project not correctly set new unit file's encoding --- NEWS.md | 1 + RedPandaIDE/compiler/projectcompiler.cpp | 10 +++++----- RedPandaIDE/project.cpp | 5 +++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/NEWS.md b/NEWS.md index d407b474..b9300a12 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ Version 0.8.10 For Dev-C++ 7 Beta - fix: Shouldn't update auto link settings, if the header name to be modified is unchanged + - fix: add unit to project not correctly set new unit file's encoding Version 0.8.9 For Dev-C++ 7 Beta - fix: text color of labels in statusbar not correctly updated when change theme diff --git a/RedPandaIDE/compiler/projectcompiler.cpp b/RedPandaIDE/compiler/projectcompiler.cpp index cfeb7cbd..d6b65313 100644 --- a/RedPandaIDE/compiler/projectcompiler.cpp +++ b/RedPandaIDE/compiler/projectcompiler.cpp @@ -340,14 +340,14 @@ void ProjectCompiler::writeMakeObjFilesRules(QFile &file) encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2") .arg(unit->editor()->fileEncoding(), defaultSystemEncoding); - } else if (unit->encoding()!=ENCODING_ASCII) { - encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2") - .arg(unit->encoding(), - defaultSystemEncoding); - } else if (unit->encoding()!=ENCODING_SYSTEM_DEFAULT) { + } else if (unit->encoding()==ENCODING_SYSTEM_DEFAULT) { encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2") .arg(defaultSystemEncoding, defaultSystemEncoding); + } else if (unit->encoding()!=ENCODING_ASCII && !unit->encoding().isEmpty()) { + encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2") + .arg(unit->encoding(), + defaultSystemEncoding); } } diff --git a/RedPandaIDE/project.cpp b/RedPandaIDE/project.cpp index 9ce69b01..fc228a73 100644 --- a/RedPandaIDE/project.cpp +++ b/RedPandaIDE/project.cpp @@ -260,7 +260,7 @@ PProjectUnit Project::newUnit(PFolderNode parentNode, const QString& customFileN newUnit->setOverrideBuildCmd(false); newUnit->setBuildCmd(""); newUnit->setModified(true); - newUnit->setEncoding(toByteArray(options().encoding)); + newUnit->setEncoding(toByteArray(mOptions.encoding)); return newUnit; } @@ -285,7 +285,7 @@ Editor *Project::openUnit(int index) editor = pMainWindow->editorList()->newEditor(fullPath, encoding, true, unit->isNew()); editor->setInProject(true); unit->setEditor(editor); - unit->setEncoding(encoding); + //unit->setEncoding(encoding); editor->activate(); loadUnitLayout(editor,index); return editor; @@ -788,6 +788,7 @@ PProjectUnit Project::addUnit(const QString &inFileName, PFolderNode parentNode, newUnit = std::make_shared(this); // Set all properties + newUnit->setEncoding(toByteArray(mOptions.encoding)); newUnit->setFileName(QDir(directory()).filePath(inFileName)); newUnit->setNew(false); newUnit->setEditor(nullptr); From 284a8ed695cad93b8f93d52526026be83d6ece2d Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Mon, 15 Nov 2021 22:08:35 +0800 Subject: [PATCH 11/25] - fix: add unit to project not correctly set new unit file's encoding - fix: correctly set encoding for the new added project unit file - fix: if there's a project openned, new file should ask user if he want to add the new file to the project - fix: when adding a file openned in the editor to the project, properties of it are not correctly setted. - enhancement: when remove a file from the project, also ask if user want to remove it from disk - fix: double click a project's .dev file in the Files panel should load the project --- NEWS.md | 5 + RedPandaIDE/RedPandaIDE_zh_CN.qm | Bin 104937 -> 105123 bytes RedPandaIDE/RedPandaIDE_zh_CN.ts | 222 +++++++++++++++++-------------- RedPandaIDE/mainwindow.cpp | 108 +++++++++------ RedPandaIDE/mainwindow.h | 1 + RedPandaIDE/mainwindow.ui | 2 +- RedPandaIDE/project.cpp | 21 ++- RedPandaIDE/project.h | 2 +- 8 files changed, 209 insertions(+), 152 deletions(-) diff --git a/NEWS.md b/NEWS.md index b9300a12..e67be16f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,11 @@ Version 0.8.10 For Dev-C++ 7 Beta - fix: Shouldn't update auto link settings, if the header name to be modified is unchanged - fix: add unit to project not correctly set new unit file's encoding + - fix: correctly set encoding for the new added project unit file + - fix: if there's a project openned, new file should ask user if he want to add the new file to the project + - fix: when adding a file openned in the editor to the project, properties of it are not correctly setted. + - enhancement: when remove a file from the project, also ask if user want to remove it from disk + - fix: double click a project's .dev file in the Files panel should load the project Version 0.8.9 For Dev-C++ 7 Beta - fix: text color of labels in statusbar not correctly updated when change theme diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.qm b/RedPandaIDE/RedPandaIDE_zh_CN.qm index 0587e6c1a74433895334352184b9b04dd5d60750..a8bb9e703161aafbdea085697440192573bdadef 100644 GIT binary patch delta 6860 zcmYkAc|cA1`^TTpxo5ri+*yP`08)SxZHcqD^~A(=rHy(H%0AwQxwu@*P{Y z!Dwihh%CiWBKy9D?6NcYJ?{PI_t)#5bI^(2uu zk>U9N6=WQMSCXEDN=sd~UQ2xlSyrpDO2I#Z2Lha`MGitfLJr1%MHn!zDmu$p-TF1`3r1%6l3pE;O*yWCKm# z8)z}pK$}_v?S~nd`oX}Qi$Fg^(>Hqq{W$?hr;WhyM*-G;1*YdPkXk5LlA6{SUrB;q^%x#KGQrn_0pb`X z^`l(|eTCr*+5zTpFnrM%ATHe?*s}uNIRb*`9|w}{1i_00AiYjP@Fp3M5aba@AYBGS zNY{-(JZ4GjX=kg^Qy`=Ox6<`3gdC^_IMx6mC+-8u9U`R`!X<+ z!Z1BMPfs$Y4n}&;1JZY`8Da{9Rd94v+0vZ(;^FJO{c z6_BxcFv(&J$l%T?DTuZ0RSgB-o&nrVhr%Ls-o)!rSpFQ~hB5rshPPeb3`J!!Tz&y8 z7>c*6*Gj8cTiqL|2vPz3Qw$Zka{*c^Vcp~+fRjgHyJJ0&uq4=#!)fLAfl^yx4V zAr4vwOu;M;hb!wbLv=NgaP=yNa$h&NCSpk5-vKv<9RM=u1l-EQw|5PL2YDDh{_)Tn zy$hhC5L(~#1ro6sp6-hRcs2pvIN`?5J%P6t6M(2bz+0~l0GsRZt-Jt8(f|Ve-T_1p zC!A{vWkX-|HXwpa01m30BMRK}lIzZ(oa=M@iNc0hMjtl|tJ4Nn2MZWMO zt*!5X*!q(9Q{MuypDESy8lCSXioRh95Xe)^^6!BjO?5(dlF)CIX%$*1OhuXA`X3Op z4V0Cx7{HOEti3QAWg5z*wGkiy41Dp5azE1o@U)Whi?;^Yl}Y&(W0>uoPWf%E1M)*9 z6=r%J;Gr!Q8G-9u`jHy9TLNF0<4eWZxC4nvrpDiH0=VN&rG9;Z^8ArX@3IYu&#zQ^ zD#mT!<5cF7hXB9iQQ5!D1rjSsC4#NdWoot(1L1KnHG9}SOgKiW6|@m{rqt#l-2L4% z)b{%rZDKgJ!{G_QXbrU^-3JIakvjNc9gu-53>@*E`e%MWl#uPzq45OI51|gHnW7BH zsUyu10IjW(hg?gw_Lsut8moRG)Z;Ue0Jqh8lBgEy*?83VPA!s7ZXWZ7`W6%pu*Y6T z?_Pn4)=egcx?}7%%hU&PFO#)0^E-Il(Jr%dG6v|mOlB7q0>mgz)?LJWeq=54n2X{N z-c#1oU4~_+Ue;?8R++c4(o4CQeVVf@E;$NFw?(qJeJF23<+AwkbATkL$i`|*6!)S6Q1w!(${C2^wG3M0qrNM8V_S+vbwEs&mx zbQg^!D$PSFK-Bgg5JE=_cyDAD9mDklVt$E^u{>Da8#0IROkwIm)?4k;gbwZIY^gz_oSs=AA_tSe@xDe*S3n8oKf&>O|L7Ql+vu zD_BnNY4r!_^o~C0igycF=zkO`K>CCmIL4W-Dc=b2QvhAlbPXe^fj%6Mua|3P;HP@J zuHY|#CmwVIh3vMSK9h_+Le^@!Y1#^GM;z#L-ErMc1ElpTcPgYpYEqe7-liWv?gcP) zfS!b&W?+1z^i8Fq96C$pYOUPMg??U!#ib=z3Q*g2nZYn?aKZDZ8Rn1*)4r6E&qX_q zImF0!pnWg6NjkNsFM&~v^CI+vSs2rEbRDMu8UuaaF@2ASDAY-eXIURywVm-imJAT` zH{%yr4sfwSdZ{+oRWk`DZ2+N}OrnMXqA_C9LOW0`eV7bAcQe`5xTl+g^d$aX21fN| za;QRVs@74xw;KE1}Qu|YHB6dU--kNJJt1w22M*<_7OKE!O9fo5B^h1uar0qLh@b}S8o zA!N{6X4f$+-V=5)d%WYZK+RRDZF43&}=%ZLdd#Kp~|GdUp*@+G4wF{L#fgQX*1qjv5 z4q4y<;NN86J#RLM#q*=rv%xkJKzb7!{KrZxDPP&(T_~h21N0=(AEaty7jjOzZES8? z$ENPXyo_GLW*a478}f+F_I-=G5hkfkv^rN?b`~qcz%$pAM6v9ww8a259qe~`A?CJh zkqfHl`zvh8oe)fq?(EXxSf2y8v8z;_0S*|kdik)t%dU<%fbYJQUHxtdHbr;Xbp?k} z!%NuBA=tNs%Gk>27>q9mc6+5O@*ca>G6oco6wdBUa09|tN!2FqR=GO1$#@jNCP%i} zXg4-n4Qz8p1i+Q+(l-;WeaHm%LDFAn`Z4UoGsDnD$?Vg>sQ}yT*jKg1m~F4608@>d z$2yKb?T$6JA14eN1cZs=l;tfbhNYZY4K^PR-8uWvHK-yZB%P@y!c*b`TO0ru8gW6( zO;KataKU5)KwGVzB&Itz@@gXdP&GIkJG8ivOoe&WiK`T+cG%Kfh~2qk19_j~I&6!3U%!wnk9@S)sx z-v?-lsoWpg*fwZOxIIZ2)gk|J`+U(OZmYTd^YEoCf8lBlt1=a)(N= z64+nkYOT?Qy?b+~e#aL6q8-HCBCaOeBtMtAevy}A}0ZbT%W|JW$0HJZV+6Zi1w zT_Euc_hkHDfbDJElcdS07|C4QNR+4xQC!kmtAVMst)%>or=PJKL;^{C$U8JVz%rD>cg@9IOkBeE^nZbJK85c&76o$XD&AY}4P*e#dmlFe zlD3rhJsE-ayG zqmMFt_~UzV_#P$l^)9IQkE-<~p%?i2Az1a>Joq!$Q6bt_@n>aK7-Uv_<7ju(&CimD zg@#JBl7cL3g%19C3EH$VO3Jg)#@-4RjQXNNJUJR&W^}jIH8P!PN?*-}AHJIssiUCQ9gb7O#8ur{KN__jqfQ^vJ@N zyplLeuijrWg)lQrrMEYQ@BuHe&g>Mz107HUhY2yEDgfIpLP8-%d5=y)B7<#?>tiX; z(ss}-VcKRas)M%(x~zRb>~07}d$a)7QNsM2XdU?m1AStJh1KZIk6K}I{sn+RN(0*x zq$W$PeU_`RY&tH!ut<=0<)SQ93FVoVSfpkOtGnZ-&JL5*R<^o3!nXbx->o^qjv4Ow z9Uw^9{SrN$7cCrY^~A_577i7(%7vZ(8I73+7@) zc9joYS&ZH_l@I=V7v|?X`4G)u{3_ri4}Fi@?><*P3Ogw>&R8D3HwDKer92@L^(5?s zJb6|=5U`e~`QhU{nkAjJhwFBE`c6Dbz9*l!Ap+Z<>+&D=qApJxt|u8kP@df^!_D83 zE?aATI_An3(S-mHlH^Nf?8R|Ike4*=!t5xMuiS=N?h=EXi(H2+MBYcv!?f)xd2|k> zSV5ZJS?d<$B(GVV53pvNfgfJT51*L=@M~ZB;R|V)yeH&!V^GdtewJ!G2N}JQckIM6 z92h9?sFU#7>m_p=t=s3(3X{bb0A}SY%rY0DUUpTOJ;(4|5vtH!#OUuAq%c2+i8^Y% zlxX9x6V!@8D_0<<&IXzNRX>8mLH?KXP|%=4qc1tc~()IwH&p)SaIYYg_f#NoScEBX!spP{hoVx z-7kt$b{Iou&lHV~uW(A=rnoRF2Rn*-#hu-QarI4#R^JvJk17<8|Hc@-oFj3z&Jiz1 zDPHc!l)pY&@#@%lAbuf=*XM9Ef$tS>!mV&t?yC4)gSP!yEs|t3M*kpDHUY19ix3s` zJX}6XR9wT(2=0nv@o`k!a7kyY9sF>aXuJ(~^(b64@p8h6T_>8EJjD#j7R}CL<27ie zs7VRJvc6T+B>whEg*wzBF8PWZ-g{SE2FR~d#N}b=+yRWZ;$Mul%Sv(O zkg3Rl64yl=lG8_A+kYd#?62awR{VR|QUh;hi5uW5&Jth5jpqvhN(;rEeXyiA#f!V+ z{=(SVC+=S}3_sYO5)b5HjP|}D<#lm3z8xT*yoAmg%ZnG9P{7YbNR?fjb=NiGjUUh% z+&=M6z^|y|;o_q>y!)NA_;lw(EO{Hn_Pgi|i!<5?`uJ?u?q? zP^L`j%3y5jlqoweU|o5k%+!B@B+7|bj-ypp=}AI-m02Sjv0?hA%&z$vqi2pX`7J&mLj|oo|<#95f+}T>04_^R)4(@=G!9{mL5U zx7C;s;sF&jqi_COrjqSif$evcieHEAbNx>$#gBMC-a@6$ybmyvTU5Ct@S(ATRa35FM*O&4H80{n{D4}m`b|i~0(DWfpbQ<6byc)RIxpSb;0lIimte=kCE!N z>+w03*or!v>&~jT9;pIYa!Y++?rki`9qNC2%)}3HW_pqllDgIn!|U34^^w-YC>cMi zn-@#?6l3*;08^a2e^g%{gOdDwqxwc-F1ATBb(;_Fesa3{>1{Q(6GiIhZDByXd#K;N z-i#AhtoqZR)|h4|)nDQ*QIg6IsykB99Vw+)UZ#Z002m7?)YY|WvWxSHaBb4o439|X z1#{xr^gRimr_D<*3VR>%ztQPsGp4a&Ep|ex6-&TAE#c zX1ZN&`gFUDiP`Dj&*8D;cgLox>{(x9oA2xVzx$2C@WN4(^Rm)Y^X&p9k7pKD$2y!V F{tsGMD{BA% delta 6591 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 N#Q@WipF3>x{tpr@^g93m diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts index 875cf2d7..0103efed 100644 --- a/RedPandaIDE/RedPandaIDE_zh_CN.ts +++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts @@ -82,12 +82,12 @@ 链接参数 - + Header exists 头文件已存在 - + Header already exists. 头文件已存在。 @@ -2857,11 +2857,11 @@ Are you really want to continue? - - - - - + + + + + Issues 编译器 @@ -3269,7 +3269,7 @@ Are you really want to continue? - + New Problem Set 新建试题集 @@ -3288,14 +3288,14 @@ Are you really want to continue? - + Save Problem Set 保存试题集 - + Load Problem Set 载入试题集 @@ -3630,7 +3630,7 @@ Are you really want to continue? - + Clear all breakpoints 删除所有断点 @@ -3731,7 +3731,7 @@ Are you really want to continue? - + Rename Symbol 重命名符号 @@ -3752,13 +3752,13 @@ Are you really want to continue? - + Export As RTF 导出为RTF - + Export As HTML 导出为HTML @@ -3824,7 +3824,7 @@ Are you really want to continue? - + Open Folder 打开文件夹 @@ -4055,7 +4055,7 @@ Are you really want to continue? - + Problem Set %1 试题集%1 @@ -4122,15 +4122,15 @@ Are you really want to continue? - - + + Bookmark Description 书签描述 - - + + Description: 描述: @@ -4294,183 +4294,203 @@ Are you really want to continue? - + Do you want to save it? 需要保存吗? - - - - + + New Project File? + 新建项目文件? + + + + Do you want to add the new file to the project? + 您是否要将新建的文件加入项目? + + + + + + Save Error 保存失败 - + Change Project Compiler Set 改变项目编译器配置集 - + Change the project's compiler set will lose all custom compiler set options. 改变项目的编译器配置集会导致所有的自定义编译器选项被重置。 - + Do you really want to do that? 你真的想要做那些吗? - + Do you really want to clear all breakpoints in this file? 您真的要清除该文件的所有断点吗? - + New project 新建项目 - + Close %1 and start new project? 关闭'%1'以打开新项目? - + Folder not exist 文件夹不存在 - + Folder '%1' doesn't exist. Create it now? 文件夹'%1'不存在。是否创建? - + Can't create folder 无法创建文件夹 - + Failed to create folder '%1'. 创建文件夹'%1'失败。 - + Save new project as - + Red panda Dev-C++ project file (*.dev) 小熊猫Dev-C++项目文件 (*.dev) - + New project fail 新建项目失败 - + Can't assign project template 无法使用模板创建项目 - + + Remove file + 删除文件 + + + + Remove the file from disk? + 同时从硬盘上删除文件? + + + untitled 无标题 - + New Project File Name 新的项目文件名 - + File Name: 文件名: - + File Already Exists! 文件已存在! - + File '%1' already exists! 文件'%1'已经存在! - + Add to project 添加到项目 - + Rename Error 重命名出错 - + Symbol '%1' is defined in system header. 符号'%1'在系统头文件中定义,无法修改。 - + New Name 新名称 - - + + Replace Error 替换出错 - + Can't open file '%1' for replace! 无法打开文件'%1'进行替换! - + Contents has changed since last search! 内容和上次查找时不一致。 - + Rich Text Format Files (*.rtf) RTF格式文件 (*.rtf) - + HTML Files (*.html) HTML文件 (*.html) - + The current problem set is not empty. 当前的试题集不是空的。 - + Problem %1 试题%1 - - + + Problem Set Files (*.pbs) 试题集文件 (*.pbs) - + Load Error 载入失败 - + Problem Case %1 试题案例%1 @@ -4485,11 +4505,11 @@ Are you really want to continue? - - - - - + + + + + Error 错误 @@ -4519,55 +4539,55 @@ Are you really want to continue? 是否保持它在小熊猫C++中打开的编辑窗口? - + Open 打开 - + Compile Failed 编译失败 - + Run Failed 运行失败 - - + + Confirm Convertion 确认转换 - - + + The editing file will be saved using %1 encoding. <br />This operation can't be reverted. <br />Are you sure to continue? 当前编辑器中的文件将会使用%1编码保存。<br />这项操作无法被撤回。<br />你确定要继续吗? - + New Watch Expression 新监视表达式 - + Enter Watch Expression (it is recommended to use 'this->' for class members): 输入监视表达式 - + Parsing file %1 of %2: "%3" (%1/%2)正在解析文件"%3" - - + + Done parsing %1 files in %2 seconds 完成%1个文件的解析,用时%2秒 - + (%1 files per second) (每秒%1个文件) @@ -4695,77 +4715,77 @@ Are you really want to continue? 无标题 - + Can't save file 无法保存文件 - + Can't save file '%1' 无法保存文件'%1'. - + Error Load File 载入文件错误 - + File Exists 文件已存在 - + File '%1' is already in the project 文件'%1'已在项目中 - + Project Updated 项目已升级 - + Your project was succesfully updated to a newer file format! 已成功将项目升级到新的格式 - + If something has gone wrong, we kept a backup-file: '%1'... 旧项目文件备份在'%1'。 - + Settings need update 设置需要更新 - + The compiler settings format of Dev-C++ has changed. Dev-C++的编译器设置格式已发生改变。 - + Please update your settings at Project >> Project Options >> Compiler and save your project. 请在项目 >> 项目属性 >> 编译器设置中修改您的设置并保存您的项目 - + Compiler not found 未找到编译器 - + The compiler set you have selected for this project, no longer exists. 您为该项目设置的编译器不存在。 - + It will be substituted by the global compiler set. 它将会被全局编译器设置代替。 - + Developed using the Red Panda Dev-C++ IDE 使用小熊猫Dev-C++编辑器开发 @@ -5156,24 +5176,24 @@ Are you really want to continue? ProjectModel - + File exists 文件已存在 - + File '%1' already exists. Delete it now? 文件'%1'已存在。是否删除? - - + + Remove failed 删除失败 - - + + Failed to remove file '%1' 无法删除文件'%1' @@ -6483,7 +6503,7 @@ Are you really want to continue? 自动链接 - + @@ -6559,7 +6579,7 @@ Are you really want to continue? 杂项 - + Program Runner diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index abbce54d..58eb48a6 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -3211,6 +3211,15 @@ CPUDialog *MainWindow::cpuDialog() const void MainWindow::on_actionNew_triggered() { + if (mProject) { + if (QMessageBox::question(this, + tr("New Project File?"), + tr("Do you want to add the new file to the project?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + newProjectUnitFile(); + return; + } + } newEditor(); } @@ -4654,46 +4663,7 @@ void MainWindow::on_actionSaveAll_triggered() void MainWindow::on_actionProject_New_File_triggered() { - int idx = -1; - if (!mProject) - return; - QModelIndex current = ui->projectView->currentIndex(); - FolderNode * node = nullptr; - if (current.isValid()) { - node = static_cast(current.internalPointer()); - } - QString newFileName; - do { - newFileName = tr("untitled")+QString("%1").arg(getNewFileNumber()); - if (mProject->options().useGPP) { - newFileName+=".cpp"; - } else { - newFileName+=".c"; - } - } while (fileExists(QDir(mProject->directory()).absoluteFilePath(newFileName))); - - newFileName = QInputDialog::getText( - this, - tr("New Project File Name"), - tr("File Name:"), - QLineEdit::Normal, - newFileName); - if (newFileName.isEmpty()) - return; - if (fileExists(QDir(mProject->directory()).absoluteFilePath(newFileName))) { - QMessageBox::critical(this,tr("File Already Exists!"), - tr("File '%1' already exists!").arg(newFileName)); - return; - } - PProjectUnit newUnit = mProject->newUnit( - mProject->pointerToNode(node),newFileName); - idx = mProject->units().count()-1; - mProject->saveUnits(); - updateProjectView(); - Editor * editor = mProject->openUnit(idx); - //editor->setUseCppSyntax(mProject->options().useGPP); - //editor->setModified(true); - editor->activate(); + newProjectUnitFile(); } @@ -4742,9 +4712,14 @@ void MainWindow::on_actionRemove_from_project_triggered() continue; selected.insert(folderNode->unitIndex); }; + + bool removeFile = (QMessageBox::question(this,tr("Remove file"), + tr("Remove the file from disk?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes); + for (int i=mProject->units().count()-1;i>=0;i--) { if (selected.contains(i)) { - mProject->removeEditor(i,true); + mProject->removeUnit(i,true,removeFile); } } @@ -4952,6 +4927,50 @@ void MainWindow::prepareTabMessagesData() mTabMessagesData[widget]=info; } } + +void MainWindow::newProjectUnitFile() +{ + if (!mProject) + return; + int idx = -1; + QModelIndex current = ui->projectView->currentIndex(); + FolderNode * node = nullptr; + if (current.isValid()) { + node = static_cast(current.internalPointer()); + } + QString newFileName; + do { + newFileName = tr("untitled")+QString("%1").arg(getNewFileNumber()); + if (mProject->options().useGPP) { + newFileName+=".cpp"; + } else { + newFileName+=".c"; + } + } while (fileExists(QDir(mProject->directory()).absoluteFilePath(newFileName))); + + newFileName = QInputDialog::getText( + this, + tr("New Project File Name"), + tr("File Name:"), + QLineEdit::Normal, + newFileName); + if (newFileName.isEmpty()) + return; + if (fileExists(QDir(mProject->directory()).absoluteFilePath(newFileName))) { + QMessageBox::critical(this,tr("File Already Exists!"), + tr("File '%1' already exists!").arg(newFileName)); + return; + } + PProjectUnit newUnit = mProject->newUnit( + mProject->pointerToNode(node),newFileName); + idx = mProject->units().count()-1; + mProject->saveUnits(); + updateProjectView(); + Editor * editor = mProject->openUnit(idx); + //editor->setUseCppSyntax(mProject->options().useGPP); + //editor->setModified(true); + editor->activate(); +} void MainWindow::on_EditorTabsLeft_currentChanged(int) { Editor * editor = mEditorList->getEditor(-1,ui->EditorTabsLeft); @@ -5383,9 +5402,10 @@ void MainWindow::on_treeFiles_doubleClicked(const QModelIndex &index) QString filepath = mFileSystemModel.filePath(index); QFileInfo file(filepath); if (file.isFile()) { - Editor * editor = mEditorList->getEditorByFilename(filepath); - if (editor) { - editor->activate(); + if (getFileType(filepath)==FileType::Project) { + openProject(filepath); + } else { + openFile(filepath); } } } diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h index 03a9b403..c11f45b7 100644 --- a/RedPandaIDE/mainwindow.h +++ b/RedPandaIDE/mainwindow.h @@ -226,6 +226,7 @@ private: void showHideMessagesTab(QWidget *widget, bool show); void prepareTabInfosData(); void prepareTabMessagesData(); + void newProjectUnitFile(); private slots: void onAutoSaveTimeout(); diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui index 507115f3..70747547 100644 --- a/RedPandaIDE/mainwindow.ui +++ b/RedPandaIDE/mainwindow.ui @@ -85,7 +85,7 @@ QTabWidget::West - 1 + 3 true diff --git a/RedPandaIDE/project.cpp b/RedPandaIDE/project.cpp index fc228a73..3e55b7a3 100644 --- a/RedPandaIDE/project.cpp +++ b/RedPandaIDE/project.cpp @@ -340,7 +340,7 @@ void Project::rebuildNodes() emit nodesChanged(); } -bool Project::removeEditor(int index, bool doClose) +bool Project::removeUnit(int index, bool doClose , bool removeFile) { mModel.beginUpdate(); auto action = finally([this]{ @@ -357,6 +357,10 @@ bool Project::removeEditor(int index, bool doClose) return false; } + if (removeFile) { + QFile::remove(unit->fileName()); + } + //if not fUnits.GetItem(index).fNew then PFolderNode node = unit->node(); PFolderNode parent = node->parent.lock(); @@ -788,10 +792,17 @@ PProjectUnit Project::addUnit(const QString &inFileName, PFolderNode parentNode, newUnit = std::make_shared(this); // Set all properties - newUnit->setEncoding(toByteArray(mOptions.encoding)); newUnit->setFileName(QDir(directory()).filePath(inFileName)); newUnit->setNew(false); - newUnit->setEditor(nullptr); + Editor * e= pMainWindow->editorList()->getOpenedEditorByFilename(newUnit->fileName()); + if (e) { + newUnit->setEditor(e); + newUnit->setEncoding(e->encodingOption()); + e->setInProject(true); + } else { + newUnit->setEditor(nullptr); + newUnit->setEncoding(ENCODING_AUTO_DETECT); + } newUnit->setFolder(getFolderPath(parentNode)); newUnit->setNode(makeNewFileNode(extractFileName(newUnit->fileName()), false, parentNode)); newUnit->node()->unitIndex = mUnits.count(); @@ -1515,7 +1526,7 @@ void Project::removeFolderRecurse(PFolderNode node) } else if (childNode->unitIndex >= 0 && childNode->level > 0) { // Remove editor in folder from project int editorIndex = childNode->unitIndex; - if (!removeEditor(editorIndex,true)) + if (!removeUnit(editorIndex,true)) return; } } @@ -1920,7 +1931,7 @@ bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int // Remove it from the current project... int projindex = mProject->indexInUnits(newName); if (projindex>=0) { - mProject->removeEditor(projindex,false); + mProject->removeUnit(projindex,false); } // All references to the file are removed. Delete the file from disk diff --git a/RedPandaIDE/project.h b/RedPandaIDE/project.h index 3c37f000..e5f6f392 100644 --- a/RedPandaIDE/project.h +++ b/RedPandaIDE/project.h @@ -148,7 +148,7 @@ public: const QString& customFileName=""); Editor* openUnit(int index); void rebuildNodes(); - bool removeEditor(int index, bool doClose); + bool removeUnit(int index, bool doClose, bool removeFile = false); bool removeFolder(PFolderNode node); void resetParserProjectFiles(); void saveAll(); // save [Project] and all [UnitX] From 2f945dc6fb6670ee00c6f965f3e7e06e84d2fdf1 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Tue, 16 Nov 2021 00:03:43 +0800 Subject: [PATCH 12/25] - fix: text color for cpu info dialog not correctly setted --- NEWS.md | 3 +++ RedPandaIDE/qsynedit/SynEdit.cpp | 2 ++ .../environmentappearencewidget.cpp | 1 + RedPandaIDE/version.h | 4 ++-- RedPandaIDE/widgets/cpudialog.cpp | 16 ++++++++++++++++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index e67be16f..1f61e99a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +Version 0.8.11 For Dev-C++ 7 Beta + - fix: text color for cpu info dialog not correctly setted + Version 0.8.10 For Dev-C++ 7 Beta - fix: Shouldn't update auto link settings, if the header name to be modified is unchanged - fix: add unit to project not correctly set new unit file's encoding diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index 37590b7a..155ae4f3 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -59,6 +59,8 @@ SynEdit::SynEdit(QWidget *parent) : QAbstractScrollArea(parent) mRedoList->connect(mRedoList.get(), &SynEditUndoList::addedUndo, this, &SynEdit::onRedoAdded); mOrigRedoList = mRedoList; + mForegroundColor=palette().color(QPalette::Text); + mBackgroundColor=palette().color(QPalette::Base); mCaretColor = QColorConstants::Red; mCaretUseTextColor = false; mActiveLineColor = QColorConstants::Svg::lightblue; diff --git a/RedPandaIDE/settingsdialog/environmentappearencewidget.cpp b/RedPandaIDE/settingsdialog/environmentappearencewidget.cpp index 21c604af..67e9af55 100644 --- a/RedPandaIDE/settingsdialog/environmentappearencewidget.cpp +++ b/RedPandaIDE/settingsdialog/environmentappearencewidget.cpp @@ -58,6 +58,7 @@ void EnvironmentAppearenceWidget::doSave() pSettings->environment().setInterfaceFontSize(ui->spinFontSize->value()); pSettings->environment().setLanguage(ui->cbLanguage->currentData().toString()); + pSettings->editor().save(); pSettings->environment().save(); pMainWindow->applySettings(); } diff --git a/RedPandaIDE/version.h b/RedPandaIDE/version.h index feae575c..f88d7bcc 100644 --- a/RedPandaIDE/version.h +++ b/RedPandaIDE/version.h @@ -1,7 +1,7 @@ #ifndef VERSION_H #define VERSION_H -#include +#include -#define DEVCPP_VERSION "beta.0.8.9" +#define DEVCPP_VERSION "beta.0.8.11" #endif // VERSION_H diff --git a/RedPandaIDE/widgets/cpudialog.cpp b/RedPandaIDE/widgets/cpudialog.cpp index 7edf6159..ccf1281c 100644 --- a/RedPandaIDE/widgets/cpudialog.cpp +++ b/RedPandaIDE/widgets/cpudialog.cpp @@ -13,12 +13,28 @@ CPUDialog::CPUDialog(QWidget *parent) : setWindowFlags(windowFlags() | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); ui->setupUi(this); ui->txtCode->setHighlighter(highlighterManager.getCppHighlighter()); + ui->txtCode->setReadOnly(true); + ui->txtCode->gutter().setShowLineNumbers(false); + ui->txtCode->setCaretUseTextColor(true); + + ui->txtCode->codeFolding().indentGuides = false; + ui->txtCode->codeFolding().fillIndents = false; + ui->txtCode->setRightEdge(0); + ui->txtCode->setUseCodeFolding(false); highlighterManager.applyColorScheme(ui->txtCode->highlighter(), pSettings->editor().colorScheme()); PColorSchemeItem item = pColorManager->getItem(pSettings->editor().colorScheme(),COLOR_SCHEME_ACTIVE_LINE); if (item) { ui->txtCode->setActiveLineColor(item->background()); } + item = pColorManager->getItem(pSettings->editor().colorScheme(),COLOR_SCHEME_TEXT); + if (item) { + ui->txtCode->setForegroundColor(item->foreground()); + ui->txtCode->setBackgroundColor(item->background()); + } else { + ui->txtCode->setForegroundColor(palette().color(QPalette::Text)); + ui->txtCode->setBackgroundColor(palette().color(QPalette::Base)); + } ui->lstRegister->setModel(pMainWindow->debugger()->registerModel()); ui->rdIntel->setChecked(pSettings->debugger().useIntelStyle()); From d2821ac7f2a692b286b84a785d6cdd92d1f74176 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Wed, 17 Nov 2021 09:41:44 +0800 Subject: [PATCH 13/25] minor fix: load translation --- RedPandaIDE/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RedPandaIDE/main.cpp b/RedPandaIDE/main.cpp index 7a5fa913..c28f41ab 100644 --- a/RedPandaIDE/main.cpp +++ b/RedPandaIDE/main.cpp @@ -91,8 +91,8 @@ int main(int argc, char *argv[]) QSettings languageSetting(settingFilename,QSettings::IniFormat); languageSetting.beginGroup(SETTING_ENVIRONMENT); QString language = languageSetting.value("language",QLocale::system().name()).toString(); - trans.load("RedPandaIDE_"+language,":/translations"); - app.installTranslator(&trans); + if (trans.load("RedPandaIDE_"+language,":/translations")) + app.installTranslator(&trans); } qRegisterMetaType("PCompileIssue"); From 01d7335ba290922c90a3122ed6543b97952fd9fa Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Wed, 17 Nov 2021 10:55:18 +0800 Subject: [PATCH 14/25] - fix: control keys in the numpad doesn't work in the editor - fix: project layout infos are wrongly saved to registry - fix: project layout infos are not correctly saved/loaded --- NEWS.md | 5 ++ RedPandaIDE/project.cpp | 73 +++++++++++++++-------------- RedPandaIDE/qsynedit/KeyStrokes.cpp | 10 ++-- 3 files changed, 50 insertions(+), 38 deletions(-) diff --git a/NEWS.md b/NEWS.md index 1f61e99a..d6e99929 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,8 @@ +Version 0.8.12 For Dev-C++ 7 Beta + - fix: control keys in the numpad doesn't work in the editor + - fix: project layout infos are wrongly saved to registry + - fix: project layout infos are not correctly saved/loaded + Version 0.8.11 For Dev-C++ 7 Beta - fix: text color for cpu info dialog not correctly setted diff --git a/RedPandaIDE/project.cpp b/RedPandaIDE/project.cpp index 3e55b7a3..e6b76395 100644 --- a/RedPandaIDE/project.cpp +++ b/RedPandaIDE/project.cpp @@ -420,7 +420,7 @@ void Project::saveAll() void Project::saveLayout() { - QSettings layIni(changeFileExt(mFilename, "layout"),QSettings::IniFormat); + SimpleIni layIni; QStringList sl; // Write list of open project files for (int i=0;ieditorList()->pageCount();i++) { @@ -428,39 +428,37 @@ void Project::saveLayout() if (e && e->inProject()) sl.append(QString("%1").arg(indexInUnits(e))); } - layIni.beginGroup("Editors"); - layIni.setValue("Order",sl.join(",")); + layIni.SetValue("Editors","Order",sl.join(",").toUtf8()); Editor *e, *e2; // Remember what files were visible pMainWindow->editorList()->getVisibleEditors(e, e2); if (e) - layIni.setValue("Focused", indexInUnits(e)); - layIni.endGroup(); + layIni.SetLongValue("Editors","Focused", indexInUnits(e)); // save editor info for (int i=0;ieditor(); if (editor) { - layIni.setValue("CursorCol", editor->caretX()); - layIni.setValue("CursorRow", editor->caretY()); - layIni.setValue("TopLine", editor->topLine()); - layIni.setValue("LeftChar", editor->leftChar()); + layIni.SetLongValue(groupName,"CursorCol", editor->caretX()); + layIni.SetLongValue(groupName,"CursorRow", editor->caretY()); + layIni.SetLongValue(groupName,"TopLine", editor->topLine()); + layIni.SetLongValue(groupName,"LeftChar", editor->leftChar()); } - layIni.endGroup(); // remove old data from project file SimpleIni ini; - ini.LoadFile(mFilename.toLocal8Bit()); - QByteArray groupName = toByteArray(QString("Unit%1").arg(i+1)); + ini.LoadFile(filename().toLocal8Bit()); + groupName = toByteArray(QString("Unit%1").arg(i+1)); ini.Delete(groupName,"Open"); ini.Delete(groupName,"Top"); ini.Delete(groupName,"CursorCol"); ini.Delete(groupName,"CursorRow"); ini.Delete(groupName,"TopLine"); ini.Delete(groupName,"LeftChar"); - ini.SaveFile(mFilename.toLocal8Bit()); + ini.SaveFile(filename().toLocal8Bit()); } + layIni.SaveFile(changeFileExt(filename(), "layout").toLocal8Bit()); } void Project::saveUnitAs(int i, const QString &sFileName, bool syncEditor) @@ -500,20 +498,22 @@ void Project::saveUnitLayout(Editor *e, int index) { if (!e) return; - QSettings layIni = QSettings(changeFileExt(filename(), "layout")); - layIni.beginGroup(QString("Editor_%1").arg(index)); - layIni.setValue("CursorCol", e->caretX()); - layIni.setValue("CursorRow", e->caretY()); - layIni.setValue("TopLine", e->topLine()); - layIni.setValue("LeftChar", e->leftChar()); - layIni.endGroup(); + SimpleIni layIni; + QByteArray groupName = (QString("Editor_%1").arg(index)).toUtf8(); + layIni.SetLongValue(groupName,"CursorCol", e->caretX()); + layIni.SetLongValue(groupName,"CursorRow", e->caretY()); + layIni.SetLongValue(groupName,"TopLine", e->topLine()); + layIni.SetLongValue(groupName,"LeftChar", e->leftChar()); + layIni.SaveFile((changeFileExt(filename(), "layout")).toLocal8Bit()); } bool Project::saveUnits() { int count = 0; SimpleIni ini; - ini.LoadFile(mFilename.toLocal8Bit()); + SI_Error error = ini.LoadFile(mFilename.toLocal8Bit()); + if (error != SI_Error::SI_OK) + return false; for (int idx = 0; idx < mUnits.count(); idx++) { PProjectUnit unit = mUnits[idx]; bool rd_only = false; @@ -1302,12 +1302,13 @@ QString Project::listUnitStr(const QChar &separator) void Project::loadLayout() { - QSettings layIni = QSettings(changeFileExt(filename(), "layout"),QSettings::IniFormat); - layIni.beginGroup("Editors"); - int topLeft = layIni.value("Focused", -1).toInt(); + SimpleIni layIni; + SI_Error error = layIni.LoadFile(changeFileExt(filename(), "layout").toLocal8Bit()); + if (error!=SI_OK) + return; + int topLeft = layIni.GetLongValue("Editors","Focused",1); //TopRight := layIni.ReadInteger('Editors', 'FocusedRight', -1); - QString temp =layIni.value("Order", "").toString(); - layIni.endGroup(); + QString temp =layIni.GetValue("Editors","Order", ""); QStringList sl = temp.split(",",Qt::SkipEmptyParts); foreach (const QString& s,sl) { @@ -1320,7 +1321,6 @@ void Project::loadLayout() if (topLeft>=0 && topLefteditor()) { mUnits[topLeft]->editor()->activate(); } - } void Project::loadOptions(SimpleIni& ini) @@ -1456,13 +1456,16 @@ void Project::loadUnitLayout(Editor *e, int index) { if (!e) return; - QSettings layIni(changeFileExt(filename(), "layout"), QSettings::IniFormat); - layIni.beginGroup(QString("Editor_%1").arg(index)); - e->setCaretY(layIni.value("CursorRow",1).toInt()); - e->setCaretX(layIni.value("CursorCol",1).toInt()); - e->setTopLine(layIni.value("TopLine",1).toInt()); - e->setLeftChar(layIni.value("LeftChar",1).toInt()); - layIni.endGroup(); + SimpleIni layIni; + SI_Error error; + error = layIni.LoadFile(changeFileExt(filename(), "layout").toLocal8Bit()); + if (error != SI_Error::SI_OK) + return; + QByteArray groupName = (QString("Editor_%1").arg(index)).toUtf8(); + e->setCaretY(layIni.GetLongValue(groupName,"CursorRow",1)); + e->setCaretX(layIni.GetLongValue(groupName,"CursorCol",1)); + e->setTopLine(layIni.GetLongValue(groupName,"TopLine",1)); + e->setLeftChar(layIni.GetLongValue(groupName,"LeftChar",1)); } PCppParser Project::cppParser() diff --git a/RedPandaIDE/qsynedit/KeyStrokes.cpp b/RedPandaIDE/qsynedit/KeyStrokes.cpp index a9151463..6c8a2b35 100644 --- a/RedPandaIDE/qsynedit/KeyStrokes.cpp +++ b/RedPandaIDE/qsynedit/KeyStrokes.cpp @@ -108,7 +108,9 @@ PSynEditKeyStroke SynEditKeyStrokes::findCommand(SynEditorCommand command) PSynEditKeyStroke SynEditKeyStrokes::findKeycode(int key, Qt::KeyboardModifiers modifiers) { for (PSynEditKeyStroke& keyStroke:mList) { - if (keyStroke->key() == key && keyStroke->keyModifiers()==modifiers && keyStroke->key2()==0) + if (keyStroke->key() == key + && keyStroke->keyModifiers() == (modifiers & ~ Qt::KeypadModifier) + && keyStroke->key2()==0) return keyStroke; } return PSynEditKeyStroke(); @@ -118,8 +120,10 @@ PSynEditKeyStroke SynEditKeyStrokes::findKeycode2(int key, Qt::KeyboardModifiers int key2, Qt::KeyboardModifiers modifiers2) { for (PSynEditKeyStroke& keyStroke:mList) { - if (keyStroke->key() == key && keyStroke->keyModifiers()==modifiers && keyStroke->key2()==key2 - && keyStroke->keyModifiers2() ==modifiers2) + if (keyStroke->key() == key + && keyStroke->keyModifiers()==(modifiers & ~ Qt::KeypadModifier) + && keyStroke->key2()==key2 + && keyStroke->keyModifiers2()== (modifiers2 & ~ Qt::KeypadModifier)) return keyStroke; } return PSynEditKeyStroke(); From d5d0cec1b00b189b8e427b15f1a395ce29822a6f Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Wed, 17 Nov 2021 11:26:22 +0800 Subject: [PATCH 15/25] update version to 0.9.0 --- RedPandaIDE/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RedPandaIDE/version.h b/RedPandaIDE/version.h index f88d7bcc..7e546268 100644 --- a/RedPandaIDE/version.h +++ b/RedPandaIDE/version.h @@ -2,6 +2,6 @@ #define VERSION_H #include -#define DEVCPP_VERSION "beta.0.8.11" +#define DEVCPP_VERSION "beta.0.9.0" #endif // VERSION_H From e60b909294348cc81b7485d9cde2c2b2ebde9279 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Wed, 17 Nov 2021 17:18:02 +0800 Subject: [PATCH 16/25] - enhancement: code completion suggestion for "__func__" variable --- NEWS.md | 5 ++++- RedPandaIDE/parser/cppparser.cpp | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index d6e99929..d8b5b0f3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,7 @@ -Version 0.8.12 For Dev-C++ 7 Beta +Version 0.9.1 For Dev-C++ 7 Beta + - enhancement: code completion suggestion for "__func__" variable + +Version 0.9.0 For Dev-C++ 7 Beta - fix: control keys in the numpad doesn't work in the editor - fix: project layout infos are wrongly saved to registry - fix: project layout infos are not correctly saved/loaded diff --git a/RedPandaIDE/parser/cppparser.cpp b/RedPandaIDE/parser/cppparser.cpp index 03360fe0..ac324a9a 100644 --- a/RedPandaIDE/parser/cppparser.cpp +++ b/RedPandaIDE/parser/cppparser.cpp @@ -2153,6 +2153,21 @@ void CppParser::handleMethod(const QString &sType, const QString &sName, const Q true, false); } + // add "__func__ variable" + addStatement( + functionStatement, + mCurrentFile, + "", //dont override hint + "static const char ", + "__func__", + "[]", + "\""+scopelessName+"\"", + startLine+1, + StatementKind::skVariable, + StatementScope::ssLocal, + StatementClassScope::scsNone, + true, + false); } else { functionStatement = addStatement( functionClass, From a2e514e98a7b73d70ff2c9568b52a56f7eb97a1b Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Wed, 17 Nov 2021 23:21:53 +0800 Subject: [PATCH 17/25] fix: project's unit file not correctly add to watch after renamed --- RedPandaIDE/mainwindow.cpp | 4 ++-- RedPandaIDE/project.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 58eb48a6..0133fb38 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -3143,7 +3143,7 @@ void MainWindow::onFileChanged(const QString &path) if (e) { if (fileExists(path)) { e->activate(); - if (QMessageBox::question(this,tr("Compile"), + if (QMessageBox::question(this,tr("File Changed"), tr("File '%1' was changed.").arg(path)+"

" + tr("Reload its content from disk?"), QMessageBox::Yes|QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { @@ -3154,7 +3154,7 @@ void MainWindow::onFileChanged(const QString &path) } } } else { - if (QMessageBox::question(this,tr("Compile"), + if (QMessageBox::question(this,tr("File Changed"), tr("File '%1' was removed.").arg(path)+"

" + tr("Keep it open?"), QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { diff --git a/RedPandaIDE/project.cpp b/RedPandaIDE/project.cpp index e6b76395..23d7e77d 100644 --- a/RedPandaIDE/project.cpp +++ b/RedPandaIDE/project.cpp @@ -1969,7 +1969,7 @@ bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int } // Add new filename to file minitor - pMainWindow->fileSystemWatcher()->removePath(oldName); + pMainWindow->fileSystemWatcher()->addPath(newName); return true; } else { //change folder name From b8f75cb337cb65b0bcf564a10ea651fc1b15f4bc Mon Sep 17 00:00:00 2001 From: royqh1979 Date: Thu, 18 Nov 2021 10:42:41 +0800 Subject: [PATCH 18/25] - fix: ide failed to start, if there are errors in the compiler set settings --- NEWS.md | 1 + RedPandaIDE/settings.cpp | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index d8b5b0f3..f784e949 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ Version 0.9.1 For Dev-C++ 7 Beta - enhancement: code completion suggestion for "__func__" variable + - fix: ide failed to start, if there are errors in the compiler set settings Version 0.9.0 For Dev-C++ 7 Beta - fix: control keys in the numpad doesn't work in the editor diff --git a/RedPandaIDE/settings.cpp b/RedPandaIDE/settings.cpp index acc904c6..e8a2c1c4 100644 --- a/RedPandaIDE/settings.cpp +++ b/RedPandaIDE/settings.cpp @@ -2393,11 +2393,19 @@ void Settings::CompilerSets::loadSets() mDefaultIndex =mSettings->mSettings.value(SETTING_COMPILTER_SETS_DEFAULT_INDEX,-1).toInt(); int listSize = mSettings->mSettings.value(SETTING_COMPILTER_SETS_COUNT,0).toInt(); mSettings->mSettings.endGroup(); + bool loadError = false; for (int i=0;imSettings.endGroup(); + if (pSet->binDirs().isEmpty()) + return PCompilerSet(); pSet->setDirectories(pSet->binDirs()[0]); pSet->setDefines(); return pSet; From a38b4b1813558a530423431826e88ae9d389d5f7 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Thu, 18 Nov 2021 12:01:52 +0800 Subject: [PATCH 19/25] - fix: numpad's enter key doesn't work --- NEWS.md | 1 + RedPandaIDE/qsynedit/KeyStrokes.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index f784e949..a28114e3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,7 @@ Version 0.9.1 For Dev-C++ 7 Beta - enhancement: code completion suggestion for "__func__" variable - fix: ide failed to start, if there are errors in the compiler set settings + - fix: numpad's enter key doesn't work Version 0.9.0 For Dev-C++ 7 Beta - fix: control keys in the numpad doesn't work in the editor diff --git a/RedPandaIDE/qsynedit/KeyStrokes.cpp b/RedPandaIDE/qsynedit/KeyStrokes.cpp index 6c8a2b35..e0c991e2 100644 --- a/RedPandaIDE/qsynedit/KeyStrokes.cpp +++ b/RedPandaIDE/qsynedit/KeyStrokes.cpp @@ -206,8 +206,8 @@ void SynEditKeyStrokes::resetDefaults() add(SynEditorCommand::ecRedo, Qt::Key_Backspace, Qt::AltModifier|Qt::ShiftModifier); add(SynEditorCommand::ecLineBreak, Qt::Key_Return, Qt::NoModifier); add(SynEditorCommand::ecLineBreak, Qt::Key_Return, Qt::ShiftModifier); - add(SynEditorCommand::ecLineBreak, Qt::Key_Enter, Qt::KeypadModifier); - add(SynEditorCommand::ecLineBreak, Qt::Key_Enter, Qt::KeypadModifier|Qt::ShiftModifier); + add(SynEditorCommand::ecLineBreak, Qt::Key_Enter, Qt::NoModifier); + add(SynEditorCommand::ecLineBreak, Qt::Key_Enter, Qt::ShiftModifier); add(SynEditorCommand::ecTab, Qt::Key_Tab, Qt::NoModifier); add(SynEditorCommand::ecShiftTab, Qt::Key_Backtab, Qt::ShiftModifier); add(SynEditorCommand::ecShiftTab, Qt::Key_Tab, Qt::ShiftModifier); From 177cd6e397d59de72a278418c28ce5d00ebb942b Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Thu, 18 Nov 2021 12:51:05 +0800 Subject: [PATCH 20/25] - enhancement: code completion suggestion for phrase after long/short/signed/unsigned --- NEWS.md | 1 + RedPandaIDE/editor.cpp | 29 +++-- RedPandaIDE/editor.h | 2 +- RedPandaIDE/parser/parserutils.cpp | 2 + RedPandaIDE/version.h | 2 +- RedPandaIDE/widgets/codecompletionpopup.cpp | 115 +++++++++++++------- RedPandaIDE/widgets/codecompletionpopup.h | 4 +- 7 files changed, 103 insertions(+), 52 deletions(-) diff --git a/NEWS.md b/NEWS.md index a28114e3..d73b17e5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,6 +2,7 @@ Version 0.9.1 For Dev-C++ 7 Beta - enhancement: code completion suggestion for "__func__" variable - fix: ide failed to start, if there are errors in the compiler set settings - fix: numpad's enter key doesn't work + - enhancement: code completion suggestion for phrase after long/short/signed/unsigned Version 0.9.0 For Dev-C++ 7 Beta - fix: control keys in the numpad doesn't work in the editor diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 904fa7ee..43287c3c 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -692,6 +692,16 @@ void Editor::keyPressEvent(QKeyEvent *event) QString lastWord = getPreviousWordAtPositionForSuggestion(caretXY()); if (!lastWord.isEmpty()) { if (CppTypeKeywords.contains(lastWord)) { + if (lastWord == "long" || + lastWord == "short" || + lastWord == "signed" || + lastWord == "unsigned" + ) { + setSelText(ch); + showCompletion(lastWord,false); + handled=true; + return; + } //last word is a type keyword, this is a var or param define, and dont show suggestion // if devEditor.UseTabnine then // ShowTabnineCompletion; @@ -713,7 +723,7 @@ void Editor::keyPressEvent(QKeyEvent *event) } } setSelText(ch); - showCompletion(false); + showCompletion("",false); handled=true; return; } @@ -727,7 +737,7 @@ void Editor::keyPressEvent(QKeyEvent *event) && pSettings->codeCompletion().showCompletionWhileInput() ) { mLastIdCharPressed++; setSelText(ch); - showCompletion(false); + showCompletion("",false); handled=true; return; } @@ -739,7 +749,7 @@ void Editor::keyPressEvent(QKeyEvent *event) && pSettings->codeCompletion().showCompletionWhileInput() ) { mLastIdCharPressed++; setSelText(ch); - showCompletion(false); + showCompletion("",false); handled=true; return; } @@ -1139,7 +1149,7 @@ void Editor::inputMethodEvent(QInputMethodEvent *event) return; } } - showCompletion(false); + showCompletion("",false); return; } } @@ -1904,20 +1914,20 @@ bool Editor::handleCodeCompletion(QChar key) switch(key.unicode()) { case '.': setSelText(key); - showCompletion(false); + showCompletion("",false); return true; case '>': setSelText(key); if ((caretX() > 2) && (lineText().length() >= 2) && (lineText()[caretX() - 3] == '-')) - showCompletion(false); + showCompletion("",false); return true; case ':': ExecuteCommand(SynEditorCommand::ecChar,':',nullptr); //setSelText(key); if ((caretX() > 2) && (lineText().length() >= 2) && (lineText()[caretX() - 3] == ':')) - showCompletion(false); + showCompletion("",false); return true; case '/': case '\\': @@ -2260,7 +2270,7 @@ void Editor::exportAsHTML(const QString &htmlFilename) exporter.SaveToFile(htmlFilename); } -void Editor::showCompletion(bool autoComplete) +void Editor::showCompletion(const QString& preWord,bool autoComplete) { if (!pSettings->codeCompletion().enabled()) return; @@ -2337,8 +2347,7 @@ void Editor::showCompletion(bool autoComplete) if (word.isEmpty()) word=getWordAtPosition(this,caretXY(),pBeginPos,pEndPos, WordPurpose::wpCompletion); - //if not fCompletionBox.Visible then - mCompletionPopup->prepareSearch(word, mFilename, pBeginPos.Line); + mCompletionPopup->prepareSearch(preWord, word, mFilename, pBeginPos.Line); // Filter the whole statement list if (mCompletionPopup->search(word, autoComplete)) { //only one suggestion and it's not input while typing diff --git a/RedPandaIDE/editor.h b/RedPandaIDE/editor.h index 70e44cfb..05c11159 100644 --- a/RedPandaIDE/editor.h +++ b/RedPandaIDE/editor.h @@ -202,7 +202,7 @@ private: void undoSymbolCompletion(int pos); QuoteStatus getQuoteStatus(); - void showCompletion(bool autoComplete); + void showCompletion(const QString& preWord, bool autoComplete); void showHeaderCompletion(bool autoComplete); bool testInFunc(int x,int y); diff --git a/RedPandaIDE/parser/parserutils.cpp b/RedPandaIDE/parser/parserutils.cpp index 6ba40616..e6254b2b 100644 --- a/RedPandaIDE/parser/parserutils.cpp +++ b/RedPandaIDE/parser/parserutils.cpp @@ -154,6 +154,8 @@ void initParser() //CppTypeKeywords.insert("unsigned"); CppTypeKeywords.insert("void"); CppTypeKeywords.insert("wchar_t"); + CppTypeKeywords.insert("signed"); + CppTypeKeywords.insert("unsigned"); // it's part of type info CppKeywords.insert("const",SkipType::skNone); diff --git a/RedPandaIDE/version.h b/RedPandaIDE/version.h index 7e546268..fe8b2949 100644 --- a/RedPandaIDE/version.h +++ b/RedPandaIDE/version.h @@ -2,6 +2,6 @@ #define VERSION_H #include -#define DEVCPP_VERSION "beta.0.9.0" +#define DEVCPP_VERSION "beta.0.9.1" #endif // VERSION_H diff --git a/RedPandaIDE/widgets/codecompletionpopup.cpp b/RedPandaIDE/widgets/codecompletionpopup.cpp index 78dbc867..a37331d1 100644 --- a/RedPandaIDE/widgets/codecompletionpopup.cpp +++ b/RedPandaIDE/widgets/codecompletionpopup.cpp @@ -59,7 +59,7 @@ void CodeCompletionPopup::setKeypressedCallback(const KeyPressedCallback &newKey mListView->setKeypressedCallback(newKeypressedCallback); } -void CodeCompletionPopup::prepareSearch(const QString &phrase, const QString &filename, int line) +void CodeCompletionPopup::prepareSearch(const QString& preWord,const QString &phrase, const QString &filename, int line) { QMutexLocker locker(&mMutex); if (!isEnabled()) @@ -69,19 +69,19 @@ void CodeCompletionPopup::prepareSearch(const QString &phrase, const QString &fi QCursor oldCursor = cursor(); setCursor(Qt::CursorShape::WaitCursor); - mIncludedFiles = mParser->getFileIncludes(filename); - getCompletionFor(filename,phrase,line); + if (preWord.isEmpty()) { + mIncludedFiles = mParser->getFileIncludes(filename); + getCompletionFor(filename,phrase,line); - if (mFullCompletionStatementList.isEmpty() && phrase.startsWith('~')) { - mPhrase = phrase.mid(1); - getCompletionFor(filename,mPhrase,line); + if (mFullCompletionStatementList.isEmpty() && phrase.startsWith('~')) { + mPhrase = phrase.mid(1); + getCompletionFor(filename,mPhrase,line); + } + } else { + mPhrase = phrase; + getFullCompletionListFor(preWord); } - //todo: notify model -//CodeComplForm.lbCompletion.Font.Size := FontSize; -//CodeComplForm.lbCompletion.ItemHeight := CodeComplForm.lbCompletion.Canvas.TextHeight('F')+6; -// Round(2 * FontSize); -//CodeComplForm.Update; setCursor(oldCursor); } @@ -453,13 +453,14 @@ void CodeCompletionPopup::getCompletionFor(const QString &fileName, const QStrin if (phrase.startsWith('#')) { if (mShowKeywords) { foreach (const QString& keyword, CppDirectives) { - PStatement statement = std::make_shared(); - statement->command = keyword; - statement->kind = StatementKind::skKeyword; - statement->fullName = keyword; - statement->usageCount = 0; - statement->freqTop = 0; - mFullCompletionStatementList.append(statement); + addKeyword(keyword); +// PStatement statement = std::make_shared(); +// statement->command = keyword; +// statement->kind = StatementKind::skKeyword; +// statement->fullName = keyword; +// statement->usageCount = 0; +// statement->freqTop = 0; +// mFullCompletionStatementList.append(statement); } } return; @@ -469,13 +470,14 @@ void CodeCompletionPopup::getCompletionFor(const QString &fileName, const QStrin if (phrase.startsWith('@')) { if (mShowKeywords) { foreach (const QString& keyword,JavadocTags) { - PStatement statement = std::make_shared(); - statement->command = keyword; - statement->kind = StatementKind::skKeyword; - statement->fullName = keyword; - statement->usageCount = 0; - statement->freqTop = 0; - mFullCompletionStatementList.append(statement); + addKeyword(keyword); +// PStatement statement = std::make_shared(); +// statement->command = keyword; +// statement->kind = StatementKind::skKeyword; +// statement->fullName = keyword; +// statement->usageCount = 0; +// statement->freqTop = 0; +// mFullCompletionStatementList.append(statement); } } return; @@ -506,23 +508,25 @@ void CodeCompletionPopup::getCompletionFor(const QString &fileName, const QStrin //add keywords if (mUseCppKeyword) { foreach (const QString& keyword,CppKeywords.keys()) { - PStatement statement = std::make_shared(); - statement->command = keyword; - statement->kind = StatementKind::skKeyword; - statement->fullName = keyword; - statement->usageCount = 0; - statement->freqTop = 0; - mFullCompletionStatementList.append(statement); + addKeyword(keyword); +// PStatement statement = std::make_shared(); +// statement->command = keyword; +// statement->kind = StatementKind::skKeyword; +// statement->fullName = keyword; +// statement->usageCount = 0; +// statement->freqTop = 0; +// mFullCompletionStatementList.append(statement); } } else { foreach (const QString& keyword,CKeywords) { - PStatement statement = std::make_shared(); - statement->command = keyword; - statement->kind = StatementKind::skKeyword; - statement->fullName = keyword; - statement->usageCount = 0; - statement->freqTop = 0; - mFullCompletionStatementList.append(statement); + addKeyword(keyword); +// PStatement statement = std::make_shared(); +// statement->command = keyword; +// statement->kind = StatementKind::skKeyword; +// statement->fullName = keyword; +// statement->usageCount = 0; +// statement->freqTop = 0; +// mFullCompletionStatementList.append(statement); } } } @@ -750,6 +754,39 @@ void CodeCompletionPopup::getCompletionFor(const QString &fileName, const QStrin } } +void CodeCompletionPopup::getFullCompletionListFor(const QString &preWord) +{ + mFullCompletionStatementList.clear(); + if (preWord == "long") { + addKeyword("long"); + addKeyword("double"); + addKeyword("int"); + } else if (preWord == "short") { + addKeyword("int"); + } else if (preWord == "signed") { + addKeyword("long"); + addKeyword("short"); + addKeyword("int"); + addKeyword("char"); + } else if (preWord == "unsigned") { + addKeyword("long"); + addKeyword("short"); + addKeyword("int"); + addKeyword("char"); + } +} + +void CodeCompletionPopup::addKeyword(const QString &keyword) +{ + PStatement statement = std::make_shared(); + statement->command = keyword; + statement->kind = StatementKind::skKeyword; + statement->fullName = keyword; + statement->usageCount = 0; + statement->freqTop = 0; + mFullCompletionStatementList.append(statement); +} + bool CodeCompletionPopup::isIncluded(const QString &fileName) { return mIncludedFiles.contains(fileName); diff --git a/RedPandaIDE/widgets/codecompletionpopup.h b/RedPandaIDE/widgets/codecompletionpopup.h index 1f94db9b..17284c09 100644 --- a/RedPandaIDE/widgets/codecompletionpopup.h +++ b/RedPandaIDE/widgets/codecompletionpopup.h @@ -31,7 +31,7 @@ public: ~CodeCompletionPopup(); void setKeypressedCallback(const KeyPressedCallback &newKeypressedCallback); - void prepareSearch(const QString& phrase, const QString& filename, int line); + void prepareSearch(const QString& preWord, const QString& phrase, const QString& filename, int line); bool search(const QString& phrase, bool autoHideOnSingleResult); PStatement selectedStatement(); @@ -74,6 +74,8 @@ private: void addStatement(PStatement statement, const QString& fileName, int line); void filterList(const QString& member); void getCompletionFor(const QString& fileName,const QString& phrase, int line); + void getFullCompletionListFor(const QString& preWord); + void addKeyword(const QString& keyword); bool isIncluded(const QString& fileName); private: CodeCompletionListView * mListView; From 1c9bb4979938b8bfd198f8e2c3919b198be3435c Mon Sep 17 00:00:00 2001 From: royqh1979 Date: Thu, 18 Nov 2021 21:25:28 +0800 Subject: [PATCH 21/25] - enhancement: save/load default projects folder - enhancement: add editor general options "highlight current word" and "highlight matching braces" --- NEWS.md | 2 + RedPandaIDE/RedPandaIDE_zh_CN.qm | Bin 105123 -> 105685 bytes RedPandaIDE/RedPandaIDE_zh_CN.ts | 320 ++++++++++-------- RedPandaIDE/editor.cpp | 18 +- RedPandaIDE/main.cpp | 9 +- RedPandaIDE/mainwindow.cpp | 17 +- RedPandaIDE/qsynedit/Types.cpp | 5 + RedPandaIDE/qsynedit/Types.h | 1 + RedPandaIDE/qt_zh_CN.qm | Bin 0 -> 117347 bytes RedPandaIDE/settings.cpp | 51 ++- RedPandaIDE/settings.h | 15 +- .../settingsdialog/editorgeneralwidget.cpp | 7 + .../settingsdialog/editorgeneralwidget.ui | 23 ++ RedPandaIDE/translations.qrc | 1 + RedPandaIDE/widgets/darkfusionstyle.cpp | 5 + RedPandaIDE/widgets/darkfusionstyle.h | 5 + RedPandaIDE/widgets/newprojectdialog.cpp | 19 +- RedPandaIDE/widgets/newprojectdialog.h | 1 + RedPandaIDE/widgets/newprojectdialog.ui | 33 +- 19 files changed, 341 insertions(+), 191 deletions(-) create mode 100644 RedPandaIDE/qt_zh_CN.qm diff --git a/NEWS.md b/NEWS.md index d73b17e5..1b7010cc 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,8 @@ Version 0.9.1 For Dev-C++ 7 Beta - fix: ide failed to start, if there are errors in the compiler set settings - fix: numpad's enter key doesn't work - enhancement: code completion suggestion for phrase after long/short/signed/unsigned + - enhancement: save/load default projects folder + - enhancement: add editor general options "highlight current word" and "highlight matching braces" Version 0.9.0 For Dev-C++ 7 Beta - fix: control keys in the numpad doesn't work in the editor diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.qm b/RedPandaIDE/RedPandaIDE_zh_CN.qm index a8bb9e703161aafbdea085697440192573bdadef..5b733830380f63b4033381f00ca0881917a6107c 100644 GIT binary patch delta 6886 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 delta 6515 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 NoS9XbUqk}9{{x1v(1HK} diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts index 0103efed..a500b37c 100644 --- a/RedPandaIDE/RedPandaIDE_zh_CN.ts +++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts @@ -1031,10 +1031,10 @@ Are you really want to continue? - - - - + + + + Error 错误 @@ -1048,55 +1048,55 @@ Are you really want to continue? 另存为
- + The text to be copied exceeds count limit! 要复制的内容超过了行数限制! - + The text to be copied exceeds character limit! 要复制的内容超过了字符数限制! - + The text to be cut exceeds count limit! 要剪切的内容超过了行数限制! - + The text to be cut exceeds character limit! 要剪切的内容超过了字符数限制! - + Print Document 打印文档 - - - + + + Ctrl+click for more info Ctrl+单击以获取更多信息 - - + + Symbol '%1' not found! 未找到符号'%1'! - + Break point condition 断点条件 - + Enter the condition of the breakpoint: 输入当前断点的生效条件: - + Readonly 只读 @@ -2861,7 +2861,7 @@ Are you really want to continue? - + Issues 编译器 @@ -3072,8 +3072,6 @@ Are you really want to continue? - - Compile 编译 @@ -3269,7 +3267,7 @@ Are you really want to continue? - + New Problem Set 新建试题集 @@ -3288,14 +3286,14 @@ Are you really want to continue? - + Save Problem Set 保存试题集 - + Load Problem Set 载入试题集 @@ -3731,7 +3729,7 @@ Are you really want to continue? - + Rename Symbol 重命名符号 @@ -3752,13 +3750,13 @@ Are you really want to continue? - + Export As RTF 导出为RTF - + Export As HTML 导出为HTML @@ -3824,7 +3822,7 @@ Are you really want to continue? - + Open Folder 打开文件夹 @@ -4055,7 +4053,7 @@ Are you really want to continue? - + Problem Set %1 试题集%1 @@ -4122,15 +4120,15 @@ Are you really want to continue? - - + + Bookmark Description 书签描述 - - + + Description: 描述: @@ -4294,10 +4292,16 @@ Are you really want to continue? - + Do you want to save it? 需要保存吗? + + + + File Changed + 文件已发生变化 + New Project File? @@ -4312,7 +4316,7 @@ Are you really want to continue? - + Save Error 保存失败 @@ -4337,160 +4341,160 @@ Are you really want to continue? 您真的要清除该文件的所有断点吗? - + New project 新建项目 - + Close %1 and start new project? 关闭'%1'以打开新项目? - + Folder not exist 文件夹不存在 - + Folder '%1' doesn't exist. Create it now? 文件夹'%1'不存在。是否创建? - + Can't create folder 无法创建文件夹 - + Failed to create folder '%1'. 创建文件夹'%1'失败。 - + Save new project as - + Red panda Dev-C++ project file (*.dev) 小熊猫Dev-C++项目文件 (*.dev) - + New project fail 新建项目失败 - + Can't assign project template 无法使用模板创建项目 - + Remove file 删除文件 - + Remove the file from disk? 同时从硬盘上删除文件? - + untitled 无标题 - + New Project File Name 新的项目文件名 - + File Name: 文件名: - + File Already Exists! 文件已存在! - + File '%1' already exists! 文件'%1'已经存在! - + Add to project 添加到项目 - + Rename Error 重命名出错 - + Symbol '%1' is defined in system header. 符号'%1'在系统头文件中定义,无法修改。 - + New Name 新名称 - - + + Replace Error 替换出错 - + Can't open file '%1' for replace! 无法打开文件'%1'进行替换! - + Contents has changed since last search! 内容和上次查找时不一致。 - + Rich Text Format Files (*.rtf) RTF格式文件 (*.rtf) - + HTML Files (*.html) HTML文件 (*.html) - + The current problem set is not empty. 当前的试题集不是空的。 - + Problem %1 试题%1 - - + + Problem Set Files (*.pbs) 试题集文件 (*.pbs) - + Load Error 载入失败 - + Problem Case %1 试题案例%1 @@ -4615,28 +4619,37 @@ Are you really want to continue? C++语言项目 - + Name: 项目名称: - - Location: - 文件夹: + + Create in + 创建在 - + + Use as the default project location + 设为缺省项目位置 + + + Location: + 文件夹: + + + ... ... - + Project%1 项目%1 - - + + Default 缺省 @@ -5176,24 +5189,24 @@ Are you really want to continue? ProjectModel - + File exists 文件已存在 - + File '%1' already exists. Delete it now? 文件'%1'已存在。是否删除? - - + + Remove failed 删除失败 - - + + Failed to remove file '%1' 无法删除文件'%1' @@ -5412,7 +5425,7 @@ Are you really want to continue? QApplication - + Error 错误 @@ -5482,180 +5495,180 @@ Are you really want to continue? 无法写入配置文件夹"%1" - + Can't load autolink settings 无法载入自动链接设置 - - - - + + + + The following %1 directories don't exist: 下列%1文件夹不存在: - - + + binary 二进制 - + No %1 directories have been specified. 未指定%1文件夹 - + C include C包含 - - + + C++ include C++包含 - - - - + + + + Cannot find the %1 "%2" 无法找到%1程序"%2" - + C options C语言选项 - + Support all ANSI standard C programs (-ansi) 支持所有ANSI标准C程序(-ansi) - + Do not recognize asm,inline or typeof as a keyword (-fno-asm) 不支持将asm、inline和typeof作为关键字(-fno-asm) - + Imitate traditional C preprocessors (-traditional-cpp) 模仿传统C预处理器行为(-traditional-cpp) - + Code Generation 代码生成 - + Optimize for the following machine (-march) 生成特定机器的专用指令(-march) - + Optimize less, while maintaining full compatibility (-tune) 完整兼容特定机器,较少优化(-tune) - + Enable use of specific instructions (-mx) 启用特定指令集(-mx) - + Optimization level (-Ox) 优化级别(-Ox) - + Compile with the following pointer size (-mx) 使用下列指针大小编译(-mx) - + Language standard (-std) 语言标准(-std) - + Profile 性能分析 - + Generate debugging information (-g3) 生成调试信息(-g3) - + Generate profiling info for analysis (-pg) 生成性能分析信息(-pg) - + Warnings 代码警告 - + Inhibit all warning messages (-w) 忽略所有警告信息(-w) - + Show most warnings (-Wall) 启用常见问题警告(-Wall) - + Show some more warnings (-Wextra) 启用更多问题警告(-Wextra) - + Check ISO C/C++/C++0x conformance (-pedantic) 检查ISO C/C++/C++0x语法一致性(-pedantic) - + Only check the code for syntax errors (-fsyntax-only) 只进行语法检查(不编译)(-fsyntax-only) - + Make all warnings into errors (-Werror) 将警告作为错误处理(-Werror) - + Abort compilation on first error (-Wfatal-errors) 遇到第一个错误后立即中止编译(-Wfatal-errors) - + Linker 链接器 - + Link an Objective C program (-lobjc) 链接Objective-C程序 (-lobjc) - + Do not use standard system libraries (-nostdlib) 不使用标准库和系统启动文件(-nostdlib) - + Do not create a console window (-mwindows) 不产生控制台窗口(-mwindows) - + Strip executable (-s) 剥除附加信息(-s) @@ -5664,53 +5677,53 @@ Are you really want to continue? 链接Ojbective C程序(-lobjc) - + Output 输出 - + Put comments in generated assembly code (-fverbose-asm) 在生成的汇编代码中加入注释(-fverbose-asm) - + Use pipes instead of temporary files during compilation (-pipe) 编译时使用管道而不是临时文件(-pipe) - + Do not assemble, compile and generate the assemble code (-S) 只生成汇编代码(-S) - - + + Confirm 确认 - + The following problems were found during validation of compiler set "%1": 在验证编译器设置"%1"时遇到了下列问题: - + Would you like Red Panda C++ to remove them for you and add the default paths to the valid paths? 是否让小熊猫C++删除这些配置,并尝试重新建立配置? - + Leaving those directories will lead to problems during compilation.<br /><br />Unless you know exactly what you're doing, it is recommended that you click Yes. 如果仍然保留这些设置,可能会导致编译错误。<br /><br />请选择“是”,除非您清楚的知道选择“否”的后果, - + Compiler set not configuared. 未配置编译器设置。 - + Would you like Red Panda C++ to search for compilers in the following locations: <BR />'%1'<BR />'%2'? 您需要小熊猫C++在下列位置搜索编译器吗:<br />%1<br />%2 @@ -6503,7 +6516,7 @@ Are you really want to continue? 自动链接 - + @@ -6579,7 +6592,7 @@ Are you really want to continue? 杂项 - + Program Runner @@ -7087,51 +7100,66 @@ Are you really want to continue? + Highlight + 高亮显示 + + + + Highlight matching braces + 高亮显示与光标处相匹配的括号 + + + + Highlight current word + 高亮显示光标所在的单词 + + + Scroll 滚动条 - + Auto hide scroll bars 自动隐藏滚动条 - + Can scroll the last char to the left edge of the editor 可以将每行末尾字符滚动到编辑器最左侧 - + Can scroll the last line to the top edge of the editor 可以将最后一行滚动到编辑器最上方 - + Page Up/Down scrolls half a page 翻页键只滚动半页 - + Forces page scroll to be one line less 在滚动页时少滚动一行 - + Mouse Wheel Scroll Speed 鼠标滚轮卷轴速度(行) - + Show right edge line 显示右边缘线 - + Right egde width 右边缘宽度 - + Right edge line color 右边缘颜色 diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 43287c3c..2996326d 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -920,7 +920,8 @@ void Editor::onPreparePaintHighlightToken(int line, int aChar, const QString &to foreground = mCurrentHighlighWordForeground; if (mCurrentHighlighWordBackground.isValid()) background = mCurrentHighlighWordBackground; - } else if (!selAvail() && attr->name() == SYNS_AttrSymbol) { + } else if (!selAvail() && attr->name() == SYNS_AttrSymbol + && pSettings->editor().highlightMathingBraces()) { // qDebug()<=0) { if (mTabStopY==caretY()) { if (mLineAfterTabStop.isEmpty()) { @@ -1437,7 +1434,11 @@ void Editor::onStatusChanged(SynStatusChanges changes) clearUserCodeInTabStops(); } } - } else if (!selAvail() && highlighter()){ + } else if (!selAvail() && highlighter() && pSettings->editor().highlightMathingBraces()){ + invalidateLine(mHighlightCharPos1.Line); + invalidateLine(mHighlightCharPos2.Line); + mHighlightCharPos1 = BufferCoord{0,0}; + mHighlightCharPos2 = BufferCoord{0,0}; // Is there a bracket char before us? int lineLength = lineText().length(); int ch = caretX() - 2; @@ -1471,8 +1472,11 @@ void Editor::onStatusChanged(SynStatusChanges changes) // scSelection includes anything caret related if (changes.testFlag(SynStatusChange::scSelection)) { - if (!selAvail()) { + if (!selAvail() && pSettings->editor().highlightCurrentWord()) { mCurrentHighlightedWord = wordAtCursor(); + } else if (selAvail() && blockBegin() == wordStart() + && blockEnd() == wordEnd()){ + mCurrentHighlightedWord = selText(); } else { mCurrentHighlightedWord = ""; } diff --git a/RedPandaIDE/main.cpp b/RedPandaIDE/main.cpp index c28f41ab..c3709e8a 100644 --- a/RedPandaIDE/main.cpp +++ b/RedPandaIDE/main.cpp @@ -80,7 +80,7 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); //Translation must be loaded first - QTranslator trans; + QTranslator trans,transQt; QString settingFilename = getSettingFilename(); if (!isGreenEdition()) { QDir::setCurrent(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0]); @@ -91,8 +91,13 @@ int main(int argc, char *argv[]) QSettings languageSetting(settingFilename,QSettings::IniFormat); languageSetting.beginGroup(SETTING_ENVIRONMENT); QString language = languageSetting.value("language",QLocale::system().name()).toString(); - if (trans.load("RedPandaIDE_"+language,":/translations")) + + if (trans.load("RedPandaIDE_"+language,":/translations")) { app.installTranslator(&trans); + } + if (transQt.load("qt_"+language,":/translations")) { + app.installTranslator(&transQt); + } } qRegisterMetaType("PCompileIssue"); diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 0133fb38..1afc24fa 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -4567,6 +4567,10 @@ void MainWindow::on_actionNew_Project_triggered() { NewProjectDialog dialog; if (dialog.exec() == QDialog::Accepted) { + if (dialog.useAsDefaultProjectDir()) { + pSettings->dirs().setProjectDir(dialog.getLocation()); + pSettings->dirs().save(); + } // Take care of the currently opened project QString s; if (mProject) { @@ -4587,19 +4591,20 @@ void MainWindow::on_actionNew_Project_triggered() } //Create the project folder - QDir dir(dialog.getLocation()); + QString location = includeTrailingPathDelimiter(dialog.getLocation())+dialog.getProjectName(); + QDir dir(location); if (!dir.exists()) { if (QMessageBox::question(this, tr("Folder not exist"), - tr("Folder '%1' doesn't exist. Create it now?").arg(dialog.getLocation()), + tr("Folder '%1' doesn't exist. Create it now?").arg(location), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) != QMessageBox::Yes) { return; } - if (!dir.mkpath(dialog.getLocation())) { + if (!dir.mkpath(location)) { QMessageBox::critical(this, tr("Can't create folder"), - tr("Failed to create folder '%1'.").arg(dialog.getLocation()), + tr("Failed to create folder '%1'.").arg(location), QMessageBox::Yes); return; } @@ -4608,14 +4613,14 @@ void MainWindow::on_actionNew_Project_triggered() // if cbDefault.Checked then // devData.DefCpp := rbCpp.Checked; - s = includeTrailingPathDelimiter(dialog.getLocation()) + s = includeTrailingPathDelimiter(location) + dialog.getProjectName() + "." + DEV_PROJECT_EXT; if (fileExists(s)) { QString saveName = QFileDialog::getSaveFileName( this, tr("Save new project as"), - dialog.getLocation(), + location, tr("Red panda Dev-C++ project file (*.dev)")); if (!saveName.isEmpty()) { s = saveName; diff --git a/RedPandaIDE/qsynedit/Types.cpp b/RedPandaIDE/qsynedit/Types.cpp index 19d93538..e4e985eb 100644 --- a/RedPandaIDE/qsynedit/Types.cpp +++ b/RedPandaIDE/qsynedit/Types.cpp @@ -234,3 +234,8 @@ void ContentsCoord::setCh(int newChar) { mChar = newChar; } + +bool BufferCoord::operator==(const BufferCoord &coord) +{ + return coord.Char == Char && coord.Line == Line; +} diff --git a/RedPandaIDE/qsynedit/Types.h b/RedPandaIDE/qsynedit/Types.h index 09b11c88..ce7fe313 100644 --- a/RedPandaIDE/qsynedit/Types.h +++ b/RedPandaIDE/qsynedit/Types.h @@ -10,6 +10,7 @@ enum class SynSelectionMode {smNormal, smLine, smColumn}; struct BufferCoord { int Char; int Line; + bool operator==(const BufferCoord& coord); }; class SynEdit; diff --git a/RedPandaIDE/qt_zh_CN.qm b/RedPandaIDE/qt_zh_CN.qm new file mode 100644 index 0000000000000000000000000000000000000000..77ff14416fc8cee0fcea4e0cbfa6c75124f647a4 GIT binary patch literal 117347 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 K0^Ih(asLPSj?`oT literal 0 HcmV?d00001 diff --git a/RedPandaIDE/settings.cpp b/RedPandaIDE/settings.cpp index e8a2c1c4..ff5522d7 100644 --- a/RedPandaIDE/settings.cpp +++ b/RedPandaIDE/settings.cpp @@ -87,6 +87,7 @@ void Settings::load() mCodeCompletion.load(); mCodeFormatter.load(); mUI.load(); + mDirs.load(); } Settings::Dirs &Settings::dirs() @@ -161,12 +162,7 @@ QString Settings::Dirs::templateDir() const QString Settings::Dirs::projectDir() const { - if (isGreenEdition()) { - return includeTrailingPathDelimiter(app()) + "projects"; - } else { - return includeTrailingPathDelimiter(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0]) - + "projects"; - } + return mProjectDir; } QString Settings::Dirs::data(Settings::Dirs::DataType dataType) const @@ -205,12 +201,24 @@ QString Settings::Dirs::executable() const void Settings::Dirs::doSave() { - + saveValue("projectDir",mProjectDir); } void Settings::Dirs::doLoad() { + QString defaultProjectDir; + if (isGreenEdition()) { + defaultProjectDir = includeTrailingPathDelimiter(app()) + "projects"; + } else { + defaultProjectDir = includeTrailingPathDelimiter(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0]) + + "projects"; + } + mProjectDir = stringValue("projectDir",defaultProjectDir); +} +void Settings::Dirs::setProjectDir(const QString &newProjectDir) +{ + mProjectDir = newProjectDir; } Settings::_Base::_Base(Settings *settings, const QString &groupName): @@ -524,6 +532,26 @@ void Settings::Editor::setUseUTF8ByDefault(bool newUseUTF8ByDefault) mUseUTF8ByDefault = newUseUTF8ByDefault; } +bool Settings::Editor::highlightMathingBraces() const +{ + return mHighlightMathingBraces; +} + +void Settings::Editor::setHighlightMathingBraces(bool newHighlightMathingBraces) +{ + mHighlightMathingBraces = newHighlightMathingBraces; +} + +bool Settings::Editor::highlightCurrentWord() const +{ + return mHighlightCurrentWord; +} + +void Settings::Editor::setHighlightCurrentWord(bool newHighlightCurrentWord) +{ + mHighlightCurrentWord = newHighlightCurrentWord; +} + bool Settings::Editor::enableTooltips() const { return mEnableTooltips; @@ -994,6 +1022,7 @@ void Settings::Editor::doSave() saveValue("show_indent_lines", mShowIndentLines); saveValue("indent_line_color",mIndentLineColor); saveValue("fill_indents",mfillIndents); + // caret saveValue("enhance_home_key",mEnhanceHomeKey); saveValue("enhance_end_key",mEnhanceEndKey); @@ -1003,6 +1032,10 @@ void Settings::Editor::doSave() saveValue("caret_use_text_color",mCaretUseTextColor); saveValue("caret_color",mCaretColor); + //highlight + saveValue("highlight_matching_braces",mHighlightMathingBraces); + saveValue("highlight_current_word",mHighlightCurrentWord); + //scroll saveValue("auto_hide_scroll_bar", mAutoHideScrollbar); saveValue("scroll_past_eof", mScrollPastEof); @@ -1112,6 +1145,10 @@ void Settings::Editor::doLoad() mCaretUseTextColor = boolValue("caret_use_text_color",true); mCaretColor = colorValue("caret_color",QColorConstants::Svg::yellow); + //highlight + mHighlightMathingBraces = boolValue("highlight_matching_braces",true); + mHighlightCurrentWord = boolValue("highlight_current_word",true); + //scroll mAutoHideScrollbar = boolValue("auto_hide_scroll_bar", false); mScrollPastEof = boolValue("scroll_past_eof", true); diff --git a/RedPandaIDE/settings.h b/RedPandaIDE/settings.h index d6d6f0a4..23bfb885 100644 --- a/RedPandaIDE/settings.h +++ b/RedPandaIDE/settings.h @@ -96,10 +96,13 @@ public: QString config(DataType dataType = DataType::None) const; QString executable() const; - // _Base interface + void setProjectDir(const QString &newProjectDir); + protected: void doSave() override; void doLoad() override; + private: + QString mProjectDir; }; class Editor: public _Base { @@ -336,6 +339,12 @@ public: bool useUTF8ByDefault() const; void setUseUTF8ByDefault(bool newUseUTF8ByDefault); + bool highlightCurrentWord() const; + void setHighlightCurrentWord(bool newHighlightCurrentWord); + + bool highlightMathingBraces() const; + void setHighlightMathingBraces(bool newHighlightMathingBraces); + private: //General // indents @@ -354,6 +363,10 @@ public: bool mCaretUseTextColor; QColor mCaretColor; + //highlights + bool mHighlightCurrentWord; + bool mHighlightMathingBraces; + //scroll bool mAutoHideScrollbar; bool mScrollPastEof; diff --git a/RedPandaIDE/settingsdialog/editorgeneralwidget.cpp b/RedPandaIDE/settingsdialog/editorgeneralwidget.cpp index c31c91c8..acd839a3 100644 --- a/RedPandaIDE/settingsdialog/editorgeneralwidget.cpp +++ b/RedPandaIDE/settingsdialog/editorgeneralwidget.cpp @@ -52,6 +52,9 @@ void EditorGeneralWidget::doLoad() setCaretTypeIndex(ui->cbCaretForOverwrite,pSettings->editor().caretForOverwrite()); ui->chkCaretUseTextColor->setChecked(pSettings->editor().caretUseTextColor()); ui->colorCaret->setColor(pSettings->editor().caretColor()); + //highlight + ui->chkHighlightCurrentWord->setChecked(pSettings->editor().highlightCurrentWord()); + ui->chkHighlightMatchingBraces->setChecked(pSettings->editor().highlightMathingBraces()); //scrolls; ui->chkAutoHideScrollBars->setChecked(pSettings->editor().autoHideScrollbar()); ui->chkScrollPastEOF->setChecked(pSettings->editor().scrollPastEof()); @@ -84,6 +87,10 @@ void EditorGeneralWidget::doSave() pSettings->editor().setCaretForOverwrite(getCaretTypeIndex(ui->cbCaretForOverwrite)); pSettings->editor().setCaretUseTextColor(ui->chkCaretUseTextColor->isChecked()); pSettings->editor().setCaretColor(ui->colorCaret->color()); + //highlight + pSettings->editor().setHighlightCurrentWord(ui->chkHighlightCurrentWord->isChecked()); + pSettings->editor().setHighlightMathingBraces(ui->chkHighlightMatchingBraces->isChecked()); + //scrolls; pSettings->editor().setAutoHideScrollbar(ui->chkAutoHideScrollBars->isChecked()); pSettings->editor().setScrollPastEof(ui->chkScrollPastEOF->isChecked()); diff --git a/RedPandaIDE/settingsdialog/editorgeneralwidget.ui b/RedPandaIDE/settingsdialog/editorgeneralwidget.ui index 488070f8..760f4900 100644 --- a/RedPandaIDE/settingsdialog/editorgeneralwidget.ui +++ b/RedPandaIDE/settingsdialog/editorgeneralwidget.ui @@ -228,6 +228,29 @@ + + + + Highlight + + + + + + Highlight matching braces + + + + + + + Highlight current word + + + + + + diff --git a/RedPandaIDE/translations.qrc b/RedPandaIDE/translations.qrc index e8eb9d01..6d8b6359 100644 --- a/RedPandaIDE/translations.qrc +++ b/RedPandaIDE/translations.qrc @@ -1,5 +1,6 @@ RedPandaIDE_zh_CN.qm + qt_zh_CN.qm diff --git a/RedPandaIDE/widgets/darkfusionstyle.cpp b/RedPandaIDE/widgets/darkfusionstyle.cpp index b5cc66c9..ad65c51e 100644 --- a/RedPandaIDE/widgets/darkfusionstyle.cpp +++ b/RedPandaIDE/widgets/darkfusionstyle.cpp @@ -794,6 +794,11 @@ QIcon DarkFusionStyle::standardIcon(StandardPixmap standardIcon, const QStyleOpt return QProxyStyle::standardIcon(standardIcon, option, widget); } +void DarkFusionStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const +{ + QProxyStyle::drawComplexControl(control,option,painter,widget); +} + void DarkFusionStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { diff --git a/RedPandaIDE/widgets/darkfusionstyle.h b/RedPandaIDE/widgets/darkfusionstyle.h index d31c1627..2aa6694d 100644 --- a/RedPandaIDE/widgets/darkfusionstyle.h +++ b/RedPandaIDE/widgets/darkfusionstyle.h @@ -16,6 +16,11 @@ public: const QWidget *widget) const override; QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; + + // QStyle interface +public: + void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, + QPainter *painter, const QWidget *widget) const override; }; #endif // DARKFUSIONSTYLE_H diff --git a/RedPandaIDE/widgets/newprojectdialog.cpp b/RedPandaIDE/widgets/newprojectdialog.cpp index fc212347..076fa4d2 100644 --- a/RedPandaIDE/widgets/newprojectdialog.cpp +++ b/RedPandaIDE/widgets/newprojectdialog.cpp @@ -20,11 +20,12 @@ NewProjectDialog::NewProjectDialog(QWidget *parent) : int i=0; QString projectName; QString location; + location = excludeTrailingPathDelimiter(pSettings->dirs().projectDir()); while (true) { i++; projectName = tr("Project%1").arg(i); - location = includeTrailingPathDelimiter(pSettings->dirs().projectDir()) + projectName; - if (!QDir(location).exists()) + QString tempLocation = includeTrailingPathDelimiter(location)+projectName; + if (!QDir(tempLocation).exists()) break; } ui->txtProjectName->setText(projectName); @@ -65,6 +66,11 @@ QString NewProjectDialog::getProjectName() return ui->txtProjectName->text(); } +bool NewProjectDialog::useAsDefaultProjectDir() +{ + return ui->chkAsDefaultLocation->isChecked(); +} + bool NewProjectDialog::isCProject() { return ui->rdCProject->isChecked(); @@ -159,12 +165,7 @@ void NewProjectDialog::updateView() void NewProjectDialog::updateProjectLocation() { - ui->txtLocation->setText( - includeTrailingPathDelimiter( - extractFilePath( - ui->txtLocation->text())) - + ui->txtProjectName->text() - ); + QString newLocation = ui->txtLocation->text(); QListWidgetItem * current = ui->lstTemplates->currentItem(); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled( @@ -210,7 +211,7 @@ void NewProjectDialog::on_btnBrowse_clicked() } QString dir = QFileDialog::getExistingDirectory( this, - "Project directory", + "Choose directory", dirPath ); if (!dir.isEmpty()) { diff --git a/RedPandaIDE/widgets/newprojectdialog.h b/RedPandaIDE/widgets/newprojectdialog.h index 1c8b20b0..95690fd0 100644 --- a/RedPandaIDE/widgets/newprojectdialog.h +++ b/RedPandaIDE/widgets/newprojectdialog.h @@ -20,6 +20,7 @@ public: PProjectTemplate getTemplate(); QString getLocation(); QString getProjectName(); + bool useAsDefaultProjectDir(); bool isCProject(); bool isCppProject(); bool makeProjectDefault(); diff --git a/RedPandaIDE/widgets/newprojectdialog.ui b/RedPandaIDE/widgets/newprojectdialog.ui index 533bad7e..414d8186 100644 --- a/RedPandaIDE/widgets/newprojectdialog.ui +++ b/RedPandaIDE/widgets/newprojectdialog.ui @@ -7,7 +7,7 @@ 0 0 670 - 528 + 546 @@ -85,6 +85,12 @@ + + + + + + @@ -92,16 +98,6 @@ - - - - Location: - - - - - - @@ -114,8 +110,19 @@ - - + + + + Create in + + + + + + + Use as the default project location + + From bc2d662c1dbfc8bdecc02ca8ff084e672f498305 Mon Sep 17 00:00:00 2001 From: royqh1979 Date: Thu, 18 Nov 2021 22:25:07 +0800 Subject: [PATCH 22/25] - fix: console program that needs input may crash --- NEWS.md | 3 +++ tools/ConsolePauser/main.cpp | 2 ++ 2 files changed, 5 insertions(+) diff --git a/NEWS.md b/NEWS.md index 1b7010cc..8628c40b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +Version 0.9.2 For Dev-C++ 7 Beta + - fix: console program that needs input may crash + Version 0.9.1 For Dev-C++ 7 Beta - enhancement: code completion suggestion for "__func__" variable - fix: ide failed to start, if there are errors in the compiler set settings diff --git a/tools/ConsolePauser/main.cpp b/tools/ConsolePauser/main.cpp index 96b7deac..a09d01bb 100644 --- a/tools/ConsolePauser/main.cpp +++ b/tools/ConsolePauser/main.cpp @@ -184,6 +184,8 @@ int main(int argc, char** argv) { SetStdHandle(STD_ERROR_HANDLE, hOutput); freopen("CONOUT$","w+",stdout); freopen("CONOUT$","w+",stderr); + } else { + FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); } // Save starting timestamp From f274d7f208b520e69211c4ae2236617aa428939a Mon Sep 17 00:00:00 2001 From: royqh1979 Date: Fri, 19 Nov 2021 07:52:36 +0800 Subject: [PATCH 23/25] - fix: problem set & problem views not correctly hidden when disabled in the general / problem set options --- NEWS.md | 2 ++ RedPandaIDE/RedPandaIDE_zh_CN.qm | Bin 105685 -> 105699 bytes RedPandaIDE/RedPandaIDE_zh_CN.ts | 4 ++-- RedPandaIDE/mainwindow.cpp | 8 +++++--- RedPandaIDE/qsynedit/SynEdit.cpp | 3 ++- RedPandaIDE/widgets/cpudialog.cpp | 2 +- 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/NEWS.md b/NEWS.md index 8628c40b..60887512 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ Version 0.9.2 For Dev-C++ 7 Beta - fix: console program that needs input may crash + - 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 general / problem set options Version 0.9.1 For Dev-C++ 7 Beta - enhancement: code completion suggestion for "__func__" variable diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.qm b/RedPandaIDE/RedPandaIDE_zh_CN.qm index 5b733830380f63b4033381f00ca0881917a6107c..743bdf76743bd13efbc9e6004791f6c7e805b093 100644 GIT binary patch delta 9150 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 YdQK2SdXIEmIxxQ7@{{eBvpu!{57t%-`Tzg` delta 9136 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 Check when count of lines changed - 在文件函数变化时检查 + 在文件行数或者光标所在行变化时检查 @@ -7101,7 +7101,7 @@ Are you really want to continue? Highlight - 高亮显示 + 高亮显示 diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 1afc24fa..34410dd6 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -534,7 +534,7 @@ void MainWindow::applySettings() if (!mTcpServer.listen(QHostAddress::LocalHost,pSettings->executor().competivieCompanionPort())) { // QMessageBox::critical(nullptr, // tr("Listen failed"), -// tr("Can't listen to port %1 form Competitve Companion.").arg(10045) +// tr("Can't listen to port %1 form Competitive Companion.").arg(10045) // + "
" // +tr("You can turn off competitive companion support in the Problem Set options.") // + "
" @@ -574,7 +574,8 @@ void MainWindow::applyUISettings() ui->actionFiles->setChecked(settings.showFiles()); showHideInfosTab(ui->tabFiles,settings.showFiles()); ui->actionProblem_Set->setChecked(settings.showProblemSet()); - showHideInfosTab(ui->tabProblemSet,settings.showProblemSet()); + showHideInfosTab(ui->tabProblemSet,settings.showProblemSet() + && pSettings->executor().enableProblemSet()); ui->actionIssues->setChecked(settings.showIssues()); showHideMessagesTab(ui->tabIssues,settings.showIssues()); @@ -589,7 +590,8 @@ void MainWindow::applyUISettings() ui->actionBookmark->setChecked(settings.showBookmark()); showHideMessagesTab(ui->tabBookmark,settings.showBookmark()); ui->actionProblem->setChecked(settings.showProblem()); - showHideMessagesTab(ui->tabProblem,settings.showProblem()); + showHideMessagesTab(ui->tabProblem,settings.showProblem() + && pSettings->executor().enableProblemSet()); //we can't show/hide left/bottom panels here, cause mainwindow layout is not calculated } diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index 155ae4f3..fafc06e4 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -119,7 +119,8 @@ SynEdit::SynEdit(QWidget *parent) : QAbstractScrollArea(parent) mBlockEnd = mBlockBegin; mOptions = eoAutoIndent | eoDragDropEditing | eoEnhanceEndKey | eoTabIndent | - eoGroupUndo | eoKeepCaretX | eoSelectWordByDblClick; + eoGroupUndo | eoKeepCaretX | eoSelectWordByDblClick + | eoHideShowScrollbars ; mScrollTimer = new QTimer(this); mScrollTimer->setInterval(100); diff --git a/RedPandaIDE/widgets/cpudialog.cpp b/RedPandaIDE/widgets/cpudialog.cpp index ccf1281c..75d8ff4d 100644 --- a/RedPandaIDE/widgets/cpudialog.cpp +++ b/RedPandaIDE/widgets/cpudialog.cpp @@ -19,7 +19,7 @@ CPUDialog::CPUDialog(QWidget *parent) : ui->txtCode->codeFolding().indentGuides = false; ui->txtCode->codeFolding().fillIndents = false; - ui->txtCode->setRightEdge(0); + ui->txtCode->setGutterWidth(0); ui->txtCode->setUseCodeFolding(false); highlighterManager.applyColorScheme(ui->txtCode->highlighter(), pSettings->editor().colorScheme()); From c7a64129864123ca06817ca8d00d64bbbbbb7248 Mon Sep 17 00:00:00 2001 From: royqh1979 Date: Fri, 19 Nov 2021 08:11:33 +0800 Subject: [PATCH 24/25] - fix: executor / problem set options not correctly saved --- NEWS.md | 3 ++- RedPandaIDE/settings.cpp | 3 +++ RedPandaIDE/version.h | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 60887512..94a1c476 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,7 +1,8 @@ Version 0.9.2 For Dev-C++ 7 Beta - fix: console program that needs input may crash - 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 general / problem set options + - fix: problem set & problem views not correctly hidden when disabled in the executor / problem set options + - fix: executor / problem set options not correctly saved Version 0.9.1 For Dev-C++ 7 Beta - enhancement: code completion suggestion for "__func__" variable diff --git a/RedPandaIDE/settings.cpp b/RedPandaIDE/settings.cpp index ff5522d7..29adba9e 100644 --- a/RedPandaIDE/settings.cpp +++ b/RedPandaIDE/settings.cpp @@ -2888,6 +2888,9 @@ void Settings::Executor::doSave() saveValue("redirect_input",mRedirectInput); saveValue("input_filename",mInputFilename); //problem set + saveValue("enable_proble_set", mEnableProblemSet); + saveValue("enable_competivie_companion", mEnableCompetitiveCompanion); + saveValue("competitive_companion_port", mCompetivieCompanionPort); } diff --git a/RedPandaIDE/version.h b/RedPandaIDE/version.h index fe8b2949..30938498 100644 --- a/RedPandaIDE/version.h +++ b/RedPandaIDE/version.h @@ -2,6 +2,6 @@ #define VERSION_H #include -#define DEVCPP_VERSION "beta.0.9.1" +#define DEVCPP_VERSION "beta.0.9.2" #endif // VERSION_H From 49a2a599646bdc059308f21f43a52d0a4e2812a4 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Fri, 19 Nov 2021 22:33:10 +0800 Subject: [PATCH 25/25] update NEWS.md --- NEWS.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 94a1c476..5462ca58 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,8 +1,7 @@ Version 0.9.2 For Dev-C++ 7 Beta - - fix: console program that needs input may crash - 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 - - fix: executor / problem set options not correctly saved + - fix: executor / problem set options not correctly saved Version 0.9.1 For Dev-C++ 7 Beta - enhancement: code completion suggestion for "__func__" variable