// SquidPortrait.cpp: implementation of the SquidPortrait class. // ////////////////////////////////////////////////////////////////////// #include <qdockwindow.h> #include <qframe.h> #include <qimage.h> #include <qlabel.h> #include <qpainter.h> #include <qpixmap.h> #include <qwmatrix.h> #include "SquidPortrait.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// SquidPortrait::SquidPortrait( QWidget* p, QImage* i ) : QFrame( p ), image( i ), diffs( NULL ) { buf = new QPixmap( *i ); resize( i->size() ); setMaximumSize( i->size() ); } SquidPortrait::~SquidPortrait() { } void SquidPortrait::drawContents( QPainter* p ) { buf->fill(); buf->convertFromImage( *image ); *buf = buf->xForm( zoom ); QRect r = contentsRect(); bitBlt ( this, r.x(), r.y(), buf ); if ( diffs ) { p->begin( this ); QValueList<QRect>::iterator it; for ( it = diffs->begin(); it != diffs->end(); ++it ) { QRect r = zoom.mapRect( *it ); p->drawWinFocusRect( r ); } p->end(); } } void SquidPortrait::Zoom( float factor ) { zoom = QWMatrix(); zoom.scale( factor, factor ); buf->resize( image->width()*factor, image->height()*factor ); setMaximumSize( buf->size() ); resize( buf->size() ); QPainter p; drawContents( &p ); } void SquidPortrait::mousePressEvent( QMouseEvent* e ) { QFrame::mousePressEvent( e ); if ( !diffs ) return; QValueList<QRect>::iterator it; for ( it = diffs->begin(); it != diffs->end(); ++it ) { QRect r = zoom.mapRect( *it ); if ( r.contains( e->pos() ) ) { ShowDiff( r, e->pos() ); return; } } } void SquidPortrait::ShowDiff( QRect r, QPoint pos ) { QDockWindow* fdiff = new QDockWindow ( QDockWindow::OutsideDock, this, "", WDestructiveClose ); fdiff->setCloseMode( QDockWindow::Always ); QLabel* ldiff = new QLabel( fdiff, "", WDestructiveClose ); QWMatrix dzoom; dzoom.scale( 2.0, 2.0 ); QPixmap dmap( r.size() ); bitBlt( &dmap, 0, 0, buf, r.x(), r.y(), r.width(), r.height() ); dmap = dmap.xForm( dzoom ); ldiff->setPixmap( dmap ); ldiff->resize( r.size() ); fdiff->setWidget( ldiff ); fdiff->resize( r.size() ); fdiff->move( mapToGlobal( QPoint( r.x(), r.y() ) ) ); fdiff->show(); }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 2401 | Sam Stafford |
Rename SID to SQUID - avoids conflicts with another program. Also lets me use cool squid icon. |
||
//guest/sam_stafford/sid/src/SidPortrait.cpp | |||||
#5 | 2048 | Sam Stafford |
You can now click on highlighted diffs to get 2x zoomed versions of them ("detail views" or something) in floating windows. |
||
#4 | 2036 | Sam Stafford |
Uber-L33T "highlight" feature. Has to be seen to be believed. |
||
#3 | 2034 | Sam Stafford |
Working "subtraction" diff and zooming. Definitely need to make some decent toolbutton icons. |
||
#2 | 2030 | Sam Stafford |
Scrolling. It's not perfect, but I'm happy enough with it to move on with my life. |
||
#1 | 2016 | Sam Stafford |
Barely-functional Sid (about three hours worth of code). "Sid" = "Sam's Image Differ", for those who were curious. |