void APG::ConstraintSolver::receiveQueryMakerDone() { m_qm->deleteLater(); m_qm = 0; if (( m_domain.size() > 0 ) || m_domainReductionFailed ) { if ( m_domain.size() <= 0 ) { Amarok::Components::logger()->shortMessage( i18n("The playlist generator failed to load any tracks from the collection.") ); } m_readyToRun = true; emit readyToRun(); } else { Amarok::Components::logger()->longMessage( i18n("There are no tracks that match all constraints. " \ "The playlist generator will find the tracks that match best, " \ "but you may want to consider loosening the constraints to find more tracks.") ); m_domainReductionFailed = true; // need a new query maker without constraints m_qm = CollectionManager::instance()->queryMaker(); if ( m_qm ) { connect( m_qm, SIGNAL(newResultReady(Meta::TrackList)), this, SLOT(receiveQueryMakerData(Meta::TrackList)), Qt::QueuedConnection ); connect( m_qm, SIGNAL(queryDone()), this, SLOT(receiveQueryMakerDone()), Qt::QueuedConnection ); m_qm->setQueryType( Collections::QueryMaker::Track ); m_qm->run(); } } }
void IpodCopyTracksJob::slotStartDuplicateTrackSearch( const Meta::TrackPtr &track ) { Collections::QueryMaker *qm = m_coll.data()->queryMaker(); qm->setQueryType( Collections::QueryMaker::Track ); // we cannot qm->addMatch( track ) - it matches by uidUrl() qm->addFilter( Meta::valTitle, track->name(), true, true ); qm->addMatch( track->album() ); qm->setArtistQueryMode( Collections::QueryMaker::TrackArtists ); qm->addMatch( track->artist() ); qm->addMatch( track->composer() ); qm->addMatch( track->genre() ); qm->addMatch( track->year() ); qm->addNumberFilter( Meta::valTrackNr, track->trackNumber(), Collections::QueryMaker::Equals ); qm->addNumberFilter( Meta::valDiscNr, track->discNumber(), Collections::QueryMaker::Equals ); // we don't want to match by filesize, track length, filetype etc - these change during // transcoding. We don't match album artist because handling of it is inconsistent connect( qm, SIGNAL(newResultReady(Meta::TrackList)), SLOT(slotDuplicateTrackSearchNewResult(Meta::TrackList)) ); connect( qm, SIGNAL(queryDone()), SLOT(slotDuplicateTrackSearchQueryDone()) ); qm->setAutoDelete( true ); m_duplicateTrack = Meta::TrackPtr(); // reset duplicate track from previous query qm->run(); }
CoverManager::CoverManager( QWidget *parent ) : KDialog( parent ) , m_currentView( AllAlbums ) , m_timer( new QTimer( this ) ) //search filter timer , m_fetchingCovers( false ) , m_coversFetched( 0 ) , m_coverErrors( 0 ) , m_isLoadingCancelled( false ) { DEBUG_BLOCK setObjectName( "TheCoverManager" ); s_instance = this; // Sets caption and icon correctly (needed e.g. for GNOME) kapp->setTopWidget( this ); setButtons( 0 ); setCaption( i18n("Cover Manager") ); setAttribute( Qt::WA_DeleteOnClose ); connect( this, SIGNAL(hidden()), SLOT(delayedDestruct()) ); connect( this, SIGNAL(closeClicked()), SLOT(delayedDestruct()) ); m_splitter = new QSplitter( this ); setMainWidget( m_splitter ); //artist listview m_artistView = new QTreeWidget( m_splitter ); m_artistView->setHeaderLabel( i18n( "Albums By" ) ); m_artistView->setSortingEnabled( false ); m_artistView->setTextElideMode( Qt::ElideRight ); m_artistView->setMinimumWidth( 200 ); m_artistView->setColumnCount( 1 ); m_artistView->setAlternatingRowColors( true ); m_artistView->setUniformRowHeights( true ); m_artistView->setSelectionMode( QAbstractItemView::ExtendedSelection ); ArtistItem *item = 0; item = new ArtistItem( i18n( "All Artists" ) ); item->setIcon(0, SmallIcon( "media-optical-audio-amarok" ) ); m_items.append( item ); Collections::Collection *coll = CollectionManager::instance()->primaryCollection(); Collections::QueryMaker *qm = coll->queryMaker(); qm->setAutoDelete( true ); qm->setQueryType( Collections::QueryMaker::Artist ); qm->setAlbumQueryMode( Collections::QueryMaker::OnlyNormalAlbums ); qm->orderBy( Meta::valArtist ); connect( qm, SIGNAL(newResultReady(Meta::ArtistList)), this, SLOT(slotArtistQueryResult(Meta::ArtistList)) ); connect( qm, SIGNAL(queryDone()), this, SLOT(slotContinueConstruction()) ); qm->run(); }
DBusQueryHelper::DBusQueryHelper( QObject *parent, Collections::QueryMaker *qm, const QDBusConnection &conn, const QDBusMessage &msg, bool mprisCompatible ) : QObject( parent ) , m_connection( conn ) , m_message( msg ) , m_mprisCompatibleResult( mprisCompatible ) , m_timeout( false ) { qm->setAutoDelete( true ); qm->setQueryType( Collections::QueryMaker::Track ); connect( qm, SIGNAL(newResultReady(Meta::TrackList)), this, SLOT(slotResultReady(Meta::TrackList)), Qt::QueuedConnection ); connect( qm, SIGNAL(queryDone()), this, SLOT(slotQueryDone()), Qt::QueuedConnection ); qm->run(); //abort query after 15 seconds in case the query does not return QTimer::singleShot( 15000, this, SLOT(abortQuery()) ); }
void Dynamic::SearchQueryBias::newQuery() { DEBUG_BLOCK; // ok, I need a new query maker m_qm.reset( CollectionManager::instance()->queryMaker() ); Collections::addTextualFilter( m_qm.data(), m_filter ); m_qm->setQueryType( Collections::QueryMaker::Custom ); m_qm->addReturnValue( Meta::valUniqueId ); connect( m_qm.data(), SIGNAL(newResultReady(QStringList)), this, SLOT(updateReady(QStringList)), Qt::QueuedConnection ); connect( m_qm.data(), SIGNAL(queryDone()), this, SLOT(updateFinished()), Qt::QueuedConnection ); m_qm.data()->run(); }
CoverBling::CoverBling( QWidget* parent ) : QGLWidget( QGLFormat(QGL::DepthBuffer|QGL::SampleBuffers|QGL::AlphaChannel|QGL::DoubleBuffer), parent ) , m_xOffset( 0.0 ) , m_zOffset( M_PI / 2 ) { DEBUG_BLOCK setFixedHeight( 200 ); Amarok::Collection *coll = CollectionManager::instance()->primaryCollection(); QueryMaker *qm = coll->queryMaker(); qm->setQueryType( QueryMaker::Album ); qm->limitMaxResultSize( 10 ); connect( qm, SIGNAL( newResultReady( QString, Meta::AlbumList ) ), this, SLOT( queryResult( QString, Meta::AlbumList ) ) ); qm->run(); }
void Dynamic::QuizPlayBias::newQuery() { // ok, I need a new query maker m_qm.reset( CollectionManager::instance()->queryMaker() ); uint field = 0; switch( m_follow ) { case Dynamic::QuizPlayBias::TitleToTitle: field = Meta::valTitle; break; case Dynamic::QuizPlayBias::ArtistToArtist: field = Meta::valArtist; break; case Dynamic::QuizPlayBias::AlbumToAlbum: field = Meta::valAlbum; break; } m_qm->addFilter( field, QString(m_currentCharacter), true, false ); m_qm->setQueryType( Collections::QueryMaker::Custom ); m_qm->addReturnValue( Meta::valUniqueId ); connect( m_qm.data(), SIGNAL(newResultReady( QStringList )), this, SLOT(updateReady( QStringList )) ); connect( m_qm.data(), SIGNAL(queryDone()), this, SLOT(updateFinished()) ); m_qm.data()->run(); }
APG::ConstraintSolver::ConstraintSolver( ConstraintNode* r, int qualityFactor ) : m_satisfactionThreshold( 0.95 ) , m_finalSatisfaction( 0.0 ) , m_constraintTreeRoot( r ) , m_domainReductionFailed( false ) , m_readyToRun( false ) , m_abortRequested( false ) , m_maxGenerations( 100 ) , m_populationSize( 40 ) , m_suggestedPlaylistSize( 15 ) { Q_UNUSED( qualityFactor); // FIXME m_serialNumber = KRandom::random(); if ( !m_constraintTreeRoot ) { error() << "No constraint tree was passed to the solver. Aborting."; m_readyToRun = true; m_abortRequested = true; return; } m_qm = CollectionManager::instance()->queryMaker(); if ( m_qm ) { debug() << "New ConstraintSolver with serial number" << m_serialNumber; m_qm->setQueryType( Collections::QueryMaker::Track ); connect( m_qm, SIGNAL(newResultReady(Meta::TrackList)), this, SLOT(receiveQueryMakerData(Meta::TrackList)), Qt::QueuedConnection ); connect( m_qm, SIGNAL(queryDone()), this, SLOT(receiveQueryMakerDone()), Qt::QueuedConnection ); m_constraintTreeRoot->initQueryMaker( m_qm ); m_qm->run(); } else { debug() << "The ConstraintSolver could not find any queryable collections. No results will be returned."; m_readyToRun = true; m_abortRequested = true; } }
// ok, I need a new query maker m_qm.reset( CollectionManager::instance()->queryMaker() ); // - construct the query m_qm->beginOr(); foreach( const QString &artist, artists ) { // debug() << "adding artist to query:" << artist; m_qm->addFilter( Meta::valArtist, artist, true, true ); } m_qm->endAndOr(); m_qm->setQueryType( Collections::QueryMaker::Custom ); m_qm->addReturnValue( Meta::valUniqueId ); connect( m_qm.data(), SIGNAL(newResultReady( QStringList )), this, SLOT(updateReady( QStringList )) ); connect( m_qm.data(), SIGNAL(queryDone()), this, SLOT(updateFinished()) ); // - run the query m_qm.data()->run(); } void Dynamic::WeeklyTopBias::newWeeklyTimesQuery() { DEBUG_BLOCK QMap< QString, QString > params; params[ "method" ] = "user.getWeeklyChartList" ;
EditFilterDialog::EditFilterDialog( QWidget* parent, const QString &text ) : KDialog( parent ) , m_appended( false ) , m_filterText( text ) { setCaption( i18n( "Edit Filter" ) ); setModal( true ); setButtons( User1|User2|Default|Ok|Cancel ); setDefaultButton( Cancel ); showButtonSeparator( true ); m_ui.setupUi( mainWidget() ); // Redefine "Default" button KGuiItem defaultButton( i18n("&Append"), "list-add" ); setButtonWhatsThis( Default, i18n( "<qt><p>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.</p></qt>" ) ); setButtonToolTip( Default, i18n( "Add this filter condition to the list" ) ); setButtonGuiItem( Default, defaultButton ); // define "User1" button KGuiItem user1Button( i18n("&Clear"), "list-remove" ); setButtonWhatsThis( User1, i18n( "<p>By clicking here you will clear the filter. If you intend to " "undo the last appending just click on the \"Undo\" button.</p>" ) ); setButtonToolTip(User1, i18n( "Clear the filter" ) ); setButtonGuiItem( User1, user1Button ); // define "User2" button KGuiItem user2Button( i18nc("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"), "edit-undo" ); setButtonWhatsThis( User2, i18n( "<p>Clicking here will remove the last appended filter. " "You cannot undo more than one action.</p>" ) ); setButtonToolTip( User2, i18n( "Remove last appended filter" ) ); setButtonGuiItem( User2, user2Button ); //setMainWidget( m_ui ); m_vector.push_back( "Simple Search" ); m_vector.push_back( "album" ); m_vector.push_back( "artist" ); m_vector.push_back( "composer" ); m_vector.push_back( "genre" ); m_vector.push_back( "title" ); m_vector.push_back( "track" ); m_vector.push_back( "year" ); // the "Simple Search" text is selected in the comboKeyword m_selectedIndex = 0; connect( m_ui.keywordCombo, SIGNAL( activated( int ) ), SLOT(selectedKeyword( int ) ) ); connect( m_ui.minimum1, SIGNAL( valueChanged( int ) ), SLOT(minSpinChanged( int ) ) ); connect( m_ui.maximum1, SIGNAL( valueChanged( int ) ), SLOT(maxSpinChanged( int ) ) ); // type text selected textWanted(); // check the "One Value Choosing" by default chooseOneValue(); connect( m_ui.conditionCombo, SIGNAL(activated( int ) ), SLOT(chooseCondition( int ) ) ); m_checkActions << m_ui.matchAll; m_checkActions << m_ui.matchAny; m_checkActions << m_ui.matchLiteral; m_checkActions << m_ui.matchNot; connect( m_ui.matchAll, SIGNAL( clicked() ), SLOT( slotCheckAll() ) ); connect( m_ui.matchAny, SIGNAL( clicked() ), SLOT( slotCheckAtLeastOne() ) ); connect( m_ui.matchLiteral, SIGNAL( clicked() ), SLOT( slotCheckExactly() ) ); connect( m_ui.matchNot, SIGNAL( clicked() ), SLOT( slotCheckExclude() ) ); // check "select all words" as default slotCheckAll(); m_ui.invertButton->setEnabled( false ); connect( m_ui.invertButton, SIGNAL( clicked() ), SLOT( assignPrefixNOT() ) ); // 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_ui.groupBox_3->setEnabled( false ); connect( m_ui.andButton, SIGNAL(clicked()), SLOT(slotCheckAND()) ); connect( m_ui.orButton, SIGNAL(clicked()), SLOT(slotCheckOR()) ); // check "AND" condition as default slotCheckAND(); connect( this, SIGNAL(okClicked()), this, SLOT(slotOk() ) ); connect( this, SIGNAL( defaultClicked() ) , this, SLOT(slotDefault() ) ); connect( this, SIGNAL( user1Clicked() ), this, SLOT( slotUser1() ) ); connect( this, SIGNAL( user2Clicked() ), this, SLOT( slotUser2() ) ); Amarok::Collection *coll = CollectionManager::instance()->primaryCollection(); if( !coll ) return; QueryMaker *artist = coll->queryMaker()->setQueryType( QueryMaker::Artist ); QueryMaker *album = coll->queryMaker()->setQueryType( QueryMaker::Album ); QueryMaker *composer = coll->queryMaker()->setQueryType( QueryMaker::Composer ); QueryMaker *genre = coll->queryMaker()->setQueryType( QueryMaker::Genre ); QList<QueryMaker*> queries; queries << artist << album << composer << genre; //MetaQueryMaker will run multiple different queries just fine as long as we do not use it //to set the query type. Configuring the queries is ok though MetaQueryMaker *dataQueryMaker = new MetaQueryMaker( queries ); connect( dataQueryMaker, SIGNAL( newResultReady( QString, Meta::ArtistList ) ), SLOT( resultReady( QString, Meta::ArtistList ) ), Qt::QueuedConnection ); connect( dataQueryMaker, SIGNAL( newResultReady( QString, Meta::AlbumList ) ), SLOT( resultReady( QString, Meta::AlbumList ) ), Qt::QueuedConnection ); connect( dataQueryMaker, SIGNAL( newResultReady( QString, Meta::ComposerList ) ), SLOT( resultReady( QString, Meta::ComposerList ) ), Qt::QueuedConnection ); connect( dataQueryMaker, SIGNAL( newResultReady( QString, Meta::GenreList ) ), SLOT( resultReady( QString, Meta::GenreList ) ), Qt::QueuedConnection ); dataQueryMaker->run(); }
void Dynamic::TagMatchBias::newQuery() { DEBUG_BLOCK; // ok, I need a new query maker m_qm.reset( CollectionManager::instance()->queryMaker() ); // -- set the querymaker if( m_filter.isDate() ) { switch( m_filter.condition ) { case MetaQueryWidget::LessThan: case MetaQueryWidget::Equals: case MetaQueryWidget::GreaterThan: m_qm->addNumberFilter( m_filter.field(), m_filter.numValue, (Collections::QueryMaker::NumberComparison)m_filter.condition ); break; case MetaQueryWidget::Between: m_qm->beginAnd(); m_qm->addNumberFilter( m_filter.field(), qMin(m_filter.numValue, m_filter.numValue2)-1, Collections::QueryMaker::GreaterThan ); m_qm->addNumberFilter( m_filter.field(), qMax(m_filter.numValue, m_filter.numValue2)+1, Collections::QueryMaker::LessThan ); m_qm->endAndOr(); break; case MetaQueryWidget::OlderThan: m_qm->addNumberFilter( m_filter.field(), QDateTime::currentDateTime().toTime_t() - m_filter.numValue, Collections::QueryMaker::LessThan ); break; default: ; } } else if( m_filter.isNumeric() ) { switch( m_filter.condition ) { case MetaQueryWidget::LessThan: case MetaQueryWidget::Equals: case MetaQueryWidget::GreaterThan: m_qm->addNumberFilter( m_filter.field(), m_filter.numValue, (Collections::QueryMaker::NumberComparison)m_filter.condition ); break; case MetaQueryWidget::Between: m_qm->beginAnd(); m_qm->addNumberFilter( m_filter.field(), qMin(m_filter.numValue, m_filter.numValue2)-1, Collections::QueryMaker::GreaterThan ); m_qm->addNumberFilter( m_filter.field(), qMax(m_filter.numValue, m_filter.numValue2)+1, Collections::QueryMaker::LessThan ); m_qm->endAndOr(); break; default: ; } } else { switch( m_filter.condition ) { case MetaQueryWidget::Equals: m_qm->addFilter( m_filter.field(), m_filter.value, true, true ); break; case MetaQueryWidget::Contains: if( m_filter.field() == 0 ) { // simple search // TODO: split different words and make separate searches m_qm->beginOr(); m_qm->addFilter( Meta::valArtist, m_filter.value ); m_qm->addFilter( Meta::valTitle, m_filter.value ); m_qm->addFilter( Meta::valAlbum, m_filter.value ); m_qm->addFilter( Meta::valGenre, m_filter.value ); m_qm->addFilter( Meta::valUrl, m_filter.value ); m_qm->addFilter( Meta::valComment, m_filter.value ); m_qm->addFilter( Meta::valLabel, m_filter.value ); m_qm->endAndOr(); } else { m_qm->addFilter( m_filter.field(), m_filter.value ); } break; default: ; } } m_qm->setQueryType( Collections::QueryMaker::Custom ); m_qm->addReturnValue( Meta::valUniqueId ); connect( m_qm.data(), SIGNAL(newResultReady(QStringList)), this, SLOT(updateReady(QStringList)), Qt::QueuedConnection ); connect( m_qm.data(), SIGNAL(queryDone()), this, SLOT(updateFinished()), Qt::QueuedConnection ); m_qm.data()->run(); }