From 063efbe693993e612e4f88e365dc380748b6e970 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 22 Jul 2022 11:54:45 +0200 Subject: [PATCH] Guard: Make it possible to lock/unlock manually Use it in some KitAspectWidget subclasses. Change-Id: Ie683d5af6a44d0042456418af729a3d718396803 Reviewed-by: hjk --- src/libs/utils/guard.cpp | 11 +++++++++++ src/libs/utils/guard.h | 6 ++++++ src/plugins/projectexplorer/kitinformation.cpp | 16 ++++++++-------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/libs/utils/guard.cpp b/src/libs/utils/guard.cpp index b1e220136ee..2f7d56d6c75 100644 --- a/src/libs/utils/guard.cpp +++ b/src/libs/utils/guard.cpp @@ -97,6 +97,17 @@ bool Guard::isLocked() const return m_lockCount; } +void Guard::lock() +{ + ++m_lockCount; +} + +void Guard::unlock() +{ + QTC_CHECK(m_lockCount > 0); + --m_lockCount; +} + GuardLocker::GuardLocker(Guard &guard) : m_guard(guard) { diff --git a/src/libs/utils/guard.h b/src/libs/utils/guard.h index 2f986d82b06..7a0ddbf5c53 100644 --- a/src/libs/utils/guard.h +++ b/src/libs/utils/guard.h @@ -38,6 +38,12 @@ public: Guard(); ~Guard(); bool isLocked() const; + + // Prefer using GuardLocker when possible. These two methods are provided only for cases + // when locking and unlocking are done in separate methods, so that GuardLocker can't be + // used. + void lock(); + void unlock(); private: int m_lockCount = 0; friend class GuardLocker; diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index 856905f3abe..d62e26601b1 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -946,23 +946,23 @@ private: void modelAboutToReset() { m_selectedId = m_model->deviceId(m_comboBox->currentIndex()); - m_ignoreChange = true; + m_ignoreChanges.lock(); } void modelReset() { m_comboBox->setCurrentIndex(m_model->indexForId(m_selectedId)); - m_ignoreChange = false; + m_ignoreChanges.unlock(); } void currentDeviceChanged() { - if (m_ignoreChange) + if (m_ignoreChanges.isLocked()) return; DeviceKitAspect::setDeviceId(m_kit, m_model->deviceId(m_comboBox->currentIndex())); } - bool m_ignoreChange = false; + Guard m_ignoreChanges; QComboBox *m_comboBox; QWidget *m_manageButton; DeviceManagerModel *m_model; @@ -1218,23 +1218,23 @@ private: void modelAboutToReset() { m_selectedId = m_model->deviceId(m_comboBox->currentIndex()); - m_ignoreChange = true; + m_ignoreChanges.lock(); } void modelReset() { m_comboBox->setCurrentIndex(m_model->indexForId(m_selectedId)); - m_ignoreChange = false; + m_ignoreChanges.unlock(); } void currentDeviceChanged() { - if (m_ignoreChange) + if (m_ignoreChanges.isLocked()) return; BuildDeviceKitAspect::setDeviceId(m_kit, m_model->deviceId(m_comboBox->currentIndex())); } - bool m_ignoreChange = false; + Guard m_ignoreChanges; QComboBox *m_comboBox; QWidget *m_manageButton; DeviceManagerModel *m_model;