After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 318 B |
After Width: | Height: | Size: 318 B |
After Width: | Height: | Size: 277 B |
After Width: | Height: | Size: 277 B |
After Width: | Height: | Size: 217 B |
After Width: | Height: | Size: 217 B |
@ -0,0 +1,155 @@ |
|||||||
|
|
||||||
|
#include "UBMagnifer.h" |
||||||
|
#include <QPainter> |
||||||
|
#include <QPixmap> |
||||||
|
#include <QDebug> |
||||||
|
#include <QWidget> |
||||||
|
#include <QGraphicsView> |
||||||
|
#include <QTimerEvent> |
||||||
|
#include <QBitmap> |
||||||
|
#include <QPen> |
||||||
|
|
||||||
|
UBMagnifer::UBMagnifer(QWidget *parent)
|
||||||
|
: QWidget(parent) |
||||||
|
, gView(0) |
||||||
|
, mView(0) |
||||||
|
, sizePercentFromScene(20) |
||||||
|
, inTimer(false) |
||||||
|
, borderPen(Qt::darkGray) |
||||||
|
{ |
||||||
|
borderPen.setWidth(2); |
||||||
|
} |
||||||
|
|
||||||
|
UBMagnifer::~UBMagnifer() |
||||||
|
{ |
||||||
|
if (timerUpdate != 0) |
||||||
|
{ |
||||||
|
killTimer(timerUpdate); |
||||||
|
timerUpdate = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void UBMagnifer::setSize(int percentFromScene)
|
||||||
|
{ |
||||||
|
if(gView == NULL) return; |
||||||
|
|
||||||
|
// calculate object size
|
||||||
|
sizePercentFromScene = percentFromScene; |
||||||
|
QSize sceneSize = gView->size(); |
||||||
|
int size = sizePercentFromScene * sceneSize.width() / 100; |
||||||
|
|
||||||
|
setGeometry(0, 0, size, size); |
||||||
|
|
||||||
|
// prepare transparent bit mask
|
||||||
|
QImage mask_img(width(), height(), QImage::Format_Mono); |
||||||
|
mask_img.fill(0xff); |
||||||
|
QPainter mask_ptr(&mask_img); |
||||||
|
mask_ptr.setBrush( QBrush( QColor(0, 0, 0) ) ); |
||||||
|
mask_ptr.drawEllipse(QPoint(size/2, size/2), size/2, size/2); |
||||||
|
bmpMask = QBitmap::fromImage(mask_img); |
||||||
|
|
||||||
|
// prepare general image
|
||||||
|
pMap = QPixmap(width(), height()); |
||||||
|
pMap.fill(Qt::transparent); |
||||||
|
pMap.setMask(bmpMask); |
||||||
|
} |
||||||
|
|
||||||
|
void UBMagnifer::setZoom(int z)
|
||||||
|
{ |
||||||
|
zoom = z; |
||||||
|
|
||||||
|
zWidth = size().width() / zoom; |
||||||
|
zWidthHalf = zWidth / 2; |
||||||
|
zHeight = size().height() / zoom; |
||||||
|
zHeightHalf = zHeight / 2; |
||||||
|
} |
||||||
|
|
||||||
|
void UBMagnifer::paintEvent(QPaintEvent *) |
||||||
|
{ |
||||||
|
QPainter p(this); |
||||||
|
p.drawPixmap(0, 0, pMap); |
||||||
|
|
||||||
|
// in future replace to image border
|
||||||
|
QPen pen(Qt::darkGray); |
||||||
|
pen.setWidth(2); |
||||||
|
p.setPen(borderPen); |
||||||
|
p.drawEllipse(QPoint( size().width() / 2, size().height() / 2), size().width() / 2, size().height() / 2); |
||||||
|
} |
||||||
|
|
||||||
|
void UBMagnifer::timerEvent(QTimerEvent *e) |
||||||
|
{ |
||||||
|
if(inTimer) return; |
||||||
|
if (e->timerId() == timerUpdate) |
||||||
|
{ |
||||||
|
inTimer = true; |
||||||
|
if(!(updPoint.isNull())) grabPoint(updPoint); |
||||||
|
if(!(updPointF.isNull()))grabPoint(updPointF); |
||||||
|
inTimer = false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void UBMagnifer::grabPoint(const QPoint &point) |
||||||
|
{ |
||||||
|
QPointF itemPos = gView->mapFromGlobal(point); |
||||||
|
|
||||||
|
int x = itemPos.x() - zWidthHalf; |
||||||
|
int y = itemPos.y() - zHeightHalf; |
||||||
|
|
||||||
|
QPixmap newPixMap(QSize(zWidth,zHeight)); |
||||||
|
((QWidget*)gView)->render(&newPixMap, QPoint(0, 0), QRegion(x, y, zWidth, zHeight)); |
||||||
|
pMap.fill(Qt::transparent); |
||||||
|
pMap = newPixMap.scaled(QSize(width(), height())); |
||||||
|
pMap.setMask(bmpMask); |
||||||
|
|
||||||
|
update(); |
||||||
|
} |
||||||
|
|
||||||
|
void UBMagnifer::grabPoint(const QPointF &point) |
||||||
|
{ |
||||||
|
QPoint itemPos = gView->mapFromScene(point); |
||||||
|
|
||||||
|
int x = itemPos.x() - zWidthHalf; |
||||||
|
int y = itemPos.y() - zHeightHalf; |
||||||
|
|
||||||
|
QPixmap newPixMap(QSize(zWidth,zHeight)); |
||||||
|
((QWidget*)gView)->render(&newPixMap, QPoint(0, 0), QRegion(x, y, zWidth, zHeight)); |
||||||
|
pMap.fill(Qt::transparent); |
||||||
|
pMap = newPixMap.scaled(QSize(width(), height())); |
||||||
|
pMap.setMask(bmpMask); |
||||||
|
|
||||||
|
update(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// from global
|
||||||
|
void UBMagnifer::grabNMove(const QPoint &point, bool needGrab = true) |
||||||
|
{ |
||||||
|
updPoint = point; |
||||||
|
|
||||||
|
if(needGrab) |
||||||
|
grabPoint(point); |
||||||
|
QPoint itemPos = mView->mapFromGlobal(point); |
||||||
|
move(itemPos.x() - width()/2, itemPos.y() - height()/2); |
||||||
|
// move(itemPos.x(), itemPos.y());
|
||||||
|
} |
||||||
|
|
||||||
|
// from scene
|
||||||
|
void UBMagnifer::grabNMove(const QPointF &point, bool needGrab = true) |
||||||
|
{ |
||||||
|
updPointF = point; |
||||||
|
|
||||||
|
if(needGrab) |
||||||
|
grabPoint(point); |
||||||
|
QPoint itemPos = mView->mapFromScene(point); |
||||||
|
move(itemPos.x() - width()/2, itemPos.y() - height()/2); |
||||||
|
// move(itemPos.x(), itemPos.y());
|
||||||
|
} |
||||||
|
|
||||||
|
void UBMagnifer::setGrabView(QGraphicsView *view) |
||||||
|
{ |
||||||
|
if (timerUpdate != 0) |
||||||
|
killTimer(timerUpdate); |
||||||
|
gView = view; |
||||||
|
timerUpdate = startTimer(200); |
||||||
|
} |
||||||
|
|
@ -0,0 +1,60 @@ |
|||||||
|
|
||||||
|
#ifndef UBMAGNIFER_H |
||||||
|
#define UBMAGNIFER_H |
||||||
|
|
||||||
|
#include <QWidget> |
||||||
|
#include <QBitmap> |
||||||
|
#include <QPen> |
||||||
|
|
||||||
|
class QPixmap; |
||||||
|
class QBitmap; |
||||||
|
class QPen; |
||||||
|
class QGraphicsView; |
||||||
|
|
||||||
|
class UBMagnifer : public QWidget |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
public: |
||||||
|
UBMagnifer(QWidget *parent = 0); |
||||||
|
~UBMagnifer(); |
||||||
|
|
||||||
|
void setSize(int percentFromScene); |
||||||
|
void setZoom(int z); |
||||||
|
|
||||||
|
void setGrabView(QGraphicsView *view); |
||||||
|
void setMoveView(QGraphicsView *view) {mView = view;} |
||||||
|
|
||||||
|
void grabPoint(const QPoint &point); |
||||||
|
void grabPoint(const QPointF &point); |
||||||
|
void grabNMove(const QPoint &point, bool needGrab); |
||||||
|
void grabNMove(const QPointF &point, bool needGrab); |
||||||
|
|
||||||
|
protected: |
||||||
|
void paintEvent(QPaintEvent *); |
||||||
|
void timerEvent(QTimerEvent *); |
||||||
|
|
||||||
|
int sizePercentFromScene; |
||||||
|
|
||||||
|
|
||||||
|
private: |
||||||
|
int zoom; |
||||||
|
int zWidth; |
||||||
|
int zHeight; |
||||||
|
int zWidthHalf; |
||||||
|
int zHeightHalf; |
||||||
|
bool inTimer; |
||||||
|
|
||||||
|
int timerUpdate; |
||||||
|
QPoint updPoint; |
||||||
|
QPointF updPointF; |
||||||
|
|
||||||
|
QPixmap pMap; |
||||||
|
QBitmap bmpMask; |
||||||
|
QPen borderPen; |
||||||
|
|
||||||
|
QGraphicsView *gView; |
||||||
|
QGraphicsView *mView; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // UBMAGNIFER_H
|