]> git.sven.stormbind.net Git - sven/vym.git/blob - src/flagrowobj.cpp
Replace Pierre as the maintainer
[sven/vym.git] / src / flagrowobj.cpp
1 #include <QDebug>
2 #include <QToolBar>
3
4 #include "flag.h"
5 #include "flagrowobj.h"
6
7 #include "geometry.h"
8
9 /////////////////////////////////////////////////////////////////
10 // FlagRowObj
11 /////////////////////////////////////////////////////////////////
12 FlagRowObj::FlagRowObj()
13 {
14     //    qDebug() << "Const FlagRowObj ()";
15 }
16
17 FlagRowObj::FlagRowObj(QGraphicsItem *parent) : MapObj(parent)
18 {
19     //    qDebug() << "Const FlagRowObj (p)";
20 }
21
22 FlagRowObj::~FlagRowObj()
23 {
24     // qDebug() << "Destr FlagRowObj";
25     while (!flagobjs.isEmpty())
26         delete (flagobjs.takeFirst());
27 }
28
29 void FlagRowObj::move(double x, double y)
30 {
31     MapObj::move(x, y);
32     qreal dx = 0;
33     for (int i = 0; i < flagobjs.size(); ++i) {
34         flagobjs.at(i)->move(x + dx, y);
35         dx += QSizeF(flagobjs.at(i)->getSize()).width();
36     }
37 }
38
39 void FlagRowObj::moveBy(double x, double y)
40 {
41     move(x + absPos.x(), y + absPos.y());
42 }
43
44 void FlagRowObj::setZValue(double z)
45 {
46     QGraphicsItem::setZValue(z);
47     for (int i = 0; i < flagobjs.size(); ++i)
48         flagobjs.at(i)->setZValue(z);
49 }
50
51 void FlagRowObj::setVisibility(bool v)
52 {
53     MapObj::setVisibility(v);
54     for (int i = 0; i < flagobjs.size(); ++i)
55         flagobjs.at(i)->setVisibility(v);
56 }
57
58 void FlagRowObj::updateActiveFlagObjs(const QList<QUuid> activeFlagUids,
59                                       FlagRowMaster *masterRowMain,
60                                       FlagRowMaster *masterRowOptional)
61 {
62     bool changed = false;
63
64     // Add missing active flags
65     for (int i = 0; i <= activeFlagUids.size() - 1; i++) {
66         if (!isFlagActive(activeFlagUids.at(i))) {
67             Flag *f = masterRowMain->findFlagByUid(activeFlagUids.at(i));
68             if (f) {
69                 activateFlag(f);
70                 changed = true;
71             }
72             if (masterRowOptional) {
73                 f = masterRowOptional->findFlagByUid(activeFlagUids.at(i));
74                 if (f) {
75                     activateFlag(f);
76                     changed = true;
77                 }
78             }
79         }
80     }
81
82     // Remove flags no longer active in TreeItem
83     foreach (FlagObj *fo, flagobjs)
84         if (!activeFlagUids.contains(fo->getUuid())) {
85             flagobjs.removeAll(fo);
86             delete (fo);
87             changed = true;
88         }
89
90     if (changed) {
91         calcBBoxSize();
92         positionBBox();
93     }
94 }
95
96 void FlagRowObj::positionBBox()
97 {
98     bbox.moveTopLeft(absPos);
99     clickPoly = QPolygonF(bbox);
100 }
101
102 void FlagRowObj::calcBBoxSize()
103 {
104     QSizeF size(0, 0);
105     QSizeF boxsize(0, 0);
106     for (int i = 0; i < flagobjs.size(); ++i) {
107         size = flagobjs.at(i)->getSize();
108         // add widths
109         boxsize.setWidth(boxsize.width() + size.width());
110         // maximize height
111         if (size.height() > boxsize.height())
112             boxsize.setHeight(size.height());
113     }
114     bbox.setSize(boxsize);
115     clickPoly = QPolygonF(bbox);
116 }
117
118 bool FlagRowObj::isFlagActive(const QUuid &uid)
119 {
120     FlagObj *fo = findFlagObjByUid(uid);
121     if (fo)
122         return true;
123     else
124         return false;
125 }
126
127 void FlagRowObj::activateFlag(Flag *flag)
128 {
129     if (flag) {
130         FlagObj *fo = new FlagObj(this);
131
132         // Loading an imageObj  will *copy* it
133         // and thus read the flag from cache
134         fo->loadImage(flag->getImageObj());
135
136         fo->setUuid(flag->getUuid());
137         fo->setZValue(QGraphicsItem::zValue());
138         fo->move(absPos.x() + bbox.width(), absPos.y());
139         fo->setVisibility(visible);
140         flagobjs.append(fo);
141         calcBBoxSize();
142         positionBBox();
143     }
144 }
145
146 FlagObj *FlagRowObj::findFlagObjByUid(const QUuid &uid)
147 {
148     for (int i = 0; i < flagobjs.size(); ++i)
149         if (flagobjs.at(i)->getUuid() == uid)
150             return flagobjs.at(i);
151     return NULL;
152 }
153
154 QUuid FlagRowObj::findFlagUidByPos(const QPointF &p)
155 {
156     if (!isInBox(p, clickPoly.boundingRect()))
157         return QUuid();
158     for (int i = 0; i < flagobjs.size(); ++i)
159         if (isInBox(p, flagobjs.at(i)->getClickPoly().boundingRect()))
160             return flagobjs.at(i)->getUuid();
161     return QUuid();
162 }