Skip to content

Commit 6f773ed

Browse files
committed
refactor: Launcher supports Network Disk Cache
1 parent b1b1529 commit 6f773ed

7 files changed

+65
-14
lines changed

launcher/Launcher.pro

+11-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
QT += quickcontrols2 websockets svg
1+
QT += quickcontrols2 websockets svg network
22
android|ios|qnx|winrt|isEmpty(QT.widgets.name): CONFIG += no_desktop
33
!no_desktop: QT += widgets
44

55
CONFIG(debug, debug|release) {
6-
message("debug mode")
76
DEFINES += DEBUG
8-
} else {
9-
message("release mode")
7+
}
8+
9+
isEqual(PRODUCTION, "true") {
10+
message("Production Build")
11+
DEFINES += PRODUCTION
12+
RESOURCES += dist/bundle.qrc
1013
}
1114

1215
QMAKE_TARGET_COMPANY = Podzim
@@ -16,10 +19,12 @@ TARGET = Launcher
1619

1720
HEADERS += \
1821
qtquickcontrolsapplication.h \
19-
ReactQML/rq.h
22+
ReactQML/rq.h \
23+
ReactQML/rqnetworkaccessmanagerfactory.h
2024

2125

2226
SOURCES += main.cpp \
23-
ReactQML/rq.cpp
27+
ReactQML/rq.cpp \
28+
ReactQML/rqnetworkaccessmanagerfactory.cpp
2429

2530
RESOURCES += main.qrc

launcher/ReactQML/rq.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ QObject *RQ::qmlInstance(QQmlEngine *engine, QJSEngine *scriptEngine) {
1010
return rq;
1111
}
1212

13-
RQ::RQ(QQmlEngine *engine) : m_engine(engine) {
13+
RQ::RQ(QQmlEngine *engine)
14+
: m_engine(engine), m_nam(new RQNetworkAccessManagerFactory()) {
1415
// timer context
1516
m_timer_context = new QQmlContext(m_engine->rootContext());
1617
m_timer_component = new QQmlComponent(m_engine);
@@ -23,6 +24,9 @@ RQ::RQ(QQmlEngine *engine) : m_engine(engine) {
2324

2425
// error handling
2526
connect(m_engine, &QQmlEngine::warnings, this, &RQ::onQmlWarnings);
27+
28+
// disk cache
29+
engine->setNetworkAccessManagerFactory(m_nam);
2630
}
2731

2832
RQ::~RQ() {

launcher/ReactQML/rq.h

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#ifndef RQ_H
22
#define RQ_H
33

4+
#include "rqnetworkaccessmanagerfactory.h"
5+
46
#include <QObject>
57
#include <QQmlComponent>
68
#include <QQmlContext>
@@ -33,6 +35,8 @@ private slots:
3335

3436
QQmlContext *m_ws_context;
3537
QQmlComponent *m_ws_component;
38+
39+
RQNetworkAccessManagerFactory *m_nam;
3640
};
3741

3842
#endif // RQ_H
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include "rqnetworkaccessmanagerfactory.h"
2+
3+
#include <QNetworkAccessManager>
4+
#include <QNetworkDiskCache>
5+
6+
QNetworkAccessManager *RQNetworkAccessManagerFactory::create(QObject *parent) {
7+
QNetworkAccessManager *nam = new QNetworkAccessManager(parent);
8+
auto cache = new QNetworkDiskCache(parent);
9+
cache->setCacheDirectory("react-qml-httpcache");
10+
nam->setCache(cache);
11+
return nam;
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#ifndef RQNETWORKACCESSMANAGERFACTORY_H
2+
#define RQNETWORKACCESSMANAGERFACTORY_H
3+
4+
#include <QQmlNetworkAccessManagerFactory>
5+
6+
class RQNetworkAccessManagerFactory : public QQmlNetworkAccessManagerFactory {
7+
public:
8+
QNetworkAccessManager *create(QObject *parent);
9+
};
10+
11+
#endif // RQNETWORKACCESSMANAGERFACTORY_H

launcher/main.cpp

+19-4
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@
33
#include <QQmlContext>
44
#include <QQuickStyle>
55

6+
#ifdef PRODUCTION
7+
#define PRODUCTION_BUILD true
8+
#else
9+
#define PRODUCTION_BUILD false
10+
#endif
11+
612
int main(int argc, char *argv[]) {
713
// Disable qml cache, or it would crash in development
8-
qputenv("QML_DISABLE_DISK_CACHE", "true");
14+
qputenv("QML_DISABLE_DISK_CACHE", PRODUCTION_BUILD ? "false" : "true");
915

1016
// This has the app draw at HiDPI scaling on HiDPI displays, usually two
1117
// pixels for every one logical pixel
@@ -21,18 +27,27 @@ int main(int argc, char *argv[]) {
2127
// - <QtGui/QGuiApplication> (on other platform)
2228
QtQuickControlsApplication app(argc, argv);
2329

24-
// Do not automatically quit on last window closed
30+
// Do not automatically quit on last window closed in development
2531
// We need this for hot-reloading
32+
// in macOS, always set this to false
33+
#ifdef Q_OS_MAC
2634
app.setQuitOnLastWindowClosed(false);
27-
35+
#else
36+
app.setQuitOnLastWindowClosed(PRODUCTION_BUILD);
37+
#endif
2838
// setup app basic metadata
2939
app.setOrganizationName("Podzim");
3040
app.setOrganizationDomain("podzim.co");
3141
app.setApplicationName("Launcher");
3242

3343
QQmlApplicationEngine engine;
3444
engine.addImportPath(QStringLiteral("qrc:/"));
35-
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
45+
46+
if (PRODUCTION_BUILD) {
47+
engine.load(QUrl(QLatin1String("qrc:/index.qml")));
48+
} else {
49+
engine.load(QUrl(QLatin1String("qrc:/react-qml/main.qml")));
50+
}
3651

3752
return app.exec();
3853
}

launcher/main.qrc

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<RCC>
2-
<qresource prefix="/">
3-
<file>main.qml</file>
4-
</qresource>
2+
<qresource prefix="/react-qml">
3+
<file>main.qml</file>
4+
</qresource>
55
</RCC>

0 commit comments

Comments
 (0)