digikam
albumhistory.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "albumhistory.moc"
00026
00027
00028
00029 #include <QString>
00030 #include <QWidget>
00031
00032
00033
00034 #include "album.h"
00035
00036 namespace Digikam
00037 {
00038
00043 class HistoryItem
00044 {
00045 public:
00046
00047 HistoryItem()
00048 {
00049 album = 0;
00050 widget = 0;
00051 };
00052
00053 HistoryItem(Album *a, QWidget *w)
00054 {
00055 album = a;
00056 widget = w;
00057 };
00058
00059 bool operator==(const HistoryItem& item)
00060 {
00061 return (album == item.album) && (widget == item.widget);
00062 }
00063
00064 Album* album;
00065 QWidget* widget;
00066 };
00067
00068 AlbumHistory::AlbumHistory()
00069 {
00070 m_backwardStack = new AlbumStack;
00071 m_forwardStack = new AlbumStack;
00072 m_moving = false;
00073 }
00074
00075 AlbumHistory::~AlbumHistory()
00076 {
00077 clearHistory();
00078
00079 delete m_backwardStack;
00080 delete m_forwardStack;
00081 }
00082
00083 void AlbumHistory::clearHistory()
00084 {
00085 AlbumStack::const_iterator iter = m_backwardStack->constBegin();
00086
00087 for(; iter != m_backwardStack->constEnd(); ++iter)
00088 delete *iter;
00089
00090 m_backwardStack->clear();
00091
00092 iter = m_forwardStack->constBegin();
00093
00094 for(; iter != m_forwardStack->constEnd(); ++iter)
00095 delete *iter;
00096
00097 m_forwardStack->clear();
00098
00099 m_moving = false;
00100 }
00101
00102 void AlbumHistory::addAlbum(Album *album, QWidget *widget)
00103 {
00104 if(!album || !widget || m_moving)
00105 {
00106 m_moving = false;
00107 return;
00108 }
00109
00110
00111 if(!m_backwardStack->isEmpty() && m_backwardStack->last()->album == album)
00112 {
00113 m_backwardStack->last()->widget = widget;
00114 return;
00115 }
00116
00117 HistoryItem *item = new HistoryItem(album, widget);
00118
00119 m_backwardStack->push_back(item);
00120
00121
00122 if(!m_forwardStack->isEmpty())
00123 {
00124 AlbumStack::const_iterator iter = m_forwardStack->constBegin();
00125
00126 for(; iter != m_forwardStack->constEnd(); ++iter)
00127 delete *iter;
00128
00129 m_forwardStack->clear();
00130 }
00131 }
00132
00133 void AlbumHistory::deleteAlbum(Album *album)
00134 {
00135 if(!album || m_backwardStack->isEmpty())
00136 return;
00137
00138
00139 AlbumStack::iterator iter = m_backwardStack->begin();
00140 while(iter != m_backwardStack->end())
00141 {
00142 if((*iter)->album == album)
00143 {
00144 delete *iter;
00145 iter = m_backwardStack->erase(iter);
00146 }
00147 else
00148 {
00149 ++iter;
00150 }
00151 }
00152 iter = m_forwardStack->begin();
00153 while(iter != m_forwardStack->end())
00154 {
00155 if((*iter)->album == album)
00156 {
00157 delete *iter;
00158 iter = m_forwardStack->erase(iter);
00159 }
00160 else
00161 {
00162 ++iter;
00163 }
00164 }
00165
00166 if(m_backwardStack->isEmpty() && m_forwardStack->isEmpty())
00167 return;
00168
00169
00170
00171 if(m_backwardStack->isEmpty())
00172 forward();
00173
00174
00175
00176 AlbumStack::iterator lhs = m_backwardStack->begin();
00177 AlbumStack::iterator rhs = lhs;
00178 ++rhs;
00179 while(rhs != m_backwardStack->end())
00180 {
00181 if(*lhs == *rhs)
00182 {
00183 rhs = m_backwardStack->erase(rhs);
00184 }
00185 else
00186 {
00187 ++lhs;
00188 rhs = lhs;
00189 ++rhs;
00190 }
00191 }
00192
00193 rhs = m_forwardStack->begin();
00194 while(rhs != m_forwardStack->end())
00195 {
00196 if(*lhs == *rhs)
00197 {
00198 rhs = m_forwardStack->erase(rhs);
00199 }
00200 else
00201 {
00202 if(lhs == (m_backwardStack->isEmpty() ? m_backwardStack->end() : --m_backwardStack->end()))
00203 {
00204 lhs = m_forwardStack->begin();
00205 }
00206 else
00207 {
00208 ++lhs;
00209 rhs = lhs;
00210 }
00211 ++rhs;
00212 }
00213 }
00214
00215 if(m_backwardStack->isEmpty() && !m_forwardStack->isEmpty())
00216 forward();
00217 }
00218
00219 void AlbumHistory::getBackwardHistory(QStringList& list) const
00220 {
00221 if(m_backwardStack->isEmpty())
00222 return;
00223
00224 Album* album = 0;
00225
00226 AlbumStack::const_iterator iter = m_backwardStack->constBegin();
00227 for(; iter != (m_backwardStack->isEmpty() ? m_backwardStack->constEnd() : --m_backwardStack->constEnd()); ++iter)
00228 {
00229 album = (*iter)->album;
00230 if (album)
00231 {
00232 list.push_front(album->title());
00233 }
00234 }
00235 }
00236
00237 void AlbumHistory::getForwardHistory(QStringList& list) const
00238 {
00239 if(m_forwardStack->isEmpty())
00240 return;
00241
00242 Album* album = 0;
00243
00244 AlbumStack::const_iterator iter;
00245 for(iter = m_forwardStack->constBegin(); iter != m_forwardStack->constEnd(); ++iter)
00246 {
00247 album = (*iter)->album;
00248 if (album)
00249 {
00250 list.append(album->title());
00251 }
00252 }
00253 }
00254
00255 void AlbumHistory::back(Album **album, QWidget **widget, unsigned int steps)
00256 {
00257 *album = 0;
00258 *widget = 0;
00259
00260 if(m_backwardStack->count() <= 1 || (int)steps > m_backwardStack->count())
00261 return;
00262
00263 while(steps)
00264 {
00265 m_forwardStack->push_front(m_backwardStack->last());
00266 m_backwardStack->erase((m_backwardStack->isEmpty() ? m_backwardStack->end() : --m_backwardStack->end()));
00267 --steps;
00268 }
00269 m_moving = true;
00270
00271 HistoryItem *item = getCurrentAlbum();
00272 if(item)
00273 {
00274 *album = item->album;
00275 *widget = item->widget;
00276 }
00277 }
00278
00279 void AlbumHistory::forward(Album **album, QWidget **widget, unsigned int steps)
00280 {
00281 *album = 0;
00282 *widget = 0;
00283
00284 if(m_forwardStack->isEmpty() || (int)steps > m_forwardStack->count())
00285 return;
00286
00287 forward(steps);
00288
00289 HistoryItem *item = getCurrentAlbum();
00290 if(item)
00291 {
00292 *album = item->album;
00293 *widget = item->widget;
00294 }
00295 }
00296
00297 void AlbumHistory::forward(unsigned int steps)
00298 {
00299 if(m_forwardStack->isEmpty() || (int)steps > m_forwardStack->count())
00300 return;
00301
00302 while(steps)
00303 {
00304 m_backwardStack->push_back(m_forwardStack->first());
00305 m_forwardStack->erase(m_forwardStack->begin());
00306 --steps;
00307 }
00308 m_moving = true;
00309 }
00310
00311 HistoryItem* AlbumHistory::getCurrentAlbum() const
00312 {
00313 if(m_backwardStack->isEmpty())
00314 return 0;
00315
00316 return m_backwardStack->last();
00317 }
00318
00319 void AlbumHistory::getCurrentAlbum(Album **album, QWidget **widget) const
00320 {
00321 *album = 0;
00322 *widget = 0;
00323
00324 if(m_backwardStack->isEmpty())
00325 return;
00326
00327 HistoryItem *item = m_backwardStack->last();
00328 if(item)
00329 {
00330 *album = item->album;
00331 *widget = item->widget;
00332 }
00333 }
00334
00335 bool AlbumHistory::isForwardEmpty() const
00336 {
00337 return m_forwardStack->isEmpty();
00338 }
00339
00340 bool AlbumHistory::isBackwardEmpty() const
00341 {
00342
00343
00344 return (m_backwardStack->count() <= 1) ? true : false;
00345 }
00346
00347 }