File indexing completed on 2024-03-24 17:07:35

0001 /*
0002  *   SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003  *
0004  *   SPDX-License-Identifier: LGPL-3.0-or-later
0005  */
0006 
0007 #include <QCommandLineParser>
0008 
0009 #include <QGuiApplication>
0010 #include <QPainter>
0011 #include <QRasterWindow>
0012 #include <QTimer>
0013 #include <QWindow>
0014 
0015 #include <QMetaEnum>
0016 
0017 #include <interfaces/shell.h>
0018 #include <interfaces/window.h>
0019 
0020 using namespace LayerShellQt;
0021 
0022 QStringList enumsToStringList(QMetaEnum metaEnum)
0023 {
0024     QStringList ret;
0025     ret.reserve(metaEnum.keyCount());
0026     for (int i = 0; i < metaEnum.keyCount(); ++i) {
0027         ret.append(metaEnum.key(i));
0028     }
0029     return ret;
0030 }
0031 
0032 template<typename T>
0033 T stringToEnum(QMetaEnum metaEnum, const QString &str)
0034 {
0035     T ret = {};
0036     const auto splitted = str.split(QLatin1Char('|'));
0037     for (const auto &value : splitted) {
0038         ret |= T(metaEnum.keyToValue(qPrintable(value)));
0039     }
0040     return ret;
0041 }
0042 
0043 class BasicWindow : public QRasterWindow
0044 {
0045     void paintEvent(QPaintEvent *)
0046     {
0047         QPainter p(this);
0048         p.fillRect(QRect(0, 0, width(), height()), Qt::red);
0049     }
0050 };
0051 
0052 int main(int argc, char **argv)
0053 {
0054     Shell::useLayerShell();
0055 
0056     QGuiApplication app(argc, argv);
0057 
0058     const auto layerMetaEnum = QMetaEnum::fromType<Window::Layer>();
0059     const auto anchorMetaEnum = QMetaEnum::fromType<Window::Anchor>();
0060 
0061     QCommandLineParser parser;
0062     QCommandLineOption marginsOption(QStringLiteral("margins"), QStringLiteral("Window margins"), QStringLiteral("pixels"), QStringLiteral("0"));
0063     QCommandLineOption scopeOption(QStringLiteral("scope"), QStringLiteral("Window scope"), QStringLiteral("namespace"), QStringLiteral("normal"));
0064     QCommandLineOption anchorsOption(QStringLiteral("anchors"),
0065                                      QStringLiteral("Either ") + enumsToStringList(anchorMetaEnum).join(QLatin1String("|")),
0066                                      QStringLiteral("anchors"),
0067                                      QStringLiteral("AnchorTop|AnchorBottom|AnchorLeft|AnchorRight"));
0068     QCommandLineOption layerOption(QStringLiteral("layer"),
0069                                    QStringLiteral("One of ") + enumsToStringList(layerMetaEnum).join(QLatin1String("|")),
0070                                    QStringLiteral("layer"),
0071                                    QStringLiteral("LayerTop"));
0072     QCommandLineOption widthOption(QStringLiteral("width"), QStringLiteral("Width of the window"), QStringLiteral("pixels"), QStringLiteral("0"));
0073     QCommandLineOption heightOption(QStringLiteral("height"), QStringLiteral("Height of the window"), QStringLiteral("pixels"), QStringLiteral("0"));
0074 
0075     parser.addOptions({marginsOption, scopeOption, anchorsOption, layerOption, widthOption, heightOption});
0076     parser.addHelpOption();
0077     parser.process(app);
0078 
0079     BasicWindow window;
0080 
0081     LayerShellQt::Window *layerShell = LayerShellQt::Window::get(&window);
0082     if (parser.isSet(marginsOption)) {
0083         int margins = parser.value(marginsOption).toInt();
0084         layerShell->setMargins({margins, margins, margins, margins});
0085     }
0086 
0087     if (parser.isSet(scopeOption)) {
0088         layerShell->setScope(parser.value(scopeOption));
0089     }
0090     if (parser.isSet(layerOption)) {
0091         layerShell->setLayer(Window::Layer(layerMetaEnum.keyToValue(qPrintable(parser.value(layerOption)))));
0092     }
0093     if (parser.isSet(anchorsOption)) {
0094         layerShell->setAnchors(stringToEnum<Window::Anchors>(anchorMetaEnum, parser.value(anchorsOption)));
0095     }
0096     if (parser.isSet(widthOption)) {
0097         window.setWidth(parser.value(widthOption).toInt());
0098     }
0099     if (parser.isSet(heightOption)) {
0100         window.setHeight(parser.value(heightOption).toInt());
0101     }
0102 
0103     window.show();
0104 
0105     // just so you don't block yourself out whilst testing
0106     QTimer::singleShot(5000, &app, &QGuiApplication::quit);
0107     return app.exec();
0108 }