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 <qwidget.h>
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QDropEvent> #include <QDropEvent>
#include <iostream>
#include <QDrag> #include <QDrag>
#include <iostream>
#include "trainWindow.h" #include "trainWindow.h"
#include "parser.h" #include "parser.h"
QWidget *wMaster; const auto listStyle =
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 =
"QListView {" "QListView {"
" background-color: white;" " background-color: white;"
" border: 0px solid black;" " border: 0px solid black;"
@@ -77,12 +44,32 @@ auto listStyle =
" background-color: lightyellow;" " 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 class OrderListView : public QListView
{ {
Q_OBJECT Q_OBJECT
public: 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: protected:
void dropEvent(QDropEvent *event) override void dropEvent(QDropEvent *event) override
@@ -115,6 +102,8 @@ public:
setAcceptDrops(true); setAcceptDrops(true);
setDragDropMode(QAbstractItemView::DragDrop); setDragDropMode(QAbstractItemView::DragDrop);
setDefaultDropAction(Qt::MoveAction); setDefaultDropAction(Qt::MoveAction);
setEditTriggers(QAbstractItemView::NoEditTriggers);
setFocusPolicy(Qt::NoFocus);
} }
protected: protected:
@@ -140,10 +129,46 @@ protected:
} }
}; };
#include "trainWindow.moc" #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) { QStandardItem *makeItem(std::string content, bool isCheckable) {
auto *item = new QStandardItem(); auto *item = new QStandardItem();
@@ -167,8 +192,8 @@ void initTrainWindow() {
trainWidget->setObjectName("answer-question-widget"); trainWidget->setObjectName("answer-question-widget");
{ // Make the question box. { // Make the question box.
vQuestionBox = new QVBoxLayout();
questionBox = new QWidget(); questionBox = new QWidget();
vQuestionBox = new QVBoxLayout();
questionBox->setLayout(vQuestionBox); questionBox->setLayout(vQuestionBox);
questionBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); questionBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
vQuestionBox->setAlignment(Qt::AlignCenter); vQuestionBox->setAlignment(Qt::AlignCenter);
@@ -190,15 +215,11 @@ void initTrainWindow() {
{ // Make multi-choice list. { // Make multi-choice list.
multiChoiceModel = new QStandardItemModel(); multiChoiceModel = new QStandardItemModel();
listView = new QListView(); multiChoiceList = new MultiChoiceListView();
listView->setModel(multiChoiceModel); multiChoiceList->setModel(multiChoiceModel);
multiChoiceList->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
listView->setStyleSheet(listStyle); questionBox->layout()->addWidget(multiChoiceList);
listView->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); multiChoiceList->hide();
listView->setEditTriggers(QAbstractItemView::NoEditTriggers);
listView->setFocusPolicy(Qt::NoFocus);
questionBox->layout()->addWidget(listView);
listView->hide();
} }
{ // Make answer text. { // Make answer text.
@@ -211,7 +232,6 @@ void initTrainWindow() {
"}" "}"
)); ));
answerText->setTextInteractionFlags(Qt::TextSelectableByMouse); answerText->setTextInteractionFlags(Qt::TextSelectableByMouse);
vQuestionBox->addWidget(answerText); vQuestionBox->addWidget(answerText);
answerText->hide(); answerText->hide();
} }
@@ -220,12 +240,7 @@ void initTrainWindow() {
orderModel = new QStandardItemModel(); orderModel = new QStandardItemModel();
orderList = new OrderListView(); orderList = new OrderListView();
orderList->setModel(orderModel); orderList->setModel(orderModel);
orderList->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); 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 // Connect to handle the drop event properly
QObject::connect( QObject::connect(
@@ -280,51 +295,34 @@ void initTrainWindow() {
); );
auto hGroupQuestion = new QHBoxLayout(); auto hGroupQuestion = new QHBoxLayout();
wGroupQuestion->setLayout(hGroupQuestion); wGroupQuestion->setLayout(hGroupQuestion);
// Items on the left. // Items on the left.
auto itemScroll = new QScrollArea(); auto itemScroll = new QScrollArea();
auto vItems = new QVBoxLayout(); auto vItems = new QVBoxLayout();
itemScroll->setLayout(vItems); itemScroll->setLayout(vItems);
itemModel = new QStandardItemModel(); itemModel = new QStandardItemModel();
itemListView = new MoveListView(); groupItemList = new MoveListView();
itemListView->setModel(itemModel); groupItemList->setModel(itemModel);
vItems->addWidget(itemListView); vItems->addWidget(groupItemList);
hGroupQuestion->addWidget(itemScroll); hGroupQuestion->addWidget(itemScroll);
// Items on the right. // Items on the right.
auto wGroupBox = new QWidget(); auto groupScroll = new QScrollArea();
auto vGroupBox = new QVBoxLayout(); auto wGroupContainer = new QWidget();
auto wGroups = new QScrollArea(); vGroups = new QVBoxLayout();
auto vGroups = new QVBoxLayout(); groupScroll->setWidget(wGroupContainer);
auto groupSpacer = new QSpacerItem(50, 50, QSizePolicy::Minimum, QSizePolicy::Expanding); groupScroll->setWidgetResizable(true);
wGroupContainer->setLayout(vGroups);
hGroupQuestion->addWidget(groupScroll);
wGroupBox->setLayout(vGroupBox); wGroupQuestion->setStyleSheet("padding: 0; margin: 0;");
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->hide(); wGroupQuestion->hide();
questionBox->layout()->addWidget(wGroupQuestion); questionBox->layout()->addWidget(wGroupQuestion);
} }
vTrainWidget->addWidget(questionBox); vTrainWidget->addWidget(questionBox);
vTrainWidget->addWidget(actionButtons); vTrainWidget->addWidget(actionButtons);
vTrainWidget->addWidget(wMaster);
} }
std::vector<Question*> trainQuestions = std::vector<Question*>(); std::vector<Question*> trainQuestions = std::vector<Question*>();
@@ -334,7 +332,7 @@ void hideQuestionElements() {
lQuestionText->hide(); lQuestionText->hide();
answerText->hide(); answerText->hide();
orderList->hide(); orderList->hide();
listView->hide(); multiChoiceList->hide();
wGroupQuestion->hide(); wGroupQuestion->hide();
} }
@@ -405,7 +403,7 @@ void setupMultiChoiceQuestion(MultiElementQuestion *question) {
for (auto answerEl: question->Choices) { for (auto answerEl: question->Choices) {
multiChoiceModel->appendRow(makeItem(answerEl.Answer, true)); multiChoiceModel->appendRow(makeItem(answerEl.Answer, true));
} }
listView->show(); multiChoiceList->show();
auto showAnswer = [](bool checked) { auto showAnswer = [](bool checked) {
QObject::disconnect(btnTriggerAnswer, 0, 0, 0); QObject::disconnect(btnTriggerAnswer, 0, 0, 0);
@@ -419,19 +417,40 @@ void setupMultiChoiceQuestion(MultiElementQuestion *question) {
} }
void setupGroupQuestion(GroupQuestion *question) { void setupGroupQuestion(GroupQuestion *question) {
auto groupSpacer = new QSpacerItem(
50, 50,
QSizePolicy::Minimum,
QSizePolicy::Expanding
);
hideQuestionElements(); hideQuestionElements();
lQuestionText->setText( lQuestionText->setText(
QString::fromStdString(question->QuestionText) QString::fromStdString(question->QuestionText)
); );
lQuestionText->show(); lQuestionText->show();
wGroupQuestion->show(); wGroupQuestion->show();
for (auto group: question->Groups) { for (auto group: question->Groups) {
for (auto item: group.elements) { for (auto item: group.elements) {
itemModel->appendRow(makeItem(item, false)); 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) { auto showAnswer = [](bool checked) {
QObject::disconnect(btnTriggerAnswer, 0, 0, 0); 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])) { } else if (auto *question = dynamic_cast<GroupQuestion*>(trainQuestions[currentQuestionIndex])) {
setupGroupQuestion(question); setupGroupQuestion(question);
} }
} }