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