145 lines
4.0 KiB
C++
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();
|
|
}
|