Files
2022-12-13 09:18:00 -06:00

312 lines
9.0 KiB
C++

/************************************************************************
* $Id: droppeditem.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/droppeditem.cpp $
*
************************************************************************/
#include "droppeditem.h"
#include "pageitem.h"
#include <QKeyEvent>
#include <QtDebug>
#include <QTime>
#include <QGraphicsScene>
#include <QMessageBox>
#include <QPainter>
DroppedItem::DroppedItem(const QPixmap & pixmap, const QPointF & scenePos, qreal perc, QGraphicsItem * parent /*=0*/) :
QGraphicsPixmapItem(pixmap, parent),
m_originalPixmap(pixmap),
m_imageWidth(m_originalPixmap.width())
{
// set position with scene position.
setPos(scenePos);
setZValue(0.9);
// make the item selectable, movable & focusable
setFlag(QGraphicsItem::ItemIsSelectable, true);
setFlag(QGraphicsItem::ItemIsMovable, true);
setFlag(QGraphicsItem::ItemIsFocusable,true);
m_pageItem = static_cast<PageItem*> (parentItem());
//setPixmap(m_originalPixmap);
m_zoomDlg = new DroppedItemZoomDialog(this, 0);
m_zoomDlg->setValue(static_cast<int>(perc*100));
setPixmap(m_originalPixmap);
//qreal w = m_currentValue/100.0;
//setTransformationMode(Qt::SmoothTransformation);
//setTransform(QTransform().scale(w, w));
m_originalImage = m_originalPixmap.toImage();
}
DroppedItem::~DroppedItem()
{
qDebug("~DroppedItem()");
//if (m_pageItem)
//{
// delete m_pageItem;
// m_pageItem = 0;
//}
if(m_zoomDlg)
{
delete m_zoomDlg;
m_zoomDlg = 0;
}
}
int DroppedItem::type() const
{
return Type;
}
void DroppedItem::keyPressEvent(QKeyEvent * event)
{
if (event->key() == Qt::Key_Delete && isSelected())
{
// remove item when key press event is Suppr.
scene()->removeItem(this);
return;
}
else if(event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_Minus )
{
m_currentValue -= 5;
zoom(m_currentValue);
}
else if(event->modifiers() == Qt::AltModifier && event->key() == Qt::Key_Minus )
{
m_currentValue -= 1;
zoom(m_currentValue);
}
else if(event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_Equal )
{
m_currentValue += 5;
zoom(m_currentValue);
}
else if(event->modifiers() == Qt::AltModifier && event->key() == Qt::Key_Equal )
{
m_currentValue += 1;
zoom(m_currentValue);
}
else if(event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_0 )
{
zoom(100); //restore to 100%
}
else if(event->key() == Qt::Key_Left)
{
qreal x = this->pos().x();
this->setPos(x-5, pos().y());
//return;
}
else if(event->key() == Qt::Key_Right)
{
qreal x = this->pos().x();
this->setPos(x+5, pos().y());
//return;
}
else if(event->key() == Qt::Key_Up)
{
qreal y = this->pos().y();
this->setPos(pos().x(), y-5);
//return;
}
else if(event->key() == Qt::Key_Down)
{
qreal y = this->pos().y();
this->setPos(pos().x(), y+5);
//return;
}
else
{
//check if the new position is within the boundary of the page
QGraphicsPixmapItem::keyPressEvent(event);
}
checkBoundary( pos().x(), pos().y() );
}
void DroppedItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
m_zoomDlg->setValue(m_currentValue);
m_zoomDlg->exec();
}
void DroppedItem::zoom(int value)
{
m_currentValue = value;
//update(this->boundingRect().toRect());
prepareGeometryChange();
}
void DroppedItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if (event->button() != Qt::LeftButton)
{
event->ignore();
return;
}
checkBoundary(event->pos().toPoint(), true);
if(m_tweakingpart != "")
m_tweaking = true;
QGraphicsPixmapItem::mousePressEvent(event);
}
void DroppedItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if(m_tweaking)
{
QPoint pt = event->pos().toPoint();
m_rectangle = this->boundingRect().toRect();
qreal value = 1.0;
/*
if ( m_tweakingpart == "topLeft" ) m_rectangle . setTopLeft ( pt ) ;
else if ( m_tweakingpart == "topRight" ) m_rectangle . setTopRight ( pt ) ;
else if ( m_tweakingpart == "bottomLeft" ) m_rectangle . setBottomLeft ( pt ) ;
else if ( m_tweakingpart == "bottomRight" ) m_rectangle . setBottomRight ( pt ) ;
else if ( m_tweakingpart == "top" ) m_rectangle . setTop ( pt . y () ) ;
else
*/
/*else if ( m_tweakingpart == "left" ) m_rectangle . setLeft ( pt . x () ) ;*/
if ( m_tweakingpart == "bottomRight" ) { m_rectangle . setBottomRight ( pt ) ; value = static_cast<qreal> (m_rectangle.height() / (m_originalPixmap.height()*1.0) );}
else if ( m_tweakingpart == "bottom" ) { m_rectangle . setBottom ( pt . y () ) ; value = static_cast<qreal> (m_rectangle.height() / (m_originalPixmap.height()*1.0) );}
else if ( m_tweakingpart == "right" ) { m_rectangle . setRight ( pt . x () ) ; value = static_cast<qreal> (m_rectangle.width() / (m_originalPixmap.width() *1.0) );}
zoom(value*100);
}
else
{
QGraphicsPixmapItem::mouseMoveEvent(event);
}
}
void DroppedItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
m_tweaking = false ;
m_tweakingpart = "" ;
setCursor(QCursor(Qt::OpenHandCursor));
//QPointF pt = mapToScene(pos().x(), pos().y());
//pt = mapToItem(m_pageItem, pt);
QPointF pt = pos();
//pt.setX(pt.x() * m_currentValue/100.0);
//pt.setX(pt.y() * m_currentValue/100.0);
checkBoundary(pt.x(), pt.y());
QGraphicsPixmapItem::mouseReleaseEvent(event);
//setPixmap(m_originalPixmap);
}
void DroppedItem::checkBoundary(qreal x, qreal y)
{
//*
qreal w, h;
QPolygonF rec = mapToItem(m_pageItem, boundingRect());
w = rec.boundingRect().width();
h = rec.boundingRect().height();
if ( y < m_pageItem->margin().top())
y = m_pageItem->margin().top();
if ( x < m_pageItem->margin().left() )
x = m_pageItem->margin().left();
if ( x+w > (m_pageItem->width() - m_pageItem->margin().right()) )
x = m_pageItem->width() - m_pageItem->margin().right() - w;
if ( y+h > (m_pageItem->height() - m_pageItem->margin().bottom()) )
y = m_pageItem->height() - m_pageItem->margin().bottom() - h;
setPos(x, y);
}
void DroppedItem::checkBoundary(QPoint pt, bool t)
{
m_rectangle = this->boundingRect().toRect();
if ( m_rectangle.isValid() )
{
QPoint m_tl = m_rectangle.topLeft();
QPoint m_tr = m_rectangle.topRight();
QPoint m_bl = m_rectangle.bottomLeft();
QPoint m_br = m_rectangle.bottomRight();
const QPoint off(20, 20), offx(20, -20), offy(-20, 20);
if( QRect( m_br-off, m_br+off).contains(pt) )
{
if (t)
m_tweakingpart = "bottomRight" ;
this->setCursor( Qt::SizeFDiagCursor );
}
else if( QRect( m_bl+offx, m_br-offx ).contains(pt) )
{
if (t)
m_tweakingpart = "bottom";
this->setCursor( Qt::SizeVerCursor ) ;
}
else if( QRect( m_tr+offy, m_br-offy ).contains(pt) )
{
if (t)
m_tweakingpart = "right";
this->setCursor( Qt::SizeHorCursor );
}
}
}
void DroppedItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->drawImage(boundingRect().toRect(),getScaledImage());
}
QRectF DroppedItem::boundingRect() const
{
qreal w = (m_currentValue/100.0) * m_originalPixmap.width();
qreal h = (m_currentValue/100.0) * m_originalPixmap.height();
return QRectF(QPointF(0,0), QPointF(w, h));
}
QImage DroppedItem::getScaledImage()
{
//QImage originalImage = m_originalPixmap.toImage();
qreal w = (m_currentValue/100.0) * m_originalPixmap.width();
qreal h = (m_currentValue/100.0) * m_originalPixmap.height();
QSizeF size(w, h);
QImage image(size.toSize(), QImage::Format_RGB888);
image = m_originalImage.scaledToWidth(w, Qt::SmoothTransformation);
return image;
}