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