File indexing completed on 2024-04-21 04:32:09

0001 /*
0002  * Copyright (C) 2009-2015 by Stephen Allewell
0003  * steve.allewell@gmail.com
0004  *
0005  * This program is free software; you can redistribute it and/or modify
0006  * it under the terms of the GNU General Public License as published by
0007  * the Free Software Foundation; either version 2 of the License, or
0008  * (at your option) any later version.
0009  */
0010 
0011 #include "LibraryTreeWidget.h"
0012 
0013 #include <QDragEnterEvent>
0014 #include <QDragLeaveEvent>
0015 #include <QDragMoveEvent>
0016 #include <QDropEvent>
0017 #include <QMimeData>
0018 #include <QTimer>
0019 #include <QToolTip>
0020 #include <QTreeWidgetItem>
0021 
0022 #include <KLocalizedString>
0023 
0024 #include "LibraryPattern.h"
0025 #include "LibraryTreeWidgetItem.h"
0026 #include "Pattern.h"
0027 
0028 /* Auto expanding of QTreeWidgetItems doesn't appear to be working.
0029  * Implement some code to do it via a timer when hovered over.
0030  */
0031 const int AUTO_EXPAND_DELAY = 500;
0032 
0033 LibraryTreeWidget::LibraryTreeWidget(QWidget *parent)
0034     : QTreeWidget(parent)
0035 {
0036     setAcceptDrops(true);
0037     m_openBranchTimer = new QTimer(this);
0038     connect(m_openBranchTimer, &QTimer::timeout, this, &LibraryTreeWidget::openBranch);
0039 }
0040 
0041 LibraryTreeWidget::~LibraryTreeWidget()
0042 {
0043     delete m_openBranchTimer;
0044 }
0045 
0046 void LibraryTreeWidget::dragEnterEvent(QDragEnterEvent *event)
0047 {
0048     if (acceptDrag(event)) {
0049         event->accept();
0050         m_currentItem = currentItem();
0051         m_dropItem = itemAt(event->pos());
0052 
0053         if (m_dropItem) {
0054             m_openBranchTimer->start(AUTO_EXPAND_DELAY);
0055         }
0056     } else {
0057         event->ignore();
0058     }
0059 }
0060 
0061 void LibraryTreeWidget::dragMoveEvent(QDragMoveEvent *event)
0062 {
0063     m_openBranchTimer->stop();
0064 
0065     if (acceptDrag(event)) {
0066         event->accept();
0067         m_dropItem = itemAt(event->pos());
0068 
0069         if (m_dropItem && m_dropItem == m_currentItem) { // tring to drop on same Library
0070             QToolTip::showText(mapToGlobal(event->pos() + QPoint(10, 0)), i18n("existing library"));
0071         } else {
0072             QToolTip::hideText();
0073         }
0074 
0075         if (m_dropItem) {
0076             setCurrentItem(m_dropItem);
0077             m_openBranchTimer->start(AUTO_EXPAND_DELAY);
0078         }
0079     } else {
0080         event->ignore();
0081     }
0082 }
0083 
0084 void LibraryTreeWidget::dragLeaveEvent(QDragLeaveEvent *)
0085 {
0086     m_openBranchTimer->stop();
0087 
0088     if (m_currentItem) {
0089         setCurrentItem(m_currentItem);
0090         scrollToItem(m_currentItem);
0091     }
0092 
0093     m_currentItem = nullptr;
0094     m_dropItem = nullptr;
0095 }
0096 
0097 void LibraryTreeWidget::dropEvent(QDropEvent *event)
0098 {
0099     m_openBranchTimer->stop();
0100 
0101     if (m_dropItem && m_dropItem != m_currentItem) {
0102         QByteArray data = event->mimeData()->data(QStringLiteral("application/kxstitch"));
0103         Pattern *pattern = new Pattern;
0104         QDataStream stream(&data, QIODevice::ReadOnly);
0105         stream >> *pattern;
0106         static_cast<LibraryTreeWidgetItem *>(m_dropItem)->addPattern(new LibraryPattern(pattern));
0107     }
0108 
0109     if (m_currentItem) {
0110         setCurrentItem(m_currentItem);
0111         scrollToItem(m_currentItem);
0112     }
0113 }
0114 
0115 bool LibraryTreeWidget::acceptDrag(QDropEvent *event) const
0116 {
0117     return event->mimeData()->hasFormat(QStringLiteral("application/kxstitch"));
0118 }
0119 
0120 void LibraryTreeWidget::openBranch()
0121 {
0122     m_openBranchTimer->stop();
0123 
0124     if (m_dropItem && !m_dropItem->isExpanded()) {
0125         m_dropItem->setExpanded(true);
0126     }
0127 }
0128 
0129 #include "moc_LibraryTreeWidget.cpp"