#include "numkeydia.h" #include "ui_numkeydia.h" #include #include #include #include #include #include #include namespace { void loadKeyboardStyleSheet(QWidget *widget) { if(!widget) { return; } QFile file(QStringLiteral(":/commonWidget.qss")); if(!file.open(QFile::ReadOnly | QFile::Text)) { qDebug() << QStringLiteral("Unable to load keyboard stylesheet"); return; } QTextStream stream(&file); widget->setStyleSheet(stream.readAll()); } } NumKeyDia *NumKeyDia::singleton = nullptr; NumKeyDia::NumKeyDia(QWidget *parent) : QDialog(parent), ui(new Ui::NumKeyDia) { loadKeyboardStyleSheet(this); if(singleton != nullptr) { return; } singleton = this; ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); ui->lineEdit_input->setFocusPolicy(Qt::StrongFocus); auto _btnInputList = ui->widget_input->findChildren(); foreach (auto &i, _btnInputList) { connect(i, &QPushButton::clicked, this, &NumKeyDia::btn_input_clicked); i->setFocusPolicy(Qt::NoFocus); } auto *returnShortcut = new QShortcut(QKeySequence(Qt::Key_Return), this); connect(returnShortcut, &QShortcut::activated, this, &NumKeyDia::on_btn_ok_clicked); auto *enterShortcut = new QShortcut(QKeySequence(Qt::Key_Enter), this); connect(enterShortcut, &QShortcut::activated, this, &NumKeyDia::on_btn_ok_clicked); ui->toolButton_ico->installEventFilter(this); ui->label_appInfo->installEventFilter(this); ui->btn_clear->setText(QStringLiteral("<")); setInputPage(InputPage::NumberPage); } NumKeyDia::~NumKeyDia() { if(singleton == this) { singleton = nullptr; } delete ui; } bool NumKeyDia::eventFilter(QObject *, QEvent *event) { if(event->type() == QEvent::MouseButtonPress) { auto *mouseEvent = static_cast(event); m_point = mouseEvent->globalPos() - frameGeometry().topLeft(); } else if(event->type() == QEvent::MouseMove) { auto *mouseEvent = static_cast(event); move(mouseEvent->globalPos() - m_point); } return false; } void NumKeyDia::setValue(const QString &value) { this->value = value; setInputPage(InputPage::NumberPage); ui->lineEdit_input->setFocus(); ui->lineEdit_input->setText(value); ui->lineEdit_input->setCursorPosition(ui->lineEdit_input->text().size()); m_firstInputFlag = true; } QString &NumKeyDia::getValue() { return value; } void NumKeyDia::on_btn_ok_clicked() { QString _res = ui->lineEdit_input->text(); if(_res.isEmpty()) { _res = QStringLiteral("0"); } value = _res; closeKeyBoard(); } void NumKeyDia::on_btn_cancel_clicked() { closeKeyBoard(); } void NumKeyDia::on_btn_clear_clicked() { m_firstInputFlag = false; const int currentPosition = ui->lineEdit_input->cursorPosition(); ui->lineEdit_input->setCursorPosition(qMax(0, currentPosition - 1)); ui->lineEdit_input->setFocus(); } void NumKeyDia::on_btn_back_clicked() { m_firstInputFlag = false; int _index = ui->lineEdit_input->cursorPosition(); QString _currentText = ui->lineEdit_input->text(); if(_currentText.isEmpty()) { ui->lineEdit_input->setFocus(); } if(_index != 0) { _currentText.remove(_index - 1, 1); ui->lineEdit_input->setText(_currentText); } ui->lineEdit_input->setFocus(); ui->lineEdit_input->setCursorPosition(qMax(0, _index - 1)); } void NumKeyDia::btn_input_clicked() { auto *_btnClicked = qobject_cast(sender()); if(!_btnClicked) { return; } if(_btnClicked->property("isModeSwitch").toBool()) { const auto nextPage = (m_inputPage == InputPage::NumberPage) ? InputPage::SymbolPage : InputPage::NumberPage; setInputPage(nextPage); ui->lineEdit_input->setFocus(); return; } if(m_firstInputFlag) { ui->lineEdit_input->clear(); m_firstInputFlag = false; } const QString _inputValue = _btnClicked->property("inputValue").toString(); if(_inputValue.isEmpty()) { ui->lineEdit_input->setFocus(); return; } int _index = ui->lineEdit_input->cursorPosition(); QString _currentText = ui->lineEdit_input->text(); _currentText.insert(_index, _inputValue); ui->lineEdit_input->setText(_currentText); ui->lineEdit_input->setFocus(); ui->lineEdit_input->setCursorPosition(_index + _inputValue.size()); } void NumKeyDia::closeKeyBoard() { this->close(); } void NumKeyDia::setInputPage(InputPage page) { m_inputPage = page; refreshInputButtons(); } void NumKeyDia::refreshInputButtons() { if(m_inputPage == InputPage::NumberPage) { configureInputButton(ui->btn_1, QStringLiteral("1"), QStringLiteral("1"), true); configureInputButton(ui->btn_2, QStringLiteral("2"), QStringLiteral("2"), true); configureInputButton(ui->btn_3, QStringLiteral("3"), QStringLiteral("3"), true); configureInputButton(ui->btn_4, QStringLiteral("4"), QStringLiteral("4"), true); configureInputButton(ui->btn_5, QStringLiteral("5"), QStringLiteral("5"), true); configureInputButton(ui->btn_6, QStringLiteral("6"), QStringLiteral("6"), true); configureInputButton(ui->btn_7, QStringLiteral("7"), QStringLiteral("7"), true); configureInputButton(ui->btn_8, QStringLiteral("8"), QStringLiteral("8"), true); configureInputButton(ui->btn_9, QStringLiteral("9"), QStringLiteral("9"), true); configureInputButton(ui->btn_sub, QStringLiteral("#+="), QString(), true, true); configureInputButton(ui->btn_0, QStringLiteral("0"), QStringLiteral("0"), true); configureInputButton(ui->pushButton_dot, QStringLiteral("."), QStringLiteral("."), true); return; } configureInputButton(ui->btn_1, QStringLiteral("/"), QStringLiteral("/"), true); configureInputButton(ui->btn_2, QStringLiteral("-"), QStringLiteral("-"), true); configureInputButton(ui->btn_3, QStringLiteral(":"), QStringLiteral(":"), true); const QString degreeSymbol(QChar(0x00B0)); configureInputButton(ui->btn_4, degreeSymbol, degreeSymbol, true); configureInputButton(ui->btn_5, QStringLiteral("'"), QStringLiteral("'"), true); configureInputButton(ui->btn_6, QStringLiteral("\""), QStringLiteral("\""), true); configureInputButton(ui->btn_7, QStringLiteral("."), QStringLiteral("."), true); configureInputButton(ui->btn_8, QStringLiteral("_"), QStringLiteral("_"), true); configureInputButton(ui->btn_9, QStringLiteral("@"), QStringLiteral("@"), true); configureInputButton(ui->btn_sub, QStringLiteral("123"), QString(), true, true); configureInputButton(ui->btn_0, QStringLiteral("+"), QStringLiteral("+"), true); configureInputButton(ui->pushButton_dot, QStringLiteral(","), QStringLiteral(","), true); } void NumKeyDia::configureInputButton(QPushButton *button, const QString &label, const QString &value, bool enabled, bool isModeSwitch) { if(!button) { return; } button->setText(label); button->setEnabled(enabled); button->setProperty("inputValue", value); button->setProperty("isModeSwitch", isModeSwitch); } namespace KeyBoard { NumKeyDia *app() { return NumKeyDia::instance(); }; };