Files
cbh/ElaWidgetTools/DeveloperComponents/ElaKeyBinderContainer.cpp
2025-09-19 22:40:52 +08:00

145 lines
4.0 KiB
C++

#include "ElaKeyBinderContainer.h"
#include "ElaKeyBinder.h"
#include "ElaTheme.h"
#include <QKeyEvent>
#include <QMouseEvent>
#include <QPainter>
#include <QtMath>
ElaKeyBinderContainer::ElaKeyBinderContainer(QWidget* parent)
: QWidget(parent)
{
_keyBinder = dynamic_cast<ElaKeyBinder*>(parent);
setStyleSheet("#ElaKeyBinderContainer{background-color:transparent;}");
setFocusPolicy(Qt::StrongFocus);
setMouseTracking(true);
setFixedHeight(140);
QFont textFont = font();
textFont.setLetterSpacing(QFont::AbsoluteSpacing, 0.5);
textFont.setPixelSize(16);
setFont(textFont);
_themeMode = eTheme->getThemeMode();
connect(eTheme, &ElaTheme::themeModeChanged, this, [=](ElaThemeType::ThemeMode themeMode) {
_themeMode = themeMode;
});
}
ElaKeyBinderContainer::~ElaKeyBinderContainer()
{
}
void ElaKeyBinderContainer::logOrResetHistoryData(bool isLog)
{
if (isLog)
{
_historyBinderKeyText = _pBinderKeyText;
_historyNativeVirtualBinderKey = _pNativeVirtualBinderKey;
}
else
{
_pBinderKeyText = _historyBinderKeyText;
_pNativeVirtualBinderKey = _historyNativeVirtualBinderKey;
update();
}
}
void ElaKeyBinderContainer::saveBinderChanged()
{
Q_EMIT _keyBinder->binderKeyTextChanged(_pBinderKeyText);
Q_EMIT _keyBinder->nativeVirtualBinderKeyChanged(_pNativeVirtualBinderKey);
if (_pBinderKeyText.isEmpty())
{
_keyBinder->setText(u8" 按键: " + QString(u8"未绑定") + " ");
}
else
{
_keyBinder->setText(u8" 按键: " + _pBinderKeyText + " ");
}
}
void ElaKeyBinderContainer::mousePressEvent(QMouseEvent* event)
{
switch (event->button())
{
case Qt::LeftButton:
{
_pBinderKeyText = "Mouse1";
_pNativeVirtualBinderKey = 0x01;
break;
}
case Qt::RightButton:
{
_pBinderKeyText = "Mouse2";
_pNativeVirtualBinderKey = 0x02;
break;
}
case Qt::MiddleButton:
{
_pBinderKeyText = "Middle";
_pNativeVirtualBinderKey = 0x04;
break;
}
case Qt::BackButton:
{
_pBinderKeyText = "Back";
_pNativeVirtualBinderKey = 0x05;
break;
}
case Qt::ForwardButton:
{
_pBinderKeyText = "Forward";
_pNativeVirtualBinderKey = 0x06;
break;
}
default:
{
break;
}
}
QWidget::mousePressEvent(event);
update();
}
void ElaKeyBinderContainer::keyPressEvent(QKeyEvent* event)
{
if (!event->isAutoRepeat())
{
_pBinderKeyText = QKeySequence(event->key()).toString();
_pNativeVirtualBinderKey = event->nativeVirtualKey();
update();
}
QWidget::keyPressEvent(event);
}
void ElaKeyBinderContainer::focusOutEvent(QFocusEvent* event)
{
QWidget::focusOutEvent(event);
setFocus();
}
void ElaKeyBinderContainer::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.save();
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
// 顶部提示绘制
painter.setPen(ElaThemeColor(_themeMode, BasicText));
painter.drawText(QRect(20, 20, width(), 50), Qt::AlignLeft | Qt::AlignTop, u8"按下任意按键以进行绑定");
if (_pBinderKeyText.isEmpty())
{
painter.restore();
return;
}
// 中心文字背景绘制
painter.setPen(ElaThemeColor(_themeMode, BasicBorder));
painter.setBrush(ElaThemeColor(_themeMode, PrimaryNormal));
qreal textWidth = fontMetrics().horizontalAdvance(_pBinderKeyText) * 1.3;
qreal textHeight = fontMetrics().height() * 1.2;
textWidth = qMax(textWidth, 35.0);
textHeight = qMax(textHeight, 35.0);
painter.drawRoundedRect(QRectF((width() - textWidth) / 2.0, rect().center().y() + 10, textWidth, textHeight), 5, 5);
// 文字绘制
painter.setPen(ElaThemeColor(_themeMode, BasicTextInvert));
painter.drawText(QRectF((width() - textWidth) / 2.0, rect().center().y() + 10, textWidth, textHeight), Qt::AlignCenter, _pBinderKeyText);
painter.restore();
}