Subversion Repositories Scribus

Rev

Rev 25021 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
For general Scribus (>=1.3.2) copyright and licensing information please refer
to the COPYING file provided with the program. Following this notice may exist
a copyright and/or license notice that predates the release of Scribus 1.3.2
for which a new license (GPL+exception) is in place.
*/


#include <QApplication>
#include <QBitmap>
#include <QCursor>
#include <QDrag>
#include <QEvent>
#include <QHeaderView>
#include <QLabel>
#include <QList>
#include <QMenu>
#include <QMimeData>
#include <QMessageBox>
#include <QPainter>
#include <QStringView>

#include "iconmanager.h"
#include "pagepalette_widgets.h"
#include "scribusapp.h"


/* IconItems Code */
SeItem::SeItem(const QString& text, uint nr, const QPixmap& pix)
        : QTableWidgetItem(QIcon(pix), "", 1002),
          pageNumber(nr),
          pageName(text)
{
        setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
}

const QString& SeItem::getPageName()
{
        return pageName;
}

/* ListBox Subclass */
SeList::SeList(QWidget* parent) : QListWidget(parent)
{
        setAcceptDrops(true);
}

void SeList::mouseReleaseEvent(QMouseEvent *m)
{
        m_mousePressed = false;
        if (m->button() == Qt::RightButton)
        {
                QMenu *pmen = new QMenu();
//              qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
                QAction *px = pmen->addAction( tr("Show Page Previews"), this, SLOT(toggleThumbnail()));
                px->setCheckable(true);
                if (m_thumb)
                        px->setChecked(true);
                pmen->exec(QCursor::pos());
                delete pmen;
        }
        QListWidget::mouseReleaseEvent(m);
}

void SeList::toggleThumbnail()
{
        m_thumb = !m_thumb;
        emit thumbnailChanged();
}

void SeList::mousePressEvent(QMouseEvent* e)
{
        e->accept();
        m_currItem = nullptr;
        QListWidgetItem *i = itemAt(e->position().toPoint());
        if (i)
        {
                m_currItem = i;
                m_mousePos = e->position().toPoint();
                m_mousePressed = true;
        }
        QListWidget::mousePressEvent(e);
}

void SeList::mouseMoveEvent(QMouseEvent* e)
{
        if ((m_mousePressed) && ((m_mousePos - e->pos()).manhattanLength() > 4))
        {
                m_mousePressed = false;
                QListWidgetItem *item = itemAt(m_mousePos);
                if (!item)
                        return;
                QMimeData *mimeData = new QMimeData;
                QString pageName = item->data(Qt::UserRole).toString();
                mimeData->setData("page/magic", "1" + pageName.toLocal8Bit());
                mimeData->setText("1" + pageName);
                QDrag *dr = new QDrag(this);
                dr->setMimeData(mimeData);
                const QPixmap& pm = IconManager::instance().loadPixmap("doc.png");
                dr->setPixmap(pm);
        //      dr->setDragCursor(pm, Qt::CopyAction);
        //      dr->setDragCursor(pm, Qt::MoveAction);
                dr->exec(Qt::CopyAction | Qt::MoveAction);
                QApplication::setOverrideCursor(Qt::ArrowCursor);
        }
}

void SeList::keyPressEvent(QKeyEvent * e)
{
        int k = e->key();
        if (k == Qt::Key_Delete)
        {
                if (currentItem())
                {
                        e->accept();
                        emit delMasterRequest(currentItem()->text());
                        return;
                }
        }
       
        QListWidget::keyPressEvent(e);
}


/* QTable Subclass */
SeView::SeView(QWidget* parent) : QTableWidget(parent)
{
        setDragEnabled(true);
        setAcceptDrops(true);
        setDropIndicatorShown(true);
        setShowGrid(false);
        setWordWrap(true);
}

void SeView::mousePressEvent(QMouseEvent* e)
{
        e->accept();
        m_mousePos = e->position().toPoint();
        m_mousePressed = true;
        QTableWidget::mousePressEvent(e);
}

void SeView::mouseReleaseEvent(QMouseEvent* e)
{
        e->accept();
        m_mousePressed = false;

        QPoint mouseEventPos = e->position().toPoint();
        emit Click(rowAt(mouseEventPos.y()), columnAt(mouseEventPos.x()), e->button());
        QTableWidget::mouseReleaseEvent(e);
}

void SeView::mouseMoveEvent(QMouseEvent* e)
{
        QPoint mouseEventPos = e->position().toPoint();
        if ((m_mousePressed) && ((m_mousePos - mouseEventPos).manhattanLength() > 4))
        {
                m_mousePressed = false;
                int a = rowAt(mouseEventPos.y());
                int b = columnAt(mouseEventPos.x());
                if ((a != -1) && (b != -1))
                {
                        QTableWidgetItem* ite = item(a, b);
                        if (ite != nullptr)
                        {
                                if (ite->type() == 1002)
                                {
                                        SeItem* it = (SeItem*)ite;
                                        QString str(it->pageName);
                                        bool dummy;
                                        int p = getPage(a, b, &dummy);
                                        QString tmp;
                                        QMimeData *mimeData = new QMimeData;
                                        mimeData->setData("page/magic", "2 " + tmp.setNum(p).toLocal8Bit() + " " + str.toLocal8Bit());
                                        mimeData->setText("2 " + tmp.setNum(p) + " " + str);
                                        QDrag *dr = new QDrag(this);
                                        dr->setMimeData(mimeData);
                                        const QPixmap& pm = IconManager::instance().loadPixmap("doc.png");
                                        dr->setPixmap(pm);
                                //      dr->setDragCursor(pm, Qt::CopyAction);
                                //      dr->setDragCursor(pm, Qt::MoveAction);
                                        dr->exec(Qt::CopyAction | Qt::MoveAction);
                                        QApplication::setOverrideCursor(Qt::ArrowCursor);
                                }
                        }
                }
        }
        QTableWidget::mouseMoveEvent(e);
}

void SeView::dropEvent(QDropEvent * e)
{
       
        bool lastPage = false;
        if (!e->mimeData()->hasFormat("page/magic"))
                return;

        QPoint dropEventPos = e->position().toPoint();
        e->setDropAction(Qt::MoveAction);
        e->accept();
        // HACK to prevent strange Qt4 cursor behaviour after dropping. It's examined by Trolltech now - PV.
        // It's the one and only reason why to include QApplication here.
        // But sadly this destroys our normal Cursors
        // Fixed at least in Qt-4.4.2
//      QApplication::restoreOverrideCursor();
        clearPix();

        QString tmp;
        QString str = e->mimeData()->text();
        if (str.startsWith("1"))
        {
                int a = rowAt(dropEventPos.y());
                int b = columnAt(dropEventPos.x());
                int p;
                tmp = str.remove(0,1);
                if ((a == -1) || (b == -1))
                        return;
                if (a == rowCount() - 1)
                {
                        emit NewPage(m_pageCount, tmp);
                        return;
                }
                p = getPage(a, b, &lastPage);
                if (columnCount() == 1)
                {
                        if ((a % 2) == 0)
                                emit NewPage(p, tmp);
                        else
                        {
                                emit UseTemp(tmp, p);
                                QTableWidgetItem* ite = item(a, b);
                                if (ite == nullptr)
                                        return;
                                if (ite->type() == 1002)
                                {
                                        SeItem* it = (SeItem*)ite;
                                        it->pageName = tmp;
                                }
                        }
                        return;
                }
                if ((b % 2) == 0)
                {
                        if (lastPage)
                                emit NewPage(p + 1, tmp);
                        else
                                emit NewPage(p, tmp);
                }
                else
                {
                        emit UseTemp(tmp, p);
                        QTableWidgetItem* ite = item(a, b);
                        if (ite == nullptr)
                                return;
                        if (ite->type() == 1002)
                        {
                                SeItem* it = (SeItem*)ite;
                                it->pageName = tmp;
                        }
                }
                return;
        }
        if (str.startsWith("2"))
        {
                int st = str.indexOf(" ");
                int en = str.indexOf(" ", st + 1);
                tmp = str.mid(en + 1);
                int dr = QStringView(str).sliced(st, en - st).toInt();
                int a = rowAt(dropEventPos.y());
                int b = columnAt(dropEventPos.x());
                if ((a == -1) || (b == -1))
                        return;
                QTableWidgetItem* ite = item(a, b);
                int p = getPage(a, b, &lastPage);
                if (a == rowCount() - 1)
                {
                        emit movePage(dr, p+1);
                        return;
                }
                if (columnCount() == 1)
                {
                        if ((a % 2) == 0)
                                emit movePage(dr, p);
                        else
                        {
                                emit UseTemp(tmp, p);
                                if (ite == nullptr)
                                        return;
                                SeItem* it = (SeItem*)ite;
                                it->pageName = tmp;
                        }
                        return;
                }
                if ((b % 2) == 0)
                        emit movePage(dr, lastPage ? p+1 : p);
                else
                {
                        emit UseTemp(tmp, p);
                        if (ite == nullptr)
                                return;
                        if (ite->type() == 1002)
                        {
                                SeItem* it = (SeItem*)ite;
                                it->pageName = tmp;
                        }
                }
                return;
        }
}

void SeView::dragEnterEvent(QDragEnterEvent *e)
{
        if (e->mimeData()->hasFormat("page/magic"))
                e->acceptProposedAction();
}

void SeView::dragLeaveEvent(QDragLeaveEvent *)
{
        clearPix();
}

void SeView::dragMoveEvent(QDragMoveEvent *e)
{
        if (!e->mimeData()->hasFormat("page/magic"))
                return;

        e->acceptProposedAction();
        clearPix();

        QPoint dragEventPos = e->position().toPoint();
        int row = rowAt(dragEventPos.y());
        int col = columnAt(dragEventPos.x());
        if ((row == -1) || (col == -1))
                return;

        if (columnCount() == 1)
        {
                if ((row % 2) == 0)
                {
                        item(row, 0)->setBackground(Qt::darkBlue);
                }
        }
        else
        {
                if (((col % 2) == 0) || (row == rowCount()-1))
                {
                        item(row, col)->setBackground(Qt::darkBlue);
                }
        }
}

void SeView::keyPressEvent(QKeyEvent * e)
{
        int k = e->key();
        if (k == Qt::Key_Delete)
        {
                e->accept();
                bool dummy;
                int pageToDelete = getPage(currentRow(), currentColumn(), &dummy);
                emit delPageRequest(pageToDelete);
                return;
        }

        QTableWidget::keyPressEvent(e);
}

void SeView::clearPix()
{
        int rowcounter = 0;
        for (int i = 0; i < rowCount(); ++i)
        {
                int counter = 0;
                if (columnCount() == 1)
                {
                        if ((i % 2) == 0)
                        {
                                item(rowcounter, 0)->setBackground(Qt::white);
                                rowcounter += 2;
                        }
                }
                else
                {
                        for (int j = 0; j < columnCount(); ++j)
                        {
                                if ((j % 2) == 0)
                                {
                                        item(rowcounter, counter)->setBackground(Qt::white);
                                        counter += 2;
                                }
                        }
                        rowcounter++;
                }
        }
        for (int i = 0; i < columnCount(); ++i)
        {
                item(rowCount()-1, i)->setBackground(Qt::white);
        }
}

int SeView::getPage(int r, int c, bool *last)
{
        int counter = m_firstPage;
        int rowcounter = 0;
        int ret = m_pageCount - 1;
        *last = false;
        if (r == rowCount() - 1)
        {
                *last = true;
                return ret;
        }
        if ((r == 0) && (c < m_firstPage * m_colmult + m_coladd))
                return 0;
        for (int a = 0; a < m_pageCount; ++a)
        {
                if ((rowcounter * m_rowmult + m_rowadd == r) && (counter * m_colmult + m_coladd == c))
                {
                        ret = a;
                        return ret;
                }
                if (columnCount() == 1)
                {
                        if ((rowcounter * m_rowmult) == r)
                        {
                                ret = a;
                                return ret;
                        }
                }
                else
                {
                        if ((counter * m_colmult == c) && (rowcounter * m_rowmult + m_rowadd == r))
                        {
                                ret = a;
                                return ret;
                        }
                }
                counter++;
                if (counter > m_cols - 1)
                {
                        counter = 0;
                        rowcounter++;
                }
        }
        *last = true;
        return ret;
}

SeItem* SeView::getPageItem(int pageIndex)
{
        int rows = this->rowCount();
        int columns = this->columnCount();
        for (int i = 0; i < rows; ++i)
        {
                for (int j = 0; j < columns; ++j)
                {
                        QTableWidgetItem* tbItem = item(i, j);
                        SeItem* pageItem = dynamic_cast<SeItem*>(tbItem);
                        if (pageItem && pageItem->pageNumber == static_cast<uint>(pageIndex))
                                return pageItem;
                }
        }
        return nullptr;
}

/* Der Muelleimer */
TrashBin::TrashBin(QWidget * parent) : QLabel(parent)
{
        Normal = IconManager::instance().loadPixmap("trashcan.png");
        Offen = IconManager::instance().loadPixmap("trashcan2.png");
        setPixmap(Normal);
        setScaledContents(false);
        setAcceptDrops(true);

        connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
}

void TrashBin::dragEnterEvent(QDragEnterEvent *e)
{
        if (e->mimeData()->hasFormat("page/magic"))
        {
                e->accept();
                setPixmap(Offen);
        }
}

void TrashBin::dragLeaveEvent(QDragLeaveEvent *)
{
        setPixmap(Normal);
}

void TrashBin::dropEvent(QDropEvent * e)
{
        setPixmap(Normal);
        QString str, tmp;
        if (e->mimeData()->hasFormat("page/magic"))
        {
                e->accept();
                str = e->mimeData()->text();
                if (str.startsWith("2"))
                {
                        int st = str.indexOf(" ");
                        int en = str.indexOf(" ", st + 1);
                        emit delPageRequest(QStringView(str).sliced(st, en - st).toInt());
                }
                if (str.startsWith("1"))
                {
                        tmp = str.remove(0,1);
                        emit delMasterRequest(tmp);
                }
        }
}

void TrashBin::iconSetChange()
{
        Normal = IconManager::instance().loadPixmap("trashcan.png");
        Offen = IconManager::instance().loadPixmap("trashcan2.png");
        setPixmap(Normal);
}