File indexing completed on 2024-05-05 08:41:16
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"