Files
cbh/ElaWidgetTools/DeveloperComponents/ElaDockWidgetTitleBar.cpp
2025-09-20 01:41:33 +08:00

69 lines
3.2 KiB
C++

#include "ElaDockWidgetTitleBar.h"
#include <QHBoxLayout>
#include <QPainter>
#include "ElaDockWidget.h"
#include "ElaIconButton.h"
#include "ElaText.h"
#include "ElaTheme.h"
ElaDockWidgetTitleBar::ElaDockWidgetTitleBar(QWidget *parent) : QWidget{parent} {
_dockWidget = dynamic_cast<ElaDockWidget *>(parent);
_iconLabel = new QLabel(this);
_iconLabel->setPixmap(_dockWidget->windowIcon().pixmap(QSize(18, 18)));
_titleLabel = new ElaText(_dockWidget->windowTitle(), this);
_titleLabel->setWordWrap(false);
_titleLabel->setTextPixelSize(13);
_floatButton = new ElaIconButton(ElaIconType::WindowRestore, 13, 32, 26, this);
_floatButton->setLightHoverColor(ElaThemeColor(ElaThemeType::Light, BasicHoverAlpha));
_floatButton->setDarkHoverColor(ElaThemeColor(ElaThemeType::Dark, BasicHoverAlpha));
connect(_floatButton, &ElaIconButton::clicked, this, &ElaDockWidgetTitleBar::onFloatButtonClicked);
_closeButton = new ElaIconButton(ElaIconType::Xmark, 17, 32, 26, this);
_closeButton->setLightHoverColor(ElaThemeColor(ElaThemeType::Light, StatusDanger));
_closeButton->setDarkHoverColor(ElaThemeColor(ElaThemeType::Dark, StatusDanger));
connect(_closeButton, &ElaIconButton::clicked, this, &ElaDockWidgetTitleBar::onCloseButtonClicked);
_setVisibleFromFeatures(_dockWidget->features());
connect(_dockWidget, &QDockWidget::featuresChanged, this, [=](QDockWidget::DockWidgetFeatures features) { _setVisibleFromFeatures(features); });
connect(_dockWidget, &QDockWidget::windowTitleChanged, this, [=](const QString &title) { _titleLabel->setText(title); });
connect(_dockWidget, &QDockWidget::windowIconChanged, this, [=](const QIcon &icon) { _iconLabel->setPixmap(icon.pixmap(QSize(18, 18))); });
QHBoxLayout *mainLayout = new QHBoxLayout(this);
mainLayout->setSpacing(0);
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->addSpacing(5);
mainLayout->addWidget(_iconLabel);
mainLayout->addSpacing(10);
mainLayout->addWidget(_titleLabel);
mainLayout->addSpacing(10);
mainLayout->addStretch();
mainLayout->addWidget(_floatButton);
mainLayout->addWidget(_closeButton);
// 主题变更
_themeMode = eTheme->getThemeMode();
connect(eTheme, &ElaTheme::themeModeChanged, this, [=](ElaThemeType::ThemeMode themeMode) { _themeMode = themeMode; });
}
ElaDockWidgetTitleBar::~ElaDockWidgetTitleBar() {}
void ElaDockWidgetTitleBar::onFloatButtonClicked() { _dockWidget->setFloating(_dockWidget->isFloating() ? false : true); }
void ElaDockWidgetTitleBar::onCloseButtonClicked() { _dockWidget->close(); }
void ElaDockWidgetTitleBar::paintEvent(QPaintEvent *event) {
QPainter painter(this);
painter.save();
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::NoPen);
painter.setBrush(_dockWidget->isFloating() ? Qt::transparent : ElaThemeColor(_themeMode, BasicBaseAlpha));
painter.drawRect(rect());
painter.restore();
}
void ElaDockWidgetTitleBar::_setVisibleFromFeatures(QDockWidget::DockWidgetFeatures features) {
_floatButton->setVisible(features.testFlag(QDockWidget::DockWidgetFloatable));
_closeButton->setVisible(features.testFlag(QDockWidget::DockWidgetClosable));
}