kivio

kivio_birdeye_panel.cpp

00001 #include "kivio_birdeye_panel.h"
00002 
00003 #include "kivio_screen_painter.h"
00004 
00005 #include "kivio_view.h"
00006 #include "kivio_doc.h"
00007 #include "kivio_page.h"
00008 #include "kivio_canvas.h"
00009 #include "kivio_common.h"
00010 #include "kivio_factory.h"
00011 
00012 #include <ktoolbar.h>
00013 #include <kaction.h>
00014 #include <klocale.h>
00015 #include <KoGlobal.h>
00016 #include <KoZoomHandler.h>
00017 #include <kdeversion.h>
00018 #include <kiconloader.h>
00019 #include <kapplication.h>
00020 
00021 #include <qpixmap.h>
00022 #include <qslider.h>
00023 #include <qspinbox.h>
00024 #include <qframe.h>
00025 #include <qcursor.h>
00026 #include <qtoolbutton.h>
00027 
00028 #define TOGGLE_ACTION(X) ((KToggleAction*)child(X))
00029 
00030 KivioBirdEyePanel::KivioBirdEyePanel(KivioView* view, QWidget* parent, const char* name)
00031 : KivioBirdEyePanelBase(parent, name), m_pView(view), m_pCanvas(view->canvasWidget()), m_pDoc(view->doc())
00032 {
00033   handlePress = false;
00034   m_buffer = new QPixmap();
00035   canvas->installEventFilter(this);
00036   m_zoomHandler = new KoZoomHandler;
00037 
00038   connect( m_pDoc, SIGNAL( sig_updateView(KivioPage*)), SLOT(slotUpdateView(KivioPage*)) );
00039   connect( m_pView, SIGNAL(zoomChanged(int)), SLOT(canvasZoomChanged(int)));
00040   connect( m_pCanvas, SIGNAL(visibleAreaChanged()), SLOT(updateView()));
00041 
00042   m_zoomOutButton->setIconSet(SmallIconSet("viewmag-", 16));
00043   m_zoomInButton->setIconSet(SmallIconSet("viewmag+", 16));
00044   connect(m_zoomOutButton, SIGNAL(clicked()), this, SLOT(zoomMinus()));
00045   connect(m_zoomInButton, SIGNAL(clicked()), this, SLOT(zoomPlus()));
00046   connect(m_zoomSlider, SIGNAL(valueChanged(int)), m_pView, SLOT(viewZoom(int)));
00047 
00048   canvasZoomChanged(m_pView->zoomHandler()->zoom());
00049 }
00050 
00051 KivioBirdEyePanel::~KivioBirdEyePanel()
00052 {
00053   delete m_buffer;
00054   delete m_zoomHandler;
00055 }
00056 
00057 void KivioBirdEyePanel::zoomMinus()
00058 {
00059   m_pCanvas->zoomOut(QPoint(m_pCanvas->width() / 2, m_pCanvas->height() / 2));
00060 }
00061 
00062 void KivioBirdEyePanel::zoomPlus()
00063 {
00064   m_pCanvas->zoomIn(QPoint(m_pCanvas->width() / 2, m_pCanvas->height() / 2));
00065 }
00066 
00067 void KivioBirdEyePanel::canvasZoomChanged(int zoom)
00068 {
00069   m_zoomSlider->blockSignals(true);
00070   m_zoomSlider->setValue(zoom);
00071   m_zoomSlider->blockSignals(false);
00072   m_zoomOutButton->setEnabled(zoom > 25);
00073   m_zoomInButton->setEnabled(zoom < 2000);
00074   slotUpdateView(m_pView->activePage());
00075 }
00076 
00077 void KivioBirdEyePanel::slotUpdateView(KivioPage* page)
00078 {
00079   if (!isVisible() || !page || m_pView->activePage() != page)
00080     return;
00081 
00082   updateView();
00083 }
00084 
00085 bool KivioBirdEyePanel::eventFilter(QObject* o, QEvent* ev)
00086 {
00087   if (o == canvas && ev->type() == QEvent::Show) {
00088     updateView();
00089   }
00090 
00091   if (o == canvas && ev->type() == QEvent::Resize) {
00092     m_buffer->resize(canvas->size());
00093     slotUpdateView(m_pView->activePage());
00094   }
00095 
00096   if (o == canvas && ev->type() == QEvent::Paint) {
00097     updateView();
00098     return true;
00099   }
00100 
00101   if (o == canvas && ev->type() == QEvent::MouseMove) {
00102     QMouseEvent* me = (QMouseEvent*)ev;
00103     if (me->state() == LeftButton)
00104       handleMouseMoveAction(me->pos());
00105     else
00106       handleMouseMove(me->pos());
00107 
00108     lastPos = me->pos();
00109     return true;
00110   }
00111 
00112   if (o == canvas && ev->type() == QEvent::MouseButtonPress) {
00113     QMouseEvent* me = (QMouseEvent*)ev;
00114     if (me->button() == LeftButton)
00115       handleMousePress(me->pos());
00116 
00117     return true;
00118   }
00119 
00120   return KivioBirdEyePanelBase::eventFilter(o, ev);
00121 }
00122 
00123 void KivioBirdEyePanel::updateView()
00124 {
00125   if (!m_pView || !m_pView->activePage()) return;
00126 
00127   KoPageLayout pl = m_pView->activePage()->paperLayout();
00128   m_zoomHandler->setZoomAndResolution(100, KoGlobal::dpiX(),
00129                                       KoGlobal::dpiY());
00130 
00131   int pw = m_zoomHandler->zoomItX(pl.ptWidth);
00132   int ph = m_zoomHandler->zoomItY(pl.ptHeight);
00133   QSize s2 = QSize(pw,ph);
00134   QSize s1 = canvas->size();
00135 
00136   double zx = (double)s1.width()/(double)s2.width();
00137   double zy = (double)s1.height()/(double)s2.height();
00138   double zxy = QMIN(zx,zy);
00139 
00140   m_zoomHandler->setZoomAndResolution(qRound(zxy * 100), KoGlobal::dpiX(),
00141     KoGlobal::dpiY());
00142 
00143   pw = m_zoomHandler->zoomItX(pl.ptWidth);
00144   ph = m_zoomHandler->zoomItY(pl.ptHeight);
00145   int px0 = (s1.width()-pw)/2;
00146   int py0 = (s1.height()-ph)/2;
00147 
00148   QPoint p0 = QPoint(px0,py0);
00149 
00150   QRect rect(QPoint(0,0),s1);
00151 
00152   KivioScreenPainter kpainter;
00153   kpainter.start(m_buffer);
00154   kpainter.painter()->fillRect(rect, KApplication::palette().active().brush(QColorGroup::Mid));
00155 
00156   kpainter.painter()->fillRect(px0, py0, pw, ph, white);
00157 
00158   kpainter.painter()->translate(px0, py0);
00159   m_pDoc->paintContent(kpainter, rect, false, m_pView->activePage(), p0, m_zoomHandler, false, false);
00160 
00161   KoRect vr = m_pCanvas->visibleArea();
00162 
00163   int x = m_zoomHandler->zoomItX(vr.x());
00164   int y = m_zoomHandler->zoomItY(vr.y());
00165   int w = m_zoomHandler->zoomItX(vr.width());
00166   int h = m_zoomHandler->zoomItX(vr.height());
00167 
00168   kpainter.setFGColor(red);
00169   kpainter.drawRect(x, y, w, h);
00170   kpainter.setFGColor(red.light());
00171   kpainter.drawRect(x-1, y-1, w+2, h+2);
00172   kpainter.stop();
00173 
00174   varea.setRect(x + px0,y + py0,w,h);
00175 
00176   bitBlt(canvas,0,0,m_buffer);
00177 }
00178 
00179 void KivioBirdEyePanel::handleMouseMove(QPoint p)
00180 {
00181   handlePress = true;
00182 
00183   QRect r1 = QRect(varea.x()-1, varea.y()-1, 3, varea.height()+2);
00184   if (r1.contains(p)) {
00185     canvas->setCursor(sizeHorCursor);
00186     apos = AlignLeft;
00187     return;
00188   }
00189 
00190   r1.moveBy(varea.width(),0);
00191   if (r1.contains(p)) {
00192     canvas->setCursor(sizeHorCursor);
00193     apos = AlignRight;
00194     return;
00195   }
00196 
00197   QRect r2 = QRect(varea.x()-1, varea.y()-1, varea.width()+2, 3);
00198   if (r2.contains(p)) {
00199     canvas->setCursor(sizeVerCursor);
00200     apos = AlignTop;
00201     return;
00202   }
00203 
00204   r2.moveBy(0, varea.height());
00205   if (r2.contains(p)) {
00206     canvas->setCursor(sizeVerCursor);
00207     apos = AlignBottom;
00208     return;
00209   }
00210 
00211   if (varea.contains(p)) {
00212     canvas->setCursor(sizeAllCursor);
00213     apos = AlignCenter;
00214     return;
00215   }
00216 
00217   canvas->unsetCursor();
00218   handlePress = false;
00219 }
00220 
00221 void KivioBirdEyePanel::handleMouseMoveAction(QPoint p)
00222 {
00223   if (!handlePress)
00224     return;
00225 
00226   p -= lastPos;
00227 
00228   if (apos == AlignCenter) {
00229     double zy = m_pView->zoomHandler()->zoomedResolutionY() / m_zoomHandler->zoomedResolutionY();
00230     double zx = m_pView->zoomHandler()->zoomedResolutionX() / m_zoomHandler->zoomedResolutionX();
00231     m_pCanvas->setUpdatesEnabled(false);
00232     m_pCanvas->scrollDx(-(int)(p.x()*zx));
00233     m_pCanvas->scrollDy(-(int)(p.y()*zy));
00234     m_pCanvas->setUpdatesEnabled(true);
00235     return;
00236   }
00237 
00238   double dx = m_zoomHandler->unzoomItX(p.x());
00239   double dy = m_zoomHandler->unzoomItY(p.y());
00240 
00241   KoRect vr = m_pCanvas->visibleArea();
00242   if (apos == AlignRight) {
00243     vr.setWidth(QMAX(10.0, vr.width() + dx));
00244     m_pCanvas->setVisibleAreaByWidth(vr);
00245   }
00246   else if (apos == AlignLeft) {
00247     vr.setX(vr.x() + dx);
00248     vr.setWidth(QMAX(10.0, vr.width() - dx));
00249     m_pCanvas->setVisibleAreaByWidth(vr);
00250   }
00251   else if (apos == AlignTop) {
00252     vr.setY(vr.y() + dy);
00253     vr.setHeight(QMAX(10.0 ,vr.height() - dy));
00254     m_pCanvas->setVisibleAreaByHeight(vr);
00255   }
00256   else if (apos == AlignBottom) {
00257     vr.setHeight(QMAX(10.0 ,vr.height() + dy));
00258     m_pCanvas->setVisibleAreaByHeight(vr);
00259   }
00260 }
00261 
00262 void KivioBirdEyePanel::handleMousePress(QPoint p)
00263 {
00264   if (handlePress)
00265     return;
00266 
00267   QSize s1 = canvas->size();
00268   KoPageLayout pl = m_pView->activePage()->paperLayout();
00269   int pw = m_zoomHandler->zoomItX(pl.ptWidth);
00270   int ph = m_zoomHandler->zoomItY(pl.ptHeight);
00271   int px0 = (s1.width()-pw)/2;
00272   int py0 = (s1.height()-ph)/2;
00273 
00274   double x = m_zoomHandler->unzoomItX(p.x() - px0);
00275   double y = m_zoomHandler->unzoomItY(p.y() - py0);
00276 
00277   m_pCanvas->setViewCenterPoint(KoPoint(x,y));
00278 }
00279 
00280 #include "kivio_birdeye_panel.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys