You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
263 lines
7.6 KiB
263 lines
7.6 KiB
#include "numkeydia.h"
|
|
#include "ui_numkeydia.h"
|
|
|
|
#include <QDebug>
|
|
#include <QFile>
|
|
#include <QMouseEvent>
|
|
#include <QPushButton>
|
|
#include <QShortcut>
|
|
#include <QTextStream>
|
|
#include <QtGlobal>
|
|
|
|
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<QPushButton *>();
|
|
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<QMouseEvent *>(event);
|
|
m_point = mouseEvent->globalPos() - frameGeometry().topLeft();
|
|
}
|
|
else if(event->type() == QEvent::MouseMove)
|
|
{
|
|
auto *mouseEvent = static_cast<QMouseEvent *>(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<QPushButton *>(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();
|
|
};
|
|
};
|
|
|