X-Git-Url: https://git.sven.stormbind.net/?a=blobdiff_plain;f=src%2Fflagrow.cpp;fp=src%2Fflagrow.cpp;h=7699ec65e50301b98f7d291acc7020b00e088e3d;hb=d483bd8e6523c23c6f1d8908a2e0611c2bc9ff4f;hp=0000000000000000000000000000000000000000;hpb=7dfa3fe589d1722d49681f42cdb0bf1e6efb5223;p=sven%2Fvym.git diff --git a/src/flagrow.cpp b/src/flagrow.cpp new file mode 100644 index 0000000..7699ec6 --- /dev/null +++ b/src/flagrow.cpp @@ -0,0 +1,219 @@ +#include + +#include "flagrow.h" +#include "mainwindow.h" + +extern bool debug; +extern Main *mainWindow; + +///////////////////////////////////////////////////////////////// +// FlagRow +///////////////////////////////////////////////////////////////// +FlagRow::FlagRow() +{ + //qDebug()<< "Const FlagRow ()"; + masterRow = NULL; +} + +FlagRow::~FlagRow() +{ + //qDebug()<< "Destr FlagRow masterRow=" << masterRow; +} + +const QStringList FlagRow::activeFlagNames() { return QStringList(); } + +const QList FlagRow::activeFlagUids() { return activeUids; } + +bool FlagRow::isActive(const QString &name) +{ + Flag *f = masterRow->findFlagByName(name); + if (!f) { + qWarning() << "FlagRow::isActive couldn't find flag named " << name; + return false; + } + + return isActive(f->getUuid()); +} + +bool FlagRow::isActive(const QUuid &uid) +{ + QUuid i; + foreach (i, activeUids) + if (i == uid) + return true; + return false; +} + +bool FlagRow::toggle(const QString &name, bool useGroups) +{ + // First get UID from mastRow + if (!masterRow) { + qWarning() << "FlagRow::toggle name " << name << " no masterRow"; + return false; + } + + Flag *flag = masterRow->findFlagByName(name); + if (!flag) { + qWarning() << "FlagRow::toggle name " << name + << " masterRow has no such flag"; + return false; + } + + return toggle(flag->getUuid()); +} + +bool FlagRow::toggle(const QUuid &uid, bool useGroups) +{ + // returns true, if flag really is changed + + if (isActive(uid)) { + return deactivate(uid); + } + else { + if (!activate(uid)) + return false; + + // From here on we have been able to activate the flag + + if (!useGroups) + return true; + + if (!masterRow) { + qWarning() << "FlagRow::toggle no masterRow defined for UID " + << uid.toString(); + return true; + } + + // Deactivate all other active flags group except "name" + Flag *flag = masterRow->findFlagByUid(uid); + if (!flag) + return true; + + QString mygroup = flag->getGroup(); + + for (int i = 0; i < activeUids.size(); ++i) { + flag = masterRow->findFlagByUid(activeUids.at(i)); + if (uid != activeUids.at(i) && !mygroup.isEmpty() && + mygroup == flag->getGroup()) + deactivate(activeUids.at(i)); + } + } + return true; +} + +bool FlagRow::activate(const QString &name) +{ + if (!masterRow) { + qWarning() << "FlagRow::activate - no masterRow to activate " << name; + return false; + } + + // Check, if flag exists after all... + Flag *flag = masterRow->findFlagByName(name); + if (!flag) { + qWarning() << "FlagRow::activate - flag " << name + << " does not exist here!"; + return false; + } + + // Some flags might be hidden, if inactive + if (!flag->isVisible()) { + QAction *action = flag->getAction(); + if (action) + action->setVisible(true); + } + + QUuid uid = flag->getUuid(); + if (!activeUids.contains(uid)) activeUids.append(uid); + return true; +} + +bool FlagRow::activate(const QUuid &uid) +{ + if (isActive(uid)) { + if (debug) + qWarning() << QString("FlagRow::activate - %1 is already active") + .arg(uid.toString()); + return true; + } + + if (!masterRow) { + qWarning() << "FlagRow::activate - no masterRow to activate " + << uid.toString(); + return false; + } + + // Check, if flag exists after all... + Flag *flag = masterRow->findFlagByUid(uid); + if (!flag) { + qWarning() << "FlagRow::activate - flag " << uid.toString() + << " does not exist here!"; + return false; + } + + activeUids.append(uid); + return true; +} + +bool FlagRow::deactivate(const QString &name) +{ + Flag *flag = masterRow->findFlagByName(name); + return deactivate(flag->getUuid()); +} + +bool FlagRow::deactivate(const QUuid &uid) +{ + int n = activeUids.indexOf(uid); + if (n >= 0) { + activeUids.removeAt(n); + // Returns true, if flag is changed + return true; + } + if (debug) + qWarning() << QString("FlagRow::deactivate - %1 is not active") + .arg(uid.toString()); + return false; +} + +bool FlagRow::deactivateGroup(const QString &gname) +{ + if (!masterRow) + return false; + if (gname.isEmpty()) + return false; + + foreach (QUuid uid, activeUids) { + Flag *flag = masterRow->findFlagByUid(uid); + if (flag && gname == flag->getGroup()) + deactivate(flag->getUuid()); + } + return true; +} + +void FlagRow::deactivateAll() +{ + activeUids.clear(); +} + +QString FlagRow::saveState() +{ + QString s; + + if (!activeUids.isEmpty()) + for (int i = 0; i < activeUids.size(); ++i) { + Flag *flag = masterRow->findFlagByUid(activeUids.at(i)); + + // save flag to xml, if flag is set + s += flag->saveState(); + + // and tell parentRow, that this flag is used + // + // FIXME-3 used flag IDs should be saved for each vymmodel to avoid + // problems in parallel saving of maps + flag->setUsed(true); + } + return s; +} + +void FlagRow::setMasterRow(FlagRowMaster *row) { masterRow = row; } +