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;
|
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();
|
||||||
|
|||||||
Reference in New Issue
Block a user