From 1f5a20ff1a3c7b1bf8f7ae46f0f60599e40809e9 Mon Sep 17 00:00:00 2001 From: jorenchik Date: Mon, 14 Oct 2024 23:51:44 +0300 Subject: [PATCH] editing a question --- src/qtapp/main.cpp | 168 +++++++++++++++++++++++++++++---------------- 1 file changed, 110 insertions(+), 58 deletions(-) diff --git a/src/qtapp/main.cpp b/src/qtapp/main.cpp index 58e002e..caadb04 100644 --- a/src/qtapp/main.cpp +++ b/src/qtapp/main.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -100,6 +101,9 @@ QSpacerItem *mdemSpacer; std::vector errorPool; std::vector errorViews; +// Editor +Mdem* editMdem; + // Pagination int currentPage = -1; std::vector 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,6 +283,66 @@ Mdem* makeMdem() { return mdem; } +void setupMdem(Mdem *mdem, Question *question) { + if (MultiElementQuestion* mw = dynamic_cast(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(question)) { + mdem->wFrontText.setText( + QString::fromStdString(mw->QuestionText) + ); + auto groups = mw->Groups; + std::vector 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& questions) { hMdemScroll->removeItem(mdemSpacer); @@ -289,66 +361,9 @@ void CreateMdems(std::vector& questions) { } } - for (size_t i = 0; i < questions.size(); ++i) { mdems[i]->question = questions[i]; - if (MultiElementQuestion* mw = dynamic_cast(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(questions[i])) { - mdems[i]->wFrontText.setText( - QString::fromStdString(mw->QuestionText) - ); - auto groups = mw->Groups; - std::vector 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(); - } + 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");