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 <fstream>
#include <iostream>
#include <locale>
#include <qabstractbutton.h>
#include <qboxlayout.h>
#include <qlabel.h>
@@ -50,98 +49,97 @@ struct Page {
int end;
};
class Mdem {
public:
QWidget *wMdem;
QLabel *wFrontText;
QWidget *wBack;
QVector<QLabel*> backLabels;
QToolButton *showButton;
int labelCount;
void showBacklabels() {
for (int i = 0; i < backLabels.size(); ++i) {
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();
});
}
struct Mdem {
QWidget wMdem;
QVBoxLayout vMdem;
QLabel wFrontText;
QWidget wFront;
QHBoxLayout hFront;
QWidget wBack;
QVBoxLayout hBack;
QVector<QLabel*> backLabels;
QToolButton showButton;
int labelCount;
};
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";
std::string currentPath = "";
QList<Mdem*> mdems = QList<Mdem*>();
@@ -168,24 +166,24 @@ void CreateMdems(std::vector<Question*>& questions) {
hMdemScroll->removeItem(mdemSpacer);
for (Mdem *mdem : mdems) {
if (mdem->wMdem->isVisible()) {
mdem->wMdem->hide();
if (mdem->wMdem.isVisible()) {
mdem->wMdem.hide();
}
}
if (questions.size() > mdems.size()) {
auto amount = questions.size() - mdems.size();
for (size_t i = 0; i < amount; ++i) {
auto mdem = new Mdem();
auto mdem = makeMdem();
mdems.append(mdem);
hMdemScroll->addWidget(mdem->wMdem);
hMdemScroll->addWidget(&mdem->wMdem);
}
}
for (size_t i = 0; i < questions.size(); ++i) {
if (MultiElementQuestion* mw = dynamic_cast<MultiElementQuestion*>(questions[i])) {
mdems[i]->wFrontText->setText(
mdems[i]->wFrontText.setText(
QString::fromStdString(mw->QuestionText)
);
auto choices = mw->Choices;
@@ -212,12 +210,12 @@ void CreateMdems(std::vector<Question*>& questions) {
auto label = new QLabel();
label->setText(QString::fromStdString(answer));
mdems[i]->backLabels.push_back(label);
mdems[i]->wBack->layout()->addWidget(label);
mdems[i]->wBack.layout()->addWidget(label);
}
}
mdems[i]->labelCount = choices.size();
} else if (GroupQuestion* mw = dynamic_cast<GroupQuestion*>(questions[i])) {
mdems[i]->wFrontText->setText(
mdems[i]->wFrontText.setText(
QString::fromStdString(mw->QuestionText)
);
auto groups = mw->Groups;
@@ -236,13 +234,13 @@ void CreateMdems(std::vector<Question*>& questions) {
auto label = new QLabel();
label->setText(QString::fromStdString(elements[k]));
mdems[i]->backLabels.push_back(label);
mdems[i]->wBack->layout()->addWidget(label);
mdems[i]->wBack.layout()->addWidget(label);
}
}
mdems[i]->labelCount = elements.size();
}
if (!mdems[i]->wMdem->isVisible()) {
mdems[i]->wMdem->show();
if (!mdems[i]->wMdem.isVisible()) {
mdems[i]->wMdem.show();
}
}
@@ -281,9 +279,9 @@ void SwitchPage(int pageIdx) {
// Hide widgets in mdems
for (auto& mdem : mdems) {
if (mdem->wBack->isVisible()) {
mdem->wBack->hide();
mdem->showButton->setText("Show");
if (mdem->wBack.isVisible()) {
mdem->wBack.hide();
mdem->showButton.setText("Show");
}
}
@@ -359,6 +357,7 @@ ErrorView *makeErrorView() {
"}"
);
errorView->layout.addWidget(&errorView->label);
errorView->label.setWordWrap(true);
return errorView;
};
@@ -445,8 +444,8 @@ void loadMdem() {
hMdemScroll->addItem(mdemSpacer);
for (auto mdem: mdems) {
if (mdem->wMdem->isVisible()) {
mdem->wMdem->hide();
if (mdem->wMdem.isVisible()) {
mdem->wMdem.hide();
}
}
}