Skip to content

Commit b4d401f

Browse files
committed
Add App class
1 parent c20bde1 commit b4d401f

File tree

4 files changed

+151
-25
lines changed

4 files changed

+151
-25
lines changed

src/app/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ set(APP_TARGET scratchcpp-player CACHE INTERNAL "")
22

33
qt_add_executable(${APP_TARGET}
44
main.cpp
5+
app.cpp
6+
app.h
57
)
68

79
qt_add_qml_module(${APP_TARGET}
@@ -20,7 +22,10 @@ set_target_properties(${APP_TARGET} PROPERTIES
2022

2123
target_compile_definitions(${APP_TARGET}
2224
PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
25+
target_compile_definitions(${APP_TARGET} PRIVATE BUILD_VERSION="${CMAKE_PROJECT_VERSION}")
2326
target_link_libraries(${APP_TARGET}
2427
PRIVATE Qt6::Quick Qt6::QuickControls2)
28+
target_include_directories(${APP_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..)
29+
target_include_directories(${APP_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../global)
2530

2631
target_link_libraries(${APP_TARGET} PRIVATE scratchcpp-render scratchcpp-renderplugin)

src/app/app.cpp

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
#include <QGuiApplication>
4+
#include <QQmlApplicationEngine>
5+
#include <QQuickStyle>
6+
#include <QIcon>
7+
#include <cassert>
8+
9+
#include "app.h"
10+
#include "globalmodule.h"
11+
#include "modularity/ioc.h"
12+
13+
using namespace scratchcpp;
14+
using namespace scratchcpp::modularity;
15+
16+
App::App()
17+
{
18+
addModule(new GlobalModule);
19+
}
20+
21+
int App::run(int argc, char **argv)
22+
{
23+
qputenv("QSG_RENDER_LOOP", "basic");
24+
25+
// Set up application object
26+
QGuiApplication app(argc, argv);
27+
QCoreApplication::setOrganizationDomain("scratchcpp.github.io");
28+
QCoreApplication::setOrganizationName("ScratchCPP");
29+
QCoreApplication::setApplicationName("ScratchCPP");
30+
QCoreApplication::setApplicationVersion(BUILD_VERSION);
31+
32+
// Set style and icon theme name
33+
QQuickStyle::setStyle("Material");
34+
QIcon::setThemeName("scratchcpp");
35+
36+
// Register exports
37+
for (IModuleSetup *module : m_modules)
38+
module->registerExports();
39+
40+
// Init settings
41+
for (IModuleSetup *module : m_modules)
42+
module->initSettings();
43+
44+
// Setup modules: onPreInit
45+
for (IModuleSetup *module : m_modules)
46+
module->onPreInit();
47+
48+
/* Splash screen should show now, if any. */
49+
50+
// Setup modules: onInit
51+
for (IModuleSetup *module : m_modules)
52+
module->onInit();
53+
54+
// Setup modules: onStartApp (on next event loop)
55+
QMetaObject::invokeMethod(
56+
qApp,
57+
[this]() {
58+
for (IModuleSetup *m : m_modules) {
59+
m->onStartApp();
60+
}
61+
},
62+
Qt::QueuedConnection);
63+
64+
// Load main.qml
65+
QQmlApplicationEngine engine;
66+
engine.addImportPath(":/");
67+
68+
const QUrl url(u"qrc:/ScratchCPP/main.qml"_qs);
69+
QObject::connect(
70+
&engine,
71+
&QQmlApplicationEngine::objectCreated,
72+
&app,
73+
[url](QObject *obj, const QUrl &objUrl) {
74+
if (!obj && url == objUrl)
75+
QCoreApplication::exit(-1);
76+
},
77+
Qt::QueuedConnection);
78+
engine.load(url);
79+
80+
// Run the event loop
81+
int exitCode = app.exec();
82+
83+
// Deinit modules
84+
for (IModuleSetup *module : m_modules)
85+
module->onDeinit();
86+
87+
for (IModuleSetup *module : m_modules)
88+
module->onDestroy();
89+
90+
// Remove all modules
91+
removeModules();
92+
93+
return exitCode;
94+
}
95+
96+
void App::addModule(IModuleSetup *module)
97+
{
98+
assert(module);
99+
assert(std::find_if(m_modules.begin(), m_modules.end(), [module](IModuleSetup *m) { return m->moduleName() == module->moduleName(); }) == m_modules.end());
100+
m_modules.push_back(module);
101+
}
102+
103+
void App::removeModules()
104+
{
105+
for (IModuleSetup *module : m_modules)
106+
delete module;
107+
108+
m_modules.clear();
109+
ioc()->reset();
110+
}

src/app/app.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
#pragma once
4+
5+
#include <vector>
6+
7+
namespace scratchcpp
8+
{
9+
10+
namespace modularity
11+
{
12+
13+
class IModuleSetup;
14+
15+
}
16+
17+
class App
18+
{
19+
public:
20+
App();
21+
22+
int run(int argc, char **argv);
23+
void addModule(modularity::IModuleSetup *module);
24+
25+
private:
26+
void removeModules();
27+
28+
std::vector<modularity::IModuleSetup *> m_modules;
29+
};
30+
31+
} // namespace scratchcpp

src/app/main.cpp

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,12 @@
11
// SPDX-License-Identifier: GPL-3.0-or-later
22

3-
#include <QGuiApplication>
4-
#include <QQmlApplicationEngine>
5-
#include <QQuickStyle>
6-
#include <QIcon>
3+
#include "app.h"
4+
5+
using namespace scratchcpp;
76

87
int main(int argc, char *argv[])
98
{
10-
qputenv("QSG_RENDER_LOOP", "basic");
11-
12-
QGuiApplication app(argc, argv);
13-
QQuickStyle::setStyle("Material");
14-
QIcon::setThemeName("scratchcpp");
15-
16-
QQmlApplicationEngine engine;
17-
engine.addImportPath(":/");
18-
19-
const QUrl url(u"qrc:/ScratchCPP/main.qml"_qs);
20-
QObject::connect(
21-
&engine,
22-
&QQmlApplicationEngine::objectCreated,
23-
&app,
24-
[url](QObject *obj, const QUrl &objUrl) {
25-
if (!obj && url == objUrl)
26-
QCoreApplication::exit(-1);
27-
},
28-
Qt::QueuedConnection);
29-
engine.load(url);
9+
App app;
3010

31-
return app.exec();
11+
return app.run(argc, argv);
3212
}

0 commit comments

Comments
 (0)