]> git.sven.stormbind.net Git - sven/vym.git/blobdiff - src/flagrow.cpp
New upstream version 2.9.22
[sven/vym.git] / src / flagrow.cpp
diff --git a/src/flagrow.cpp b/src/flagrow.cpp
new file mode 100644 (file)
index 0000000..7699ec6
--- /dev/null
@@ -0,0 +1,219 @@
+#include <QDebug>
+
+#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<QUuid> 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; }
+