-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproblemwidgets.cpp
More file actions
105 lines (84 loc) · 2.93 KB
/
Copy pathproblemwidgets.cpp
File metadata and controls
105 lines (84 loc) · 2.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "problemwidgets.h"
#include <QVBoxLayout>
#include <QCoreApplication>
#include <QDir>
#include <QUrl>
#include <QWebEngineSettings>
#include <QDebug>
ProblemBrowser::ProblemBrowser(const QUrl &url, ProgressManager *pm, QWidget *parent)
: QWidget(parent)
, progressManager(pm)
{
if (progressManager) {
progressManager->load();
}
auto *layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
m_view = new QWebEngineView(this);
m_view->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true);
m_view->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessFileUrls, true);
m_view->settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true);
m_channel = new QWebChannel(m_view->page());
m_bridge = new ProblemBrowserBridge(this);
m_channel->registerObject("browserBridge", m_bridge);
m_view->page()->setWebChannel(m_channel);
layout->addWidget(m_view);
connect(m_bridge, &ProblemBrowserBridge::openProblemRequested,
this, &ProblemBrowser::navigateToEditor);
connect(m_bridge, &ProblemBrowserBridge::browserReady,
this, &ProblemBrowser::onBridgeBrowserReady);
connect(m_view, &QWebEngineView::loadFinished, this, [this](bool ok) {
if (ok) {
m_isWebReady = true;
syncToWeb();
}
});
if (progressManager) {
connect(progressManager, &ProgressManager::progressChanged,
this, &ProblemBrowser::onProgressChanged);
}
m_view->setUrl(url);
}
ProblemBrowser::~ProblemBrowser() = default;
void ProblemBrowser::onBridgeBrowserReady()
{
m_isWebReady = true;
syncToWeb();
}
QJsonObject ProblemBrowser::getSolvedMap() const
{
QJsonObject solvedMap;
if (!progressManager) return solvedMap;
for (const QJsonValue &val : m_problemsArray) {
QString id = val.toObject()["id"].toString();
if (!id.isEmpty()) {
solvedMap[id] = progressManager->isSolved(id);
}
}
return solvedMap;
}
void ProblemBrowser::syncToWeb()
{
if (!m_isWebReady) return;
QString problemsJson = QJsonDocument(m_problemsArray).toJson(QJsonDocument::Compact);
QString solvedJson = QJsonDocument(getSolvedMap()).toJson(QJsonDocument::Compact);
m_view->page()->runJavaScript(
QString("window.loadProblems(%1, %2);").arg(problemsJson, solvedJson)
);
}
void ProblemBrowser::loadFromJson(const QString &filePath)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) return;
QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
m_problemsArray = doc.array();
syncToWeb();
}
void ProblemBrowser::onProgressChanged(const QString &)
{
if (!m_isWebReady) return;
QString solvedJson = QJsonDocument(getSolvedMap()).toJson(QJsonDocument::Compact);
m_view->page()->runJavaScript(
QString("window.updateProgress(%1);").arg(solvedJson)
);
}