?? smartplaylisteditor.cpp
字號:
/// (c) Pierpaolo Di Panfilo 2004// (c) Alexandre Pereira de Oliveira 2005// (c) 2005 Isaiah Damron <xepo@trifault.net>// (c) 2006 Peter C. Ndikuwera <pndiku@gmail.com>// See COPYING file for licensing information#define DEBUG_PREFIX "SmartPlaylistEditor"#include "amarok.h" //foreach#include "debug.h"#include "collectiondb.h"#include "metabundle.h"#include "mountpointmanager.h"#include "smartplaylisteditor.h"#include <kcombobox.h>#include <klineedit.h>#include <klocale.h>#include <kmountpoint.h>#include <knuminput.h>#include <qcheckbox.h>#include <qdatetime.h>#include <qdatetimeedit.h> //loadEditWidgets()#include <qframe.h>#include <qhbox.h>#include <qlabel.h>#include <qlayout.h>#include <qobjectlist.h>#include <qstringlist.h>#include <qtoolbutton.h>#include <qvbox.h>#include <qvgroupbox.h>enum Fields{ FArtist = 0, FComposer, FAlbum, FGenre, FTitle, FLength, FTrack, FYear, FComment, FPlayCounter, FScore, FRating, FFirstPlay, FLastPlay, FModfiedDate, FFilePath, FBPM, FMountPoint, FBitRate, FLabel};QStringList m_fields;QStringList m_dbFields;QStringList m_expandableFields;QStringList m_expandableDbFields;SmartPlaylistEditor::SmartPlaylistEditor( QString defaultName, QWidget *parent, const char *name ) : KDialogBase( parent, name, true, i18n("Create Smart Playlist"), Ok|Cancel, Ok, true ){ init(defaultName); addCriteriaAny(); addCriteriaAll();}SmartPlaylistEditor::SmartPlaylistEditor( QWidget *parent, QDomElement xml, const char *name) : KDialogBase( parent, name, true, i18n("Edit Smart Playlist"), Ok|Cancel, Ok, true ){ init( xml.attribute( "name" ) ); // matches QDomNodeList matchesList = xml.elementsByTagName( "matches" ); bool matchedANY = false, matchedALL = false; m_matchAllCheck->setChecked( true ); m_matchAnyCheck->setChecked( true ); for (int i = 0, m = matchesList.count(); i<m; i++) { QDomElement matches = matchesList.item(i).toElement(); QDomNodeList criteriaList = matches.elementsByTagName( "criteria" ); if ( criteriaList.count() ) { for (int j = 0, c=criteriaList.count() ; j<c; ++j ) { QDomElement criteria = criteriaList.item(j).toElement(); if (matches.attribute( "glue" ) == "OR") { matchedANY = true; addCriteriaAny( criteria ); } else { matchedALL = true; addCriteriaAll( criteria ); } } } } if ( !matchedALL ) { addCriteriaAll(); m_matchAllCheck->setChecked( false ); } if ( !matchedANY ) { m_matchAnyCheck->setChecked( false ); addCriteriaAny( ); } // orderby QDomNodeList orderbyList = xml.elementsByTagName( "orderby" ); if ( orderbyList.count() ) { m_orderCheck->setChecked( true ); QDomElement orderby = orderbyList.item(0).toElement(); // we only allow one orderby node //random is always the last one. int dbfield = orderby.attribute( "field" ) == "random" ? m_dbFields.count() : m_dbFields.findIndex( orderby.attribute( "field" ) ); m_orderCombo->setCurrentItem( dbfield ); updateOrderTypes( dbfield ); if ( orderby.attribute( "order" ) == "DESC" || orderby.attribute( "order" ) == "weighted" ) m_orderTypeCombo->setCurrentItem( 1 ); else if ( orderby.attribute( "order" ) == "ratingweighted" ) m_orderTypeCombo->setCurrentItem( 2 ); else m_orderTypeCombo->setCurrentItem( 0 ); } // limit if ( xml.hasAttribute( "maxresults" ) ) { m_limitCheck->setChecked( true ); m_limitSpin->setValue( xml.attribute( "maxresults" ).toInt() ); } // expand by QDomNodeList expandbyList = xml.elementsByTagName( "expandby" ); if ( expandbyList.count() ) { m_expandCheck->setChecked( true ); QDomElement expandby = expandbyList.item(0).toElement(); // we only allow one orderby node int dbfield = m_expandableFields.findIndex( expandby.attribute( "field" ) ); m_expandCombo->setCurrentItem( dbfield ); }}void SmartPlaylistEditor::init(QString defaultName){ makeVBoxMainWidget(); m_fields.clear(); m_fields << i18n("Artist") << i18n("Composer") << i18n("Album") << i18n("Genre") << i18n("Title") << i18n("Length") << i18n("Track #") << i18n("Year") << i18n("Comment") << i18n("Play Counter") << i18n("Score") << i18n( "Rating" ) << i18n("First Play") << i18n("Last Play") << i18n("Modified Date") << i18n("File Path") << i18n("BPM") << i18n("Mount Point") << i18n( "Bitrate" ) << i18n( "Label" ); m_dbFields.clear(); m_dbFields << "artist.name" << "composer.name" << "album.name" << "genre.name" << "tags.title" << "tags.length" << "tags.track" << "year.name" << "tags.comment" << "statistics.playcounter" << "statistics.percentage" << "statistics.rating" << "statistics.createdate" << "statistics.accessdate" << "tags.createdate" << "tags.url" << "tags.bpm" << "devices.lastmountpoint" << "tags.bitrate" << "labels.name"; m_expandableFields.clear(); m_expandableFields << i18n("Artist") << i18n("Composer") << i18n("Album") << i18n("Genre") << i18n("Year") << i18n( "Label" ); m_expandableDbFields.clear(); m_expandableDbFields << "artist.name" << "composer.name" << "album.name" << "genre.name" << "year.name" << "labels.name"; QHBox *hbox = new QHBox( mainWidget() ); hbox->setSpacing( 5 ); new QLabel( i18n("Playlist name:"), hbox ); m_nameLineEdit = new KLineEdit( defaultName, hbox ); QFrame *sep = new QFrame( mainWidget() ); sep->setFrameStyle( QFrame::HLine | QFrame::Sunken ); //match box (any) QHBox *matchAnyBox = new QHBox( mainWidget() ); m_matchAnyCheck = new QCheckBox( i18n("Match Any of the following conditions" ), matchAnyBox ); matchAnyBox->setStretchFactor( new QWidget( matchAnyBox ), 1 ); //criteria box m_criteriaAnyGroupBox = new QVGroupBox( QString::null, mainWidget() ); //match box (all) QHBox *matchAllBox = new QHBox( mainWidget() ); m_matchAllCheck = new QCheckBox( i18n("Match All of the following conditions" ), matchAllBox ); matchAllBox->setStretchFactor( new QWidget( matchAllBox ), 1 ); //criteria box m_criteriaAllGroupBox = new QVGroupBox( QString::null, mainWidget() ); //order box QHBox *hbox2 = new QHBox( mainWidget() ); m_orderCheck = new QCheckBox( i18n("Order by"), hbox2 ); QHBox *orderBox = new QHBox( hbox2 ); orderBox->setSpacing( 5 ); //fields combo m_orderCombo = new KComboBox( orderBox ); m_orderCombo->insertStringList( m_fields ); m_orderCombo->insertItem( i18n("Random") ); //order type m_orderTypeCombo = new KComboBox( orderBox ); updateOrderTypes(0); // populate the new m_orderTypeCombo hbox2->setStretchFactor( new QWidget( hbox2 ), 1 ); //limit box QHBox *hbox1 = new QHBox( mainWidget() ); m_limitCheck = new QCheckBox( i18n("Limit to"), hbox1 ); QHBox *limitBox = new QHBox( hbox1 ); limitBox->setSpacing( 5 ); m_limitSpin = new KIntSpinBox( limitBox ); m_limitSpin->setMinValue( 1 ); m_limitSpin->setMaxValue( 100000 ); m_limitSpin->setValue( 15 ); new QLabel( i18n("tracks"), limitBox ); hbox1->setStretchFactor( new QWidget( hbox1 ), 1 ); //Expand By QHBox *hbox3 = new QHBox( mainWidget() ); m_expandCheck = new QCheckBox( i18n("Expand by"), hbox3 ); QHBox *expandBox = new QHBox( hbox3 ); expandBox->setSpacing( 5 ); m_expandCombo = new KComboBox( expandBox ); m_expandCombo->insertStringList( m_expandableFields ); hbox3->setStretchFactor( new QWidget( hbox3 ), 1 ); //add stretch static_cast<QHBox *>(mainWidget())->setStretchFactor(new QWidget(mainWidget()), 1); connect( m_matchAnyCheck, SIGNAL( toggled(bool) ), m_criteriaAnyGroupBox, SLOT( setEnabled(bool) ) ); connect( m_matchAllCheck, SIGNAL( toggled(bool) ), m_criteriaAllGroupBox, SLOT( setEnabled(bool) ) ); connect( m_orderCheck, SIGNAL( toggled(bool) ), orderBox, SLOT( setEnabled(bool) ) ); connect( m_limitCheck, SIGNAL( toggled(bool) ), limitBox, SLOT( setEnabled(bool) ) ); connect( m_expandCheck, SIGNAL( toggled(bool) ), expandBox, SLOT( setEnabled(bool) ) ); connect( m_orderCombo, SIGNAL( activated(int) ), this, SLOT( updateOrderTypes(int) ) ); m_criteriaAnyGroupBox->setEnabled( false ); m_criteriaAllGroupBox->setEnabled( false ); orderBox->setEnabled( false ); limitBox->setEnabled( false ); expandBox->setEnabled( false ); m_nameLineEdit->setFocus(); resize( 550, 200 );}void SmartPlaylistEditor::addCriteriaAny(){ CriteriaEditor *criteria= new CriteriaEditor( this, m_criteriaAnyGroupBox, criteriaAny ); m_criteriaEditorAnyList.append( criteria ); m_criteriaEditorAnyList.first()->enableRemove( m_criteriaEditorAnyList.count() > 1 );}void SmartPlaylistEditor::addCriteriaAll(){ CriteriaEditor *criteria= new CriteriaEditor( this, m_criteriaAllGroupBox, criteriaAll ); m_criteriaEditorAllList.append( criteria ); m_criteriaEditorAllList.first()->enableRemove( m_criteriaEditorAllList.count() > 1 );}void SmartPlaylistEditor::addCriteriaAny( QDomElement &xml ){ CriteriaEditor *criteria = new CriteriaEditor( this, m_criteriaAnyGroupBox, criteriaAny, xml ); m_criteriaEditorAnyList.append( criteria ); m_criteriaEditorAnyList.first()->enableRemove( m_criteriaEditorAnyList.count() > 1 );}void SmartPlaylistEditor::addCriteriaAll( QDomElement &xml ){ CriteriaEditor *criteria = new CriteriaEditor( this, m_criteriaAllGroupBox, criteriaAll, xml ); m_criteriaEditorAllList.append( criteria ); m_criteriaEditorAllList.first()->enableRemove( m_criteriaEditorAllList.count() > 1 );}void SmartPlaylistEditor::removeCriteriaAny( CriteriaEditor *criteria ){ m_criteriaEditorAnyList.remove( criteria ); criteria->deleteLater(); resize( size().width(), sizeHint().height() ); if( m_criteriaEditorAnyList.count() == 1 ) m_criteriaEditorAnyList.first()->enableRemove( false );}void SmartPlaylistEditor::removeCriteriaAll( CriteriaEditor *criteria ){ m_criteriaEditorAllList.remove( criteria ); criteria->deleteLater(); resize( size().width(), sizeHint().height() ); if( m_criteriaEditorAllList.count() == 1 ) m_criteriaEditorAllList.first()->enableRemove( false );}void SmartPlaylistEditor::updateOrderTypes( int index ){ int currentOrderType = m_orderTypeCombo->currentItem(); if( index == m_orderCombo->count()-1 ) { // random order selected m_orderTypeCombo->clear(); m_orderTypeCombo->insertItem( i18n("Completely Random") ); m_orderTypeCombo->insertItem( i18n("Score Weighted") ); m_orderTypeCombo->insertItem( i18n("Rating Weighted") ); } else { // ordinary order column selected m_orderTypeCombo->clear(); m_orderTypeCombo->insertItem( i18n("Ascending") ); m_orderTypeCombo->insertItem( i18n("Descending") ); } if( currentOrderType < m_orderTypeCombo->count() ) m_orderTypeCombo->setCurrentItem( currentOrderType ); m_orderTypeCombo->setFont(m_orderTypeCombo->font()); // invalidate size hint m_orderTypeCombo->updateGeometry();}QDomElement SmartPlaylistEditor::result(){ QDomDocument doc; QDomNode node = doc.namedItem( "smartplaylists" ); QDomElement nodeE; nodeE = node.toElement(); QDomElement smartplaylist = doc.createElement( "smartplaylist" ); smartplaylist.setAttribute( "name", name() ); // Limit if ( m_limitCheck->isChecked() ) smartplaylist.setAttribute( "maxresults", m_limitSpin->value() ); nodeE.appendChild( smartplaylist ); // Matches if( m_matchAnyCheck->isChecked() ) { QDomElement matches = doc.createElement("matches"); smartplaylist.appendChild( matches ); // Iterate through all criteria list CriteriaEditor *criteriaeditor = m_criteriaEditorAnyList.first(); for( int i=0; criteriaeditor; criteriaeditor = m_criteriaEditorAnyList.next(), ++i ) matches.appendChild( doc.importNode( criteriaeditor->getDomSearchCriteria( doc ), true ) ); matches.setAttribute( "glue", "OR" ); smartplaylist.appendChild( matches ); } if( m_matchAllCheck->isChecked() ) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -