From ff66b5e72094520cfe9db486ecb3994f7c1617de Mon Sep 17 00:00:00 2001 From: Till Adam Date: Fri, 3 Oct 2003 15:45:29 +0000 Subject: [PATCH] Use a combobox of available status values instead of an entry widget when searching/filtering for status. This is not as clean as I would like it to be as I've simply special cased it in using a qwidgetstack, but it's not _that_ bad and does the job for 3.2 considering that the filter stuff is scheduled to be redesigned soon after anyhow. Marc, can you live with this? svn path=/trunk/kdepim/; revision=255940 --- kmsearchpattern.cpp | 4 +- kmsearchpatternedit.cpp | 99 ++++++++++++++++++++++++++++++++++++++--- kmsearchpatternedit.h | 14 ++++-- 3 files changed, 106 insertions(+), 11 deletions(-) diff --git a/kmsearchpattern.cpp b/kmsearchpattern.cpp index 2640f2c21..e1051d177 100644 --- a/kmsearchpattern.cpp +++ b/kmsearchpattern.cpp @@ -429,8 +429,8 @@ KMSearchRuleStatus::KMSearchRuleStatus( const QCString & field, Function func, const QString & aContents ) : KMSearchRule(field, func, aContents) { - // FIXME do this more elegantly once we have a drop down for selecting stati in - // the gui. + // the values are always in english, both from the conf file as well as + // the patternedit gui if ( ! aContents.compare("new") ) mStatus = KMMsgStatusNew; if ( ! aContents.compare("unread") ) diff --git a/kmsearchpatternedit.cpp b/kmsearchpatternedit.cpp index 50257c515..896288c69 100644 --- a/kmsearchpatternedit.cpp +++ b/kmsearchpatternedit.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include @@ -47,7 +48,12 @@ void KMSearchRuleWidget::initWidget() mRuleField = new QComboBox( true, this, "mRuleField" ); mRuleFunc = new QComboBox( false, this, "mRuleFunc" ); + mValueWidgetStack = new QWidgetStack( this, "mValueWidgetStack" ); mRuleValue = new KLineEdit( this, "mRuleValue" ); + mStati = new QComboBox( false, this, "mStati" ); + mValueWidgetStack->addWidget( mRuleValue ); + mValueWidgetStack->addWidget( mStati ); + mValueWidgetStack->raiseWidget( mRuleValue ); if( !KTrader::self()->query("KRegExpEditor/KRegExpEditor").isEmpty() ) { mRuleEditBut = new QPushButton( i18n("Edit..."), this, "mRuleEditBut" ); @@ -64,6 +70,11 @@ void KMSearchRuleWidget::initWidget() mRuleField->setSizeLimit( mRuleField->count() ); mRuleField->adjustSize(); + mStati->insertStringList( mStatiList ); + mStati->adjustSize(); + + connect( mRuleField, SIGNAL(activated(int)), + this, SLOT(slotRuleChanged(int)) ); connect( mRuleField, SIGNAL(textChanged(const QString &)), this, SIGNAL(fieldChanged(const QString &)) ); connect( mRuleValue, SIGNAL(textChanged(const QString &)), @@ -107,8 +118,14 @@ void KMSearchRuleWidget::setRule(KMSearchRule *aRule) //--------------set function and contents mRuleFunc->setCurrentItem( (int)aRule->function() ); - mRuleValue->setText( aRule->contents() ); - + //--------------special case status search + if ( i == indexOfRuleField( "" ) ) { + mValueWidgetStack->raiseWidget( mStati ); + mStati->setCurrentItem( indexOfStatus( aRule->contents() ) ); + } else { + mValueWidgetStack->raiseWidget( mRuleValue ); + mRuleValue->setText( aRule->contents() ); + } if (mRuleEditBut) functionChanged( (int)aRule->function() ); @@ -116,10 +133,15 @@ void KMSearchRuleWidget::setRule(KMSearchRule *aRule) } KMSearchRule* KMSearchRuleWidget::rule() const { - return KMSearchRule::createInstance( - ruleFieldToEnglish( mRuleField->currentText() ), - (KMSearchRule::Function)mRuleFunc->currentItem(), - mRuleValue->text() ); + QCString ruleField = ruleFieldToEnglish( mRuleField->currentText() ); + QString text = 0; + if ( ruleField == "" ) + text = mStati->currentText(); + else + text = mRuleValue->text(); + + return KMSearchRule::createInstance( ruleField, + (KMSearchRule::Function)mRuleFunc->currentItem(), text ); } void KMSearchRuleWidget::reset() @@ -132,7 +154,9 @@ void KMSearchRuleWidget::reset() mRuleFunc->setCurrentItem( 0 ); if (mRuleEditBut) mRuleEditBut->setEnabled( false ); + mValueWidgetStack->raiseWidget( mRuleValue ); mRuleValue->clear(); + mStati->setCurrentItem( 0 ); blockSignals(FALSE); } @@ -148,6 +172,24 @@ QCString KMSearchRuleWidget::ruleFieldToEnglish(const QString & i18nVal) { return i18nVal.latin1(); } +QCString KMSearchRuleWidget::statusToEnglish(const QString & i18nVal) { + if (i18nVal == i18n("new")) return "new"; + if (i18nVal == i18n("unread")) return "unread"; + if (i18nVal == i18n("read")) return "read"; + if (i18nVal == i18n("old")) return "old"; + if (i18nVal == i18n("deleted")) return "deleted"; + if (i18nVal == i18n("replied")) return "replied"; + if (i18nVal == i18n("forwarded")) return "forwarded"; + if (i18nVal == i18n("queued")) return "queued"; + if (i18nVal == i18n("sent")) return "sent"; + if (i18nVal == i18n("important")) return "important"; + if (i18nVal == i18n("watched")) return "watched"; + if (i18nVal == i18n("ignored")) return "ignored"; + if (i18nVal == i18n("todo")) return "todo"; + return i18nVal.latin1(); +} + + int KMSearchRuleWidget::indexOfRuleField( const QString & aName ) const { int i; @@ -161,6 +203,20 @@ int KMSearchRuleWidget::indexOfRuleField( const QString & aName ) const { return i; } +int KMSearchRuleWidget::indexOfStatus( const QString & aStatus ) const { + int i; + + if ( aStatus.isEmpty() ) return -1; + + QString i18n_aName = i18n( aStatus.latin1() ); + + for (i=mStatiList.count()-1; i>=0; i--) { + if (*(mStatiList.at(i))==i18n_aName) break; + } + return i; +} + + void KMSearchRuleWidget::initLists(bool headersOnly, bool absoluteDates) { //---------- initialize list of filter operators @@ -207,8 +263,39 @@ void KMSearchRuleWidget::initLists(bool headersOnly, bool absoluteDates) mFilterFieldList.append("X-Mailing-List"); mFilterFieldList.append("X-Spam-Flag"); } + + //---------- initialize list of stati + if ( mStatiList.isEmpty() ) + { + mStatiList.append( "" ); + mStatiList.append( i18n( "new" ) ); + mStatiList.append( i18n( "unread" ) ); + mStatiList.append( i18n( "read" ) ); + mStatiList.append( i18n( "old" ) ); + mStatiList.append( i18n( "deleted" ) ); + mStatiList.append( i18n( "replied" ) ); + mStatiList.append( i18n( "forwarded" ) ); + mStatiList.append( i18n( "queued" ) ); + mStatiList.append( i18n( "sent" ) ); + mStatiList.append( i18n( "important" ) ); + mStatiList.append( i18n( "watched" ) ); + mStatiList.append( i18n( "ignored" ) ); + mStatiList.append( i18n( "todo" ) ); + } +} + +void KMSearchRuleWidget::slotRuleChanged( int ruleIndex ) +{ + if ( ruleIndex == indexOfRuleField( "" ) ) { + mRuleValue->clear(); + mValueWidgetStack->raiseWidget( mStati ); + } else { + mStati->setCurrentItem( 0 ); + mValueWidgetStack->raiseWidget( mRuleValue ); + } } + //============================================================================= // // class KMFilterActionWidgetLister (the filter action editor) diff --git a/kmsearchpatternedit.h b/kmsearchpatternedit.h index 1a335eb5a..30dbd9c26 100644 --- a/kmsearchpatternedit.h +++ b/kmsearchpatternedit.h @@ -22,6 +22,7 @@ class QComboBox; class QLineEdit; class QRadioButton; class QPushButton; +class QWidgetStack; /** A widget to edit a single KMSearchRule. It consists of an editable @ref QComboBox for the field, @@ -69,15 +70,20 @@ signals: protected: /** Used internally to translate i18n-ized pseudo-headers back to - english */ + english. */ static QCString ruleFieldToEnglish(const QString & i18nVal); + /** Used internally to translate i18n-ized status strings back to + english. */ + static QCString statusToEnglish(const QString & i18nVal); /** Used internally to find the corresponding index into the field ComboBox. Returns the index if found or -1 if the search failed, */ int indexOfRuleField(const QString & aName) const; + int indexOfStatus(const QString & aStatus) const; protected slots: void editRegExp(); void functionChanged( int which ); + void slotRuleChanged( int which ); private: void initWidget(); @@ -85,10 +91,12 @@ private: QComboBox* mRuleField; QComboBox* mRuleFunc; - QLineEdit* mRuleValue; + QWidgetStack* mValueWidgetStack; + QLineEdit* mRuleValue; // used for all but status searches + QComboBox* mStati; // special case of a status search QPushButton* mRuleEditBut; QDialog* mRegExpEditDialog; - QStringList mFilterFieldList, mFilterFuncList; + QStringList mFilterFieldList, mFilterFuncList, mStatiList; };