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 &parameter)
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"