All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
View.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2013-2014 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib 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 Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file View.cpp
22 
23  \brief
24 
25  \ingroup layout
26 */
27 
28 // TerraLib
29 #include "View.h"
30 #include "Context.h"
31 #include "EnumMode.h"
32 #include "ItemGroup.h"
33 #include "Scene.h"
34 #include "VisualizationArea.h"
35 #include "OutsideArea.h"
36 #include "../../../../color/RGBAColor.h"
37 #include "PropertiesOutside.h"
38 #include "ObjectInspectorOutside.h"
39 #include "ToolbarOutside.h"
40 #include "ItemUtils.h"
41 
42 // STL
43 #include <math.h>
44 
45 // Qt
46 #include <QMouseEvent>
47 #include <QWheelEvent>
48 #include <QKeyEvent>
49 #include <QString>
50 #include <QGraphicsView>
51 #include <QtGui>
52 #include <QGraphicsItem>
53 #include <time.h>
54 #include <QMatrix>
55 #include <QString>
56 #include <QFileDialog>
57 #include <QMessageBox>
58 #include <QPixmap>
59 #include <QLineF>
60 
61 #define _psPointInMM 0.352777778 //<! 1 PostScript point in millimeters
62 #define _inchInPSPoints 72 //<! 1 Inch in PostScript point
63 #define _inchInMillimeters 25.4 //<! 1 Inch in millimeters
64 
65 te::layout::View::View( QWidget* widget) :
66  QGraphicsView(new QGraphicsScene, widget),
67  m_outsideArea(0),
68  m_visualizationArea(0),
69  m_lineIntersectHrz(0),
70  m_lineIntersectVrt(0)
71 {
72  //Use ScrollHand Drag Mode to enable Panning
73  //You do need the enable scroll bars for that to work.
74  setDragMode(RubberBandDrag);
75 
76  m_lineIntersectHrz = new QLineF(0,0,0,0);
77  m_lineIntersectVrt = new QLineF(0,0,0,0);
78 }
79 
81 {
82  if(m_visualizationArea)
83  {
84  delete m_visualizationArea;
85  m_visualizationArea = 0;
86  }
87 
88  if(m_lineIntersectHrz)
89  {
90  delete m_lineIntersectHrz;
91  m_lineIntersectHrz = 0;
92  }
93 
94  if(m_lineIntersectVrt)
95  {
96  delete m_lineIntersectVrt;
97  m_lineIntersectVrt = 0;
98  }
99 }
100 
101 void te::layout::View::mousePressEvent( QMouseEvent * event )
102 {
103  QGraphicsView::mousePressEvent(event);
104 
105  QPointF scenePos = mapToScene(event->pos());
106  te::gm::Coord2D coord(scenePos.x(), scenePos.y());
107 
108  Scene* sc = dynamic_cast<Scene*>(scene());
109  if(!sc)
110  return;
111 
112  sc->createItem(coord);
113 }
114 
115 void te::layout::View::mouseMoveEvent( QMouseEvent * event )
116 {
117  QGraphicsView::mouseMoveEvent(event);
118 
119  Scene* sc = dynamic_cast<Scene*>(scene());
120 
121  if(!sc)
122  return;
123 
124  QPointF scenePos = mapToScene(event->pos());
125 
126  emit changeSceneCoordMouse(scenePos);
127 
128  m_lineIntersectHrz->setP1(QPointF(sc->sceneRect().topLeft().x(), scenePos.y()));
129  m_lineIntersectHrz->setP2(scenePos);
130 
131  m_lineIntersectVrt->setP1(QPointF(scenePos.x(), sc->sceneRect().topLeft().y()));
132  m_lineIntersectVrt->setP2(scenePos);
133 }
134 
135 void te::layout::View::wheelEvent( QWheelEvent *event )
136 {
137  QGraphicsView::wheelEvent(event);
138 
139  scaleView(pow((double)2, -event->delta() / 240.0));
140 }
141 
142 void te::layout::View::scaleView( qreal scaleFactor )
143 {
144  //Window - Mundo
145  double dpiX = this->logicalDpiX();
146  double dpiY = this->logicalDpiY();
147  double scaleX = (dpiX / 25.4) * scaleFactor;
148  double scaleY = (-dpiY / 25.4) * scaleFactor;
149 
150  qreal factor = QTransform().scale(scaleX, scaleY).mapRect(QRectF(0, 0, 1, 1)).width();
151 
152  if (factor < 0.5 || factor > 10)
153  return;
154 
155  scale(scaleFactor, scaleFactor);
156 
157  Scene* sc = dynamic_cast<Scene*>(scene());
158  if(sc)
159  {
160  sc->redrawItems();
161  }
162 }
163 
164 void te::layout::View::keyPressEvent( QKeyEvent* keyEvent )
165 {
166  Scene* sc = dynamic_cast<Scene*>(scene());
167 
168  if(keyEvent->key() == Qt::Key_P)
169  {
170  //Apenas redesenhar itens que estão dentro do box do papel.
171  sc->printPreview();
172  }
173  else if(keyEvent->key() == Qt::Key_E)
174  {
175  sc->savePaperAsPDF();
176  }
177  else if(keyEvent->key() == Qt::Key_I)
178  {
179  sc->savePaperAsImage();
180  }
181  else if(keyEvent->key() == Qt::Key_G)
182  {
183  createItemGroup();
184  }
185  else if(keyEvent->key() == Qt::Key_D)
186  {
187  destroyItemGroup();
188  }
189  else if(keyEvent->key() == Qt::Key_Delete)
190  {
191  sc->deleteItems();
192  }
193 
194  QGraphicsView::keyPressEvent(keyEvent);
195 }
196 
198 {
199  connect(scene(), SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
200  connect(scene(), SIGNAL(addItemFinalized()), this, SLOT(onAddItemFinalized()));
201 
202  Scene* lScene = dynamic_cast<Scene*>(scene());
203 
204  if(!lScene)
205  return;
206 
207  lScene->init(widthMM(), heightMM());
208 
209  te::gm::Envelope* boxW = lScene->getWorldBox();
210 
211  double llx = boxW->getLowerLeftX();
212  double ury = boxW->getUpperRightY();
213 
214  //Transform calcula automaticamente a matriz inversa
215  setTransform(lScene->getMatrixViewScene());
216 
217  setTransformationAnchor(QGraphicsView::NoAnchor);
218  centerOn(QPointF(llx, ury));
219 
220  /* Mirror the y coordinate, because the scene is in Cartesian coordinates. */
221  scale(1, -1);
222  //----------------------------------------------------------------------------------------------
223 
224  connect(m_outsideArea->getToolbarOutside(), SIGNAL(changeContext(bool)), this, SLOT(onToolbarChangeContext(bool)));
225 
226  connect(m_outsideArea, SIGNAL(changeMenuContext(bool)), this, SLOT(onMainMenuChangeContext(bool)));
227 
228  m_visualizationArea = new VisualizationArea(boxW);
229  m_visualizationArea->build();
230 
231  lScene->setLineIntersectionHzr(m_lineIntersectHrz);
232  lScene->setLineIntersectionVrt(m_lineIntersectVrt);
233 
234  scene()->setBackgroundBrush(QBrush(QColor(105,105,030)));
235  setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
236  setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
237 }
238 
239 void te::layout::View::resizeEvent(QResizeEvent * event)
240 {
241  QGraphicsView::resizeEvent(event);
242 }
243 
244 int te::layout::View::metric( PaintDeviceMetric metric ) const
245 {
246  if(metric == PdmHeightMM)
247  {
248  return 297;
249  }
250 
251  return QGraphicsView::metric(metric);
252 }
253 
254 void te::layout::View::paintEvent( QPaintEvent * event )
255 {
256  QGraphicsView::paintEvent(event);
257 }
258 
259 void te::layout::View::hideEvent( QHideEvent * event )
260 {
261  QGraphicsView::hideEvent(event);
262 
263  if(m_outsideArea)
264  {
265  m_outsideArea->closeAllDocks();
266  m_outsideArea->closeMainMenu();
267  }
268 }
269 
270 void te::layout::View::closeEvent( QCloseEvent * event )
271 {
272  QGraphicsView::closeEvent(event);
273 
274  if(m_outsideArea)
275  {
276  m_outsideArea->closeAllDocks();
277  m_outsideArea->closeMainMenu();
278  }
279 }
280 
281 void te::layout::View::showEvent( QShowEvent * event )
282 {
283  QGraphicsView::showEvent(event);
284 
285  if(m_outsideArea)
286  {
287  m_outsideArea->openAllDocks();
288  m_outsideArea->openMainMenu();
289  }
290 }
291 
293 {
294  outsideAreaChangeContext(change);
295 }
296 
298 {
299  QList<QGraphicsItem*> graphicsItems = scene()->selectedItems();
300  QList<QGraphicsItem*> allItems = scene()->items();
301  //Refresh Property window
302  if(m_outsideArea->getPropertiesOutside())
303  m_outsideArea->getPropertiesOutside()->itemsSelected(graphicsItems, allItems);
304 }
305 
307 {
308  QList<QGraphicsItem*> graphicsItems = scene()->selectedItems();
309  //Refresh Inspector Object window
310  if(m_outsideArea->getObjectInspectorOutside())
311  m_outsideArea->getObjectInspectorOutside()->itemsInspector(graphicsItems);
312 }
313 
315 {
316  m_outsideArea = outsideArea;
317 }
318 
320 {
321  Scene* sc = dynamic_cast<Scene*>(scene());
322  QList<QGraphicsItem*> graphicsItems = this->scene()->selectedItems();
323 
324  if(sc)
325  {
326  QGraphicsItemGroup* group = sc->createItemGroup(graphicsItems);
327 
328  if(!group)
329  return;
330 
331  ItemGroup* layoutGroup = dynamic_cast<ItemGroup*>(group);
332 
333  if(!layoutGroup)
334  return;
335 
336  layoutGroup->redraw();
337 
338  /*If "enabled=true", QGraphicsItemGroup will handle all the events. For example,
339  the event of mouse click on the child item won't be handled by child item.
340  If "enabled=false", QGraphicsItem Group will not block the child item's event
341  and let child item handle it own event.*/
342  group->setHandlesChildEvents(true);
343  }
344 }
345 
347 {
348  Scene* sc = dynamic_cast<Scene*>(scene());
349  QList<QGraphicsItem*> graphicsItems = this->scene()->selectedItems();
350 
351  foreach( QGraphicsItem *item, graphicsItems)
352  {
353  if (item)
354  {
355  QGraphicsItemGroup* group = dynamic_cast<QGraphicsItemGroup*>(item);
356  if(group)
357  {
358  if(sc)
359  {
360  sc->destroyItemGroup(group);
361  }
362  }
363  }
364  }
365 }
366 
368 {
369  //Use ScrollHand Drag Mode to enable Panning
370  //You do need the enable scroll bars for that to work.
371  setDragMode(RubberBandDrag);
372  //Whole view not interactive while in ScrollHandDrag Mode
373  setInteractive(true);
374  setCursor(Qt::ArrowCursor);
375 }
376 
378 {
379  outsideAreaChangeContext(change);
380 }
381 
383 {
384  if(!change)
385  return;
386 
387  Scene* sc = dynamic_cast<Scene*>(scene());
388 
389  if(!sc)
390  return;
391 
393  QList<QGraphicsItem*> graphicsItems;
394 
395  switch(mode)
396  {
398  {
399  break;
400  }
401  case TypeNewTemplate:
402  {
403  sc->refresh();
404  m_visualizationArea->build();
405  resetDefaultConfig();
406  break;
407  }
408  case TypeExportPropsJSON:
409  {
410  sc->exportPropsAsJSON();
411  resetDefaultConfig();
412  break;
413  }
414  case TypeImportJSONProps:
415  {
416  sc->buildTemplate(m_visualizationArea);
417  resetDefaultConfig();
418  break;
419  }
420  case TypeMapPan:
421  {
422  graphicsItems = sc->selectedItems();
423  if(te::layout::getMapItemList(graphicsItems).empty())
424  {
425  resetDefaultConfig();
426  }
427  else
428  {
430  }
431  break;
432  }
433  case TypeMapZoomIn:
434  {
435  graphicsItems = sc->selectedItems();
436  if(te::layout::getMapItemList(graphicsItems).empty())
437  {
438  resetDefaultConfig();
439  }
440  else
441  {
443  }
444  break;
445  }
446  case TypeMapZoomOut:
447  {
448  graphicsItems = sc->selectedItems();
449  if(te::layout::getMapItemList(graphicsItems).empty())
450  {
451  resetDefaultConfig();
452  }
453  else
454  {
456  }
457  break;
458  }
459  case TypePan:
460  {
461  //Use ScrollHand Drag Mode to enable Panning
462  //You do need the enable scroll bars for that to work.
463  setDragMode(ScrollHandDrag);
464  //Whole view not interactive while in ScrollHandDrag Mode
465  setInteractive(false);
466  break;
467  }
468  case TypeGroup:
469  {
470  createItemGroup();
471  resetDefaultConfig();
472  }
473  break;
474  case TypeUngroup:
475  {
476  destroyItemGroup();
477  resetDefaultConfig();
478  }
479  break;
480  case TypePrinter:
481  {
482  sc->printPreview();
483  }
484  break;
485  case TypeExit:
486  {
487  //hide();
488  }
489  break;
490  default:
491  {
492  resetDefaultConfig();
493  }
494  }
495 }
virtual void config()
Definition: View.cpp:197
void hideEvent(QHideEvent *event)
Definition: View.cpp:259
virtual void mouseMoveEvent(QMouseEvent *event)
Definition: View.cpp:115
virtual void printPreview(bool isPdf=false)
Definition: Scene.cpp:366
virtual void savePaperAsImage()
Definition: Scene.cpp:397
virtual void buildTemplate(VisualizationArea *vzArea)
Definition: Scene.cpp:608
virtual void resizeEvent(QResizeEvent *event)
Definition: View.cpp:239
virtual te::gm::Envelope * getWorldBox() const
Definition: Scene.cpp:334
virtual void onAddItemFinalized()
Definition: View.cpp:306
virtual void refresh()
Definition: Scene.cpp:573
virtual void resetDefaultConfig()
Definition: View.cpp:367
An utility struct for representing 2D coordinates.
Definition: Coord2D.h:40
virtual void deleteItems()
Definition: Scene.cpp:639
const double & getUpperRightY() const
It returns a constant refernce to the x coordinate of the upper right corner.
Definition: Envelope.h:420
virtual void showEvent(QShowEvent *event)
Definition: View.cpp:281
virtual void createItem(const te::gm::Coord2D &coord)
Definition: Scene.cpp:657
LayoutMode
Enum LayoutMode. This is the enumeration of the components types.
Definition: EnumMode.h:38
View(QWidget *widget=(QWidget *) 0)
Definition: View.cpp:65
virtual void onMainMenuChangeContext(bool change)
Definition: View.cpp:377
virtual int metric(PaintDeviceMetric metric) const
Definition: View.cpp:244
virtual void setCurrentToolInSelectedMapItems(LayoutMode mode)
Definition: Scene.cpp:677
QGraphicsItemGroup * createItemGroup(const QList< QGraphicsItem * > &items)
Definition: Scene.cpp:178
An Envelope defines a 2D rectangular region.
Definition: Envelope.h:51
virtual void createItemGroup()
Definition: View.cpp:319
virtual void outsideAreaChangeContext(bool change)
Definition: View.cpp:382
virtual void redrawItems()
Definition: Scene.cpp:160
virtual void onToolbarChangeContext(bool change)
Definition: View.cpp:292
virtual void keyPressEvent(QKeyEvent *keyEvent)
Definition: View.cpp:164
void wheelEvent(QWheelEvent *event)
Definition: View.cpp:135
virtual void init(double widthMM, double heightMM)
Definition: Scene.cpp:88
void setLineIntersectionHzr(QLineF *line)
Definition: Scene.cpp:704
virtual void mousePressEvent(QMouseEvent *event)
Definition: View.cpp:101
TELAYOUTEXPORT std::vector< MapItem * > getMapItemList(QList< QGraphicsItem * > graphicsItems)
Definition: ItemUtils.cpp:39
void setOutsideArea(OutsideArea *outsideArea)
Definition: View.cpp:314
void setLineIntersectionVrt(QLineF *line)
Definition: Scene.cpp:709
virtual bool exportPropsAsJSON()
Definition: Scene.cpp:478
void scaleView(qreal scaleFactor)
Definition: View.cpp:142
const double & getLowerLeftX() const
It returns a constant reference to the x coordinate of the lower left corner.
Definition: Envelope.h:390
void closeEvent(QCloseEvent *event)
Definition: View.cpp:270
virtual void paintEvent(QPaintEvent *event)
Definition: View.cpp:254
virtual void savePaperAsPDF()
Definition: Scene.cpp:412
virtual void redraw(const double &scaleFactor=1.)
static Context * getInstance()
This function is called to create an instance of the class.
Definition: Context.cpp:46
LayoutMode getMode()
Definition: Context.cpp:56
virtual QTransform getMatrixViewScene()
Definition: Scene.cpp:344
void destroyItemGroup(QGraphicsItemGroup *group)
Definition: Scene.cpp:210
virtual void onSelectionChanged()
Definition: View.cpp:297
virtual void destroyItemGroup()
Definition: View.cpp:346
QLineF * m_lineIntersectHrz
Definition: View.h:110
QLineF * m_lineIntersectVrt
Definition: View.h:111