group question scrollable layout + refactoring of train window

This commit is contained in:
jorenchik
2024-10-05 10:17:31 +03:00
parent c2dc230e73
commit c0d54eb476

View File

@@ -18,46 +18,13 @@
#include <qwidget.h>
#include <QStandardItemModel>
#include <QDropEvent>
#include <iostream>
#include <QDrag>
#include <iostream>
#include "trainWindow.h"
#include "parser.h"
QWidget *wMaster;
QVBoxLayout *hMaster;
QWidget *questionBox;
QVBoxLayout *vQuestionBox;
QLabel *lQuestionText;
QLabel *answerText;
QVBoxLayout *vButtonBox;
QWidget *actionButtons;
QHBoxLayout *hButtons;
QToolButton *btnPrev;
QSpacerItem *leftSpacer;
QToolButton *btnTriggerAnswer;
QSpacerItem *rightSpacer;
QToolButton *btnNext;
QMainWindow *trainWindow;
QWidget *trainWidget;
QVBoxLayout *vTrainWidget;
std::default_random_engine rng;
QStandardItemModel *multiChoiceModel;
QListView *listView;
QStandardItemModel *itemModel;
QListView *itemListView;
QStandardItemModel *orderModel;
QWidget *wGroupQuestion;
auto listStyle =
const auto listStyle =
"QListView {"
" background-color: white;"
" border: 0px solid black;"
@@ -77,12 +44,32 @@ auto listStyle =
" background-color: lightyellow;"
"}";
class MultiChoiceListView : public QListView
{
Q_OBJECT
public:
explicit MultiChoiceListView(QWidget *parent = nullptr) : QListView(parent) {
setStyleSheet(listStyle);
setAcceptDrops(true);
setEditTriggers(QAbstractItemView::NoEditTriggers);
setFocusPolicy(Qt::NoFocus);
}
};
class OrderListView : public QListView
{
Q_OBJECT
public:
explicit OrderListView(QWidget *parent = nullptr) : QListView(parent) {}
explicit OrderListView(QWidget *parent = nullptr) : QListView(parent) {
setStyleSheet(listStyle);
setAcceptDrops(true);
setEditTriggers(QAbstractItemView::NoEditTriggers);
setFocusPolicy(Qt::NoFocus);
setDragDropMode(QAbstractItemView::InternalMove);
}
protected:
void dropEvent(QDropEvent *event) override
@@ -115,6 +102,8 @@ public:
setAcceptDrops(true);
setDragDropMode(QAbstractItemView::DragDrop);
setDefaultDropAction(Qt::MoveAction);
setEditTriggers(QAbstractItemView::NoEditTriggers);
setFocusPolicy(Qt::NoFocus);
}
protected:
@@ -140,10 +129,46 @@ protected:
}
};
#include "trainWindow.moc"
OrderListView *orderList;
// Main components
QMainWindow *trainWindow;
QWidget *trainWidget;
QVBoxLayout *vTrainWidget;
// Question
QWidget *questionBox;
QVBoxLayout *vQuestionBox;
QLabel *lQuestionText;
// Bottom buttons
QVBoxLayout *vButtonBox;
QWidget *actionButtons;
QHBoxLayout *hButtons;
QToolButton *btnPrev;
QSpacerItem *leftSpacer;
QToolButton *btnTriggerAnswer;
QSpacerItem *rightSpacer;
QToolButton *btnNext;
// Answer question
QLabel *answerText;
// Multi-choice question
QStandardItemModel *multiChoiceModel;
QListView *multiChoiceList;
// Order question
OrderListView *orderList;
QStandardItemModel *orderModel;
// Group question
QStandardItemModel *itemModel;
QListView *groupItemList;
QWidget *wGroupQuestion;
QVBoxLayout *vGroups;
std::default_random_engine rng;
QStandardItem *makeItem(std::string content, bool isCheckable) {
auto *item = new QStandardItem();
@@ -167,8 +192,8 @@ void initTrainWindow() {
trainWidget->setObjectName("answer-question-widget");
{ // Make the question box.
vQuestionBox = new QVBoxLayout();
questionBox = new QWidget();
vQuestionBox = new QVBoxLayout();
questionBox->setLayout(vQuestionBox);
questionBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
vQuestionBox->setAlignment(Qt::AlignCenter);
@@ -190,15 +215,11 @@ void initTrainWindow() {
{ // Make multi-choice list.
multiChoiceModel = new QStandardItemModel();
listView = new QListView();
listView->setModel(multiChoiceModel);
listView->setStyleSheet(listStyle);
listView->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
listView->setEditTriggers(QAbstractItemView::NoEditTriggers);
listView->setFocusPolicy(Qt::NoFocus);
questionBox->layout()->addWidget(listView);
listView->hide();
multiChoiceList = new MultiChoiceListView();
multiChoiceList->setModel(multiChoiceModel);
multiChoiceList->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
questionBox->layout()->addWidget(multiChoiceList);
multiChoiceList->hide();
}
{ // Make answer text.
@@ -211,7 +232,6 @@ void initTrainWindow() {
"}"
));
answerText->setTextInteractionFlags(Qt::TextSelectableByMouse);
vQuestionBox->addWidget(answerText);
answerText->hide();
}
@@ -220,12 +240,7 @@ void initTrainWindow() {
orderModel = new QStandardItemModel();
orderList = new OrderListView();
orderList->setModel(orderModel);
orderList->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
orderList->setEditTriggers(QAbstractItemView::NoEditTriggers);
orderList->setDragDropMode(QAbstractItemView::InternalMove);
orderList->setFocusPolicy(Qt::NoFocus);
orderList->setStyleSheet(listStyle);
// Connect to handle the drop event properly
QObject::connect(
@@ -281,50 +296,33 @@ void initTrainWindow() {
auto hGroupQuestion = new QHBoxLayout();
wGroupQuestion->setLayout(hGroupQuestion);
// Items on the left.
auto itemScroll = new QScrollArea();
auto vItems = new QVBoxLayout();
itemScroll->setLayout(vItems);
itemModel = new QStandardItemModel();
itemListView = new MoveListView();
itemListView->setModel(itemModel);
vItems->addWidget(itemListView);
groupItemList = new MoveListView();
groupItemList->setModel(itemModel);
vItems->addWidget(groupItemList);
hGroupQuestion->addWidget(itemScroll);
// Items on the right.
auto wGroupBox = new QWidget();
auto vGroupBox = new QVBoxLayout();
auto wGroups = new QScrollArea();
auto vGroups = new QVBoxLayout();
auto groupSpacer = new QSpacerItem(50, 50, QSizePolicy::Minimum, QSizePolicy::Expanding);
auto groupScroll = new QScrollArea();
auto wGroupContainer = new QWidget();
vGroups = new QVBoxLayout();
groupScroll->setWidget(wGroupContainer);
groupScroll->setWidgetResizable(true);
wGroupContainer->setLayout(vGroups);
hGroupQuestion->addWidget(groupScroll);
wGroupBox->setLayout(vGroupBox);
wGroups->setLayout(vGroups);
hGroupQuestion->addWidget(wGroupBox);
vGroupBox->addWidget(wGroups);
{
auto groupLabel = new QLabel("Group I");
auto scrollArea = new QScrollArea();
auto groupModel = new QStandardItemModel();
auto groupList = new MoveListView();
vGroups->addWidget(groupLabel);
vGroups->addWidget(groupList);
groupList->setModel(groupModel);
groupList->setMaximumHeight(100);
}
vGroups->addItem(groupSpacer);
std::cout << wGroupBox->geometry().height() << std::endl;
itemListView->setEditTriggers(QAbstractItemView::NoEditTriggers);
wGroupQuestion->setStyleSheet("padding: 0; margin: 0;");
wGroupQuestion->hide();
questionBox->layout()->addWidget(wGroupQuestion);
}
vTrainWidget->addWidget(questionBox);
vTrainWidget->addWidget(actionButtons);
vTrainWidget->addWidget(wMaster);
}
std::vector<Question*> trainQuestions = std::vector<Question*>();
@@ -334,7 +332,7 @@ void hideQuestionElements() {
lQuestionText->hide();
answerText->hide();
orderList->hide();
listView->hide();
multiChoiceList->hide();
wGroupQuestion->hide();
}
@@ -405,7 +403,7 @@ void setupMultiChoiceQuestion(MultiElementQuestion *question) {
for (auto answerEl: question->Choices) {
multiChoiceModel->appendRow(makeItem(answerEl.Answer, true));
}
listView->show();
multiChoiceList->show();
auto showAnswer = [](bool checked) {
QObject::disconnect(btnTriggerAnswer, 0, 0, 0);
@@ -419,19 +417,40 @@ void setupMultiChoiceQuestion(MultiElementQuestion *question) {
}
void setupGroupQuestion(GroupQuestion *question) {
auto groupSpacer = new QSpacerItem(
50, 50,
QSizePolicy::Minimum,
QSizePolicy::Expanding
);
hideQuestionElements();
lQuestionText->setText(
QString::fromStdString(question->QuestionText)
);
lQuestionText->show();
wGroupQuestion->show();
for (auto group: question->Groups) {
for (auto item: group.elements) {
itemModel->appendRow(makeItem(item, false));
}
}
auto makeAGroup = [](std::string groupName) {
auto groupLabel = new QLabel(QString::fromStdString(groupName));
auto scrollArea = new QScrollArea();
auto groupModel = new QStandardItemModel();
auto groupList = new MoveListView();
vGroups->addWidget(groupLabel);
vGroups->addWidget(groupList);
groupList->setModel(groupModel);
groupList->setMaximumHeight(100);
};
for (auto group: question->Groups) {
makeAGroup(group.name);
}
vGroups->addItem(groupSpacer);
auto showAnswer = [](bool checked) {
QObject::disconnect(btnTriggerAnswer, 0, 0, 0);
@@ -467,5 +486,4 @@ void setQuestions(std::vector<Question*> questions) {
} else if (auto *question = dynamic_cast<GroupQuestion*>(trainQuestions[currentQuestionIndex])) {
setupGroupQuestion(question);
}
}