editing a question

This commit is contained in:
jorenchik
2024-10-14 23:51:44 +03:00
parent 9988586d03
commit 1f5a20ff1a

View File

@@ -4,6 +4,7 @@
#include <iostream> #include <iostream>
#include <qabstractbutton.h> #include <qabstractbutton.h>
#include <qboxlayout.h> #include <qboxlayout.h>
#include <qdialog.h>
#include <qlabel.h> #include <qlabel.h>
#include <qlayoutitem.h> #include <qlayoutitem.h>
#include <qmainwindow.h> #include <qmainwindow.h>
@@ -100,6 +101,9 @@ QSpacerItem *mdemSpacer;
std::vector<ErrorView*> errorPool; std::vector<ErrorView*> errorPool;
std::vector<ErrorView*> errorViews; std::vector<ErrorView*> errorViews;
// Editor
Mdem* editMdem;
// Pagination // Pagination
int currentPage = -1; int currentPage = -1;
std::vector<Page> pages; std::vector<Page> pages;
@@ -111,6 +115,7 @@ QToolButton* nextButton;
QLabel* paginationLabel; QLabel* paginationLabel;
// Mdem actions // Mdem actions
QToolButton *add;
QToolButton *save; QToolButton *save;
QToolButton *load; QToolButton *load;
QToolButton *practice; QToolButton *practice;
@@ -220,6 +225,13 @@ Mdem* makeMdem() {
mdem->hFront.addStretch(1); mdem->hFront.addStretch(1);
mdem->editButton.setText("Edit"); mdem->editButton.setText("Edit");
QObject::connect(
&mdem->editButton,
&QToolButton::clicked,
[mdem](bool checked) {
editMdem = mdem;
}
);
mdem->hFront.addWidget(&mdem->editButton); mdem->hFront.addWidget(&mdem->editButton);
QObject::connect(&mdem->editButton, &QToolButton::clicked, [mdem]() { QObject::connect(&mdem->editButton, &QToolButton::clicked, [mdem]() {
@@ -271,6 +283,66 @@ Mdem* makeMdem() {
return mdem; return mdem;
} }
void setupMdem(Mdem *mdem, Question *question) {
if (MultiElementQuestion* mw = dynamic_cast<MultiElementQuestion*>(question)) {
mdem->wFrontText.setText(
QString::fromStdString(mw->QuestionText)
);
auto choices = mw->Choices;
for (size_t k = 0; k < choices.size(); ++k) {
auto answer = choices[k].Answer;
switch (mw->type) {
case MultiElementType::Order:
answer = std::format("{}. {}", k + 1, answer);
break;
case MultiElementType::MultiChoice:
if (choices[k].IsCorrect) {
answer = std::format("+ {}", answer);
} else {
answer = std::format("- {}", answer);
}
break;
case MultiElementType::Regular:
answer = std::format("- {}", answer);
break;
}
if (k < mdem->backLabels.size()) {
mdem->backLabels[k]->setText(QString::fromStdString(answer));
} else {
auto label = new QLabel();
label->setText(QString::fromStdString(answer));
mdem->backLabels.push_back(label);
mdem->wBack.layout()->addWidget(label);
}
}
mdem->labelCount = choices.size();
} else if (GroupQuestion* mw = dynamic_cast<GroupQuestion*>(question)) {
mdem->wFrontText.setText(
QString::fromStdString(mw->QuestionText)
);
auto groups = mw->Groups;
std::vector<std::string> elements;
for (size_t k = 0; k < groups.size(); ++k) {
auto answer = groups[k].name;
elements.push_back(std::format("- {}:", answer));
for (size_t l = 0; l < groups[k].elements.size(); ++l) {
elements.push_back(std::format(" - {}", groups[k].elements[l]));
}
}
for (size_t k = 0; k < elements.size(); ++k) {
if (k < mdem->backLabels.size()) {
mdem->backLabels[k]->setText(QString::fromStdString(elements[k]));
} else {
auto label = new QLabel();
label->setText(QString::fromStdString(elements[k]));
mdem->backLabels.push_back(label);
mdem->wBack.layout()->addWidget(label);
}
}
mdem->labelCount = elements.size();
}
}
void CreateMdems(std::vector<Question*>& questions) { void CreateMdems(std::vector<Question*>& questions) {
hMdemScroll->removeItem(mdemSpacer); hMdemScroll->removeItem(mdemSpacer);
@@ -289,66 +361,9 @@ void CreateMdems(std::vector<Question*>& questions) {
} }
} }
for (size_t i = 0; i < questions.size(); ++i) { for (size_t i = 0; i < questions.size(); ++i) {
mdems[i]->question = questions[i]; mdems[i]->question = questions[i];
if (MultiElementQuestion* mw = dynamic_cast<MultiElementQuestion*>(questions[i])) { setupMdem(mdems[i], questions[i]);
mdems[i]->wFrontText.setText(
QString::fromStdString(mw->QuestionText)
);
auto choices = mw->Choices;
for (size_t k = 0; k < choices.size(); ++k) {
auto answer = choices[k].Answer;
switch (mw->type) {
case MultiElementType::Order:
answer = std::format("{}. {}", k + 1, answer);
break;
case MultiElementType::MultiChoice:
if (choices[k].IsCorrect) {
answer = std::format("+ {}", answer);
} else {
answer = std::format("- {}", answer);
}
break;
case MultiElementType::Regular:
answer = std::format("- {}", answer);
break;
}
if (k < mdems[i]->backLabels.size()) {
mdems[i]->backLabels[k]->setText(QString::fromStdString(answer));
} else {
auto label = new QLabel();
label->setText(QString::fromStdString(answer));
mdems[i]->backLabels.push_back(label);
mdems[i]->wBack.layout()->addWidget(label);
}
}
mdems[i]->labelCount = choices.size();
} else if (GroupQuestion* mw = dynamic_cast<GroupQuestion*>(questions[i])) {
mdems[i]->wFrontText.setText(
QString::fromStdString(mw->QuestionText)
);
auto groups = mw->Groups;
std::vector<std::string> elements;
for (size_t k = 0; k < groups.size(); ++k) {
auto answer = groups[k].name;
elements.push_back(std::format("- {}:", answer));
for (size_t l = 0; l < groups[k].elements.size(); ++l) {
elements.push_back(std::format(" - {}", groups[k].elements[l]));
}
}
for (size_t k = 0; k < elements.size(); ++k) {
if (k < mdems[i]->backLabels.size()) {
mdems[i]->backLabels[k]->setText(QString::fromStdString(elements[k]));
} else {
auto label = new QLabel();
label->setText(QString::fromStdString(elements[k]));
mdems[i]->backLabels.push_back(label);
mdems[i]->wBack.layout()->addWidget(label);
}
}
mdems[i]->labelCount = elements.size();
}
if (!mdems[i]->wMdem.isVisible()) { if (!mdems[i]->wMdem.isVisible()) {
mdems[i]->wMdem.show(); mdems[i]->wMdem.show();
} }
@@ -582,6 +597,33 @@ void pickDirectory(QString directory) {
reloadMdem(); reloadMdem();
} }
void setupEditorSave(bool checked) {
auto res = transpile(editor->text().toStdString(), true);
if (res.error.length() > 0) {
QMessageBox::information(
nullptr,
"Editing error",
QString::fromStdString(res.error)
);
} else {
if (res.value.questions.size() <= 0) {
QMessageBox::information(
nullptr,
"Editing error",
"There are no questions in your input."
);
} else if (res.value.questions.size() == 1) {
setupMdem(editMdem, res.value.questions[0]);
showBacklabels(editMdem);
} else {
QMessageBox::information(
nullptr,
"Editing error",
"There are more than question in your input. Please enter one."
);
}
}
};
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
QApplication app(argc, argv); QApplication app(argc, argv);
@@ -627,6 +669,11 @@ int main(int argc, char *argv[]) {
auto save = new QToolButton; auto save = new QToolButton;
editorButtons->setLayout(buttonLayout); editorButtons->setLayout(buttonLayout);
save->setText(QString::fromStdString("Save")); save->setText(QString::fromStdString("Save"));
QObject::connect(
save,
&QToolButton::clicked,
setupEditorSave
);
buttonLayout->addWidget(save); buttonLayout->addWidget(save);
vlEditor->addWidget(editor); vlEditor->addWidget(editor);
@@ -694,13 +741,18 @@ int main(int argc, char *argv[]) {
hTop->addWidget(deckListLabel); hTop->addWidget(deckListLabel);
hTop->addStretch(1); hTop->addStretch(1);
add = new QToolButton;
save = new QToolButton; save = new QToolButton;
load = new QToolButton; load = new QToolButton;
practice = new QToolButton; practice = new QToolButton;
hTop->addWidget(add);
hTop->addWidget(save); hTop->addWidget(save);
hTop->addWidget(load); hTop->addWidget(load);
hTop->addWidget(practice); hTop->addWidget(practice);
QObject::connect(add, &QToolButton::clicked, []() {
// MARK1
});
// Buttons // Buttons
save->setText("Save"); save->setText("Save");