// (c) 2006 Giovanni Venturi // See COPYING file for licensing information. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "amarokcore/amarokconfig.h" #include "collectiondb.h" #include "debug.h" #include "editfilterdialog.h" #include "metabundle.h" EditFilterDialog::EditFilterDialog( TQWidget* parent, bool metaBundleKeywords, const TQString &text ) : KDialogBase( Plain, i18n("Edit Filter"), User1|User2|Default|Ok|Cancel, Cancel, parent, "editfilter", /*modal*/true, /*separator*/false ), m_minMaxRadio(0), m_filterText(text) { // Redefine "Default" button KGuiItem defaultButton( i18n("&Append"), "add" ); setButtonWhatsThis( Default, i18n( "

By clicking here you can add the defined condition. The \"OK\" button will " "close the dialog and apply the defined filter. With this button you can add more than " "one condition to create a more complex filtering condition.

" ) ); setButtonTip(Default, i18n( "Add this filter condition to the list" ) ); setButtonGuiItem( Default, defaultButton ); // define "User1" button KGuiItem user1Button( i18n("&Clear"), "remove" ); setButtonWhatsThis( User1, i18n( "

By clicking here you will clear the filter. If you intend to " "undo the last appending just click on the \"Undo\" button.

" ) ); setButtonTip(User1, i18n( "Clear the filter" ) ); setButtonGuiItem( User1, user1Button ); // define "User2" button KGuiItem user2Button( i18n("this \"undo\" will undo the last appended filter... be careful how you will translate it " "to avoid two buttons (\"Cancel\" and \"Undo\") with same label in the same dialog", "&Undo"), "undo" ); setButtonWhatsThis( User2, i18n( "

Clicking here will remove the last appended filter. " "You cannot undo more than one action.

" ) ); setButtonTip(User2, i18n( "Remove last appended filter" ) ); setButtonGuiItem( User2, user2Button ); m_mainLay = new TQVBoxLayout( plainPage() ); m_mainLay->activate(); // no filter rule available m_appended = false; // text explanation of this dialog TQLabel *label1 = new TQLabel( plainPage(), "label1" ); label1->setText( i18n("

Edit the filter for finding tracks with specific attributes" ", e.g. you can look for a track that has a length of three minutes.

") ); m_mainLay->addWidget( label1 ); m_mainLay->addItem( new TQSpacerItem( 10, 10, TQSizePolicy::Expanding, TQSizePolicy::Minimum ) ); // choosing keyword filtering TQHBoxLayout *keywordLayout = new TQHBoxLayout( plainPage() ); TQLabel *label3 = new TQLabel( i18n("Attribute:"), plainPage(), "label3" ); TQWhatsThis::add( label3, i18n("you can translate the keyword as you will do for the combobox", "

Here you can choose to Simple Search directly or to use " "some keywords to specify some attributes, such as the artist name " "and so on. The keywords selectable are divided by their specific value. " "Some keywords are numeric and others are alphanumeric. You do not need " "to know it directly. When a keyword is numeric it will be used to search " "the numeric data for each track.

The alphanumeric " "keywords are the following: album, artist, filename " " (including path), mountpoint (e.g. /home/user1), filetype " " (you can specify mp3, ogg, flac, ... and the file extensions will be matched), " "genre, comment, composer, directory, lyrics, " "title, and label.

" "

The numeric keywords are: bitrate, disc/discnumber, " "length (expressed in seconds), playcount, rating, " "samplerate, score, size/filesize (expressed in bytes, " "kbytes, and megabytes as specified in the unit for the filesize keyword), " "track (i.e. the track number), and year.

") ); keywordLayout->addWidget( label3 ); keywordLayout->addItem( new TQSpacerItem( 5, 10, TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); m_comboKeyword = new TQComboBox( plainPage(), "keywordComboBox"); TQToolTip::add( m_comboKeyword, i18n("Select an attribute for the filter") ); label3->setBuddy( m_comboKeyword ); m_comboKeyword->insertItem( i18n("Simple Search") ); m_vector.push_back("Simple Search"); if( metaBundleKeywords ) { for( int i=0; i < MetaBundle::NUM_COLUMNS; ++i ) { if( i == MetaBundle::Mood ) continue; if( !AmarokConfig::useRatings() && i == MetaBundle::Rating ) continue; if( !AmarokConfig::useScores() && i == MetaBundle::Score ) continue; m_comboKeyword->insertItem( MetaBundle::prettyColumnName( i ) ); m_vector.push_back( MetaBundle::exactColumnName( i ).lower() ); } } else { m_comboKeyword->insertItem( i18n("Album") ); m_vector.push_back( "album" ); m_comboKeyword->insertItem( i18n("Artist") ); m_vector.push_back( "artist" ); m_comboKeyword->insertItem( i18n("Bitrate") ); m_vector.push_back( "bitrate" ); m_comboKeyword->insertItem( i18n("BPM") ); m_vector.push_back( "bpm" ); m_comboKeyword->insertItem( i18n("Comment") ); m_vector.push_back( "comment" ); m_comboKeyword->insertItem( i18n("Composer") ); m_vector.push_back( "composer" ); m_comboKeyword->insertItem( i18n("Directory") ); m_vector.push_back( "directory" ); m_comboKeyword->insertItem( i18n("Disc Number") ); m_vector.push_back( "disc" ); m_comboKeyword->insertItem( i18n("Filename") ); m_vector.push_back( "filename" ); m_comboKeyword->insertItem( i18n("Mount Point") ); m_vector.push_back( "mountpoint" ); m_comboKeyword->insertItem( i18n("Filetype") ); m_vector.push_back( "filetype" ); m_comboKeyword->insertItem( i18n("Genre") ); m_vector.push_back( "genre" ); m_comboKeyword->insertItem( i18n("Length") ); m_vector.push_back( "length" ); m_comboKeyword->insertItem( i18n("Label") ); m_vector.push_back( "label" ); m_comboKeyword->insertItem( i18n("Lyrics") ); m_vector.push_back( "lyrics" ); m_comboKeyword->insertItem( i18n("Play Count") ); m_vector.push_back( "playcount" ); if( AmarokConfig::useRatings() ) { m_comboKeyword->insertItem( i18n("Rating") ); m_vector.push_back( "rating" ); } m_comboKeyword->insertItem( i18n("Sample Rate") ); m_vector.push_back( "samplerate" ); if( AmarokConfig::useScores() ) { m_comboKeyword->insertItem( i18n("Score") ); m_vector.push_back( "score" ); } m_comboKeyword->insertItem( i18n("File Size") ); m_vector.push_back( "size" ); m_comboKeyword->insertItem( i18n("Title") ); m_vector.push_back( "title" ); m_comboKeyword->insertItem( i18n("Track") ); m_vector.push_back( "track" ); m_comboKeyword->insertItem( i18n("Year") ); m_vector.push_back( "year" ); } // the "Simple Search" text is selected in the comboKeyword m_selectedIndex = 0; keywordLayout->addWidget( m_comboKeyword ); keywordLayout->addItem( new TQSpacerItem( 5, 10, TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); m_editKeyword = new KLineEdit( plainPage(), "editKeywordBox" ); TQWhatsThis::add( m_editKeyword, i18n("

Type the attribute value or the text to look for here.

") ); keywordLayout->addWidget( m_editKeyword ); m_mainLay->addLayout( keywordLayout ); m_mainLay->addItem( new TQSpacerItem( 10, 10, TQSizePolicy::Expanding, TQSizePolicy::Minimum ) ); connect(m_comboKeyword, TQT_SIGNAL(activated(int)), this, TQT_SLOT(selectedKeyword(int))); // group of options on numeric attribute keywords: a value <,>,= ... or a value between Min and Max m_groupBox = new TQGroupBox( plainPage(), "groupBox" ); m_groupBox->setTitle( i18n( "Attribute value is" ) ); m_mainLay->addWidget( m_groupBox ); m_mainLay->addItem( new TQSpacerItem( 10, 10, TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); TQVBoxLayout *vertLayout = new TQVBoxLayout( m_groupBox, 15, 5 ); // choose other keyword parameters: smaller than, greater than, equal to... TQHBoxLayout *paramLayout = new TQHBoxLayout( vertLayout ); m_comboCondition = new TQComboBox( m_groupBox, "valuecondition"); m_comboCondition->insertItem( i18n("smaller than") ); m_comboCondition->insertItem( i18n("larger than") ); m_comboCondition->insertItem( i18n("equal to") ); m_comboCondition->insertItem( i18n("between") ); paramLayout->addWidget( m_comboCondition ); paramLayout->addItem( new TQSpacerItem( 5, 10, TQSizePolicy::Fixed, TQSizePolicy::Minimum ) ); m_spinMin1 = new TQSpinBox( m_groupBox, "minimum1" ); paramLayout->addWidget( m_spinMin1 ); paramLayout->addItem( new TQSpacerItem( 5, 10, TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); m_spinMin2 = new TQSpinBox( m_groupBox, "minimum2" ); paramLayout->addWidget( m_spinMin2 ); paramLayout->addItem( new TQSpacerItem( 5, 10, TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); connect(m_spinMin1, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(minSpinChanged(int))); m_andLabel = new TQLabel( i18n("and"), m_groupBox, "andLabel"); paramLayout->addWidget( m_andLabel ); paramLayout->addItem( new TQSpacerItem( 5, 10, TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); m_spinMax1 = new TQSpinBox( m_groupBox, "maximum1" ); paramLayout->addWidget( m_spinMax1 ); paramLayout->addItem( new TQSpacerItem( 5, 10, TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); m_spinMax2 = new TQSpinBox( m_groupBox, "maximum2" ); paramLayout->addWidget( m_spinMax2 ); connect(m_spinMax1, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(maxSpinChanged(int))); TQHBoxLayout *filesizeLayout = new TQHBoxLayout( vertLayout ); filesizeLayout->setAlignment( AlignLeft ); m_filesizeLabel = new TQLabel( i18n("Unit:"), m_groupBox, "filesizeLabel"); filesizeLayout->addWidget( m_filesizeLabel ); filesizeLayout->addItem( new TQSpacerItem( 5, 10, TQSizePolicy::Fixed, TQSizePolicy::Minimum ) ); m_comboUnitSize = new TQComboBox( m_groupBox, "comboUnitSize" ); m_filesizeLabel->setBuddy( m_comboUnitSize ); m_comboUnitSize->insertItem( i18n("B (1 Byte)") ); m_comboUnitSize->insertItem( i18n("KB (1024 Bytes)") ); m_comboUnitSize->insertItem( i18n("MB (1024 KB)") ); filesizeLayout->addWidget( m_comboUnitSize ); // type text selected textWanted(); // check the "One Value Choosing" by default chooseOneValue(); connect( m_comboCondition, TQT_SIGNAL(activated(int)), TQT_SLOT(chooseCondition(int)) ); TQHBoxLayout *otherOptionsLayout = new TQHBoxLayout( plainPage() ); otherOptionsLayout->setAlignment( AlignHCenter ); m_mainLay->addLayout( otherOptionsLayout ); // the groupbox to select the action filter m_groupBox2 = new TQGroupBox( plainPage(), "groupBox2" ); m_groupBox2->setTitle( i18n( "Filter action" ) ); otherOptionsLayout->addWidget( m_groupBox2 ); TQVBoxLayout* ratioLay = new TQVBoxLayout( m_groupBox2, 15, 0 ); m_checkALL = new TQRadioButton( i18n("Match all words"), m_groupBox2, "checkall" ); TQToolTip::add( m_checkALL, i18n("

Check this box to look for the tracks that contain all the words you typed " "in the related Simple Search edit box

")); ratioLay->addWidget( m_checkALL ); m_checkAtLeastOne = new TQRadioButton( i18n("Match any word"), m_groupBox2, "checkor"); TQToolTip::add( m_checkAtLeastOne, i18n("

Check this box to look for the tracks that contain at least one of the words " "you typed in the related Simple Search edit box

")); ratioLay->addWidget( m_checkAtLeastOne ); m_checkExactly = new TQRadioButton( i18n("Exact match"), m_groupBox2, "checkexactly"); TQToolTip::add( m_checkExactly, i18n("

Check this box to look for all the tracks that contain exactly the words you typed " "in the related Simple Search edit box

")); ratioLay->addWidget( m_checkExactly ); m_checkExclude = new TQRadioButton( i18n("Exclude"), m_groupBox2, "checkexclude"); TQToolTip::add( m_checkExclude, i18n("

Check this box to look for all the tracks that do not contain the words you typed " "in the related Simple Search edit box

")); ratioLay->addWidget( m_checkExclude ); m_actionCheck << m_checkALL; m_actionCheck << m_checkAtLeastOne; m_actionCheck << m_checkExactly; m_actionCheck << m_checkExclude; connect( m_checkALL, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotCheckAll()) ); connect( m_checkAtLeastOne, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotCheckAtLeastOne()) ); connect( m_checkExactly, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotCheckExactly()) ); connect( m_checkExclude, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotCheckExclude()) ); // check "select all words" as default slotCheckAll(); // some vertical space otherOptionsLayout->addItem( new TQSpacerItem( 50, 5, TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); TQVBoxLayout* verticalCondLay = new TQVBoxLayout( otherOptionsLayout, 15, 0 ); m_groupBox3 = new TQGroupBox( plainPage(), "groupBox3" ); m_groupBox3->setTitle( i18n( "Appending condition" ) ); verticalCondLay->addWidget( m_groupBox3 ); TQVBoxLayout* ratioLay2 = new TQVBoxLayout( m_groupBox3, 15, 0 ); m_checkAND = new TQRadioButton( i18n("AND logic condition", "AND"), m_groupBox3, "checkAND" ); TQToolTip::add( m_checkAND, i18n("

Check this box if you want to add another condition and you want that the filter " "to match both the previous conditions and this new one

")); ratioLay2->addWidget( m_checkAND ); m_checkOR = new TQRadioButton( i18n("OR logic condition", "OR"), m_groupBox3, "checkOR" ); TQToolTip::add( m_checkOR, i18n("

Check this box if you want to add another condition and you want that the filter " "to match either the previous conditions or this new one

")); ratioLay2->addWidget( m_checkOR ); otherOptionsLayout->addItem( new TQSpacerItem( 10, 10, TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); m_prefixNOT = new TQCheckBox( i18n("Invert condition"), plainPage(), "prefixNOT" ); TQToolTip::add( m_prefixNOT, i18n("Check this box to negate the defined filter condition")); TQWhatsThis::add( m_prefixNOT, i18n("

If this option is checked the defined filter condition will be negated. " "This means that, for example, you can define a filter that looks for all " "tracks that are not of a specific album, artist, and so on.

")); verticalCondLay->addWidget( m_prefixNOT ); m_prefixNOT->setEnabled( false ); connect(m_prefixNOT, TQT_SIGNAL(clicked()), TQT_SLOT(assignPrefixNOT())); m_mainLay->addItem( new TQSpacerItem( 10, 20, TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); // you need to append at least one filter condition to specify if do // an "AND" or an "OR" with the next condition if the filter is empty if (m_filterText.isEmpty()) m_groupBox3->setEnabled( false ); connect( m_checkAND, TQT_SIGNAL(clicked()), TQT_SLOT(slotCheckAND()) ); connect( m_checkOR, TQT_SIGNAL(clicked()), TQT_SLOT(slotCheckOR()) ); // check "AND" condition as default slotCheckAND(); // setup Min Max Value spin setMinMaxValueSpins(); } EditFilterDialog::~EditFilterDialog() { delete m_editKeyword; } TQString EditFilterDialog::filter() const { return m_filterText; } void EditFilterDialog::exclusiveSelectOf( int which ) { int size = static_cast( m_actionCheck.count() ); for ( int i = 0; i < size; i++ ) if ( i != which ) m_actionCheck[i]->setChecked( false ); else m_actionCheck[i]->setChecked( true ); } TQString EditFilterDialog::keywordConditionString(const TQString& keyword) const { // this member is called when there is a keyword that needs numeric attributes TQString result, unit; if (m_vector.at(m_selectedIndex) == "size") switch (m_comboUnitSize->currentItem()) { case 1: // kbytes unit = "k"; break; case 2: // mbytes unit = "m"; break; } switch(m_comboCondition->currentItem()) { case 0: // less than... result = m_strPrefixNOT + keyword + ":<"; if (keyword == "length") result += TQString::number( m_spinMin1->value() * 60 + m_spinMin2->value() ) + unit; else result += m_spinMin1->text() + unit; break; case 1: // greater than... result = m_strPrefixNOT + keyword + ":>"; if (keyword == "length") result += TQString::number( m_spinMin1->value() * 60 + m_spinMin2->value() ) + unit; else result += m_spinMin1->text() + unit; break; case 2: // equal to... if (keyword == "length") result = m_strPrefixNOT + "length:" + TQString::number( m_spinMin1->value() * 60 + m_spinMin2->value() ) + unit; else { if (m_strPrefixNOT.isEmpty()) result = keyword + ":>" + TQString::number(m_spinMin1->value() - 1) + unit + " " + keyword + ":<" + TQString::number(m_spinMin1->value() + 1) + unit; else result = keyword + ":<" + TQString::number(m_spinMin1->value()) + unit + " OR " + keyword + ":>" + TQString::number(m_spinMin1->value()) + unit; } break; case 3: // between... if (keyword == "length") { if (m_strPrefixNOT.isEmpty()) result = "length:>" + TQString::number( m_spinMin1->value() * 60 + m_spinMin2->value() - 1) + unit + " length:<" + TQString::number( m_spinMax1->value() * 60 + m_spinMax2->value() + 1) + unit; else result = "length:<" + TQString::number( m_spinMin1->value() * 60 + m_spinMin2->value()) + unit + " OR length:>" + TQString::number( m_spinMax1->value() * 60 + m_spinMax2->value()) + unit; } else { if (m_strPrefixNOT.isEmpty()) result = keyword + ":>" + TQString::number(m_spinMin1->value() - 1) + unit + " " + keyword + ":<" + TQString::number(m_spinMax1->value() + 1) + unit; else result = keyword + ":<" + TQString::number(m_spinMin1->value() - 1) + unit + " OR " + keyword + ":>" + TQString::number(m_spinMax1->value() + 1) + unit; } break; } return result; } void EditFilterDialog::setMinMaxValueSpins() { // setting some spin box options and limit values m_spinMin1->setValue( 0 ); m_spinMin1->setMinValue( 0 ); m_spinMin1->setMaxValue( 100000000 ); m_spinMin2->setMinValue( 0 ); m_spinMin2->setMaxValue( 59 ); m_spinMin2->hide(); m_spinMax1->setValue( 0 ); m_spinMax1->setMinValue( 0 ); m_spinMax1->setMaxValue( 100000000 ); m_spinMax2->setMinValue( 0 ); m_spinMax2->setMaxValue( 59 ); m_spinMax2->hide(); // fix tooltip TQToolTip::add( m_spinMin1, "" ); TQToolTip::add( m_spinMin2, i18n("Seconds") ); TQToolTip::add( m_spinMax1, "" ); TQToolTip::add( m_spinMax2, i18n("Seconds") ); } // SLOTS void EditFilterDialog::selectedKeyword(int index) // SLOT { debug() << "you selected index " << index << ": '" << m_comboKeyword->text(index) << "'" << endl; m_groupBox2->setEnabled( false ); m_comboUnitSize->setEnabled( false ); m_filesizeLabel->setEnabled( false ); m_prefixNOT->setEnabled( true ); setMinMaxValueSpins(); const TQString key = m_vector[index]; if( index == 0 ) { // Simple Search m_groupBox2->setEnabled( true ); m_prefixNOT->setEnabled( false ); textWanted(); } else if( key=="bitrate" ) { // bitrate: set useful values for the spinboxes m_spinMin1->setValue( 128 ); m_spinMax1->setValue( 384 ); valueWanted(); } else if( key=="samplerate" ) { // samplerate: set useful values for the spinboxes m_spinMin1->setValue( 8000 ); m_spinMax1->setValue( 48000 ); valueWanted(); } else if( key=="length" ) { // length: set useful values for the spinboxes m_spinMin2->show(); m_spinMax2->show(); m_spinMin1->setValue( 1 ); m_spinMax1->setValue( 5 ); TQToolTip::add( m_spinMin1, i18n("Minutes") ); TQToolTip::add( m_spinMax1, i18n("Minutes") ); // fix the maximum values to reduce spinboxes size m_spinMin1->setMaxValue( 240 ); m_spinMax1->setMaxValue( 240 ); valueWanted(); } else if( key=="size" || key=="filesize" ) { // size: set useful values for the spinboxes m_filesizeLabel->setEnabled( true ); m_comboUnitSize->setEnabled( true ); m_spinMin1->setValue( 1 ); m_spinMax1->setValue( 3 ); m_comboUnitSize->setCurrentItem( 2 ); valueWanted(); } else if( key=="year" ) { // year: set useful values for the spinboxes m_spinMin1->setValue( 1900 ); m_spinMax1->setValue( TQDate::currentDate().year() ); valueWanted(); } else if( key=="track" || key=="disc" || key=="discnumber" ) { // track/disc: set useful values for the spinboxes m_spinMin1->setValue( 1 ); m_spinMax1->setValue( 15 ); valueWanted(); } else if( key=="playcount" || key=="lastplayed" || key=="rating" || key=="score" || key=="bpm" ) { valueWanted(); } else if( key=="label" ) textWanted( CollectionDB::instance()->labelList() ); else if( key=="album" ) textWanted( CollectionDB::instance()->albumList() ); else if( key=="artist" ) textWanted( CollectionDB::instance()->artistList() ); else if( key=="composer" ) textWanted( CollectionDB::instance()->composerList() ); else if( key=="genre" ) textWanted( CollectionDB::instance()->genreList() ); else if( key=="type" || key=="filetype" ) { TQStringList types; types << "mp3" << "flac" << "ogg" << "aac" << "m4a" << "mp4" << "mp2" << "ac3" << "wav" << "asf" << "wma"; textWanted( types ); } else textWanted(); // assign the correct value to the m_strPrefixNOT assignPrefixNOT(); // assign the right index m_selectedIndex = index; } void EditFilterDialog::minSpinChanged(int value) // SLOT { if (value > m_spinMax1->value()) m_spinMax1->setValue(value); } void EditFilterDialog::maxSpinChanged(int value) // SLOT { if (m_spinMin1->value() > value) m_spinMin1->setValue(value); } void EditFilterDialog::textWanted() // SLOT { m_editKeyword->setEnabled( true ); m_groupBox->setEnabled( false ); m_editKeyword->completionObject()->clear(); } void EditFilterDialog::textWanted( const TQStringList &completion ) // SLOT { m_editKeyword->setEnabled( true ); m_groupBox->setEnabled( false ); m_editKeyword->completionObject()->clear(); m_editKeyword->completionObject()->insertItems( completion ); m_editKeyword->completionObject()->setIgnoreCase( true ); m_editKeyword->setCompletionMode( KGlobalSettings::CompletionPopup ); } void EditFilterDialog::valueWanted() // SLOT { m_editKeyword->setEnabled( false ); m_groupBox->setEnabled( true ); } void EditFilterDialog::chooseCondition( int condition ) // SLOT { if( condition == 3 ) // included between chooseMinMaxValue(); else chooseOneValue(); } void EditFilterDialog::chooseOneValue() // SLOT { m_andLabel->setEnabled( false); m_spinMax1->setEnabled( false ); m_spinMax2->setEnabled( false ); } void EditFilterDialog::chooseMinMaxValue() // SLOT { m_andLabel->setEnabled( true ); m_spinMax1->setEnabled( true ); m_spinMax2->setEnabled( true ); } void EditFilterDialog::slotCheckAll() // SLOT { exclusiveSelectOf( 0 ); } void EditFilterDialog::slotCheckAtLeastOne() // SLOT { exclusiveSelectOf( 1 ); } void EditFilterDialog::slotCheckExactly() // SLOT { exclusiveSelectOf( 2 ); } void EditFilterDialog::slotCheckExclude() // SLOT { exclusiveSelectOf( 3 ); } void EditFilterDialog::slotCheckAND() // SLOT { m_checkAND->setChecked( true ); m_checkOR->setChecked( false ); } void EditFilterDialog::slotCheckOR() // SLOT { m_checkAND->setChecked( false ); m_checkOR->setChecked( true ); } void EditFilterDialog::assignPrefixNOT() // SLOT { if (m_prefixNOT->isChecked()) m_strPrefixNOT = "-"; else m_strPrefixNOT = ""; } void EditFilterDialog::slotDefault() // SLOT { // now append the filter rule if not empty if (m_editKeyword->text().isEmpty() && (m_selectedIndex == 0)) { KMessageBox::sorry( 0, i18n("

Sorry but the filter rule cannot be set. The text field is empty. " "Please type something into it and retry.

"), i18n("Empty Text Field")); m_editKeyword->setFocus(); return; } if (!m_appended) { // it's the first rule m_appended = true; m_groupBox3->setEnabled( true ); } m_previousFilterText = m_filterText; if (!m_filterText.isEmpty()) { m_filterText += " "; if (m_checkOR->isChecked()) m_filterText += "OR "; } TQStringList list = TQStringList::split( " ", m_editKeyword->text() ); const TQString key = m_vector[m_selectedIndex]; if( m_selectedIndex == 0 ) { // Simple Search debug() << "selected text: '" << m_editKeyword->text() << "'" << endl; if (m_actionCheck[0]->isChecked()) { // all words m_filterText += m_editKeyword->text(); } else if (m_actionCheck[1]->isChecked()) { // at least one word m_filterText += *(list.begin()); for ( TQStringList::Iterator it = ++list.begin(); it != list.end(); ++it ) m_filterText += " OR " + *it; } else if (m_actionCheck[2]->isChecked()) { // exactly the words m_filterText += "\"" + m_editKeyword->text() + "\""; } else if (m_actionCheck[3]->isChecked()) { // exclude words for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it ) m_filterText += " -" + *it; } } else if( key=="bitrate" || key=="disc" || key=="discnumber" || key=="length" || key=="playcount" || key=="rating" || key=="samplerate" || key=="score" || key=="filesize" || key=="size" || key=="track" || key=="year" ) { m_filterText += keywordConditionString( m_vector[m_selectedIndex] ); } else { m_filterText += m_vector[m_selectedIndex] + ":\"" + m_editKeyword->text() + "\""; } emit filterChanged( m_filterText ); m_editKeyword->clear(); } void EditFilterDialog::slotUser1() // SLOT { m_previousFilterText = m_filterText; m_filterText = ""; // no filter appended cause all cleared m_appended = false; m_groupBox3->setEnabled( false ); emit filterChanged( m_filterText ); } void EditFilterDialog::slotUser2() // SLOT { m_filterText = m_previousFilterText; if (m_filterText.isEmpty()) { // no filter appended cause all cleared m_appended = false; m_groupBox3->setEnabled( false ); } emit filterChanged( m_filterText ); } void EditFilterDialog::slotOk() // SLOT { // If there's a filter typed in but unadded, add it. // This makes it easier to just add one condition - you only need to press OK. if ( !m_editKeyword->text().isEmpty() ) slotDefault(); // Don't let OK do anything if they haven't set any filters. if (m_appended) accept(); } #include "editfilterdialog.moc"