-
Notifications
You must be signed in to change notification settings - Fork 25
/
programspresenter.cc
75 lines (65 loc) · 1.98 KB
/
programspresenter.cc
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
#include <QDebug>
#include <QMessageBox>
#include "hexdump.h"
#include "programspresenter.h"
#include "programsitemmodel.h"
#include "keyboardmodel.h"
#ifdef USE_COMPILER
#include "LibKeyc_stub.h"
#endif
ProgramsPresenter::ProgramsPresenter() {
mView = new ProgramsView(this);
}
ProgramsPresenter::~ProgramsPresenter() {
if (!mView->parent()) {
delete mView;
}
}
void ProgramsPresenter::setModel(const QSharedPointer<KeyboardModel>& model) {
mKeyboardModel = model;
mView->setPrograms(model->getPrograms(), model->getProgramSpace());
}
void ProgramsPresenter::setProgram(int program, QByteArray newContents) {
(*mKeyboardModel->getPrograms())[program].setByteCode(newContents);
mView->programChanged(program);
}
#ifdef USE_COMPILER
void ProgramsPresenter::setProgram(int program, QString filePath) {
/* Compile model */
size_t codeSize = 0;
size_t errorSize = 0;
char *code = nullptr;
char *error = nullptr;
int result =
compile(filePath.toLatin1().data(),
&codeSize, &code,
&errorSize, &error);
if (result == 0) {
QByteArray newContents(code, codeSize); // deep copy
qDebug() << "compile returned" << endl << hexdump(newContents);
(*mKeyboardModel->getPrograms())[program].setByteCode(newContents);
mView->programChanged(program);
}
else {
qDebug() << "compile failed" << endl << error;
QMessageBox errorMessage;
errorMessage.setText("Compliation failed");
errorMessage.setInformativeText(QString::fromLatin1(error, errorSize));
errorMessage.exec();
}
free(code);
free(error);
}
#else
void ProgramsPresenter::setProgram(int program, QString filePath) {
Q_UNUSED(program);
Q_UNUSED(filePath);
qDebug() << "compiler not integrated; use precompiled binary";
QMessageBox errorMessage;
errorMessage.setText("This build of KeyboardClient does not contain a compiler.");
errorMessage.setInformativeText(
"Only .k files may be loaded. For .kc files, use "
"the compiler or build with the compiler integration");
errorMessage.exec();
}
#endif