/************************************************************************ * $Id: fullpageview.cpp 667 2011-05-15 10:41:45Z elzubeir $ * * ------------ * Description: * ------------ * * (C) Copyright 2009-2011 ALLCONTENT. All rights reserved. * * ----------------- * Revision Details: (Updated by Revision Control System) * ----------------- * $Date: 2011-05-15 14:41:45 +0400 (Sun, 15 May 2011) $ * $Author: elzubeir $ * $Revision: 667 $ * $HeadURL: file:///opt/svn/socialhose/trunk/app/ClippingStation/fullpageview.cpp $ * ************************************************************************/ #include "fullpageview.h" #include #include #include #include "clippingstation.h" #include "constants.h" #include "fullpagescene.h" #include "imagecutout.h" FullPageView::FullPageView(QWidget * parent) : QGraphicsView(parent), m_clippingStation(0), m_rubberBand(0), m_scale(1.0), m_rotationAngle(0.0), m_pageLayout(BEST_FIT), m_selectionAreaType(IMAGE), m_selectionMode(SELECT) { // construct the scene m_scene = new FullPageScene(this); setScene(m_scene); setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); //m_pageLayout = ACTUAL_SIZE; //m_selectionAreaType = IMAGE; m_selectionMode = SELECT; m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this); tweaking = false ; mousePressed = false; } FullPageView::~FullPageView() { qDebug("~FullPageView()"); if(m_rubberBand) delete m_rubberBand; m_rubberBand = 0; if (m_scene) delete m_scene; m_scene = 0; } void FullPageView::setClippingStation(ClippingStation* clippingStation) { m_clippingStation = clippingStation; } ClippingStation * FullPageView::getClippingStation() const { return m_clippingStation; } bool FullPageView::load(const QString & fileName) { // call the scene to load pixmap. setCursor(Qt::BusyCursor); m_scene->setfileName(fileName); bool loaded = m_scene->loadPixmap(QPixmap(fileName)); if(loaded && m_scale >= MIN_SCALE && m_scale <= MAX_SCALE) { setPageLayout(m_pageLayout); m_scene->transform(m_scale, m_rotationAngle); m_clippingStation->displayZoomStatus(m_scale); m_scene->setSceneRect( m_scene->itemsBoundingRect() ); this->setSceneRect(m_scene->itemsBoundingRect() ); m_currentPageName = fileName; //now load the highlighted keywords now } m_currentPageName = fileName; unsetCursor(); return loaded; } void FullPageView::leaveEvent(QEvent * event) { // when mouse leave the view, we clear the status message. if (m_clippingStation) { m_clippingStation->clearStatusMessage(); } } void FullPageView::mouseDoubleClickEvent(QMouseEvent *event) { qDebug() << "mouseDoubleClickEvent()"; if (!m_scene->isPointIsOnImageItem(mapToScene(event->pos()))) { //m_scene->removeImageCutout(); return; } QPointF point = mapToScene(event->pos()); point = mapToImageItem(point); qDebug() << "point clicked: " << point.toPoint(); //get the word under the mouse QList tc = m_scene->tagCoorindates(); qDebug() << "tag coordinates count: " <boundingRect().toRect(); if(rect->contains(point)) { qDebug() << "press is inside a keyword rect"; //found, we load the related keyword for this tag. QString tag = tc[i].tag(); QStringList keywords = m_clippingStation->getRelatedKeywords(tag); tc[i].setRelatedKeywords(keywords); foreach (QGraphicsRectItem *rec2, tc[i].rectItems() ) rec2->setToolTip(keywords.join("\n")); return; } } } qDebug() << "end of mouseDoubleClickEvent()"; } void FullPageView::mousePressEvent(QMouseEvent *event) { //if selection not on image item, we return if (!m_scene->isPointIsOnImageItem(mapToScene(event->pos()))) { //m_scene->removeImageCutout(); return; } // if click not occurs in selection Rect, we don't do anything. if (! m_scene->isPointIsOnImageCutoutItem(mapToScene(event->pos())) && m_selectionMode == SELECT) { m_selectionAreaType = IMAGE; m_origin = event->pos(); // keep position if (!m_rubberBand) { m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this); } m_rubberBand->setGeometry( QRect(m_origin, QSize()) ); m_rubberBand->show(); //m_isModified = false; } QGraphicsView::mousePressEvent(event); } void FullPageView::mouseMoveEvent(QMouseEvent *event) { if (m_rubberBand && (event->buttons() & Qt::LeftButton) ) { m_rubberBand->setGeometry(QRect(m_origin, event->pos()).normalized()); // draw select rect } if (m_clippingStation) { QPointF scenePos = mapToScene(event->pos()); // if we draw the selection rect, we display coordinates in the staus bar + width and height values. // if not, we only display mouse coordinates. if (m_rubberBand && m_rubberBand->isVisible()) { QPointF sceneOrigin = mapToScene(m_origin); QPointF itemOrigin = mapToImageItem(sceneOrigin); QPointF itemPos = mapToImageItem(scenePos); m_clippingStation->displayCoordinatesStatus(itemOrigin.x(), itemOrigin.y(), qAbs(itemPos.x() - itemOrigin.x()), qAbs(itemPos.y() - itemOrigin.y())); } else { if (m_scene->isSourceImageIsLoad()) { QPointF pointInItem = mapToImageItem(scenePos); m_clippingStation->displayCoordinatesStatus(pointInItem.x(), pointInItem.y()); } } } QPointF pt = mapToScene(event->pos()); pt = mapToImageItem(pt); if(m_scene->isPointIsOnImageCutoutItem( pt ) ) { //static int i=0; //qDebug("%d\tIn item", i++); m_scene->currentImageCutout()->checkBoundary(pt.toPoint(), false ); } QGraphicsView::mouseMoveEvent(event); } QPointF FullPageView::mapToImageItem(const QPointF & scenePos) const { return m_scene->mapToImageItem(scenePos); } void FullPageView::mouseReleaseEvent(QMouseEvent *event) { if(m_selectionMode != SELECT) { QGraphicsView::mouseReleaseEvent(event); return; } // after releasing the mouse, we create the selection rect. if (m_rubberBand && m_rubberBand->isVisible()) { if (m_scene->isSourceImageIsLoad()) // check if an image is loaded. { //m_scene->createImageCutout(mapToScene(m_rubberBand->geometry()), m_rotationAngle); //the old way QPointF sceneOrigin = mapToScene(m_origin); //now we map the values to the image item directly, this helps us to make a selection... QPointF itemOrigin = mapToImageItem(sceneOrigin); //regardless of zooming/rotating values QPointF scenePos = mapToScene(event->pos()); QPointF itemPos = mapToImageItem(scenePos); QRectF rec(itemOrigin.x(), itemOrigin.y(), (itemPos.x() - itemOrigin.x()), (itemPos.y() - itemOrigin.y())); rec = rec.normalized(); if( rec.width() < 20.0 && rec.height() < 20 ) { QGraphicsView::mouseReleaseEvent(event); return; } QPolygonF ply(rec); m_scene->createImageCutout(ply, m_rotationAngle, m_currentPageName, m_selectionAreaType); } //if(!m_isModified) m_rubberBand->hide(); } QGraphicsView::mouseReleaseEvent(event); } void FullPageView::rotate(double rotateAngle) { if (m_scene->isSourceImageIsLoad()) // check if an image is loaded. { m_rotationAngle = rotateAngle; m_scene->transform(m_scale, m_rotationAngle); m_clippingStation->displayRotationAngleStatus(m_rotationAngle); m_scene->setSceneRect(m_scene->itemsBoundingRect() ); } } qreal FullPageView::zoom(bool zoomin) { if (m_scene->isSourceImageIsLoad()) // check if an image is loaded. { // compute scale qreal oldscale = m_scale; qreal sc = ::pow(2, zoomin? ZOOM_FACTOR : -ZOOM_FACTOR); m_scale *= sc; m_scale = qMin(m_scale, MAX_SCALE); m_scale = qMax(m_scale, MIN_SCALE); if (m_scale >= MIN_SCALE && m_scale <= MAX_SCALE) { m_scene->transform(m_scale, m_rotationAngle); m_clippingStation->displayZoomStatus(m_scale); m_scene->setSceneRect(m_scene->itemsBoundingRect() ); this->setSceneRect(m_scene->itemsBoundingRect() ); } return oldscale; } return m_scale; } qreal FullPageView::actualSize() { qreal oldscale = m_scale; if (m_scene->isSourceImageIsLoad()) // check if an image is loaded. { m_scale = 1.0; m_scene->transform(m_scale, m_rotationAngle); m_clippingStation->displayZoomStatus(m_scale); m_scene->setSceneRect(m_scene->itemsBoundingRect() ); this->setSceneRect(m_scene->itemsBoundingRect() ); } return oldscale; } void FullPageView::setScale(qreal scale) { m_scale = scale; m_scene->transform(m_scale, m_rotationAngle); m_clippingStation->displayZoomStatus(m_scale); m_scene->setSceneRect(m_scene->itemsBoundingRect() ); this->setSceneRect(m_scene->itemsBoundingRect() ); } void FullPageView::resizeEvent(QResizeEvent* event) { if( m_pageLayout != ACTUAL_SIZE ) { actualSize(); //just reset the page to default qreal w = rect().width(); qreal h = rect().height(); qreal sceneWidth = m_scene->itemsBoundingRect().width(); qreal sceneHeight = m_scene->itemsBoundingRect().height(); //calculate the ratio qreal precW = w/sceneWidth; qreal precH = h/sceneHeight; qreal prec = precW; if (m_pageLayout == BEST_FIT) prec = qMin(precW, precH); //calculate the ratio m_scale = prec; m_scene->transform(m_scale, m_rotationAngle); m_clippingStation->displayZoomStatus(m_scale); m_scene->setSceneRect(m_scene->itemsBoundingRect() ); this->setSceneRect(m_scene->itemsBoundingRect() ); } //else { //to show the scroll bar as page changes m_scene->setSceneRect(m_scene->itemsBoundingRect() ); this->setSceneRect(m_scene->itemsBoundingRect() ); } int w = (int)this->rect().width(); int h = (int)this->rect().height(); int x = (int)this->rect().x(); int y = (int)this->rect().y(); //static int i = 0; //qDebug("%d: (%d,%d) -> (%d,%d)", i++, x, y, w, h); w = (int)m_scene->itemsBoundingRect().width(); h = (int)m_scene->itemsBoundingRect().height(); x = (int)m_scene->itemsBoundingRect().x(); y = (int)m_scene->itemsBoundingRect().y(); //qDebug("\t\t(%d,%d) -> (%d,%d)", x, y, w, h); QGraphicsView::resizeEvent(event); } void FullPageView::setPageLayout(PAGE_LAYOUT layout) { m_pageLayout = layout; if( m_pageLayout != ACTUAL_SIZE ) { actualSize(); //just reset the page to default //fitInView((QGraphicsItem*)m_scene->imageItem(), Qt::KeepAspectRatio); qreal w = rect().width(); qreal h = rect().height(); qreal sceneWidth = m_scene->itemsBoundingRect().width(); qreal sceneHeight = m_scene->itemsBoundingRect().height(); //calculate the ratio qreal precW = w/sceneWidth; qreal precH = h/sceneHeight; qreal prec = precW; if (m_pageLayout == BEST_FIT) prec = qMin(precW, precH); //calculate the ratio m_scale = prec; this->setSceneRect(QRectF(QPoint(0, 0), QSize() ) ); m_scene->transform(m_scale, m_rotationAngle); m_clippingStation->displayZoomStatus(m_scale); m_scene->setSceneRect(m_scene->itemsBoundingRect() ); } else { //to show the scroll bar as page changes //this->setSceneRect(QRectF(QPoint(0, 0), QSize() ) ); //m_scene->setSceneRect(m_scene->itemsBoundingRect() ); } } void FullPageView::keyPressEvent(QKeyEvent *key) { if(key->key() == Qt::Key_I) { m_selectionAreaType = IMAGE; } else if(key->key() == Qt::Key_T) m_selectionAreaType = TITLE; else if(key->key() == Qt::Key_B) m_selectionAreaType = BODY; else if(key->modifiers() == Qt::ControlModifier && key->key() == Qt::Key_A) { QPolygonF ply(m_scene->imageBoundingRect()); m_scene->createImageCutout(ply, m_rotationAngle, m_currentPageName, m_selectionAreaType); } //else //to propogate the call to the items in the view QGraphicsView::keyPressEvent(key); } void FullPageView::setSelectionMode(SELECTION_MODE selectionMode) { m_selectionMode = selectionMode; } const QList FullPageView::imageCutoutsList() const { return m_scene->imageCutoutsList(); } void FullPageView::removeImageCutouts() { m_scene->removeImageCutouts(); } void FullPageView::removePreselectedImageCutouts() { m_scene->removePreselectedImageCutouts(); } void FullPageView::hideImageCutouts() { m_scene->hideImageCutouts(); } void FullPageView::setImageCutouts(QList cutouts) { m_scene->setImageCutouts(cutouts); } void FullPageView::setPreselectedImageCutouts(QList cutouts) { m_scene->setPreselectedImageCutouts(cutouts); } int FullPageView::preselectedImageCutoutsCount() { return m_scene->preselectedImageCutoutsCount(); } qreal FullPageView::pageSize() { return m_scene->pageSize(); } QImage FullPageView::screenShot() { return m_scene->screenShot(); } void FullPageView::setOrderMode(bool set) { if(set) m_selectionMode = ORDER; else m_selectionMode = SELECT; m_scene->setOrderMode(set); } void FullPageView::addWordCoordinates(QList &tagW) { m_scene->addWordCoordinates(tagW); } void FullPageView::addTagCoordinates(QList &tagH) { m_scene->addTagCoordinates(tagH); } void FullPageView::addTags(QList &tagIds, QStringList tagCoord, bool removedAndThenAdd) { m_clippingStation->addTagsToTagWrapper(tagIds, tagCoord, removedAndThenAdd); } QString FullPageView::text() { return m_scene->text(); } void FullPageView::setImageVisibility(bool show) { m_scene->setImageVisibility(show); }