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