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 <QFileInfo>
00028 #include <QSplitter>
00029 #include <QWidget>
00030
00031
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
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
00095
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
00208
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
00229 if (previewMode() == MediaPlayerMode)
00230 setPreviewItem();
00231
00232 if (previewMode() != PreviewImageMode)
00233 updateThumbbar();
00234
00235 d->imagePreviewView->setImageInfo(info, previous, next);
00236
00237
00238
00239
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
00286
00287
00288 if (previewMode() == PreviewAlbumMode ||
00289 previewMode() == WelcomePageMode ||
00290 previewMode() == MediaPlayerMode)
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 }