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 }