1616
1717#include " qgsoptionsdialogbase.h"
1818
19+ #include < QCheckBox>
1920#include < QDialog>
2021#include < QDialogButtonBox>
22+ #include < QGroupBox>
23+ #include < QLabel>
2124#include < QLayout>
2225#include < QListWidget>
26+ #include < QListWidgetItem>
2327#include < QMessageBox>
28+ #include < QPainter>
2429#include < QScrollBar>
25- #include < QStackedWidget>
2630#include < QSplitter>
31+ #include < QStackedWidget>
2732#include < QTimer>
2833
2934
35+ #include " qgsfilterlineedit.h"
36+
37+ #include " qgslogger.h"
38+
3039QgsOptionsDialogBase::QgsOptionsDialogBase ( const QString& settingsKey, QWidget* parent, Qt::WindowFlags fl, QSettings* settings )
3140 : QDialog( parent, fl )
3241 , mOptsKey( settingsKey )
@@ -35,6 +44,7 @@ QgsOptionsDialogBase::QgsOptionsDialogBase( const QString& settingsKey, QWidget*
3544 , mOptStackedWidget( nullptr )
3645 , mOptSplitter( nullptr )
3746 , mOptButtonBox( nullptr )
47+ , mSearchLineEdit( nullptr )
3848 , mDialogTitle( QLatin1String( " " ) )
3949 , mIconOnly( false )
4050 , mSettings( settings )
@@ -92,6 +102,7 @@ void QgsOptionsDialogBase::initOptionsBase( bool restoreUi, const QString& title
92102 mOptSplitter = findChild<QSplitter*>( QStringLiteral ( " mOptionsSplitter" ) );
93103 mOptButtonBox = findChild<QDialogButtonBox*>( QStringLiteral ( " buttonBox" ) );
94104 QFrame* buttonBoxFrame = findChild<QFrame*>( QStringLiteral ( " mButtonBoxFrame" ) );
105+ mSearchLineEdit = findChild<QgsFilterLineEdit*>( " mSearchLineEdit" );
95106
96107 if ( !mOptListWidget || !mOptStackedWidget || !mOptSplitter || !optionsFrame )
97108 {
@@ -130,6 +141,12 @@ void QgsOptionsDialogBase::initOptionsBase( bool restoreUi, const QString& title
130141 connect ( mOptStackedWidget , SIGNAL ( currentChanged ( int ) ), this , SLOT ( optionsStackedWidget_CurrentChanged ( int ) ) );
131142 connect ( mOptStackedWidget , SIGNAL ( widgetRemoved ( int ) ), this , SLOT ( optionsStackedWidget_WidgetRemoved ( int ) ) );
132143
144+ if ( mSearchLineEdit )
145+ {
146+ mSearchLineEdit ->setShowSearchIcon ( true );
147+ connect ( mSearchLineEdit , &QgsFilterLineEdit::textChanged, this , &QgsOptionsDialogBase::searchText );
148+ }
149+
133150 mInit = true ;
134151
135152 if ( restoreUi )
@@ -196,6 +213,70 @@ void QgsOptionsDialogBase::restoreOptionsBaseUi( const QString& title )
196213 mOptListWidget ->setAttribute ( Qt::WA_MacShowFocusRect, false );
197214}
198215
216+ void QgsOptionsDialogBase::searchText ( QString text )
217+ {
218+ if ( !mOptStackedWidget )
219+ return ;
220+
221+ mOptStackedWidget ->show ();
222+ if ( mOptButtonBox )
223+ mOptButtonBox ->show ();
224+ // hide all page if text has to be search, show them all otherwise
225+ for ( int r = 0 ; r < mOptListWidget ->count (); ++r )
226+ {
227+ mOptListWidget ->setRowHidden ( r, !text.isEmpty () );
228+ }
229+
230+ QPair< QgsSearchHighlightOptionWidget, int > rsw;
231+ Q_FOREACH ( rsw, mRegisteredSearchWidgets )
232+ {
233+ rsw.first .reset ();
234+ if ( !text.isEmpty () && rsw.first .searchHighlight ( text ) )
235+ {
236+ QgsDebugMsg ( QString ( " Found %1 in %2 (tab: %3)" )
237+ .arg ( text )
238+ .arg ( rsw.first .widgetName () )
239+ .arg ( mOptListWidget ->item ( rsw.second )->text () ) );
240+ mOptListWidget ->setRowHidden ( rsw.second , false );
241+ }
242+ }
243+
244+ if ( mOptListWidget ->isRowHidden ( mOptStackedWidget ->currentIndex () ) )
245+ {
246+ for ( int r = 0 ; r < mOptListWidget ->count (); ++r )
247+ {
248+ if ( !mOptListWidget ->isRowHidden ( r ) )
249+ {
250+ mOptListWidget ->setCurrentRow ( r );
251+ return ;
252+ }
253+ }
254+
255+ // if no page can be shown, hide stack widget
256+ mOptStackedWidget ->hide ();
257+ if ( mOptButtonBox )
258+ mOptButtonBox ->hide ();
259+ }
260+ }
261+
262+ void QgsOptionsDialogBase::registerTextSearch ()
263+ {
264+ mRegisteredSearchWidgets .clear ();
265+
266+ for ( int i = 0 ; i < mOptStackedWidget ->count (); i++ )
267+ {
268+ Q_FOREACH ( QWidget* w, mOptStackedWidget ->widget ( i )->findChildren <QWidget*>() )
269+ {
270+ QgsSearchHighlightOptionWidget shw = QgsSearchHighlightOptionWidget ( w );
271+ QgsDebugMsg ( QString ( " Registering: %1 %2" ).arg ( w->objectName () ).arg ( shw.isValid () ? " valid" : " invalid" ) );
272+ if ( shw.isValid () )
273+ {
274+ mRegisteredSearchWidgets .append ( qMakePair ( shw, i ) );
275+ }
276+ }
277+ }
278+ }
279+
199280void QgsOptionsDialogBase::showEvent ( QShowEvent* e )
200281{
201282 if ( mInit )
@@ -208,6 +289,11 @@ void QgsOptionsDialogBase::showEvent( QShowEvent* e )
208289 QTimer::singleShot ( 0 , this , SLOT ( warnAboutMissingObjects () ) );
209290 }
210291
292+ if ( mSearchLineEdit )
293+ {
294+ registerTextSearch ();
295+ }
296+
211297 QDialog::showEvent ( e );
212298}
213299
@@ -281,6 +367,8 @@ void QgsOptionsDialogBase::optionsStackedWidget_WidgetRemoved( int indx )
281367{
282368 // will need to take item first, if widgets are set for item in future
283369 delete mOptListWidget ->item ( indx );
370+
371+ registerTextSearch ();
284372}
285373
286374void QgsOptionsDialogBase::warnAboutMissingObjects ()
@@ -292,3 +380,91 @@ void QgsOptionsDialogBase::warnAboutMissingObjects()
292380 QMessageBox::Ok,
293381 QMessageBox::Ok );
294382}
383+
384+
385+ QgsSearchHighlightOptionWidget::QgsSearchHighlightOptionWidget ( QWidget* widget )
386+ : mWidget( nullptr )
387+ , mOriginalPalette( QPalette() )
388+ , mColorRole( QPalette::Window )
389+ , mColor( Qt::yellow )
390+ , mText( [=]( QWidget* ) {return QString ();} )
391+ {
392+ if ( !widget )
393+ {
394+ return ;
395+ }
396+
397+ if ( qobject_cast<QLabel*>( widget ) )
398+ {
399+ mColorRole = QPalette::Window;
400+ mText = [=]( QWidget * widget ) {return widget ? qobject_cast<QLabel*>( widget )->text () : QString (); };
401+ }
402+ else if ( qobject_cast<QCheckBox*>( widget ) )
403+ {
404+ mColorRole = QPalette::Button;
405+ mText = [=]( QWidget * widget ) {return widget ? qobject_cast<QCheckBox*>( widget )->text () : QString (); };
406+ }
407+ else if ( qobject_cast<QGroupBox*>( widget ) )
408+ {
409+ mColorRole = QPalette::WindowText;
410+ mText = [=]( QWidget * widget ) {return widget ? qobject_cast<QGroupBox*>( widget )->title () : QString (); };
411+ }
412+ else
413+ {
414+ return ;
415+ }
416+ mWidget = widget;
417+ mOriginalPalette = mWidget ->palette ();
418+ }
419+
420+ QgsSearchHighlightOptionWidget::~QgsSearchHighlightOptionWidget ()
421+ {
422+ }
423+
424+ bool QgsSearchHighlightOptionWidget::isValid ()
425+ {
426+ return mWidget ;
427+ }
428+
429+ bool QgsSearchHighlightOptionWidget::searchHighlight ( QString searchText )
430+ {
431+ bool found = false ;
432+ if ( !mWidget )
433+ return found;
434+
435+ if ( !searchText.isEmpty () )
436+ {
437+ QString origText = mText ( mWidget );
438+ if ( origText.contains ( searchText, Qt::CaseInsensitive ) )
439+ {
440+ found = true ;
441+ }
442+ }
443+
444+ if ( found )
445+ {
446+ QPalette pal ( mOriginalPalette );
447+ pal.setColor ( mColorRole , mColor );
448+
449+ mWidget ->setAutoFillBackground ( true );
450+ mWidget ->setPalette ( pal );
451+ }
452+
453+ return found;
454+ }
455+
456+ void QgsSearchHighlightOptionWidget::reset ()
457+ {
458+ if ( mWidget )
459+ {
460+ mWidget ->setPalette ( mOriginalPalette );
461+ }
462+ }
463+
464+ QString QgsSearchHighlightOptionWidget::widgetName ()
465+ {
466+ QString name;
467+ if ( mWidget )
468+ name = mWidget ->objectName ();
469+ return name;
470+ }
0 commit comments