1
/***************************************************************************
2
* Copyright (C) 2007 by Kai Winter *
5
* This program is free software; you can redistribute it and/or modify *
6
* it under the terms of the GNU General Public License as published by *
7
* the Free Software Foundation; either version 2 of the License, or *
8
* (at your option) any later version. *
10
* This program is distributed in the hope that it will be useful, *
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13
* GNU General Public License for more details. *
15
* You should have received a copy of the GNU General Public License *
16
* along with this program; if not, write to the *
17
* Free Software Foundation, Inc., *
18
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19
***************************************************************************/
20
#include "mapcontrol.h"
22
MapControl::MapControl(QSize size, MouseMode mousemode)
23
: size(size), mousemode(mousemode)
25
layermanager = new LayerManager(this, size);
26
screen_middle = QPoint(size.width()/2, size.height()/2);
30
connect(ImageManager::instance(), SIGNAL(imageReceived()),
31
this, SLOT(updateRequestNew()));
33
connect(ImageManager::instance(), SIGNAL(loadingFinished()),
34
this, SLOT(loadingFinished()));
36
this->setMaximumSize(size.width()+1, size.height()+1);
39
MapControl::~MapControl()
44
QPointF MapControl::getCurrentCoordinate() const
46
return layermanager->getCurrentCoordinate();
49
Layer* MapControl::getLayer(const QString& layername) const
51
return layermanager->getLayer(layername);
54
QList<QString> MapControl::getLayers() const
56
return layermanager->getLayers();
59
int MapControl::getNumberOfLayers() const
61
return layermanager->getLayers().size();
64
void MapControl::followGeometry(const Geometry* geom) const
66
connect(geom, SIGNAL(positionChanged(Geometry*)),
67
this, SLOT(positionChanged(Geometry*)));
70
void MapControl::positionChanged(Geometry* geom)
72
QPoint start = layermanager->getLayer()->getMapAdapter()->coordinateToDisplay(getCurrentCoordinate());
73
QPoint dest = layermanager->getLayer()->getMapAdapter()->coordinateToDisplay(((Point*)geom)->getCoordinate());
75
QPoint step = (dest-start);
77
layermanager->scrollView(step);
83
void MapControl::moveTo(QPointF coordinate)
87
if (moveMutex.tryLock())
89
QTimer::singleShot(40, this, SLOT(tick()));
93
// stopMove(coordinate);
96
void MapControl::tick()
98
QPoint start = layermanager->getLayer()->getMapAdapter()->coordinateToDisplay(getCurrentCoordinate());
99
QPoint dest = layermanager->getLayer()->getMapAdapter()->coordinateToDisplay(target);
101
QPoint step = (dest-start)/steps;
102
QPointF next = getCurrentCoordinate()- step;
104
// setView(Coordinate(next.x(), next.y()));
105
layermanager->scrollView(step);
111
QTimer::singleShot(40, this, SLOT(tick()));
119
void MapControl::paintEvent(QPaintEvent* evnt)
121
QWidget::paintEvent(evnt);
122
QPainter painter(this);
124
// painter.translate(150,190);
125
// painter.scale(0.5,0.5);
127
// painter.setClipRect(0,0, size.width(), size.height());
129
// painter.setViewport(10000000000,0,size.width(),size.height());
134
painter.translate(256,256);
135
painter.rotate(rotation);
136
painter.translate(-256,-256);
139
layermanager->drawImage(&painter);
140
layermanager->drawGeoms(&painter);
142
painter.drawLine(screen_middle.x(), screen_middle.y()-10,
143
screen_middle.x(), screen_middle.y()+10); // |
144
painter.drawLine(screen_middle.x()-10, screen_middle.y(),
145
screen_middle.x()+10, screen_middle.y()); // -
147
// int cross_x = int(layermanager->getMapmiddle_px().x())%256;
148
// int cross_y = int(layermanager->getMapmiddle_px().y())%256;
149
// painter.drawLine(screen_middle.x()-cross_x+cross_x, screen_middle.y()-cross_y+0,
150
// screen_middle.x()-cross_x+cross_x, screen_middle.y()-cross_y+256); // |
151
// painter.drawLine(screen_middle.x()-cross_x+0, screen_middle.y()-cross_y+cross_y,
152
// screen_middle.x()-cross_x+256, screen_middle.y()-cross_y+cross_y); // -
154
painter.drawRect(0,0, size.width(), size.height());
157
painter.setMatrix(painter.matrix().inverted());
158
//qt = painter.transform();
159
qm = painter.combinedMatrix();
162
if (mousepressed && mousemode == Dragging)
164
QRect rect = QRect(pre_click_px, current_mouse_pos);
165
painter.drawRect(rect);
170
void MapControl::mousePressEvent(QMouseEvent* evnt)
174
// QMouseEvent* me = new QMouseEvent(evnt->type(), qm.map(QPoint(evnt->x(),evnt->y())), evnt->button(), evnt->buttons(), evnt->modifiers());
176
// qDebug() << "evnt: " << evnt->x() << ", " << evnt->y() << ", " << evnt->pos();
179
layermanager->mouseEvent(evnt);
181
if (layermanager->getLayers().size()>0)
183
if (evnt->button() == 1)
186
pre_click_px = QPoint(evnt->x(), evnt->y());
188
else if (evnt->button() == 2 && mousemode != None) // zoom in
191
} else if (evnt->button() == 4 && mousemode != None) // zoom out
197
// emit(mouseEvent(evnt));
198
emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos())));
201
void MapControl::mouseReleaseEvent(QMouseEvent* evnt)
203
mousepressed = false;
204
if (mousemode == Dragging)
206
QPointF ulCoord = clickToWorldCoordinate(pre_click_px);
207
QPointF lrCoord = clickToWorldCoordinate(current_mouse_pos);
209
QRectF coordinateBB = QRectF(ulCoord, QSizeF( (lrCoord-ulCoord).x(), (lrCoord-ulCoord).y()));
211
emit(draggedRect(coordinateBB));
214
emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos())));
217
void MapControl::mouseMoveEvent(QMouseEvent* evnt)
219
// emit(mouseEvent(evnt));
223
QMouseEvent* me = new QMouseEvent(evnt->type(), qm.map(QPoint(evnt->x(),evnt->y())), evnt->button(), evnt->buttons(), evnt->modifiers());
226
if (mousepressed && mousemode == Panning)
228
QPoint offset = pre_click_px - QPoint(evnt->x(), evnt->y());
229
layermanager->scrollView(offset);
230
pre_click_px = QPoint(evnt->x(), evnt->y());
232
else if (mousepressed && mousemode == Dragging)
234
current_mouse_pos = QPoint(evnt->x(), evnt->y());
236
// emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos())));
239
// emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos())));
242
QPointF MapControl::clickToWorldCoordinate(QPoint click)
244
// click coordinate to image coordinate
245
QPoint displayToImage= QPoint(click.x()-screen_middle.x()+layermanager->getMapmiddle_px().x(),
246
click.y()-screen_middle.y()+layermanager->getMapmiddle_px().y());
247
// image coordinate to world coordinate
248
return layermanager->getLayer()->getMapAdapter()->displayToCoordinate(displayToImage);
251
void MapControl::updateRequest(QRect rect)
255
void MapControl::updateRequestNew()
257
// qDebug() << "MapControl::updateRequestNew()";
258
layermanager->forceRedraw();
262
void MapControl::zoomIn()
264
layermanager->zoomIn();
267
void MapControl::zoomOut()
269
layermanager->zoomOut();
272
void MapControl::setZoom(int zoomlevel)
274
layermanager->setZoom(zoomlevel);
277
int MapControl::getCurrentZoom() const
279
return layermanager->getCurrentZoom();
281
void MapControl::scrollLeft(int pixel)
283
layermanager->scrollView(QPoint(-pixel,0));
286
void MapControl::scrollRight(int pixel)
288
layermanager->scrollView(QPoint(pixel,0));
291
void MapControl::scrollUp(int pixel)
293
layermanager->scrollView(QPoint(0,-pixel));
296
void MapControl::scrollDown(int pixel)
298
layermanager->scrollView(QPoint(0,pixel));
301
void MapControl::scroll(const QPoint scroll)
303
layermanager->scrollView(scroll);
307
void MapControl::setView(const QPointF& coordinate) const
309
layermanager->setView(coordinate);
312
void MapControl::setView(const QList<QPointF> coordinates) const
314
layermanager->setView(coordinates);
317
void MapControl::setView(const Point* point) const
319
layermanager->setView(point->getCoordinate());
322
void MapControl::loadingFinished()
324
// qDebug() << "MapControl::loadingFinished()";
325
layermanager->removeZoomImage();
327
void MapControl::addLayer(Layer* layer)
329
layermanager->addLayer(layer);
332
void MapControl::setMouseMode(MouseMode mousemode)
334
this->mousemode = mousemode;
336
MapControl::MouseMode MapControl::getMouseMode()
341
void MapControl::stopFollowing(Geometry* geom)
343
geom->disconnect(SIGNAL(positionChanged(Geometry*)));