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"