diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index df6cd283..174db4a9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,498 +1,497 @@ include_directories(${elisa_BINARY_DIR}) set(elisaLib_SOURCES mediaplaylist.cpp progressindicator.cpp databaseinterface.cpp datatypes.cpp musiclistenersmanager.cpp managemediaplayercontrol.cpp manageheaderbar.cpp manageaudioplayer.cpp trackslistener.cpp elisaapplication.cpp modeldataloader.cpp elisautils.cpp abstractfile/abstractfilelistener.cpp abstractfile/abstractfilelisting.cpp filescanner.cpp viewmanager.cpp powermanagementinterface.cpp file/filelistener.cpp file/localfilelisting.cpp models/datamodel.cpp models/abstractmediaproxymodel.cpp models/gridviewproxymodel.cpp models/alltracksproxymodel.cpp models/singlealbumproxymodel.cpp models/trackmetadatamodel.cpp models/trackcontextmetadatamodel.cpp models/viewsmodel.cpp -) + localFileConfiguration/elisaconfigurationdialog.cpp + ) ecm_qt_declare_logging_category(elisaLib_SOURCES HEADER "indexersManager.h" IDENTIFIER "orgKdeElisaIndexersManager" CATEGORY_NAME "org.kde.elisa.indexers.manager" DEFAULT_SEVERITY Info ) ecm_qt_declare_logging_category(elisaLib_SOURCES HEADER "databaseLogging.h" IDENTIFIER "orgKdeElisaDatabase" CATEGORY_NAME "org.kde.elisa.database" DEFAULT_SEVERITY Info ) ecm_qt_declare_logging_category(elisaLib_SOURCES HEADER "abstractfile/indexercommon.h" IDENTIFIER "orgKdeElisaIndexer" CATEGORY_NAME "org.kde.elisa.indexer" DEFAULT_SEVERITY Info ) ecm_qt_declare_logging_category(elisaLib_SOURCES HEADER "models/modelLogging.h" IDENTIFIER "orgKdeElisaModel" CATEGORY_NAME "org.kde.elisa.model" DEFAULT_SEVERITY Info ) ecm_qt_declare_logging_category(elisaLib_SOURCES HEADER "playListLogging.h" IDENTIFIER "orgKdeElisaPlayList" CATEGORY_NAME "org.kde.elisa.playlist" DEFAULT_SEVERITY Info ) if (LIBVLC_FOUND) ecm_qt_declare_logging_category(elisaLib_SOURCES HEADER "vlcLogging.h" IDENTIFIER "orgKdeElisaPlayerVlc" CATEGORY_NAME "org.kde.elisa.player.vlc" DEFAULT_SEVERITY Info ) set(elisaLib_SOURCES ${elisaLib_SOURCES} audiowrapper_libvlc.cpp ) else() ecm_qt_declare_logging_category(elisaLib_SOURCES HEADER "qtMultimediaLogging.h" IDENTIFIER "orgKdeElisaPlayerQtMultimedia" CATEGORY_NAME "org.kde.elisa.player.qtMultimedia" DEFAULT_SEVERITY Info ) set(elisaLib_SOURCES ${elisaLib_SOURCES} audiowrapper_qtmultimedia.cpp ) endif() if (ANDROID) set(elisaLib_SOURCES ${elisaLib_SOURCES} android/androidmusiclistener.cpp ) endif() if (KF5KIO_FOUND) set(elisaLib_SOURCES ${elisaLib_SOURCES} models/filebrowsermodel.cpp models/filebrowserproxymodel.cpp ) endif() if (KF5Baloo_FOUND) if (Qt5DBus_FOUND) ecm_qt_declare_logging_category(elisaLib_SOURCES HEADER "baloo/baloocommon.h" IDENTIFIER "orgKdeElisaBaloo" CATEGORY_NAME "org.kde.elisa.baloo" DEFAULT_SEVERITY Info ) set(elisaLib_SOURCES ${elisaLib_SOURCES} baloo/localbaloofilelisting.cpp baloo/baloolistener.cpp baloo/baloodetector.cpp ) qt5_add_dbus_interface(elisaLib_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.main.xml baloo/main) qt5_add_dbus_interface(elisaLib_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.fileindexer.xml baloo/fileindexer) qt5_add_dbus_interface(elisaLib_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.scheduler.xml baloo/scheduler) qt5_add_dbus_adaptor(elisaLib_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.BalooWatcherApplication.xml baloo/localbaloofilelisting.h LocalBalooFileListing) endif() endif() if (Qt5DBus_FOUND) set(elisaLib_SOURCES ${elisaLib_SOURCES} mpris2/mpris2.cpp mpris2/mediaplayer2.cpp mpris2/mediaplayer2player.cpp ) endif() if (UPNPQT_FOUND) set(elisaLib_SOURCES ${elisaLib_SOURCES} upnp/upnpcontrolcontentdirectory.cpp upnp/upnpcontentdirectorymodel.cpp upnp/upnpcontrolconnectionmanager.cpp upnp/upnpcontrolmediaserver.cpp upnp/didlparser.cpp upnp/upnplistener.cpp upnp/upnpdiscoverallmusic.cpp ) endif() if (KF5Baloo_FOUND) if (Qt5DBus_FOUND) qt5_add_dbus_interface(elisaLib_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.fileindexer.xml baloo/fileindexer) qt5_add_dbus_interface(elisaLib_SOURCES ${BALOO_DBUS_INTERFACES_DIR}/org.kde.baloo.scheduler.xml baloo/scheduler) set(elisaLib_SOURCES ${elisaLib_SOURCES} ../src/baloo/baloolistener.cpp ../src/baloo/localbaloofilelisting.cpp ) endif() endif() kconfig_add_kcfg_files(elisaLib_SOURCES ../src/elisa_settings.kcfgc ) set(elisaLib_SOURCES ${elisaLib_SOURCES} ../src/elisa_core.kcfg ) add_library(elisaLib ${elisaLib_SOURCES}) target_link_libraries(elisaLib LINK_PUBLIC Qt5::Multimedia LINK_PRIVATE Qt5::Core Qt5::Sql Qt5::Widgets Qt5::Concurrent Qt5::Qml KF5::I18n KF5::CoreAddons KF5::ConfigCore KF5::ConfigGui) if (KF5FileMetaData_FOUND) target_link_libraries(elisaLib LINK_PRIVATE KF5::FileMetaData ) endif() if (KF5KIO_FOUND) target_link_libraries(elisaLib LINK_PUBLIC KF5::KIOCore KF5::KIOFileWidgets KF5::KIOWidgets ) endif() if (KF5XmlGui_FOUND) target_link_libraries(elisaLib LINK_PUBLIC KF5::XmlGui ) endif() if (KF5ConfigWidgets_FOUND) target_link_libraries(elisaLib LINK_PUBLIC KF5::ConfigWidgets ) endif() if (KF5KCMUtils_FOUND) target_link_libraries(elisaLib LINK_PUBLIC KF5::KCMUtils ) endif() if (KF5Baloo_FOUND) if (Qt5DBus_FOUND) target_link_libraries(elisaLib LINK_PUBLIC KF5::Baloo ) endif() endif() if (Qt5DBus_FOUND) target_link_libraries(elisaLib LINK_PUBLIC Qt5::DBus ) if (KF5DBusAddons_FOUND) target_link_libraries(elisaLib LINK_PUBLIC KF5::DBusAddons ) endif() endif() if (LIBVLC_FOUND) target_include_directories(elisaLib PRIVATE ${LIBVLC_INCLUDE_DIR} ) target_link_libraries(elisaLib LINK_PRIVATE ${LIBVLC_LIBRARY} ) endif() if (ANDROID) target_link_libraries(elisaLib LINK_PUBLIC Qt5::AndroidExtras ) endif() generate_export_header(elisaLib BASE_NAME ElisaLib EXPORT_FILE_NAME elisaLib_export.h) set_target_properties(elisaLib PROPERTIES VERSION 0.1 SOVERSION 0 EXPORT_NAME ElisaLib ) if (NOT APPLE AND NOT WIN32) install(TARGETS elisaLib LIBRARY DESTINATION ${KDE_INSTALL_FULL_LIBDIR}/elisa NAMELINK_SKIP RUNTIME DESTINATION ${KDE_INSTALL_FULL_LIBDIR}/elisa BUNDLE DESTINATION ${KDE_INSTALL_FULL_LIBDIR}/elisa ) else() install(TARGETS elisaLib ${INSTALL_TARGETS_DEFAULT_ARGS}) endif() set(elisaqmlplugin_SOURCES elisaqmlplugin.cpp elisautils.cpp ) if (KF5FileMetaData_FOUND) set(elisaqmlplugin_SOURCES ${elisaqmlplugin_SOURCES} embeddedcoverageimageprovider.cpp ) endif() add_library(elisaqmlplugin SHARED ${elisaqmlplugin_SOURCES}) target_link_libraries(elisaqmlplugin LINK_PRIVATE Qt5::Quick Qt5::Widgets KF5::ConfigCore KF5::ConfigGui elisaLib ) if (KF5FileMetaData_FOUND) target_link_libraries(elisaqmlplugin LINK_PRIVATE KF5::FileMetaData ) endif() set_target_properties(elisaqmlplugin PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/org/kde/elisa ) if (NOT APPLE AND NOT WIN32) set_target_properties(elisaqmlplugin PROPERTIES INSTALL_RPATH "${KDE_INSTALL_FULL_LIBDIR}/elisa;${CMAKE_INSTALL_RPATH}" ) endif() install(TARGETS elisaqmlplugin DESTINATION ${QML_INSTALL_DIR}/org/kde/elisa/) install(FILES qmldir DESTINATION ${QML_INSTALL_DIR}/org/kde/elisa) add_custom_target(copy) add_custom_target(copy2) file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/bin/org/kde/elisa) add_custom_command(TARGET copy PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/qmldir ${CMAKE_BINARY_DIR}/bin/org/kde/elisa/) add_custom_command(TARGET copy2 PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/plugins.qmltypes ${CMAKE_BINARY_DIR}/bin/org/kde/elisa/) add_dependencies(elisaqmlplugin copy copy2) if (Qt5Quick_FOUND AND Qt5Widgets_FOUND) set(elisa_SOURCES main.cpp windows/WindowsTheme.qml windows/PlatformIntegration.qml android/ElisaMainWindow.qml android/AndroidTheme.qml android/PlatformIntegration.qml android/AlbumsView.qml android/ArtistsView.qml android/TracksView.qml android/GenresView.qml qml/ElisaMainWindow.qml qml/ApplicationMenu.qml qml/NativeApplicationMenu.qml qml/BaseTheme.qml qml/Theme.qml qml/PlatformIntegration.qml qml/LabelWithToolTip.qml qml/RatingStar.qml qml/DraggableItem.qml qml/TrackImportNotification.qml qml/HeaderBar.qml qml/NavigationActionBar.qml qml/MediaPlayerControl.qml qml/ContextView.qml qml/ContentView.qml qml/ViewSelector.qml qml/ViewSelectorDelegate.qml qml/DataGridView.qml qml/DataListView.qml qml/MediaPlayListView.qml qml/PlayListBasicView.qml qml/PlayListEntry.qml qml/SimplePlayListView.qml qml/PlayListAlbumHeader.qml qml/BasicPlayListAlbumHeader.qml qml/MetaDataDelegate.qml qml/EditableMetaDataDelegate.qml qml/TracksDiscHeader.qml qml/MediaTrackMetadataView.qml qml/GridBrowserView.qml qml/GridBrowserDelegate.qml qml/ListBrowserView.qml qml/ListBrowserDelegate.qml qml/FileBrowserView.qml qml/ScrollHelper.qml qml/FlatButtonWithToolTip.qml qml/HeaderFooterToolbar.qml + + qml/ElisaConfigurationDialog.qml ) qt5_add_resources(elisa_SOURCES resources.qrc) set_property(SOURCE qrc_resources.cpp PROPERTY SKIP_AUTOMOC ON) set(elisa_ICONS_PNG ../icons/128-apps-elisa.png ../icons/64-apps-elisa.png ../icons/48-apps-elisa.png ../icons/32-apps-elisa.png ../icons/22-apps-elisa.png ../icons/16-apps-elisa.png ) # add icons to application sources, to have them bundled ecm_add_app_icon(elisa_SOURCES ICONS ${elisa_ICONS_PNG}) add_executable(elisa ${elisa_SOURCES}) target_include_directories(elisa PRIVATE ${KDSoap_INCLUDE_DIRS}) target_link_libraries(elisa LINK_PRIVATE elisaLib Qt5::Widgets Qt5::QuickControls2 KF5::I18n KF5::CoreAddons KF5::ConfigCore KF5::ConfigGui ) if (ANDROID) target_link_libraries(elisa LINK_PRIVATE Qt5::AndroidExtras Qt5::Svg Qt5::Sql Qt5::Concurrent KF5::Kirigami2 ) endif() if (KF5Crash_FOUND) target_link_libraries(elisa LINK_PRIVATE KF5::Crash ) endif() if (KF5Declarative_FOUND) target_link_libraries(elisa LINK_PRIVATE KF5::Declarative KF5::QuickAddons ) endif() if (NOT APPLE AND NOT WIN32) set_target_properties(elisa PROPERTIES INSTALL_RPATH "${KDE_INSTALL_FULL_LIBDIR}/elisa;${CMAKE_INSTALL_RPATH}" ) endif() install(TARGETS elisa ${INSTALL_TARGETS_DEFAULT_ARGS}) endif() -if (KF5ConfigWidgets_FOUND AND KF5Declarative_FOUND) - add_subdirectory(localFileConfiguration) -endif() - set(elisaImport_SOURCES elisaimport.cpp elisaimportapplication.cpp ) kconfig_add_kcfg_files(elisaImport_SOURCES ../src/elisa_settings.kcfgc ) set(elisaImport_SOURCES ${elisaImport_SOURCES} ../src/elisa_core.kcfg ) add_executable(elisaImport ${elisaImport_SOURCES}) target_link_libraries(elisaImport LINK_PRIVATE KF5::ConfigCore KF5::ConfigGui elisaLib ) if (KF5FileMetaData_FOUND) target_link_libraries(elisaImport LINK_PRIVATE KF5::FileMetaData ) endif() set(QML_IMPORT_PATH ${CMAKE_BINARY_DIR}/bin CACHE INTERNAL "qml import path" FORCE) if (ANDROID) kirigami_package_breeze_icons(ICONS elisa) endif() diff --git a/src/elisaapplication.cpp b/src/elisaapplication.cpp index 054ad229..8f932825 100644 --- a/src/elisaapplication.cpp +++ b/src/elisaapplication.cpp @@ -1,500 +1,507 @@ /* * Copyright 2017 Matthieu Gallien * Copyright (C) 2012 Aleix Pol Gonzalez * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "elisaapplication.h" #include "musiclistenersmanager.h" #include "mediaplaylist.h" #include "audiowrapper.h" #include "manageaudioplayer.h" #include "managemediaplayercontrol.h" #include "manageheaderbar.h" #include "databaseinterface.h" #include "elisa_settings.h" #include #if defined KF5ConfigWidgets_FOUND && KF5ConfigWidgets_FOUND #include #endif #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND #include #include #include #include #include #endif #if defined KF5KCMUtils_FOUND && KF5KCMUtils_FOUND #include #endif #include +#include #include #include #include #include #include #include #include #include #include #include #include #include class ElisaApplicationPrivate { public: explicit ElisaApplicationPrivate(QObject *parent) #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND : mCollection(parent) #endif { Q_UNUSED(parent) auto configurationFileName = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation); configurationFileName += QStringLiteral("/elisarc"); Elisa::ElisaConfiguration::instance(configurationFileName); Elisa::ElisaConfiguration::self()->load(); Elisa::ElisaConfiguration::self()->save(); } #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND KActionCollection mCollection; #endif ElisaUtils::EntryDataList mArguments; std::unique_ptr mMusicManager; std::unique_ptr mMediaPlayList; std::unique_ptr mAudioWrapper; std::unique_ptr mAudioControl; std::unique_ptr mPlayerControl; std::unique_ptr mManageHeaderBar; + QQmlApplicationEngine *mEngine = nullptr; + }; ElisaApplication::ElisaApplication(QObject *parent) : QObject(parent), d(std::make_unique(this)) { } ElisaApplication::~ElisaApplication() = default; void ElisaApplication::setupActions(const QString &actionName) { #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND if (actionName == QLatin1String("file_quit")) { auto quitAction = KStandardAction::quit(QCoreApplication::instance(), &QCoreApplication::quit, &d->mCollection); d->mCollection.addAction(actionName, quitAction); } if (actionName == QLatin1String("help_contents") && KAuthorized::authorizeAction(actionName)) { auto handBookAction = KStandardAction::helpContents(this, &ElisaApplication::appHelpActivated, &d->mCollection); d->mCollection.addAction(handBookAction->objectName(), handBookAction); } if (actionName == QLatin1String("help_report_bug") && KAuthorized::authorizeAction(actionName) && !KAboutData::applicationData().bugAddress().isEmpty()) { auto reportBugAction = KStandardAction::reportBug(this, &ElisaApplication::reportBug, &d->mCollection); d->mCollection.addAction(reportBugAction->objectName(), reportBugAction); } if (actionName == QLatin1String("help_about_app") && KAuthorized::authorizeAction(actionName)) { auto aboutAppAction = KStandardAction::aboutApp(this, &ElisaApplication::aboutApplication, this); d->mCollection.addAction(aboutAppAction->objectName(), aboutAppAction); } if (actionName == QLatin1String("options_configure") && KAuthorized::authorizeAction(actionName)) { auto preferencesAction = KStandardAction::preferences(this, &ElisaApplication::configureElisa, this); d->mCollection.addAction(preferencesAction->objectName(), preferencesAction); } if (actionName == QLatin1String("options_configure_keybinding") && KAuthorized::authorizeAction(actionName)) { auto keyBindingsAction = KStandardAction::keyBindings(this, &ElisaApplication::configureShortcuts, this); d->mCollection.addAction(keyBindingsAction->objectName(), keyBindingsAction); } if (actionName == QLatin1String("go_back") && KAuthorized::authorizeAction(actionName)) { auto goBackAction = KStandardAction::back(this, &ElisaApplication::goBack, this); d->mCollection.addAction(goBackAction->objectName(), goBackAction); } if (actionName == QLatin1String("toggle_playlist") && KAuthorized::authorizeAction(actionName)) { auto togglePlaylistAction = d->mCollection.addAction(actionName, this, &ElisaApplication::togglePlaylist); togglePlaylistAction->setShortcut(QKeySequence(Qt::Key_F9)); togglePlaylistAction->setText(QStringLiteral("Toggle Playlist")); } if (actionName == QLatin1String("Seek") && KAuthorized::authorizeAction(actionName)) { auto seekAction = d->mCollection.addAction(actionName, this, &ElisaApplication::seek); d->mCollection.setDefaultShortcut(seekAction, QKeySequence(Qt::SHIFT + Qt::Key_Right)); } if (actionName == QLatin1String("Scrub") && KAuthorized::authorizeAction(actionName)) { auto scrubAction = d->mCollection.addAction(actionName, this, &ElisaApplication::scrub); d->mCollection.setDefaultShortcut(scrubAction, QKeySequence(Qt::SHIFT + Qt::Key_Left)); } if (actionName == QLatin1String("Play-Pause") && KAuthorized::authorizeAction(actionName)) { auto playPauseAction = d->mCollection.addAction(actionName, this, &ElisaApplication::playPause); d->mCollection.setDefaultShortcut(playPauseAction, QKeySequence(Qt::Key_Space)); } if (actionName == QLatin1String("edit_find") && KAuthorized::authorizeAction(actionName)) { auto findAction = KStandardAction::find(this, &ElisaApplication::find, this); d->mCollection.addAction(findAction->objectName(), findAction); } d->mCollection.readSettings(); #endif } void ElisaApplication::setArguments(const ElisaUtils::EntryDataList &newArguments) { if (d->mArguments == newArguments) { return; } d->mArguments = checkFileListAndMakeAbsolute(newArguments, QDir::currentPath()); Q_EMIT argumentsChanged(); if (!d->mArguments.isEmpty()) { Q_EMIT enqueue(d->mArguments, ElisaUtils::FileName, ElisaUtils::PlayListEnqueueMode::AppendPlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); } } void ElisaApplication::activateActionRequested(const QString &actionName, const QVariant ¶meter) { Q_UNUSED(actionName) Q_UNUSED(parameter) } void ElisaApplication::activateRequested(const QStringList &arguments, const QString &workingDirectory) { if (arguments.size() > 1) { auto realArguments = ElisaUtils::EntryDataList{}; bool isFirst = true; for (const auto &oneArgument : arguments) { if (isFirst) { isFirst = false; continue; } realArguments.push_back(ElisaUtils::EntryData{0, {}, QUrl(oneArgument)}); } Q_EMIT enqueue(checkFileListAndMakeAbsolute(realArguments, workingDirectory), ElisaUtils::FileName, ElisaUtils::PlayListEnqueueMode::AppendPlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); } } void ElisaApplication::openRequested(const QList &uris) { Q_UNUSED(uris) } void ElisaApplication::appHelpActivated() { QDesktopServices::openUrl(QUrl(QStringLiteral("help:/"))); } void ElisaApplication::aboutApplication() { #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND static QPointer dialog; if (!dialog) { dialog = new KAboutApplicationDialog(KAboutData::applicationData(), nullptr); dialog->setAttribute(Qt::WA_DeleteOnClose); } dialog->show(); #endif } void ElisaApplication::reportBug() { #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND static QPointer dialog; if (!dialog) { dialog = new KBugReport(KAboutData::applicationData(), nullptr); dialog->setAttribute(Qt::WA_DeleteOnClose); } dialog->show(); #endif } void ElisaApplication::configureShortcuts() { #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND KShortcutsDialog dlg(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsAllowed, nullptr); dlg.setModal(true); dlg.addCollection(&d->mCollection); dlg.configure(); #endif } void ElisaApplication::configureElisa() { -#if defined KF5KCMUtils_FOUND && KF5KCMUtils_FOUND - KCMultiDialog configurationDialog; + if (!d->mEngine) + { + return; + } - configurationDialog.addModule(QStringLiteral("kcm_elisa_local_file")); - configurationDialog.setModal(true); - configurationDialog.exec(); -#endif + d->mEngine->load(QUrl(QStringLiteral("qrc:/qml/ElisaConfigurationDialog.qml"))); } void ElisaApplication::goBack() {} void ElisaApplication::find() {} void ElisaApplication::togglePlaylist() {} void ElisaApplication::seek() {} void ElisaApplication::scrub() {} void ElisaApplication::playPause() {} ElisaUtils::EntryDataList ElisaApplication::checkFileListAndMakeAbsolute(const ElisaUtils::EntryDataList &filesList, const QString &workingDirectory) const { auto filesToOpen = ElisaUtils::EntryDataList{}; for (const auto &oneFile : filesList) { if (std::get<2>(oneFile).scheme().isEmpty() || std::get<2>(oneFile).isLocalFile()) { auto newFile = QFileInfo(std::get<2>(oneFile).toLocalFile()); if (std::get<2>(oneFile).scheme().isEmpty()) { newFile = QFileInfo(std::get<2>(oneFile).toString()); } if (newFile.isRelative()) { if (std::get<2>(oneFile).scheme().isEmpty()) { newFile.setFile(workingDirectory, std::get<2>(oneFile).toString()); } else { newFile.setFile(workingDirectory, std::get<2>(oneFile).toLocalFile()); } } if (newFile.exists()) { filesToOpen.push_back(ElisaUtils::EntryData{0, {}, QUrl::fromLocalFile(newFile.canonicalFilePath())}); } } else { filesToOpen.push_back(ElisaUtils::EntryData{0, {}, std::get<2>(oneFile)}); } } return filesToOpen; } void ElisaApplication::initialize() { initializeModels(); initializePlayer(); Q_EMIT initializationDone(); } +void ElisaApplication::setQmlEngine(QQmlApplicationEngine *engine) +{ + d->mEngine = engine; +} + void ElisaApplication::initializeModels() { d->mMusicManager = std::make_unique(); Q_EMIT musicManagerChanged(); d->mMediaPlayList = std::make_unique(); Q_EMIT mediaPlayListChanged(); d->mMusicManager->setElisaApplication(this); d->mMediaPlayList->setMusicListenersManager(d->mMusicManager.get()); QObject::connect(this, &ElisaApplication::enqueue, d->mMediaPlayList.get(), static_cast(&MediaPlayList::enqueue)); } void ElisaApplication::initializePlayer() { d->mAudioWrapper = std::make_unique(); Q_EMIT audioPlayerChanged(); d->mAudioControl = std::make_unique(); Q_EMIT audioControlChanged(); d->mPlayerControl = std::make_unique(); Q_EMIT playerControlChanged(); d->mManageHeaderBar = std::make_unique(); Q_EMIT manageHeaderBarChanged(); d->mAudioControl->setAlbumNameRole(MediaPlayList::AlbumRole); d->mAudioControl->setArtistNameRole(MediaPlayList::ArtistRole); d->mAudioControl->setTitleRole(MediaPlayList::TitleRole); d->mAudioControl->setUrlRole(MediaPlayList::ResourceRole); d->mAudioControl->setIsPlayingRole(MediaPlayList::IsPlayingRole); d->mAudioControl->setPlayListModel(d->mMediaPlayList.get()); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerPlay, d->mAudioWrapper.get(), &AudioWrapper::play); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerPause, d->mAudioWrapper.get(), &AudioWrapper::pause); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerStop, d->mAudioWrapper.get(), &AudioWrapper::stop); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::seek, d->mAudioWrapper.get(), &AudioWrapper::seek); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::saveUndoPositionInAudioWrapper, d->mAudioWrapper.get(), &AudioWrapper::saveUndoPosition); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::restoreUndoPositionInAudioWrapper, d->mAudioWrapper.get(), &AudioWrapper::restoreUndoPosition); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::skipNextTrack, d->mMediaPlayList.get(), &MediaPlayList::skipNextTrack); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::sourceInError, d->mMediaPlayList.get(), &MediaPlayList::trackInError); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::sourceInError, d->mMusicManager.get(), &MusicListenersManager::playBackError); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerSourceChanged, d->mAudioWrapper.get(), &AudioWrapper::setSource); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::startedPlayingTrack, d->mMusicManager->viewDatabase(), &DatabaseInterface::trackHasStartedPlaying); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::currentPlayingForRadiosChanged, d->mMediaPlayList.get(), &MediaPlayList::updateRadioData); QObject::connect(d->mMediaPlayList.get(), &MediaPlayList::ensurePlay, d->mAudioControl.get(), &ManageAudioPlayer::ensurePlay); QObject::connect(d->mMediaPlayList.get(), &MediaPlayList::playListFinished, d->mAudioControl.get(), &ManageAudioPlayer::playListFinished); QObject::connect(d->mMediaPlayList.get(), &MediaPlayList::currentTrackChanged, d->mAudioControl.get(), &ManageAudioPlayer::setCurrentTrack); QObject::connect(d->mMediaPlayList.get(), &MediaPlayList::clearPlayListPlayer, d->mAudioControl.get(), &ManageAudioPlayer::saveForUndoClearPlaylist); QObject::connect(d->mMediaPlayList.get(), &MediaPlayList::undoClearPlayListPlayer, d->mAudioControl.get(), &ManageAudioPlayer::restoreForUndoClearPlaylist); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::playbackStateChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerPlaybackState); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::statusChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerStatus); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::errorChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerError); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::durationChanged, d->mAudioControl.get(), &ManageAudioPlayer::setAudioDuration); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::seekableChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerIsSeekable); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::positionChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerPosition); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::currentPlayingForRadiosChanged, d->mAudioControl.get(), &ManageAudioPlayer::setCurrentPlayingForRadios); QObject::connect(d->mMediaPlayList.get(), &MediaPlayList::currentTrackChanged, d->mPlayerControl.get(), &ManageMediaPlayerControl::setCurrentTrack); QObject::connect(d->mMediaPlayList.get(), &MediaPlayList::previousTrackChanged, d->mPlayerControl.get(), &ManageMediaPlayerControl::setPreviousTrack); QObject::connect(d->mMediaPlayList.get(), &MediaPlayList::nextTrackChanged, d->mPlayerControl.get(), &ManageMediaPlayerControl::setNextTrack); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::playing, d->mPlayerControl.get(), &ManageMediaPlayerControl::playerPlaying); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::paused, d->mPlayerControl.get(), &ManageMediaPlayerControl::playerPausedOrStopped); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::stopped, d->mPlayerControl.get(), &ManageMediaPlayerControl::playerPausedOrStopped); d->mManageHeaderBar->setTitleRole(MediaPlayList::TitleRole); d->mManageHeaderBar->setAlbumRole(MediaPlayList::AlbumRole); d->mManageHeaderBar->setAlbumArtistRole(MediaPlayList::AlbumArtistRole); d->mManageHeaderBar->setArtistRole(MediaPlayList::ArtistRole); d->mManageHeaderBar->setFileNameRole(MediaPlayList::ResourceRole); d->mManageHeaderBar->setImageRole(MediaPlayList::ImageUrlRole); d->mManageHeaderBar->setDatabaseIdRole(MediaPlayList::DatabaseIdRole); d->mManageHeaderBar->setTrackTypeRole(MediaPlayList::ElementTypeRole); d->mManageHeaderBar->setAlbumIdRole(MediaPlayList::AlbumIdRole); d->mManageHeaderBar->setIsValidRole(MediaPlayList::IsValidRole); QObject::connect(d->mMediaPlayList.get(), &MediaPlayList::currentTrackChanged, d->mManageHeaderBar.get(), &ManageHeaderBar::setCurrentTrack); if (!d->mArguments.isEmpty()) { Q_EMIT enqueue(d->mArguments, ElisaUtils::FileName, ElisaUtils::PlayListEnqueueMode::AppendPlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); } } QAction * ElisaApplication::action(const QString& name) { #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND auto resultAction = d->mCollection.action(name); if (!resultAction) { setupActions(name); resultAction = d->mCollection.action(name); } return resultAction; #else Q_UNUSED(name); return new QAction(); #endif } QString ElisaApplication::iconName(const QIcon& icon) { return icon.name(); } void ElisaApplication::installKeyEventFilter(QObject *object) { if(!object) { return; } object->installEventFilter(this); } bool ElisaApplication::eventFilter(QObject *object, QEvent *event) { Q_UNUSED(object); QKeyEvent *keyEvent = static_cast(event); auto playPauseAction = d->mCollection.action(tr("Play-Pause")); if (keyEvent->key() == Qt::Key_Space && playPauseAction->shortcut()[0] == Qt::Key_Space) { return true; } return false; } const ElisaUtils::EntryDataList &ElisaApplication::arguments() const { return d->mArguments; } MusicListenersManager *ElisaApplication::musicManager() const { return d->mMusicManager.get(); } MediaPlayList *ElisaApplication::mediaPlayList() const { return d->mMediaPlayList.get(); } AudioWrapper *ElisaApplication::audioPlayer() const { return d->mAudioWrapper.get(); } ManageAudioPlayer *ElisaApplication::audioControl() const { return d->mAudioControl.get(); } ManageMediaPlayerControl *ElisaApplication::playerControl() const { return d->mPlayerControl.get(); } ManageHeaderBar *ElisaApplication::manageHeaderBar() const { return d->mManageHeaderBar.get(); } #include "moc_elisaapplication.cpp" diff --git a/src/elisaapplication.h b/src/elisaapplication.h index fd69090b..613b9e11 100644 --- a/src/elisaapplication.h +++ b/src/elisaapplication.h @@ -1,177 +1,182 @@ /* * Copyright 2017 Matthieu Gallien * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef ELISAAPPLICATION_H #define ELISAAPPLICATION_H #include "elisaLib_export.h" #include "config-upnp-qt.h" #include "elisautils.h" #include #include #include class QIcon; class QAction; class MusicListenersManager; class MediaPlayList; class AudioWrapper; class ManageAudioPlayer; class ManageMediaPlayerControl; class ManageHeaderBar; +class QQmlApplicationEngine; class ElisaApplicationPrivate; class ELISALIB_EXPORT ElisaApplication : public QObject { Q_OBJECT Q_PROPERTY(ElisaUtils::EntryDataList arguments READ arguments WRITE setArguments NOTIFY argumentsChanged) Q_PROPERTY(MusicListenersManager *musicManager READ musicManager NOTIFY musicManagerChanged) Q_PROPERTY(MediaPlayList *mediaPlayList READ mediaPlayList NOTIFY mediaPlayListChanged) Q_PROPERTY(AudioWrapper *audioPlayer READ audioPlayer NOTIFY audioPlayerChanged) Q_PROPERTY(ManageAudioPlayer *audioControl READ audioControl NOTIFY audioControlChanged) Q_PROPERTY(ManageMediaPlayerControl *playerControl READ playerControl NOTIFY playerControlChanged) Q_PROPERTY(ManageHeaderBar *manageHeaderBar READ manageHeaderBar NOTIFY manageHeaderBarChanged) public: explicit ElisaApplication(QObject *parent = nullptr); ~ElisaApplication() override; Q_INVOKABLE QAction* action(const QString& name); Q_INVOKABLE QString iconName(const QIcon& icon); Q_INVOKABLE void installKeyEventFilter(QObject *object); bool eventFilter(QObject *object, QEvent *event) override; const ElisaUtils::EntryDataList &arguments() const; MusicListenersManager *musicManager() const; MediaPlayList *mediaPlayList() const; AudioWrapper *audioPlayer() const; ManageAudioPlayer *audioControl() const; ManageMediaPlayerControl *playerControl() const; ManageHeaderBar *manageHeaderBar() const; Q_SIGNALS: void argumentsChanged(); void musicManagerChanged(); void mediaPlayListChanged(); void audioPlayerChanged(); void audioControlChanged(); void playerControlChanged(); void manageHeaderBarChanged(); void enqueue(const ElisaUtils::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); void initializationDone(); public Q_SLOTS: void appHelpActivated(); void aboutApplication(); void reportBug(); void configureShortcuts(); void configureElisa(); void setArguments(const ElisaUtils::EntryDataList &newArguments); void activateActionRequested(const QString &actionName, const QVariant ¶meter); void activateRequested(const QStringList &arguments, const QString &workingDirectory); void openRequested(const QList< QUrl > &uris); void initialize(); +public: + + void setQmlEngine(QQmlApplicationEngine *engine); + private Q_SLOTS: void goBack(); void find(); void togglePlaylist(); void seek(); void scrub(); void playPause(); private: void initializeModels(); void initializePlayer(); void setupActions(const QString &actionName); ElisaUtils::EntryDataList checkFileListAndMakeAbsolute(const ElisaUtils::EntryDataList &filesList, const QString &workingDirectory) const; std::unique_ptr d; }; #endif // ELISAAPPLICATION_H diff --git a/src/elisaqmlplugin.cpp b/src/elisaqmlplugin.cpp index 1a17d7f9..47b978d7 100644 --- a/src/elisaqmlplugin.cpp +++ b/src/elisaqmlplugin.cpp @@ -1,184 +1,186 @@ /* * Copyright 2018 Matthieu Gallien * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "elisaqmlplugin.h" #if defined UPNPQT_FOUND && UPNPQT_FOUND #include "upnp/upnpcontrolconnectionmanager.h" #include "upnp/upnpcontrolmediaserver.h" #include "upnp/upnpcontrolcontentdirectory.h" #include "upnp/upnpcontentdirectorymodel.h" #include "upnpdevicedescription.h" #include "upnp/didlparser.h" #include "upnp/upnpdiscoverallmusic.h" #include "upnpssdpengine.h" #include "upnpabstractservice.h" #include "upnpcontrolabstractdevice.h" #include "upnpcontrolabstractservice.h" #include "upnpbasictypes.h" #endif #include "elisautils.h" #include "elisaapplication.h" #include "progressindicator.h" #include "mediaplaylist.h" #include "managemediaplayercontrol.h" #include "manageheaderbar.h" #include "manageaudioplayer.h" #include "musiclistenersmanager.h" #include "trackslistener.h" #include "viewmanager.h" #include "databaseinterface.h" #include "datatypes.h" #include "models/datamodel.h" #include "models/trackmetadatamodel.h" #include "models/trackcontextmetadatamodel.h" #include "models/viewsmodel.h" #include "models/gridviewproxymodel.h" #include "models/alltracksproxymodel.h" #include "models/singlealbumproxymodel.h" +#include "localFileConfiguration/elisaconfigurationdialog.h" #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND #include "embeddedcoverageimageprovider.h" #endif #if defined KF5KIO_FOUND && KF5KIO_FOUND #include "models/filebrowsermodel.h" #include "models/filebrowserproxymodel.h" #endif #include "audiowrapper.h" #if defined Qt5DBus_FOUND && Qt5DBus_FOUND #include "mpris2/mpris2.h" #include "mpris2/mediaplayer2player.h" #endif #include #include #include #include #include #include ElisaQmlTestPlugin::ElisaQmlTestPlugin(QObject *aParent) : QQmlExtensionPlugin(aParent) { } void ElisaQmlTestPlugin::initializeEngine(QQmlEngine *engine, const char *uri) { QQmlExtensionPlugin::initializeEngine(engine, uri); #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND engine->addImageProvider(QStringLiteral("cover"), new EmbeddedCoverageImageProvider); #endif } void ElisaQmlTestPlugin::registerTypes(const char *uri) { #if defined UPNPQT_FOUND && UPNPQT_FOUND qmlRegisterType(uri, 1, 0, "UpnpSsdpEngine"); qmlRegisterType(uri, 1, 0, "UpnpDiscoverAllMusic"); qmlRegisterType(uri, 1, 0, "UpnpAbstractDevice"); qmlRegisterType(uri, 1, 0, "UpnpAbstractService"); qmlRegisterType(uri, 1, 0, "UpnpControlAbstractDevice"); qmlRegisterType(uri, 1, 0, "UpnpControlAbstractService"); qmlRegisterType(uri, 1, 0, "UpnpControlConnectionManager"); qmlRegisterType(uri, 1, 0, "UpnpControlMediaServer"); qmlRegisterType(uri, 1, 0, "UpnpContentDirectoryModel"); qmlRegisterType(uri, 1, 0, "DidlParser"); qmlRegisterType(uri, 1, 0, "UpnpControlContentDirectory"); qmlRegisterType(uri, 1, 0, "UpnpDeviceDescription"); qRegisterMetaType(); qRegisterMetaType >(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); #endif qmlRegisterType(uri, 1, 0, "MediaPlayList"); qmlRegisterType(uri, 1, 0, "ManageMediaPlayerControl"); qmlRegisterType(uri, 1, 0, "ManageHeaderBar"); qmlRegisterType(uri, 1, 0, "ManageAudioPlayer"); qmlRegisterType(uri, 1, 0, "ProgressIndicator"); qmlRegisterType(uri, 1, 0, "MusicListenersManager"); qmlRegisterType(uri, 1, 0, "ViewManager"); qmlRegisterType(uri, 1, 0, "DataModel"); qmlRegisterType(uri, 1, 0, "TrackMetadataModel"); qmlRegisterType(uri, 1, 0, "TrackContextMetaDataModel"); qmlRegisterType(uri, 1, 0, "ViewsModel"); qmlRegisterType(uri, 1, 0, "GridViewProxyModel"); qmlRegisterType(uri, 1, 0, "AllTracksProxyModel"); qmlRegisterType(uri, 1, 0, "SingleAlbumProxyModel"); #if defined KF5KIO_FOUND && KF5KIO_FOUND qmlRegisterType(uri, 1, 0, "FileBrowserModel"); qmlRegisterType(uri, 1, 0, "FileBrowserProxyModel"); #endif qmlRegisterType(uri, 1, 0, "AudioWrapper"); qmlRegisterUncreatableType(uri, 1, 0, "DatabaseInterface", QStringLiteral("Only created in c++")); #if defined Qt5DBus_FOUND && Qt5DBus_FOUND qmlRegisterType(uri, 1, 0, "Mpris2"); qRegisterMetaType(); #endif qRegisterMetaType(); qRegisterMetaType>("QHash"); qRegisterMetaType>("QHash"); qRegisterMetaType>("QVector"); qRegisterMetaType>("QHash"); qRegisterMetaType("DataTypes::ListTrackDataType"); qRegisterMetaType("DataTypes::ListRadioDataType"); qRegisterMetaType("DataTypes::ListAlbumDataType"); qRegisterMetaType("DataTypes::ListArtistDataType"); qRegisterMetaType("DataTypes::ListGenreDataType"); qRegisterMetaType("ModelDataLoader::ListTrackDataType"); qRegisterMetaType("ModelDataLoader::ListRadioDataType"); qRegisterMetaType("ModelDataLoader::ListAlbumDataType"); qRegisterMetaType("ModelDataLoader::ListArtistDataType"); qRegisterMetaType("ModelDataLoader::ListGenreDataType"); qRegisterMetaType("ModelDataLoader::AlbumDataType"); qRegisterMetaType("TracksListener::ListTrackDataType"); qRegisterMetaType>(); qRegisterMetaType(); qRegisterMetaType>("QMap"); qRegisterMetaType("ElisaUtils::PlayListEnqueueMode"); qRegisterMetaType("ElisaUtils::PlayListEnqueueTriggerPlay"); qRegisterMetaType("ElisaUtils::PlayListEntryType"); qRegisterMetaType("ElisaUtils::EntryData"); qRegisterMetaType("ElisaUtils::EntryDataList"); qRegisterMetaType("ElisaUtils::FilterType"); qRegisterMetaType("DataTypes::TrackDataType"); qRegisterMetaType("DataTypes::AlbumDataType"); qRegisterMetaType("DataTypes::ArtistDataType"); qRegisterMetaType("DataTypes::GenreDataType"); qRegisterMetaType("DataTypes::ColumnsRoles"); qRegisterMetaType("ModelDataLoader::TrackDataType"); qRegisterMetaType("TracksListener::TrackDataType"); qRegisterMetaType("ViewManager::ViewsType"); qRegisterMetaType("ViewManager::SortOrder"); + qmlRegisterUncreatableType(uri, 1, 0, "ElisaConfigurationDialog", QStringLiteral("only one and done in c++")); qmlRegisterUncreatableType(uri, 1, 0, "ElisaApplication", QStringLiteral("only one and done in c++")); qmlRegisterUncreatableMetaObject(ElisaUtils::staticMetaObject, uri, 1, 0, "ElisaUtils", QStringLiteral("Namespace ElisaUtils")); } diff --git a/src/localFileConfiguration/CMakeLists.txt b/src/localFileConfiguration/CMakeLists.txt deleted file mode 100644 index 9191c53b..00000000 --- a/src/localFileConfiguration/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -set(KCM_ELISA_LOCAL_FILE_SRCS - localfileconfiguration.cpp - kcm_elisa_local_file.desktop - package/contents/ui/main.qml - package/metadata.desktop -) - -kconfig_add_kcfg_files(KCM_ELISA_LOCAL_FILE_SRCS ../elisa_settings.kcfgc ) -set(KCM_ELISA_LOCAL_FILE_SRCS - ${KCM_ELISA_LOCAL_FILE_SRCS} - ../elisa_core.kcfg -) - -add_library(kcm_elisa_local_file MODULE ${KCM_ELISA_LOCAL_FILE_SRCS}) - -target_link_libraries(kcm_elisa_local_file - Qt5::Core - KF5::ConfigCore - KF5::I18n - KF5::CoreAddons -) - -if (KF5Declarative_FOUND) - target_link_libraries(kcm_elisa_local_file - KF5::Declarative - KF5::QuickAddons - ) -endif() - -if (KF5ConfigWidgets_FOUND) - target_link_libraries(kcm_elisa_local_file - KF5::ConfigWidgets - ) -endif() - -kcoreaddons_desktop_to_json(kcm_elisa_local_file "kcm_elisa_local_file.desktop") - -install(FILES kcm_elisa_local_file.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR}) -install(TARGETS kcm_elisa_local_file DESTINATION ${KDE_INSTALL_PLUGINDIR}/kcms) - -if (KF5Package_FOUND) - kpackage_install_bundled_package(package kcm_elisa_local_file kcms) -endif() diff --git a/src/localFileConfiguration/Messages.sh b/src/localFileConfiguration/Messages.sh deleted file mode 100644 index 162d483c..00000000 --- a/src/localFileConfiguration/Messages.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -$XGETTEXT $(find . -name \*.qml -o -name \*.cpp) -o $podir/kcm_elisa_local_file.pot diff --git a/src/localFileConfiguration/localfileconfiguration.cpp b/src/localFileConfiguration/elisaconfigurationdialog.cpp similarity index 58% rename from src/localFileConfiguration/localfileconfiguration.cpp rename to src/localFileConfiguration/elisaconfigurationdialog.cpp index 91974c0c..e67e78d8 100644 --- a/src/localFileConfiguration/localfileconfiguration.cpp +++ b/src/localFileConfiguration/elisaconfigurationdialog.cpp @@ -1,124 +1,96 @@ /* * Copyright 2017 Matthieu Gallien * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ -#include "localfileconfiguration.h" +#include "elisaconfigurationdialog.h" #include "elisa-version.h" #include "elisa_settings.h" -#include -#include #include #include +#include -K_PLUGIN_CLASS_WITH_JSON(KCMElisaLocalFile, "kcm_elisa_local_file.json") - -KCMElisaLocalFile::KCMElisaLocalFile(QObject* parent, const QVariantList &args) - : ConfigModule(parent, args) +ElisaConfigurationDialog::ElisaConfigurationDialog(QObject* parent) + : QObject(parent) { - KAboutData *about = new KAboutData(QStringLiteral("kcm_elisa_local_file"), - i18n("Elisa Local Files Indexer Configuration"), - QStringLiteral(ELISA_VERSION_STRING), {}, KAboutLicense::LGPL_V3, - i18n("Copyright 2017-2019 Matthieu Gallien ")); - - about->addAuthor(i18n("Matthieu Gallien"),i18n("Author"), QStringLiteral("mgallien@mgallien.fr")); - setAboutData(about); - - auto configurationFileName = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation); - configurationFileName += QStringLiteral("/elisarc"); - Elisa::ElisaConfiguration::instance(configurationFileName); - connect(Elisa::ElisaConfiguration::self(), &Elisa::ElisaConfiguration::configChanged, - this, &KCMElisaLocalFile::configChanged); + this, &ElisaConfigurationDialog::configChanged); connect(&mConfigFileWatcher, &QFileSystemWatcher::fileChanged, - this, &KCMElisaLocalFile::configChanged); + this, &ElisaConfigurationDialog::configChanged); setRootPath(Elisa::ElisaConfiguration::rootPath()); Elisa::ElisaConfiguration::setRootPath(mRootPath); Elisa::ElisaConfiguration::self()->save(); mConfigFileWatcher.addPath(Elisa::ElisaConfiguration::self()->config()->name()); } -KCMElisaLocalFile::~KCMElisaLocalFile() +ElisaConfigurationDialog::~ElisaConfigurationDialog() = default; -QStringList KCMElisaLocalFile::rootPath() const +QStringList ElisaConfigurationDialog::rootPath() const { return mRootPath; } -void KCMElisaLocalFile::defaults() -{ - setRootPath(QStandardPaths::standardLocations(QStandardPaths::MusicLocation)); -} - -void KCMElisaLocalFile::load() -{ - setRootPath(Elisa::ElisaConfiguration::rootPath()); -} - -void KCMElisaLocalFile::save() -{ - Elisa::ElisaConfiguration::setRootPath(mRootPath); - Elisa::ElisaConfiguration::self()->save(); -} - -void KCMElisaLocalFile::setRootPath(const QStringList &rootPath) +void ElisaConfigurationDialog::setRootPath(const QStringList &rootPath) { if (mRootPath == rootPath && !mRootPath.isEmpty()) { return; } mRootPath.clear(); for (const auto &onePath : rootPath) { auto workPath = onePath; if (workPath.startsWith(QLatin1String("file:/"))) { auto urlPath = QUrl{workPath}; workPath = urlPath.toLocalFile(); } QFileInfo pathFileInfo(workPath); auto directoryPath = pathFileInfo.canonicalFilePath(); if (!directoryPath.isEmpty()) { mRootPath.push_back(directoryPath); } } if (mRootPath.isEmpty()) { auto systemMusicPaths = QStandardPaths::standardLocations(QStandardPaths::MusicLocation); for (const auto &musicPath : qAsConst(systemMusicPaths)) { mRootPath.push_back(musicPath); } } Q_EMIT rootPathChanged(mRootPath); +} - setNeedsSave(true); - Q_EMIT needsSaveChanged(); +void ElisaConfigurationDialog::save() +{ + Elisa::ElisaConfiguration::setRootPath(mRootPath); + Elisa::ElisaConfiguration::self()->save(); } -void KCMElisaLocalFile::configChanged() +void ElisaConfigurationDialog::configChanged() { setRootPath(Elisa::ElisaConfiguration::rootPath()); } -#include "localfileconfiguration.moc" +#include "moc_elisaconfigurationdialog.cpp" diff --git a/src/localFileConfiguration/localfileconfiguration.h b/src/localFileConfiguration/elisaconfigurationdialog.h similarity index 76% rename from src/localFileConfiguration/localfileconfiguration.h rename to src/localFileConfiguration/elisaconfigurationdialog.h index 704c69be..a1afac64 100644 --- a/src/localFileConfiguration/localfileconfiguration.h +++ b/src/localFileConfiguration/elisaconfigurationdialog.h @@ -1,69 +1,66 @@ /* * Copyright 2017 Matthieu Gallien * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ -#if !defined LOCALFILECONFIGURATION_H_ -#define LOCALFILECONFIGURATION_H_ +#if !defined ELISACONFIGURATIONDIALOG_H_ +#define ELISACONFIGURATIONDIALOG_H_ + +#include "elisaLib_export.h" -#include #include #include -class KCMElisaLocalFile : public KQuickAddons::ConfigModule +class ELISALIB_EXPORT ElisaConfigurationDialog : public QObject { Q_OBJECT Q_PROPERTY(QStringList rootPath READ rootPath WRITE setRootPath NOTIFY rootPathChanged) public: - explicit KCMElisaLocalFile(QObject *parent, const QVariantList &args); + explicit ElisaConfigurationDialog(QObject *parent = nullptr); - ~KCMElisaLocalFile() override; + ~ElisaConfigurationDialog() override; QStringList rootPath() const; Q_SIGNALS: void rootPathChanged(const QStringList &rootPath); public Q_SLOTS: - void defaults() override final; - - void load() override final; - - void save() override final; - void setRootPath(const QStringList &rootPath); + void save(); + private Q_SLOTS: void configChanged(); private: QStringList mRootPath; QFileSystemWatcher mConfigFileWatcher; }; #endif diff --git a/src/localFileConfiguration/kcm_elisa_local_file.desktop b/src/localFileConfiguration/kcm_elisa_local_file.desktop deleted file mode 100644 index 765d8b34..00000000 --- a/src/localFileConfiguration/kcm_elisa_local_file.desktop +++ /dev/null @@ -1,104 +0,0 @@ -[Desktop Entry] -Type=Service -Icon=elisa -Exec=kcmshell5 kcm_elisa_local_file - -X-KDE-Library=kcm_elisa_local_file -X-KDE-ServiceTypes=KCModule -X-KDE-ParentComponents=elisa -X-KDE-PluginKeyword=kcm_elisa_local_file - -Name=Elisa Local Files Indexer -Name[ar]=مفهرس الملفّات المحليّة إليسّا -Name[ca]=Indexador de fitxers locals de l'Elisa -Name[ca@valencia]=Indexador de fitxers locals de l'Elisa -Name[cs]=Indexer místních souborů Elisa -Name[da]=Elisa, indeksering af lokale filer -Name[de]=Lokale Dateiindizierung von Elisa -Name[el]=Πρόγραμμα δεικτοδότησης τοπικών αρχείων της Elisa -Name[en_GB]=Elisa Local Files Indexer -Name[es]=Indexador de archivos locales de Elisa -Name[eu]=Elisa fitxategi lokalen indexatzailea -Name[fi]=Elisan paikallisten tiedostojen indeksoija -Name[fr]=Indexeur de fichiers locaux pour Elisa -Name[gl]=Indexador de ficheiros locais de Elisa -Name[hu]=Elisa helyifájl-indexelő -Name[id]=Pengindeks File Lokal Elisa -Name[it]=Indicizzatore di file locali di Elisa -Name[ko]=Elisa 로컬 파일 인덱서 -Name[nl]=Lokale bestanden van Elisa indexeerder -Name[nn]=Indeksering av lokale filer for Elisa -Name[pl]=Indeksowanie plików lokalnych Elisy -Name[pt]=Indexação de Ficheiros Locais do Elisa -Name[pt_BR]=Indexador de arquivos locais do Elisa -Name[ru]=Индексирование файлов для Elisa -Name[sk]=Indexer miestnych súborov Elisa -Name[sv]=Elisa lokal filindexering -Name[tr]=Elias Yerel Dosya İndeksleyici -Name[uk]=Засіб індексування локальних файлів Elisa -Name[x-test]=xxElisa Local Files Indexerxx -Name[zh_CN]=Elisa 本地文件索引器 -Name[zh_TW]=Elisa 本機檔案索引器 -Comment=A configuration tool for Elisa music player local files indexer -Comment[ar]=أداة يمكن تطويعها لمفهرس ملفّات «مشغّل الموسيقى إليسّا» المحليّة -Comment[ca]=Una eina de configuració per a l'indexador de fitxers locals del reproductor de música Elisa -Comment[ca@valencia]=Una eina de configuració per a l'indexador de fitxers locals del reproductor de música Elisa -Comment[cs]=Konfigurační nástroj pro indexer místních souborů pro přehrávač Elisa -Comment[da]=Et konfigurationsværktøj til Elisa, musikafspilleren til indeksering af lokale filer -Comment[de]=Einstellungen für die lokale Dateiindizierung der Elisa-Musikwiedergabe -Comment[el]=Ένα εργαλείο διαμόρφωσης για το πρόγραμμα δεικτοδότησης τοπικών αρχείων της συσκευής αναπαραγωγής μουσικής Elisa -Comment[en_GB]=A configuration tool for Elisa music player local files indexer -Comment[es]=Una herramienta de configuración para el indexador de archivos locales del reproductor de música Elisa -Comment[eu]=Elisa musika jotzailearen fitxategi lokalen indexatzailea konfiguratzeko tresna bat -Comment[fi]=Asetustyökalu Elisa-musiikkisoittimen paikallisten tiedostojen indeksoijalle -Comment[fr]=Un outil de configuration pour l'indexeur de fichiers locaux pour Elisa -Comment[gl]=Unha ferramenta de configuración para o indexador de ficheiros locais do reprodutor de música Elisa. -Comment[hu]=Beállítóeszköz az Elisa zenelejátszó helyifájl-indexelő szolgáltatásához -Comment[id]=Sebuah alat konfigurasi untuk pengindeks file lokal pemutar musik Elisa -Comment[it]=Uno strumento di configurazione l'indicizzatore di file locali del lettore musicale Elisa -Comment[ko]=Elisa 음악 재생기의 로컬 파일 인덱서를 위한 구성 도구 -Comment[nl]=Een configuratiehulpmiddel voor de indexeerder van lokale bestanden van de muziekspeler Elisa -Comment[nn]=Oppsettverktøy for indeksering av lokale filer for musikkspelaren Elisa -Comment[pl]=Narzędzie ustawień indeksowania plików lokalnych Elisy -Comment[pt]=Uma ferramenta de configuração para a indexação de ficheiros locais no leitor de música Elisa -Comment[pt_BR]=Uma ferramenta de configuração para indexar os arquivos locais do reprodutor de músicas Elisa -Comment[ru]=Настройка индексирования файлов для проигрывателя Elisa -Comment[sk]=Konfiguračný nástroj pre indexer miestnych súborov hudobného prehrávača Elisa -Comment[sv]=Ett inställningsverktyg för lokal filindexering i Elisa musikspelare -Comment[tr]=Elisa müzik çalar yerel dosya indeksleyicisi için bir yapılandırma aracı -Comment[uk]=Інструмент налаштовування засобу індексування локальних файлів музичного програвача Elisa -Comment[x-test]=xxA configuration tool for Elisa music player local files indexerxx -Comment[zh_CN]=Elisa 音乐播放器本地文件索引器的配置工具 -Comment[zh_TW]=一個 Elisa 音樂播放器的本機檔案索引器的設定工具 -X-KDE-Keywords=Elisa -X-KDE-Keywords[ar]=إليسّا -X-KDE-Keywords[ca]=Elisa -X-KDE-Keywords[ca@valencia]=Elisa -X-KDE-Keywords[cs]=Elisa -X-KDE-Keywords[da]=Elisa -X-KDE-Keywords[de]=Elisa -X-KDE-Keywords[el]=Elisa -X-KDE-Keywords[en_GB]=Elisa -X-KDE-Keywords[es]=Elisa -X-KDE-Keywords[eu]=Elisa -X-KDE-Keywords[fi]=Elisa -X-KDE-Keywords[fr]=Elisa -X-KDE-Keywords[gl]=Elisa -X-KDE-Keywords[hu]=Elisa -X-KDE-Keywords[id]=Elisa -X-KDE-Keywords[it]=Elisa -X-KDE-Keywords[ko]=Elisa -X-KDE-Keywords[nl]=Elisa -X-KDE-Keywords[nn]=Elisa -X-KDE-Keywords[pl]=Elisa -X-KDE-Keywords[pt]=Elisa -X-KDE-Keywords[pt_BR]=Elisa -X-KDE-Keywords[ru]=Elisa -X-KDE-Keywords[sk]=Elisa -X-KDE-Keywords[sv]=Elisa -X-KDE-Keywords[tr]=Elisa -X-KDE-Keywords[uk]=Elisa -X-KDE-Keywords[x-test]=xxElisaxx -X-KDE-Keywords[zh_CN]=Elisa -X-KDE-Keywords[zh_TW]=Elisa -X-DocPath=elisa/index.html diff --git a/src/localFileConfiguration/package/metadata.desktop b/src/localFileConfiguration/package/metadata.desktop deleted file mode 100644 index 6ecc7c12..00000000 --- a/src/localFileConfiguration/package/metadata.desktop +++ /dev/null @@ -1,78 +0,0 @@ -[Desktop Entry] -Name=Elisa -Name[ar]=إليسّا -Name[ca]=Elisa -Name[ca@valencia]=Elisa -Name[cs]=Elisa -Name[da]=Elisa -Name[de]=Elisa -Name[el]=Elisa -Name[en_GB]=Elisa -Name[es]=Elisa -Name[eu]=Elisa -Name[fi]=Elisa -Name[fr]=Elisa -Name[gl]=Elisa -Name[hu]=Elisa -Name[id]=Elisa -Name[it]=Elisa -Name[ko]=Elisa -Name[nl]=Elisa -Name[nn]=Elisa -Name[pl]=Elisa -Name[pt]=Elisa -Name[pt_BR]=Elisa -Name[ru]=Elisa -Name[sk]=Elisa -Name[sv]=Elisa -Name[tr]=Elisa -Name[uk]=Elisa -Name[x-test]=xxElisaxx -Name[zh_CN]=Elisa -Name[zh_TW]=Elisa -Comment=Configure Local Files Indexer of Elisa Music Player -Comment[ar]=اضبط مفهرس ملفّات «مشغّل الموسيقى إليسّا» المحليّة -Comment[ca]=Configura l'indexador de fitxers locals del reproductor de música Elisa -Comment[ca@valencia]=Configura l'indexador de fitxers locals del reproductor de música Elisa -Comment[cs]=Nastavit indexer místních souborů pro přehrávač Elisa -Comment[da]=Indstil Elisa-musikafspilleren til indeksering af lokale filer -Comment[de]=Lokale Dateiindizierung von Elisa einrichten -Comment[el]=Διαμόρφωση της δεικτοδότησης τοπικών αρχείων της συσκευής αναπαραγωγής μουσικής Elisa -Comment[en_GB]=Configure Local Files Indexer of Elisa Music Player -Comment[es]=Configurar el indexador de archivos locales del reproductor de música Elisa -Comment[eu]=Konfiguratu Elisa musika jotzailearen fitxategi lokalen indexatzailea -Comment[fi]=Elisa-musiikkisoittimen paikallisten tiedostojen indeksoijan asetukset -Comment[fr]=Configurer l'indexeur de fichiers locaux du lecteur de musique Elisa -Comment[gl]=Configurar o indexador de ficheiros locais do reprodutor de música Elisa -Comment[hu]=Állítsa be az Elisa zenelejátszó helyifájl-indexelő szolgáltatását -Comment[id]=Konfigurasikan Pengindeks File Lokal untuk Pemutar Musik Elisa -Comment[it]=Configura l'indicizzatore di file locali del lettore musicale Elisa -Comment[ko]=Elisa 음악 재생기의 로컬 파일 인덱서 설정 -Comment[nl]=Indexeerder van lokale bestanden van de muziekspeler Elisa configureren -Comment[nn]=Set opp indeksering av lokale filer for musikkspelaren Elisa -Comment[pl]=Ustawieni indeksowania plików lokalnych odtwarzacza Elisa -Comment[pt]=Configurar a Indexação de Ficheiros Locais no Leitor de Música Elisa -Comment[pt_BR]=Configurar o indexador de arquivos locais do reprodutor de músicas Elisa -Comment[ru]=Настройка индексирования файлов для проигрывателя Elisa -Comment[sk]=Nastaviť indexer miestnych súborov hudobného prehrávača Elisa -Comment[sv]=Anpassa lokal filindexering för musikspelaren Elisa -Comment[tr]=Elisa Müzik Çalar'ın Yerel Dosya İndeksleyicisini Yapılandır -Comment[uk]=Налаштувати індексування локальних файлів для музичного програвача Elisa -Comment[x-test]=xxConfigure Local Files Indexer of Elisa Music Playerxx -Comment[zh_CN]=配置 Elisa 音乐播放器的本地文件索引器 -Comment[zh_TW]=設定 Elisa 音樂播放器的本機檔案索引器 -Icon=elisa -Encoding=UTF-8 -Keywords= -Type=Service -X-KDE-ParentApp= -X-KDE-PluginInfo-Author=Matthieu Gallien -X-KDE-PluginInfo-Email=matthieu_gallien@yahoo.fr -X-KDE-PluginInfo-License=LGPLv3 -X-KDE-PluginInfo-Name=kcm_elisa_local_file -X-KDE-PluginInfo-Version= -X-KDE-PluginInfo-Website= -X-KDE-ServiceTypes=KPackage/GenericQML - -X-Plasma-MainScript=ui/main.qml -X-Plasma-RemoteLocation= diff --git a/src/main.cpp b/src/main.cpp index 4fbfe41b..82c84263 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,185 +1,190 @@ /* * Copyright 2015-2018 Matthieu Gallien * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "config-upnp-qt.h" #include "elisa-version.h" #include "elisaapplication.h" #include "elisa_settings.h" +#include "localFileConfiguration/elisaconfigurationdialog.h" + //#define QT_QML_DEBUG #if defined KF5Declarative_FOUND && KF5Declarative_FOUND #include #include #endif #include #include #include #if defined KF5Crash_FOUND && KF5Crash_FOUND #include #endif #if defined KF5DBusAddons_FOUND && KF5DBusAddons_FOUND #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined Qt5AndroidExtras_FOUND && Qt5AndroidExtras_FOUND #include #endif #include #if defined Qt5AndroidExtras_FOUND && Qt5AndroidExtras_FOUND #include #include #endif #if defined Q_OS_ANDROID int __attribute__((visibility("default"))) main(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { #if defined Q_OS_ANDROID if(argc > 1 && strcmp(argv[1], "-service") == 0){ QAndroidService app(argc, argv); qInfo() << "Service starting..."; // My service stuff return app.exec(); } qInfo() << "Application starting..."; #endif QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); qputenv("QT_GSTREAMER_USE_PLAYBIN_VOLUME", "true"); QApplication app(argc, argv); #if defined KF5Declarative_FOUND && KF5Declarative_FOUND KQuickAddons::QtQuickSettings::init(); #endif KLocalizedString::setApplicationDomain("elisa"); #if defined Qt5AndroidExtras_FOUND && Qt5AndroidExtras_FOUND qInfo() << QCoreApplication::arguments(); QAndroidJniObject::callStaticMethod("org/kde/elisa/ElisaService", "startMyService", "(Landroid/content/Context;)V", QtAndroid::androidContext().object()); #endif #if defined KF5Crash_FOUND && KF5Crash_FOUND KCrash::initialize(); #endif QApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("elisa"))); KAboutData aboutData( QStringLiteral("elisa"), i18n("Elisa"), QStringLiteral(ELISA_VERSION_STRING), i18n("A Simple Music Player written with KDE Frameworks"), KAboutLicense::LGPL_V3, i18n("(c) 2015-2019, Elisa contributors")); aboutData.addAuthor(QStringLiteral("Matthieu Gallien"),i18n("Creator"), QStringLiteral("mgallien@mgallien.fr")); aboutData.addAuthor(QStringLiteral("Alexander Stippich"), i18n("Author"), QStringLiteral("a.stippich@gmx.net")); aboutData.addCredit(QStringLiteral("Andrew Lake"), i18n("Concept and design work"), QStringLiteral("jamboarder@gmail.com")); aboutData.addCredit(QStringLiteral("Luigi Toscano"), i18n("Localization support"), QStringLiteral("luigi.toscano@tiscali.it")); aboutData.addCredit(QStringLiteral("Safa Alfulaij"), i18n("Right to left support in interface"), QStringLiteral("safa1996alfulaij@gmail.com")); aboutData.addCredit(QStringLiteral("Diego Gangl"), i18n("Various improvements to the interface"), QStringLiteral("diego@sinestesia.co")); KAboutData::setApplicationData(aboutData); QCommandLineParser parser; parser.addHelpOption(); parser.addVersionOption(); aboutData.setupCommandLine(&parser); parser.process(app); aboutData.processCommandLine(&parser); QQuickStyle::setStyle(QStringLiteral("org.kde.desktop")); QQuickStyle::setFallbackStyle(QStringLiteral("Fusion")); QQmlApplicationEngine engine; engine.addImportPath(QStringLiteral("qrc:/imports")); QQmlFileSelector selector(&engine); #if defined KF5Declarative_FOUND && KF5Declarative_FOUND KDeclarative::KDeclarative decl; decl.setDeclarativeEngine(&engine); decl.setupEngine(&engine); decl.setupContext(); #endif engine.rootContext()->setContextObject(new KLocalizedContext(&engine)); #if defined KF5DBusAddons_FOUND && KF5DBusAddons_FOUND KDBusService elisaService(KDBusService::Unique); #endif std::unique_ptr myApp = std::make_unique(); + myApp->setQmlEngine(&engine); + #if defined KF5DBusAddons_FOUND && KF5DBusAddons_FOUND QObject::connect(&elisaService, &KDBusService::activateActionRequested, myApp.get(), &ElisaApplication::activateActionRequested); QObject::connect(&elisaService, &KDBusService::activateRequested, myApp.get(), &ElisaApplication::activateRequested); QObject::connect(&elisaService, &KDBusService::openRequested, myApp.get(), &ElisaApplication::openRequested); #endif auto arguments = ElisaUtils::EntryDataList{}; auto realArgumentsList = parser.positionalArguments(); for (const auto &oneArgument : realArgumentsList) { arguments.push_back(ElisaUtils::EntryData{{}, {}, QUrl(oneArgument)}); } myApp->setArguments(arguments); engine.rootContext()->setContextProperty(QStringLiteral("elisa"), myApp.release()); + engine.rootContext()->setContextProperty(QStringLiteral("config"), new ElisaConfigurationDialog); engine.load(QUrl(QStringLiteral("qrc:/qml/ElisaMainWindow.qml"))); return app.exec(); } diff --git a/src/localFileConfiguration/package/contents/ui/main.qml b/src/qml/ElisaConfigurationDialog.qml similarity index 79% rename from src/localFileConfiguration/package/contents/ui/main.qml rename to src/qml/ElisaConfigurationDialog.qml index 155b7383..d48f437d 100644 --- a/src/localFileConfiguration/package/contents/ui/main.qml +++ b/src/qml/ElisaConfigurationDialog.qml @@ -1,158 +1,167 @@ /* * Copyright 2017 Matthieu Gallien * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ -import QtQuick 2.7 -import QtQuick.Controls 2.3 +import QtQuick 2.11 +import QtQuick.Controls 2.4 import QtQuick.Layouts 1.3 -import QtQuick.Dialogs 1.2 +import QtQuick.Dialogs 1.2 as Dialogs import QtQml.Models 2.3 -import org.kde.kcm 1.0 -Item { - //implicitWidth and implicitHeight will be used as initial size - //when loaded in kcmshell5 - implicitWidth: 400 - implicitHeight: 200 +Dialogs.Dialog { + id: dialog + title: 'Configure' - LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft - LayoutMirroring.childrenInherit: true - - ConfigModule.buttons: ConfigModule.Help|ConfigModule.Apply + visible: true + modality: Qt.ApplicationModal + standardButtons: Dialogs.StandardButton.Ok | Dialogs.StandardButton.Apply | Dialogs.StandardButton.Cancel SystemPalette { id: myPalette colorGroup: SystemPalette.Active } Component { id: highlightBar Rectangle { width: 200; height: 50 color: myPalette.highlight } } Component { id: pathDelegate Item { id: delegateItem height: 3 * 30 width: scrollBar.visible ? pathList.width - scrollBar.width : pathList.width Rectangle { anchors.fill: parent anchors.margins: 0.1 * 30 color: myPalette.base MouseArea { anchors.fill: parent hoverEnabled: true onEntered: pathList.currentIndex = delegateItem.DelegateModel.itemsIndex Label { text: modelData anchors.centerIn: parent } ToolButton { icon.name: 'list-remove' Accessible.onPressAction: onClicked anchors.top: parent.top anchors.right: parent.right onClicked: { - var oldPaths = kcm.rootPath + var oldPaths = config.rootPath oldPaths.splice(delegateItem.DelegateModel.itemsIndex, 1) - kcm.rootPath = oldPaths + config.rootPath = oldPaths } } } } } } RowLayout { spacing: 0 - anchors.fill: parent + LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft + LayoutMirroring.childrenInherit: true + + height: 400 + width: 600 + implicitHeight: 400 + implicitWidth: 600 ListView { id:pathList Layout.fillWidth: true Layout.fillHeight: true boundsBehavior: Flickable.StopAtBounds model: DelegateModel { - model: kcm.rootPath + model: config.rootPath delegate: pathDelegate } ScrollBar.vertical: ScrollBar { id: scrollBar } highlight: highlightBar } ColumnLayout { Layout.fillHeight: true Layout.leftMargin: !LayoutMirroring.enabled ? (0.3 * 30) : 0 Layout.rightMargin: LayoutMirroring.enabled ? (0.3 * 30) : 0 Button { text: i18n("Add new path") onClicked: fileDialog.open() Accessible.onPressAction: onClicked Layout.alignment: Qt.AlignTop | Qt.AlignLeft - FileDialog { + Dialogs.FileDialog { id: fileDialog title: i18n("Choose a Folder") folder: shortcuts.home selectFolder: true visible: false onAccepted: { - var oldPaths = kcm.rootPath + var oldPaths = config.rootPath oldPaths.push(fileDialog.fileUrls) - kcm.rootPath = oldPaths + config.rootPath = oldPaths } } } Item { Layout.fillHeight: true } } } + + onAccepted: { + config.save() + close() + } + + onApply: config.save() } diff --git a/src/resources.qrc b/src/resources.qrc index 80f2f938..6805ca27 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -1,57 +1,58 @@ qml/MediaPlayerControl.qml qml/RatingStar.qml qml/MediaPlayListView.qml qml/ElisaMainWindow.qml qml/ApplicationMenu.qml qml/HeaderBar.qml qml/ContextView.qml qml/ContentView.qml qml/DraggableItem.qml qml/NavigationActionBar.qml qml/PlayListEntry.qml qml/Theme.qml qml/PlatformIntegration.qml qml/LabelWithToolTip.qml qml/TrackImportNotification.qml qml/MediaTrackMetadataView.qml qml/GridBrowserView.qml qml/GridBrowserDelegate.qml qml/ListBrowserView.qml qml/ListBrowserDelegate.qml qml/FileBrowserView.qml qtquickcontrols2.conf background.png qml/BaseTheme.qml qml/ScrollHelper.qml qml/FlatButtonWithToolTip.qml qml/DataGridView.qml qml/DataListView.qml qml/PlayListBasicView.qml qml/SimplePlayListView.qml qml/ViewSelector.qml qml/PlayListAlbumHeader.qml qml/BasicPlayListAlbumHeader.qml qml/MetaDataDelegate.qml qml/EditableMetaDataDelegate.qml qml/ViewSelectorDelegate.qml qml/HeaderFooterToolbar.qml qml/TracksDiscHeader.qml qml/NativeApplicationMenu.qml + qml/ElisaConfigurationDialog.qml windows/WindowsTheme.qml windows/PlatformIntegration.qml windows/LabelWithToolTip.qml android/ElisaMainWindow.qml android/AndroidTheme.qml android/PlatformIntegration.qml android/AlbumsView.qml android/ArtistsView.qml android/TracksView.qml android/GenresView.qml