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