LibreCAD
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Friends Macros
lcadviewer.cpp
Go to the documentation of this file.
1 #include "lcadviewer.h"
2 #include <QtGui>
3 #include <QVBoxLayout>
4 
5 using namespace LCViewer;
6 
7 LCADViewer::LCADViewer(QWidget *parent) :
8  QWidget(parent),
9  _docCanvas(nullptr),
10  _mouseScrollKeyActive(false),
11  _operationActive(false),
12  _scale(1.0),
13  _zoomMin(0.05),
14  _zoomMax(20.0),
15  _scaleLineWidth(false) {
16 
17  setMouseTracking(true);
18  this->_altKeyActive = false;
19  this->_ctrlKeyActive = false;
20  setCursor(Qt::BlankCursor);
21 }
22 
25 
26  _document->commitProcessEvent().disconnect<LCADViewer, &LCADViewer::on_commitProcessEvent>(this);
27 }
28 
29 
30 void LCADViewer::setDocument(std::shared_ptr<lc::Document> document) {
31  int width = size().width();
32  int height = size().height();
33 
34  createPainters(width, height);
35 
36  _docCanvas = std::make_shared<DocumentCanvas>(document, [this](double* x, double* y) {
37  _documentPainter->device_to_user(x, y);
38  });
39 
40  _document = document;
41  _document->commitProcessEvent().connect<LCADViewer, &LCADViewer::on_commitProcessEvent>(this);
42 }
43 
44 void LCADViewer::setSnapManager(std::shared_ptr<SnapManager> snapmanager) {
45  _snapManager = snapmanager;
46 }
47 
48 void LCADViewer::setDragManager(DragManager_SPtr dragManager) {
49  _dragManager = dragManager;
50 }
51 
52 
53 void LCADViewer::on_commitProcessEvent(const lc::CommitProcessEvent &) {
55  update();
56 }
57 
58 
59 
64 void LCADViewer::keyPressEvent(QKeyEvent *event) {
65 
66  QWidget::keyPressEvent(event);
67 
68  switch (event->key()) {
69  case Qt::Key_Shift:
70  // When shift key is released we switch back to rubber band
71  // setDragMode(QGraphicsView::ScrollHandDrag);
72  break;
73 
74  case Qt::Key_Alt:
75  //
76  _altKeyActive = true;
77  break;
78 
79  case Qt::Key_Control:
80  _ctrlKeyActive = true;
81  break;
82  }
83 
84 }
85 
86 void LCADViewer::keyReleaseEvent(QKeyEvent *event) {
87  QWidget::keyReleaseEvent(event);
88 
89  switch (event->key()) {
90  case Qt::Key_Shift:
91  // When shift key is released we switch back to rubber band
92  // setDragMode(QGraphicsView::RubberBandDrag);
93  break;
94 
95  case Qt::Key_Alt:
96  //
97  _altKeyActive = false;
98  break;
99 
100  case Qt::Key_Control:
101  _ctrlKeyActive = false;
102  break;
103  }
104 }
105 
106 void LCADViewer::resizeEvent(QResizeEvent * event) {
107  deletePainters();
108  createPainters(event->size().width(), event->size().height());
109  _docCanvas->newDeviceSize(event->size().width(), event->size().height());
110 
112  updateDocument();
113 }
114 
115 void LCADViewer::wheelEvent(QWheelEvent *event) {
116 
117  if (event->angleDelta().y() > 0) {
118  for(auto pair : imagemaps) {
119  _docCanvas->zoom(*pair.first, 1.1, true, event->pos().x(), event->pos().y());
120  }
121  } else if (event->angleDelta().y() < 0) {
122  for(auto pair : imagemaps) {
123  _docCanvas->zoom(*pair.first, 0.9, true, event->pos().x(), event->pos().y());
124  }
125  }
126 
128  updateDocument();
129 
130  this->update();
131 }
132 
134  int val = v_ - v;
135  for(auto pair : imagemaps) {
136  pair.first->translate(0, val * 10);
137  }
138  v_ = v;
139 
141  updateDocument();
142  update();
143 }
144 
146  int val = h_ - v;
147  for(auto pair : imagemaps) {
148  pair.first->translate(val * 20, 0);
149  }
150  h_ = v;
151 
153  updateDocument();
154  update();
155 }
156 
157 
158 void LCADViewer::mouseMoveEvent(QMouseEvent *event) {
159  QWidget::mouseMoveEvent(event);
160 
161  _snapManager->setDeviceLocation(event->pos().x(), event->pos().y());
162  _dragManager->onMouseMove();
163 
164  // Selection by area
166  if (!startSelectPos.isNull()) {
167  this->_docCanvas->pan(*_documentPainter, event->pos().x(), event->pos().y());
168 
170  updateDocument();
171  }
172  } else {
173  if (!startSelectPos.isNull()) {
174  bool occopies = startSelectPos.x() < event->pos().x();
175  _docCanvas->makeSelectionDevice(
177  std::min(startSelectPos.x(), event->pos().x()) , std::min(startSelectPos.y(), event->pos().y()),
178  std::abs(startSelectPos.x() - event->pos().x()),
179  std::abs(startSelectPos.y() - event->pos().y()), occopies);
180 
181  updateDocument();
182  }
183  }
184 
185  emit mouseMoveEvent();
186 
187  update();
188 }
189 
190 void LCADViewer::mousePressEvent(QMouseEvent *event) {
191  QWidget::mousePressEvent(event);
192 
193  startSelectPos = event->pos();
194 
195  if(!_operationActive) {
196  _dragManager->onMousePress();
197  }
198 
199  if(_dragManager->entityDragged()) {
200  startSelectPos = QPoint();
201  }
202 
203  switch (event->buttons()) {
204  case Qt::MiddleButton: {
205  _mouseScrollKeyActive = true;
206  }
207  break;
208  }
209 
210  emit mousePressEvent();
211 }
212 
213 
214 void LCADViewer::mouseReleaseEvent(QMouseEvent *event) {
215  startSelectPos = QPoint();
216 
217  _dragManager->onMouseRelease();
218 
219  _docCanvas->closeSelection();
220 
221  std::vector<lc::EntityDistance> emptyList;
222  // MouseReleaseEvent e(this, _lastMousePosition, event, emptyList);
223  // emit mouseReleaseEvent(e);
224  switch (event->button()) {
225  case Qt::MiddleButton: {
226  _mouseScrollKeyActive = false;
227  } break;
228 
229  default: {
230 
231  } break;
232  }
233 
234  _docCanvas->removeSelectionArea();
235  updateDocument();
236 
237  emit mouseReleaseEvent();
238 
239  update();
240 }
241 
242 std::shared_ptr<DocumentCanvas> LCADViewer::documentCanvas() const {
243  return _docCanvas;
244 }
245 
246 void LCADViewer::setOperationActive(bool operationActive) {
247  _operationActive = operationActive;
248 
249  if(operationActive == false) {
250  documentCanvas()->removeSelection();
251  }
252 }
253 
254 void LCADViewer::paintEvent(QPaintEvent *p) {
255  if (p->rect().width() == 0 || p->rect().height() == 0) {
256  return;
257  }
258 
259  QPainter painter(this);
260 
261  _foregroundPainter->clear(1.0, 1.0, 1.0, 0.0);
262  _docCanvas->render(*_foregroundPainter, VIEWER_FOREGROUND);
263 
264  painter.drawImage(QPoint(0, 0), *imagemaps.at(_backgroundPainter));
265  painter.drawImage(QPoint(0, 0), *imagemaps.at(_documentPainter));
266  painter.drawImage(QPoint(0, 0), *imagemaps.at(_foregroundPainter));
267 
268  painter.end();
269 }
270 
271 void LCADViewer::createPainters(unsigned int width, unsigned int height) {
272  QImage *m_image;
273 
274  m_image = new QImage(width, height, QImage::Format_ARGB32);
275  _backgroundPainter = createCairoImagePainter(m_image->bits(), width, height);
276  imagemaps.insert(std::make_pair(_backgroundPainter, m_image));
277 
278  m_image = new QImage(width, height, QImage::Format_ARGB32);
279  _documentPainter = createCairoImagePainter(m_image->bits(), width, height);
280  imagemaps.insert(std::make_pair(_documentPainter, m_image));
281 
282  m_image = new QImage(width, height, QImage::Format_ARGB32);
283  _foregroundPainter = createCairoImagePainter(m_image->bits(), width, height);
284  imagemaps.insert(std::make_pair(_foregroundPainter, m_image));
285 }
286 
288  for(auto pair : imagemaps) {
289  delete pair.first;
290  delete pair.second;
291  }
292 
293  imagemaps.clear();
294 }
295 
297  _backgroundPainter->clear(1.0, 1.0, 1.0, 0.0);
298  _docCanvas->render(*_backgroundPainter, VIEWER_BACKGROUND);
299 }
300 
302  _documentPainter->clear(1.0, 1.0, 1.0, 0.0);
303  _docCanvas->render(*_documentPainter, VIEWER_DOCUMENT);
304 }
305 
306 const std::shared_ptr<DocumentCanvas>& LCADViewer::docCanvas() const {
307  return _docCanvas;
308 }
void on_commitProcessEvent(const lc::CommitProcessEvent &)
Definition: lcadviewer.cpp:53
virtual void wheelEvent(QWheelEvent *event)
Definition: lcadviewer.cpp:115
std::shared_ptr< SnapManager > _snapManager
Definition: lcadviewer.h:136
DragManager_SPtr _dragManager
Definition: lcadviewer.h:137
LCADViewer(QWidget *parent=0)
Definition: lcadviewer.cpp:7
virtual void keyReleaseEvent(QKeyEvent *event)
Definition: lcadviewer.cpp:86
void createPainters(unsigned int width, unsigned int height)
Definition: lcadviewer.cpp:271
void setDocument(std::shared_ptr< lc::Document > document)
Definition: lcadviewer.cpp:30
void setVerticalOffset(int v)
Definition: lcadviewer.cpp:133
virtual void resizeEvent(QResizeEvent *event)
Definition: lcadviewer.cpp:106
virtual void keyPressEvent(QKeyEvent *event)
Definition: lcadviewer.cpp:64
void setDragManager(DragManager_SPtr dragManager)
Definition: lcadviewer.cpp:48
const std::shared_ptr< DocumentCanvas > & docCanvas() const
Definition: lcadviewer.cpp:306
std::shared_ptr< DocumentCanvas > _docCanvas
Definition: lcadviewer.h:113
LcPainter * _foregroundPainter
Definition: lcadviewer.h:141
void setSnapManager(std::shared_ptr< SnapManager > snapmanager)
Definition: lcadviewer.cpp:44
std::shared_ptr< lc::Document > _document
Definition: lcadviewer.h:135
std::map< LcPainter *, QImage * > imagemaps
Definition: lcadviewer.h:118
void paintEvent(QPaintEvent *)
Definition: lcadviewer.cpp:254
LcPainter * _backgroundPainter
Definition: lcadviewer.h:139
std::shared_ptr< DocumentCanvas > documentCanvas() const
Definition: lcadviewer.cpp:242
void setHorizontalOffset(int v)
Definition: lcadviewer.cpp:145
void setOperationActive(bool operationActive)
Definition: lcadviewer.cpp:246
LcPainter * _documentPainter
Definition: lcadviewer.h:140