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

digikam

albumwidgetstack.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        : 2006-06-13
00007  * Description : A widget stack to embedded album content view
00008  *               or the current image preview.
00009  *
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 <QFileInfo>
00028 #include <QSplitter>
00029 #include <QWidget>
00030 
00031 // KDE includes.
00032 
00033 #include <kurl.h>
00034 #include <kconfiggroup.h>
00035 #include <kconfig.h>
00036 #include <khtmlview.h>
00037 #include <kglobal.h>
00038 #include <kapplication.h>
00039 
00040 // Local includes.
00041 
00042 #include "albumsettings.h"
00043 #include "albumiconview.h"
00044 #include "albumiconitem.h"
00045 #include "imagepreviewview.h"
00046 #include "imagepreviewbar.h"
00047 #include "welcomepageview.h"
00048 #include "mediaplayerview.h"
00049 #include "albumwidgetstack.h"
00050 #include "albumwidgetstack.moc"
00051 
00052 namespace Digikam
00053 {
00054 
00055 class AlbumWidgetStackPriv
00056 {
00057 
00058 public:
00059 
00060     AlbumWidgetStackPriv()
00061     {
00062         albumIconView    = 0;
00063         imagePreviewView = 0;
00064         welcomePageView  = 0;
00065         mediaPlayerView  = 0;
00066         splitter         = 0;
00067         thumbBar         = 0;
00068     }
00069 
00070     QSplitter        *splitter;
00071 
00072     ImagePreviewBar  *thumbBar;
00073 
00074     AlbumIconView    *albumIconView;
00075 
00076     ImagePreviewView *imagePreviewView;
00077 
00078     WelcomePageView  *welcomePageView;
00079 
00080     MediaPlayerView  *mediaPlayerView;
00081 };
00082 
00083 AlbumWidgetStack::AlbumWidgetStack(QWidget *parent)
00084                 : QStackedWidget(parent)
00085 {
00086     d = new AlbumWidgetStackPriv;
00087 
00088     d->albumIconView    = new AlbumIconView(this);
00089     d->splitter         = new QSplitter(Qt::Vertical, this);
00090     d->imagePreviewView = new ImagePreviewView(d->splitter, this);
00091     d->thumbBar         = new ImagePreviewBar(d->splitter, Qt::Horizontal,
00092                                               AlbumSettings::instance()->getExifRotate());
00093 
00094     // To prevent flicker effect with content when user change icon view filter 
00095     // if scrollbar appears or disapears.
00096     d->thumbBar->setHScrollBarMode(Q3ScrollView::AlwaysOn);
00097 
00098     d->splitter->setFrameStyle( QFrame::NoFrame );
00099     d->splitter->setFrameShadow( QFrame::Plain );
00100     d->splitter->setFrameShape( QFrame::NoFrame );
00101     d->splitter->setOpaqueResize(false);
00102     d->splitter->setStretchFactor(0, 10);
00103     d->splitter->setStretchFactor(1, 2);
00104 
00105     d->welcomePageView  = new WelcomePageView(this);
00106     d->mediaPlayerView  = new MediaPlayerView(this);
00107 
00108     insertWidget(PreviewAlbumMode, d->albumIconView);
00109     insertWidget(PreviewImageMode, d->splitter);
00110     insertWidget(WelcomePageMode,  d->welcomePageView->view());
00111     insertWidget(MediaPlayerMode,  d->mediaPlayerView);
00112 
00113     setPreviewMode(PreviewAlbumMode);
00114     setAttribute(Qt::WA_DeleteOnClose);
00115 
00116     readSettings();
00117 
00118     // -----------------------------------------------------------------
00119 
00120     connect(d->imagePreviewView, SIGNAL(signalNextItem()),
00121             this, SIGNAL(signalNextItem()));
00122 
00123     connect(d->imagePreviewView, SIGNAL(signalPrevItem()),
00124             this, SIGNAL(signalPrevItem()));
00125 
00126     connect(d->imagePreviewView, SIGNAL(signalEditItem()),
00127             this, SIGNAL(signalEditItem()));
00128 
00129     connect(d->imagePreviewView, SIGNAL(signalDeleteItem()),
00130             this, SIGNAL(signalDeleteItem()));
00131 
00132     connect(d->imagePreviewView, SIGNAL(signalBack2Album()),
00133             this, SIGNAL(signalBack2Album()));
00134 
00135     connect(d->imagePreviewView, SIGNAL(signalSlideShow()),
00136             this, SIGNAL(signalSlideShow()));
00137 
00138     connect(d->imagePreviewView, SIGNAL(signalZoomFactorChanged(double)),
00139             this, SLOT(slotZoomFactorChanged(double)));
00140 
00141     connect(d->imagePreviewView, SIGNAL(signalInsert2LightTable()),
00142             this, SIGNAL(signalInsert2LightTable()));
00143 
00144     connect(d->albumIconView, SIGNAL(signalItemsAdded()),
00145             this, SLOT(slotItemsAdded()));
00146 
00147     connect(d->albumIconView, SIGNAL(signalItemsRearranged()),
00148             this, SLOT(slotItemsAdded()));
00149 
00150     connect(d->thumbBar, SIGNAL(signalUrlSelected(const KUrl&)),
00151             this, SIGNAL(signalUrlSelected(const KUrl&)));
00152 }
00153 
00154 AlbumWidgetStack::~AlbumWidgetStack()
00155 {
00156     saveSettings();
00157     delete d;
00158 }
00159 
00160 void AlbumWidgetStack::readSettings()
00161 {
00162     KSharedConfig::Ptr config = KGlobal::config();
00163     KConfigGroup group        = config->group("PreviewView");
00164     if (group.hasKey("SplitterState")) 
00165     {
00166         QByteArray state;
00167         state = group.readEntry("SplitterState", state);
00168         d->splitter->restoreState(QByteArray::fromBase64(state));
00169     }
00170 }
00171 
00172 void AlbumWidgetStack::saveSettings()
00173 {
00174     KSharedConfig::Ptr config = KGlobal::config();
00175     KConfigGroup group        = config->group("PreviewView");
00176     group.writeEntry("SplitterState", d->splitter->saveState().toBase64());
00177     config->sync();
00178 }
00179 
00180 void AlbumWidgetStack::slotEscapePreview()
00181 {
00182     if (previewMode() == MediaPlayerMode)
00183         d->mediaPlayerView->escapePreview();
00184 }
00185 
00186 AlbumIconView* AlbumWidgetStack::albumIconView()
00187 {
00188     return d->albumIconView;
00189 }
00190 
00191 ImagePreviewView* AlbumWidgetStack::imagePreviewView()
00192 {
00193     return d->imagePreviewView;
00194 }
00195 
00196 void AlbumWidgetStack::setPreviewItem(const ImageInfo & info, const ImageInfo &previous, const ImageInfo &next)
00197 {
00198     if (info.isNull())
00199     {
00200         if (previewMode() == MediaPlayerMode)
00201             d->mediaPlayerView->setMediaPlayerFromUrl(KUrl());
00202         else if (previewMode() == PreviewImageMode)
00203         {
00204             d->imagePreviewView->setImageInfo();
00205         }
00206 
00207         // Special case to cleanup thumbbar if Image Lister do not query item accordingly to 
00208         // IconView Filters.
00209         ImageInfo current;
00210         if (d->albumIconView->allImageInfos(current).isEmpty())
00211             d->thumbBar->clear();
00212     }
00213     else
00214     {
00215         AlbumSettings *settings      = AlbumSettings::instance();
00216         QString currentFileExtension = QFileInfo(info.fileUrl().path()).suffix();
00217         QString mediaplayerfilter    = settings->getMovieFileFilter().toLower() +
00218                                        settings->getMovieFileFilter().toUpper() +
00219                                        settings->getAudioFileFilter().toLower() +
00220                                        settings->getAudioFileFilter().toUpper();
00221         if (mediaplayerfilter.contains(currentFileExtension) )
00222         {
00223             setPreviewMode(MediaPlayerMode);
00224             d->mediaPlayerView->setMediaPlayerFromUrl(info.fileUrl());
00225         }
00226         else
00227         {
00228             // Stop media player if running...
00229             if (previewMode() == MediaPlayerMode)
00230                 setPreviewItem();
00231 
00232             if (previewMode() != PreviewImageMode)
00233                 updateThumbbar();
00234 
00235             d->imagePreviewView->setImageInfo(info, previous, next);
00236 
00237             // NOTE: No need to toggle imediatly in PreviewImageMode here, 
00238             // because we will receive a signal for that when the image preview will be loaded.
00239             // This will prevent a flicker effect with the old image preview loaded in stack.
00240         }
00241 
00242         ThumbBarItem* item = d->thumbBar->findItemByUrl(info.fileUrl());
00243         d->thumbBar->setSelected(item);
00244     }
00245 }
00246 
00247 int AlbumWidgetStack::previewMode()
00248 {
00249     return indexOf(currentWidget());
00250 }
00251 
00252 void AlbumWidgetStack::setPreviewMode(int mode)
00253 {
00254     if (mode != PreviewAlbumMode && mode != PreviewImageMode && 
00255         mode != WelcomePageMode  && mode != MediaPlayerMode)
00256         return;
00257 
00258     if (mode == PreviewAlbumMode || mode == WelcomePageMode)
00259     {
00260         if (mode == PreviewAlbumMode && currentIndex() != mode)
00261             d->albumIconView->setFocus();
00262         setPreviewItem();
00263         setCurrentIndex(mode);
00264         emit signalToggledToPreviewMode(false);
00265     }
00266     else
00267     { 
00268         setCurrentIndex(mode);
00269     }
00270 }
00271 
00272 void AlbumWidgetStack::previewLoaded()
00273 {
00274      emit signalToggledToPreviewMode(true);
00275 }
00276 
00277 void AlbumWidgetStack::slotZoomFactorChanged(double z)
00278 {
00279     if (previewMode() == PreviewImageMode)
00280         emit signalZoomFactorChanged(z);
00281 }
00282 
00283 void AlbumWidgetStack::slotItemsUpdated(const KUrl::List& urls)
00284 {
00285     // If item are updated from Icon View, and if we are in Preview Mode,
00286     // We will check if the current item preview need to be reloaded.
00287 
00288     if (previewMode() == PreviewAlbumMode ||
00289         previewMode() == WelcomePageMode  ||
00290         previewMode() == MediaPlayerMode)    // What we can do with media player ?
00291         return;
00292 
00293     if (urls.contains(imagePreviewView()->getImageInfo().fileUrl()))
00294         d->imagePreviewView->reload();
00295 
00296     for (KUrl::List::const_iterator it = urls.begin();
00297          it != urls.end(); ++it)
00298     {
00299         ThumbBarItem* foundItem = d->thumbBar->findItemByUrl(*it);
00300         d->thumbBar->invalidateThumb(foundItem);
00301     }
00302 }
00303 
00304 void AlbumWidgetStack::slotItemsAdded()
00305 {
00306     if (previewMode() != PreviewImageMode)
00307         return;
00308 
00309     updateThumbbar();
00310 
00311     AlbumIconItem *iconItem = dynamic_cast<AlbumIconItem*>(d->albumIconView->currentItem());
00312     if (iconItem)
00313     {
00314         ThumbBarItem* item = d->thumbBar->findItemByUrl(iconItem->imageInfo().fileUrl());
00315         d->thumbBar->setSelected(item);
00316     }
00317 }
00318 
00319 void AlbumWidgetStack::updateThumbbar()
00320 {
00321     d->thumbBar->clear();
00322 
00323     ImageInfo current;
00324     ImageInfoList list = d->albumIconView->allImageInfos(current);
00325     d->thumbBar->blockSignals(true);
00326     for (ImageInfoList::iterator it = list.begin(); it != list.end(); ++it)
00327     {
00328         new ImagePreviewBarItem(d->thumbBar, *it);
00329     }
00330     d->thumbBar->blockSignals(false);
00331 }
00332 
00333 void AlbumWidgetStack::increaseZoom()
00334 {
00335     d->imagePreviewView->slotIncreaseZoom();
00336 }
00337 
00338 void AlbumWidgetStack::decreaseZoom()
00339 {
00340     d->imagePreviewView->slotDecreaseZoom();
00341 }
00342 
00343 void AlbumWidgetStack::zoomTo100Percents()
00344 {
00345     d->imagePreviewView->setZoomFactor(1.0);
00346 }
00347 
00348 void AlbumWidgetStack::fitToWindow()
00349 {
00350     d->imagePreviewView->fitToWindow();
00351 }
00352 
00353 void AlbumWidgetStack::toggleFitToWindowOr100()
00354 {
00355     d->imagePreviewView->toggleFitToWindowOr100();
00356 }
00357 
00358 bool AlbumWidgetStack::maxZoom()
00359 {
00360     return d->imagePreviewView->maxZoom();
00361 }
00362 
00363 bool AlbumWidgetStack::minZoom()
00364 {
00365     return d->imagePreviewView->minZoom();
00366 }
00367 
00368 void AlbumWidgetStack::setZoomFactor(double z)
00369 {
00370     d->imagePreviewView->setZoomFactor(z);
00371 }
00372 
00373 void AlbumWidgetStack::setZoomFactorSnapped(double z)
00374 {
00375     d->imagePreviewView->setZoomFactorSnapped(z);
00376 }
00377 
00378 double AlbumWidgetStack::zoomFactor()
00379 {
00380     return d->imagePreviewView->zoomFactor();
00381 }
00382 
00383 double AlbumWidgetStack::zoomMin()
00384 {
00385     return d->imagePreviewView->zoomMin();
00386 }
00387 
00388 double AlbumWidgetStack::zoomMax()
00389 {
00390     return d->imagePreviewView->zoomMax();
00391 }
00392 
00393 void AlbumWidgetStack::toggleShowBar(bool b)
00394 {
00395     if (b)
00396         d->thumbBar->show();
00397     else
00398         d->thumbBar->hide();
00399 }
00400 
00401 }  // 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