From 6b4f5ab6e5cb1b18aabd1a7f954dcb089cd1f413 Mon Sep 17 00:00:00 2001 From: liuzhangjian Date: Tue, 6 Aug 2024 17:17:08 +0800 Subject: [PATCH] fix: [symbolbar] Fix issue of UI as title Log: fix issue --- src/plugins/codeeditor/gui/tabwidget.cpp | 3 ++ .../codeeditor/lsp/lspclientmanager.cpp | 1 + src/plugins/codeeditor/lsp/lspclientmanager.h | 1 + src/plugins/codeeditor/symbol/symbolbar.cpp | 43 ++++++++++--------- src/plugins/codeeditor/symbol/symbolbar.h | 6 ++- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/plugins/codeeditor/gui/tabwidget.cpp b/src/plugins/codeeditor/gui/tabwidget.cpp index ed33b542c..43fc5382f 100644 --- a/src/plugins/codeeditor/gui/tabwidget.cpp +++ b/src/plugins/codeeditor/gui/tabwidget.cpp @@ -120,6 +120,7 @@ void TabWidgetPrivate::initUI() tabBar = new TabBar(q); symbolBar = new SymbolBar(q); + symbolBar->setVisible(false); mainLayout->addWidget(tabBar, 0, Qt::AlignTop); mainLayout->addWidget(symbolBar, 0, Qt::AlignTop); @@ -387,6 +388,7 @@ void TabWidgetPrivate::onTabClosed(const QString &fileName) if (editorMng.isEmpty()) { symbolBar->clear(); + symbolBar->setVisible(false); q->setSplitButtonVisible(false); emit q->closeRequested(); } @@ -887,6 +889,7 @@ void TabWidget::openFile(const QString &fileName) Inotify::globalInstance()->addPath(fileName); d->symbolBar->setPath(fileName); + d->symbolBar->setVisible(true); d->tabBar->setFileName(fileName); TextEditor *editor = d->createEditor(fileName); diff --git a/src/plugins/codeeditor/lsp/lspclientmanager.cpp b/src/plugins/codeeditor/lsp/lspclientmanager.cpp index f4c13c1f0..ffb2077e7 100644 --- a/src/plugins/codeeditor/lsp/lspclientmanager.cpp +++ b/src/plugins/codeeditor/lsp/lspclientmanager.cpp @@ -47,6 +47,7 @@ QColor LSPClientManager::highlightColor(const QString &langId, lsp::SemanticToke ? QColor("#000000") : QColor("#d6cf9a"); + QMutexLocker lk(&dataMutex); if (!styleMap.contains(langId)) { const auto &filePath = support_file::EditorStyle::globalPath(langId); StyleSettings settings; diff --git a/src/plugins/codeeditor/lsp/lspclientmanager.h b/src/plugins/codeeditor/lsp/lspclientmanager.h index 2791fdefa..1fdfcb323 100644 --- a/src/plugins/codeeditor/lsp/lspclientmanager.h +++ b/src/plugins/codeeditor/lsp/lspclientmanager.h @@ -22,6 +22,7 @@ class LSPClientManager QHash clientHash; QMap styleMap; + QMutex dataMutex; }; #endif // LSPCLIENTMANAGER_H diff --git a/src/plugins/codeeditor/symbol/symbolbar.cpp b/src/plugins/codeeditor/symbol/symbolbar.cpp index 1b0c42cb7..497d42864 100644 --- a/src/plugins/codeeditor/symbol/symbolbar.cpp +++ b/src/plugins/codeeditor/symbol/symbolbar.cpp @@ -40,9 +40,9 @@ void CurmbItem::setText(const QString &text) { displayText = text; auto rect = fontMetrics().boundingRect(text); - int w = rect.width() + qCeil(font().pixelSize() / 10); + int w = rect.width() + qCeil(static_cast(font().pixelSize()) / 10); if (!isRoot()) - w += spacing + SeparatorSize; + w += spacing + SeparatorSize + 1; setFixedWidth(w); setFixedHeight(rect.height()); @@ -155,14 +155,20 @@ void CurmbItem::paintEvent(QPaintEvent *event) } SymbolBar::SymbolBar(QWidget *parent) - : QWidget(parent) + : QScrollArea(parent) { setAutoFillBackground(true); setBackgroundRole(QPalette::Base); + setWidgetResizable(true); + setFrameShape(QFrame::NoFrame); + setFixedHeight(30); + + QWidget *widget = new QWidget(this); + mainLayout = new QHBoxLayout(widget); + mainLayout->setContentsMargins(10, 0, 0, 0); + mainLayout->setSpacing(4); - auto layout = new QHBoxLayout(this); - layout->setContentsMargins(10, 0, 0, 0); - layout->setSpacing(4); + setWidget(widget); } void SymbolBar::setPath(const QString &path) @@ -183,10 +189,10 @@ void SymbolBar::setPath(const QString &path) } } - auto layout = qobject_cast(this->layout()); auto itemList = displayPath.split(QDir::separator(), QString::SkipEmptyParts); for (int i = 0; i < itemList.size(); ++i) { CurmbItem *item = new CurmbItem(CurmbItem::FilePath, i, this); + setFixedHeight(item->height()); item->setText(itemList[i]); item->setToolTip(path); if (i == itemList.size() - 1) @@ -194,16 +200,15 @@ void SymbolBar::setPath(const QString &path) QString filePath = workspaceDir + QDir::separator() + itemList.mid(0, i + 1).join(QDir::separator()); item->setUserData(filePath); - layout->addWidget(item, 0, Qt::AlignVCenter | Qt::AlignLeft); + mainLayout->addWidget(item, 0, Qt::AlignVCenter | Qt::AlignLeft); connect(item, &CurmbItem::clicked, this, &SymbolBar::curmbItemClicked); } - layout->addStretch(1); + mainLayout->addStretch(1); } void SymbolBar::clear() { - auto layout = qobject_cast(this->layout()); - while (QLayoutItem *item = layout->takeAt(0)) { + while (QLayoutItem *item = mainLayout->takeAt(0)) { if (QWidget *widget = item->widget()) delete widget; delete item; @@ -223,12 +228,11 @@ void SymbolBar::updateSymbol(int line, int index) return; if (!symbolItem) { - auto layout = qobject_cast(this->layout()); - if (layout->count() < 1) + if (mainLayout->count() < 1) return; - symbolItem = new CurmbItem(CurmbItem::Symbol, layout->count() - 1, this); - layout->insertWidget(layout->count() - 1, symbolItem); + symbolItem = new CurmbItem(CurmbItem::Symbol, mainLayout->count() - 1, this); + mainLayout->insertWidget(mainLayout->count() - 1, symbolItem); connect(symbolItem, &CurmbItem::clicked, this, &SymbolBar::curmbItemClicked); } @@ -253,8 +257,8 @@ void SymbolBar::curmbItemClicked() connect(symbolView, &SymbolView::hidden, this, &SymbolBar::resetCurmbItemState); } - auto rect = item->geometry(); - auto pos = mapToGlobal(rect.bottomLeft()); + auto rect = item->rect(); + auto pos = item->mapToGlobal(rect.bottomLeft()); switch (item->curmbType()) { case CurmbItem::FilePath: { @@ -278,9 +282,8 @@ void SymbolBar::curmbItemClicked() void SymbolBar::resetCurmbItemState() { - auto layout = qobject_cast(this->layout()); - for (int i = 0; i < layout->count(); ++i) { - auto item = layout->itemAt(i); + for (int i = 0; i < mainLayout->count(); ++i) { + auto item = mainLayout->itemAt(i); if (!item) continue; diff --git a/src/plugins/codeeditor/symbol/symbolbar.h b/src/plugins/codeeditor/symbol/symbolbar.h index 6d88662b8..e964a5f29 100644 --- a/src/plugins/codeeditor/symbol/symbolbar.h +++ b/src/plugins/codeeditor/symbol/symbolbar.h @@ -6,7 +6,7 @@ #define SYMBOLBAR_H #include -#include +#include #include class CurmbItem : public QWidget @@ -51,7 +51,8 @@ class CurmbItem : public QWidget }; class SymbolView; -class SymbolBar : public QWidget +class QHBoxLayout; +class SymbolBar : public QScrollArea { Q_OBJECT public: @@ -68,6 +69,7 @@ public Q_SLOTS: private: CurmbItem *symbolItem { nullptr }; SymbolView *symbolView { nullptr }; + QHBoxLayout *mainLayout { nullptr }; }; #endif // SYMBOLBAR_H