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:
Ursprung
06a2d46ccc
Commit
7315ed9fb3
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
Laden…
x
In neuem Issue referenzieren
Einen Benutzer sperren