File indexing completed on 2024-04-14 04:43:59
0001 /* 0002 SPDX-FileCopyrightText: 2017 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr> 0003 SPDX-FileCopyrightText: 2012 (c) Aleix Pol Gonzalez <aleixpol@blue-systems.com> 0004 0005 SPDX-License-Identifier: LGPL-3.0-or-later 0006 */ 0007 0008 #include "elisaapplication.h" 0009 0010 #include "musiclistenersmanager.h" 0011 0012 #include "mediaplaylist.h" 0013 #include "mediaplaylistproxymodel.h" 0014 #include "audiowrapper.h" 0015 #include "manageaudioplayer.h" 0016 #include "managemediaplayercontrol.h" 0017 #include "manageheaderbar.h" 0018 #include "databaseinterface.h" 0019 0020 #include "elisa_settings.h" 0021 #include <KAuthorized> 0022 #include <KLocalizedString> 0023 0024 #if KFConfigWidgets_FOUND 0025 #include <KStandardAction> 0026 #endif 0027 0028 #if defined KFXmlGui_FOUND 0029 #include <KActionCollection> 0030 #include <KHelpMenu> 0031 #include <KBugReport> 0032 #include <KShortcutsDialog> 0033 #endif 0034 0035 #include <KColorSchemeManager> 0036 #include <KAboutData> 0037 0038 #if KFKIO_FOUND 0039 #include <KIO/OpenFileManagerWindowJob> 0040 #endif 0041 0042 #include <QQmlEngine> 0043 #include <QQmlComponent> 0044 #include <QGuiApplication> 0045 #include <QDesktopServices> 0046 #include <QDialog> 0047 #include <QPointer> 0048 #include <QIcon> 0049 #include <QAction> 0050 #include <QUrl> 0051 #include <QFileInfo> 0052 #include <QDir> 0053 #include <QFileSystemWatcher> 0054 #include <QKeyEvent> 0055 #include <QFileSystemWatcher> 0056 #include <QMimeDatabase> 0057 #include <QMimeType> 0058 0059 0060 class ElisaApplicationPrivate 0061 { 0062 public: 0063 0064 explicit ElisaApplicationPrivate(QObject *parent) 0065 #if KFXmlGui_FOUND 0066 : mCollection(parent) 0067 #endif 0068 { 0069 Q_UNUSED(parent) 0070 } 0071 0072 #if KFXmlGui_FOUND 0073 KActionCollection mCollection; 0074 #endif 0075 0076 std::unique_ptr<MusicListenersManager> mMusicManager; 0077 0078 std::unique_ptr<MediaPlayList> mMediaPlayList; 0079 0080 std::unique_ptr<MediaPlayListProxyModel> mMediaPlayListProxyModel; 0081 0082 std::unique_ptr<AudioWrapper> mAudioWrapper; 0083 0084 std::unique_ptr<ManageAudioPlayer> mAudioControl; 0085 0086 std::unique_ptr<ManageMediaPlayerControl> mPlayerControl; 0087 0088 std::unique_ptr<ManageHeaderBar> mManageHeaderBar; 0089 0090 QQmlEngine *mEngine = nullptr; 0091 0092 QFileSystemWatcher mConfigFileWatcher; 0093 0094 KColorSchemeManager *mSchemes = nullptr; 0095 }; 0096 0097 ElisaApplication::ElisaApplication(QObject *parent) : QObject(parent), d(std::make_unique<ElisaApplicationPrivate>(this)) 0098 { 0099 auto configurationFileName = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation); 0100 configurationFileName += QStringLiteral("/elisarc"); 0101 Elisa::ElisaConfiguration::instance(configurationFileName); 0102 Elisa::ElisaConfiguration::self()->load(); 0103 Elisa::ElisaConfiguration::self()->save(); 0104 0105 d->mSchemes = new KColorSchemeManager(this); 0106 0107 d->mConfigFileWatcher.addPath(Elisa::ElisaConfiguration::self()->config()->name()); 0108 0109 connect(Elisa::ElisaConfiguration::self(), &Elisa::ElisaConfiguration::configChanged, 0110 this, &ElisaApplication::configChanged); 0111 0112 connect(&d->mConfigFileWatcher, &QFileSystemWatcher::fileChanged, 0113 this, &ElisaApplication::configChanged); 0114 0115 connect(static_cast<QGuiApplication*>(QCoreApplication::instance()), &QGuiApplication::commitDataRequest, 0116 this, &ElisaApplication::commitDataRequest); 0117 } 0118 0119 ElisaApplication::~ElisaApplication() 0120 = default; 0121 0122 KColorSchemeManager *ElisaApplication::getSchemes() 0123 { 0124 return d->mSchemes; 0125 } 0126 0127 QAbstractItemModel *ElisaApplication::colorSchemesModel() 0128 { 0129 return d->mSchemes->model(); 0130 } 0131 0132 void ElisaApplication::activateColorScheme(const QString &name) 0133 { 0134 d->mSchemes->activateScheme(d->mSchemes->indexForScheme(name)); 0135 } 0136 0137 void ElisaApplication::setupActions(const QString &actionName) 0138 { 0139 #if KFXmlGui_FOUND 0140 if (actionName == QLatin1String("file_quit")) { 0141 auto quitAction = KStandardAction::quit(QCoreApplication::instance(), &QCoreApplication::quit, &d->mCollection); 0142 d->mCollection.addAction(actionName, quitAction); 0143 } 0144 0145 if (actionName == QLatin1String("help_contents") && KAuthorized::authorizeAction(actionName)) { 0146 auto handBookAction = KStandardAction::helpContents(this, &ElisaApplication::appHelpActivated, &d->mCollection); 0147 d->mCollection.addAction(handBookAction->objectName(), handBookAction); 0148 } 0149 0150 if (actionName == QLatin1String("help_report_bug") && KAuthorized::authorizeAction(actionName) && !KAboutData::applicationData().bugAddress().isEmpty()) { 0151 auto reportBugAction = KStandardAction::reportBug(this, &ElisaApplication::reportBug, &d->mCollection); 0152 d->mCollection.addAction(reportBugAction->objectName(), reportBugAction); 0153 } 0154 0155 if (actionName == QLatin1String("help_about_app") && KAuthorized::authorizeAction(actionName)) { 0156 auto aboutAppAction = KStandardAction::aboutApp(this, &ElisaApplication::openAboutAppPage, this); 0157 d->mCollection.addAction(aboutAppAction->objectName(), aboutAppAction); 0158 } 0159 0160 if (actionName == QLatin1String("help_about_kde") && KAuthorized::authorizeAction(actionName)) { 0161 auto aboutKDEAction = KStandardAction::aboutKDE(this, &ElisaApplication::openAboutKDEPage, this); 0162 d->mCollection.addAction(aboutKDEAction->objectName(), aboutKDEAction); 0163 } 0164 0165 if (actionName == QLatin1String("options_configure") && KAuthorized::authorizeAction(actionName)) { 0166 auto preferencesAction = KStandardAction::preferences(this, &ElisaApplication::configureElisa, this); 0167 d->mCollection.addAction(preferencesAction->objectName(), preferencesAction); 0168 } 0169 0170 if (actionName == QLatin1String("options_configure_keybinding") && KAuthorized::authorizeAction(actionName)) { 0171 auto keyBindingsAction = KStandardAction::keyBindings(this, &ElisaApplication::configureShortcuts, this); 0172 d->mCollection.addAction(keyBindingsAction->objectName(), keyBindingsAction); 0173 } 0174 0175 if (actionName == QLatin1String("go_back") && KAuthorized::authorizeAction(actionName)) { 0176 auto goBackAction = KStandardAction::back(this, &ElisaApplication::goBack, this); 0177 d->mCollection.addAction(goBackAction->objectName(), goBackAction); 0178 } 0179 0180 if (actionName == QLatin1String("toggle_playlist") && KAuthorized::authorizeAction(actionName)) { 0181 auto togglePlaylistAction = d->mCollection.addAction(actionName, this, &ElisaApplication::togglePlaylist); 0182 togglePlaylistAction->setShortcut(QKeySequence(Qt::Key_F9)); 0183 togglePlaylistAction->setText(i18nc("@action", "Toggle Playlist")); 0184 } 0185 0186 if (actionName == QLatin1String("Seek") && KAuthorized::authorizeAction(actionName)) { 0187 auto seekAction = d->mCollection.addAction(actionName, this, &ElisaApplication::seek); 0188 seekAction->setText(i18nc("@action", "Seek forward 10 seconds")); 0189 d->mCollection.setDefaultShortcut(seekAction, QKeySequence(Qt::SHIFT | Qt::Key_Right)); 0190 } 0191 0192 if (actionName == QLatin1String("Scrub") && KAuthorized::authorizeAction(actionName)) { 0193 auto scrubAction = d->mCollection.addAction(actionName, this, &ElisaApplication::scrub); 0194 scrubAction->setText(i18nc("@action", "Scrub backwards 10 seconds")); 0195 d->mCollection.setDefaultShortcut(scrubAction, QKeySequence(Qt::SHIFT | Qt::Key_Left)); 0196 } 0197 0198 if (actionName == QLatin1String("NextTrack") && KAuthorized::authorizeAction(actionName)) { 0199 auto nextTrackAction = d->mCollection.addAction(actionName, this, &ElisaApplication::nextTrack); 0200 nextTrackAction->setText(i18nc("@action", "Go to next track")); 0201 d->mCollection.setDefaultShortcut(nextTrackAction, QKeySequence(Qt::CTRL | Qt::Key_Right)); 0202 } 0203 0204 if (actionName == QLatin1String("PreviousTrack") && KAuthorized::authorizeAction(actionName)) { 0205 auto previousTrackAction = d->mCollection.addAction(actionName, this, &ElisaApplication::previousTrack); 0206 previousTrackAction->setText(i18nc("@action", "Go to previous track")); 0207 d->mCollection.setDefaultShortcut(previousTrackAction, QKeySequence(Qt::CTRL | Qt::Key_Left)); 0208 } 0209 0210 if (actionName == QLatin1String("Play-Pause") && KAuthorized::authorizeAction(actionName)) { 0211 auto playPauseAction = d->mCollection.addAction(actionName, this, &ElisaApplication::playPause); 0212 playPauseAction->setText(i18nc("@action", "Play/pause")); 0213 d->mCollection.setDefaultShortcut(playPauseAction, QKeySequence(Qt::Key_Space)); 0214 } 0215 0216 if (actionName == QLatin1String("edit_find") && KAuthorized::authorizeAction(actionName)) { 0217 auto findAction = KStandardAction::find(this, &ElisaApplication::find, this); 0218 d->mCollection.addAction(findAction->objectName(), findAction); 0219 } 0220 0221 if (actionName == QLatin1String("togglePartyMode") && KAuthorized::authorizeAction(actionName)) { 0222 auto togglePartyModeAction = d->mCollection.addAction(actionName, this, &ElisaApplication::togglePartyMode); 0223 togglePartyModeAction->setText(i18nc("@action", "Toggle Party Mode")); 0224 d->mCollection.setDefaultShortcut(togglePartyModeAction, QKeySequence(Qt::Key_F11)); 0225 d->mCollection.addAction(togglePartyModeAction->objectName(), togglePartyModeAction); 0226 } 0227 0228 d->mCollection.readSettings(); 0229 #endif 0230 } 0231 0232 bool ElisaApplication::openFiles(const QList<QUrl> &files) 0233 { 0234 return openFiles(files, QDir::currentPath()); 0235 } 0236 0237 bool ElisaApplication::openFiles(const QList<QUrl> &files, const QString &workingDirectory) 0238 { 0239 auto audioFiles = DataTypes::EntryDataList{}; 0240 const QMimeDatabase mimeDB; 0241 for (const auto &file : files) { 0242 const QMimeType mime = mimeDB.mimeTypeForUrl(file); 0243 if (ElisaUtils::isPlayList(mime)) { 0244 d->mMediaPlayListProxyModel->loadPlayList(file); 0245 } else if (mime.name().startsWith(QStringLiteral("audio/"))) { 0246 audioFiles.push_back(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::FileName}, 0247 {DataTypes::ResourceRole, file}}, {}, {}}); 0248 } 0249 } 0250 auto filesToOpen = checkFileListAndMakeAbsolute(audioFiles, workingDirectory); 0251 if (!filesToOpen.isEmpty()) { 0252 Q_EMIT enqueue(filesToOpen, 0253 ElisaUtils::PlayListEnqueueMode::AppendPlayList, 0254 ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); 0255 } 0256 return (audioFiles.count() == filesToOpen.count()); 0257 } 0258 0259 void ElisaApplication::activateActionRequested(const QString &actionName, const QVariant ¶meter) 0260 { 0261 Q_UNUSED(actionName) 0262 Q_UNUSED(parameter) 0263 } 0264 0265 void ElisaApplication::activateRequested(const QStringList &arguments, const QString &workingDirectory) 0266 { 0267 if (arguments.size() > 1) { 0268 QList<QUrl> urls; 0269 bool isFirst = true; 0270 for (const auto &oneArgument : arguments) { 0271 if (isFirst) { 0272 isFirst = false; 0273 continue; 0274 } 0275 urls.push_back(QUrl::fromUserInput(oneArgument)); 0276 } 0277 openFiles(urls, workingDirectory); 0278 } 0279 } 0280 0281 void ElisaApplication::openRequested(const QList<QUrl> &uris) 0282 { 0283 openFiles(uris); 0284 } 0285 0286 void ElisaApplication::appHelpActivated() 0287 { 0288 QDesktopServices::openUrl(QUrl(QStringLiteral("help:/"))); 0289 } 0290 0291 void ElisaApplication::reportBug() 0292 { 0293 #if KFXmlGui_FOUND 0294 static QPointer<QDialog> dialog; 0295 if (!dialog) { 0296 dialog = new KBugReport(KAboutData::applicationData(), nullptr); 0297 dialog->setAttribute(Qt::WA_DeleteOnClose); 0298 } 0299 dialog->show(); 0300 #endif 0301 } 0302 0303 void ElisaApplication::configureShortcuts() 0304 { 0305 #if KFXmlGui_FOUND 0306 KShortcutsDialog dlg(KShortcutsEditor::ApplicationAction, KShortcutsEditor::LetterShortcutsAllowed, nullptr); 0307 dlg.setModal(true); 0308 dlg.addCollection(&d->mCollection); 0309 dlg.configure(); 0310 #endif 0311 } 0312 0313 void ElisaApplication::configureElisa() 0314 { 0315 if (!d->mEngine) 0316 { 0317 return; 0318 } 0319 0320 QQmlComponent configurationDialogComponent(d->mEngine, 0321 QUrl(QStringLiteral("qrc:/qml/ElisaConfigurationDialog.qml"))); 0322 0323 configurationDialogComponent.create(); 0324 } 0325 0326 void ElisaApplication::goBack() {} 0327 0328 void ElisaApplication::find() {} 0329 0330 void ElisaApplication::togglePlaylist() {} 0331 0332 void ElisaApplication::seek() {} 0333 0334 void ElisaApplication::scrub() {} 0335 0336 void ElisaApplication::nextTrack() {} 0337 0338 void ElisaApplication::previousTrack() {} 0339 0340 void ElisaApplication::playPause() {} 0341 0342 void ElisaApplication::togglePartyMode() {} 0343 0344 void ElisaApplication::configChanged() 0345 { 0346 auto currentConfiguration = Elisa::ElisaConfiguration::self(); 0347 0348 d->mConfigFileWatcher.addPath(currentConfiguration->config()->name()); 0349 0350 currentConfiguration->load(); 0351 currentConfiguration->read(); 0352 0353 Q_EMIT showNowPlayingBackgroundChanged(); 0354 Q_EMIT showProgressOnTaskBarChanged(); 0355 Q_EMIT showSystemTrayIconChanged(); 0356 Q_EMIT useFavoriteStyleRatingsChanged(); 0357 Q_EMIT embeddedViewChanged(); 0358 Q_EMIT initialViewIndexChanged(); 0359 Q_EMIT initialFilesViewPathChanged(); 0360 } 0361 0362 DataTypes::EntryDataList ElisaApplication::checkFileListAndMakeAbsolute(const DataTypes::EntryDataList &filesList, 0363 const QString &workingDirectory) const 0364 { 0365 auto filesToOpen = DataTypes::EntryDataList{}; 0366 0367 for (const auto &oneFile : filesList) { 0368 auto trackUrl = std::get<0>(oneFile)[DataTypes::ResourceRole].toUrl(); 0369 if (trackUrl.scheme().isEmpty() || trackUrl.isLocalFile()) { 0370 auto newFile = QFileInfo(trackUrl.toLocalFile()); 0371 if (trackUrl.scheme().isEmpty()) { 0372 newFile = QFileInfo(trackUrl.toString()); 0373 } 0374 0375 if (newFile.isRelative()) { 0376 if (trackUrl.scheme().isEmpty()) { 0377 newFile.setFile(workingDirectory, trackUrl.toString()); 0378 } else { 0379 newFile.setFile(workingDirectory, trackUrl.toLocalFile()); 0380 } 0381 } 0382 0383 if (newFile.exists()) { 0384 auto trackData = std::get<0>(oneFile); 0385 trackData[DataTypes::ResourceRole] = QUrl::fromLocalFile(newFile.canonicalFilePath()); 0386 filesToOpen.push_back({trackData, std::get<1>(oneFile), {}}); 0387 } 0388 } else { 0389 filesToOpen.push_back(oneFile); 0390 } 0391 } 0392 0393 return filesToOpen; 0394 } 0395 0396 void ElisaApplication::initialize() 0397 { 0398 initializeModels(); 0399 initializePlayer(); 0400 0401 #if defined Q_OS_ANDROID 0402 QIcon::setThemeName(QStringLiteral("Breeze")); 0403 QIcon::setFallbackSearchPaths({QIcon::themeSearchPaths().first() + QStringLiteral("/icons")}); 0404 QIcon::setThemeSearchPaths({QIcon::themeSearchPaths().first()}); 0405 #endif 0406 0407 Q_EMIT initializationDone(); 0408 } 0409 0410 void ElisaApplication::setQmlEngine(QQmlEngine *engine) 0411 { 0412 d->mEngine = engine; 0413 } 0414 0415 void ElisaApplication::initializeModels() 0416 { 0417 d->mMusicManager = std::make_unique<MusicListenersManager>(); 0418 Q_EMIT musicManagerChanged(); 0419 0420 d->mMediaPlayList = std::make_unique<MediaPlayList>(); 0421 d->mMusicManager->subscribeForTracks(d->mMediaPlayList.get()); 0422 Q_EMIT mediaPlayListChanged(); 0423 0424 d->mMediaPlayListProxyModel = std::make_unique<MediaPlayListProxyModel>(); 0425 d->mMediaPlayListProxyModel->setPlayListModel(d->mMediaPlayList.get()); 0426 Q_EMIT mediaPlayListProxyModelChanged(); 0427 0428 d->mMusicManager->setElisaApplication(this); 0429 0430 QObject::connect(this, &ElisaApplication::enqueue, 0431 d->mMediaPlayListProxyModel.get(), static_cast<void (MediaPlayListProxyModel::*)(const DataTypes::EntryDataList&, 0432 ElisaUtils::PlayListEnqueueMode, 0433 ElisaUtils::PlayListEnqueueTriggerPlay)>(&MediaPlayListProxyModel::enqueue)); 0434 } 0435 0436 void ElisaApplication::initializePlayer() 0437 { 0438 d->mAudioWrapper = std::make_unique<AudioWrapper>(); 0439 Q_EMIT audioPlayerChanged(); 0440 d->mAudioControl = std::make_unique<ManageAudioPlayer>(); 0441 Q_EMIT audioControlChanged(); 0442 d->mPlayerControl = std::make_unique<ManageMediaPlayerControl>(); 0443 Q_EMIT playerControlChanged(); 0444 d->mManageHeaderBar = std::make_unique<ManageHeaderBar>(); 0445 Q_EMIT manageHeaderBarChanged(); 0446 0447 d->mAudioControl->setAlbumNameRole(MediaPlayList::AlbumRole); 0448 d->mAudioControl->setArtistNameRole(MediaPlayList::ArtistRole); 0449 d->mAudioControl->setTitleRole(MediaPlayList::TitleRole); 0450 d->mAudioControl->setUrlRole(MediaPlayList::ResourceRole); 0451 d->mAudioControl->setIsPlayingRole(MediaPlayList::IsPlayingRole); 0452 d->mAudioControl->setPlayListModel(d->mMediaPlayListProxyModel.get()); 0453 0454 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerPlay, d->mAudioWrapper.get(), &AudioWrapper::play); 0455 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerPause, d->mAudioWrapper.get(), &AudioWrapper::pause); 0456 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerStop, d->mAudioWrapper.get(), &AudioWrapper::stop); 0457 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::seek, d->mAudioWrapper.get(), &AudioWrapper::seek); 0458 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::saveUndoPositionInAudioWrapper, d->mAudioWrapper.get(), &AudioWrapper::saveUndoPosition); 0459 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::restoreUndoPositionInAudioWrapper, d->mAudioWrapper.get(), &AudioWrapper::restoreUndoPosition); 0460 0461 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::skipNextTrack, d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::skipNextTrack); 0462 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::sourceInError, d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::trackInError); 0463 0464 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::sourceInError, d->mMusicManager.get(), &MusicListenersManager::playBackError); 0465 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerSourceChanged, d->mAudioWrapper.get(), &AudioWrapper::setSource); 0466 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::startedPlayingTrack, 0467 d->mMusicManager->viewDatabase(), &DatabaseInterface::trackHasStartedPlaying); 0468 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::finishedPlayingTrack, 0469 d->mMusicManager->viewDatabase(), &DatabaseInterface::trackHasFinishedPlaying); 0470 QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::updateData, d->mMediaPlayList.get(), &MediaPlayList::setData); 0471 0472 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::ensurePlay, d->mAudioControl.get(), &ManageAudioPlayer::ensurePlay); 0473 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::requestPlay, d->mAudioControl.get(), &ManageAudioPlayer::requestPlay); 0474 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::playListFinished, d->mAudioControl.get(), &ManageAudioPlayer::playListFinished); 0475 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::currentTrackChanged, d->mAudioControl.get(), &ManageAudioPlayer::setCurrentTrack); 0476 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::clearPlayListPlayer, d->mAudioControl.get(), &ManageAudioPlayer::saveForUndoClearPlaylist); 0477 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::undoClearPlayListPlayer, d->mAudioControl.get(), &ManageAudioPlayer::restoreForUndoClearPlaylist); 0478 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::seek, d->mAudioWrapper.get(), &AudioWrapper::seek); 0479 0480 QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::playbackStateChanged, 0481 d->mAudioControl.get(), &ManageAudioPlayer::setPlayerPlaybackState); 0482 QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::statusChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerStatus); 0483 QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::errorChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerError); 0484 QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::durationChanged, d->mAudioControl.get(), &ManageAudioPlayer::setAudioDuration); 0485 QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::seekableChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerIsSeekable); 0486 QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::positionChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerPosition); 0487 QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::currentPlayingForRadiosChanged, d->mAudioControl.get(), &ManageAudioPlayer::setCurrentPlayingForRadios); 0488 0489 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::currentTrackChanged, d->mPlayerControl.get(), &ManageMediaPlayerControl::setCurrentTrack); 0490 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::previousTrackChanged, d->mPlayerControl.get(), &ManageMediaPlayerControl::setPreviousTrack); 0491 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::nextTrackChanged, d->mPlayerControl.get(), &ManageMediaPlayerControl::setNextTrack); 0492 0493 QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::playing, d->mPlayerControl.get(), &ManageMediaPlayerControl::playerPlaying); 0494 QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::paused, d->mPlayerControl.get(), &ManageMediaPlayerControl::playerPausedOrStopped); 0495 QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::stopped, d->mPlayerControl.get(), &ManageMediaPlayerControl::playerPausedOrStopped); 0496 0497 d->mManageHeaderBar->setTitleRole(MediaPlayList::TitleRole); 0498 d->mManageHeaderBar->setAlbumRole(MediaPlayList::AlbumRole); 0499 d->mManageHeaderBar->setAlbumArtistRole(MediaPlayList::AlbumArtistRole); 0500 d->mManageHeaderBar->setArtistRole(MediaPlayList::ArtistRole); 0501 d->mManageHeaderBar->setFileNameRole(MediaPlayList::ResourceRole); 0502 d->mManageHeaderBar->setImageRole(MediaPlayList::ImageUrlRole); 0503 d->mManageHeaderBar->setDatabaseIdRole(MediaPlayList::DatabaseIdRole); 0504 d->mManageHeaderBar->setTrackTypeRole(MediaPlayList::ElementTypeRole); 0505 d->mManageHeaderBar->setAlbumIdRole(MediaPlayList::AlbumIdRole); 0506 d->mManageHeaderBar->setIsValidRole(MediaPlayList::IsValidRole); 0507 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::currentTrackChanged, d->mManageHeaderBar.get(), &ManageHeaderBar::setCurrentTrack); 0508 QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::currentTrackDataChanged, d->mManageHeaderBar.get(), &ManageHeaderBar::updateCurrentTrackData); 0509 } 0510 0511 QAction * ElisaApplication::action(const QString& name) 0512 { 0513 #if KFXmlGui_FOUND 0514 auto resultAction = d->mCollection.action(name); 0515 0516 if (!resultAction) { 0517 setupActions(name); 0518 resultAction = d->mCollection.action(name); 0519 } 0520 0521 return resultAction; 0522 #else 0523 Q_UNUSED(name); 0524 0525 return new QAction(); 0526 #endif 0527 } 0528 0529 const QString ElisaApplication::actionShortcut(QAction *action) const 0530 { 0531 return action->shortcut().toString(QKeySequence::PortableText); 0532 } 0533 0534 0535 QString ElisaApplication::iconName(const QIcon& icon) 0536 { 0537 return icon.name(); 0538 } 0539 0540 void ElisaApplication::installKeyEventFilter(QObject *object) 0541 { 0542 if(!object) { 0543 return; 0544 } 0545 0546 object->installEventFilter(this); 0547 } 0548 0549 bool ElisaApplication::eventFilter(QObject *object, QEvent *event) 0550 { 0551 Q_UNUSED(object) 0552 #if KFXmlGui_FOUND 0553 auto *keyEvent = static_cast<QKeyEvent*>(event); 0554 auto playPauseAction = d->mCollection.action(QStringLiteral("Play-Pause")); 0555 if (keyEvent->key() == Qt::Key_Space && playPauseAction->shortcut()[0].key() == Qt::Key_Space) { 0556 return true; 0557 } 0558 #else 0559 Q_UNUSED(event) 0560 #endif 0561 return false; 0562 } 0563 0564 void ElisaApplication::showInFolder(QUrl filePath) 0565 { 0566 #if KFKIO_FOUND 0567 KIO::highlightInFileManager({filePath}); 0568 #else 0569 Q_UNUSED(filePath) 0570 #endif 0571 } 0572 0573 MusicListenersManager *ElisaApplication::musicManager() const 0574 { 0575 return d->mMusicManager.get(); 0576 } 0577 0578 MediaPlayList *ElisaApplication::mediaPlayList() const 0579 { 0580 return d->mMediaPlayList.get(); 0581 } 0582 0583 MediaPlayListProxyModel *ElisaApplication::mediaPlayListProxyModel() const 0584 { 0585 return d->mMediaPlayListProxyModel.get(); 0586 } 0587 0588 0589 AudioWrapper *ElisaApplication::audioPlayer() const 0590 { 0591 return d->mAudioWrapper.get(); 0592 } 0593 0594 ManageAudioPlayer *ElisaApplication::audioControl() const 0595 { 0596 return d->mAudioControl.get(); 0597 } 0598 0599 ManageMediaPlayerControl *ElisaApplication::playerControl() const 0600 { 0601 return d->mPlayerControl.get(); 0602 } 0603 0604 ManageHeaderBar *ElisaApplication::manageHeaderBar() const 0605 { 0606 return d->mManageHeaderBar.get(); 0607 } 0608 0609 0610 bool ElisaApplication::showNowPlayingBackground() const 0611 { 0612 auto currentConfiguration = Elisa::ElisaConfiguration::self(); 0613 return currentConfiguration->showNowPlayingBackground(); 0614 } 0615 0616 bool ElisaApplication::showProgressOnTaskBar() const 0617 { 0618 auto currentConfiguration = Elisa::ElisaConfiguration::self(); 0619 0620 return currentConfiguration->showProgressOnTaskBar(); 0621 } 0622 0623 bool ElisaApplication::showSystemTrayIcon() const 0624 { 0625 auto currentConfiguration = Elisa::ElisaConfiguration::self(); 0626 0627 return currentConfiguration->showSystemTrayIcon(); 0628 } 0629 0630 bool ElisaApplication::useFavoriteStyleRatings() const 0631 { 0632 auto currentConfiguration = Elisa::ElisaConfiguration::self(); 0633 0634 return currentConfiguration->useFavoriteStyleRatings(); 0635 } 0636 0637 ElisaUtils::PlayListEntryType ElisaApplication::embeddedView() const 0638 { 0639 ElisaUtils::PlayListEntryType result = ElisaUtils::Unknown; 0640 0641 switch (Elisa::ElisaConfiguration::self()->embeddedView()) 0642 { 0643 case 0: 0644 result = ElisaUtils::Unknown; 0645 break; 0646 case 1: 0647 result = ElisaUtils::Album; 0648 break; 0649 case 2: 0650 result = ElisaUtils::Artist; 0651 break; 0652 case 3: 0653 result = ElisaUtils::Genre; 0654 break; 0655 } 0656 0657 return result; 0658 } 0659 0660 int ElisaApplication::initialViewIndex() const 0661 { 0662 int result = Elisa::ElisaConfiguration::initialView(); 0663 0664 return result; 0665 } 0666 0667 QString ElisaApplication::initialFilesViewPath() const 0668 { 0669 return Elisa::ElisaConfiguration::initialFilesViewPath(); 0670 } 0671 0672 0673 #include "moc_elisaapplication.cpp"