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,29 +283,9 @@ Mdem* makeMdem() {
return mdem; return mdem;
} }
void CreateMdems(std::vector<Question*>& questions) { void setupMdem(Mdem *mdem, Question *question) {
hMdemScroll->removeItem(mdemSpacer); if (MultiElementQuestion* mw = dynamic_cast<MultiElementQuestion*>(question)) {
mdem->wFrontText.setText(
for (Mdem *mdem : mdems) {
if (mdem->wMdem.isVisible()) {
mdem->wMdem.hide();
}
}
if (questions.size() > mdems.size()) {
auto amount = questions.size() - mdems.size();
for (size_t i = 0; i < amount; ++i) {
auto mdem = makeMdem();
mdems.append(mdem);
hMdemScroll->addWidget(&mdem->wMdem);
}
}
for (size_t i = 0; i < questions.size(); ++i) {
mdems[i]->question = questions[i];
if (MultiElementQuestion* mw = dynamic_cast<MultiElementQuestion*>(questions[i])) {
mdems[i]->wFrontText.setText(
QString::fromStdString(mw->QuestionText) QString::fromStdString(mw->QuestionText)
); );
auto choices = mw->Choices; auto choices = mw->Choices;
@@ -314,18 +306,18 @@ void CreateMdems(std::vector<Question*>& questions) {
answer = std::format("- {}", answer); answer = std::format("- {}", answer);
break; break;
} }
if (k < mdems[i]->backLabels.size()) { if (k < mdem->backLabels.size()) {
mdems[i]->backLabels[k]->setText(QString::fromStdString(answer)); mdem->backLabels[k]->setText(QString::fromStdString(answer));
} else { } else {
auto label = new QLabel(); auto label = new QLabel();
label->setText(QString::fromStdString(answer)); label->setText(QString::fromStdString(answer));
mdems[i]->backLabels.push_back(label); mdem->backLabels.push_back(label);
mdems[i]->wBack.layout()->addWidget(label); mdem->wBack.layout()->addWidget(label);
} }
} }
mdems[i]->labelCount = choices.size(); mdem->labelCount = choices.size();
} else if (GroupQuestion* mw = dynamic_cast<GroupQuestion*>(questions[i])) { } else if (GroupQuestion* mw = dynamic_cast<GroupQuestion*>(question)) {
mdems[i]->wFrontText.setText( mdem->wFrontText.setText(
QString::fromStdString(mw->QuestionText) QString::fromStdString(mw->QuestionText)
); );
auto groups = mw->Groups; auto groups = mw->Groups;
@@ -338,17 +330,40 @@ void CreateMdems(std::vector<Question*>& questions) {
} }
} }
for (size_t k = 0; k < elements.size(); ++k) { for (size_t k = 0; k < elements.size(); ++k) {
if (k < mdems[i]->backLabels.size()) { if (k < mdem->backLabels.size()) {
mdems[i]->backLabels[k]->setText(QString::fromStdString(elements[k])); mdem->backLabels[k]->setText(QString::fromStdString(elements[k]));
} else { } else {
auto label = new QLabel(); auto label = new QLabel();
label->setText(QString::fromStdString(elements[k])); label->setText(QString::fromStdString(elements[k]));
mdems[i]->backLabels.push_back(label); mdem->backLabels.push_back(label);
mdems[i]->wBack.layout()->addWidget(label); mdem->wBack.layout()->addWidget(label);
} }
} }
mdems[i]->labelCount = elements.size(); mdem->labelCount = elements.size();
} }
}
void CreateMdems(std::vector<Question*>& questions) {
hMdemScroll->removeItem(mdemSpacer);
for (Mdem *mdem : mdems) {
if (mdem->wMdem.isVisible()) {
mdem->wMdem.hide();
}
}
if (questions.size() > mdems.size()) {
auto amount = questions.size() - mdems.size();
for (size_t i = 0; i < amount; ++i) {
auto mdem = makeMdem();
mdems.append(mdem);
hMdemScroll->addWidget(&mdem->wMdem);
}
}
for (size_t i = 0; i < questions.size(); ++i) {
mdems[i]->question = questions[i];
setupMdem(mdems[i], questions[i]);
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");