[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-devel
Subject:    widget for pixel graphic apps (pixie, kis,...) for free ;-) (was: suggestion for pixel-based graphic
From:       aleXXX <alexander.neundorf () rz ! tu-ilmenau ! de>
Date:       2000-03-07 9:17:50
[Download RAW message or body]

Hi,

some time ago I made the suggestion for a small display which shows the area
around the mouse pointer heavily zoomed.
Yesterday in the evening I hacked it together, you can do with it whatever you
want, no restriction in any way.

It is still qt 1.44, but the changes should be minimal.

Bye
Alex
-- 
If they say it's necessary to be disciplined and trained
To transform their new ideas into history and pain
Simply say no
Just let them feel you disagree

["mag.cpp" (text/x-c++)]

#include "mag.h"

#include <qevent.h>
#include <qpainter.h>
#include <qpixmap.h>
#include <qapplication.h>

WidgetMagnifier::WidgetMagnifier(int zoomLevel, int pixels, QWidget *magnifiedWidget, \
QWidget *parent, const char *name) :QWidget(parent,name)
,magnifiedOne(magnifiedWidget)
,centerX(0)
,centerY(0)
,globalCenterX(0)
,globalCenterY(0)
,copyX(-1)
,copyY(-1)
,offsetX(0)
,offsetY(0)
,zoom(zoomLevel)
,noPix(pixels)
,mouseInside(FALSE)
{
   magnifiedOne->installEventFilter(this);
   magnifiedOne->setMouseTracking(TRUE);
   resize(zoom*noPix,zoom*noPix);
   setFixedSize(size());
};
   
void WidgetMagnifier::paintEvent(QPaintEvent *e)
{
   QPainter paint( this );
   paint.setRasterOp(CopyROP);
   if (mouseInside)
   {
//      paint.fillRect(0,0,width(),height(),QColor(white));
      if (!pm.isNull())
      {
         paint.drawPixmap(0,0, pm,offsetX,offsetY,copyX,copyY);
      };
      paint.setPen(QColor(white));
      paint.setRasterOp(XorROP);
      for (int i=0; i<noPix; i++)
      {
         paint.drawLine(i*zoom,0,i*zoom,noPix*zoom-1);
         paint.drawLine(0,i*zoom,noPix*zoom-1,i*zoom);
      };
      paint.drawLine(0,noPix*zoom-1,noPix*zoom-1,noPix*zoom-1);
      paint.drawLine(noPix*zoom-1,0,noPix*zoom-1,noPix*zoom-1);

      paint.setPen(QPen(QColor(white),3));
      paint.drawLine((noPix/2-1)*zoom,noPix/2*zoom+zoom/2,noPix/2*zoom,noPix/2*zoom+zoom/2);
                
      paint.drawLine((noPix/2+1)*zoom,noPix/2*zoom+zoom/2,(noPix/2+2)*zoom,noPix/2*zoom+zoom/2);
                
      paint.drawLine(noPix/2*zoom+zoom/2,(noPix/2-1)*zoom,noPix/2*zoom+zoom/2,noPix/2*zoom);
                
      paint.drawLine(noPix/2*zoom+zoom/2,(noPix/2+1)*zoom,noPix/2*zoom+zoom/2,(noPix/2+2)*zoom);
  }
   else
   {
      paint.fillRect(0,0,width(),height(),QColor(lightGray));
      paint.setPen(QColor(black));
      paint.drawLine(0,0,width(),height());
      paint.drawLine(0,height(),width(),0);
      paint.drawRect(0,0,width(),height());
   };
};

bool WidgetMagnifier::eventFilter(QObject *o, QEvent *e)
{
   if ((o==magnifiedOne) && ((e->type()==Event_MouseMove) || \
(e->type()==Event_Enter)))  {
      mouseInside=TRUE;
      QMouseEvent *m=(QMouseEvent *) e;
      centerX=m->x();
      centerY=m->y();
      globalCenterX=m->globalX();
      globalCenterY=m->globalY();

      pm = QPixmap::grabWindow( \
QApplication::desktop()->winId(),globalCenterX-noPix/2,globalCenterY-noPix/2,noPix,noPix);
  QWMatrix wm;			// after getting it, scale it
      wm.scale(zoom,zoom);
      pm = pm.xForm( wm );
      repaint(FALSE);
   }
   else if ((o==magnifiedOne) && (e->type()==Event_Leave))
   {
      mouseInside=FALSE;
      repaint(FALSE);
   };
   return FALSE;
};

#include "mag.moc.cpp"


["mag.h" (text/x-c++)]

#ifndef MAG_H
#define MAG_H

#include <qwidget.h>
#include <qpixmap.h>

class QEvent;
class QPaintEvent;

class WidgetMagnifier:public QWidget
{
   Q_OBJECT
   public:
      //pixels should really be an odd number, so that there is a center pixel
      WidgetMagnifier(int zoomLevel, int pixels, QWidget *magnifiedWidget, QWidget \
*parent=0, const char *name=0);  virtual ~WidgetMagnifier() {};
      int zoomLevel()  {return zoom;};
      int pixels()     {return noPix;};
   protected:
      QWidget *magnifiedOne;
      virtual void paintEvent(QPaintEvent *e);
      virtual bool eventFilter(QObject *o, QEvent *e);
      int centerX,centerY,globalCenterX,globalCenterY,copyX,copyY,offsetX,offsetY, \
zoom, noPix;  QPixmap pm;		// pixmap, magnified
      bool mouseInside;
};
#endif


["main.cpp" (text/x-c)]

#include<qapplication.h>
#include <qwidget.h>
#include <qpushbutton.h>
#include "mag.h"

int main(int argc, char **argv)
{
   QApplication a(argc,argv);
   QWidget w(0);
   QPushButton pb("hallo welt",&w);
   WidgetMagnifier wm(10,9,&pb,&w);
   pb.setGeometry(20,20,100,30);
   wm.move(20,100);
   w.resize(150,200);
   w.show();
   a.setMainWidget(&w);
   return a.exec();
   
   return 0;
};



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic