Go to the documentation of this file.00001 #include "arenascene.h"
00002 #include "arenasceneelement.h"
00003
00004 #include "../model/arena.h"
00005 #include "../model/arenaelement.h"
00006 #include "../model/arenaelementtype.h"
00007
00008 #include <QDebug>
00009 #include <QGraphicsPixmapItem>
00010 #include <QPixmap>
00011 #include <QPen>
00012 #include <QBrush>
00013 #include <QMimeData>
00014
00015 #include <cmath>
00016
00017 ArenaScene::ArenaScene(Arena *arena)
00018 : m_arena(arena)
00019 {
00020 connect(arena, SIGNAL(elementAdded(ArenaElement*)),
00021 SLOT(slotElementAdded(ArenaElement*)));
00022 connect(arena, SIGNAL(elementRemoved(ArenaElement*)),
00023 SLOT(slotElementRemoved(ArenaElement*)));
00024 connect(arena, SIGNAL(modified()),
00025 SLOT(updateViewMargin()));
00026
00027 foreach (ArenaElement *element, arena->elements())
00028 slotElementAdded(element);
00029
00030 updateViewMargin();
00031 }
00032
00033 QPoint ArenaScene::sceneToGrid(QPointF scenePos)
00034 {
00035 QPointF gridPos = sceneToGridF(scenePos);
00036 return QPoint(qRound(gridPos.x()), qRound(gridPos.y()));
00037 }
00038
00039 QPointF ArenaScene::sceneToGridF(QPointF scenePos)
00040 {
00041 #if 0
00042 qreal x = scenePos.x() + SPACING;
00043
00044 qreal y = -(scenePos.y() + SPACING);
00045 return QPointF(x / (qreal)CELL_SIZE - 0.5, y / (qreal)CELL_SIZE + 0.5);
00046 #endif
00047 return QPointF(scenePos.x() / (qreal)CELL_SIZE, -scenePos.y() / (qreal)CELL_SIZE);
00048 }
00049
00050 QPointF ArenaScene::gridToScene(QPointF gridPos)
00051 {
00052
00053 return QPointF(gridPos.x() * CELL_SIZE, -gridPos.y() * CELL_SIZE);
00054 }
00055
00056 QPointF ArenaScene::nearestGridPoint(QPointF scenePos)
00057 {
00058 return gridToScene(sceneToGrid(scenePos));
00059 }
00060
00061 QList<ArenaSceneElement*> ArenaScene::selectedElements()
00062 {
00063 QList<ArenaSceneElement*> list;
00064 foreach(QGraphicsItem* item, selectedItems())
00065 {
00066 ArenaSceneElement* element = dynamic_cast<ArenaSceneElement*>(item);
00067 if (element)
00068 list.append(element);
00069 }
00070
00071 return list;
00072 }
00073
00074 ArenaSceneElement *ArenaScene::sceneElementFor(ArenaElement *element)
00075 {
00076 return m_elements[element];
00077 }
00078
00079 void ArenaScene::updateViewMargin()
00080 {
00081
00082 int left = -1;
00083 int right = 1;
00084 int top = 1;
00085 int bottom = -1;
00086 foreach(ArenaSceneElement* element, m_elements)
00087 {
00088 QPoint pos = element->element()->pos();
00089 left = qMin(left, pos.x());
00090 right = qMax(right, pos.x());
00091 top = qMax(top, pos.y());
00092 bottom = qMin(bottom, pos.y());
00093 }
00094 QPointF topLeft = gridToScene(QPoint(left, top));
00095 QPointF bottomRight = gridToScene(QPoint(right, bottom));
00096 setSceneRect(QRectF(topLeft, bottomRight));
00097 }
00098
00099 void ArenaScene::slotElementAdded(ArenaElement *element)
00100 {
00101 ArenaSceneElement *sceneElement = new ArenaSceneElement(element);
00102
00103 m_elements[element] = sceneElement;
00104 addItem(sceneElement);
00105
00106 updateViewMargin();
00107 }
00108
00109 void ArenaScene::slotElementRemoved(ArenaElement *element)
00110 {
00111 ArenaSceneElement *sceneElement = m_elements[element];
00112 Q_ASSERT(sceneElement);
00113
00114 removeItem(sceneElement);
00115 m_elements.remove(element);
00116 delete sceneElement;
00117
00118 updateViewMargin();
00119 }