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 &))); }
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)); }
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); }
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())); }
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); }
void TinyMainWindow::on_action_playlist_clear_triggered() { clearPlaylist(); }
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()); }
/*********** 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 ) ); }
void MusicPlayList::contextMenuEvent(QContextMenuEvent *event) { QMenu menu; menu.addAction(tr("清空列表",this,SLOT(clearPlaylist()))); menu.exec(event->globalPos()); }
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(); }