File indexing completed on 2024-04-21 04:32:08
0001 /* 0002 * Copyright (C) 2010-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 "LibraryListWidget.h" 0012 0013 #include <QApplication> 0014 #include <QBitmap> 0015 #include <QDrag> 0016 #include <QMimeData> 0017 #include <QMouseEvent> 0018 #include <QPainter> 0019 0020 #include "LibraryListWidgetItem.h" 0021 #include "LibraryPattern.h" 0022 #include "Pattern.h" 0023 0024 LibraryListWidget::LibraryListWidget(QWidget *parent) 0025 : QListWidget(parent) 0026 { 0027 m_renderer.setRenderStitchesAs(Configuration::EnumRenderer_RenderStitchesAs::Stitches); 0028 m_renderer.setRenderBackstitchesAs(Configuration::EnumRenderer_RenderBackstitchesAs::ColorLines); 0029 m_renderer.setRenderKnotsAs(Configuration::EnumRenderer_RenderKnotsAs::ColorBlocks); 0030 } 0031 0032 void LibraryListWidget::setCellSize(double cellWidth, double cellHeight) 0033 { 0034 m_cellWidth = cellWidth; 0035 m_cellHeight = cellHeight; 0036 } 0037 0038 void LibraryListWidget::changeIconSize(int size) 0039 { 0040 setIconSize(QSize(size, size)); 0041 setGridSize(QSize(size + 10, size + 20)); 0042 } 0043 0044 void LibraryListWidget::dragEnterEvent(QDragEnterEvent *) 0045 { 0046 } 0047 0048 void LibraryListWidget::dragMoveEvent(QDragMoveEvent *) 0049 { 0050 } 0051 0052 void LibraryListWidget::dragLeaveEvent(QDragLeaveEvent *) 0053 { 0054 } 0055 0056 void LibraryListWidget::mousePressEvent(QMouseEvent *e) 0057 { 0058 m_startDrag = e->pos(); 0059 LibraryListWidgetItem *item = static_cast<LibraryListWidgetItem *>(itemAt(m_startDrag)); 0060 0061 if (item && (e->button() == Qt::LeftButton)) { 0062 e->accept(); 0063 } else { 0064 e->ignore(); 0065 } 0066 } 0067 0068 void LibraryListWidget::mouseMoveEvent(QMouseEvent *e) 0069 { 0070 if ((e->pos() - m_startDrag).manhattanLength() > QApplication::startDragDistance()) { 0071 LibraryListWidgetItem *item = static_cast<LibraryListWidgetItem *>(itemAt(m_startDrag)); 0072 0073 if (item && (e->buttons() & Qt::LeftButton)) { 0074 QByteArray data; 0075 QDataStream stream(&data, QIODevice::WriteOnly); 0076 Pattern *pattern = item->libraryPattern()->pattern(); 0077 stream << *pattern; 0078 QMimeData *mimeData = new QMimeData(); 0079 mimeData->setData(QStringLiteral("application/kxstitch"), data); 0080 0081 QPixmap pixmap(pattern->stitches().width() * m_cellWidth, pattern->stitches().height() * m_cellHeight); 0082 pixmap.fill(Qt::white); 0083 0084 QPainter painter(&pixmap); 0085 painter.setWindow(0, 0, pattern->stitches().width(), pattern->stitches().height()); 0086 painter.setRenderHint(QPainter::Antialiasing, true); 0087 0088 m_renderer.render(&painter, 0089 pattern, 0090 painter.window(), 0091 false, // render grid 0092 true, // render stitches 0093 true, // render backstitches 0094 true, // render knots 0095 -1); // no color mask 0096 0097 painter.end(); 0098 pixmap.setMask(pixmap.createMaskFromColor(Qt::white)); 0099 0100 QDrag *drag = new QDrag(this); 0101 drag->setMimeData(mimeData); 0102 drag->setPixmap(pixmap); 0103 drag->setHotSpot(QPoint(m_cellWidth / 2, m_cellHeight / 2)); 0104 drag->exec(Qt::CopyAction); 0105 0106 e->accept(); 0107 } 0108 } else { 0109 e->ignore(); 0110 } 0111 }