File indexing completed on 2024-04-28 05:38:14

0001 /***************************************************************************
0002  *  Copyright (C) 2020 by Renaud Guezennec                               *
0003  *   http://www.rolisteam.org/contact                                      *
0004  *                                                                         *
0005  *   This software is free software; you can redistribute it and/or modify *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
0019  ***************************************************************************/
0020 #include "mindmapview.h"
0021 
0022 #include "qml_components/avatarprovider.h"
0023 
0024 #include <QJSValue>
0025 #include <QQmlContext>
0026 #include <QQmlEngine>
0027 #include <QQmlFileSelector>
0028 #include <QQuickStyle>
0029 
0030 #include "controller/view_controller/mindmapcontroller.h"
0031 #include "mindmap/model/nodeimageprovider.h"
0032 #include "mindmap/data/minditem.h"
0033 #include <common_qml/theme.h>
0034 #include "mindmap/data/nodestyle.h"
0035 #include "utils/mappinghelper.h"
0036 #include "controller/view_controller/sidemenucontroller.h"
0037 #include "mindmap/qmlItems/linkitem.h"
0038 
0039 void registerMindmapType()
0040 {
0041     qRegisterMetaType<PlayerModel*>("PlayerModel*");
0042     qRegisterMetaType<customization::Theme*>("customization::Theme*");
0043     qRegisterMetaType<customization::StyleSheet*>("customization::StyleSheet*");
0044 
0045     qmlRegisterAnonymousType<PlayerModel>("PlayerModel", 1);
0046 
0047     qmlRegisterSingletonType<customization::Theme>("Customization", 1, 0, "Theme",
0048                                                    [](QQmlEngine* engine, QJSEngine*) -> QObject*
0049                                                    {
0050                                                        auto instead= customization::Theme::instance();
0051                                                        engine->setObjectOwnership(instead, QQmlEngine::CppOwnership);
0052                                                        return instead;
0053                                                    });
0054 
0055     qmlRegisterType<utils::MappingHelper>("utils", 1, 0, "MappingHelper");
0056     qmlRegisterUncreatableType<mindmap::MindMapControllerBase>("mindmap", 1, 0, "MindMapController",
0057                                                                "MindMapController can't be created in qml");
0058     qmlRegisterUncreatableType<mindmap::MindItem>("mindmap", 1, 0, "MindItem", "Enum only");
0059     qmlRegisterType<mindmap::SelectionController>("mindmap", 1, 0, "SelectionController");
0060     qmlRegisterUncreatableType<RemotePlayerModel>("mindmap", 1, 0, "RemotePlayerModel", "property values");
0061     qmlRegisterType<mindmap::LinkItem>("mindmap", 1, 0, "MindLink");
0062     qmlRegisterType<mindmap::NodeStyle>("mindmap", 1, 0, "NodeStyle");
0063     qmlRegisterUncreatableType<mindmap::PositionedItem>("mindmap", 1, 0, "PositionedItem", "Enum only");
0064     qmlRegisterType<mindmap::SideMenuController>("mindmap", 1, 0, "SideMenuController");
0065     qmlRegisterUncreatableType<mindmap::MindItemModel>("mindmap", 1, 0, "MindItemModel",
0066                                                        "MindItemModel can't be created in qml");
0067 }
0068 
0069 MindMapView::MindMapView(MindMapController* ctrl, QWidget* parent)
0070     : MediaContainer(ctrl, MediaContainer::ContainerType::MindMapContainer, parent)
0071     , m_qmlViewer(new QQuickWidget())
0072     , m_ctrl(ctrl)
0073 {
0074     registerMindmapType();
0075     // auto format= QSurfaceFormat::defaultFormat();
0076     /*auto format= m_qmlViewer->format();
0077     if(QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL)
0078     {
0079         format.setVersion(3, 2);
0080         format.setProfile(QSurfaceFormat::CoreProfile);
0081     }
0082     //format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
0083     format.setDepthBufferSize(24);
0084     format.setStencilBufferSize(8);
0085     format.setSamples(8);
0086     m_qmlViewer->setFormat(format);*/
0087 
0088     setObjectName("mindmap");
0089     setWindowIcon(QIcon::fromTheme("mindmap"));
0090     auto engine= m_qmlViewer->engine();
0091 
0092     auto selector= new QQmlFileSelector(engine, this);
0093     auto instance= customization::Theme::instance();
0094     connect(instance, &customization::Theme::folderChanged, this, [instance, selector]() {
0095         qDebug() << "change prefix" << instance->folder();
0096         selector->setExtraSelectors({instance->folder()});
0097     });
0098 
0099     engine->setOutputWarningsToStandardError(true);
0100 
0101     qmlRegisterSingletonType<MindmapManager>(
0102         "mindmap", 1, 0, "MindmapManager", [ctrl, engine](QQmlEngine* qmlengine, QJSEngine* scriptEngine) -> QObject* {
0103             Q_UNUSED(scriptEngine)
0104             if(qmlengine != engine)
0105                 return {};
0106             static QHash<QQmlEngine*, MindmapManager*> hash;
0107 
0108             if(!hash.contains(qmlengine))
0109             {
0110                 auto m= new MindmapManager(ctrl);
0111                 m->setCtrl(ctrl);
0112                 qmlengine->setObjectOwnership(m, QQmlEngine::CppOwnership);
0113                 hash.insert(qmlengine, m);
0114             }
0115 
0116             return hash.value(qmlengine);
0117         });
0118     if(!m_ctrl)
0119         return;
0120     engine->addImageProvider("avatar", new AvatarProvider(m_ctrl->playerModel()));
0121     engine->addImageProvider("nodeImages", new mindmap::NodeImageProvider(m_ctrl->imgModel()));
0122     engine->addImportPath(QStringLiteral("qrc:/qml"));
0123     engine->addImportPath(QStringLiteral("qrc:/qml/rolistyle"));
0124 
0125     connect(engine, &QQmlEngine::warnings, this, [](const QList<QQmlError>& errors) {
0126         for(const auto& error : errors)
0127             qDebug() << "warnings: " << error;
0128     });
0129     connect(m_qmlViewer.get(), &QQuickWidget::sceneGraphError, this,
0130             [](QQuickWindow::SceneGraphError error, const QString& message) { qDebug() << message << error; });
0131 
0132     m_qmlViewer->setResizeMode(QQuickWidget::SizeRootObjectToView);
0133     m_qmlViewer->setSource(QUrl("qrc:/resources/qml/main.qml"));
0134 
0135     auto const& errors= m_qmlViewer->errors();
0136     std::for_each(std::begin(errors), std::end(errors), [](const QQmlError& error) { qDebug() << error; });
0137 
0138     // m_qmlViewer.
0139 
0140     auto wid= new QWidget(this);
0141 
0142     auto layout= new QVBoxLayout(wid);
0143     layout->setContentsMargins(QMargins());
0144     wid->setLayout(layout);
0145 
0146     layout->addWidget(m_qmlViewer.get());
0147 
0148     connect(ctrl, &MindMapController::nameChanged, this,
0149             [this]() { setWindowTitle(tr("%1 - Mindmap").arg(m_ctrl->name())); });
0150 
0151     setWindowTitle(tr("%1 - Mindmap").arg(m_ctrl->name()));
0152 
0153     setWidget(wid);
0154 }
0155 
0156 MindmapManager::MindmapManager(QObject* parent) : QObject(parent) {}
0157 
0158 MindMapController* MindmapManager::ctrl() const
0159 {
0160     return m_ctrl;
0161 }
0162 
0163 void MindmapManager::setCtrl(MindMapController* ctrl)
0164 {
0165     if(m_ctrl == ctrl)
0166         return;
0167     m_ctrl= ctrl;
0168     emit ctrlChanged();
0169 }