Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Class Members | File Members

subalbumWidget.cpp

Go to the documentation of this file.
00001 //==============================================
00002 //  copyright            : (C) 2003-2005 by Will Stokes
00003 //==============================================
00004 //  This program is free software; you can redistribute it
00005 //  and/or modify it under the terms of the GNU General
00006 //  Public License as published by the Free Software
00007 //  Foundation; either version 2 of the License, or
00008 //  (at your option) any later version.
00009 //==============================================
00010 
00011 //Systemwide includes
00012 #include <qlayout.h>
00013 #include <qfont.h>
00014 #include <qframe.h>
00015 #include <qpushbutton.h>
00016 #include <qtoolbutton.h>
00017 #include <qpixmap.h>
00018 #include <qfiledialog.h>
00019 #include <qcursor.h>
00020 #include <qapplication.h>
00021 #include <qtooltip.h>
00022 #include <qfileinfo.h>
00023 #include <qaccel.h>
00024 
00025 //Projectwide includes
00026 #include "window.h"
00027 #include "titleWidget.h"
00028 #include "layoutWidget.h"
00029 #include "subalbumWidget.h"
00030 #include "subalbumsWidget.h"
00031 #include "photoPreviewWidget.h"
00032 #include "photosIconView.h"
00033 #include "statusWidget.h"
00034 
00035 #include "dialogs/addPhotosDialog.h"
00036 #include "dialogs/questionDialog.h"
00037 #include "dialogs/alertDialog.h"
00038 
00039 #include "../config.h"
00040 #include "../backend/subalbum.h"
00041 #include "../backend/photo.h"
00042 #include "../backend/tools/guiTools.h"
00043 #include "../backend/tools/wallpaperTools.h"
00044 #include "../configuration/configuration.h"
00045 
00046 #include "../backend/album.h"
00047 
00048 //==============================================
00049 SubalbumWidget::SubalbumWidget(Subalbum* salbum,
00050                                QWidget *parent,
00051                                const char* name ) :
00052                                QWidget(parent,name)
00053 {
00054   setWFlags(WNoAutoErase);
00055 
00056   //store subalbum pointer
00057   subalbum = salbum;
00058 
00059   //store layout pointer
00060   layout = (LayoutWidget*)parent;
00061 
00062   //create photo collection
00063   photos = new PhotosIconView( this );
00064 
00065   //establish a top-down view such that the scrollbar is always placed on the right
00066   photos->setArrangement( QIconView::LeftToRight );
00067   photos->setVScrollBarMode( QScrollView::Auto );
00068 
00069   //allow multiple photos to be selected with control and shift keys
00070   photos->setSelectionMode( QIconView::Extended ) ;
00071 
00072   //set auto-scroll on for drag-n-drop
00073   photos->setDragAutoScroll(true);
00074   photos->setAcceptDrops(true);
00075 
00076   //connect selectionChanged signal to update buttons method
00077   connect( photos, SIGNAL(selectionChanged()),
00078            this, SLOT( selectionChangedEvent()) );
00079 
00080   //connect rightButtonClicked signal to update buttons method
00081   connect( photos, SIGNAL(rightButtonClicked(QIconViewItem*, const QPoint&)),
00082            this, SLOT(selectionChangedEvent()) );
00083   
00084   //connect itemhasMoved signal on iconview to reorder slot (phots have been rearranged)
00085   connect( photos, SIGNAL(itemHasMoved()), SLOT(reorder()) );
00086 
00087   //connect addPhtos signal from iconview to actually add photos from disk (Drop from outside target, ie konqueror)
00088   connect( photos, SIGNAL(addPhotos(QStringList)), SLOT(addImageAction(QStringList)) );
00089 
00090   //connect keyevent signals from iconview
00091   connect( photos, SIGNAL(removeSelectedPhotos()), SLOT(removeImageAction()) );
00092   connect( photos, SIGNAL(rotate90SelectedPhotos()), SLOT(rotate90ImageAction()) );
00093   connect( photos, SIGNAL(rotate270SelectedPhotos()), SLOT(rotate270ImageAction()) );
00094 
00095   //connect key e press signal to edit slot
00096   connect( photos, SIGNAL(editSelectedPhoto()), 
00097            layout, SLOT(editSelectedPhoto()) );
00098   //connect double click signal to edit slot
00099   connect( photos, SIGNAL( doubleClicked(QIconViewItem*) ), 
00100            layout, SLOT(editSelectedPhoto()) );
00101 
00102   //create all buttons
00103   buttonsFrame = new QFrame(this);
00104   if(subalbum == NULL) buttonsFrame->hide();
00105 
00106   QFont buttonFont( qApp->font() );
00107   buttonFont.setBold(true);
00108   buttonFont.setPointSize( 11 );
00109 
00110   addImage = new QToolButton( buttonsFrame );
00111   addImage->setTextLabel(tr("Add Photo"));
00112   addImage->setIconSet( QPixmap(QString(IMAGE_PATH)+"buttonIcons/add.png") );
00113   addImage->setTextPosition(QToolButton::Right);
00114   addImage->setFont( buttonFont );
00115   addImage->setUsesTextLabel( true );
00116   addImage->setEnabled( true );
00117   QToolTip::add( addImage, tr("Add photos to selected collection") );
00118   connect( addImage, SIGNAL(clicked()), SLOT(addImageAction()) );
00119 
00120   removeImage = new QToolButton( buttonsFrame );
00121   removeImage->setTextLabel(tr("Remove Photo"));
00122   removeImage->setIconSet( QPixmap(QString(IMAGE_PATH)+"buttonIcons/remove.png") );
00123   removeImage->setTextPosition(QToolButton::Right);
00124   removeImage->setFont( buttonFont );
00125   removeImage->setUsesTextLabel( true );
00126   removeImage->setEnabled( true );
00127   QToolTip::add( removeImage, tr("Remove selected photos from collection") );
00128   connect( removeImage, SIGNAL(clicked()), SLOT(removeImageAction()) );
00129 
00130   rotate90Image = new QToolButton( buttonsFrame );
00131   rotate90Image->setTextLabel(tr("Rotate Right") );
00132   QIconSet rotate90Icon;
00133   rotate90Icon.setPixmap( QString(IMAGE_PATH)+"buttonIcons/rotate90.png",
00134                       QIconSet::Automatic,
00135                       QIconSet::Normal );
00136   rotate90Icon.setPixmap( QString(IMAGE_PATH)+"buttonIcons/rotate90_disabled.png",
00137                       QIconSet::Automatic,
00138                       QIconSet::Disabled );
00139   rotate90Image->setIconSet( rotate90Icon );
00140   
00141   rotate90Image->setTextPosition(QToolButton::Right);
00142   rotate90Image->setFont( buttonFont );
00143   rotate90Image->setUsesTextLabel( true );
00144   QToolTip::add( rotate90Image, tr("Rotate selected photos clockwise") );
00145   connect( rotate90Image, SIGNAL(clicked()), SLOT(rotate90ImageAction()) );
00146 
00147   rotate270Image = new QToolButton( buttonsFrame );
00148   rotate270Image->setTextLabel(tr("Rotate Left") );
00149   QIconSet rotate270Icon;
00150   rotate270Icon.setPixmap( QString(IMAGE_PATH)+"buttonIcons/rotate270.png",
00151                           QIconSet::Automatic,
00152                           QIconSet::Normal );
00153   rotate270Icon.setPixmap( QString(IMAGE_PATH)+"buttonIcons/rotate270_disabled.png",
00154                           QIconSet::Automatic,
00155                           QIconSet::Disabled );
00156   rotate270Image->setIconSet( rotate270Icon );
00157 
00158   rotate270Image->setTextPosition(QToolButton::Right);
00159   rotate270Image->setFont( buttonFont );
00160   rotate270Image->setUsesTextLabel( true );
00161   QToolTip::add( rotate270Image, tr("Rotate selected photos counterclockwise") );
00162   connect( rotate270Image, SIGNAL(clicked()), SLOT(rotate270ImageAction()) );
00163 
00164   //place all items in grid layout
00165   buttonsGrid = new QGridLayout( buttonsFrame,             1, 7, 0 );
00166   buttonsGrid->addWidget( addImage,                   0, 1, Qt::AlignLeft );
00167   buttonsGrid->addWidget( removeImage,                0, 2, Qt::AlignLeft );
00168   buttonsGrid->addWidget( rotate90Image,              0, 3, Qt::AlignLeft );
00169   buttonsGrid->addWidget( rotate270Image,             0, 4, Qt::AlignLeft );
00170   buttonsGrid->setColStretch( 0, 1 );
00171   buttonsGrid->setColStretch( 6, 1 );
00172 
00173   //If setting the desktop wallpaper is supported on this system then add this button as well
00174   if( setWallpaperSupported() )
00175   {
00176     setDesktopBtn = new QToolButton( buttonsFrame );
00177     setDesktopBtn->setUsesTextLabel( true );
00178     setDesktopBtn->setTextLabel(tr("Wallpaper") );
00179     QIconSet setDesktopIcon;
00180     setDesktopIcon.setPixmap( QString(IMAGE_PATH)+"buttonIcons/setDesktopWallpaper.png",
00181                             QIconSet::Automatic,
00182                             QIconSet::Normal );
00183     setDesktopIcon.setPixmap( QString(IMAGE_PATH)+"buttonIcons/setDesktopWallpaper_disabled.png",
00184                             QIconSet::Automatic,
00185                             QIconSet::Disabled );
00186     setDesktopBtn->setIconSet( setDesktopIcon );
00187     
00188     setDesktopBtn->setTextPosition(QToolButton::Right);
00189     setDesktopBtn->setFont( buttonFont );
00190     setDesktopBtn->setUsesTextLabel( true );
00191     
00192     QToolTip::add( setDesktopBtn, tr("Set desktop wallpaper to selected photo") );
00193     connect( setDesktopBtn, SIGNAL( clicked() ), this, SLOT( setWallpaperAction() ) );
00194     buttonsGrid->addWidget( setDesktopBtn,              0, 5, Qt::AlignLeft );
00195   }
00196   else
00197   { setDesktopBtn = NULL; }
00198 
00199   mainGrid = new QGridLayout( this, 2, 1, 0 );
00200   mainGrid->addMultiCellWidget( photos, 0, 0, 0, 1 );
00201   mainGrid->addMultiCellWidget( buttonsFrame, 1, 1, 0, 1 );
00202   mainGrid->setRowStretch( 0, 1 );
00203 
00204   //set the background of the widget to be light blue
00205   setPaletteBackgroundColor( QColor(193, 210, 238) );
00206 
00207   //by default no selected images so disable all buttons besides add
00208   removeImage->setEnabled(false);
00209   rotate90Image->setEnabled(false);
00210   rotate270Image->setEnabled(false);
00211    
00212   //hook-up keyboard shortcut for deselecting all photos
00213   //iconview provides select all shortcut for us
00214   QAccel *keyAccel = new QAccel( this );
00215   keyAccel->connectItem( keyAccel->insertItem( CTRL + SHIFT + Key_A ),
00216                          this, SLOT(deselectAll()) );
00217 }
00218 //==============================================
00219 void SubalbumWidget::setSubalbum(Subalbum* salbum)
00220 {
00221   //set new subalbum pointer
00222   subalbum = salbum;
00223 
00224   //update photo listing
00225   refreshPhotos();
00226 
00227   if(subalbum == NULL) { buttonsFrame->hide(); }
00228   else
00229   {
00230     //disable/enable buttons as necessary
00231     buttonsFrame->show();
00232     selectionChangedEvent();
00233   }
00234 }
00235 //==============================================
00236 void SubalbumWidget::addImageAction()
00237 {
00238   //---------------
00239   //get file list
00240 
00241   Configuration* config = ((Window*)qApp->mainWidget())->getConfig();
00242   QString path = config->getString( "loadSave", "addPhotoDir" );
00243   QDir testPath(path);
00244   if(!testPath.exists())
00245   {
00246     config->resetSetting( "loadSave", "addPhotoDir" );
00247     path = config->getString( "loadSave", "addPhotoDir" );
00248   }
00249 
00250   AddPhotosDialog* fileDialog = new AddPhotosDialog( path );
00251   bool setDescriptions;
00252   QStringList fileNames = fileDialog->getFilenames( setDescriptions );
00253 
00254    if(!fileNames.empty())
00255    {
00256      //store this addPhoto location
00257      QDir lastDir = QDir( QFileInfo(*fileNames.begin()).dirPath() );
00258      config->setString( "loadSave", "addPhotoDir", lastDir.path() );
00259      addImageAction( fileNames, setDescriptions );
00260   }
00261 }
00262 //==============================================
00263 void SubalbumWidget::addImageAction(QStringList fileNames, bool setDescriptions)
00264 {
00265    if(fileNames.empty())
00266      return;
00267 
00268   //---------------
00269   //set busy flag and deactivate menu's/buttons, and selecting photos
00270   layout->getWindow()->getTitle()->setBusy(true);
00271   layout->getSubalbums()->updateButtons(false);
00272   updateButtons(false);
00273   photos->setSelectionMode( QIconView::NoSelection ) ;
00274 
00275   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00276   
00277   //setup progress bar
00278   QString statusMessage = tr("Adding %1 photos:");
00279   
00280   layout->getWindow()->getStatus()->showProgressBar( statusMessage.arg(fileNames.count()), fileNames.count() );
00281   qApp->processEvents();
00282 
00283   //iterate through each file and add to album
00284   QStringList::iterator it;
00285   int num=0;
00286   for(it = fileNames.begin(); it != fileNames.end(); it++ )
00287   {
00288     //update status message
00289     layout->getWindow()->getStatus()->updateProgress( num, statusMessage.arg(fileNames.count() - num) );
00290 
00291     //if item is a file, add photo
00292     if(QFileInfo(*it).isFile() && subalbum->addPhoto(*it, setDescriptions))
00293     {
00294       PhotoPreviewWidget* p =  new PhotoPreviewWidget( photos, subalbum->getLast() );
00295       photos->ensureItemVisible(p);
00296     }
00297     num++;
00298     qApp->processEvents();
00299   }
00300   photos->arrangeItemsInGrid();
00301 
00302   //remove progress bar
00303   layout->getWindow()->getStatus()->setStatus( tr("Adding photos complete.") );
00304   
00305   //notifty title widget that the album's photo count has possible changed
00306   layout->getWindow()->getTitle()->updateMenus();
00307 
00308   //unset busy flag and activate menu's/buttons
00309   layout->getWindow()->getTitle()->setBusy(false);
00310   layout->getSubalbums()->updateButtons(true);
00311   updateButtons(true);
00312   photos->setSelectionMode( QIconView::Extended ) ;
00313  
00314   qApp->restoreOverrideCursor();
00315 }
00316 //==============================================
00317 void SubalbumWidget::removeImageAction()
00318 {
00319   //set busy flag and deactivate menu's/buttons
00320   layout->getWindow()->getTitle()->setBusy(true);
00321   layout->getSubalbums()->updateButtons(false);
00322   updateButtons(false);
00323   photos->setSelectionMode( QIconView::NoSelection ) ;
00324 
00325   //if user has chosen to not receive destructive action warnings, or agrees to the action, then
00326   //delete photo and refresh view
00327   bool proceed = !((Window*)qApp->mainWidget())->getConfig()->getBool( "alerts", "showDestructiveAlerts" );
00328   if(!proceed)
00329   {
00330     QuestionDialog sure( tr("Remove selected photos?"),
00331                        tr("Once removed photos cannot be restored. Furthermore upon resaving they are physically removed from your album."),
00332                        "alertIcons/warning.png",
00333                        this );
00334     proceed = sure.exec();
00335   }
00336   if(proceed)
00337   {
00338     qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00339     //iterate through all photos and remove those that are selected
00340     QIconViewItem* current = photos->firstItem();
00341     QIconViewItem* temp;
00342 
00343     while(current != NULL)
00344     {
00345       //if not selected move on
00346       if(!current->isSelected())
00347       {
00348         current = current->nextItem();
00349         continue;
00350       }
00351       
00352       //get next pointer
00353       temp = current->nextItem();
00354 
00355       //grab point to backend photo
00356       Photo* phto = ((PhotoPreviewWidget*)current)->getPhoto();
00357 
00358       //delete photo widget
00359       delete current;
00360       current = temp;
00361 
00362       //delete backend photo
00363       subalbum->removePhoto(phto);
00364     }
00365 
00366     //cleanup arrangement in case items were deleted in the middle or front
00367     photos->arrangeItemsInGrid();
00368 
00369     //update buttons and emit selection changed signal
00370     selectionChangedEvent();
00371     
00372     //unset busy flag and activate menu's/buttons
00373     qApp->restoreOverrideCursor();
00374   }
00375 
00376   //state of selected photos has changed
00377   emit selectedPhotoStateChanged();
00378   
00379   layout->getWindow()->getTitle()->setBusy(false);
00380   layout->getSubalbums()->updateButtons(true);
00381   updateButtons(true);
00382   photos->setSelectionMode( QIconView::Extended ) ;
00383 }
00384 //==============================================
00385 void SubalbumWidget::revertSelectedPhotos()
00386 {
00387   //iterate over photos in current collection
00388   QIconViewItem* current = photos->firstItem();
00389   while(current != NULL)
00390   {
00391     //found a selected item!
00392     if(current->isSelected())
00393     {
00394       ((PhotoPreviewWidget*)current)->getPhoto()->revertPhoto();
00395       photos->ensureItemVisible(((PhotoPreviewWidget*)current));
00396       ((PhotoPreviewWidget*)current)->updateImage();
00397       qApp->processEvents();          
00398     }
00399     
00400     //move to next item
00401     current = current->nextItem();
00402   }
00403 
00404   //state of selected photos has changed
00405   emit selectedPhotoStateChanged();
00406 }
00407 //==============================================
00408 void SubalbumWidget::setWallpaperAction()
00409 {
00410   //get first selected photo, if no photo is selected then bail
00411   Photo* phto = getSelectedPhoto();
00412   if(phto == NULL) return;
00413 
00414   //set the wallpaper
00415   setWallpaper( phto );
00416 }
00417 //==============================================
00418 void SubalbumWidget::rotate90ImageAction()
00419 {
00420   //set busy flag and deactivate menu's/buttons
00421   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00422   layout->getWindow()->getTitle()->setBusy(true);
00423   layout->getSubalbums()->updateButtons(false);
00424   photos->setSelectionMode( QIconView::NoSelection ) ;
00425   updateButtons(false);
00426 
00427   //setup progress bar
00428   QString statusMessage = tr("Rotating %1 photos:");
00429   layout->getWindow()->getStatus()->showProgressBar( statusMessage.arg(photos->numSelected()), photos->numSelected() );
00430   qApp->processEvents();
00431    
00432   //rotate the selected photos
00433   int num = 0;
00434   QIconViewItem* current = photos->firstItem();
00435   while(current != NULL)
00436   {
00437     if(current->isSelected())
00438     {
00439       //update status message
00440       layout->getWindow()->getStatus()->updateProgress( num, statusMessage.arg(photos->numSelected() - num) );
00441 
00442       ((PhotoPreviewWidget*)current)->getPhoto()->rotate90();
00443       photos->ensureItemVisible(((PhotoPreviewWidget*)current));
00444       ((PhotoPreviewWidget*)current)->updateImage();
00445       num++;
00446       layout->getWindow()->getStatus()->updateProgress( num );
00447       qApp->processEvents();
00448     }
00449 
00450     //move to next item
00451     current = current->nextItem();
00452   }
00453 
00454   //state of selected photos has changed
00455   emit selectedPhotoStateChanged();
00456   
00457   //hide progress bar
00458   layout->getWindow()->getStatus()->setStatus( tr("Rotating complete.") );
00459 
00460   //not busy any more
00461   layout->getWindow()->getTitle()->setBusy(false);
00462   layout->getSubalbums()->updateButtons(true);
00463   updateButtons(true);
00464   photos->setSelectionMode( QIconView::Extended ) ;
00465   
00466   qApp->restoreOverrideCursor();
00467 }
00468 //==============================================
00469 void SubalbumWidget::rotate270ImageAction()
00470 {
00471   //set busy flag and deactivate menu's/buttons
00472   qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00473   layout->getWindow()->getTitle()->setBusy(true);
00474   layout->getSubalbums()->updateButtons(false);
00475   photos->setSelectionMode( QIconView::NoSelection ) ;
00476   updateButtons(false);
00477 
00478   //setup progress bar
00479   QString statusMessage = tr("Rotating %1 photos:");
00480   layout->getWindow()->getStatus()->showProgressBar( statusMessage.arg(photos->numSelected()), photos->numSelected() );
00481   qApp->processEvents();
00482 
00483   //rotate the selected photos
00484   int num = 0;
00485   QIconViewItem* current = photos->firstItem();
00486   while(current != NULL)
00487   {
00488     if(current->isSelected())
00489     {
00490       //update status message
00491       layout->getWindow()->getStatus()->updateProgress( num, statusMessage.arg(photos->numSelected() - num) );
00492 
00493       ((PhotoPreviewWidget*)current)->getPhoto()->rotate270();
00494       photos->ensureItemVisible(((PhotoPreviewWidget*)current));
00495       ((PhotoPreviewWidget*)current)->updateImage();
00496       num++;
00497       layout->getWindow()->getStatus()->updateProgress( num );
00498       qApp->processEvents();
00499     }
00500 
00501     //move to next item
00502     current = current->nextItem();
00503   }
00504 
00505   //state of selected photos has changed
00506   emit selectedPhotoStateChanged();
00507 
00508   //hide progress bar
00509   layout->getWindow()->getStatus()->setStatus( tr("Rotating complete.") );
00510 
00511   //not busy any more
00512   layout->getWindow()->getTitle()->setBusy(false);
00513   layout->getSubalbums()->updateButtons(true);
00514   updateButtons(true);
00515   photos->setSelectionMode( QIconView::Extended ) ;
00516   qApp->restoreOverrideCursor();
00517 }
00518 //==============================================
00519 void SubalbumWidget::refreshPhotos()
00520 {
00521   //remove all thumbnails
00522   photos->clear();
00523 
00524   if(subalbum != NULL)
00525   {
00526     //insert photo thumbnails
00527     Photo* currentPhoto = subalbum->getFirst();
00528     while(currentPhoto != NULL)
00529     {
00530       new PhotoPreviewWidget( photos, currentPhoto );
00531       currentPhoto = currentPhoto->getNext();
00532     }
00533 
00534     photos->arrangeItemsInGrid();
00535   }
00536 }
00537 //==============================================
00538 void SubalbumWidget::refreshAllPhotos()
00539 {
00540   QIconViewItem* current = photos->firstItem();
00541   while(current != NULL)
00542   {
00543     ((PhotoPreviewWidget*)current)->updateImage();
00544     ((PhotoPreviewWidget*)current)->updateDescription();
00545     current = current->nextItem();
00546   }
00547 }
00548 //==============================================
00549 void SubalbumWidget::refreshSelectedPhotos()
00550 {
00551   QIconViewItem* current = photos->firstItem();
00552   while(current != NULL)
00553   {
00554     //found a selected item!
00555     if(current->isSelected())
00556     {
00557       ((PhotoPreviewWidget*)current)->updateImage();
00558       ((PhotoPreviewWidget*)current)->updateDescription();
00559     }
00560 
00561     //move to next item
00562     current = current->nextItem();
00563   }
00564 }
00565 //==============================================
00566 void SubalbumWidget::stripDescriptionsFromSelectedPhotos()
00567 {
00568   QIconViewItem* current = photos->firstItem();
00569   while(current != NULL)
00570   {
00571     //found a selected item!
00572     if(current->isSelected())
00573     {
00574       ((PhotoPreviewWidget*)current)->getPhoto()->setDescription("");
00575       ((PhotoPreviewWidget*)current)->setText( "" );
00576     }
00577 
00578     //move to next item
00579     current = current->nextItem();
00580   }
00581 }
00582 //==============================================
00583 Subalbum* SubalbumWidget::getSubalbum()
00584 {
00585   return subalbum;
00586 }
00587 //==============================================
00588 Photo* SubalbumWidget::getSelectedPhoto()
00589 {
00590   //determine if one photo is selected
00591   int numSelected = 0;
00592   QIconViewItem* current = photos->firstItem();
00593   QIconViewItem* selected = NULL;
00594   while(current != NULL)
00595   {
00596     //found a selected item!
00597     if(current->isSelected())
00598     {
00599       numSelected++;
00600       selected = current;
00601     }
00602 
00603     //if more than one found then bail!
00604     if(numSelected > 1) return NULL;
00605 
00606     //move to next item
00607     current = current->nextItem();
00608   }
00609 
00610   //if one item is selected then return photo pointer
00611   if(numSelected == 1) { return ((PhotoPreviewWidget*)selected)->getPhoto(); }
00612   else { return NULL; }
00613 }
00614 //==============================================
00615 Photo* SubalbumWidget::getFirstSelectedPhoto()
00616 {
00617   //determine if one photo is selected
00618   QIconViewItem* current = photos->firstItem();
00619   while(current != NULL)
00620   {
00621     //found a selected item!
00622     if(current->isSelected()) 
00623     { return ((PhotoPreviewWidget*)current)->getPhoto(); }   
00624     
00625     //move to next item
00626     current = current->nextItem();
00627   }
00628   
00629   //no selected items found
00630   return NULL;
00631 }
00632 //==============================================
00633 void SubalbumWidget::setSelectedPhoto(Photo* selection)
00634 {
00635   //select specified photo  
00636   QIconViewItem* current = photos->firstItem();
00637   while(current != NULL)
00638   {
00639     if( ((PhotoPreviewWidget*)current)->getPhoto() == selection )
00640     {
00641       //deselect all
00642       photos->selectAll(false);
00643 
00644       //select photo and make sure it is visible
00645       current->setSelected(true);
00646       photos->ensureItemVisible( current );      
00647       
00648       return;
00649     }
00650     
00651     //move on to next photo
00652     current = current->nextItem();
00653   }
00654 }
00655 //==============================================
00656 bool SubalbumWidget::anyPhotosSelected()
00657 {
00658   QIconViewItem* current = photos->firstItem();
00659   while(current != NULL)
00660   {
00661     if(current->isSelected())
00662       return true;
00663     current = current->nextItem();
00664   }
00665   return false;
00666 }
00667 //==============================================
00668 bool SubalbumWidget::anySelectedPhotosRevertable()
00669 {
00670   QIconViewItem* current = photos->firstItem();
00671   while(current != NULL)
00672   {
00673     if(current->isSelected())
00674     {
00675       if( ((PhotoPreviewWidget*)current)->getPhoto()->revertPossible() )
00676         return true;
00677     }
00678     current = current->nextItem();
00679   }
00680   return false;
00681 }
00682 //==============================================
00683 void SubalbumWidget::resizeEvent( QResizeEvent * )
00684 {
00685   photos->arrangeItemsInGrid();
00686 }
00687 //==============================================
00688 QIconView* SubalbumWidget::getPhotos()
00689 {
00690   return photos;
00691 }
00692 //==============================================
00693 void SubalbumWidget::reorder()
00694 {
00695   //so item has been moved, reorder linked list of items as necessary
00696   photos->sort( true );
00697   photos->arrangeItemsInGrid();
00698 
00699   //sync lists
00700   subalbum->syncPhotoList((PhotoPreviewWidget*)photos->firstItem());
00701 }
00702 //==============================================
00703 void SubalbumWidget::selectionChangedEvent()
00704 {
00705   //update rotate/add/remove buttons depending on whether or not any items are selected
00706   updateButtons();
00707   
00708   //emit selection changed signal so other menu's etc an be updated as well
00709   emit selectedPhotoStateChanged();
00710 }
00711 //==============================================
00712 void SubalbumWidget::updateButtons()
00713 {
00714   int numSelected = 0;
00715   QIconViewItem* current = photos->firstItem();
00716   while(current != NULL)
00717   {
00718     if(current->isSelected())
00719     {
00720      numSelected++;
00721 
00722      //there are effectively 3 states:
00723      //1) no items selected -> disable all buttons besides addPhoto
00724      //2) one itme selected -> enable all button, including set desktop wallpaper button
00725      //3) more than one item selected -> enable all but edit button (since we don't know which photo to edit)
00726      //thus once 2 selected photos are found we know we are in the multi select mode and can terminate the search
00727      if(numSelected > 1)
00728        break;
00729     }
00730 
00731     //move to next item
00732     current = current->nextItem();
00733   }
00734 
00735   if(numSelected == 0)
00736   {
00737     removeImage->setEnabled(false);
00738     rotate90Image->setEnabled(false);
00739     rotate270Image->setEnabled(false);
00740     if(setDesktopBtn) { setDesktopBtn->setEnabled(false); }
00741     layout->setEditTabEnabled(false);
00742   }
00743   else
00744   {
00745     removeImage->setEnabled(true);
00746     rotate90Image->setEnabled(true);
00747     rotate270Image->setEnabled(true);
00748     if(setDesktopBtn) { setDesktopBtn->setEnabled(true); }
00749     layout->setEditTabEnabled(true);
00750   }
00751 
00752   if(setDesktopBtn) { setDesktopBtn->setEnabled( numSelected == 1 ); }
00753 }
00754 //==============================================
00755 void SubalbumWidget::updateButtons(bool enable)
00756 {
00757   if(!enable)
00758   {
00759     buttonsState = rotate90Image->isEnabled();
00760     addImage->setEnabled(enable && true);
00761     removeImage->setEnabled(enable && true);
00762     rotate90Image->setEnabled(enable);
00763     rotate270Image->setEnabled(enable);
00764     if(setDesktopBtn) 
00765     { 
00766       wallpaperButtonState = setDesktopBtn->isEnabled();
00767       setDesktopBtn->setEnabled(enable); 
00768     }
00769     layout->setEditTabEnabled(enable);
00770   }
00771   else
00772   {
00773     addImage->setEnabled(enable && true);
00774     removeImage->setEnabled(buttonsState && true);
00775     rotate90Image->setEnabled(buttonsState);
00776     rotate270Image->setEnabled(buttonsState);
00777     if(setDesktopBtn) { setDesktopBtn->setEnabled(wallpaperButtonState); }
00778     layout->setEditTabEnabled(buttonsState);
00779   }
00780 }
00781 //==============================================
00782 void SubalbumWidget::deselectAll()
00783 {
00784   photos->selectAll(false);
00785 }
00786 //==============================================

Generated on Sat Apr 2 05:44:04 2005 for AlbumShaper by  doxygen 1.3.9.1