diff --git a/cockatrice/src/abstractcounter.cpp b/cockatrice/src/abstractcounter.cpp index 247f5b91..2054b3c1 100644 --- a/cockatrice/src/abstractcounter.cpp +++ b/cockatrice/src/abstractcounter.cpp @@ -8,8 +8,10 @@ #include #include #include +#include #include #include +#include AbstractCounter::AbstractCounter(Player *_player, int _id, @@ -160,24 +162,59 @@ void AbstractCounter::incrementCounter() void AbstractCounter::setCounter() { - bool ok; dialogSemaphore = true; - QString expression = QInputDialog::getText(nullptr, tr("Set counter"), tr("New value for counter '%1':").arg(name), - QLineEdit::Normal, QString::number(value), &ok); - - Expression exp(value); - int newValue = static_cast(exp.parse(expression)); + AbstractCounterDialog dialog(name, QString::number(value)); + const int ok = dialog.exec(); if (deleteAfterDialog) { deleteLater(); return; } dialogSemaphore = false; + if (!ok) return; + Expression exp(value); + int newValue = static_cast(exp.parse(dialog.textValue())); + Command_SetCounter cmd; cmd.set_counter_id(id); cmd.set_value(newValue); player->sendGameCommand(cmd); } + +AbstractCounterDialog::AbstractCounterDialog(const QString &name, const QString &value) : QInputDialog(nullptr) +{ + setWindowTitle(tr("Set counter")); + setLabelText(tr("New value for counter '%1':").arg(name)); + setTextValue(value); + qApp->installEventFilter(this); +} + +bool AbstractCounterDialog::eventFilter(QObject *obj, QEvent *event) +{ + Q_UNUSED(obj); + if (event->type() == QEvent::KeyPress) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) { + case Qt::Key_Up: + changeValue(+1); + return true; + case Qt::Key_Down: + changeValue(-1); + return true; + } + } + return false; +} + +void AbstractCounterDialog::changeValue(int diff) +{ + bool ok; + int curValue = textValue().toInt(&ok); + if (!ok) + return; + curValue += diff; + setTextValue(QString::number(curValue)); +} \ No newline at end of file diff --git a/cockatrice/src/abstractcounter.h b/cockatrice/src/abstractcounter.h index 2e592348..0cc723f4 100644 --- a/cockatrice/src/abstractcounter.h +++ b/cockatrice/src/abstractcounter.h @@ -2,10 +2,13 @@ #define COUNTER_H #include +#include class Player; -class QMenu; class QAction; +class QKeyEvent; +class QMenu; +class QString; class AbstractCounter : public QObject, public QGraphicsItem { @@ -74,4 +77,15 @@ public: } }; +class AbstractCounterDialog : public QInputDialog +{ + Q_OBJECT +public: + AbstractCounterDialog(const QString &name, const QString &value); + +protected: + bool eventFilter(QObject *obj, QEvent *event); + void changeValue(int diff); +}; + #endif