procedural mdem creation

This commit is contained in:
jorenchik
2024-10-06 12:21:22 +03:00
parent a53eb59900
commit 505d0006dd

View File

@@ -2,7 +2,6 @@
#include <format> #include <format>
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <locale>
#include <qabstractbutton.h> #include <qabstractbutton.h>
#include <qboxlayout.h> #include <qboxlayout.h>
#include <qlabel.h> #include <qlabel.h>
@@ -50,98 +49,97 @@ struct Page {
int end; int end;
}; };
class Mdem { struct Mdem {
public: QWidget wMdem;
QWidget *wMdem; QVBoxLayout vMdem;
QLabel *wFrontText; QLabel wFrontText;
QWidget *wBack; QWidget wFront;
QVector<QLabel*> backLabels; QHBoxLayout hFront;
QToolButton *showButton; QWidget wBack;
int labelCount; QVBoxLayout hBack;
QVector<QLabel*> backLabels;
void showBacklabels() { QToolButton showButton;
for (int i = 0; i < backLabels.size(); ++i) { int labelCount;
if (i < labelCount) {
if (!backLabels[i]->isVisible()) {
backLabels[i]->show();
}
} else {
if (backLabels[i]->isVisible()) {
backLabels[i]->hide();
}
}
}
}
Mdem() {
wMdem = new QWidget();
QVBoxLayout *vMdem = new QVBoxLayout();
wMdem->setLayout(vMdem);
QString id = QString("mdem_%1").arg(1);
wMdem->setObjectName(id);
// Front
QWidget *wFront = new QWidget();
QHBoxLayout *hFront = new QHBoxLayout();
wFront->setMinimumHeight(60);
wFront->setLayout(hFront);
wFront->setProperty("first", "true");
wMdem->setStyleSheet(QString(
"QWidget#%1 > QWidget {"
"border-right: 1px solid gray;"
"border-bottom: 1px solid gray;"
"border-left: 1px solid gray;"
"} "
"QWidget#%1 > QWidget[first=\"true\"] {"
"border-top: 1px solid gray;"
"}"
).arg(id));
// Add Front Content
wFrontText = new QLabel();
hFront->addWidget(wFrontText);
hFront->addStretch(1);
showButton = new QToolButton();
showButton->setText("Show");
hFront->addWidget(showButton);
// Back
wBack = new QWidget();
QVBoxLayout *hBack = new QVBoxLayout();
wBack->setLayout(hBack);
vMdem->addWidget(wBack);
// Add Back Content
for (int i = 0; i < 20; ++i) {
QLabel *elBackText = new QLabel();
hBack->addWidget(elBackText);
backLabels.append(elBackText);
}
vMdem->addWidget(wFront);
vMdem->addWidget(wBack);
vMdem->setContentsMargins(0, 0, 0, 0);
vMdem->setSpacing(0);
wBack->hide();
wMdem->hide();
// Connect button to toggle view
QObject::connect(showButton, &QToolButton::clicked, [this]() {
if (wBack->isVisible()) {
wBack->hide();
showButton->setText("Show");
} else {
wBack->show();
showButton->setText("Hide");
}
showBacklabels();
});
}
}; };
void showBacklabels(Mdem *mdem) {
for (int i = 0; i < mdem->backLabels.size(); ++i) {
if (i < mdem->labelCount) {
if (!mdem->backLabels[i]->isVisible()) {
mdem->backLabels[i]->show();
}
} else {
if (mdem->backLabels[i]->isVisible()) {
mdem->backLabels[i]->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;"
"} "
"QWidget#%1 > QWidget[first=\"true\"] {"
"border-top: 1px solid gray;"
"}"
).arg(id));
// Add Front Content
mdem->hFront.addWidget(&mdem->wFrontText);
mdem->hFront.addStretch(1);
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;
}
QString workingPath = "/home/jorenchik/Code/mdemory/memorybase"; QString workingPath = "/home/jorenchik/Code/mdemory/memorybase";
std::string currentPath = ""; std::string currentPath = "";
QList<Mdem*> mdems = QList<Mdem*>(); QList<Mdem*> mdems = QList<Mdem*>();
@@ -168,24 +166,24 @@ void CreateMdems(std::vector<Question*>& questions) {
hMdemScroll->removeItem(mdemSpacer); hMdemScroll->removeItem(mdemSpacer);
for (Mdem *mdem : mdems) { for (Mdem *mdem : mdems) {
if (mdem->wMdem->isVisible()) { if (mdem->wMdem.isVisible()) {
mdem->wMdem->hide(); mdem->wMdem.hide();
} }
} }
if (questions.size() > mdems.size()) { if (questions.size() > mdems.size()) {
auto amount = questions.size() - mdems.size(); auto amount = questions.size() - mdems.size();
for (size_t i = 0; i < amount; ++i) { for (size_t i = 0; i < amount; ++i) {
auto mdem = new Mdem(); auto mdem = makeMdem();
mdems.append(mdem); mdems.append(mdem);
hMdemScroll->addWidget(mdem->wMdem); hMdemScroll->addWidget(&mdem->wMdem);
} }
} }
for (size_t i = 0; i < questions.size(); ++i) { for (size_t i = 0; i < questions.size(); ++i) {
if (MultiElementQuestion* mw = dynamic_cast<MultiElementQuestion*>(questions[i])) { if (MultiElementQuestion* mw = dynamic_cast<MultiElementQuestion*>(questions[i])) {
mdems[i]->wFrontText->setText( mdems[i]->wFrontText.setText(
QString::fromStdString(mw->QuestionText) QString::fromStdString(mw->QuestionText)
); );
auto choices = mw->Choices; auto choices = mw->Choices;
@@ -212,12 +210,12 @@ void CreateMdems(std::vector<Question*>& questions) {
auto label = new QLabel(); auto label = new QLabel();
label->setText(QString::fromStdString(answer)); label->setText(QString::fromStdString(answer));
mdems[i]->backLabels.push_back(label); mdems[i]->backLabels.push_back(label);
mdems[i]->wBack->layout()->addWidget(label); mdems[i]->wBack.layout()->addWidget(label);
} }
} }
mdems[i]->labelCount = choices.size(); mdems[i]->labelCount = choices.size();
} else if (GroupQuestion* mw = dynamic_cast<GroupQuestion*>(questions[i])) { } else if (GroupQuestion* mw = dynamic_cast<GroupQuestion*>(questions[i])) {
mdems[i]->wFrontText->setText( mdems[i]->wFrontText.setText(
QString::fromStdString(mw->QuestionText) QString::fromStdString(mw->QuestionText)
); );
auto groups = mw->Groups; auto groups = mw->Groups;
@@ -236,13 +234,13 @@ void CreateMdems(std::vector<Question*>& questions) {
auto label = new QLabel(); auto label = new QLabel();
label->setText(QString::fromStdString(elements[k])); label->setText(QString::fromStdString(elements[k]));
mdems[i]->backLabels.push_back(label); mdems[i]->backLabels.push_back(label);
mdems[i]->wBack->layout()->addWidget(label); mdems[i]->wBack.layout()->addWidget(label);
} }
} }
mdems[i]->labelCount = elements.size(); mdems[i]->labelCount = elements.size();
} }
if (!mdems[i]->wMdem->isVisible()) { if (!mdems[i]->wMdem.isVisible()) {
mdems[i]->wMdem->show(); mdems[i]->wMdem.show();
} }
} }
@@ -281,9 +279,9 @@ void SwitchPage(int pageIdx) {
// Hide widgets in mdems // Hide widgets in mdems
for (auto& mdem : mdems) { for (auto& mdem : mdems) {
if (mdem->wBack->isVisible()) { if (mdem->wBack.isVisible()) {
mdem->wBack->hide(); mdem->wBack.hide();
mdem->showButton->setText("Show"); mdem->showButton.setText("Show");
} }
} }
@@ -359,6 +357,7 @@ ErrorView *makeErrorView() {
"}" "}"
); );
errorView->layout.addWidget(&errorView->label); errorView->layout.addWidget(&errorView->label);
errorView->label.setWordWrap(true);
return errorView; return errorView;
}; };
@@ -445,8 +444,8 @@ void loadMdem() {
hMdemScroll->addItem(mdemSpacer); hMdemScroll->addItem(mdemSpacer);
for (auto mdem: mdems) { for (auto mdem: mdems) {
if (mdem->wMdem->isVisible()) { if (mdem->wMdem.isVisible()) {
mdem->wMdem->hide(); mdem->wMdem.hide();
} }
} }
} }