]> git.sven.stormbind.net Git - sven/vym.git/blob - src/flagrow.cpp
New upstream version 2.9.22
[sven/vym.git] / src / flagrow.cpp
1 #include <QDebug>
2
3 #include "flagrow.h"
4 #include "mainwindow.h"
5
6 extern bool debug;
7 extern Main *mainWindow;
8
9 /////////////////////////////////////////////////////////////////
10 // FlagRow
11 /////////////////////////////////////////////////////////////////
12 FlagRow::FlagRow()
13 {
14     //qDebug()<< "Const FlagRow ()";
15     masterRow = NULL;
16 }
17
18 FlagRow::~FlagRow()
19 {
20     //qDebug()<< "Destr FlagRow   masterRow=" << masterRow;
21 }
22
23 const QStringList FlagRow::activeFlagNames() { return QStringList(); }
24
25 const QList<QUuid> FlagRow::activeFlagUids() { return activeUids; }
26
27 bool FlagRow::isActive(const QString &name)
28 {
29     Flag *f = masterRow->findFlagByName(name);
30     if (!f) {
31         qWarning() << "FlagRow::isActive couldn't find flag named " << name;
32         return false;
33     }
34
35     return isActive(f->getUuid());
36 }
37
38 bool FlagRow::isActive(const QUuid &uid)
39 {
40     QUuid i;
41     foreach (i, activeUids)
42         if (i == uid)
43             return true;
44     return false;
45 }
46
47 bool FlagRow::toggle(const QString &name, bool useGroups)
48 {
49     // First get UID from mastRow
50     if (!masterRow) {
51         qWarning() << "FlagRow::toggle name " << name << " no masterRow";
52         return false;
53     }
54
55     Flag *flag = masterRow->findFlagByName(name);
56     if (!flag) {
57         qWarning() << "FlagRow::toggle name " << name
58                    << " masterRow has no such flag";
59         return false;
60     }
61
62     return toggle(flag->getUuid());
63 }
64
65 bool FlagRow::toggle(const QUuid &uid, bool useGroups)
66 {
67     // returns true, if flag really is changed
68
69     if (isActive(uid)) {
70         return deactivate(uid);
71     }
72     else {
73         if (!activate(uid))
74             return false;
75
76         // From here on we have been able to activate the flag
77
78         if (!useGroups)
79             return true;
80
81         if (!masterRow) {
82             qWarning() << "FlagRow::toggle no masterRow defined for UID "
83                        << uid.toString();
84             return true;
85         }
86
87         // Deactivate all other active flags group except "name"
88         Flag *flag = masterRow->findFlagByUid(uid);
89         if (!flag)
90             return true;
91
92         QString mygroup = flag->getGroup();
93
94         for (int i = 0; i < activeUids.size(); ++i) {
95             flag = masterRow->findFlagByUid(activeUids.at(i));
96             if (uid != activeUids.at(i) && !mygroup.isEmpty() &&
97                 mygroup == flag->getGroup())
98                 deactivate(activeUids.at(i));
99         }
100     }
101     return true;
102 }
103
104 bool FlagRow::activate(const QString &name)
105 {
106     if (!masterRow) {
107         qWarning() << "FlagRow::activate - no masterRow to activate " << name;
108         return false;
109     }
110
111     // Check, if flag exists after all...
112     Flag *flag = masterRow->findFlagByName(name);
113     if (!flag) {
114         qWarning() << "FlagRow::activate - flag " << name
115                    << " does not exist here!";
116         return false;
117     }
118
119     // Some flags might be hidden, if inactive
120     if (!flag->isVisible()) {
121         QAction *action = flag->getAction();
122         if (action)
123             action->setVisible(true);
124     }
125
126     QUuid uid = flag->getUuid();
127     if (!activeUids.contains(uid)) activeUids.append(uid);
128     return true;
129 }
130
131 bool FlagRow::activate(const QUuid &uid)
132 {
133     if (isActive(uid)) {
134         if (debug)
135             qWarning() << QString("FlagRow::activate - %1 is already active")
136                               .arg(uid.toString());
137         return true;
138     }
139
140     if (!masterRow) {
141         qWarning() << "FlagRow::activate - no masterRow to activate "
142                    << uid.toString();
143         return false;
144     }
145
146     // Check, if flag exists after all...
147     Flag *flag = masterRow->findFlagByUid(uid);
148     if (!flag) {
149         qWarning() << "FlagRow::activate - flag " << uid.toString()
150                    << " does not exist here!";
151         return false;
152     }
153
154     activeUids.append(uid);
155     return true;
156 }
157
158 bool FlagRow::deactivate(const QString &name)
159 {
160     Flag *flag = masterRow->findFlagByName(name);
161     return deactivate(flag->getUuid());
162 }
163
164 bool FlagRow::deactivate(const QUuid &uid)
165 {
166     int n = activeUids.indexOf(uid);
167     if (n >= 0) {
168         activeUids.removeAt(n);
169         // Returns true, if flag is changed
170         return true;
171     }
172     if (debug)
173         qWarning() << QString("FlagRow::deactivate - %1 is not active")
174                           .arg(uid.toString());
175     return false;
176 }
177
178 bool FlagRow::deactivateGroup(const QString &gname)
179 {
180     if (!masterRow)
181         return false;
182     if (gname.isEmpty())
183         return false;
184
185     foreach (QUuid uid, activeUids) {
186         Flag *flag = masterRow->findFlagByUid(uid);
187         if (flag && gname == flag->getGroup())
188             deactivate(flag->getUuid());
189     }
190     return true;
191 }
192
193 void FlagRow::deactivateAll()
194 {
195     activeUids.clear();
196 }
197
198 QString FlagRow::saveState()
199 {
200     QString s;
201
202     if (!activeUids.isEmpty())
203         for (int i = 0; i < activeUids.size(); ++i) {
204             Flag *flag = masterRow->findFlagByUid(activeUids.at(i));
205
206             // save flag to xml, if flag is set
207             s += flag->saveState();
208
209             // and tell parentRow, that this flag is used
210             //
211             // FIXME-3 used flag IDs should be saved for each vymmodel to avoid
212             // problems in parallel saving of maps
213             flag->setUsed(true);
214         }
215     return s;
216 }
217
218 void FlagRow::setMasterRow(FlagRowMaster *row) { masterRow = row; }
219