1 /*
2 SPDX-FileCopyrightText: 1999-2001 Ewald Arnold <kvoctrain@ewald-arnold.de>
3 SPDX-FileCopyrightText: 2005-2007 Peter Hedlund <peter.hedlund@kdemail.net>
4 SPDX-FileCopyrightText: 2007 Frederik Gladhorn <frederik.gladhorn@kdemail.net>
5 SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8 #include "multiplechoicewidget.h"
9
10 #include <KEduVocExpression>
11 #include <KEduVocTranslation>
12 #include <QDebug>
13
14 #include <QDragEnterEvent>
15 #include <QDropEvent>
16 #include <QMimeData>
17 #include <QStringListModel>
18
19 using namespace Editor;
20
MultipleChoiceWidget(QWidget * parent)21 MultipleChoiceWidget::MultipleChoiceWidget(QWidget *parent)
22 : QWidget(parent)
23 , m_choicesModel(new QStringListModel(this))
24 {
25 setupUi(this);
26
27 connect(addChoiceButton, &QPushButton::clicked, this, &MultipleChoiceWidget::slotAddChoiceButton);
28 connect(removeChoiceButton, &QPushButton::clicked, this, &MultipleChoiceWidget::slotRemoveChoiceButton);
29
30 multipleChoiceListView->setModel(m_choicesModel);
31
32 connect(m_choicesModel, &QStringListModel::dataChanged, this, &MultipleChoiceWidget::slotDataChanged);
33
34 multipleChoiceListView->setAcceptDrops(true);
35 multipleChoiceListView->installEventFilter(this);
36
37 setEnabled(false);
38 }
39
slotDataChanged(const QModelIndex & topLeft,const QModelIndex & bottomRight)40 void MultipleChoiceWidget::slotDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
41 {
42 Q_UNUSED(topLeft)
43 Q_UNUSED(bottomRight)
44 if (m_translation) {
45 m_translation->setMultipleChoice(m_choicesModel->stringList());
46 removeChoiceButton->setEnabled(m_translation->getMultipleChoice().count() > 0);
47 } else {
48 removeChoiceButton->setEnabled(false);
49 }
50 }
51
setTranslation(KEduVocExpression * entry,int translation)52 void MultipleChoiceWidget::setTranslation(KEduVocExpression *entry, int translation)
53 {
54 if (entry) {
55 m_translation = entry->translation(translation);
56 } else {
57 m_translation = 0;
58 }
59
60 if (m_translation) {
61 setEnabled(true);
62 m_choicesModel->setStringList(m_translation->getMultipleChoice());
63 removeChoiceButton->setEnabled(m_translation->getMultipleChoice().count() > 0);
64 } else {
65 setEnabled(false);
66 }
67 removeChoiceButton->setEnabled(m_translation && m_translation->getMultipleChoice().count() > 0);
68 }
69
slotAddChoiceButton()70 void MultipleChoiceWidget::slotAddChoiceButton()
71 {
72 m_choicesModel->insertRow(m_choicesModel->rowCount());
73 QModelIndex index(m_choicesModel->index(m_choicesModel->rowCount() - 1));
74 m_choicesModel->setData(index, "");
75 multipleChoiceListView->scrollTo(index);
76 multipleChoiceListView->setCurrentIndex(index);
77 multipleChoiceListView->edit(index);
78 }
79
slotRemoveChoiceButton()80 void MultipleChoiceWidget::slotRemoveChoiceButton()
81 {
82 QModelIndex index = multipleChoiceListView->selectionModel()->currentIndex();
83 if (index.isValid()) {
84 m_choicesModel->removeRows(index.row(), 1, QModelIndex());
85 } else {
86 m_choicesModel->removeRows(m_choicesModel->rowCount(QModelIndex()) - 1, 1, QModelIndex());
87 }
88 if (m_translation) {
89 m_translation->setMultipleChoice(m_choicesModel->stringList());
90 removeChoiceButton->setEnabled(m_translation->getMultipleChoice().count() > 0);
91 } else {
92 removeChoiceButton->setEnabled(false);
93 }
94 }
95
eventFilter(QObject * obj,QEvent * event)96 bool MultipleChoiceWidget::eventFilter(QObject *obj, QEvent *event)
97 {
98 if (obj == multipleChoiceListView) {
99 if (event->type() == QEvent::DragEnter) {
100 QDragEnterEvent *dragEnterEvent = static_cast<QDragEnterEvent *>(event);
101 // qDebug() << "DragEnter mime format: " << dragEnterEvent->format();
102 if ((dragEnterEvent->mimeData() != NULL) && dragEnterEvent->mimeData()->hasText()) {
103 event->accept();
104 }
105 return true;
106 }
107
108 if (event->type() == QEvent::DragMove) {
109 event->accept();
110 return true;
111 }
112
113 if (event->type() == QEvent::Drop) {
114 QDropEvent *dropEvent = static_cast<QDropEvent *>(event);
115 // qDebug() << "You dropped onto me: " << dropEvent->mimeData()->text();
116 if ((dropEvent->mimeData() != NULL) && dropEvent->mimeData()->hasText()) {
117 QStringList choices = dropEvent->mimeData()->text().split('\n');
118 for (const QString &choice : qAsConst(choices)) {
119 m_choicesModel->insertRow(multipleChoiceListView->model()->rowCount());
120 m_choicesModel->setData(m_choicesModel->index(multipleChoiceListView->model()->rowCount() - 1), choice);
121 }
122
123 return true;
124 }
125 }
126 }
127 return QObject::eventFilter(obj, event);
128 }
129