From 9ec8d75a7f38b747ff79de895f152e3560c679ee Mon Sep 17 00:00:00 2001 From: jorenchik Date: Mon, 30 Sep 2024 23:10:52 +0300 Subject: [PATCH] partial impl of the group question widget --- src/cpp/qtapp/main.cpp | 2 +- src/cpp/qtapp/trainWindow.cpp | 97 ++++++++++++++++++++++++++++++----- 2 files changed, 84 insertions(+), 15 deletions(-) diff --git a/src/cpp/qtapp/main.cpp b/src/cpp/qtapp/main.cpp index 9e18d84..7fca3e5 100644 --- a/src/cpp/qtapp/main.cpp +++ b/src/cpp/qtapp/main.cpp @@ -238,7 +238,7 @@ void CreateMdems(std::vector& questions) { mdems[i]->wBack->layout()->addWidget(label); } } - mdems[i]->labelCount = groups.size(); + mdems[i]->labelCount = elements.size(); } if (!mdems[i]->wMdem->isVisible()) { mdems[i]->wMdem->show(); diff --git a/src/cpp/qtapp/trainWindow.cpp b/src/cpp/qtapp/trainWindow.cpp index 7bfd695..78b8eaa 100644 --- a/src/cpp/qtapp/trainWindow.cpp +++ b/src/cpp/qtapp/trainWindow.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "trainWindow.h" #include "parser.h" @@ -53,12 +54,14 @@ QListView *itemListView; QStandardItemModel *orderModel; -class CustomListView : public QListView +QWidget *wGroupQuestion; + +class OrderListView : public QListView { Q_OBJECT public: - explicit CustomListView(QWidget *parent = nullptr) : QListView(parent) {} + explicit OrderListView(QWidget *parent = nullptr) : QListView(parent) {} protected: void dropEvent(QDropEvent *event) override @@ -81,9 +84,38 @@ protected: } }; +class MoveListView : public QListView +{ + Q_OBJECT + +public: + explicit MoveListView(QWidget *parent = nullptr) : QListView(parent) {} + +protected: + void dropEvent(QDropEvent *event) override + { + QModelIndex sourceIndex = currentIndex(); + QModelIndex targetIndex = indexAt(event->pos()); + + if (sourceIndex.isValid() && targetIndex.isValid()) { + QStandardItemModel *model = qobject_cast(this->model()); + if (model) { + QVariant sourceData = model->data(sourceIndex); + QVariant targetData = model->data(targetIndex); + model->setData(sourceIndex, targetData); + model->setData(targetIndex, sourceData); + event->ignore(); + } + } else { + event->ignore(); + } + } +}; + + #include "trainWindow.moc" -CustomListView *orderList; +OrderListView *orderList; QStandardItem *makeItem(std::string content, bool isCheckable) { auto *item = new QStandardItem(); @@ -131,7 +163,7 @@ void initTrainWindow() { auto listStyle = "QListView {" " background-color: white;" - " border: 1px solid black;" + " border: 0px solid black;" "}" "QListView::item::first {" " padding: 5px 0 0 0;" @@ -178,7 +210,7 @@ void initTrainWindow() { { // Make order list. orderModel = new QStandardItemModel(); - orderList = new CustomListView(); + orderList = new OrderListView(); orderList->setModel(orderModel); orderList->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); @@ -234,10 +266,14 @@ void initTrainWindow() { } { // Make group question view. - auto wGroupQuestion = new QWidget(); + wGroupQuestion = new QWidget(); + wGroupQuestion->setStyleSheet( + "border:none;" + ); auto hGroupQuestion = new QHBoxLayout(); wGroupQuestion->setLayout(hGroupQuestion); + // Items on the left. auto itemScroll = new QScrollArea(); auto vItems = new QVBoxLayout(); itemScroll->setLayout(vItems); @@ -245,22 +281,44 @@ void initTrainWindow() { itemListView = new QListView(); itemListView->setModel(itemModel); itemListView->setStyleSheet(listStyle); - for (int i = 0; i < 50; ++i) { - itemModel->appendRow(makeItem("Item I", false)); - } + itemListView->setDragEnabled(true); + itemListView->setDragDropMode(QAbstractItemView::DragDrop); + itemListView->setDefaultDropAction(Qt::MoveAction); vItems->addWidget(itemListView); hGroupQuestion->addWidget(itemScroll); + // Items on the right. auto wGroupBox = new QWidget(); auto vGroupBox = new QVBoxLayout(); - auto groupScroll = new QScrollArea(); + auto wGroups = new QScrollArea(); auto vGroups = new QVBoxLayout(); + auto groupSpacer = new QSpacerItem(50, 50, QSizePolicy::Minimum, QSizePolicy::Expanding); + wGroupBox->setLayout(vGroupBox); - vGroupBox->addWidget(groupScroll); - groupScroll->setLayout(vGroups); + 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 QListView(); + groupList->setModel(groupModel); + groupList->setMaximumHeight(100); + vGroups->addWidget(groupLabel); + vGroups->addWidget(groupList); + groupList->setStyleSheet(listStyle); + groupList->setAcceptDrops(true); + groupList->setDragDropMode(QAbstractItemView::DragDrop); + groupList->setDefaultDropAction(Qt::MoveAction); + } + vGroups->addItem(groupSpacer); + + std::cout << wGroupBox->geometry().height() << std::endl; itemListView->setEditTriggers(QAbstractItemView::NoEditTriggers); + wGroupQuestion->hide(); questionBox->layout()->addWidget(wGroupQuestion); } @@ -277,6 +335,7 @@ void hideQuestionElements() { answerText->hide(); orderList->hide(); listView->hide(); + wGroupQuestion->hide(); } void setupAnswerQuestion(MultiElementQuestion *question) { @@ -362,8 +421,18 @@ void setupMultiChoiceQuestion(MultiElementQuestion *question) { void setupGroupQuestion(GroupQuestion *question) { hideQuestionElements(); - // TODO - + 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 showAnswer = [](bool checked) { QObject::disconnect(btnTriggerAnswer, 0, 0, 0); };