Add and delete questions

This commit is contained in:
jorenchik
2024-10-17 20:06:49 +03:00
parent 1f5a20ff1a
commit c099c3c0f1

View File

@@ -66,6 +66,7 @@ struct Mdem {
QWidget wBack; QWidget wBack;
QVBoxLayout hBack; QVBoxLayout hBack;
QToolButton editButton; QToolButton editButton;
QToolButton deleteButton;
QToolButton showButton; QToolButton showButton;
int labelCount; int labelCount;
QVector<QLabel*> backLabels; QVector<QLabel*> backLabels;
@@ -197,90 +198,17 @@ std::string outputMdem(std::vector<Question*> questions) {
return ss.str(); return ss.str();
} }
Mdem* makeMdem() { void makePages() {
auto mdem = new Mdem; pages.clear();
mdem->wMdem.setLayout(&mdem->vMdem); auto len = questions.size();
for (int i = 0; i < (len / PER_PAGE) + 1; i++) {
QString id = QString("mdem_%1").arg(1); auto startingIndex = PER_PAGE * i ;
mdem->wMdem.setObjectName(id); auto amount = PER_PAGE;
if (i == questions.size() / PER_PAGE) {
// Front amount = questions.size() % PER_PAGE;
mdem->wFront.setMinimumHeight(60); }
mdem->wFront.setLayout(&mdem->hFront); pages.push_back(Page{startingIndex, startingIndex + amount});
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<Question*>{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 setupMdem(Mdem *mdem, Question *question) { 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<Question*>{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<Question*>& questions) { void CreateMdems(std::vector<Question*>& questions) {
hMdemScroll->removeItem(mdemSpacer); hMdemScroll->removeItem(mdemSpacer);
@@ -372,18 +415,7 @@ void CreateMdems(std::vector<Question*>& questions) {
hMdemScroll->addItem(mdemSpacer); 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) { void SwitchPage(int pageIdx) {
currentPage = pageIdx; currentPage = pageIdx;
@@ -455,6 +487,7 @@ void SwitchPage(int pageIdx) {
CreateMdems(pageSlice); CreateMdems(pageSlice);
} }
ErrorView *makeErrorView() { ErrorView *makeErrorView() {
auto errorView = new ErrorView; auto errorView = new ErrorView;
errorView->box.setObjectName("error-box"); errorView->box.setObjectName("error-box");
@@ -606,21 +639,39 @@ void setupEditorSave(bool checked) {
QString::fromStdString(res.error) QString::fromStdString(res.error)
); );
} else { } else {
if (res.value.questions.size() <= 0) { if (editMdem) {
QMessageBox::information( if (res.value.questions.size() <= 0) {
nullptr, QMessageBox::information(
"Editing error", nullptr,
"There are no questions in your input." "Editing error",
); "There are no questions in your input."
} else if (res.value.questions.size() == 1) { );
setupMdem(editMdem, res.value.questions[0]); } else if (res.value.questions.size() == 1) {
showBacklabels(editMdem); 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 { } else {
QMessageBox::information( if (res.value.questions.size() <= 0) {
nullptr, QMessageBox::information(
"Editing error", nullptr,
"There are more than question in your input. Please enter one." "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 // Buttons
add->setText("Add");
save->setText("Save"); save->setText("Save");
load->setText("Load"); load->setText("Load");
practice->setText("Practice"); practice->setText("Practice");
QObject::connect(add, &QToolButton::clicked, []() {
editMdem = nullptr;
editorWindow->show();
});
QObject::connect(load, &QToolButton::clicked, &reloadMdem);
QObject::connect(save, &QToolButton::clicked, []() { QObject::connect(save, &QToolButton::clicked, []() {
auto filename = getFilename(currentMdem); auto filename = getFilename(currentMdem);
std::ofstream out("generated.mdem"); std::ofstream out("generated.mdem");
out << outputMdem(questions);; 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 // Mdems
QScrollArea *mdemScroll = new QScrollArea(); QScrollArea *mdemScroll = new QScrollArea();
@@ -846,15 +912,6 @@ int main(int argc, char *argv[]) {
rightLayout->addWidget(pagination); rightLayout->addWidget(pagination);
initTrainWindow(); initTrainWindow();
QObject::connect(
practice,
&QToolButton::clicked,
[](bool checked) {
trainWindow->show();
trainWindow->resize(600, 300);
setQuestions(questions);
}
);
window.setCentralWidget(hSplitter); window.setCentralWidget(hSplitter);
window.show(); window.show();