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