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 }