Skip to content

Commit

Permalink
client: BoardWidget rework NXButton timer
Browse files Browse the repository at this point in the history
TODO: this could be done even better, now it's complex
  • Loading branch information
gfgit committed Apr 19, 2024
1 parent 88dd471 commit 10a058e
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 20 deletions.
116 changes: 96 additions & 20 deletions client/src/board/boardwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ BoardWidget::BoardWidget(std::shared_ptr<Board> object, QWidget* parent) :
m_editActions{new QActionGroup(this)}
, m_tileMoveStarted{false}
, m_tileResizeStarted{false}
, m_timer(nullptr)
, m_insideStopTimer(false)
{
setWindowIcon(Theme::getIconForClassId(object->classId));
setFocusPolicy(Qt::StrongFocus);
Expand Down Expand Up @@ -435,6 +437,8 @@ BoardWidget::BoardWidget(std::shared_ptr<Board> object, QWidget* parent) :

BoardWidget::~BoardWidget()
{
stopTimer();

if(m_nxManagerRequestId != Connection::invalidRequestId)
{
m_object->connection()->cancelRequest(m_nxManagerRequestId);
Expand All @@ -447,6 +451,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)
stopTimer();
}

void BoardWidget::gridChanged(BoardAreaWidget::Grid value)
Expand Down Expand Up @@ -647,31 +655,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);
}
}
}
Expand Down Expand Up @@ -752,6 +742,90 @@ void BoardWidget::rightClicked()
rotateTile(true);
}

void BoardWidget::startHoldTimer(const std::shared_ptr<NXButtonRailTile>& nxButton)
{
stopTimer();

m_timer = new QTimer(this);
m_timer->setInterval(nxButtonHoldTime);
m_timer->setSingleShot(true);

connect(m_timer, &QTimer::timeout, this, [this, weak=std::weak_ptr<NXButtonRailTile>(nxButton)]()
{
m_insideStopTimer = true;

if(auto btn = weak.lock())
{
releaseNXButton(btn);
}

m_insideStopTimer = false;

stopTimer();
});
}

void BoardWidget::startReleaseTimer(const std::shared_ptr<NXButtonRailTile> &firstButton,
const std::shared_ptr<NXButtonRailTile> &nxButton)
{
stopTimer();

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,
[this]()
{
m_insideStopTimer = true;

if(auto btn = m_releaseButton1.lock())
{
releaseNXButton(btn);
}
if(auto btn = m_releaseButton2.lock())
{
releaseNXButton(btn);
}

m_insideStopTimer = false;

stopTimer();
});
}

void BoardWidget::stopTimer()
{
if(m_timer)
{
if(!m_insideStopTimer)
{
m_insideStopTimer = true;

// 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();

m_insideStopTimer = false;
}

delete m_timer;
m_timer = nullptr;
}
}

void BoardWidget::actionSelected(const Board::TileInfo* info)
{
m_boardArea->setMouseMoveAction(BoardAreaWidget::MouseMoveAction::None);
Expand Down Expand Up @@ -817,6 +891,8 @@ void BoardWidget::rotateTile(bool ccw)

void BoardWidget::releaseNXButton(const std::shared_ptr<NXButtonRailTile>& nxButton)
{
stopTimer();

nxButton->setPressed(false);

if(m_nxButtonPressed.lock() == nxButton)
Expand Down
11 changes: 11 additions & 0 deletions client/src/board/boardwidget.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class QStatusBar;
class QLabel;
struct TileInfo;
class NXButtonRailTile;
class QTimer;

class BoardWidget : public QWidget
{
Expand Down Expand Up @@ -78,6 +79,16 @@ 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;
bool m_insideStopTimer;

void startHoldTimer(const std::shared_ptr<NXButtonRailTile> &nxButton);
void startReleaseTimer(const std::shared_ptr<NXButtonRailTile> &firstButton,
const std::shared_ptr<NXButtonRailTile> &nxButton);
void stopTimer();

void actionSelected(const Board::TileInfo* tile);
void keyPressEvent(QKeyEvent* event) override;
void rotateTile(bool ccw = false);
Expand Down

0 comments on commit 10a058e

Please sign in to comment.