From c099c3c0f1ce32567a5cb8652dea180b4306cff2 Mon Sep 17 00:00:00 2001 From: jorenchik Date: Thu, 17 Oct 2024 20:06:49 +0300 Subject: [PATCH] Add and delete questions --- src/qtapp/main.cpp | 297 +++++++++++++++++++++++++++------------------ 1 file changed, 177 insertions(+), 120 deletions(-) diff --git a/src/qtapp/main.cpp b/src/qtapp/main.cpp index caadb04..4fc281a 100644 --- a/src/qtapp/main.cpp +++ b/src/qtapp/main.cpp @@ -66,6 +66,7 @@ struct Mdem { QWidget wBack; QVBoxLayout hBack; QToolButton editButton; + QToolButton deleteButton; QToolButton showButton; int labelCount; QVector backLabels; @@ -197,90 +198,17 @@ std::string outputMdem(std::vector questions) { return ss.str(); } -Mdem* makeMdem() { - auto mdem = new Mdem; - mdem->wMdem.setLayout(&mdem->vMdem); - - QString id = QString("mdem_%1").arg(1); - mdem->wMdem.setObjectName(id); - - // Front - mdem->wFront.setMinimumHeight(60); - mdem->wFront.setLayout(&mdem->hFront); - mdem->wFront.setProperty("first", "true"); - mdem->wMdem.setStyleSheet(QString( - "QWidget#%1 > QWidget {" - "border-right: 1px solid gray;" - "border-bottom: 1px solid gray;" - "border-left: 1px solid gray;" - "background: %2;" - "} " - "QWidget#%1 > QWidget[first=\"true\"] {" - "border-top: 1px solid gray;" - "}" - ).arg(id, MDEM_BACKGROUND)); - - // Add Front Content - mdem->hFront.addWidget(&mdem->wFrontText); - 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]() { - if (mdem->question) { - editor->setText( - QString::fromStdString( - outputMdem(std::vector{mdem->question}) - ) - ); - editorWindow->show(); - } - }); - - mdem->showButton.setText("Show"); - mdem->hFront.addWidget(&mdem->showButton); - - // Back - QVBoxLayout *hBack = new QVBoxLayout(); - mdem->wBack.setLayout(&mdem->hBack); - mdem->vMdem.addWidget(&mdem->wBack); - - // Add Back Content - for (int i = 0; i < 20; ++i) { - // @Fix: back label pooling - QLabel *elBackText = new QLabel(); - mdem->hBack.addWidget(elBackText); - mdem->backLabels.append(elBackText); - } - - mdem->vMdem.addWidget(&mdem->wFront); - mdem->vMdem.addWidget(&mdem->wBack); - mdem->vMdem.setContentsMargins(0, 0, 0, 0); - mdem->vMdem.setSpacing(0); - - mdem->wBack.hide(); - mdem->wMdem.hide(); - - // Connect button to toggle view - QObject::connect(&mdem->showButton, &QToolButton::clicked, [mdem]() { - if (mdem->wBack.isVisible()) { - mdem->wBack.hide(); - mdem->showButton.setText("Show"); - } else { - mdem->wBack.show(); - mdem->showButton.setText("Hide"); - } - showBacklabels(mdem); - }); - return mdem; +void makePages() { + pages.clear(); + auto len = questions.size(); + for (int i = 0; i < (len / PER_PAGE) + 1; i++) { + auto startingIndex = PER_PAGE * i ; + auto amount = PER_PAGE; + if (i == questions.size() / PER_PAGE) { + amount = questions.size() % PER_PAGE; + } + pages.push_back(Page{startingIndex, startingIndex + amount}); + } } void setupMdem(Mdem *mdem, Question *question) { @@ -343,6 +271,121 @@ void setupMdem(Mdem *mdem, Question *question) { } } +void SwitchPage(int pageIdx); + +void deleteMdem(Mdem* mdem) { + if (mdem->question) { + Question* deleted = nullptr; + for (int i = 0; i < questions.size(); ++i) { + if (questions[i] == mdem->question) { + questions.erase(questions.begin() + i); + delete mdem->question; + mdem->question = nullptr; + break; + } + } + makePages(); + SwitchPage(0); + } + if (editMdem == mdem) { + editorWindow->hide(); + } +} + +Mdem* makeMdem() { + auto mdem = new Mdem; + mdem->wMdem.setLayout(&mdem->vMdem); + + QString id = QString("mdem_%1").arg(1); + mdem->wMdem.setObjectName(id); + + // Front + mdem->wFront.setMinimumHeight(60); + mdem->wFront.setLayout(&mdem->hFront); + mdem->wFront.setProperty("first", "true"); + mdem->wMdem.setStyleSheet(QString( + "QWidget#%1 > QWidget {" + "border-right: 1px solid gray;" + "border-bottom: 1px solid gray;" + "border-left: 1px solid gray;" + "background: %2;" + "} " + "QWidget#%1 > QWidget[first=\"true\"] {" + "border-top: 1px solid gray;" + "}" + ).arg(id, MDEM_BACKGROUND)); + + // Add Front Content + mdem->hFront.addWidget(&mdem->wFrontText); + mdem->hFront.addStretch(1); + + mdem->editButton.setText("Edit"); + QObject::connect( + &mdem->editButton, + &QToolButton::clicked, + [mdem](bool checked) { + editMdem = mdem; + if (mdem->question) { + editor->setText( + QString::fromStdString( + outputMdem(std::vector{mdem->question}) + ) + ); + editorWindow->show(); + } + } + ); + mdem->hFront.addWidget(&mdem->editButton); + + mdem->deleteButton.setText("Delete"); + QObject::connect( + &mdem->deleteButton, + &QToolButton::clicked, + [mdem](bool checked) { + deleteMdem(mdem); + } + ); + mdem->hFront.addWidget(&mdem->deleteButton); + + mdem->showButton.setText("Show"); + mdem->hFront.addWidget(&mdem->showButton); + + // Back + QVBoxLayout *hBack = new QVBoxLayout(); + mdem->wBack.setLayout(&mdem->hBack); + mdem->vMdem.addWidget(&mdem->wBack); + + // Add Back Content + for (int i = 0; i < 20; ++i) { + // @Fix: back label pooling + QLabel *elBackText = new QLabel(); + mdem->hBack.addWidget(elBackText); + mdem->backLabels.append(elBackText); + } + + mdem->vMdem.addWidget(&mdem->wFront); + mdem->vMdem.addWidget(&mdem->wBack); + mdem->vMdem.setContentsMargins(0, 0, 0, 0); + mdem->vMdem.setSpacing(0); + + mdem->wBack.hide(); + mdem->wMdem.hide(); + + // Connect button to toggle view + QObject::connect(&mdem->showButton, &QToolButton::clicked, [mdem]() { + if (mdem->wBack.isVisible()) { + mdem->wBack.hide(); + mdem->showButton.setText("Show"); + } else { + mdem->wBack.show(); + mdem->showButton.setText("Hide"); + } + showBacklabels(mdem); + }); + return mdem; +} + + void CreateMdems(std::vector& questions) { hMdemScroll->removeItem(mdemSpacer); @@ -372,18 +415,7 @@ void CreateMdems(std::vector& questions) { hMdemScroll->addItem(mdemSpacer); } -void makePages() { - pages.clear(); - auto len = questions.size(); - for (int i = 0; i < (len / PER_PAGE) + 1; i++) { - auto startingIndex = PER_PAGE * i ; - auto amount = PER_PAGE; - if (i == questions.size() / PER_PAGE) { - amount = questions.size() % PER_PAGE; - } - pages.push_back(Page{startingIndex, startingIndex + amount}); - } -} + void SwitchPage(int pageIdx) { currentPage = pageIdx; @@ -455,6 +487,7 @@ void SwitchPage(int pageIdx) { CreateMdems(pageSlice); } + ErrorView *makeErrorView() { auto errorView = new ErrorView; errorView->box.setObjectName("error-box"); @@ -606,21 +639,39 @@ void setupEditorSave(bool checked) { 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); + if (editMdem) { + 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." + ); + } } else { - QMessageBox::information( - nullptr, - "Editing error", - "There are more than question in your input. Please enter one." - ); + if (res.value.questions.size() <= 0) { + QMessageBox::information( + nullptr, + "Editing error", + "There are no questions in your input." + ); + } else { + questions.insert( + questions.begin(), + res.value.questions.begin(), + res.value.questions.end() + ); + makePages(); + SwitchPage(0); + } } } }; @@ -755,15 +806,30 @@ int main(int argc, char *argv[]) { }); // Buttons + add->setText("Add"); save->setText("Save"); load->setText("Load"); practice->setText("Practice"); + + QObject::connect(add, &QToolButton::clicked, []() { + editMdem = nullptr; + editorWindow->show(); + }); + QObject::connect(load, &QToolButton::clicked, &reloadMdem); QObject::connect(save, &QToolButton::clicked, []() { auto filename = getFilename(currentMdem); std::ofstream out("generated.mdem"); out << outputMdem(questions);; }); - QObject::connect(load, &QToolButton::clicked, &reloadMdem); + QObject::connect( + practice, + &QToolButton::clicked, + [](bool checked) { + trainWindow->show(); + trainWindow->resize(600, 300); + setQuestions(questions); + } + ); // Mdems QScrollArea *mdemScroll = new QScrollArea(); @@ -846,15 +912,6 @@ int main(int argc, char *argv[]) { rightLayout->addWidget(pagination); initTrainWindow(); - QObject::connect( - practice, - &QToolButton::clicked, - [](bool checked) { - trainWindow->show(); - trainWindow->resize(600, 300); - setQuestions(questions); - } - ); window.setCentralWidget(hSplitter); window.show();