• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

digikam

albumhistory.cpp

Go to the documentation of this file.
00001 /* ============================================================
00002  *
00003  * This file is a part of digiKam project
00004  * http://www.digikam.org
00005  *
00006  * Date        : 2004-11-17
00007  * Description : albums history manager.
00008  * 
00009  * Copyright (C) 2004 by Joern Ahrens <joern.ahrens@kdemail.net>
00010  * Copyright (C) 2006-2008 by Gilles Caulier <caulier dot gilles at gmail dot com>
00011  * 
00012  * This program is free software; you can redistribute it
00013  * and/or modify it under the terms of the GNU General
00014  * Public License as published by the Free Software Foundation;
00015  * either version 2, or (at your option)
00016  * any later version.
00017  * 
00018  * This program is distributed in the hope that it will be useful,
00019  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00020  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00021  * GNU General Public License for more details.
00022  * 
00023  * ============================================================ */
00024 
00025 // Qt includes.
00026 
00027 #include <QString>
00028 #include <QWidget>
00029 
00030 // Local includes.
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     // Same album as before in the history
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     // The forward stack has to be cleared, if backward stack was changed
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     //  Search all HistoryItems, with album and delete them
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     // If backwardStack is empty, then there is no current album.
00176     // So make the first album of the forwardStack the current one.
00177     if(m_backwardStack->isEmpty())
00178         forward();
00179 
00180     // After the album is deleted from the history it has to be ensured, 
00181     // that neigboring albums are different
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; // Only the current album available
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     // the last album of the backwardStack is the currently shown
00337     // album, and therfore not really a previous album
00338     return (m_backwardStack->count() <= 1) ? true : false;
00339 }
00340 
00341 }  // namespace Digikam

digikam

Skip menu "digikam"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members

API Reference

Skip menu "API Reference"
  • digikam
Generated for API Reference by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal