client: BoardWidget rework NXButton timer

- Now release timer is stopped when pressing a third button
  which becomes first button of new pair.

- Timer is also stopped when editing mode is enabled

- Hold timer is stopped if same button is clicked again
Dieser Commit ist enthalten in:
Filippo Gentile 2024-04-19 17:40:37 +02:00
Ursprung 06a2d46ccc
Commit 7315ed9fb3
2 geänderte Dateien mit 78 neuen und 21 gelöschten Zeilen

Datei anzeigen

@ -92,6 +92,7 @@ BoardWidget::BoardWidget(std::shared_ptr<Board> object, QWidget* parent) :
m_editActions{new QActionGroup(this)}
, m_tileMoveStarted{false}
, m_tileResizeStarted{false}
, m_timer(nullptr)
{
setWindowIcon(Theme::getIconForClassId(object->classId));
setFocusPolicy(Qt::StrongFocus);
@ -447,6 +448,8 @@ BoardWidget::BoardWidget(std::shared_ptr<Board> object, QWidget* parent) :
BoardWidget::~BoardWidget()
{
stopTimerAndReleaseButtons();
if(m_nxManagerRequestId != Connection::invalidRequestId)
{
m_object->connection()->cancelRequest(m_nxManagerRequestId);
@ -459,6 +462,10 @@ void BoardWidget::worldEditChanged(bool value)
m_editActionNone->activate(QAction::Trigger);
m_toolbarEdit->setVisible(value);
m_statusBar->setVisible(value);
// Stop timers in edit mode
if(value)
stopTimerAndReleaseButtons();
}
void BoardWidget::gridChanged(BoardAreaWidget::Grid value)
@ -650,7 +657,8 @@ void BoardWidget::tileClicked(int16_t x, int16_t y)
if(nxButton->isPressed())
{
releaseNXButton(nxButton);
stopTimerAndReleaseButtons();
return;
}
else
{
@ -669,31 +677,13 @@ void BoardWidget::tileClicked(int16_t x, int16_t y)
m_nxButtonPressed.reset();
QTimer::singleShot(nxButtonReleaseDelay, this,
[this, weak1=std::weak_ptr<NXButtonRailTile>(firstButton), weak2=std::weak_ptr<NXButtonRailTile>(nxButton)]()
{
if(auto btn = weak1.lock())
{
releaseNXButton(btn);
}
if(auto btn = weak2.lock())
{
releaseNXButton(btn);
}
});
startReleaseTimer(firstButton, nxButton);
}
else
{
m_nxButtonPressed = nxButton;
QTimer::singleShot(nxButtonHoldTime, this,
[this, weak=std::weak_ptr<NXButtonRailTile>(nxButton)]()
{
if(auto btn = weak.lock())
{
releaseNXButton(btn);
}
});
startHoldTimer(nxButton);
}
}
}
@ -778,6 +768,61 @@ void BoardWidget::rightClicked()
rotateTile(true);
}
void BoardWidget::startHoldTimer(const std::shared_ptr<NXButtonRailTile>& nxButton)
{
stopTimerAndReleaseButtons();
m_releaseButton1 = nxButton;
m_timer = new QTimer(this);
m_timer->setInterval(nxButtonHoldTime);
m_timer->setSingleShot(true);
connect(m_timer, &QTimer::timeout, this, &BoardWidget::stopTimerAndReleaseButtons);
m_timer->start();
}
void BoardWidget::startReleaseTimer(const std::shared_ptr<NXButtonRailTile> &firstButton,
const std::shared_ptr<NXButtonRailTile> &nxButton)
{
// Do not release first button yet
m_releaseButton1.reset();
stopTimerAndReleaseButtons();
m_releaseButton1 = firstButton;
m_releaseButton2 = nxButton;
m_timer = new QTimer(this);
m_timer->setInterval(nxButtonReleaseDelay);
m_timer->setSingleShot(true);
connect(m_timer, &QTimer::timeout, this, &BoardWidget::stopTimerAndReleaseButtons);
m_timer->start();
}
void BoardWidget::stopTimerAndReleaseButtons()
{
if(m_timer)
{
// Instantly release buttons
if(auto btn = m_releaseButton1.lock())
{
releaseNXButton(btn);
}
m_releaseButton1.reset();
if(auto btn = m_releaseButton2.lock())
{
releaseNXButton(btn);
}
m_releaseButton2.reset();
delete m_timer;
m_timer = nullptr;
}
}
void BoardWidget::actionSelected(const Board::TileInfo* info)
{
m_boardArea->setMouseMoveAction(BoardAreaWidget::MouseMoveAction::None);

Datei anzeigen

@ -36,6 +36,7 @@ class QStatusBar;
class QLabel;
struct TileInfo;
class NXButtonRailTile;
class QTimer;
class BoardWidget : public QWidget
{
@ -78,11 +79,22 @@ class BoardWidget : public QWidget
TileRotate m_tileRotateLast = TileRotate::Deg0; //!< Last used tile rotate for add/move
std::weak_ptr<NXButtonRailTile> m_nxButtonPressed;
QTimer *m_timer;
std::weak_ptr<NXButtonRailTile> m_releaseButton1;
std::weak_ptr<NXButtonRailTile> m_releaseButton2;
void startHoldTimer(const std::shared_ptr<NXButtonRailTile> &nxButton);
void startReleaseTimer(const std::shared_ptr<NXButtonRailTile> &firstButton,
const std::shared_ptr<NXButtonRailTile> &nxButton);
void actionSelected(const Board::TileInfo* tile);
void keyPressEvent(QKeyEvent* event) override;
void rotateTile(bool ccw = false);
void releaseNXButton(const std::shared_ptr<NXButtonRailTile>& nxButton);
protected slots:
void stopTimerAndReleaseButtons();
protected slots:
void worldEditChanged(bool value);
void gridChanged(BoardAreaWidget::Grid value);