ServiceBase::ServiceBase( const QString &name, ServiceFactory *parent, bool useCollectionTreeView, const QString &prettyName ) : BrowserCategory( name, 0 ) , m_contentView ( 0 ) , m_parentFactory( parent ) , m_polished( false ) , m_serviceready( false ) , m_useCollectionTreeView( useCollectionTreeView ) , m_infoParser( 0 ) , m_model( 0 ) { DEBUG_BLOCK if ( !prettyName.isEmpty() ) { setPrettyName( prettyName ); } else setPrettyName( name ); setSpacing( 1 ); m_topPanel = new KVBox( this ); if( useCollectionTreeView ) { m_contentView = new ServiceCollectionTreeView( this ); m_contentView->setFrameShape( QFrame::NoFrame ); m_contentView->setSortingEnabled( true ); m_contentView->sortByColumn ( 0, Qt::AscendingOrder ); m_contentView->setDragEnabled ( true ); m_contentView->setDragDropMode ( QAbstractItemView::DragOnly ); connect( m_contentView, SIGNAL( itemSelected ( CollectionTreeItem * ) ), this, SLOT( itemSelected( CollectionTreeItem * ) ) ); } m_bottomPanel = new KVBox( this ); m_bottomPanel->setFrameStyle( QFrame::NoFrame ); m_bottomPanel->setLineWidth(2); m_bottomPanel->setSpacing( 2 ); m_bottomPanel->setMargin( 2 ); m_filterModel = new QSortFilterProxyModel( this ); m_filterModel->setSortCaseSensitivity( Qt::CaseInsensitive ); m_filterModel->setFilterCaseSensitivity( Qt::CaseInsensitive ); m_menubar = new KMenuBar( m_topPanel ); // Make sure we do not expose this menubar outside to ensure it does not // replace the main menubar when Amarok is used with Plasma Menubar m_menubar->setNativeMenuBar( false ); m_filterMenu = m_menubar->addMenu( i18n( "Group By" ) ); m_menubar->hide(); m_searchWidget = new SearchWidget( m_topPanel ); if( m_contentView ) connect( m_searchWidget, SIGNAL( filterChanged( const QString & ) ), m_contentView, SLOT( slotSetFilter( const QString & ) ) ); }
Ptr<const MetaInfo> getMetaInfo() { static auto meta = [] { auto meta = MetaInfo(); meta.setType(Type::Environment); meta.setPrettyName("environment"); meta.addProperty(MetaProperty(MetaProperty::Builtin::ScanFunction, static_cast<ScanFunction_t>(&scan))); meta.addProperty(MetaProperty(MetaProperty::Builtin::DestructorFunction, static_cast<DestructorFunction_t>(&destroy))); meta.addProperty(MetaProperty(MetaProperty::Builtin::IsEqualFunction, static_cast<IsEqualFunction_t>(&isEqual))); return meta; }(); // Note that this lambda is immediately called. return &meta; }
PlaylistBrowserNS::APGCategory::APGCategory( QWidget* ) : BrowserCategory ( "APG", 0 ) { m_qualityFactor = AmarokConfig::qualityFactorAPG(); setPrettyName( i18n( "Automated Playlist Generator" ) ); setShortDescription( i18n("Create playlists by specifying criteria") ); setIcon( KIcon( "playlist-generator" ) ); // set background if( AmarokConfig::showBrowserBackgroundImage() ) setBackgroundImage( imagePath() ); setLongDescription( i18n("Create playlists by specifying criteria") ); setContentsMargins( 0, 0, 0, 0 ); APG::PresetModel* presetmodel = APG::PresetModel::instance(); connect( presetmodel, SIGNAL(lock(bool)), this, SLOT(setDisabled(bool)) ); /* Create the toolbar -- Qt's Designer doesn't let us put a toolbar * anywhere except in a MainWindow, so we've got to create it by hand here. */ QToolBar* toolBar_Actions = new QToolBar( this ); toolBar_Actions->setMovable( false ); toolBar_Actions->setFloatable( false ); toolBar_Actions->setIconSize( QSize( 22, 22 ) ); toolBar_Actions->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred ); QAction* a; a = toolBar_Actions->addAction( KIcon( "list-add-amarok" ), i18n("Add new preset") ); connect( a, SIGNAL(triggered(bool)), presetmodel, SLOT(addNew()) ); a = toolBar_Actions->addAction( KIcon( "document-properties-amarok" ), i18n("Edit selected preset") ); a->setEnabled( false ); connect( a, SIGNAL(triggered(bool)), presetmodel, SLOT(edit()) ); connect( this, SIGNAL(validIndexSelected(bool)), a, SLOT(setEnabled(bool)) ); a = toolBar_Actions->addAction( KIcon( "list-remove-amarok" ), i18n("Delete selected preset") ); a->setEnabled( false ); connect( a, SIGNAL(triggered(bool)), presetmodel, SLOT(removeActive()) ); connect( this, SIGNAL(validIndexSelected(bool)), a, SLOT(setEnabled(bool)) ); a = toolBar_Actions->addAction( KIcon( "document-import-amarok" ), i18n("Import a new preset") ); a->setEnabled( true ); connect( a, SIGNAL(triggered(bool)), presetmodel, SLOT(import()) ); a = toolBar_Actions->addAction( KIcon( "document-export-amarok" ), i18n("Export the selected preset") ); a->setEnabled( false ); connect( a, SIGNAL(triggered(bool)), presetmodel, SLOT(exportActive()) ); connect( this, SIGNAL(validIndexSelected(bool)), a, SLOT(setEnabled(bool)) ); toolBar_Actions->addSeparator(); a = toolBar_Actions->addAction( KIcon( "go-next-amarok" ), i18n("Run APG with selected preset") ); a->setEnabled( false ); connect( a, SIGNAL(triggered(bool)), this, SLOT(runGenerator()) ); connect( this, SIGNAL(validIndexSelected(bool)), a, SLOT(setEnabled(bool)) ); /* Create the preset list view */ QLabel* label_Title = new QLabel( i18n("APG Presets"), this ); label_Title->setAlignment( Qt::AlignCenter ); Amarok::PrettyTreeView* listView = new Amarok::PrettyTreeView( this ); listView->setHeaderHidden( true ); listView->setRootIsDecorated( false ); listView->setModel( presetmodel ); listView->setSelectionMode( QAbstractItemView::SingleSelection ); listView->setFrameShape( QFrame::NoFrame ); listView->setAutoFillBackground( false ); connect( listView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(activeChanged(QModelIndex)) ); connect( listView, SIGNAL(doubleClicked(QModelIndex)), presetmodel, SLOT(editPreset(QModelIndex)) ); // Speed/Quality tradeoff slider QLabel* label_Tradeoff = new QLabel( i18n("Generator Optimization"), this ); label_Tradeoff->setAlignment( Qt::AlignCenter ); QFrame* qual_Frame = new QFrame( this ); QLabel* label_Speed = new QLabel( i18n("Speed"), qual_Frame ); QSlider* qual_Slider = new QSlider( Qt::Horizontal, qual_Frame ); qual_Slider->setRange( 0, APG::ConstraintSolver::QUALITY_RANGE ); qual_Slider->setValue( m_qualityFactor ); connect( qual_Slider, SIGNAL(sliderMoved(int)), this, SLOT (setQualityFactor(int)) ); QLabel* label_Quality = new QLabel( i18n("Accuracy"), qual_Frame ); QLayout* qf_Layout = new QHBoxLayout( qual_Frame ); qf_Layout->addWidget( label_Speed ); qf_Layout->addWidget( qual_Slider ); qf_Layout->addWidget( label_Quality ); qual_Frame->setLayout( qf_Layout ); QMetaObject::connectSlotsByName( this ); }
PlaylistBrowserNS::DynamicCategory::DynamicCategory( QWidget* parent ) : BrowserCategory( "dynamic category", parent ) { setPrettyName( i18n( "Dynamic Playlists" ) ); setShortDescription( i18n( "Dynamically updating parameter based playlists" ) ); setIcon( KIcon( "dynamic-amarok" ) ); setLongDescription( i18n( "With a dynamic playlist, Amarok becomes your own personal dj, automatically selecting tracks for you, based on a number of parameters that you select." ) ); setImagePath( KStandardDirs::locate( "data", "amarok/images/hover_info_dynamic_playlists.png" ) ); // set background if( AmarokConfig::showBrowserBackgroundImage() ) setBackgroundImage( imagePath() ); bool enabled = AmarokConfig::dynamicMode(); setContentsMargins( 0, 0, 0, 0 ); KHBox* controls2Layout = new KHBox( this ); QLabel *label; label = new QLabel( i18n( "Previous:" ), controls2Layout ); label->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); m_previous = new QSpinBox( controls2Layout ); m_previous->setMinimum( 0 ); m_previous->setToolTip( i18n( "Number of previous tracks to remain in the playlist." ) ); m_previous->setValue( AmarokConfig::previousTracks() ); QObject::connect( m_previous, SIGNAL(valueChanged(int)), this, SLOT(setPreviousTracks(int)) ); label = new QLabel( i18n( "Upcoming:" ), controls2Layout ); // label->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ); label->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); m_upcoming = new QSpinBox( controls2Layout ); m_upcoming->setMinimum( 1 ); m_upcoming->setToolTip( i18n( "Number of upcoming tracks to add to the playlist." ) ); m_upcoming->setValue( AmarokConfig::upcomingTracks() ); QObject::connect( m_upcoming, SIGNAL(valueChanged(int)), this, SLOT(setUpcomingTracks(int)) ); QObject::connect( (const QObject*)Amarok::actionCollection()->action( "playlist_clear" ), SIGNAL(triggered(bool)), this, SLOT(playlistCleared()) ); QObject::connect( (const QObject*)Amarok::actionCollection()->action( "disable_dynamic" ), SIGNAL(triggered(bool)), this, SLOT(playlistCleared()), Qt::DirectConnection ); // -- the tool bar KHBox* presetLayout = new KHBox( this ); KToolBar* presetToolbar = new KToolBar( presetLayout ); presetToolbar->setIconSize( QSize( 22, 22 ) ); presetToolbar->setToolButtonStyle( Qt::ToolButtonIconOnly ); presetToolbar->setMovable( false ); presetToolbar->setFloatable( false ); presetToolbar->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred ); m_onOffButton = new QToolButton( presetToolbar ); m_onOffButton->setText( i18nc( "Turn dynamic mode on", "On") ); m_onOffButton->setCheckable( true ); m_onOffButton->setIcon( KIcon( "dynamic-amarok" ) ); m_onOffButton->setToolTip( i18n( "Turn dynamic mode on." ) ); presetToolbar->addWidget( m_onOffButton ); m_duplicateButton = new QToolButton( presetToolbar ); m_duplicateButton->setText( i18n("Duplicates") ); m_duplicateButton->setCheckable( true ); m_duplicateButton->setChecked( allowDuplicates() ); m_duplicateButton->setIcon( KIcon( "edit-copy" ) ); m_duplicateButton->setToolTip( i18n( "Allow duplicate songs in result" ) ); presetToolbar->addWidget( m_duplicateButton ); m_addButton = new QToolButton( presetToolbar ); m_addButton->setText( i18n("New") ); m_addButton->setIcon( KIcon( "document-new" ) ); m_addButton->setToolTip( i18n( "New playlist" ) ); presetToolbar->addWidget( m_addButton ); m_editButton = new QToolButton( presetToolbar ); m_editButton->setText( i18n("Edit") ); m_editButton->setIcon( KIcon( "document-properties-amarok" ) ); m_editButton->setToolTip( i18n( "Edit the selected playlist or bias" ) ); presetToolbar->addWidget( m_editButton ); m_deleteButton = new QToolButton( presetToolbar ); m_deleteButton->setText( i18n("Delete") ); m_deleteButton->setEnabled( false ); m_deleteButton->setIcon( KIcon( "edit-delete" ) ); m_deleteButton->setToolTip( i18n( "Delete the selected playlist or bias") ); presetToolbar->addWidget( m_deleteButton ); m_repopulateButton = new QPushButton( presetLayout ); m_repopulateButton->setText( i18n("Repopulate") ); m_repopulateButton->setToolTip( i18n("Replace the upcoming tracks with fresh ones.") ); m_repopulateButton->setIcon( KIcon( "view-refresh-amarok" ) ); m_repopulateButton->setEnabled( enabled ); // m_repopulateButton->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ) ); QObject::connect( m_repopulateButton, SIGNAL(clicked(bool)), The::playlistActions(), SLOT(repopulateDynamicPlaylist()) ); // -- the tree view m_tree = new DynamicView( this ); connect( m_tree->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged()) ); connect( m_onOffButton, SIGNAL(toggled(bool)), The::playlistActions(), SLOT(enableDynamicMode(bool)) ); connect( m_duplicateButton, SIGNAL(toggled(bool)), this, SLOT(setAllowDuplicates(bool)) ); connect( m_addButton, SIGNAL(clicked(bool)), m_tree, SLOT(addPlaylist()) ); connect( m_editButton, SIGNAL(clicked(bool)), m_tree, SLOT(editSelected()) ); connect( m_deleteButton, SIGNAL(clicked(bool)), m_tree, SLOT(removeSelected()) ); navigatorChanged(); selectionChanged(); connect( The::playlistActions(), SIGNAL(navigatorChanged()), this, SLOT(navigatorChanged()) ); }