X-Git-Url: https://git.sven.stormbind.net/?a=blobdiff_plain;f=src%2Fflagrowobj.cpp;fp=src%2Fflagrowobj.cpp;h=9a707dac56d64727ce7b173255706c0dfd97e5d9;hb=d483bd8e6523c23c6f1d8908a2e0611c2bc9ff4f;hp=0000000000000000000000000000000000000000;hpb=7dfa3fe589d1722d49681f42cdb0bf1e6efb5223;p=sven%2Fvym.git diff --git a/src/flagrowobj.cpp b/src/flagrowobj.cpp new file mode 100644 index 0000000..9a707da --- /dev/null +++ b/src/flagrowobj.cpp @@ -0,0 +1,162 @@ +#include +#include + +#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 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(); +}