From c0d54eb4767903e592184378fe3f371577e342c7 Mon Sep 17 00:00:00 2001 From: jorenchik Date: Sat, 5 Oct 2024 10:17:31 +0300 Subject: [PATCH] group question scrollable layout + refactoring of train window --- src/cpp/qtapp/trainWindow.cpp | 192 +++++++++++++++++++--------------- 1 file changed, 105 insertions(+), 87 deletions(-) diff --git a/src/cpp/qtapp/trainWindow.cpp b/src/cpp/qtapp/trainWindow.cpp index 03b104c..bc26405 100644 --- a/src/cpp/qtapp/trainWindow.cpp +++ b/src/cpp/qtapp/trainWindow.cpp @@ -18,46 +18,13 @@ #include #include #include -#include #include +#include #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( @@ -280,51 +295,34 @@ 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 trainQuestions = std::vector(); @@ -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 questions) { } else if (auto *question = dynamic_cast(trainQuestions[currentQuestionIndex])) { setupGroupQuestion(question); } - }