mirror of
https://github.com/jorenchik/mdemory.git
synced 2026-03-22 00:26:21 +00:00
Add and delete questions
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user