27 #include <QtGui/QPainter>
28 #include <QtGui/QColor>
29 #include <QtGui/QImage>
31 #include <QtGui/QLayout>
32 #include <QRubberBand>
39 #include <QtGui/QCursor>
40 #include <QtGui/QApplication>
41 #include <QMouseEvent>
57 QRect calcSelectionRectangle(
const QPoint &startPoint,
const QPoint & endPoint );
59 enum CursorState {
None=0, Resizing, Moving };
62 QPixmap m_unzoomedPixmap;
63 QPixmap m_originalPixmap;
64 QPixmap m_linedPixmap;
65 QRect m_selectedRegion;
69 double m_forcedAspectRatio;
71 int m_maxWidth, m_maxHeight;
74 QRubberBand *m_rubberBand;
78 :
QWidget( parent ), d(new Private(this))
80 QHBoxLayout * hboxLayout=
new QHBoxLayout(
this );
82 hboxLayout->addStretch();
83 QVBoxLayout * vboxLayout=
new QVBoxLayout();
84 hboxLayout->addItem(vboxLayout);
86 vboxLayout->addStretch();
87 d->m_label =
new QLabel(
this);
88 d->m_label->setAttribute(Qt::WA_NoSystemBackground,
true);
89 d->m_label->installEventFilter(
this );
91 vboxLayout->addWidget(d->m_label);
92 vboxLayout->addStretch();
94 hboxLayout->addStretch();
96 d->m_forcedAspectRatio=0;
99 d->m_rubberBand =
new QRubberBand(QRubberBand::Rectangle, d->m_label);
100 d->m_rubberBand->hide();
110 return d->m_unzoomedPixmap;
115 Q_ASSERT(!pixmap.isNull());
116 d->m_originalPixmap =
pixmap;
117 d->m_unzoomedPixmap =
pixmap;
118 d->m_label->setPixmap( pixmap );
124 d->m_selectedRegion = d->m_originalPixmap.rect();
125 d->m_rubberBand->hide();
131 return d->m_selectedRegion;
139 d->m_selectedRegion=rect;
146 void KPixmapRegionSelectorWidget::Private::updatePixmap()
148 Q_ASSERT(!m_originalPixmap.isNull());
149 if (m_originalPixmap.isNull()) { m_label->setPixmap(m_originalPixmap);
return; }
150 if (m_selectedRegion.width()>m_originalPixmap.width()) m_selectedRegion.setWidth( m_originalPixmap.width() );
151 if (m_selectedRegion.height()>m_originalPixmap.height()) m_selectedRegion.setHeight( m_originalPixmap.height() );
154 if (m_linedPixmap.isNull())
156 m_linedPixmap = m_originalPixmap;
157 QPainter p(&m_linedPixmap);
158 p.setCompositionMode(QPainter::CompositionMode_SourceAtop);
159 p.fillRect(m_linedPixmap.rect(),
QColor(0, 0, 0, 100));
162 QPixmap pixmap = m_linedPixmap;
163 painter.begin(&pixmap);
164 painter.drawPixmap( m_selectedRegion.topLeft(),
165 m_originalPixmap, m_selectedRegion );
170 m_label->setPixmap(pixmap);
172 qApp->sendPostedEvents(0,QEvent::LayoutRequest);
174 if (m_selectedRegion == m_originalPixmap.rect())
175 m_rubberBand->hide();
178 m_rubberBand->setGeometry(
QRect(m_selectedRegion.topLeft(),
179 m_selectedRegion.size()));
184 if (m_state!=None) m_rubberBand->show();
194 popup->setObjectName(
"PixmapRegionSelectorPopup");
198 action->setText(
i18n(
"&Rotate Clockwise"));
199 action->setIcon(
KIcon(
"object-rotate-right" ) );
200 connect( action, SIGNAL(triggered(
bool)),
this, SLOT(
rotateClockwise()) );
202 popup->addAction(action);
204 action = actions->
addAction(
"rotatecounterclockwise");
205 action->setText(
i18n(
"Rotate &Counterclockwise"));
206 action->setIcon(
KIcon(
"object-rotate-left" ) );
209 popup->addAction(action);
220 int w=d->m_originalPixmap.width();
221 int h=d->m_originalPixmap.height();
222 QImage img=d->m_unzoomedPixmap.toImage();
224 img = img.transformed(QTransform().
rotate(90.0));
226 img = img.transformed(QTransform().
rotate(180.0));
228 img = img.transformed(QTransform().
rotate(270.0));
230 d->m_unzoomedPixmap=QPixmap::fromImage(img);
232 img=d->m_originalPixmap.toImage();
234 img = img.transformed(QTransform().
rotate(90.0));
236 img = img.transformed(QTransform().
rotate(180.0));
238 img = img.transformed(QTransform().
rotate(270.0));
240 d->m_originalPixmap=QPixmap::fromImage(img);
242 d->m_linedPixmap=QPixmap();
244 if (d->m_forcedAspectRatio>0 && d->m_forcedAspectRatio!=1)
252 int x=h-d->m_selectedRegion.y()-d->m_selectedRegion.height();
253 int y=d->m_selectedRegion.x();
254 d->m_selectedRegion.setRect(x, y, d->m_selectedRegion.height(), d->m_selectedRegion.width() );
262 int x=d->m_selectedRegion.y();
263 int y=w-d->m_selectedRegion.x()-d->m_selectedRegion.width();
264 d->m_selectedRegion.setRect(x, y, d->m_selectedRegion.height(), d->m_selectedRegion.width() );
286 bool KPixmapRegionSelectorWidget::eventFilter(
QObject *obj, QEvent *ev)
288 if ( ev->type() == QEvent::MouseButtonPress )
290 QMouseEvent *mev= (QMouseEvent *)(ev);
293 if ( mev->button() == Qt::RightButton )
296 popup->exec( mev->globalPos() );
303 if ( d->m_selectedRegion.contains( mev->pos() )
304 && d->m_selectedRegion!=d->m_originalPixmap.rect() )
306 d->m_state=Private::Moving;
307 cursor.setShape( Qt::SizeAllCursor );
308 d->m_rubberBand->show();
312 d->m_state=Private::Resizing;
313 cursor.setShape( Qt::CrossCursor );
315 QApplication::setOverrideCursor(cursor);
317 d->m_tempFirstClick=mev->pos();
323 if ( ev->type() == QEvent::MouseMove )
325 QMouseEvent *mev= (QMouseEvent *)(ev);
329 if ( d->m_state == Private::Resizing )
332 d->calcSelectionRectangle( d->m_tempFirstClick, mev->pos() ) );
334 else if (d->m_state == Private::Moving )
338 bool mouseOutside=
false;
341 d->m_selectedRegion.translate(-d->m_selectedRegion.x(),0);
344 else if ( mevx > d->m_originalPixmap.width() )
346 d->m_selectedRegion.translate(d->m_originalPixmap.width()-d->m_selectedRegion.width()-d->m_selectedRegion.x(),0);
351 d->m_selectedRegion.translate(0,-d->m_selectedRegion.y());
354 else if ( mevy > d->m_originalPixmap.height() )
356 d->m_selectedRegion.translate(0,d->m_originalPixmap.height()-d->m_selectedRegion.height()-d->m_selectedRegion.y());
359 if (mouseOutside) { d->updatePixmap();
return true; };
361 d->m_selectedRegion.translate( mev->x()-d->m_tempFirstClick.x(),
362 mev->y()-d->m_tempFirstClick.y() );
365 if (d->m_selectedRegion.x() < 0)
366 d->m_selectedRegion.translate(-d->m_selectedRegion.x(),0);
367 else if (d->m_selectedRegion.right() > d->m_originalPixmap.width())
368 d->m_selectedRegion.translate(-(d->m_selectedRegion.right()-d->m_originalPixmap.width()),0);
370 if (d->m_selectedRegion.y() < 0)
371 d->m_selectedRegion.translate(0,-d->m_selectedRegion.y());
372 else if (d->m_selectedRegion.bottom() > d->m_originalPixmap.height())
373 d->m_selectedRegion.translate(0,-(d->m_selectedRegion.bottom()-d->m_originalPixmap.height()));
375 d->m_tempFirstClick=mev->pos();
381 if ( ev->type() == QEvent::MouseButtonRelease )
383 QMouseEvent *mev= (QMouseEvent *)(ev);
385 if ( d->m_state == Private::Resizing && mev->pos() == d->m_tempFirstClick)
388 d->m_state=Private::None;
389 QApplication::restoreOverrideCursor();
390 d->m_rubberBand->hide();
394 QWidget::eventFilter(obj, ev);
398 QRect KPixmapRegionSelectorWidget::Private::calcSelectionRectangle(
const QPoint & startPoint,
const QPoint & _endPoint )
400 QPoint endPoint = _endPoint;
401 if ( endPoint.x() < 0 ) endPoint.setX(0);
402 else if ( endPoint.x() > m_originalPixmap.width() ) endPoint.setX(m_originalPixmap.width());
403 if ( endPoint.y() < 0 ) endPoint.setY(0);
404 else if ( endPoint.y() > m_originalPixmap.height() ) endPoint.setY(m_originalPixmap.height());
405 int w=abs(startPoint.x()-endPoint.x());
406 int h=abs(startPoint.y()-endPoint.y());
408 if (m_forcedAspectRatio>0)
410 double aspectRatio=w/
double(h);
412 if (aspectRatio>m_forcedAspectRatio)
413 h=(int)(w/m_forcedAspectRatio);
415 w=(int)(h*m_forcedAspectRatio);
419 if ( startPoint.x() < endPoint.x() )
423 if ( startPoint.y() < endPoint.y() )
432 h=(int)(w/m_forcedAspectRatio);
434 if ( startPoint.y() > endPoint.y() )
437 else if (x+w>m_originalPixmap.width())
439 w=m_originalPixmap.width()-x;
440 h=(int)(w/m_forcedAspectRatio);
442 if ( startPoint.y() > endPoint.y() )
449 w=(int)(h*m_forcedAspectRatio);
451 if ( startPoint.x() > endPoint.x() )
454 else if (y+h>m_originalPixmap.height())
456 h=m_originalPixmap.height()-y;
457 w=(int)(h*m_forcedAspectRatio);
459 if ( startPoint.x() > endPoint.x() )
463 return QRect(x,y,w,h);
468 return QRect((
int)(d->m_selectedRegion.x()/d->m_zoomFactor),
469 (
int)(d->m_selectedRegion.y()/d->m_zoomFactor),
470 (
int)(d->m_selectedRegion.width()/d->m_zoomFactor),
471 (
int)(d->m_selectedRegion.height()/d->m_zoomFactor));
476 QImage origImage=d->m_unzoomedPixmap.toImage();
482 d->m_forcedAspectRatio=width/
double(height);
487 d->m_forcedAspectRatio=0;
493 d->m_maxHeight=height;
495 if (d->m_selectedRegion == d->m_originalPixmap.rect()) d->m_selectedRegion=
QRect();
496 d->m_originalPixmap=d->m_unzoomedPixmap;
501 if ( !d->m_originalPixmap.isNull() &&
502 ( d->m_originalPixmap.width() > d->m_maxWidth ||
503 d->m_originalPixmap.height() > d->m_maxHeight ) )
506 QImage image=d->m_originalPixmap.toImage();
507 d->m_originalPixmap=QPixmap::fromImage( image.scaled( width, height, Qt::KeepAspectRatio,Qt::SmoothTransformation ) );
508 double oldZoomFactor = d->m_zoomFactor;
509 d->m_zoomFactor=d->m_originalPixmap.width()/(
double)d->m_unzoomedPixmap.width();
511 if (d->m_selectedRegion.isValid())
514 QRect((
int)(d->m_selectedRegion.x()*d->m_zoomFactor/oldZoomFactor),
515 (
int)(d->m_selectedRegion.y()*d->m_zoomFactor/oldZoomFactor),
516 (
int)(d->m_selectedRegion.width()*d->m_zoomFactor/oldZoomFactor),
517 (
int)(d->m_selectedRegion.height()*d->m_zoomFactor/oldZoomFactor) );
521 if (!d->m_selectedRegion.isValid()) d->m_selectedRegion = d->m_originalPixmap.rect();
523 d->m_linedPixmap=QPixmap();
525 resize(d->m_label->width(), d->m_label->height());
528 #include "kpixmapregionselectorwidget.moc"