diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 2e3041a7..9e36ebf5 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -137,8 +137,6 @@ Editor::Editor(QWidget *parent, const QString& filename, setContextMenuPolicy(Qt::CustomContextMenu); connect(this, &QWidget::customContextMenuRequested, pMainWindow, &MainWindow::onEditorContextMenu); - - mOldHintCursor = Qt::IBeamCursor; } Editor::~Editor() { @@ -776,10 +774,9 @@ bool Editor::event(QEvent *event) s = s.trimmed(); if ((s == mCurrentWord) && (mCurrentTipType == reason)) { if (helpEvent->modifiers() == Qt::ControlModifier) { - mOldHintCursor = cursor(); setCursor(Qt::PointingHandCursor); - } else if (cursor() == Qt::PointingHandCursor) { - setCursor(mOldHintCursor); + } else { + updateMouseCursor(); } event->ignore(); return true; // do NOT remove hint when subject stays the same @@ -826,17 +823,14 @@ bool Editor::event(QEvent *event) // QApplication* app = dynamic_cast(QApplication::instance()); // if (app->keyboardModifiers().testFlag(Qt::ControlModifier)) { if (helpEvent->modifiers() == Qt::ControlModifier) { - mOldHintCursor = cursor(); setCursor(Qt::PointingHandCursor); } else if (cursor() == Qt::PointingHandCursor) { - setCursor(mOldHintCursor); + updateMouseCursor(); } QToolTip::showText(mapToGlobal(helpEvent->pos()),hint); event->ignore(); } else { - if (cursor() == Qt::PointingHandCursor) { - setCursor(mOldHintCursor); - } + updateMouseCursor(); event->ignore(); } return true; @@ -2058,7 +2052,7 @@ bool Editor::onCompletionKeyPressed(QKeyEvent *event) bool Editor::onHeaderCompletionKeyPressed(QKeyEvent *event) { bool processed = false; - if (!mCompletionPopup->isEnabled()) + if (!mHeaderCompletionPopup->isEnabled()) return false; QString phrase; BufferCoord pBeginPos,pEndPos; @@ -2081,6 +2075,8 @@ bool Editor::onHeaderCompletionKeyPressed(QKeyEvent *event) headerCompletionInsert(); mHeaderCompletionPopup->hide(); return true; + case Qt::Key_Shift: + return false; default: if (event->text().isEmpty()) { //stop completion @@ -2090,7 +2086,9 @@ bool Editor::onHeaderCompletionKeyPressed(QKeyEvent *event) } } QChar ch = event->text().front(); - if (isIdentChar(ch)) { + + if (isIdentChar(ch) || ch == '.' + || ch =='_' || ch=='+') { setSelText(ch); phrase = getWordAtPosition(this,caretXY(), pBeginPos,pEndPos, @@ -2145,8 +2143,7 @@ void Editor::cancelHint() QToolTip::hideText(); mCurrentWord = ""; mCurrentTipType = TipType::None; - if (cursor() == Qt::PointingHandCursor) - setCursor(mOldHintCursor); + updateMouseCursor(); } QString Editor::getFileHint(const QString &s) @@ -2569,11 +2566,13 @@ QString getWordAtPosition(SynEdit *editor, const BufferCoord &p, BufferCoord &pW // Copy backward until begin of path if (purpose == Editor::WordPurpose::wpHeaderCompletion) { while ((wordBegin >= 0) && (wordBegin < len)) { - if (editor->isIdentChar(s[wordBegin])) + if (editor->isIdentChar(s[wordBegin])) { wordBegin--; - else if (s[wordBegin] == '/' - || s[wordBegin] == '\\' - || s[wordBegin] == '.') { + } else if (s[wordBegin] == '.' + || s[wordBegin] == '+') { + wordBegin--; + } else if (s[wordBegin] == '/' + || s[wordBegin] == '\\') { wordBegin--; break; } else diff --git a/RedPandaIDE/editor.h b/RedPandaIDE/editor.h index bd6ae439..b62bc445 100644 --- a/RedPandaIDE/editor.h +++ b/RedPandaIDE/editor.h @@ -229,7 +229,6 @@ private: TipType mCurrentTipType; QString mOldSelectionWord; QString mSelectionWord; - QCursor mOldHintCursor; bool mSaving; diff --git a/RedPandaIDE/parser/parserutils.h b/RedPandaIDE/parser/parserutils.h index 3d28824e..c4c63a3b 100644 --- a/RedPandaIDE/parser/parserutils.h +++ b/RedPandaIDE/parser/parserutils.h @@ -111,7 +111,7 @@ struct Statement { QString type; // type "int" QString command; // identifier/name of statement "foo" QString args; // args "(int a,float b)" - QStringList argList; + QStringList argList; //not used yet QString value; // Used for macro defines/typedef, "100" in "#defin COUNT 100" StatementKind kind; // kind of statement class/variable/function/etc QList> inheritanceList; // list of statements this one inherits from, can be nil @@ -134,6 +134,7 @@ struct Statement { QSet usingList; // using namespaces int usageCount; //Usage Count, used by TCodeCompletion int freqTop; // Usage Count Rank, used by TCodeCompletion + bool caseMatch; // if match with case, used by TCodeCompletion QString noNameArgs;// Args without name }; diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index 542e8bc6..0ee58433 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -5285,6 +5285,17 @@ void SynEdit::setRainbowAttrs(const PSynHighlighterAttribute &attr0, const PSynH mRainbowAttr3 = attr3; } +void SynEdit::updateMouseCursor(){ + QPoint p = mapFromGlobal(cursor().pos()); + if (p.y() >= clientHeight() || p.x()>= clientWidth()) { + setCursor(Qt::ArrowCursor); + } else if (p.x() > mGutterWidth) { + setCursor(Qt::IBeamCursor); + } else { + setCursor(Qt::ArrowCursor); + } +} + void SynEdit::paintEvent(QPaintEvent *event) { if (mPainterLock>0) @@ -5388,10 +5399,7 @@ bool SynEdit::event(QEvent *event) synFontChanged(); break; case QEvent::MouseMove: { - QPoint p = mapFromGlobal(cursor().pos()); - if (p.y() >= clientHeight() || p.x()>= clientWidth()) { - setCursor(Qt::ArrowCursor); - } + updateMouseCursor(); break; } } @@ -5545,11 +5553,7 @@ void SynEdit::mouseMoveEvent(QMouseEvent *event) internalSetCaretXY(displayToBufferPos(P)); setBlockEnd(caretXY()); } else if (buttons == Qt::NoButton) { - if (X > mGutterWidth) { - setCursor(Qt::IBeamCursor); - } else { - setCursor(Qt::ArrowCursor); - } + updateMouseCursor(); } } diff --git a/RedPandaIDE/qsynedit/SynEdit.h b/RedPandaIDE/qsynedit/SynEdit.h index 93e4f7f1..ed6b5592 100644 --- a/RedPandaIDE/qsynedit/SynEdit.h +++ b/RedPandaIDE/qsynedit/SynEdit.h @@ -266,6 +266,8 @@ public: const PSynHighlighterAttribute &attr1, const PSynHighlighterAttribute &attr2, const PSynHighlighterAttribute &attr3); + + void updateMouseCursor(); // setter && getters int topLine() const; void setTopLine(int value); diff --git a/RedPandaIDE/widgets/classbrowser.cpp b/RedPandaIDE/widgets/classbrowser.cpp index 01157903..2b5e3f58 100644 --- a/RedPandaIDE/widgets/classbrowser.cpp +++ b/RedPandaIDE/widgets/classbrowser.cpp @@ -373,13 +373,24 @@ void ClassBrowserModel::filterChildren(ClassBrowserNode *node, const StatementMa addChild(node,statement); } } - if (pSettings->ui().classBrowserSortAlpha()) { + if (pSettings->ui().classBrowserSortAlpha() + && pSettings->ui().classBrowserSortType()) { + std::sort(node->children.begin(),node->children.end(), + [](ClassBrowserNode* node1,ClassBrowserNode* node2) { + if (node1->statement->kind < node2->statement->kind) { + return true; + } else if (node1->statement->kind == node2->statement->kind) { + return node1->statement->command < node2->statement->command; + } else { + return false; + } + }); + } else if (pSettings->ui().classBrowserSortAlpha()) { std::sort(node->children.begin(),node->children.end(), [](ClassBrowserNode* node1,ClassBrowserNode* node2) { return node1->statement->command < node2->statement->command; }); - } - if (pSettings->ui().classBrowserSortType()) { + } else if (pSettings->ui().classBrowserSortType()) { std::sort(node->children.begin(),node->children.end(), [](ClassBrowserNode* node1,ClassBrowserNode* node2) { return node1->statement->kind < node2->statement->kind; diff --git a/RedPandaIDE/widgets/codecompletionpopup.cpp b/RedPandaIDE/widgets/codecompletionpopup.cpp index b487384a..aa2ab438 100644 --- a/RedPandaIDE/widgets/codecompletionpopup.cpp +++ b/RedPandaIDE/widgets/codecompletionpopup.cpp @@ -186,6 +186,15 @@ void CodeCompletionPopup::addStatement(PStatement statement, const QString &file mFullCompletionStatementList.append(statement); } +static bool nameComparator(PStatement statement1,PStatement statement2) { + if (statement1->caseMatch && !statement2->caseMatch) { + return true; + } else if (!statement1->caseMatch && statement2->caseMatch) { + return false; + } else + return statement1->command < statement2->command; +} + static bool defaultComparator(PStatement statement1,PStatement statement2) { // Show user template first if (statement1->kind == StatementKind::skUserCodeIn) { @@ -203,7 +212,7 @@ static bool defaultComparator(PStatement statement1,PStatement statement2) { && (statement2->kind == StatementKind::skKeyword)) { return false; } else - return statement1->command < statement2->command; + return nameComparator(statement1,statement2); } static bool sortByScopeComparator(PStatement statement1,PStatement statement2){ @@ -235,9 +244,8 @@ static bool sortByScopeComparator(PStatement statement1,PStatement statement2){ } else if (statement1->scope == StatementScope::ssGlobal && statement2->scope != StatementScope::ssGlobal ) { return false; - // otherwise, sort by name } else - return statement1->command < statement2->command; + return nameComparator(statement1,statement2); } static bool sortWithUsageComparator(PStatement statement1,PStatement statement2) { @@ -262,7 +270,7 @@ static bool sortWithUsageComparator(PStatement statement1,PStatement statement2) && (statement2->kind != StatementKind::skKeyword)) { return false; } else - return statement1->command < statement2->command; + return nameComparator(statement1,statement2); } static bool sortByScopeWithUsageComparator(PStatement statement1,PStatement statement2){ @@ -299,9 +307,8 @@ static bool sortByScopeWithUsageComparator(PStatement statement1,PStatement stat } else if (statement1->scope == StatementScope::ssGlobal && statement2->scope != StatementScope::ssGlobal ) { return false; - // otherwise, sort by name } else - return statement1->command < statement2->command; + return nameComparator(statement1,statement2); } void CodeCompletionPopup::filterList(const QString &member) @@ -331,8 +338,16 @@ void CodeCompletionPopup::filterList(const QString &member) Qt::CaseSensitivity cs = (mIgnoreCase? Qt::CaseInsensitive: Qt::CaseSensitive); - if (statement->command.startsWith(member, cs)) + if (statement->command.startsWith(member, cs)) { + if (mIgnoreCase) { + statement->caseMatch = + statement->command.startsWith( + member,Qt::CaseSensitive); + } else { + statement->caseMatch = true; + } mCompletionStatementList.append(statement); + } } } else mCompletionStatementList.append(mFullCompletionStatementList);