• Skip to content
  • Skip to link menu
KDE 4.4 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-2009 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 #include "albumhistory.moc"
00026 
00027 // Qt includes
00028 
00029 #include <QString>
00030 #include <QWidget>
00031 
00032 // Local includes
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     // Same album as before in the history
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     // The forward stack has to be cleared, if backward stack was changed
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     //  Search all HistoryItems, with album and delete them
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     // If backwardStack is empty, then there is no current album.
00170     // So make the first album of the forwardStack the current one.
00171     if(m_backwardStack->isEmpty())
00172         forward();
00173 
00174     // After the album is deleted from the history it has to be ensured,
00175     // that neighboring albums are different
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; // Only the current album available
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     // the last album of the backwardStack is the currently shown
00343     // album, and therfore not really a previous album
00344     return (m_backwardStack->count() <= 1) ? true : false;
00345 }
00346 
00347 }  // 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.9-20090814
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