initial import

This commit is contained in:
Mo Elzubeir
2022-12-13 09:18:00 -06:00
commit d2d561810c
322 changed files with 1147261 additions and 0 deletions
+267
View File
@@ -0,0 +1,267 @@
/************************************************************************
* $Id: pageitem.cpp 661 2011-04-05 13:16:53Z elzubeir $
*
* ------------
* Description:
* ------------
*
* (C) Copyright 2009-2011 ALLCONTENT. All rights reserved.
*
* -----------------
* Revision Details: (Updated by Revision Control System)
* -----------------
* $Date: 2011-04-05 17:16:53 +0400 (Tue, 05 Apr 2011) $
* $Author: elzubeir $
* $Revision: 661 $
* $HeadURL: file:///opt/svn/socialhose/trunk/app/ClippingStation/pageitem.cpp $
*
************************************************************************/
#include "pageitem.h"
#include <QBrush>
#include <QApplication>
#include <QDesktopWidget>
#include <QGraphicsSceneDragDropEvent>
#include <QMimeData>
#include <QGraphicsScene>
#include <QtDebug>
#include "constants.h"
#include "droppeditem.h"
#include "pagemargin.h"
PageItem::PageItem(const QString & paperFormat, bool isfirst) :
QGraphicsRectItem(),
m_paperFormat(paperFormat),
m_isFirstPage(isfirst),
m_pageMargin(isfirst),
m_thumbnail(0)
{
if (m_paperFormat != "A4")
return; // error ! by now we don't support others page format !
// we compute pixels dimensions for the page.
int dpi = QApplication::desktop()->logicalDpiX();
m_pageWidth = dpi * A4_WIDTH;
m_pageHeight = dpi * A4_HEIGHT;
setRect(QRectF(0, 0, m_pageWidth, m_pageHeight));
// page color is white.
setBrush(QBrush(Qt::white));
setZValue(0.1);
setAcceptDrops(true);
m_pageMargin.setPageParent(this);
}
PageItem::~PageItem()
{
qDebug("~PageItem()");
if(m_thumbnail)
{
delete m_thumbnail;
m_thumbnail = 0;
}
QList<QGraphicsItem*> items = this->childItems();
//qDebug("Items count : %d", items.count());
for(int i=0; i< items.count(); i++)
{
DroppedItem *item = static_cast<DroppedItem*>(items[i]);
if(item->type() == UserType + 1 )
delete item;
}
qDebug("end of ~PageItem()");
}
void PageItem::hideMargins(bool hide)
{
m_pageMargin.hideMargins(hide);
}
void PageItem::unselectItems()
{
QList<QGraphicsItem*> items = this->childItems();
foreach(QGraphicsItem *item, items)
item->setSelected(false);
}
void PageItem::dragMoveEvent(QGraphicsSceneDragDropEvent * event)
{
// if dragged mime data is not a image, we forbid the drop action.
if (event->mimeData()->hasImage())
event->acceptProposedAction();
else
event->ignore();
QGraphicsRectItem::dragMoveEvent(event);
}
void PageItem::dropEvent(QGraphicsSceneDragDropEvent * event)
{
// verify that we drop an image.
if (event->mimeData()->hasImage())
{
QPointF pt = event->pos(); //QPointF pt = mapToItem(this, event->pos());
QByteArray byteArray = event->mimeData()->data("image/jpg");
QPixmap pixmap = QPixmap::fromImage( QImage::fromData(byteArray, "jpg") );
QPixmap originalPixmap = pixmap;
int width = pixmap.width();
int height = pixmap.height();
withinMarginBoundaries( pt, width, height );
qreal w = m_pageWidth - m_pageMargin.right() - pt.x();
qreal h = m_pageHeight - m_pageMargin.bottom() - pt.y();
qreal precW = w/originalPixmap.width();
qreal precH = h/originalPixmap.height();
qreal prec = qMin(precW, precH);
if (prec > 1.0)
prec = 1.0;
new DroppedItem(originalPixmap, pt, prec, this);
}
}
void PageItem::withinMarginBoundaries(QPointF &point, int width, int height)
{
//notice that this order is IMPORTANT, because if its to the right, and bigger than the margin width
//it will be shrinked automatically
if ( point.x() > m_pageWidth - m_pageMargin.right() )
point.setX(m_pageWidth- m_pageMargin.right() - width ); //return false;
if ( point.y() > m_pageHeight - m_pageMargin.bottom() )
point.setY( m_pageHeight - m_pageMargin.bottom() - height );
if ( point.x() < m_pageMargin.left() )
point.setX(m_pageMargin.left() ); //return false;
if ( point.y() < m_pageMargin.top() )
point.setY(m_pageMargin.top() ); //return false;
}
QPointF PageItem::calculateDropEvent(const QPointF & itemPos, int pixmapWidth, int pixmapHeight) const
{
QPointF dropPos(itemPos);
// this computation is allowed cause drop position is on the hotspot point and it is set to 0,0 when drag starts.
// If it changes, we have to compute things taking in account the drag hot spot too.
if ((itemPos.x() + pixmapWidth > m_pageWidth) && (pixmapWidth <= m_pageWidth))
{
//dropPos.setX(m_pageWidth - pixmapWidth);
//dropPos.setX( m_pageMargin->left() );
}
if ((itemPos.y() + pixmapHeight > m_pageHeight) && (pixmapHeight <= m_pageHeight))
{
dropPos.setY(m_pageHeight - pixmapHeight);
}
// convert scene pos to page item pos
return QPointF(dropPos);
}
void PageItem::addThumbnail(QImage &img)
{
if (m_thumbnail)
delete m_thumbnail;
m_thumbnail = new Thumbnail(QPixmap::fromImage(img), QPointF(650, 20), this);
}
void PageItem::addCutout(QImage &img, QPointF &pos, qreal scale)
{
new DroppedItem(QPixmap::fromImage(img), pos, scale, this);
}
qreal PageItem::width()
{
return m_pageWidth;
}
qreal PageItem::height()
{
return m_pageHeight;
}
PageMargin& PageItem::margin()
{
return m_pageMargin;
}
void PageItem::setPixmap(const QPixmap &pix)
{
hideMargins(true);
QGraphicsPixmapItem *pixItem = new QGraphicsPixmapItem(pix, this);
pixItem->setPos(0,0);
}
int PageItem::cutoutsCount()
{
QList<QGraphicsItem*> list = this->children();
int count = childItems().count() - 5; //5 is for the margin items
if(m_isFirstPage)
count -=1; //remove the thumbnamil item
return count;
}
QRectF PageItem::centerCutouts(bool isArabic)
{
QList<QGraphicsItem*> items = this->childItems();
double top, bottom, left, right;
top = left = 1000;
bottom = right = -1;
//QRectF rect(0,0,0,0);
//qDebug("Items count : %d", items.count());
for(int i=0; i< items.count(); i++)
{
DroppedItem *item = static_cast<DroppedItem*>(items[i]);
if(item->type() == UserType + 1 )
{
if (item->pos().x() + item->boundingRect().topLeft().x() < left )
left = item->pos().x() + item->boundingRect().topLeft().x();
if (item->pos().y() + item->boundingRect().topLeft().y() < top )
top = item->pos().y() +item->boundingRect().topLeft().y();
if (item->pos().x() + item->boundingRect().bottomRight().x() > right )
right = item->pos().x() + item->boundingRect().bottomRight().x();
if (item->pos().y() + item->boundingRect().bottomRight().y() > bottom )
bottom = item->pos().y() + item->boundingRect().bottomRight().y();
}
}
QRectF rect(QPointF(left, top), QPoint(right, bottom) );
//QRectF br = this->boundingRect();
double w = m_pageWidth - m_pageMargin.left() - m_pageMargin.right();
double h = m_pageHeight - m_pageMargin.top() - m_pageMargin.bottom();
double moveX = ( w - rect.width())/2.0;
double moveY = ( h - rect.height())/2.0;
int orientation = 1;
if(isArabic)
orientation = -1;
for(int i=0; i< items.count(); i++)
{
DroppedItem *item = static_cast<DroppedItem*>(items[i]);
if(item->type() == UserType + 1 )
item->moveBy(orientation*moveX, moveY);
}
return rect;
}