File indexing completed on 2024-04-28 04:44:39

0001 // Copyright 2018-2023 Camilo Higuita <milo.h@aol.com>
0002 // Copyright 2018-2023 Nitrux Latinoamericana S.C.
0003 //
0004 // SPDX-License-Identifier: GPL-3.0-or-later
0005 #include <QCommandLineParser>
0006 #include <QIcon>
0007 #include <QQmlApplicationEngine>
0008 #include <QQmlContext>
0009 #include <QUrl>
0010 
0011 #ifdef Q_OS_ANDROID
0012 #include <QGuiApplication>
0013 #include <MauiKit3/Core/mauiandroid.h>
0014 #else
0015 #include <QApplication>
0016 #endif
0017 
0018 #ifdef Q_OS_MACOS
0019 #include <MauiKit3/Core/mauimacos.h>
0020 #endif
0021 
0022 #include <MauiKit3/Core/mauiapp.h>
0023 #include <MauiKit3/FileBrowsing/moduleinfo.h>
0024 
0025 #include <KIO/kio_version.h>
0026 #include <KAboutData>
0027 #include <KI18n/KLocalizedString>
0028 
0029 #include "../index_version.h"
0030 
0031 #include "controllers/compressedfile.h"
0032 #include "controllers/filepreviewer.h"
0033 #include "controllers/dirinfo.h"
0034 #include "controllers/folderconfig.h"
0035 #include "controllers/fileproperties.h"
0036 #include "controllers/patharrowbackground.h"
0037 
0038 #include "index.h"
0039 
0040 #include "models/recentfilesmodel.h"
0041 #include "models/pathlist.h"
0042 
0043 #define INDEX_URI "org.maui.index"
0044 
0045 Q_DECL_EXPORT int main(int argc, char *argv[])
0046 {
0047     QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
0048     QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);
0049 
0050 #ifdef Q_OS_WIN32
0051     qputenv("QT_MULTIMEDIA_PREFERRED_PLUGINS", "w");
0052 #endif
0053 
0054 #ifdef Q_OS_ANDROID
0055     QGuiApplication app(argc, argv);
0056     if (!MAUIAndroid::checkRunTimePermissions({"android.permission.WRITE_EXTERNAL_STORAGE"}))
0057         return -1;
0058 #else
0059     QApplication app(argc, argv);
0060 #endif
0061 
0062     app.setOrganizationName(QStringLiteral("Maui"));
0063     app.setWindowIcon(QIcon(":/index.png"));
0064 
0065     KLocalizedString::setApplicationDomain("index-fm");
0066 
0067     KAboutData about(QStringLiteral("index"),
0068                      i18n("Index"),
0069                      INDEX_VERSION_STRING,
0070                      i18n("Browse, organize and preview your files."),
0071                      KAboutLicense::LGPL_V3,
0072                      INDEX_COPYRIGHT_NOTICE,
0073                      QString(GIT_BRANCH) + "/" + QString(GIT_COMMIT_HASH));
0074 
0075     about.addAuthor(QStringLiteral("Camilo Higuita"), i18n("Developer"), QStringLiteral("milo.h@aol.com"));
0076     about.addAuthor(QStringLiteral("Gabriel Dominguez"), i18n("Developer"), QStringLiteral("gabriel@gabrieldominguez.es"));
0077     about.setHomepage("https://mauikit.org");
0078     about.setProductName("maui/index");
0079     about.setBugAddress("https://invent.kde.org/maui/index-fm/-/issues");
0080     about.setOrganizationDomain(INDEX_URI);
0081     about.setProgramLogo(app.windowIcon());
0082     about.addComponent("KIO", "", KIO_VERSION_STRING);
0083 
0084     const auto FBData = MauiKitFileBrowsing::aboutData();
0085     about.addComponent(FBData.name(), MauiKitFileBrowsing::buildVersion(), FBData.version(), FBData.webAddress());
0086 
0087     KAboutData::setApplicationData(about);
0088     MauiApp::instance()->setIconName("qrc:/assets/index.png");
0089 
0090     QCommandLineOption newWindowOption(QStringList() << "n" << "new", "Open url in a new window.", "url");
0091 
0092     QCommandLineParser parser;
0093 
0094     parser.addOption(newWindowOption);
0095 
0096     parser.setApplicationDescription(about.shortDescription());
0097     parser.process(app);
0098     about.processCommandLine(&parser);
0099 
0100     const QStringList args = parser.positionalArguments();
0101     QStringList paths;
0102     
0103     if (!args.isEmpty())
0104     {
0105         for(const auto &path : args)
0106             paths << QUrl::fromUserInput(path).toString();
0107     }
0108 
0109 
0110 #if (defined Q_OS_LINUX || defined Q_OS_FREEBSD) && !defined Q_OS_ANDROID
0111 
0112     if(parser.isSet(newWindowOption))
0113     {
0114         paths = QStringList() << QUrl::fromUserInput(parser.value(newWindowOption)).toString() ;
0115     }else
0116     {        
0117         if (IndexInstance::attachToExistingInstance(QUrl::fromStringList(paths), false, false))
0118         {
0119             // Successfully attached to existing instance of Index
0120             return 0;
0121         }
0122     }
0123 
0124     IndexInstance::registerService();
0125 #endif
0126 
0127     auto index = std::make_unique<Index>(nullptr);
0128 
0129     QQmlApplicationEngine engine;
0130     const QUrl url(QStringLiteral("qrc:/main.qml"));
0131 
0132     QObject::connect(
0133         &engine,
0134         &QQmlApplicationEngine::objectCreated,
0135         &app,
0136         [url, &index](QObject *obj, const QUrl &objUrl) {
0137             if (!obj && url == objUrl)
0138                 QCoreApplication::exit(-1);
0139 
0140             index->setQmlObject(obj);
0141 
0142         }, Qt::QueuedConnection);
0143 
0144     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0145 
0146     engine.rootContext()->setContextProperty("initPaths", paths);
0147 
0148     engine.rootContext()->setContextProperty("inx", index.get());
0149     qmlRegisterType<CompressedFile>(INDEX_URI, 1, 0, "CompressedFile");
0150     qmlRegisterType<FilePreviewer>(INDEX_URI, 1, 0, "FilePreviewProvider");
0151     qmlRegisterType<RecentFilesModel>(INDEX_URI, 1, 0, "RecentFiles");
0152     qmlRegisterType<DirInfo>(INDEX_URI, 1, 0, "DirInfo");
0153     qmlRegisterType<PathList>(INDEX_URI, 1, 0, "PathList");
0154     qmlRegisterType<FolderConfig>(INDEX_URI, 1, 0, "FolderConfig");
0155     qmlRegisterType<FileProperties>(INDEX_URI, 1, 0, "FileProperties");
0156     qmlRegisterType<Permission>(INDEX_URI, 1, 0, "Permission");
0157     qmlRegisterType<PathArrowBackground>(INDEX_URI, 1, 0, "PathArrowBackground");
0158 
0159     engine.load(url);
0160 
0161 #ifdef Q_OS_MACOS
0162     //        MAUIMacOS::removeTitlebarFromWindow();
0163     //        MauiApp::instance()->setEnableCSD(true); //for now index can not handle cloud accounts
0164 #endif
0165     return app.exec();
0166 }