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 <qabstractbutton.h>
#include <qboxlayout.h>
#include <qdialog.h>
#include <qlabel.h>
#include <qlayoutitem.h>
#include <qmainwindow.h>
@@ -100,6 +101,9 @@ QSpacerItem *mdemSpacer;
std::vector<ErrorView*> errorPool;
std::vector<ErrorView*> errorViews;
// Editor
Mdem* editMdem;
// Pagination
int currentPage = -1;
std::vector<Page> pages;
@@ -111,6 +115,7 @@ QToolButton* nextButton;
QLabel* paginationLabel;
// Mdem actions
QToolButton *add;
QToolButton *save;
QToolButton *load;
QToolButton *practice;
@@ -220,6 +225,13 @@ Mdem* makeMdem() {
mdem->hFront.addStretch(1);
mdem->editButton.setText("Edit");
QObject::connect(
&mdem->editButton,
&QToolButton::clicked,
[mdem](bool checked) {
editMdem = mdem;
}
);
mdem->hFront.addWidget(&mdem->editButton);
QObject::connect(&mdem->editButton, &QToolButton::clicked, [mdem]() {
@@ -271,29 +283,9 @@ Mdem* makeMdem() {
return mdem;
}
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];
if (MultiElementQuestion* mw = dynamic_cast<MultiElementQuestion*>(questions[i])) {
mdems[i]->wFrontText.setText(
void setupMdem(Mdem *mdem, Question *question) {
if (MultiElementQuestion* mw = dynamic_cast<MultiElementQuestion*>(question)) {
mdem->wFrontText.setText(
QString::fromStdString(mw->QuestionText)
);
auto choices = mw->Choices;
@@ -314,18 +306,18 @@ void CreateMdems(std::vector<Question*>& questions) {
answer = std::format("- {}", answer);
break;
}
if (k < mdems[i]->backLabels.size()) {
mdems[i]->backLabels[k]->setText(QString::fromStdString(answer));
if (k < mdem->backLabels.size()) {
mdem->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);
mdem->backLabels.push_back(label);
mdem->wBack.layout()->addWidget(label);
}
}
mdems[i]->labelCount = choices.size();
} else if (GroupQuestion* mw = dynamic_cast<GroupQuestion*>(questions[i])) {
mdems[i]->wFrontText.setText(
mdem->labelCount = choices.size();
} else if (GroupQuestion* mw = dynamic_cast<GroupQuestion*>(question)) {
mdem->wFrontText.setText(
QString::fromStdString(mw->QuestionText)
);
auto groups = mw->Groups;
@@ -338,17 +330,40 @@ void CreateMdems(std::vector<Question*>& questions) {
}
}
for (size_t k = 0; k < elements.size(); ++k) {
if (k < mdems[i]->backLabels.size()) {
mdems[i]->backLabels[k]->setText(QString::fromStdString(elements[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]));
mdems[i]->backLabels.push_back(label);
mdems[i]->wBack.layout()->addWidget(label);
mdem->backLabels.push_back(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()) {
mdems[i]->wMdem.show();
}
@@ -582,6 +597,33 @@ void pickDirectory(QString directory) {
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[]) {
QApplication app(argc, argv);
@@ -627,6 +669,11 @@ int main(int argc, char *argv[]) {
auto save = new QToolButton;
editorButtons->setLayout(buttonLayout);
save->setText(QString::fromStdString("Save"));
QObject::connect(
save,
&QToolButton::clicked,
setupEditorSave
);
buttonLayout->addWidget(save);
vlEditor->addWidget(editor);
@@ -694,13 +741,18 @@ int main(int argc, char *argv[]) {
hTop->addWidget(deckListLabel);
hTop->addStretch(1);
add = new QToolButton;
save = new QToolButton;
load = new QToolButton;
practice = new QToolButton;
hTop->addWidget(add);
hTop->addWidget(save);
hTop->addWidget(load);
hTop->addWidget(practice);
QObject::connect(add, &QToolButton::clicked, []() {
// MARK1
});
// Buttons
save->setText("Save");