]> git.sven.stormbind.net Git - sven/vym.git/blobdiff - src/flagrowobj.cpp
New upstream version 2.9.22
[sven/vym.git] / src / flagrowobj.cpp
diff --git a/src/flagrowobj.cpp b/src/flagrowobj.cpp
new file mode 100644 (file)
index 0000000..9a707da
--- /dev/null
@@ -0,0 +1,162 @@
+#include <QDebug>
+#include <QToolBar>
+
+#include "flag.h"
+#include "flagrowobj.h"
+
+#include "geometry.h"
+
+/////////////////////////////////////////////////////////////////
+// FlagRowObj
+/////////////////////////////////////////////////////////////////
+FlagRowObj::FlagRowObj()
+{
+    //    qDebug() << "Const FlagRowObj ()";
+}
+
+FlagRowObj::FlagRowObj(QGraphicsItem *parent) : MapObj(parent)
+{
+    //    qDebug() << "Const FlagRowObj (p)";
+}
+
+FlagRowObj::~FlagRowObj()
+{
+    // qDebug() << "Destr FlagRowObj";
+    while (!flagobjs.isEmpty())
+        delete (flagobjs.takeFirst());
+}
+
+void FlagRowObj::move(double x, double y)
+{
+    MapObj::move(x, y);
+    qreal dx = 0;
+    for (int i = 0; i < flagobjs.size(); ++i) {
+        flagobjs.at(i)->move(x + dx, y);
+        dx += QSizeF(flagobjs.at(i)->getSize()).width();
+    }
+}
+
+void FlagRowObj::moveBy(double x, double y)
+{
+    move(x + absPos.x(), y + absPos.y());
+}
+
+void FlagRowObj::setZValue(double z)
+{
+    QGraphicsItem::setZValue(z);
+    for (int i = 0; i < flagobjs.size(); ++i)
+        flagobjs.at(i)->setZValue(z);
+}
+
+void FlagRowObj::setVisibility(bool v)
+{
+    MapObj::setVisibility(v);
+    for (int i = 0; i < flagobjs.size(); ++i)
+        flagobjs.at(i)->setVisibility(v);
+}
+
+void FlagRowObj::updateActiveFlagObjs(const QList<QUuid> activeFlagUids,
+                                      FlagRowMaster *masterRowMain,
+                                      FlagRowMaster *masterRowOptional)
+{
+    bool changed = false;
+
+    // Add missing active flags
+    for (int i = 0; i <= activeFlagUids.size() - 1; i++) {
+        if (!isFlagActive(activeFlagUids.at(i))) {
+            Flag *f = masterRowMain->findFlagByUid(activeFlagUids.at(i));
+            if (f) {
+                activateFlag(f);
+                changed = true;
+            }
+            if (masterRowOptional) {
+                f = masterRowOptional->findFlagByUid(activeFlagUids.at(i));
+                if (f) {
+                    activateFlag(f);
+                    changed = true;
+                }
+            }
+        }
+    }
+
+    // Remove flags no longer active in TreeItem
+    foreach (FlagObj *fo, flagobjs)
+        if (!activeFlagUids.contains(fo->getUuid())) {
+            flagobjs.removeAll(fo);
+            delete (fo);
+            changed = true;
+        }
+
+    if (changed) {
+        calcBBoxSize();
+        positionBBox();
+    }
+}
+
+void FlagRowObj::positionBBox()
+{
+    bbox.moveTopLeft(absPos);
+    clickPoly = QPolygonF(bbox);
+}
+
+void FlagRowObj::calcBBoxSize()
+{
+    QSizeF size(0, 0);
+    QSizeF boxsize(0, 0);
+    for (int i = 0; i < flagobjs.size(); ++i) {
+        size = flagobjs.at(i)->getSize();
+        // add widths
+        boxsize.setWidth(boxsize.width() + size.width());
+        // maximize height
+        if (size.height() > boxsize.height())
+            boxsize.setHeight(size.height());
+    }
+    bbox.setSize(boxsize);
+    clickPoly = QPolygonF(bbox);
+}
+
+bool FlagRowObj::isFlagActive(const QUuid &uid)
+{
+    FlagObj *fo = findFlagObjByUid(uid);
+    if (fo)
+        return true;
+    else
+        return false;
+}
+
+void FlagRowObj::activateFlag(Flag *flag)
+{
+    if (flag) {
+        FlagObj *fo = new FlagObj(this);
+
+        // Loading an imageObj  will *copy* it
+        // and thus read the flag from cache
+        fo->loadImage(flag->getImageObj());
+
+        fo->setUuid(flag->getUuid());
+        fo->setZValue(QGraphicsItem::zValue());
+        fo->move(absPos.x() + bbox.width(), absPos.y());
+        fo->setVisibility(visible);
+        flagobjs.append(fo);
+        calcBBoxSize();
+        positionBBox();
+    }
+}
+
+FlagObj *FlagRowObj::findFlagObjByUid(const QUuid &uid)
+{
+    for (int i = 0; i < flagobjs.size(); ++i)
+        if (flagobjs.at(i)->getUuid() == uid)
+            return flagobjs.at(i);
+    return NULL;
+}
+
+QUuid FlagRowObj::findFlagUidByPos(const QPointF &p)
+{
+    if (!isInBox(p, clickPoly.boundingRect()))
+        return QUuid();
+    for (int i = 0; i < flagobjs.size(); ++i)
+        if (isInBox(p, flagobjs.at(i)->getClickPoly().boundingRect()))
+            return flagobjs.at(i)->getUuid();
+    return QUuid();
+}