mirror of
https://github.com/jorenchik/mdemory.git
synced 2026-03-22 00:26:21 +00:00
group question scrollable layout + refactoring of train window
This commit is contained in:
@@ -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(
|
||||||
@@ -281,50 +296,33 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user