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 <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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user