Drag and drop groups

This commit is contained in:
jorenchik
2024-10-03 22:56:37 +03:00
parent 9ec8d75a7f
commit c2dc230e73

View File

@@ -19,6 +19,7 @@
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QDropEvent> #include <QDropEvent>
#include <iostream> #include <iostream>
#include <QDrag>
#include "trainWindow.h" #include "trainWindow.h"
#include "parser.h" #include "parser.h"
@@ -56,6 +57,26 @@ QStandardItemModel *orderModel;
QWidget *wGroupQuestion; QWidget *wGroupQuestion;
auto listStyle =
"QListView {"
" background-color: white;"
" border: 0px solid black;"
"}"
"QListView::item::first {"
" padding: 5px 0 0 0;"
"}"
"QListView::item {"
" color: black;"
" padding: 5px;"
" border: 1px solid gray;"
" background-color: white;"
"}"
"QListView::item:selected {"
"}"
"QListView::item:hover {"
" background-color: lightyellow;"
"}";
class OrderListView : public QListView class OrderListView : public QListView
{ {
Q_OBJECT Q_OBJECT
@@ -89,26 +110,33 @@ class MoveListView : public QListView
Q_OBJECT Q_OBJECT
public: public:
explicit MoveListView(QWidget *parent = nullptr) : QListView(parent) {} explicit MoveListView(QWidget *parent = nullptr) : QListView(parent) {
setStyleSheet(listStyle);
setAcceptDrops(true);
setDragDropMode(QAbstractItemView::DragDrop);
setDefaultDropAction(Qt::MoveAction);
}
protected: protected:
void dropEvent(QDropEvent *event) override void dragEnterEvent(QDragEnterEvent *event) override {
{ event->acceptProposedAction();
QModelIndex sourceIndex = currentIndex(); }
QModelIndex targetIndex = indexAt(event->pos());
if (sourceIndex.isValid() && targetIndex.isValid()) { void dragMoveEvent(QDragMoveEvent *event) override {
QStandardItemModel *model = qobject_cast<QStandardItemModel *>(this->model()); event->acceptProposedAction();
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(); void dropEvent(QDropEvent *event) override {
QListView *source = qobject_cast<QListView *>(event->source());
QStandardItemModel *sourceModel = qobject_cast<QStandardItemModel *>(source->model());
QStandardItemModel *targetModel = qobject_cast<QStandardItemModel *>(this->model());
if (source != this) {
QList<QStandardItem *> items = sourceModel->takeRow(source->currentIndex().row());
targetModel->appendRow(items);
} }
event->ignore();
} }
}; };
@@ -160,26 +188,6 @@ void initTrainWindow() {
lQuestionText->hide(); lQuestionText->hide();
} }
auto listStyle =
"QListView {"
" background-color: white;"
" border: 0px solid black;"
"}"
"QListView::item::first {"
" padding: 5px 0 0 0;"
"}"
"QListView::item {"
" color: black;"
" padding: 5px;"
" border: 1px solid gray;"
" background-color: white;"
"}"
"QListView::item:selected {"
"}"
"QListView::item:hover {"
" background-color: lightyellow;"
"}";
{ // Make multi-choice list. { // Make multi-choice list.
multiChoiceModel = new QStandardItemModel(); multiChoiceModel = new QStandardItemModel();
listView = new QListView(); listView = new QListView();
@@ -278,12 +286,8 @@ void initTrainWindow() {
auto vItems = new QVBoxLayout(); auto vItems = new QVBoxLayout();
itemScroll->setLayout(vItems); itemScroll->setLayout(vItems);
itemModel = new QStandardItemModel(); itemModel = new QStandardItemModel();
itemListView = new QListView(); itemListView = new MoveListView();
itemListView->setModel(itemModel); itemListView->setModel(itemModel);
itemListView->setStyleSheet(listStyle);
itemListView->setDragEnabled(true);
itemListView->setDragDropMode(QAbstractItemView::DragDrop);
itemListView->setDefaultDropAction(Qt::MoveAction);
vItems->addWidget(itemListView); vItems->addWidget(itemListView);
hGroupQuestion->addWidget(itemScroll); hGroupQuestion->addWidget(itemScroll);
@@ -303,15 +307,11 @@ void initTrainWindow() {
auto groupLabel = new QLabel("Group I"); auto groupLabel = new QLabel("Group I");
auto scrollArea = new QScrollArea(); auto scrollArea = new QScrollArea();
auto groupModel = new QStandardItemModel(); auto groupModel = new QStandardItemModel();
auto groupList = new QListView(); auto groupList = new MoveListView();
groupList->setModel(groupModel);
groupList->setMaximumHeight(100);
vGroups->addWidget(groupLabel); vGroups->addWidget(groupLabel);
vGroups->addWidget(groupList); vGroups->addWidget(groupList);
groupList->setStyleSheet(listStyle); groupList->setModel(groupModel);
groupList->setAcceptDrops(true); groupList->setMaximumHeight(100);
groupList->setDragDropMode(QAbstractItemView::DragDrop);
groupList->setDefaultDropAction(Qt::MoveAction);
} }
vGroups->addItem(groupSpacer); vGroups->addItem(groupSpacer);