From c69a94d955895af8e2dba84fd05e4755ba47837a Mon Sep 17 00:00:00 2001 From: Garux Date: Mon, 31 Jul 2023 10:39:59 +0600 Subject: [PATCH] fix Widget_connectToggleDependency: apply dependency effect on creation (preferences loading case; only has been working during manual toggling) Widget_connectToggleDependency: track checkbox graying out to allow chained dependencies --- radiant/dialog.cpp | 3 ++- radiant/dialog.h | 6 +++--- radiant/preferences.cpp | 21 +++++++++++++++++++-- radiant/preferences.h | 8 ++++---- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/radiant/dialog.cpp b/radiant/dialog.cpp index 6a96b634..509cbb2a 100644 --- a/radiant/dialog.cpp +++ b/radiant/dialog.cpp @@ -478,11 +478,12 @@ void Dialog::addRadioIcons( QGridLayout* grid, const char* name, int& data, Stri addRadioIcons( grid, name, icons, IntImportCaller( data ), IntExportCaller( data ) ); } -void Dialog::addTextEntry( QGridLayout* grid, const char* name, const StringImportCallback& importViewer, const StringExportCallback& exportViewer ){ +QWidget* Dialog::addTextEntry( QGridLayout* grid, const char* name, const StringImportCallback& importViewer, const StringExportCallback& exportViewer ){ auto entry = new QLineEdit; AddTextEntryData( *entry, importViewer, exportViewer ); DialogGrid_packRow( grid, entry, name ); + return entry; } void Dialog::addPathEntry( QGridLayout* grid, const char* name, bool browse_directory, const StringImportCallback& importViewer, const StringExportCallback& exportViewer ){ diff --git a/radiant/dialog.h b/radiant/dialog.h index 2b68fb20..dc87346b 100644 --- a/radiant/dialog.h +++ b/radiant/dialog.h @@ -145,9 +145,9 @@ public: void addRadio( QGridLayout *grid, const char* name, int& data, StringArrayRange names ); void addRadioIcons( QGridLayout *grid, const char* name, StringArrayRange icons, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ); void addRadioIcons( QGridLayout *grid, const char* name, int& data, StringArrayRange icons ); - void addTextEntry( QGridLayout *grid, const char* name, const StringImportCallback& importCallback, const StringExportCallback& exportCallback ); - void addEntry( QGridLayout *grid, const char* name, CopiedString& data ){ - addTextEntry( grid, name, StringImportCallback( StringImportCaller( data ) ), StringExportCallback( StringExportCaller( data ) ) ); + QWidget* addTextEntry( QGridLayout *grid, const char* name, const StringImportCallback& importCallback, const StringExportCallback& exportCallback ); + QWidget* addEntry( QGridLayout *grid, const char* name, CopiedString& data ){ + return addTextEntry( grid, name, StringImportCallback( StringImportCaller( data ) ), StringExportCallback( StringExportCaller( data ) ) ); } void addPathEntry( QGridLayout *grid, const char* name, bool browse_directory, const StringImportCallback& importCallback, const StringExportCallback& exportCallback ); void addPathEntry( QGridLayout *grid, const char* name, CopiedString& data, bool directory ); diff --git a/radiant/preferences.cpp b/radiant/preferences.cpp index e346a1db..e5112baf 100644 --- a/radiant/preferences.cpp +++ b/radiant/preferences.cpp @@ -557,11 +557,28 @@ void PreferencesDialog_addSettingsPage( const PreferenceGroupCallback& callback PreferenceGroupCallbacks_pushBack( g_settingsCallbacks, callback ); } -//! note: doesn't handle dependency on setting \p toggleButton insensitive void Widget_connectToggleDependency( QWidget* self, QCheckBox* toggleButton ){ - QObject::connect( toggleButton, &QCheckBox::stateChanged, [self, toggleButton]( int state ){ + class EnabledTracker : public QObject + { + QCheckBox *const m_checkbox; + QWidget *const m_dependent; + public: + EnabledTracker( QCheckBox *checkbox, QWidget *dependent ) : QObject( checkbox ), m_checkbox( checkbox ), m_dependent( dependent ){ + m_checkbox->installEventFilter( this ); + } + protected: + bool eventFilter( QObject *obj, QEvent *event ) override { + if( event->type() == QEvent::EnabledChange ) { + m_dependent->setEnabled( m_checkbox->checkState() && m_checkbox->isEnabled() ); + } + return QObject::eventFilter( obj, event ); // standard event processing + } + }; + new EnabledTracker( toggleButton, self ); // track graying out for chained dependencies + QObject::connect( toggleButton, &QCheckBox::stateChanged, [self, toggleButton]( int state ){ // track being checked self->setEnabled( state && toggleButton->isEnabled() ); } ); + self->setEnabled( toggleButton->checkState() && toggleButton->isEnabled() ); // apply dependency effect right away } void Widget_connectToggleDependency( QCheckBox* self, QCheckBox* toggleButton ){ Widget_connectToggleDependency( static_cast( self ), toggleButton ); diff --git a/radiant/preferences.h b/radiant/preferences.h index ae25df01..79cdb1cb 100644 --- a/radiant/preferences.h +++ b/radiant/preferences.h @@ -75,11 +75,11 @@ public: void appendRadioIcons( const char* name, int& data, StringArrayRange icons ){ m_dialog.addRadioIcons( m_grid, name, data, icons ); } - void appendEntry( const char* name, const StringImportCallback& importCallback, const StringExportCallback& exportCallback ){ - m_dialog.addTextEntry( m_grid, name, importCallback, exportCallback ); + QWidget* appendEntry( const char* name, const StringImportCallback& importCallback, const StringExportCallback& exportCallback ){ + return m_dialog.addTextEntry( m_grid, name, importCallback, exportCallback ); } - void appendEntry( const char* name, CopiedString& data ){ - m_dialog.addEntry( m_grid, name, data ); + QWidget* appendEntry( const char* name, CopiedString& data ){ + return m_dialog.addEntry( m_grid, name, data ); } void appendPathEntry( const char* name, bool browse_directory, const StringImportCallback& importCallback, const StringExportCallback& exportCallback ){ m_dialog.addPathEntry( m_grid, name, browse_directory, importCallback, exportCallback );