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;
QVBoxLayout hBack;
QToolButton editButton;
QToolButton deleteButton;
QToolButton showButton;
int labelCount;
QVector<QLabel*> backLabels;
@@ -197,90 +198,17 @@ std::string outputMdem(std::vector<Question*> 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<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 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<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) {
hMdemScroll->removeItem(mdemSpacer);
@@ -372,18 +415,7 @@ void CreateMdems(std::vector<Question*>& 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();