Пример #1
0
PlaylistPanel::PlaylistPanel() {
	setupUi(this);

	// Random and such
	connect(MPD::instance(), SIGNAL(randomUpdated(bool)), randomButton, SLOT(setChecked(bool)));
	connect(MPD::instance(), SIGNAL(repeatUpdated(bool)), repeatButton, SLOT(setChecked(bool)));
	connect(Config::instance(), SIGNAL(autoAddSongsChanged(bool)), dynamicButton, SLOT(setChecked(bool)));
	connect(randomButton, SIGNAL(toggled(bool)), MPD::instance(), SLOT(setRandom(bool)));
	connect(repeatButton, SIGNAL(toggled(bool)), MPD::instance(), SLOT(setRepeat(bool)));
	dynamicButton->setChecked(Config::instance()->autoAddSongs());
	connect(dynamicButton, SIGNAL(toggled(bool)), Config::instance(), SLOT(setAutoAddSongs(bool)));

	// Button clicks
	connect(cropButton, SIGNAL(clicked()), playlistView, SLOT(cropItems()));
	connect(removeButton, SIGNAL(clicked()), playlistView, SLOT(removeItems()));
	connect(saveAsButton, SIGNAL(clicked()), playlistView, SLOT(savePlaylist()));
	connect(clearButton, SIGNAL(clicked()), MPD::instance(), SLOT(clearPlaylist()));
	connect(shuffleButton, SIGNAL(clicked()), MPD::instance(), SLOT(shufflePlaylist()));

	// Toggle actions
	connect(playlistView, SIGNAL(toggleActions(bool)), removeButton, SLOT(setEnabled(bool)));
	connect(playlistView, SIGNAL(toggleActions(bool)), cropButton, SLOT(setEnabled(bool)));
	
	// Filter
	connect(filter, SIGNAL(textChanged(const QString &)), this, SLOT(updateFilter(const QString &)));
}
Пример #2
0
void MainWindow::onLibraryContextMenu(const QPoint &point)
{
    QMenu menu(ui->treeView);

    if (ui->treeView->selectionModel()->selectedRows().length() < 2)
    {
        PlaylistNode *node = mp_self->player()->model().getNodeFromIndex(ui->treeView->indexAt(point));

        if (node->hasFailed())
        {
            QAction *a = menu.addAction("Retry");
            connect(a, &QAction::triggered, [node, this] () {});
        }

        if (node->hasProperty("library_context_menu"))
        {
            populate_menu(menu, node, "library_context_menu");
            menu.addSeparator();
        }
        else if (node->hasProperty("menu"))
        {
            populate_menu(menu, node, "menu");
            menu.addSeparator();
        }
    }

    QAction *a = menu.addAction("Remove");
    connect(a, &QAction::triggered, [this](){
        for (QModelIndex index : ui->treeView->selectionModel()->selectedIndexes())
            mp_self->player()->remove(index);
    });
    a = menu.addAction("Clear Playlist", mp_self->player(), SLOT(clearPlaylist()));

    menu.exec(ui->treeView->mapToGlobal(point));
}
Пример #3
0
void Player::loadPlaylist()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Select file"), QDir::homePath(), "*.plst");
    if (fileName.isEmpty())
        return;
    clearPlaylist();
    if (!loadPlaylist(fileName))
        QMessageBox::critical(this, tr("Error!"), tr("Failed to load playlist!"));
}
void Playlist::playMediaList(const QList<MediaItem> &mediaList)
{
    //Clear playlist
    clearPlaylist();
    
    //Load playlist with all media items
    //Note: Because playlist loads asynchronously we have to
    //wait for signal from playlist model that loading is 
    //complete (playlistChanged) before starting playback
    // - hence the use of playWhenPlaylistChanges.
    playWhenPlaylistChanges = true;
    m_state = Playlist::Loading;
    emit loading();
    m_currentPlaylist->loadSources(mediaList); 
}
Пример #5
0
void MainWindow::createActions() {
	QLOG_TRACE() << "MainWindow::createActions()";
	stopAllAction = new QAction(tr("&Stop All"), this);
	stopAllAction->setToolTip(tr("Stop all tracks that are playing"));
	stopAllAction->setStatusTip(tr("Stop all tracks that are playing"));
	connect(stopAllAction, SIGNAL(triggered()), this, SLOT(stopAll()));
	
	addAction = new QAction(tr("&Add"), this);
	addAction->setToolTip(tr("Add tracks to the playlist"));
	addAction->setStatusTip(tr("Add tracks to the playlist"));
	connect(addAction, SIGNAL(triggered()), this, SLOT(addTracks()));
	
	editAction = new QAction(tr("&Edit"), this);
	editAction->setToolTip(tr("Toggle edit mode"));
	editAction->setStatusTip(tr("Toggle edit mode"));
	editAction->setCheckable(true);
	connect(editAction, SIGNAL(triggered()), this, SLOT(toggleEditMode()));
	
	clearAction = new QAction(tr("&Clear"), this);
	clearAction->setToolTip(tr("Clear the playlist"));
	clearAction->setStatusTip(tr("Clear the playlist"));
	connect(clearAction, SIGNAL(triggered()), this, SLOT(clearPlaylist()));
}
Пример #6
0
void MusicPlayer::shufflePlaylist() {
	QVector<Song *> newlist;
	int x = m_playlist.size();

	while ( x > 0 ) {
		int y = rand() % x;

		newlist.append(m_playlist.at(y));
		m_playlist.remove(y);

		x = m_playlist.size();
	}

	clearPlaylist();
	int row = m_ui->tblMusic->rowCount();
	m_playlist = newlist;
	foreach(Song * song, m_playlist) {
		m_ui->tblMusic->setRowCount(row+1);
		QTableWidgetItem * newitem = new QTableWidgetItem(song->artist());
		m_ui->tblMusic->setItem(row, 0, newitem);
		newitem = new QTableWidgetItem(song->title());
		m_ui->tblMusic->setItem(row++, 1, newitem);
	}
Пример #7
0
void TinyMainWindow::on_action_playlist_clear_triggered()
{
	clearPlaylist();
}
Пример #8
0
Player::Player(QWidget *parent):
    QMainWindow(parent),
    _ui(new Ui::Player),
    _player(new Phonon::MediaObject(this)),
    _audioOutput(new Phonon::AudioOutput(Phonon::MusicCategory, this)),
    _trayIcon(new QSystemTrayIcon(this)),
    _isStopped(false),
    _isPaused(false),
    _artistToPlaylistAction(new QAction(tr("Add to playlist"), this)),
    _artistsMenu(new QMenu(this)),
    _albumToPlaylistAction(new QAction(tr("Add to playlist"), this)),
    _albumsMenu(new QMenu(this)),
    _trackToPlaylistAction(new QAction(tr("Add to playlist"), this)),
    _tracksMenu(new QMenu(this)),
    _removeTrackAction(new QAction(tr("Remove track"), this)),
    _playlistMenu(new QMenu(this)),
    _playAction(new QAction(tr("Play"), this)),
    _pauseAction(new QAction(tr("Pause"), this)),
    _playNextAction(new QAction(tr("Play next"), this)),
    _playPrevAction(new QAction(tr("Play previous"), this)),
    _stopAction(new QAction(tr("Stop"), this)),
    _trayMenu(new QMenu(this)),
    _lastFMDialog(new LastFMAuthDialog(this))
{
    _ui->setupUi(this);
    this->setWindowIcon(QIcon(":/icon.png"));
    this->setWindowTitle(qApp->applicationName());
    _ui->pauseButton->setHidden(true);
    fixHeader(_ui->tracks->horizontalHeader());
    fixHeader(_ui->playlist->horizontalHeader());
    _ui->tracks->verticalHeader()->setDefaultSectionSize(_ui->artists->sizeHintForRow(0) + 4);
    _ui->playlist->verticalHeader()->setDefaultSectionSize(_ui->artists->sizeHintForRow(0) + 4);

    _ui->previousButton->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaSkipBackward));
    _ui->playButton->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaPlay));
    _ui->pauseButton->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaPause));
    _ui->stopButton->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaStop));
    _ui->nextButton->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaSkipForward));

    _playPrevAction->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaSkipBackward));
    _playAction->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaPlay));
    _pauseAction->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaPause));
    _pauseAction->setVisible(false);
    _stopAction->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaStop));
    _playNextAction->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaSkipForward));
    _ui->actionQuit->setIcon(qApp->style()->standardIcon(QStyle::SP_DialogCloseButton));
    _trayMenu->addAction(_playAction);
    _trayMenu->addAction(_pauseAction);
    _trayMenu->addAction(_playPrevAction);
    _trayMenu->addAction(_playNextAction);
    _trayMenu->addAction(_stopAction);
    _trayMenu->addAction(_ui->actionQuit);

    _trayIcon->setContextMenu(_trayMenu);
    _trayIcon->setIcon(QIcon(":/icon.png"));
    _trayIcon->show();

    Phonon::createPath(_player, _audioOutput);
    _ui->seekSlider->setMediaObject(_player);
    _ui->volumeSlider->setAudioOutput(_audioOutput);

    _artistsMenu->addAction(_artistToPlaylistAction);
    _albumsMenu->addAction(_albumToPlaylistAction);
    _tracksMenu->addAction(_trackToPlaylistAction);
    _playlistMenu->addAction(_removeTrackAction);

    connect(_ui->actionQuit, SIGNAL(triggered()), qApp, SLOT(quit()));
    connect(_ui->actionAdd_directory, SIGNAL(triggered()), this, SLOT(addDirToLibrary()));
    connect(_ui->actionAdd_files, SIGNAL(triggered()), this, SLOT(addFilesToLibrary()));
    connect(_ui->actionClear_playlist, SIGNAL(triggered()), this, SLOT(clearPlaylist()));
    connect(_ui->actionLoad_playlist, SIGNAL(triggered()), this, SLOT(loadPlaylist()));
    connect(_ui->actionSave_playlist, SIGNAL(triggered()), this, SLOT(savePlaylist()));
    connect(_ui->nextButton, SIGNAL(clicked()), this, SLOT(playNext()));
    connect(_ui->playButton, SIGNAL(clicked()), this, SLOT(play()));
    connect(_ui->tracks, SIGNAL(itemDoubleClicked(QTableWidgetItem*)), this, SLOT(playSelected()));
    connect(_ui->playlist, SIGNAL(itemDoubleClicked(QTableWidgetItem*)), this, SLOT(playSelected()));
    connect(_ui->stopButton, SIGNAL(clicked()), this, SLOT(stop()));
    connect(_ui->pauseButton, SIGNAL(clicked()), this, SLOT(pause()));
    connect(_ui->stopButton, SIGNAL(clicked()), _player, SLOT(stop()));
    connect(_ui->previousButton, SIGNAL(clicked()), this, SLOT(playPrevious()));
    connect(_playAction, SIGNAL(triggered()), this, SLOT(play()));
    connect(_pauseAction, SIGNAL(triggered()), _player, SLOT(pause()));
    connect(_stopAction, SIGNAL(triggered()), _player, SLOT(stop()));
    connect(_playNextAction, SIGNAL(triggered()), this, SLOT(playNext()));
    connect(_playPrevAction, SIGNAL(triggered()), this, SLOT(playPrevious()));
    connect(_ui->artists, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(showArtistsContextMenu(const QPoint &)));
    connect(_ui->albums, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(showAlbumsContextMenu(const QPoint &)));
    connect(_ui->tracks, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(showTracksContextMenu(const QPoint &)));
    connect(_ui->playlist, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(showPlaylistContextMenu(const QPoint &)));
    connect(DataBase::instance(), SIGNAL(albumsUpdated()), this, SLOT(updateAlbums()));
    connect(DataBase::instance(), SIGNAL(artistsUpdated()), this, SLOT(updateArtists()));
    connect(DataBase::instance(), SIGNAL(tracksUpdated()), this, SLOT(updateTracks()));
    connect(_ui->artists, SIGNAL(currentRowChanged(int)), this, SLOT(updateAlbums()));
    connect(_ui->albums, SIGNAL(currentRowChanged(int)), this, SLOT(updateTracks()));
    connect(_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason)));
    connect(_player, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(stateChanged(Phonon::State,Phonon::State)));
    connect(_player, SIGNAL(tick(qint64)), this, SLOT(tick(qint64)));
    connect(_player, SIGNAL(totalTimeChanged(qint64)), this, SLOT(totalTimeChanged(qint64)));
    connect(_player, SIGNAL(finished()), this, SLOT(trackFinished()));
    connect(_ui->actionSettings, SIGNAL(triggered()), _lastFMDialog, SLOT(show()));
    connect(_ui->actionScrobbling, SIGNAL(toggled(bool)), this, SLOT(scrobblingToggled(bool)));
    connect(Settings::instance(), SIGNAL(scrobblingChanged(bool)), _ui->actionScrobbling, SLOT(setChecked(bool)));

    _allArtists = _ui->artists->item(0);
    _allArtists->setText(ALL);
    _allAlbums = _ui->albums->item(0);
    _allAlbums->setText(ALL);

    loadPlaylist(RECENTPLAYLIST);

    _ui->actionScrobbling->setChecked(Settings::instance()->isScrobblingEnabled());
    _ui->actionSettings->setEnabled(Settings::instance()->isScrobblingEnabled());
    scrobblingToggled(Settings::instance()->isScrobblingEnabled());
}
Пример #9
0
/*********** Popup *********/
bool StandardPLPanel::popup( const QModelIndex & index, const QPoint &point, const QModelIndexList &selectionlist )
{
    VLCModel *model = qobject_cast<VLCModel*>(currentView->model());
    QModelIndexList callerAsList;
    callerAsList << ( index.isValid() ? index : QModelIndex() );
    popupIndex = index; /* suitable for modal only */

#define ADD_MENU_ENTRY( icon, title, act, data ) \
    action = menu.addAction( icon, title ); \
    container.action = act; \
    container.indexes = data; \
    action->setData( QVariant::fromValue( container ) )

    /* */
    QMenu menu;
    QAction *action;
    PLModel::actionsContainerType container;

    /* Play/Stream/Info static actions */
    if( index.isValid() )
    {
        ADD_MENU_ENTRY( QIcon( ":/menu/play" ), qtr(I_POP_PLAY),
                        container.ACTION_PLAY, callerAsList );

        menu.addAction( QIcon( ":/menu/stream" ), qtr(I_POP_STREAM),
                        this, SLOT( popupStream() ) );

        menu.addAction( QIcon(), qtr(I_POP_SAVE),
                        this, SLOT( popupSave() ) );

        menu.addAction( QIcon( ":/menu/info" ), qtr(I_POP_INFO),
                        this, SLOT( popupInfoDialog() ) );

        menu.addSeparator();

        if( model->getURI( index ).startsWith( "file://" ) )
            menu.addAction( QIcon( ":/type/folder-grey" ), qtr(I_POP_EXPLORE),
                            this, SLOT( popupExplore() ) );
    }

    /* In PL or ML, allow to add a file/folder */
    if( model->canEdit() )
    {
        QIcon addIcon( ":/buttons/playlist/playlist_add" );

        if( model->isTree() )
            menu.addAction( addIcon, qtr(I_POP_NEWFOLDER),
                            this, SLOT( popupPromptAndCreateNode() ) );

        menu.addSeparator();
        if( model->isCurrentItem( model->rootIndex(), PLModel::IN_PLAYLIST ) )
        {
            menu.addAction( addIcon, qtr(I_PL_ADDF), THEDP, SLOT( simplePLAppendDialog()) );
            menu.addAction( addIcon, qtr(I_PL_ADDDIR), THEDP, SLOT( PLAppendDir()) );
            menu.addAction( addIcon, qtr(I_OP_ADVOP), THEDP, SLOT( PLAppendDialog()) );
        }
        else if( model->isCurrentItem( model->rootIndex(), PLModel::IN_MEDIALIBRARY ) )
        {
            menu.addAction( addIcon, qtr(I_PL_ADDF), THEDP, SLOT( simpleMLAppendDialog()) );
            menu.addAction( addIcon, qtr(I_PL_ADDDIR), THEDP, SLOT( MLAppendDir() ) );
            menu.addAction( addIcon, qtr(I_OP_ADVOP), THEDP, SLOT( MLAppendDialog() ) );
        }
    }

    if( index.isValid() )
    {
        if( !model->isCurrentItem( model->rootIndex(), PLModel::IN_PLAYLIST ) )
        {
            ADD_MENU_ENTRY( QIcon(), qtr("Add to playlist"),
                            container.ACTION_ADDTOPLAYLIST, selectionlist );
        }
    }

    menu.addSeparator();

    /* Item removal */
    if( index.isValid() )
    {
        ADD_MENU_ENTRY( QIcon( ":/buttons/playlist/playlist_remove" ), qtr(I_POP_DEL),
                        container.ACTION_REMOVE, selectionlist );
    }

    if( model->canEdit() ) {
        menu.addAction( QIcon( ":/toolbar/clear" ), qtr("Clear playlist"),
                        model, SLOT( clearPlaylist() ) );
    }

    menu.addSeparator();

    /* Playlist sorting */
    QMenu *sortingMenu = new QMenu( qtr( "Sort by" ) );
    /* Choose what columns to show in sorting menu, not sure if this should be configurable*/
    QList<int> sortingColumns;
    sortingColumns << COLUMN_TITLE << COLUMN_ARTIST << COLUMN_ALBUM << COLUMN_TRACK_NUMBER << COLUMN_URI;
    container.action = container.ACTION_SORT;
    container.indexes = callerAsList;
    foreach( int Column, sortingColumns )
    {
        action = sortingMenu->addAction( qfu( psz_column_title( Column ) ) + " " + qtr("Ascending") );
        container.column = model->columnFromMeta(Column) + 1;
        action->setData( QVariant::fromValue( container ) );

        action = sortingMenu->addAction( qfu( psz_column_title( Column ) ) + " " + qtr("Descending") );
        container.column = -1 * (model->columnFromMeta(Column)+1);
        action->setData( QVariant::fromValue( container ) );
    }
Пример #10
0
void MusicPlayList::contextMenuEvent(QContextMenuEvent *event)
{
	QMenu menu;
	menu.addAction(tr("清空列表",this,SLOT(clearPlaylist())));
	menu.exec(event->globalPos());
}
Пример #11
0
QmlView::QmlView(QUrl source, QWidget *parent, MafwRegistryAdapter *mafwRegistry ) :
    QMainWindow(parent),
    ui(new Ui::QmlView),
    mafwRegistry(mafwRegistry),
    mafwRenderer(mafwRegistry->renderer())
{
    ui->setupUi(this);
    ui->declarativeView->setSource(source);
    ui->declarativeView->setResizeMode(QDeclarativeView::SizeRootObjectToView);

    setAttribute(Qt::WA_DeleteOnClose);
    setAttribute(Qt::WA_Maemo5StackedWindow);
    setAttribute(Qt::WA_Maemo5NonComposited);

    QGLWidget *glWidget = new QGLWidget(this);
    ui->declarativeView->setViewport(glWidget);

    positionTimer = new QTimer(this);
    positionTimer->setInterval(1000);

    fmtx = new FMTXInterface(this);

    Rotator *rotator = Rotator::acquire();
    savedPolicy = rotator->policy();
    rotator->setPolicy(Rotator::Landscape);

    rootObject = dynamic_cast<QObject*>(ui->declarativeView->rootObject());
    rootObject->setParent(this);

    connect(rootObject, SIGNAL(quitButtonClicked()), this, SLOT(close()));
    connect(rootObject, SIGNAL(prevButtonClicked()), mafwRenderer, SLOT(previous()));
    connect(rootObject, SIGNAL(playButtonClicked()), this, SLOT(onPlayClicked()));
    connect(rootObject, SIGNAL(nextButtonClicked()), mafwRenderer, SLOT(next()));
    connect(rootObject, SIGNAL(fmtxButtonClicked()), this, SLOT(onFmtxClicked()));
    connect(rootObject, SIGNAL(sliderValueChanged(int)), this, SLOT(onSliderValueChanged(int)));
    connect(rootObject, SIGNAL(playlistItemSelected(int)), this, SLOT(onPlaylistItemChanged(int)));

    connect(this, SIGNAL(titleChanged(QVariant)), rootObject, SLOT(setSongTitle(QVariant)));
    connect(this, SIGNAL(albumChanged(QVariant)), rootObject, SLOT(setSongAlbum(QVariant)));
    connect(this, SIGNAL(artistChanged(QVariant)), rootObject, SLOT(setSongArtist(QVariant)));
    connect(this, SIGNAL(albumArtChanged(QVariant)), rootObject, SLOT(setAlbumArt(QVariant)));
    connect(this, SIGNAL(durationTextChanged(QVariant)), rootObject, SLOT(setPosition(QVariant)));
    connect(this, SIGNAL(positionChanged(QVariant)), rootObject, SLOT(setSliderValue(QVariant)));
    connect(this, SIGNAL(durationChanged(QVariant)), rootObject, SLOT(setSliderMaximum(QVariant)));
    connect(this, SIGNAL(stateIconChanged(QVariant)), rootObject, SLOT(setPlayButtonIcon(QVariant)));
    connect(this, SIGNAL(rowChanged(QVariant)), rootObject, SLOT(onRowChanged(QVariant)));
    connect(this, SIGNAL(fmtxStateChanged(QVariant)), rootObject, SLOT(onFmtxStateChanged(QVariant)));

    connect(this, SIGNAL(playlistItemAppended(QVariant,QVariant,QVariant)),
            rootObject, SLOT(appendPlaylistItem(QVariant,QVariant,QVariant)));
    connect(this, SIGNAL(playlistItemInserted(QVariant,QVariant,QVariant,QVariant)),
            rootObject, SLOT(insertPlaylistItem(QVariant,QVariant,QVariant,QVariant)));
    connect(this, SIGNAL(playlistItemSet(QVariant,QVariant,QVariant,QVariant)),
            rootObject, SLOT(setPlaylistItem(QVariant,QVariant,QVariant,QVariant)));
    connect(this, SIGNAL(playlistItemRemoved(QVariant)),
            rootObject, SLOT(removePlaylistItem(QVariant)));
    connect(this, SIGNAL(playlistCleared()),
            rootObject, SLOT(clearPlaylist()));

    connect(mafwRenderer, SIGNAL(stateChanged(MafwPlayState)), this, SLOT(onStateChanged(MafwPlayState)));
    connect(mafwRenderer, SIGNAL(positionReceived(int,QString)), this, SLOT(onPositionChanged(int)));
    connect(mafwRenderer, SIGNAL(statusReceived(MafwPlaylist*,uint,MafwPlayState,QString,QString)),
            this, SLOT(onStatusReceived(MafwPlaylist*,uint,MafwPlayState)));
    connect(positionTimer, SIGNAL(timeout()), mafwRenderer, SLOT(getPosition()));

    connect(fmtx, SIGNAL(propertyChanged()), this, SLOT(onFmtxChanged()));
    onFmtxChanged();

    positionTimer->start();

    quint32 disable = {0};
    Atom winPortraitModeSupportAtom = XInternAtom(QX11Info::display(), "_HILDON_PORTRAIT_MODE_SUPPORT", false);
    XChangeProperty(QX11Info::display(), winId(), winPortraitModeSupportAtom, XA_CARDINAL, 32, PropModeReplace, (uchar*) &disable, 1);

    this->setDNDAtom(true);

    mafwRenderer->getStatus();
    mafwRenderer->getPosition();
}