#include "interactioncanvas.h" InteractionCanvas::InteractionCanvas(QWidget *parent) : QLabel(parent) { setFocusPolicy(Qt::StrongFocus); setMouseTracking(true); m_NewLine = NULL; m_SelectedLine = NULL; } void InteractionCanvas::clearLines() { for (int i = 0; i < m_Lines.size(); i++) { delete m_Lines[i]; } m_Lines.clear(); } InteractionCanvas::~InteractionCanvas() { clearLines(); if (m_NewLine) { delete m_NewLine; m_NewLine = NULL; } if (m_SelectedLine) { delete m_SelectedLine; m_SelectedLine = NULL; } } void InteractionCanvas::addLine() { Line *tmpLine = new Line(); tmpLine->setP1(QPoint(10, 50)); tmpLine->setP2(QPoint(30, 50)); addNewLine(tmpLine); m_NewLine = NULL; m_Lines.append(tmpLine); changeSelectedLine(tmpLine); } void InteractionCanvas::addRectangle() { Line *tmpLine = new Rectangle(); addNewLine(tmpLine); m_NewLine = NULL; m_Lines.append(tmpLine); changeSelectedLine(tmpLine); } void InteractionCanvas::addEllipse() { Line *tmpLine = new Ellipse(); addNewLine(tmpLine); m_NewLine = NULL; m_Lines.append(tmpLine); changeSelectedLine(tmpLine); } void InteractionCanvas::addPolygon() { Line *tmpLine = new Polygon(); addNewLine(tmpLine); m_NewLine = NULL; m_Lines.append(tmpLine); changeSelectedLine(tmpLine); } void InteractionCanvas::read(QFile *file) { m_fileName.setContent(file, false); QDomElement root = m_fileName.documentElement(); if (root.tagName() == "geometric_objects") { QDomElement child = root.firstChildElement(); Line *line = NULL; clearLines(); while (!child.isNull()) { line = NULL; if (child.tagName() == "Line") { line = new Line(); } if (child.tagName() == "Rectangle") { line = new Rectangle(); } if (child.tagName() == "Ellipse") { line = new Ellipse(); } if (child.tagName() == "Polygon") { line = new Polygon(); } if (line != NULL) { line->fromDomElement(child); line->setSelected(false); m_Lines.append(line); } child = child.nextSiblingElement(); } } } void InteractionCanvas::write(QFile *file) { const int IndentSize = 4; m_fileName.clear(); QDomElement root = m_fileName.createElement("geometric_objects"); m_fileName.appendChild(root); QListIterator childs(m_Lines); Line *child = NULL; while (childs.hasNext()) { child = childs.next(); root.appendChild(child->toDomElement(&m_fileName)); } QTextStream out(file); m_fileName.save(out, IndentSize); } void InteractionCanvas::mouseMoveEvent(QMouseEvent *mouseEvent) { qDebug() << "InteractionCanvas:" << mouseEvent->pos(); if (mouseEvent->buttons() == Qt::LeftButton) { if (m_SelectedLine) { m_SelectedLine->move(m_LastMousePosition, mouseEvent->pos()); } if (m_NewLine) { m_NewLine->setP2(mouseEvent->pos()); } update(); } m_LastMousePosition = mouseEvent->pos(); } void InteractionCanvas::mousePressEvent(QMouseEvent *mouseEvent) { qDebug() << "InteractionCanvas: Mouse: pressed:" << mouseEvent->button(); if (mouseEvent->button() == Qt::LeftButton) { if (!m_SelectedLine) { m_MousePressPoint = mouseEvent->pos(); m_LastMousePosition = m_MousePressPoint; addNewLine(new Line); m_NewLine->setP1(m_MousePressPoint); m_NewLine->setP2(m_LastMousePosition); } } if (mouseEvent->button() == Qt::RightButton) { changeSelectedLine(NULL); for (int i = 0; i < m_Lines.size() && !m_SelectedLine; i++) { if (m_Lines[i]->isHit(mouseEvent->pos())) { changeSelectedLine(m_Lines[i]); } } } update(); } void InteractionCanvas::mouseReleaseEvent(QMouseEvent *mouseEvent) { qDebug() << "InteractionCanvas: Mouse: released:" << mouseEvent->button(); if (mouseEvent->button() == Qt::LeftButton) { if (m_NewLine) { m_MouseReleasePoint = mouseEvent->pos(); m_NewLine->setP2(m_MouseReleasePoint); m_NewLine->setSelected(false); m_Lines.append(m_NewLine); m_NewLine = NULL; } } update(); } void InteractionCanvas::keyPressEvent(QKeyEvent *keyEvent) { qDebug() << "InteractionCanvas: Key: pressed:" << keyEvent->key() << "(" << keyEvent->text() << ")" << (keyEvent->isAutoRepeat() ? "druck" : ""); if (!m_Lines.isEmpty() && keyEvent->key() == Qt::Key_Z && keyEvent->modifiers() == Qt::ControlModifier) { if (m_SelectedLine == m_Lines.last()) { m_SelectedLine = NULL; } delete m_Lines.last(); m_Lines.removeLast(); update(); } } void InteractionCanvas::keyReleaseEvent(QKeyEvent *keyEvent) { qDebug() << "InteractionCanvas: Key: released:" << keyEvent->key() << "(" << keyEvent->text() << ")" << (keyEvent->isAutoRepeat() ? "druck" : ""); } /** * @brief InteractionCanvas::changeSelectedLine * @param newSelectedLine * The new selected line or null to simply deselect. */ void InteractionCanvas::changeSelectedLine(Line *newSelectedLine) { if (m_SelectedLine) { m_SelectedLine->setSelected(false); m_SelectedLine = NULL; } if (newSelectedLine) { m_SelectedLine = newSelectedLine; m_SelectedLine->setSelected(true); } } void InteractionCanvas::addNewLine(Line *newLine) { if (m_NewLine) { delete m_NewLine; m_NewLine = NULL; } if (newLine) { m_NewLine = new Line(); } } void InteractionCanvas::paintEvent(QPaintEvent *paintEvent) { // Setup the Painters QPainter painter(this); if (m_NewLine) { m_NewLine->draw(&painter); } foreach (Line *line, m_Lines) { line->draw(&painter); } }