diff options
Diffstat (limited to 'src/plugins')
36 files changed, 248 insertions, 885 deletions
diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index fc026a6c25..c362ff1ee0 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -1414,6 +1414,39 @@ void CppEditorPlugin::test_quickfix_data() << CppQuickFixFactoryPtr(new InsertQtPropertyMembers) << _("class C { @Q_PROPERTY(typeid foo READ foo) };\n") << _(); + + QTest::newRow("convert to camel case: normal") + << CppQuickFixFactoryPtr(new ConvertToCamelCase(true)) + << _("void @lower_case_function();\n") + << _("void lowerCaseFunction();\n"); + QTest::newRow("convert to camel case: already camel case") + << CppQuickFixFactoryPtr(new ConvertToCamelCase(true)) + << _("void @camelCaseFunction();\n") + << _(); + QTest::newRow("convert to camel case: no underscores (lower case)") + << CppQuickFixFactoryPtr(new ConvertToCamelCase(true)) + << _("void @lowercasefunction();\n") + << _(); + QTest::newRow("convert to camel case: no underscores (upper case)") + << CppQuickFixFactoryPtr(new ConvertToCamelCase(true)) + << _("void @UPPERCASEFUNCTION();\n") + << _(); + QTest::newRow("convert to camel case: non-applicable underscore") + << CppQuickFixFactoryPtr(new ConvertToCamelCase(true)) + << _("void @m_a_member;\n") + << _("void m_aMember;\n"); + QTest::newRow("convert to camel case: upper case") + << CppQuickFixFactoryPtr(new ConvertToCamelCase(true)) + << _("void @UPPER_CASE_FUNCTION();\n") + << _("void upperCaseFunction();\n"); + QTest::newRow("convert to camel case: partially camel case already") + << CppQuickFixFactoryPtr(new ConvertToCamelCase(true)) + << _("void mixed@_andCamelCase();\n") + << _("void mixedAndCamelCase();\n"); + QTest::newRow("convert to camel case: wild mix") + << CppQuickFixFactoryPtr(new ConvertToCamelCase(true)) + << _("void @WhAt_TODO_hErE();\n") + << _("void WhAtTODOHErE();\n"); } void CppEditorPlugin::test_quickfix() diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index 47a0575994..10e99470ac 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -2010,9 +2010,13 @@ namespace { class ConvertToCamelCaseOp: public CppQuickFixOperation { public: - ConvertToCamelCaseOp(const CppQuickFixInterface &interface, const QString &newName) + ConvertToCamelCaseOp(const CppQuickFixInterface &interface, const QString &name, + const AST *nameAst, bool test) : CppQuickFixOperation(interface, -1) - , m_name(newName) + , m_name(name) + , m_nameAst(nameAst) + , m_isAllUpper(name.isUpper()) + , m_test(test) { setDescription(QApplication::translate("CppTools::QuickFix", "Convert to Camel Case")); } @@ -2022,17 +2026,24 @@ public: CppRefactoringChanges refactoring(snapshot()); CppRefactoringFilePtr currentFile = refactoring.file(filePath().toString()); - for (int i = 1; i < m_name.length(); ++i) { - const QChar c = m_name.at(i); - if (c.isUpper()) { - m_name[i] = c.toLower(); - } else if (i < m_name.length() - 1 - && isConvertibleUnderscore(m_name, i)) { - m_name.remove(i, 1); - m_name[i] = m_name.at(i).toUpper(); + QString newName = m_isAllUpper ? m_name.toLower() : m_name; + for (int i = 1; i < newName.length(); ++i) { + const QChar c = newName.at(i); + if (c.isUpper() && m_isAllUpper) { + newName[i] = c.toLower(); + } else if (i < newName.length() - 1 && isConvertibleUnderscore(newName, i)) { + newName.remove(i, 1); + newName[i] = newName.at(i).toUpper(); } } - editor()->renameUsages(m_name); + if (m_test) { + ChangeSet changeSet; + changeSet.replace(currentFile->range(m_nameAst), newName); + currentFile->setChangeSet(changeSet); + currentFile->apply(); + } else { + editor()->renameUsages(newName); + } } static bool isConvertibleUnderscore(const QString &name, int pos) @@ -2042,7 +2053,10 @@ public: } private: - QString m_name; + const QString m_name; + const AST * const m_nameAst; + const bool m_isAllUpper; + const bool m_test; }; } // anonymous namespace @@ -2056,22 +2070,26 @@ void ConvertToCamelCase::match(const CppQuickFixInterface &interface, QuickFixOp AST * const ast = path.last(); const Name *name = nullptr; + const AST *astForName = nullptr; if (const NameAST * const nameAst = ast->asName()) { - if (nameAst->name && nameAst->name->asNameId()) + if (nameAst->name && nameAst->name->asNameId()) { + astForName = nameAst; name = nameAst->name; + } } else if (const NamespaceAST * const namespaceAst = ast->asNamespace()) { + astForName = namespaceAst; name = namespaceAst->symbol->name(); } if (!name) return; - QString newName = QString::fromUtf8(name->identifier()->chars()); - if (newName.length() < 3) + QString nameString = QString::fromUtf8(name->identifier()->chars()); + if (nameString.length() < 3) return; - for (int i = 1; i < newName.length() - 1; ++i) { - if (ConvertToCamelCaseOp::isConvertibleUnderscore(newName, i)) { - result << new ConvertToCamelCaseOp(interface, newName); + for (int i = 1; i < nameString.length() - 1; ++i) { + if (ConvertToCamelCaseOp::isConvertibleUnderscore(nameString, i)) { + result << new ConvertToCamelCaseOp(interface, nameString, astForName, m_test); return; } } diff --git a/src/plugins/cppeditor/cppquickfixes.h b/src/plugins/cppeditor/cppquickfixes.h index 91bd8c9a62..4a9d1ab357 100644 --- a/src/plugins/cppeditor/cppquickfixes.h +++ b/src/plugins/cppeditor/cppquickfixes.h @@ -221,7 +221,12 @@ public: class ConvertToCamelCase : public CppQuickFixFactory { public: + ConvertToCamelCase(bool test = false) : CppQuickFixFactory(), m_test(test) {} + void match(const CppQuickFixInterface &interface, QuickFixOperations &result) override; + +private: + const bool m_test; }; /*! diff --git a/src/plugins/cpptools/cpprefactoringchanges.cpp b/src/plugins/cpptools/cpprefactoringchanges.cpp index 509506d5a1..a86dd6451b 100644 --- a/src/plugins/cpptools/cpprefactoringchanges.cpp +++ b/src/plugins/cpptools/cpprefactoringchanges.cpp @@ -213,7 +213,7 @@ Utils::ChangeSet::Range CppRefactoringFile::range(unsigned tokenIndex) const return {start, start + token.utf16chars()}; } -Utils::ChangeSet::Range CppRefactoringFile::range(AST *ast) const +Utils::ChangeSet::Range CppRefactoringFile::range(const AST *ast) const { return {startOf(ast), endOf(ast)}; } diff --git a/src/plugins/cpptools/cpprefactoringchanges.h b/src/plugins/cpptools/cpprefactoringchanges.h index 3a547a90c5..58fbf39eee 100644 --- a/src/plugins/cpptools/cpprefactoringchanges.h +++ b/src/plugins/cpptools/cpprefactoringchanges.h @@ -52,7 +52,7 @@ public: Range range(int start, int end) const; Range range(unsigned tokenIndex) const; - Range range(CPlusPlus::AST *ast) const; + Range range(const CPlusPlus::AST *ast) const; const CPlusPlus::Token &tokenAt(unsigned index) const; diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index aa0976c524..e349919372 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -324,7 +324,7 @@ private: { QTextCursor tc = m_editor->textCursor(); m_currentPos = tc.position(); - m_lineSpacing = m_editor->document()->documentLayout()->blockBoundingRect(tc.block()).height(); + m_lineSpacing = m_editor->cursorRect(tc).height(); setFont(m_editor->extraArea()->font()); // Follow geometry of normal line numbers if visible, diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index c238ba454a..9f237ea807 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -938,10 +938,10 @@ void Client::handleMessage(const BaseMessage &message) if (auto handler = m_contentHandler[message.mimeType]) { QString parseError; handler(message.content, message.codec, parseError, - [this](MessageId id, const QByteArray &content, QTextCodec *codec){ + [this](const MessageId &id, const QByteArray &content, QTextCodec *codec){ this->handleResponse(id, content, codec); }, - [this](const QString &method, MessageId id, const IContent *content){ + [this](const QString &method, const MessageId &id, const IContent *content){ this->handleMethod(method, id, content); }); if (!parseError.isEmpty()) @@ -1072,7 +1072,7 @@ void Client::handleResponse(const MessageId &id, const QByteArray &content, QTex handler(content, codec); } -void Client::handleMethod(const QString &method, MessageId id, const IContent *content) +void Client::handleMethod(const QString &method, const MessageId &id, const IContent *content) { ErrorHierarchy error; auto logError = [&](const JsonObject &content) { diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index d264898474..9d8d8487ce 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -189,7 +189,7 @@ protected: private: void handleResponse(const LanguageServerProtocol::MessageId &id, const QByteArray &content, QTextCodec *codec); - void handleMethod(const QString &method, LanguageServerProtocol::MessageId id, + void handleMethod(const QString &method, const LanguageServerProtocol::MessageId &id, const LanguageServerProtocol::IContent *content); void handleDiagnostics(const LanguageServerProtocol::PublishDiagnosticsParams ¶ms); diff --git a/src/plugins/projectexplorer/sessionmodel.cpp b/src/plugins/projectexplorer/sessionmodel.cpp index b0d847e7df..4cfa95eea5 100644 --- a/src/plugins/projectexplorer/sessionmodel.cpp +++ b/src/plugins/projectexplorer/sessionmodel.cpp @@ -183,10 +183,18 @@ void SessionModel::sort(int column, Qt::SortOrder order) beginResetModel(); const auto cmp = [column, order](const QString &s1, const QString &s2) { bool isLess; - if (column == 0) + if (column == 0) { + if (s1 == s2) + return false; isLess = s1 < s2; - else - isLess = SessionManager::sessionDateTime(s1) < SessionManager::sessionDateTime(s2); + } + else { + const auto s1time = SessionManager::sessionDateTime(s1); + const auto s2time = SessionManager::sessionDateTime(s2); + if (s1time == s2time) + return false; + isLess = s1time < s2time; + } if (order == Qt::DescendingOrder) isLess = !isLess; return isLess; diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index ca98f2c424..21b1c9cf64 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -29,7 +29,6 @@ add_qtc_plugin(QmlDesigner qmldesignerplugin.cpp qmldesignerplugin.h settingspage.cpp settingspage.h settingspage.ui shortcutmanager.cpp shortcutmanager.h - switchsplittabwidget.cpp switchsplittabwidget.h designermcumanager.cpp designermcumanager.h EXPLICIT_MOC components/propertyeditor/propertyeditorvalue.h @@ -627,7 +626,6 @@ extend_qtc_plugin(QmlDesigner annotationeditordialog.cpp annotationeditordialog.h annotationeditordialog.ui globalannotationeditordialog.cpp globalannotationeditordialog.h globalannotationeditordialog.ui annotationeditor.cpp annotationeditor.h - annotationtool.cpp annotationtool.h globalannotationeditor.cpp globalannotationeditor.h ) diff --git a/src/plugins/qmldesigner/components/annotationeditor/annotationeditor.pri b/src/plugins/qmldesigner/components/annotationeditor/annotationeditor.pri index e597e6862c..b1773c2dcf 100644 --- a/src/plugins/qmldesigner/components/annotationeditor/annotationeditor.pri +++ b/src/plugins/qmldesigner/components/annotationeditor/annotationeditor.pri @@ -1,11 +1,9 @@ -HEADERS += $$PWD/annotationtool.h HEADERS += $$PWD/annotationcommenttab.h HEADERS += $$PWD/annotationeditordialog.h HEADERS += $$PWD/annotationeditor.h HEADERS += $$PWD/globalannotationeditor.h HEADERS += $$PWD/globalannotationeditordialog.h -SOURCES += $$PWD/annotationtool.cpp SOURCES += $$PWD/annotationcommenttab.cpp SOURCES += $$PWD/annotationeditordialog.cpp SOURCES += $$PWD/annotationeditor.cpp diff --git a/src/plugins/qmldesigner/components/annotationeditor/annotationtool.cpp b/src/plugins/qmldesigner/components/annotationeditor/annotationtool.cpp deleted file mode 100644 index 9db5d0d81c..0000000000 --- a/src/plugins/qmldesigner/components/annotationeditor/annotationtool.cpp +++ /dev/null @@ -1,259 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "annotationtool.h" - -#include "formeditorscene.h" -#include "formeditorview.h" -#include "formeditorwidget.h" -#include "itemutilfunctions.h" -#include "formeditoritem.h" - -#include "nodemetainfo.h" -#include "qmlitemnode.h" -#include <qmldesignerplugin.h> -#include <abstractaction.h> -#include <designeractionmanager.h> - -#include <QApplication> -#include <QGraphicsSceneMouseEvent> -#include <QAction> -#include <QDebug> -#include <QPair> -#include <QUrl> -#include <QMetaType> - -namespace QmlDesigner { - -class AnnotationToolAction : public AbstractAction -{ -public: - AnnotationToolAction() : AbstractAction(QCoreApplication::translate("AnnotationToolAction","Edit Annotation")) - { - } - - QByteArray category() const override - { - return QByteArray(); - } - - QByteArray menuId() const override - { - return "AnnotationTool"; - } - - int priority() const override - { - return CustomActionsPriority + 5; - } - - Type type() const override - { - return FormEditorAction; - } - -protected: - bool isVisible(const SelectionContext &selectionContext) const override - { - return selectionContext.singleNodeIsSelected(); - } - - bool isEnabled(const SelectionContext &selectionContext) const override - { - return isVisible(selectionContext); - } -}; - -AnnotationTool::AnnotationTool() -{ - auto annotationToolAction = new AnnotationToolAction; - QmlDesignerPlugin::instance()->designerActionManager().addDesignerAction(annotationToolAction); - connect(annotationToolAction->action(), &QAction::triggered, [=]() { - view()->changeCurrentToolTo(this); - }); -} - -AnnotationTool::~AnnotationTool() = default; - -void AnnotationTool::clear() -{ - if (m_annotationEditor) - m_annotationEditor->deleteLater(); - - AbstractFormEditorTool::clear(); -} - -void AnnotationTool::mousePressEvent(const QList<QGraphicsItem*> &itemList, - QGraphicsSceneMouseEvent *event) -{ - AbstractFormEditorTool::mousePressEvent(itemList, event); -} - -void AnnotationTool::mouseMoveEvent(const QList<QGraphicsItem*> & /*itemList*/, - QGraphicsSceneMouseEvent * /*event*/) -{ -} - -void AnnotationTool::hoverMoveEvent(const QList<QGraphicsItem*> & /*itemList*/, - QGraphicsSceneMouseEvent * /*event*/) -{ -} - -void AnnotationTool::keyPressEvent(QKeyEvent * /*keyEvent*/) -{ -} - -void AnnotationTool::keyReleaseEvent(QKeyEvent * /*keyEvent*/) -{ -} - -void AnnotationTool::dragLeaveEvent(const QList<QGraphicsItem*> &/*itemList*/, QGraphicsSceneDragDropEvent * /*event*/) -{ -} - -void AnnotationTool::dragMoveEvent(const QList<QGraphicsItem*> &/*itemList*/, QGraphicsSceneDragDropEvent * /*event*/) -{ -} - -void AnnotationTool::mouseReleaseEvent(const QList<QGraphicsItem*> &itemList, - QGraphicsSceneMouseEvent *event) -{ - AbstractFormEditorTool::mouseReleaseEvent(itemList, event); -} - - -void AnnotationTool::mouseDoubleClickEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *event) -{ - AbstractFormEditorTool::mouseDoubleClickEvent(itemList, event); -} - -void AnnotationTool::itemsAboutToRemoved(const QList<FormEditorItem*> &removedItemList) -{ - if (m_annotationEditor.isNull()) - return; - - if (removedItemList.contains(m_formEditorItem)) - view()->changeToSelectionTool(); -} - -void AnnotationTool::selectedItemsChanged(const QList<FormEditorItem*> &itemList) -{ - if (!itemList.isEmpty()) { - m_formEditorItem = itemList.constFirst(); - - ModelNode itemModelNode = m_formEditorItem->qmlItemNode().modelNode(); - m_oldCustomId = itemModelNode.customId(); - m_oldAnnotation = itemModelNode.annotation(); - - if (m_annotationEditor.isNull()) { - m_annotationEditor = new AnnotationEditorDialog(view()->formEditorWidget()->parentWidget(), - itemModelNode.displayName(), - m_oldCustomId, m_oldAnnotation); - - connect(m_annotationEditor, &AnnotationEditorDialog::accepted, this, &AnnotationTool::annotationDialogAccepted); - connect(m_annotationEditor, &QDialog::rejected, this, &AnnotationTool::annotationDialogRejected); - - m_annotationEditor->show(); - m_annotationEditor->raise(); - } - } else { - view()->changeToSelectionTool(); - } -} - -void AnnotationTool::instancesCompleted(const QList<FormEditorItem*> & /*itemList*/) -{ -} - -void AnnotationTool::instancesParentChanged(const QList<FormEditorItem *> & /*itemList*/) -{ -} - -void AnnotationTool::instancePropertyChange(const QList<QPair<ModelNode, PropertyName> > & /*propertyList*/) -{ -} - -void AnnotationTool::formEditorItemsChanged(const QList<FormEditorItem*> & /*itemList*/) -{ -} - -int AnnotationTool::wantHandleItem(const ModelNode & /*modelNode*/) const -{ - return 5; -} - -QString AnnotationTool::name() const -{ - return tr("Annotation Tool"); -} - -void AnnotationTool::annotationDialogAccepted() -{ - if (m_annotationEditor) { - saveNewCustomId(m_annotationEditor->customId()); - saveNewAnnotation(m_annotationEditor->annotation()); - - m_annotationEditor->close(); - m_annotationEditor->deleteLater(); - } - - m_annotationEditor = nullptr; - - view()->changeToSelectionTool(); -} - -void AnnotationTool::saveNewCustomId(const QString &customId) -{ - if (m_formEditorItem) { - m_oldCustomId = customId; - m_formEditorItem->qmlItemNode().modelNode().setCustomId(customId); - } -} - -void AnnotationTool::saveNewAnnotation(const Annotation &annotation) -{ - if (m_formEditorItem) { - if (annotation.comments().isEmpty()) - m_formEditorItem->qmlItemNode().modelNode().removeAnnotation(); - else - m_formEditorItem->qmlItemNode().modelNode().setAnnotation(annotation); - - m_oldAnnotation = annotation; - } -} - -void AnnotationTool::annotationDialogRejected() -{ - if (m_annotationEditor) { - m_annotationEditor->close(); - m_annotationEditor->deleteLater(); - } - - m_annotationEditor = nullptr; - - view()->changeToSelectionTool(); -} - -} diff --git a/src/plugins/qmldesigner/components/annotationeditor/annotationtool.h b/src/plugins/qmldesigner/components/annotationeditor/annotationtool.h deleted file mode 100644 index 0073286dd6..0000000000 --- a/src/plugins/qmldesigner/components/annotationeditor/annotationtool.h +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include "annotation.h" -#include "annotationeditordialog.h" -#include "abstractcustomtool.h" -#include "selectionindicator.h" - -#include <QHash> -#include <QPointer> -#include <QDialog> - -namespace QmlDesigner { - -class AnnotationTool : public QObject, public AbstractCustomTool -{ - Q_OBJECT -public: - AnnotationTool(); - ~AnnotationTool() override; - - void mousePressEvent(const QList<QGraphicsItem*> &itemList, - QGraphicsSceneMouseEvent *event) override; - void mouseMoveEvent(const QList<QGraphicsItem*> &itemList, - QGraphicsSceneMouseEvent *event) override; - void mouseReleaseEvent(const QList<QGraphicsItem*> &itemList, - QGraphicsSceneMouseEvent *event) override; - void mouseDoubleClickEvent(const QList<QGraphicsItem*> &itemList, - QGraphicsSceneMouseEvent *event) override; - void hoverMoveEvent(const QList<QGraphicsItem*> &itemList, - QGraphicsSceneMouseEvent *event) override; - void keyPressEvent(QKeyEvent *event) override; - void keyReleaseEvent(QKeyEvent *keyEvent) override; - - void dragLeaveEvent(const QList<QGraphicsItem*> &itemList, - QGraphicsSceneDragDropEvent * event) override; - void dragMoveEvent(const QList<QGraphicsItem*> &itemList, - QGraphicsSceneDragDropEvent * event) override; - - void itemsAboutToRemoved(const QList<FormEditorItem*> &itemList) override; - - void selectedItemsChanged(const QList<FormEditorItem*> &itemList) override; //impl needed - - void instancesCompleted(const QList<FormEditorItem*> &itemList) override; - void instancesParentChanged(const QList<FormEditorItem *> &itemList) override; - void instancePropertyChange(const QList<QPair<ModelNode, PropertyName> > &propertyList) override; - - void clear() override; - - void formEditorItemsChanged(const QList<FormEditorItem*> &itemList) override; - - int wantHandleItem(const ModelNode &modelNode) const override; - - QString name() const override; - -private: - void annotationDialogAccepted(); - void annotationDialogRejected(); - void saveNewCustomId(const QString &customId); - void saveNewAnnotation(const Annotation &annotation); - -private: - FormEditorItem *m_formEditorItem = nullptr; - QString m_oldCustomId; - Annotation m_oldAnnotation; - QPointer<AnnotationEditorDialog> m_annotationEditor; -}; - -} diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp index db58ce4dbb..56b91d0af6 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp @@ -39,10 +39,10 @@ namespace DesignTools { -CurveEditorModel::CurveEditorModel(double minTime, double maxTime, QObject *parent) +CurveEditorModel::CurveEditorModel(QObject *parent) : TreeModel(parent) - , m_minTime(minTime) - , m_maxTime(maxTime) + , m_minTime(CurveEditorStyle::defaultTimeMin) + , m_maxTime(CurveEditorStyle::defaultTimeMax) {} CurveEditorModel::~CurveEditorModel() {} diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h index 952dc46c63..cf7575ca5c 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h @@ -57,7 +57,7 @@ signals: void curveChanged(PropertyTreeItem *item); public: - CurveEditorModel(double minTime, double maxTime, QObject *parent = nullptr); + CurveEditorModel(QObject *parent = nullptr); ~CurveEditorModel() override; diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h b/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h index 6d6acebc51..f6c6c378c5 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h @@ -36,6 +36,8 @@ #include <QIcon> #include <QKeySequence> +#include <cmath> + namespace DesignTools { struct TreeItemStyleOption @@ -105,6 +107,13 @@ struct Shortcuts struct CurveEditorStyle { + static constexpr double defaultTimeMin = 0.0; + static constexpr double defaultTimeMax = 100.0; + static constexpr double defaultValueMin = -1.0; + static constexpr double defaultValueMax = 1.0; + + static double defaultValueRange() { return std::fabs(defaultValueMin - defaultValueMax); } + Shortcuts shortcuts; QBrush backgroundBrush = QBrush(QColor(5, 0, 100)); @@ -124,7 +133,7 @@ struct CurveEditorStyle double valueAxisWidth = 60.0; double valueOffsetTop = 10.0; double valueOffsetBottom = 10.0; - double labelDensityY = 1.5; + double labelDensityY = 2.0; HandleItemStyleOption handleStyle; KeyframeItemStyleOption keyframeStyle; diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp index 9d858d684c..b84d386f8e 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp @@ -42,7 +42,7 @@ namespace QmlDesigner { CurveEditorView::CurveEditorView(QObject *parent) : AbstractView(parent) , m_block(false) - , m_model(new DesignTools::CurveEditorModel(0., 500.)) + , m_model(new DesignTools::CurveEditorModel()) , m_editor(new DesignTools::CurveEditor(m_model)) { Q_UNUSED(parent); @@ -267,7 +267,7 @@ ModelNode getTargetNode1(DesignTools::PropertyTreeItem *item, const QmlTimeline QString targetId = nodeItem->name(); if (timeline.isValid()) { for (auto &&target : timeline.allTargets()) { - if (target.displayName() == targetId) + if (target.isValid() && target.displayName() == targetId) return target; } } diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp index 86aae0b2cc..90818be74b 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp @@ -87,6 +87,16 @@ QRectF CurveItem::boundingRect() const for (auto *item : m_keyframes) bbox(bounds, item->keyframe()); + if (auto *s = qobject_cast<GraphicsScene *>(scene())) { + bounds.setLeft(s->animationRangeMin()); + bounds.setRight(s->animationRangeMax()); + } + + if (qFuzzyCompare(bounds.height(), 0.0)) { + auto tmp = CurveEditorStyle::defaultValueRange() / 2.0; + bounds.adjust(0.0, -tmp, 0.0, tmp); + } + return m_transform.mapRect(bounds); } diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp index aca41b4d6d..e9f9050f62 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp @@ -114,9 +114,29 @@ double GraphicsScene::maximumValue() const return limits().top(); } +double GraphicsScene::animationRangeMin() const +{ + if (GraphicsView *gview = graphicsView()) + return gview->minimumTime(); + + return minimumTime(); +} + +double GraphicsScene::animationRangeMax() const +{ + if (GraphicsView *gview = graphicsView()) + return gview->maximumTime(); + + return maximumTime(); +} + QRectF GraphicsScene::rect() const { - return sceneRect(); + QRectF rect; + for (auto *curve : curves()) + rect |= curve->boundingRect(); + + return rect; } QVector<CurveItem *> GraphicsScene::curves() const @@ -410,6 +430,11 @@ QRectF GraphicsScene::limits() const } m_limits = QRectF(QPointF(min.x(), max.y()), QPointF(max.x(), min.y())); + if (qFuzzyCompare(m_limits.height(), 0.0)) { + auto tmp = CurveEditorStyle::defaultValueRange() / 2.0; + m_limits.adjust(0.0, tmp, 0.0, -tmp); + } + m_dirty = false; } return m_limits; diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h index 9443130b3e..c19f72b130 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.h @@ -67,6 +67,10 @@ public: double maximumValue() const; + double animationRangeMin() const; + + double animationRangeMax() const; + QRectF rect() const; QVector<CurveItem *> curves() const; diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp index 9fec8b2fc5..c162b5fd90 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp @@ -126,12 +126,12 @@ double GraphicsView::maximumTime() const double GraphicsView::minimumValue() const { - return m_scene->empty() ? -1.0 : m_scene->minimumValue(); + return m_scene->empty() ? CurveEditorStyle::defaultValueMin : m_scene->minimumValue(); } double GraphicsView::maximumValue() const { - return m_scene->empty() ? 1.0 : m_scene->maximumValue(); + return m_scene->empty() ? CurveEditorStyle::defaultValueMax : m_scene->maximumValue(); } double GraphicsView::zoomX() const diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp index 91aa006299..de3757e68c 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp @@ -92,7 +92,7 @@ void Edit3DCanvas::paintEvent(QPaintEvent *e) QPainter painter(this); - painter.drawImage(rect(), m_image, rect()); + painter.drawImage(rect(), m_image, QRect(0, 0, m_image.width(), m_image.height())); } void Edit3DCanvas::resizeEvent(QResizeEvent *e) diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 5b75ea7241..2bb61467a9 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -24,7 +24,6 @@ ****************************************************************************/ #include "designmodewidget.h" -#include "switchsplittabwidget.h" #include <designeractionmanager.h> diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h index 67f8f3d554..bf348d3300 100644 --- a/src/plugins/qmldesigner/designmodewidget.h +++ b/src/plugins/qmldesigner/designmodewidget.h @@ -50,7 +50,6 @@ namespace QmlDesigner { class ItemLibraryWidget; class CrumbleBar; class DocumentWarningWidget; -class SwitchSplitTabWidget; namespace Internal { @@ -103,8 +102,6 @@ private: // functions void aboutToShowWorkspaces(); private: // variables - SwitchSplitTabWidget* m_centralTabWidget = nullptr; - QPointer<QWidget> m_bottomSideBar; Core::EditorToolBar *m_toolBar; CrumbleBar *m_crumbleBar; diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 3022bd80be..938a718d7c 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -37,7 +37,6 @@ #include <connectionview.h> #include <sourcetool/sourcetool.h> #include <colortool/colortool.h> -#include <annotationeditor/annotationtool.h> #include <curveeditor/curveeditorview.h> #include <formeditor/transitiontool.h> #include <texttool/texttool.h> @@ -250,7 +249,6 @@ bool QmlDesignerPlugin::delayedInitialize() d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::SourceTool); d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::ColorTool); - d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::AnnotationTool); d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::TextTool); d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::PathTool); d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::TransitionTool); diff --git a/src/plugins/qmldesigner/qmldesignerplugin.pri b/src/plugins/qmldesigner/qmldesignerplugin.pri index 8c99395c58..b11ff7a53b 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.pri +++ b/src/plugins/qmldesigner/qmldesignerplugin.pri @@ -2,7 +2,6 @@ HEADERS += $$PWD/qmldesignerconstants.h \ $$PWD/shortcutmanager.h \ $$PWD/qmldesignerplugin.h \ $$PWD/designmodewidget.h \ - $$PWD/switchsplittabwidget.h \ $$PWD/designersettings.h \ $$PWD/generateresource.h \ $$PWD/settingspage.h \ @@ -16,7 +15,6 @@ HEADERS += $$PWD/qmldesignerconstants.h \ SOURCES += $$PWD/qmldesignerplugin.cpp \ $$PWD/shortcutmanager.cpp \ $$PWD/designmodewidget.cpp \ - $$PWD/switchsplittabwidget.cpp \ $$PWD/designersettings.cpp \ $$PWD/generateresource.cpp \ $$PWD/settingspage.cpp \ diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 8dc0933903..93cf6587ca 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -712,8 +712,6 @@ Project { "annotationeditor/globalannotationeditordialog.cpp", "annotationeditor/globalannotationeditordialog.h", "annotationeditor/globalannotationeditordialog.ui", - "annotationeditor/annotationtool.cpp", - "annotationeditor/annotationtool.h", "bindingeditor/bindingeditor.cpp", "bindingeditor/bindingeditor.h", "bindingeditor/actioneditor.cpp", @@ -935,8 +933,6 @@ Project { "designmodecontext.h", "designmodewidget.cpp", "designmodewidget.h", - "switchsplittabwidget.cpp", - "switchsplittabwidget.h", "documentmanager.cpp", "documentmanager.h", "documentwarningwidget.cpp", diff --git a/src/plugins/qmldesigner/switchsplittabwidget.cpp b/src/plugins/qmldesigner/switchsplittabwidget.cpp deleted file mode 100644 index e30f4180cf..0000000000 --- a/src/plugins/qmldesigner/switchsplittabwidget.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "switchsplittabwidget.h" -#include <theme.h> - -#include <utils/utilsicons.h> -#include <utils/fileutils.h> - -#include <QVector> -#include <QBoxLayout> -#include <QTabBar> -#include <QToolButton> -#include <QSplitter> -#include <QLayoutItem> -#include <QEvent> - -namespace QmlDesigner { -SwitchSplitTabWidget::SwitchSplitTabWidget(QWidget *parent) - : QWidget(parent) - , m_splitter(new QSplitter) - , m_tabBar(new QTabBar) - , m_tabBarBackground(new QWidget) -{ - // setting object names for css - setObjectName("backgroundWidget"); - m_splitter->setObjectName("centralTabWidget"); - m_splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - m_splitter->setHandleWidth(0); - - QString sheet = QString::fromUtf8(Utils::FileReader::fetchQrc(":/qmldesigner/centerwidget.css")); - m_tabBarBackground->setStyleSheet(Theme::replaceCssColors(sheet)); - - m_tabBar->setObjectName("centralTabBar"); - m_tabBar->setShape(QTabBar::RoundedEast); - m_tabBar->setDocumentMode(false); - // add a faketab to have the possibility to unselect all tabs - m_tabBar->addTab(QString()); - selectFakeTab(); - - m_tabBarBackground->setObjectName("tabBarBackground"); - - connect(m_tabBar, &QTabBar::tabBarClicked, [this] (int index) { - if (index != -1) - updateSplitterSizes(index - fakeTab); - }); - - setLayout(new QHBoxLayout); - layout()->setContentsMargins(0, 0, 0, 0); - layout()->setSpacing(0); - layout()->addWidget(m_splitter); - - m_tabBarBackground->setLayout(new QVBoxLayout); - m_tabBarBackground->layout()->setContentsMargins(0, 0, 0, 0); - m_tabBarBackground->layout()->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding)); - m_tabBarBackground->layout()->addWidget(m_tabBar); - - auto horizontalButton = new QToolButton; - horizontalButton->setObjectName("centralTabBar"); - horizontalButton->setIcon(Utils::Icon({{QLatin1String(":/qmldesigner/images/spliteditorvertically.png"), - Utils::Theme::IconsBaseColor}}).icon()); - horizontalButton->setIconSize(QSize(8, 16)); - connect(horizontalButton, &QToolButton::clicked, [this] () { - m_splitter->setOrientation(Qt::Vertical); - updateSplitterSizes(); - selectFakeTab(); - }); - auto verticalButton = new QToolButton; - verticalButton->setObjectName("centralTabBar"); - verticalButton->setIcon(Utils::Icon({{QLatin1String(":/qmldesigner/images/spliteditorhorizontally.png"), - Utils::Theme::IconsBaseColor}}).icon()); - verticalButton->setIconSize(QSize(8, 16)); - connect(verticalButton, &QToolButton::clicked, [this] () { - m_splitter->setOrientation(Qt::Horizontal); - updateSplitterSizes(); - selectFakeTab(); - }); - - m_tabBarBackground->layout()->addWidget(horizontalButton); - m_tabBarBackground->layout()->addWidget(verticalButton); - layout()->addWidget(m_tabBarBackground); - updateSplitButtons(); -} - -int SwitchSplitTabWidget::count() const -{ - return m_splitter->count(); -} - -QWidget *SwitchSplitTabWidget::currentWidget() const -{ - QList<int> sizes = m_splitter->sizes(); - for (int i = 0; i < count(); ++i) { - if (sizes.at(i) > 0 && m_splitter->widget(i)->hasFocus()) - return m_splitter->widget(i); - } - return nullptr; -} - -void SwitchSplitTabWidget::updateSplitterSizes(int index) -{ - QVector<int> splitterSizes(m_splitter->count()); - int splitterFullSize = 0; - bool isHorizontal = m_splitter->orientation() == Qt::Horizontal; - for (int i = 0; i < m_splitter->count(); ++i) { - auto widget = m_splitter->widget(i); - splitterFullSize += isHorizontal ? widget->width() : widget->height(); - } - - if (index > -1) { - // collapse all but the one at index - splitterSizes.fill(0); - splitterSizes.replace(index, splitterFullSize); - } else { - // distribute full size among enabled tabs - int divisor = splitterSizes.count(); - for (int i = 0; i < m_splitter->count(); ++i) { - if (!m_tabBar->isTabEnabled(i + fakeTab)) - --divisor; - } - - int splitSize = splitterFullSize / divisor; - for (int i = 0; i < m_splitter->count(); ++i) - splitterSizes.replace(i, m_tabBar->isTabEnabled(i + fakeTab) ? splitSize : 0); - } - - m_splitter->setSizes(splitterSizes.toList()); -} - -int SwitchSplitTabWidget::addTab(QWidget *w, const QString &label) -{ - m_splitter->addWidget(w); - const int newIndex = m_tabBar->addTab(label); - if (mode() == TabMode) { - m_tabBar->setCurrentIndex(newIndex); - updateSplitterSizes(newIndex - fakeTab); - } - if (mode() == SplitMode) - updateSplitterSizes(); - updateSplitButtons(); - return newIndex; -} - -QWidget *SwitchSplitTabWidget::takeTabWidget(const int index) -{ - if (index == -1 || index > count() - 1) - return nullptr; - QWidget *widget = m_splitter->widget(index); - widget->setParent(nullptr); - m_tabBar->removeTab(index + fakeTab); - // TODO: set which mode and tab is the current one - updateSplitButtons(); - return widget; -} - -void SwitchSplitTabWidget::switchTo(QWidget *widget) -{ - if (widget == nullptr || currentWidget() == widget) - return; - const int widgetIndex = m_splitter->indexOf(widget); - Q_ASSERT(widgetIndex != -1); - if (mode() == TabMode) { - updateSplitterSizes(widgetIndex); - m_tabBar->setCurrentIndex(widgetIndex + fakeTab); - } - - widget->setFocus(); -} - -void SwitchSplitTabWidget::updateSplitButtons() -{ - const bool isTabBarNecessary = count() > 1; - m_tabBarBackground->setVisible(isTabBarNecessary); -} - -void SwitchSplitTabWidget::selectFakeTab() -{ - m_tabBar->setCurrentIndex(0); -} - -SwitchSplitTabWidget::Mode SwitchSplitTabWidget::mode() const -{ - const bool isTabBarNecessary = count() > 1; - const int fakeTabPosition = 0; - const int hasSelectedTab = m_tabBar->currentIndex() > fakeTabPosition; - // Note: When splitting the view by dragging from the side of the view, SplitMode is not detected - return (isTabBarNecessary && !hasSelectedTab) ? SplitMode : TabMode; -} - -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/switchsplittabwidget.h b/src/plugins/qmldesigner/switchsplittabwidget.h deleted file mode 100644 index 72c5cc3e5e..0000000000 --- a/src/plugins/qmldesigner/switchsplittabwidget.h +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include <QWidget> - -QT_BEGIN_NAMESPACE -class QTabBar; -class QSplitter; -class QPushButton; -QT_END_NAMESPACE - -namespace QmlDesigner { -class SwitchSplitTabWidget : public QWidget -{ - Q_OBJECT - - enum Mode { SplitMode, TabMode }; - -public: - explicit SwitchSplitTabWidget(QWidget *parent = nullptr); - int count() const; - QWidget *currentWidget() const; - - int addTab(QWidget *widget, const QString &label); - QWidget *takeTabWidget(const int index); - void switchTo(QWidget *widget); - -private: - void updateSplitterSizes(int index = -1); - void updateSplitButtons(); - void selectFakeTab(); - Mode mode() const; - - QSplitter *m_splitter = nullptr; - QTabBar *m_tabBar = nullptr; - QWidget *m_tabBarBackground = nullptr; - const int fakeTab = 1; -}; -} // namespace QmlDesigner diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index 815be89bba..05f3c8ae17 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -485,9 +485,10 @@ void CodeAssistantPrivate::destroyContext() if (isWaitingForProposal()) { cancelCurrentRequest(); - } else if (isDisplayingProposal()) { + } else if (m_proposalWidget) { m_editorWidget->keepAutoCompletionHighlight(false); - m_proposalWidget->closeProposal(); + if (m_proposalWidget->isVisible()) + m_proposalWidget->closeProposal(); disconnect(m_proposalWidget, &QObject::destroyed, this, &CodeAssistantPrivate::finalizeProposal); finalizeProposal(); diff --git a/src/plugins/texteditor/fontsettings.cpp b/src/plugins/texteditor/fontsettings.cpp index 26d3d04194..d74a13b2cc 100644 --- a/src/plugins/texteditor/fontsettings.cpp +++ b/src/plugins/texteditor/fontsettings.cpp @@ -45,7 +45,6 @@ static const char fontFamilyKey[] = "FontFamily"; static const char fontSizeKey[] = "FontSize"; static const char fontZoomKey[] = "FontZoom"; -static const char lineSpacingKey[] = "LineSpacing"; static const char antialiasKey[] = "FontAntialias"; static const char schemeFileNamesKey[] = "ColorSchemes"; @@ -57,13 +56,11 @@ static const bool DEFAULT_ANTIALIAS = true; namespace TextEditor { // -- FontSettings -FontSettings::FontSettings() - : m_family(defaultFixedFontFamily()) - , m_fontSize(defaultFontSize()) - , m_fontZoom(100) - , m_lineSpacing(100) - , m_antialias(DEFAULT_ANTIALIAS) - , m_lineSpacingCache(0) +FontSettings::FontSettings() : + m_family(defaultFixedFontFamily()), + m_fontSize(defaultFontSize()), + m_fontZoom(100), + m_antialias(DEFAULT_ANTIALIAS) { } @@ -72,10 +69,10 @@ void FontSettings::clear() m_family = defaultFixedFontFamily(); m_fontSize = defaultFontSize(); m_fontZoom = 100; - m_lineSpacing = 100; m_antialias = DEFAULT_ANTIALIAS; m_scheme.clear(); - clearCaches(); + m_formatCache.clear(); + m_textCharFormatCache.clear(); } static QString settingsGroup() @@ -92,12 +89,9 @@ void FontSettings::toSettings(QSettings *s) const if (m_fontSize != defaultFontSize() || s->contains(QLatin1String(fontSizeKey))) s->setValue(QLatin1String(fontSizeKey), m_fontSize); - if (m_fontZoom != 100 || s->contains(QLatin1String(fontZoomKey))) + if (m_fontZoom!= 100 || s->contains(QLatin1String(fontZoomKey))) s->setValue(QLatin1String(fontZoomKey), m_fontZoom); - if (m_lineSpacing != 100 || s->contains(QLatin1String(lineSpacingKey))) - s->setValue(QLatin1String(lineSpacingKey), m_lineSpacing); - if (m_antialias != DEFAULT_ANTIALIAS || s->contains(QLatin1String(antialiasKey))) s->setValue(QLatin1String(antialiasKey), m_antialias); @@ -122,8 +116,7 @@ bool FontSettings::fromSettings(const FormatDescriptions &descriptions, const QS m_family = s->value(group + QLatin1String(fontFamilyKey), defaultFixedFontFamily()).toString(); m_fontSize = s->value(group + QLatin1String(fontSizeKey), m_fontSize).toInt(); - m_fontZoom = s->value(group + QLatin1String(fontZoomKey), m_fontZoom).toInt(); - m_lineSpacing = s->value(group + QLatin1String(lineSpacingKey), m_lineSpacing).toInt(); + m_fontZoom= s->value(group + QLatin1String(fontZoomKey), m_fontZoom).toInt(); m_antialias = s->value(group + QLatin1String(antialiasKey), DEFAULT_ANTIALIAS).toBool(); if (s->contains(group + QLatin1String(schemeFileNamesKey))) { @@ -141,12 +134,11 @@ bool FontSettings::fromSettings(const FormatDescriptions &descriptions, const QS bool FontSettings::equals(const FontSettings &f) const { return m_family == f.m_family - && m_schemeFileName == f.m_schemeFileName - && m_fontSize == f.m_fontSize - && m_lineSpacing == f.m_lineSpacing - && m_fontZoom == f.m_fontZoom - && m_antialias == f.m_antialias - && m_scheme == f.m_scheme; + && m_schemeFileName == f.m_schemeFileName + && m_fontSize == f.m_fontSize + && m_fontZoom == f.m_fontZoom + && m_antialias == f.m_antialias + && m_scheme == f.m_scheme; } uint qHash(const TextStyle &textStyle) @@ -280,13 +272,6 @@ void FontSettings::addMixinStyle(QTextCharFormat &textCharFormat, }; } -void FontSettings::clearCaches() -{ - m_formatCache.clear(); - m_textCharFormatCache.clear(); - m_lineSpacingCache = 0; -} - QTextCharFormat FontSettings::toTextCharFormat(TextStyles textStyles) const { auto textCharFormatIterator = m_textCharFormatCache.find(textStyles); @@ -327,7 +312,8 @@ QString FontSettings::family() const void FontSettings::setFamily(const QString &family) { m_family = family; - clearCaches(); + m_formatCache.clear(); + m_textCharFormatCache.clear(); } /** @@ -341,7 +327,8 @@ int FontSettings::fontSize() const void FontSettings::setFontSize(int size) { m_fontSize = size; - clearCaches(); + m_formatCache.clear(); + m_textCharFormatCache.clear(); } /** @@ -357,28 +344,6 @@ void FontSettings::setFontZoom(int zoom) m_fontZoom = zoom; m_formatCache.clear(); m_textCharFormatCache.clear(); - m_lineSpacingCache = 0; -} - -qreal FontSettings::lineSpacing() const -{ - if (qFuzzyIsNull(m_lineSpacingCache)) { - auto currentFont = font(); - currentFont.setPointSize(m_fontSize * m_fontZoom / 100); - m_lineSpacingCache = QFontMetricsF(currentFont).lineSpacing() / 100 * m_lineSpacing; - } - return m_lineSpacingCache; -} - -int FontSettings::relativeLineSpacing() const -{ - return m_lineSpacing; -} - -void FontSettings::setRelativeLineSpacing(int relativeLineSpacing) -{ - m_lineSpacing = relativeLineSpacing; - m_lineSpacingCache = 0; } QFont FontSettings::font() const @@ -399,7 +364,8 @@ bool FontSettings::antialias() const void FontSettings::setAntialias(bool antialias) { m_antialias = antialias; - clearCaches(); + m_formatCache.clear(); + m_textCharFormatCache.clear(); } /** @@ -436,7 +402,8 @@ void FontSettings::setColorSchemeFileName(const QString &fileName) bool FontSettings::loadColorScheme(const QString &fileName, const FormatDescriptions &descriptions) { - clearCaches(); + m_formatCache.clear(); + m_textCharFormatCache.clear(); bool loaded = true; m_schemeFileName = fileName; @@ -492,7 +459,8 @@ const ColorScheme &FontSettings::colorScheme() const void FontSettings::setColorScheme(const ColorScheme &scheme) { m_scheme = scheme; - clearCaches(); + m_formatCache.clear(); + m_textCharFormatCache.clear(); } static QString defaultFontFamily() diff --git a/src/plugins/texteditor/fontsettings.h b/src/plugins/texteditor/fontsettings.h index 0fbc80e15d..9447141434 100644 --- a/src/plugins/texteditor/fontsettings.h +++ b/src/plugins/texteditor/fontsettings.h @@ -75,10 +75,6 @@ public: int fontZoom() const; void setFontZoom(int zoom); - qreal lineSpacing() const; - int relativeLineSpacing() const; - void setRelativeLineSpacing(int relativeLineSpacing); - QFont font() const; bool antialias() const; @@ -104,19 +100,16 @@ public: private: void addMixinStyle(QTextCharFormat &textCharFormat, const MixinTextStyles &mixinStyles) const; - void clearCaches(); private: QString m_family; QString m_schemeFileName; int m_fontSize; int m_fontZoom; - int m_lineSpacing; bool m_antialias; ColorScheme m_scheme; mutable QHash<TextStyle, QTextCharFormat> m_formatCache; mutable QHash<TextStyles, QTextCharFormat> m_textCharFormatCache; - mutable qreal m_lineSpacingCache; }; inline bool operator==(const FontSettings &f1, const FontSettings &f2) { return f1.equals(f2); } diff --git a/src/plugins/texteditor/fontsettingspage.cpp b/src/plugins/texteditor/fontsettingspage.cpp index 41450ec8cf..0e35cade04 100644 --- a/src/plugins/texteditor/fontsettingspage.cpp +++ b/src/plugins/texteditor/fontsettingspage.cpp @@ -31,9 +31,9 @@ #include <coreplugin/icore.h> #include <utils/fileutils.h> +#include <utils/stringutils.h> #include <utils/qtcassert.h> #include <utils/theme/theme.h> -#include <utils/utilsicons.h> #include <QFileDialog> #include <QFontDatabase> @@ -128,11 +128,6 @@ public: m_ui.antialias->setChecked(m_value.antialias()); m_ui.zoomSpinBox->setValue(m_value.fontZoom()); - m_ui.lineSpacingSpinBox->setValue(m_value.relativeLineSpacing()); - m_ui.lineSpacingWarningLabel->setPixmap(Utils::Icons::WARNING.pixmap()); - m_ui.lineSpacingWarningLabel->setToolTip(tr("A line spacing less than 100% can result in " - "overlapping and misaligned graphics.")); - m_ui.lineSpacingWarningLabel->setVisible(m_value.relativeLineSpacing() < 100); m_ui.schemeEdit->setFormatDescriptions(fd); m_ui.schemeEdit->setBaseFont(m_value.font()); @@ -148,8 +143,6 @@ public: this, &FontSettingsPageWidget::fontSizeSelected); connect(m_ui.zoomSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &FontSettingsPageWidget::fontZoomChanged); - connect(m_ui.lineSpacingSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), - this, &FontSettingsPageWidget::lineSpacingChanged); connect(m_ui.antialias, &QCheckBox::toggled, this, &FontSettingsPageWidget::antialiasChanged); connect(m_ui.schemeComboBox, @@ -173,7 +166,6 @@ public: void fontSelected(const QFont &font); void fontSizeSelected(int index); void fontZoomChanged(); - void lineSpacingChanged(const int &value); void antialiasChanged(); void colorSchemeSelected(int index); void openCopyColorSchemeDialog(); @@ -425,12 +417,6 @@ void FontSettingsPageWidget::fontZoomChanged() m_value.setFontZoom(m_ui.zoomSpinBox->value()); } -void FontSettingsPageWidget::lineSpacingChanged(const int &value) -{ - m_value.setRelativeLineSpacing(value); - m_ui.lineSpacingWarningLabel->setVisible(value < 100); -} - void FontSettingsPageWidget::antialiasChanged() { m_value.setAntialias(m_ui.antialias->isChecked()); diff --git a/src/plugins/texteditor/fontsettingspage.ui b/src/plugins/texteditor/fontsettingspage.ui index da8a9fa907..5c61c00738 100644 --- a/src/plugins/texteditor/fontsettingspage.ui +++ b/src/plugins/texteditor/fontsettingspage.ui @@ -6,7 +6,7 @@ <rect> <x>0</x> <y>0</y> - <width>752</width> + <width>639</width> <height>306</height> </rect> </property> @@ -17,23 +17,40 @@ <string>Font</string> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="5"> - <widget class="QComboBox" name="sizeComboBox"> + <item row="0" column="4"> + <widget class="QLabel" name="sizeLabel"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>1</horstretch> + <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="editable"> - <bool>true</bool> + <property name="text"> + <string>Size:</string> </property> </widget> </item> - <item row="0" column="1"> - <widget class="QFontComboBox" name="fontComboBox"/> - </item> <item row="0" column="7"> + <widget class="QLabel" name="zoomLabel"> + <property name="text"> + <string>Zoom:</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="familyLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Family:</string> + </property> + </widget> + </item> + <item row="0" column="6"> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> @@ -49,7 +66,7 @@ </property> </spacer> </item> - <item row="0" column="14"> + <item row="0" column="9"> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> @@ -62,19 +79,6 @@ </property> </spacer> </item> - <item row="0" column="4"> - <widget class="QLabel" name="sizeLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Size:</string> - </property> - </widget> - </item> <item row="1" column="0" colspan="3"> <widget class="QCheckBox" name="antialias"> <property name="text"> @@ -82,32 +86,6 @@ </property> </widget> </item> - <item row="0" column="9"> - <widget class="QSpinBox" name="zoomSpinBox"> - <property name="suffix"> - <string>%</string> - </property> - <property name="minimum"> - <number>10</number> - </property> - <property name="maximum"> - <number>3000</number> - </property> - <property name="singleStep"> - <number>10</number> - </property> - <property name="value"> - <number>100</number> - </property> - </widget> - </item> - <item row="0" column="8"> - <widget class="QLabel" name="zoomLabel"> - <property name="text"> - <string>Zoom:</string> - </property> - </widget> - </item> <item row="0" column="3"> <spacer> <property name="orientation"> @@ -124,61 +102,41 @@ </property> </spacer> </item> - <item row="0" column="12"> - <widget class="QSpinBox" name="lineSpacingSpinBox"> + <item row="0" column="8"> + <widget class="QSpinBox" name="zoomSpinBox"> <property name="suffix"> <string>%</string> </property> <property name="minimum"> - <number>50</number> + <number>10</number> </property> <property name="maximum"> <number>3000</number> </property> + <property name="singleStep"> + <number>10</number> + </property> <property name="value"> <number>100</number> </property> </widget> </item> - <item row="0" column="0"> - <widget class="QLabel" name="familyLabel"> + <item row="0" column="1"> + <widget class="QFontComboBox" name="fontComboBox"/> + </item> + <item row="0" column="5"> + <widget class="QComboBox" name="sizeComboBox"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> + <horstretch>1</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text"> - <string>Family:</string> - </property> - </widget> - </item> - <item row="0" column="11"> - <widget class="QLabel" name="lineSpacingLabel"> - <property name="text"> - <string>Line spacing:</string> + <property name="editable"> + <bool>true</bool> </property> </widget> </item> - <item row="0" column="10"> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Preferred</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item row="0" column="13"> - <widget class="QLabel" name="lineSpacingWarningLabel"/> - </item> </layout> </widget> </item> @@ -242,7 +200,6 @@ <tabstop>fontComboBox</tabstop> <tabstop>sizeComboBox</tabstop> <tabstop>zoomSpinBox</tabstop> - <tabstop>lineSpacingSpinBox</tabstop> <tabstop>antialias</tabstop> <tabstop>schemeComboBox</tabstop> <tabstop>copyButton</tabstop> diff --git a/src/plugins/texteditor/textdocumentlayout.cpp b/src/plugins/texteditor/textdocumentlayout.cpp index 70b63e0303..a2f292e9c7 100644 --- a/src/plugins/texteditor/textdocumentlayout.cpp +++ b/src/plugins/texteditor/textdocumentlayout.cpp @@ -24,13 +24,8 @@ ****************************************************************************/ #include "textdocumentlayout.h" - -#include "fontsettings.h" #include "textdocument.h" -#include "texteditorsettings.h" - #include <utils/qtcassert.h> - #include <QDebug> namespace TextEditor { @@ -630,9 +625,6 @@ void TextDocumentLayout::updateMarksBlock(const QTextBlock &block) QRectF TextDocumentLayout::blockBoundingRect(const QTextBlock &block) const { QRectF boundingRect = QPlainTextDocumentLayout::blockBoundingRect(block); - if (boundingRect.isNull()) - return boundingRect; - boundingRect.setHeight(TextEditorSettings::fontSettings().lineSpacing()); if (TextBlockUserData *userData = textUserData(block)) boundingRect.adjust(0, 0, 0, userData->additionalAnnotationHeight()); return boundingRect; diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 516b82ac72..6bd05f9b2c 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -1107,9 +1107,9 @@ void TextEditorWidget::print(QPrinter *printer) delete dlg; } -static int foldBoxWidth() +static int foldBoxWidth(const QFontMetrics &fm) { - const int lineSpacing = TextEditorSettings::fontSettings().lineSpacing(); + const int lineSpacing = fm.lineSpacing(); return lineSpacing + lineSpacing % 2 + 1; } @@ -3606,9 +3606,9 @@ QRect TextEditorWidgetPrivate::foldBox() QRectF br = q->blockBoundingGeometry(begin).translated(q->contentOffset()); QRectF er = q->blockBoundingGeometry(end).translated(q->contentOffset()); - return QRect(m_extraArea->width() - foldBoxWidth(), + return QRect(m_extraArea->width() - foldBoxWidth(q->fontMetrics()), int(br.top()), - foldBoxWidth(), + foldBoxWidth(q->fontMetrics()), int(er.bottom() - br.top())); } @@ -4089,9 +4089,7 @@ bool TextEditorWidgetPrivate::updateAnnotationBounds(TextBlockUserData *blockUse { const bool additionalHeightNeeded = annotationsVisible && m_displaySettings.m_annotationAlignment == AnnotationAlignment::BetweenLines; - const int additionalHeight = additionalHeightNeeded - ? TextEditorSettings::fontSettings().lineSpacing() - : 0; + const int additionalHeight = additionalHeightNeeded ? q->fontMetrics().lineSpacing() : 0; if (blockUserData->additionalAnnotationHeight() == additionalHeight) return false; blockUserData->setAdditionalAnnotationHeight(additionalHeight); @@ -4132,7 +4130,7 @@ void TextEditorWidgetPrivate::updateLineAnnotation(const PaintEventData &data, return mark1->priority() > mark2->priority(); }); - const qreal itemOffset = blockData.boundingRect.height(); + const qreal itemOffset = q->fontMetrics().lineSpacing(); const qreal initialOffset = m_displaySettings.m_annotationAlignment == AnnotationAlignment::BetweenLines ? itemOffset / 2 : itemOffset * 2; const qreal minimalContentWidth = q->fontMetrics().horizontalAdvance('X') * m_displaySettings.m_minimalAnnotationContent; @@ -4177,6 +4175,13 @@ void TextEditorWidgetPrivate::updateLineAnnotation(const PaintEventData &data, q->viewport()->update(updateRect); } +QColor blendRightMarginColor(const FontSettings &settings, bool areaColor) +{ + const QColor baseColor = settings.toTextCharFormat(C_TEXT).background().color(); + const QColor col = (baseColor.value() > 128) ? Qt::black : Qt::white; + return blendColors(baseColor, col, areaColor ? 16 : 32); +} + void TextEditorWidgetPrivate::paintRightMarginArea(PaintEventData &data, QPainter &painter) const { if (m_visibleWrapColumn <= 0) @@ -4191,7 +4196,7 @@ void TextEditorWidgetPrivate::paintRightMarginArea(PaintEventData &data, QPainte data.eventRect.top(), data.viewportRect.width() - data.rightMargin, data.eventRect.height()); - painter.fillRect(behindMargin, data.ifdefedOutFormat.background()); + painter.fillRect(behindMargin, blendRightMarginColor(m_document->fontSettings(), true)); } } @@ -4201,11 +4206,8 @@ void TextEditorWidgetPrivate::paintRightMarginLine(const PaintEventData &data, if (m_visibleWrapColumn <= 0 || data.rightMargin >= data.viewportRect.width()) return; - const QBrush background = data.ifdefedOutFormat.background(); - const QColor baseColor = m_document->fontSettings().toTextCharFormat(C_TEXT).background().color(); - const QColor col = (baseColor.value() > 128) ? Qt::black : Qt::white; const QPen pen = painter.pen(); - painter.setPen(blendColors(background.isOpaque() ? background.color() : baseColor, col, 32)); + painter.setPen(blendRightMarginColor(m_document->fontSettings(), false)); painter.drawLine(QPointF(data.rightMargin, data.eventRect.top()), QPointF(data.rightMargin, data.eventRect.bottom())); painter.setPen(pen); @@ -5027,7 +5029,7 @@ int TextEditorWidget::extraAreaWidth(int *markWidthPtr) const int markWidth = 0; if (d->m_marksVisible) { - markWidth += documentLayout->maxMarkWidthFactor * TextEditorSettings::fontSettings().lineSpacing() + 2; + markWidth += documentLayout->maxMarkWidthFactor * fm.lineSpacing() + 2; // if (documentLayout->doubleMarkCount) // markWidth += fm.lineSpacing() / 3; @@ -5042,7 +5044,7 @@ int TextEditorWidget::extraAreaWidth(int *markWidthPtr) const space += 4; if (d->m_codeFoldingVisible) - space += foldBoxWidth(); + space += foldBoxWidth(fm); if (viewportMargins() != QMargins{isLeftToRight() ? space : 0, 0, isLeftToRight() ? 0 : space, 0}) d->slotUpdateExtraAreaWidth(space); @@ -5068,9 +5070,9 @@ struct Internal::ExtraAreaPaintEventData , selectionStart(editor->textCursor().selectionStart()) , selectionEnd(editor->textCursor().selectionEnd()) , fontMetrics(d->m_extraArea->font()) - , lineSpacing(TextEditorSettings::fontSettings().lineSpacing()) + , lineSpacing(fontMetrics.lineSpacing()) , markWidth(d->m_marksVisible ? lineSpacing : 0) - , collapseColumnWidth(d->m_codeFoldingVisible ? foldBoxWidth() : 0) + , collapseColumnWidth(d->m_codeFoldingVisible ? foldBoxWidth(fontMetrics) : 0) , extraAreaWidth(d->m_extraArea->width() - collapseColumnWidth) , currentLineNumberFormat( editor->textDocument()->fontSettings().toTextCharFormat(C_CURRENT_LINE_NUMBER)) @@ -5194,7 +5196,7 @@ void TextEditorWidgetPrivate::paintCodeFolding(QPainter &painter, bool hovered = blockNumber >= extraAreaHighlightFoldBlockNumber && blockNumber <= extraAreaHighlightFoldEndBlockNumber; - int boxWidth = foldBoxWidth(); + int boxWidth = foldBoxWidth(data.fontMetrics); if (hovered) { int itop = qRound(blockBoundingRect.top()); int ibottom = qRound(blockBoundingRect.bottom()); @@ -5567,10 +5569,8 @@ void TextEditorWidget::mouseMoveEvent(QMouseEvent *e) if (cursor.positionInBlock() == cursor.block().length()-1) column += (e->pos().x() - cursorRect().center().x()) / QFontMetricsF(font()).horizontalAdvance(QLatin1Char(' ')); int block = cursor.blockNumber(); - if (block == blockCount() - 1) { - block += (e->pos().y() - cursorRect().center().y()) - / TextEditorSettings::fontSettings().lineSpacing(); - } + if (block == blockCount() - 1) + block += (e->pos().y() - cursorRect().center().y()) / QFontMetricsF(font()).lineSpacing(); d->enableBlockSelection(block, column, block, column); } } else { @@ -5620,11 +5620,8 @@ void TextEditorWidget::mousePressEvent(QMouseEvent *e) if (cursor.positionInBlock() == cursor.block().length()-1) column += (e->pos().x() - cursorRect(cursor).center().x()) / QFontMetricsF(font()).horizontalAdvance(QLatin1Char(' ')); int block = cursor.blockNumber(); - if (block == blockCount() - 1) { - block += (e->pos().y() - cursorRect(cursor).center().y()) - / TextEditorSettings::fontSettings().lineSpacing(); - } - + if (block == blockCount() - 1) + block += (e->pos().y() - cursorRect(cursor).center().y()) / QFontMetricsF(font()).lineSpacing(); if (d->m_inBlockSelectionMode) { d->m_blockSelection.positionBlock = block; d->m_blockSelection.positionColumn = column; @@ -5798,7 +5795,7 @@ void TextEditorWidget::updateFoldingHighlight(const QPoint &pos) const int highlightBlockNumber = d->extraAreaHighlightFoldedBlockNumber; d->extraAreaHighlightFoldedBlockNumber = -1; - if (pos.x() > extraArea()->width() - foldBoxWidth()) { + if (pos.x() > extraArea()->width() - foldBoxWidth(fontMetrics())) { d->extraAreaHighlightFoldedBlockNumber = cursor.blockNumber(); } else if (d->m_displaySettings.m_highlightBlocks) { QTextCursor cursor = textCursor(); @@ -5841,7 +5838,7 @@ void TextEditorWidget::extraAreaMouseEvent(QMouseEvent *e) int dist = (e->pos() - d->m_markDragStart).manhattanLength(); if (dist > QApplication::startDragDistance()) { d->m_markDragging = true; - const int height = TextEditorSettings::fontSettings().lineSpacing() - 1; + const int height = fontMetrics().lineSpacing() - 1; const int width = int(.5 + height * d->m_dragMark->widthFactor()); d->m_markDragCursor = QCursor(d->m_dragMark->icon().pixmap({height, width})); d->m_dragMark->setVisible(false); @@ -5859,7 +5856,7 @@ void TextEditorWidget::extraAreaMouseEvent(QMouseEvent *e) if (e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonDblClick) { if (e->button() == Qt::LeftButton) { - int boxWidth = foldBoxWidth(); + int boxWidth = foldBoxWidth(fontMetrics()); if (d->m_codeFoldingVisible && e->pos().x() > extraArea()->width() - boxWidth) { if (!cursor.block().next().isVisible()) { d->toggleBlockVisible(cursor.block()); @@ -6386,7 +6383,7 @@ void TextEditorWidgetPrivate::adjustScrollBarRanges() { if (!m_highlightScrollBarController) return; - const double lineSpacing = TextEditorSettings::fontSettings().lineSpacing(); + const double lineSpacing = QFontMetricsF(q->font()).lineSpacing(); if (lineSpacing == 0) return; |