From be192c8d5036fdbd6a744f12367536a0f99f7f2d Mon Sep 17 00:00:00 2001 From: ali kettab Date: Wed, 9 Nov 2022 22:12:07 +0100 Subject: [PATCH] Make wxQtEnsureSignalsBlocked available to all wxQt classes and use it instead of using a pair of calls to blockSignals() --- include/wx/qt/private/winevent.h | 24 ++++++++++++++++++++++++ src/qt/calctrl.cpp | 6 ++---- src/qt/checklst.cpp | 9 ++++----- src/qt/choice.cpp | 3 +-- src/qt/notebook.cpp | 16 ++++------------ src/qt/scrolbar.cpp | 7 ++++--- src/qt/slider.cpp | 9 +++------ src/qt/spinctrl.cpp | 6 ++---- src/qt/treectrl.cpp | 28 +++------------------------- src/qt/window.cpp | 7 ++++--- 10 files changed, 51 insertions(+), 64 deletions(-) diff --git a/include/wx/qt/private/winevent.h b/include/wx/qt/private/winevent.h index e28fd85470..7b0913c4e3 100644 --- a/include/wx/qt/private/winevent.h +++ b/include/wx/qt/private/winevent.h @@ -458,4 +458,28 @@ protected: } }; +// RAII wrapper for blockSignals(). It blocks signals in its constructor and in +// the destructor it restores the state to what it was before the constructor ran. +class wxQtEnsureSignalsBlocked +{ +public: + // Use QObject instead of QWidget to avoid including from here. + wxQtEnsureSignalsBlocked(QObject *widget) : + m_widget(widget) + { + m_restore = m_widget->blockSignals(true); + } + + ~wxQtEnsureSignalsBlocked() + { + m_widget->blockSignals(m_restore); + } + +private: + QObject* const m_widget; + bool m_restore; + + wxDECLARE_NO_COPY_CLASS(wxQtEnsureSignalsBlocked); +}; + #endif diff --git a/src/qt/calctrl.cpp b/src/qt/calctrl.cpp index 25484d7944..d98f38e24b 100644 --- a/src/qt/calctrl.cpp +++ b/src/qt/calctrl.cpp @@ -137,9 +137,8 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& date) wxQtConvertDate( date ) < m_qtCalendar->minimumDate() ) return false; - m_qtCalendar->blockSignals(true); + wxQtEnsureSignalsBlocked blocker(m_qtCalendar); m_qtCalendar->setSelectedDate(wxQtConvertDate(date)); - m_qtCalendar->blockSignals(false); return true; } @@ -158,10 +157,9 @@ bool wxCalendarCtrl::SetDateRange(const wxDateTime& lowerdate, if ( !m_qtCalendar ) return false; - m_qtCalendar->blockSignals(true); + wxQtEnsureSignalsBlocked blocker(m_qtCalendar); m_qtCalendar->setMinimumDate(wxQtConvertDate(lowerdate)); m_qtCalendar->setMaximumDate(wxQtConvertDate(upperdate)); - m_qtCalendar->blockSignals(false); return true; } diff --git a/src/qt/checklst.cpp b/src/qt/checklst.cpp index 255dc0a65b..249af11888 100644 --- a/src/qt/checklst.cpp +++ b/src/qt/checklst.cpp @@ -9,6 +9,7 @@ #include "wx/wxprec.h" #include "wx/checklst.h" +#include "wx/qt/private/winevent.h" #include @@ -80,13 +81,11 @@ bool wxCheckListBox::IsChecked(unsigned int n) const void wxCheckListBox::Check(unsigned int n, bool check ) { - // Prevent the emission of wxEVT_CHECKLISTBOX event by temporarily block all - // signals on m_qtListWidget object. QSignalBlocker can be used instead when - // Qt 5.3 becomes the minimum supprted version. - const bool wasBlocked = m_qtListWidget->blockSignals(true); + // Prevent the emission of wxEVT_CHECKLISTBOX event by temporarily blocking all + // signals on m_qtListWidget object. + wxQtEnsureSignalsBlocked blocker(m_qtListWidget); QListWidgetItem* item = m_qtListWidget->item(n); wxCHECK_RET(item != nullptr, wxT("wrong listbox index") ); item->setCheckState(check ? Qt::Checked : Qt::Unchecked); - m_qtListWidget->blockSignals(wasBlocked); } diff --git a/src/qt/choice.cpp b/src/qt/choice.cpp index 43eb30c5d3..fc04100d0f 100644 --- a/src/qt/choice.cpp +++ b/src/qt/choice.cpp @@ -174,9 +174,8 @@ void wxChoice::SetString(unsigned int n, const wxString& s) void wxChoice::SetSelection(int n) { - m_qtComboBox->blockSignals(true); + wxQtEnsureSignalsBlocked blocker(m_qtComboBox); m_qtComboBox->setCurrentIndex(n); - m_qtComboBox->blockSignals(false); } int wxChoice::GetSelection() const diff --git a/src/qt/notebook.cpp b/src/qt/notebook.cpp index 094ac3af2b..7c78615d57 100644 --- a/src/qt/notebook.cpp +++ b/src/qt/notebook.cpp @@ -178,15 +178,11 @@ bool wxNotebook::DeleteAllPages() // Block signals to not receive selection changed updates // which are sent by Qt after the selected page was deleted. - m_qtTabWidget->blockSignals(true); + wxQtEnsureSignalsBlocked blocker(m_qtTabWidget); // Pages will be deleted one by one in the base class. // There's no need to explicitly clear() the Qt control. - bool deleted = wxNotebookBase::DeleteAllPages(); - - m_qtTabWidget->blockSignals(false); - - return deleted; + return wxNotebookBase::DeleteAllPages(); } int wxNotebook::SetSelection(size_t page) @@ -206,13 +202,9 @@ int wxNotebook::ChangeSelection(size_t nPage) { // ChangeSelection() is not supposed to generate events, unlike // SetSelection(). - m_qtTabWidget->blockSignals(true); + wxQtEnsureSignalsBlocked blocker(m_qtTabWidget); - const int selOld = SetSelection(nPage); - - m_qtTabWidget->blockSignals(false); - - return selOld; + return SetSelection(nPage); } wxWindow *wxNotebook::DoRemovePage(size_t page) diff --git a/src/qt/scrolbar.cpp b/src/qt/scrolbar.cpp index 7a2fcd9f98..44caa965b6 100644 --- a/src/qt/scrolbar.cpp +++ b/src/qt/scrolbar.cpp @@ -101,9 +101,10 @@ void wxScrollBar::SetScrollbar(int position, int WXUNUSED(thumbSize), { m_qtScrollBar->setRange( 0, range - pageSize ); m_qtScrollBar->setPageStep( pageSize ); - m_qtScrollBar->blockSignals(true); - m_qtScrollBar->setValue( position ); - m_qtScrollBar->blockSignals(false); + { + wxQtEnsureSignalsBlocked blocker(m_qtScrollBar); + m_qtScrollBar->setValue( position ); + } m_qtScrollBar->show(); } else diff --git a/src/qt/slider.cpp b/src/qt/slider.cpp index 657bf95d43..3833ad4ff3 100644 --- a/src/qt/slider.cpp +++ b/src/qt/slider.cpp @@ -77,9 +77,8 @@ bool wxSlider::Create(wxWindow *parent, m_qtSlider->setInvertedAppearance( style & wxSL_INVERSE ); - m_qtSlider->blockSignals(true); + wxQtEnsureSignalsBlocked blocker(m_qtSlider); SetRange( minValue, maxValue ); - m_qtSlider->blockSignals(false); SetPageSize(wxMax(1, (maxValue - minValue) / 10)); #if 0 // there are not normally ticks for a wxSlider @@ -105,16 +104,14 @@ int wxSlider::GetValue() const void wxSlider::SetValue(int value) { - m_qtSlider->blockSignals(true); + wxQtEnsureSignalsBlocked blocker(m_qtSlider); m_qtSlider->setValue( value ); - m_qtSlider->blockSignals(false); } void wxSlider::SetRange(int minValue, int maxValue) { - m_qtSlider->blockSignals(true); + wxQtEnsureSignalsBlocked blocker(m_qtSlider); m_qtSlider->setRange( minValue, maxValue ); - m_qtSlider->blockSignals(false); } int wxSlider::GetMin() const diff --git a/src/qt/spinctrl.cpp b/src/qt/spinctrl.cpp index ce927e2c2c..35f718955b 100644 --- a/src/qt/spinctrl.cpp +++ b/src/qt/spinctrl.cpp @@ -67,17 +67,15 @@ wxString wxSpinCtrlQt< T, Widget >::GetTextValue() const template< typename T, typename Widget > void wxSpinCtrlQt< T, Widget >::SetValue( T val ) { - m_qtSpinBox->blockSignals(true); + wxQtEnsureSignalsBlocked blocker(m_qtSpinBox); m_qtSpinBox->setValue( val ); - m_qtSpinBox->blockSignals(false); } template< typename T, typename Widget > void wxSpinCtrlQt< T, Widget >::SetRange( T min, T max ) { - m_qtSpinBox->blockSignals(true); + wxQtEnsureSignalsBlocked blocker(m_qtSpinBox); m_qtSpinBox->setRange( min, max ); - m_qtSpinBox->blockSignals(false); } template< typename T, typename Widget > diff --git a/src/qt/treectrl.cpp b/src/qt/treectrl.cpp index b6fffa2404..5b6fe397d0 100644 --- a/src/qt/treectrl.cpp +++ b/src/qt/treectrl.cpp @@ -357,9 +357,8 @@ private: if ( !changingEvent.IsAllowed() ) { - blockSignals(true); + wxQtEnsureSignalsBlocked blocker(this); setCurrentItem(previous); - blockSignals(false); return; } @@ -398,9 +397,8 @@ private: if ( !collapsingEvent.IsAllowed() ) { - blockSignals(true); + wxQtEnsureSignalsBlocked blocker(this); item->setExpanded(true); - blockSignals(false); return; } @@ -423,9 +421,8 @@ private: if ( !expandingEvent.IsAllowed() ) { - blockSignals(true); + wxQtEnsureSignalsBlocked blocker(this); item->setExpanded(false); - blockSignals(false); return; } @@ -1116,25 +1113,6 @@ void wxTreeCtrl::Delete(const wxTreeItemId& item) delete qTreeItem; } -class wxQtEnsureSignalsBlocked -{ -public: - wxQtEnsureSignalsBlocked(QWidget *widget) : - m_widget(widget) - { - m_restore = m_widget->blockSignals(true); - } - - ~wxQtEnsureSignalsBlocked() - { - m_widget->blockSignals(m_restore); - } - -private: - QWidget *m_widget; - bool m_restore; -}; - void wxTreeCtrl::DeleteChildren(const wxTreeItemId& item) { wxCHECK_RET(item.IsOk(), "invalid tree item"); diff --git a/src/qt/window.cpp b/src/qt/window.cpp index bbf50af80f..d1f38af5d1 100644 --- a/src/qt/window.cpp +++ b/src/qt/window.cpp @@ -745,9 +745,10 @@ void wxWindowQt::SetScrollbar( int orientation, int pos, int thumbvisible, int r { scrollBar->setRange( 0, range - thumbvisible ); scrollBar->setPageStep( thumbvisible ); - scrollBar->blockSignals( true ); - scrollBar->setValue(pos); - scrollBar->blockSignals( false ); + { + wxQtEnsureSignalsBlocked blocker(scrollBar); + scrollBar->setValue(pos); + } scrollBar->show(); if ( HasFlag(wxALWAYS_SHOW_SB) && (range == 0) )