kivio

kivio_birdeye_panel.cpp
1#include "kivio_birdeye_panel.h"
2
3#include "kivio_screen_painter.h"
4
5#include "kivio_view.h"
6#include "kivio_doc.h"
7#include "kivio_page.h"
8#include "kivio_canvas.h"
9#include "kivio_common.h"
10#include "kivio_factory.h"
11
12#include <tdetoolbar.h>
13#include <tdeaction.h>
14#include <tdelocale.h>
15#include <KoGlobal.h>
16#include <KoZoomHandler.h>
17#include <kiconloader.h>
18#include <tdeapplication.h>
19
20#include <tqpixmap.h>
21#include <tqslider.h>
22#include <tqspinbox.h>
23#include <tqframe.h>
24#include <tqcursor.h>
25#include <tqtoolbutton.h>
26
27#define TOGGLE_ACTION(X) ((TDEToggleAction*)child(X))
28
29KivioBirdEyePanel::KivioBirdEyePanel(KivioView* view, TQWidget* parent, const char* name)
30: KivioBirdEyePanelBase(parent, name), m_pView(view), m_pCanvas(view->canvasWidget()), m_pDoc(view->doc())
31{
32 handlePress = false;
33 m_buffer = new TQPixmap();
34 canvas->installEventFilter(this);
35 m_zoomHandler = new KoZoomHandler;
36
37 connect( m_pDoc, TQ_SIGNAL( sig_updateView(KivioPage*)), TQ_SLOT(slotUpdateView(KivioPage*)) );
38 connect( m_pView, TQ_SIGNAL(zoomChanged(int)), TQ_SLOT(canvasZoomChanged(int)));
39 connect( m_pCanvas, TQ_SIGNAL(visibleAreaChanged()), TQ_SLOT(updateView()));
40
41 m_zoomOutButton->setIconSet(SmallIconSet("zoom-out", 16));
42 m_zoomInButton->setIconSet(SmallIconSet("zoom-in", 16));
43 connect(m_zoomOutButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(zoomMinus()));
44 connect(m_zoomInButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(zoomPlus()));
45 connect(m_zoomSlider, TQ_SIGNAL(valueChanged(int)), m_pView, TQ_SLOT(viewZoom(int)));
46
47 canvasZoomChanged(m_pView->zoomHandler()->zoom());
48}
49
50KivioBirdEyePanel::~KivioBirdEyePanel()
51{
52 delete m_buffer;
53 delete m_zoomHandler;
54}
55
56void KivioBirdEyePanel::zoomMinus()
57{
58 m_pCanvas->zoomOut(TQPoint(m_pCanvas->width() / 2, m_pCanvas->height() / 2));
59}
60
61void KivioBirdEyePanel::zoomPlus()
62{
63 m_pCanvas->zoomIn(TQPoint(m_pCanvas->width() / 2, m_pCanvas->height() / 2));
64}
65
66void KivioBirdEyePanel::canvasZoomChanged(int zoom)
67{
68 m_zoomSlider->blockSignals(true);
69 m_zoomSlider->setValue(zoom);
70 m_zoomSlider->blockSignals(false);
71 m_zoomOutButton->setEnabled(zoom > 25);
72 m_zoomInButton->setEnabled(zoom < 2000);
73 slotUpdateView(m_pView->activePage());
74}
75
76void KivioBirdEyePanel::slotUpdateView(KivioPage* page)
77{
78 if (!isVisible() || !page || m_pView->activePage() != page)
79 return;
80
81 updateView();
82}
83
84bool KivioBirdEyePanel::eventFilter(TQObject* o, TQEvent* ev)
85{
86 if (o == canvas && ev->type() == TQEvent::Show) {
87 updateView();
88 }
89
90 if (o == canvas && ev->type() == TQEvent::Resize) {
91 m_buffer->resize(canvas->size());
92 slotUpdateView(m_pView->activePage());
93 }
94
95 if (o == canvas && ev->type() == TQEvent::Paint) {
96 updateView();
97 return true;
98 }
99
100 if (o == canvas && ev->type() == TQEvent::MouseMove) {
101 TQMouseEvent* me = static_cast<TQMouseEvent*>(ev);
102 if (me->state() == TQt::LeftButton)
103 handleMouseMoveAction(me->pos());
104 else
105 handleMouseMove(me->pos());
106
107 lastPos = me->pos();
108 return true;
109 }
110
111 if (o == canvas && ev->type() == TQEvent::MouseButtonPress) {
112 TQMouseEvent* me = static_cast<TQMouseEvent*>(ev);
113 if (me->button() == TQt::LeftButton)
114 handleMousePress(me->pos());
115
116 return true;
117 }
118
119 return KivioBirdEyePanelBase::eventFilter(o, ev);
120}
121
122void KivioBirdEyePanel::updateView()
123{
124 if (!m_pView || !m_pView->activePage()) return;
125
126 KoPageLayout pl = m_pView->activePage()->paperLayout();
127 m_zoomHandler->setZoomAndResolution(100, KoGlobal::dpiX(),
128 KoGlobal::dpiY());
129
130 int pw = m_zoomHandler->zoomItX(pl.ptWidth);
131 int ph = m_zoomHandler->zoomItY(pl.ptHeight);
132 TQSize s2 = TQSize(pw,ph);
133 TQSize s1 = canvas->size();
134
135 double zx = (double)s1.width()/(double)s2.width();
136 double zy = (double)s1.height()/(double)s2.height();
137 double zxy = TQMIN(zx,zy);
138
139 m_zoomHandler->setZoomAndResolution(tqRound(zxy * 100), KoGlobal::dpiX(),
140 KoGlobal::dpiY());
141
142 pw = m_zoomHandler->zoomItX(pl.ptWidth);
143 ph = m_zoomHandler->zoomItY(pl.ptHeight);
144 int px0 = (s1.width()-pw)/2;
145 int py0 = (s1.height()-ph)/2;
146
147 TQPoint p0 = TQPoint(px0,py0);
148
149 TQRect rect(TQPoint(0,0),s1);
150
151 KivioScreenPainter kpainter;
152 kpainter.start(m_buffer);
153 kpainter.painter()->fillRect(rect, TDEApplication::palette().active().brush(TQColorGroup::Mid));
154
155 kpainter.painter()->fillRect(px0, py0, pw, ph, white);
156
157 kpainter.painter()->translate(px0, py0);
158 m_pDoc->paintContent(kpainter, rect, false, m_pView->activePage(), p0, m_zoomHandler, false, false);
159
160 KoRect vr = m_pCanvas->visibleArea();
161
162 int x = m_zoomHandler->zoomItX(vr.x());
163 int y = m_zoomHandler->zoomItY(vr.y());
164 int w = m_zoomHandler->zoomItX(vr.width());
165 int h = m_zoomHandler->zoomItX(vr.height());
166
167 kpainter.setFGColor(red);
168 kpainter.drawRect(x, y, w, h);
169 kpainter.setFGColor(red.light());
170 kpainter.drawRect(x-1, y-1, w+2, h+2);
171 kpainter.stop();
172
173 varea.setRect(x + px0,y + py0,w,h);
174
175 bitBlt(canvas,0,0,m_buffer);
176}
177
178void KivioBirdEyePanel::handleMouseMove(TQPoint p)
179{
180 handlePress = true;
181
182 TQRect r1 = TQRect(varea.x()-1, varea.y()-1, 3, varea.height()+2);
183 if (r1.contains(p)) {
184 canvas->setCursor(sizeHorCursor);
185 apos = AlignLeft;
186 return;
187 }
188
189 r1.moveBy(varea.width(),0);
190 if (r1.contains(p)) {
191 canvas->setCursor(sizeHorCursor);
192 apos = AlignRight;
193 return;
194 }
195
196 TQRect r2 = TQRect(varea.x()-1, varea.y()-1, varea.width()+2, 3);
197 if (r2.contains(p)) {
198 canvas->setCursor(sizeVerCursor);
199 apos = AlignTop;
200 return;
201 }
202
203 r2.moveBy(0, varea.height());
204 if (r2.contains(p)) {
205 canvas->setCursor(sizeVerCursor);
206 apos = AlignBottom;
207 return;
208 }
209
210 if (varea.contains(p)) {
211 canvas->setCursor(sizeAllCursor);
212 apos = AlignCenter;
213 return;
214 }
215
216 canvas->unsetCursor();
217 handlePress = false;
218}
219
220void KivioBirdEyePanel::handleMouseMoveAction(TQPoint p)
221{
222 if (!handlePress)
223 return;
224
225 p -= lastPos;
226
227 if (apos == AlignCenter) {
228 double zy = m_pView->zoomHandler()->zoomedResolutionY() / m_zoomHandler->zoomedResolutionY();
229 double zx = m_pView->zoomHandler()->zoomedResolutionX() / m_zoomHandler->zoomedResolutionX();
230 m_pCanvas->setUpdatesEnabled(false);
231 m_pCanvas->scrollDx(-(int)(p.x()*zx));
232 m_pCanvas->scrollDy(-(int)(p.y()*zy));
233 m_pCanvas->setUpdatesEnabled(true);
234 return;
235 }
236
237 double dx = m_zoomHandler->unzoomItX(p.x());
238 double dy = m_zoomHandler->unzoomItY(p.y());
239
240 KoRect vr = m_pCanvas->visibleArea();
241 if (apos == AlignRight) {
242 vr.setWidth(TQMAX(10.0, vr.width() + dx));
243 m_pCanvas->setVisibleAreaByWidth(vr);
244 }
245 else if (apos == AlignLeft) {
246 vr.setX(vr.x() + dx);
247 vr.setWidth(TQMAX(10.0, vr.width() - dx));
248 m_pCanvas->setVisibleAreaByWidth(vr);
249 }
250 else if (apos == AlignTop) {
251 vr.setY(vr.y() + dy);
252 vr.setHeight(TQMAX(10.0 ,vr.height() - dy));
253 m_pCanvas->setVisibleAreaByHeight(vr);
254 }
255 else if (apos == AlignBottom) {
256 vr.setHeight(TQMAX(10.0 ,vr.height() + dy));
257 m_pCanvas->setVisibleAreaByHeight(vr);
258 }
259}
260
261void KivioBirdEyePanel::handleMousePress(TQPoint p)
262{
263 if (handlePress)
264 return;
265
266 TQSize s1 = canvas->size();
267 KoPageLayout pl = m_pView->activePage()->paperLayout();
268 int pw = m_zoomHandler->zoomItX(pl.ptWidth);
269 int ph = m_zoomHandler->zoomItY(pl.ptHeight);
270 int px0 = (s1.width()-pw)/2;
271 int py0 = (s1.height()-ph)/2;
272
273 double x = m_zoomHandler->unzoomItX(p.x() - px0);
274 double y = m_zoomHandler->unzoomItY(p.y() - py0);
275
276 m_pCanvas->setViewCenterPoint(KoPoint(x,y));
277}
278
279#include "kivio_birdeye_panel.moc"