AlbumShaper
1.0a3
|
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 //unset busy flag and activate menu's/buttons 00370 qApp->restoreOverrideCursor(); 00371 } 00372 00373 layout->getWindow()->getTitle()->setBusy(false); 00374 layout->getSubalbums()->updateButtons(true); 00375 updateButtons(true); 00376 photos->setSelectionMode( QIconView::Extended ) ; 00377 00378 //update buttons and emit selection changed signal 00379 selectionChangedEvent(); 00380 } 00381 //============================================== 00382 void SubalbumWidget::revertSelectedPhotos() 00383 { 00384 //iterate over photos in current collection 00385 QIconViewItem* current = photos->firstItem(); 00386 while(current != NULL) 00387 { 00388 //found a selected item! 00389 if(current->isSelected()) 00390 { 00391 ((PhotoPreviewWidget*)current)->getPhoto()->revertPhoto(); 00392 photos->ensureItemVisible(((PhotoPreviewWidget*)current)); 00393 ((PhotoPreviewWidget*)current)->updateImage(); 00394 qApp->processEvents(); 00395 } 00396 00397 //move to next item 00398 current = current->nextItem(); 00399 } 00400 00401 //state of selected photos has changed 00402 emit selectedPhotoStateChanged(); 00403 } 00404 //============================================== 00405 void SubalbumWidget::setWallpaperAction() 00406 { 00407 //get first selected photo, if no photo is selected then bail 00408 Photo* phto = getSelectedPhoto(); 00409 if(phto == NULL) return; 00410 00411 //set the wallpaper 00412 setWallpaper( phto ); 00413 } 00414 //============================================== 00415 void SubalbumWidget::rotate90ImageAction() 00416 { 00417 //set busy flag and deactivate menu's/buttons 00418 qApp->setOverrideCursor( QCursor(Qt::WaitCursor)); 00419 layout->getWindow()->getTitle()->setBusy(true); 00420 layout->getSubalbums()->updateButtons(false); 00421 photos->setSelectionMode( QIconView::NoSelection ) ; 00422 updateButtons(false); 00423 00424 //setup progress bar 00425 QString statusMessage = tr("Rotating %1 photos:"); 00426 layout->getWindow()->getStatus()->showProgressBar( statusMessage.arg(photos->numSelected()), photos->numSelected() ); 00427 qApp->processEvents(); 00428 00429 //rotate the selected photos 00430 int num = 0; 00431 QIconViewItem* current = photos->firstItem(); 00432 while(current != NULL) 00433 { 00434 if(current->isSelected()) 00435 { 00436 //update status message 00437 layout->getWindow()->getStatus()->updateProgress( num, statusMessage.arg(photos->numSelected() - num) ); 00438 00439 ((PhotoPreviewWidget*)current)->getPhoto()->rotate90(); 00440 photos->ensureItemVisible(((PhotoPreviewWidget*)current)); 00441 ((PhotoPreviewWidget*)current)->updateImage(); 00442 num++; 00443 layout->getWindow()->getStatus()->updateProgress( num ); 00444 qApp->processEvents(); 00445 } 00446 00447 //move to next item 00448 current = current->nextItem(); 00449 } 00450 00451 //state of selected photos has changed 00452 emit selectedPhotoStateChanged(); 00453 00454 //hide progress bar 00455 layout->getWindow()->getStatus()->setStatus( tr("Rotating complete.") ); 00456 00457 //not busy any more 00458 layout->getWindow()->getTitle()->setBusy(false); 00459 layout->getSubalbums()->updateButtons(true); 00460 updateButtons(true); 00461 photos->setSelectionMode( QIconView::Extended ) ; 00462 00463 qApp->restoreOverrideCursor(); 00464 } 00465 //============================================== 00466 void SubalbumWidget::rotate270ImageAction() 00467 { 00468 //set busy flag and deactivate menu's/buttons 00469 qApp->setOverrideCursor( QCursor(Qt::WaitCursor)); 00470 layout->getWindow()->getTitle()->setBusy(true); 00471 layout->getSubalbums()->updateButtons(false); 00472 photos->setSelectionMode( QIconView::NoSelection ) ; 00473 updateButtons(false); 00474 00475 //setup progress bar 00476 QString statusMessage = tr("Rotating %1 photos:"); 00477 layout->getWindow()->getStatus()->showProgressBar( statusMessage.arg(photos->numSelected()), photos->numSelected() ); 00478 qApp->processEvents(); 00479 00480 //rotate the selected photos 00481 int num = 0; 00482 QIconViewItem* current = photos->firstItem(); 00483 while(current != NULL) 00484 { 00485 if(current->isSelected()) 00486 { 00487 //update status message 00488 layout->getWindow()->getStatus()->updateProgress( num, statusMessage.arg(photos->numSelected() - num) ); 00489 00490 ((PhotoPreviewWidget*)current)->getPhoto()->rotate270(); 00491 photos->ensureItemVisible(((PhotoPreviewWidget*)current)); 00492 ((PhotoPreviewWidget*)current)->updateImage(); 00493 num++; 00494 layout->getWindow()->getStatus()->updateProgress( num ); 00495 qApp->processEvents(); 00496 } 00497 00498 //move to next item 00499 current = current->nextItem(); 00500 } 00501 00502 //state of selected photos has changed 00503 emit selectedPhotoStateChanged(); 00504 00505 //hide progress bar 00506 layout->getWindow()->getStatus()->setStatus( tr("Rotating complete.") ); 00507 00508 //not busy any more 00509 layout->getWindow()->getTitle()->setBusy(false); 00510 layout->getSubalbums()->updateButtons(true); 00511 updateButtons(true); 00512 photos->setSelectionMode( QIconView::Extended ) ; 00513 qApp->restoreOverrideCursor(); 00514 } 00515 //============================================== 00516 void SubalbumWidget::refreshPhotos() 00517 { 00518 //remove all thumbnails 00519 photos->clear(); 00520 00521 if(subalbum != NULL) 00522 { 00523 //insert photo thumbnails 00524 Photo* currentPhoto = subalbum->getFirst(); 00525 while(currentPhoto != NULL) 00526 { 00527 new PhotoPreviewWidget( photos, currentPhoto ); 00528 currentPhoto = currentPhoto->getNext(); 00529 } 00530 00531 photos->arrangeItemsInGrid(); 00532 } 00533 } 00534 //============================================== 00535 void SubalbumWidget::refreshAllPhotos() 00536 { 00537 QIconViewItem* current = photos->firstItem(); 00538 while(current != NULL) 00539 { 00540 ((PhotoPreviewWidget*)current)->updateImage(); 00541 ((PhotoPreviewWidget*)current)->updateDescription(); 00542 current = current->nextItem(); 00543 } 00544 } 00545 //============================================== 00546 void SubalbumWidget::refreshSelectedPhotos() 00547 { 00548 QIconViewItem* current = photos->firstItem(); 00549 while(current != NULL) 00550 { 00551 //found a selected item! 00552 if(current->isSelected()) 00553 { 00554 ((PhotoPreviewWidget*)current)->updateImage(); 00555 ((PhotoPreviewWidget*)current)->updateDescription(); 00556 } 00557 00558 //move to next item 00559 current = current->nextItem(); 00560 } 00561 } 00562 //============================================== 00563 void SubalbumWidget::stripDescriptionsFromSelectedPhotos() 00564 { 00565 QIconViewItem* current = photos->firstItem(); 00566 while(current != NULL) 00567 { 00568 //found a selected item! 00569 if(current->isSelected()) 00570 { 00571 ((PhotoPreviewWidget*)current)->getPhoto()->setDescription(""); 00572 ((PhotoPreviewWidget*)current)->setText( "" ); 00573 } 00574 00575 //move to next item 00576 current = current->nextItem(); 00577 } 00578 } 00579 //============================================== 00580 Subalbum* SubalbumWidget::getSubalbum() 00581 { 00582 return subalbum; 00583 } 00584 //============================================== 00585 Photo* SubalbumWidget::getSelectedPhoto() 00586 { 00587 //determine if one photo is selected 00588 int numSelected = 0; 00589 QIconViewItem* current = photos->firstItem(); 00590 QIconViewItem* selected = NULL; 00591 while(current != NULL) 00592 { 00593 //found a selected item! 00594 if(current->isSelected()) 00595 { 00596 numSelected++; 00597 selected = current; 00598 } 00599 00600 //if more than one found then bail! 00601 if(numSelected > 1) return NULL; 00602 00603 //move to next item 00604 current = current->nextItem(); 00605 } 00606 00607 //if one item is selected then return photo pointer 00608 if(numSelected == 1) { return ((PhotoPreviewWidget*)selected)->getPhoto(); } 00609 else { return NULL; } 00610 } 00611 //============================================== 00612 Photo* SubalbumWidget::getFirstSelectedPhoto() 00613 { 00614 //determine if one photo is selected 00615 QIconViewItem* current = photos->firstItem(); 00616 while(current != NULL) 00617 { 00618 //found a selected item! 00619 if(current->isSelected()) 00620 { return ((PhotoPreviewWidget*)current)->getPhoto(); } 00621 00622 //move to next item 00623 current = current->nextItem(); 00624 } 00625 00626 //no selected items found 00627 return NULL; 00628 } 00629 //============================================== 00630 void SubalbumWidget::setSelectedPhoto(Photo* selection) 00631 { 00632 //select specified photo 00633 QIconViewItem* current = photos->firstItem(); 00634 while(current != NULL) 00635 { 00636 if( ((PhotoPreviewWidget*)current)->getPhoto() == selection ) 00637 { 00638 //deselect all 00639 photos->selectAll(false); 00640 00641 //select photo and make sure it is visible 00642 current->setSelected(true); 00643 photos->ensureItemVisible( current ); 00644 00645 return; 00646 } 00647 00648 //move on to next photo 00649 current = current->nextItem(); 00650 } 00651 } 00652 //============================================== 00653 bool SubalbumWidget::anyPhotosSelected() 00654 { 00655 QIconViewItem* current = photos->firstItem(); 00656 while(current != NULL) 00657 { 00658 if(current->isSelected()) 00659 return true; 00660 current = current->nextItem(); 00661 } 00662 return false; 00663 } 00664 //============================================== 00665 bool SubalbumWidget::anySelectedPhotosRevertable() 00666 { 00667 QIconViewItem* current = photos->firstItem(); 00668 while(current != NULL) 00669 { 00670 if(current->isSelected()) 00671 { 00672 if( ((PhotoPreviewWidget*)current)->getPhoto()->revertPossible() ) 00673 return true; 00674 } 00675 current = current->nextItem(); 00676 } 00677 return false; 00678 } 00679 //============================================== 00680 void SubalbumWidget::resizeEvent( QResizeEvent * ) 00681 { 00682 photos->arrangeItemsInGrid(); 00683 } 00684 //============================================== 00685 QIconView* SubalbumWidget::getPhotos() 00686 { 00687 return photos; 00688 } 00689 //============================================== 00690 void SubalbumWidget::reorder() 00691 { 00692 //so item has been moved, reorder linked list of items as necessary 00693 photos->sort( true ); 00694 photos->arrangeItemsInGrid(); 00695 00696 //sync lists 00697 subalbum->syncPhotoList((PhotoPreviewWidget*)photos->firstItem()); 00698 } 00699 //============================================== 00700 void SubalbumWidget::selectionChangedEvent() 00701 { 00702 //update rotate/add/remove buttons depending on whether or not any items are selected 00703 updateButtons(); 00704 00705 //emit selection changed signal so other menu's etc an be updated as well 00706 emit selectedPhotoStateChanged(); 00707 } 00708 //============================================== 00709 void SubalbumWidget::updateButtons() 00710 { 00711 int numSelected = 0; 00712 QIconViewItem* current = photos->firstItem(); 00713 while(current != NULL) 00714 { 00715 if(current->isSelected()) 00716 { 00717 numSelected++; 00718 00719 //there are effectively 3 states: 00720 //1) no items selected -> disable all buttons besides addPhoto 00721 //2) one itme selected -> enable all button, including set desktop wallpaper button 00722 //3) more than one item selected -> enable all but edit button (since we don't know which photo to edit) 00723 //thus once 2 selected photos are found we know we are in the multi select mode and can terminate the search 00724 if(numSelected > 1) 00725 break; 00726 } 00727 00728 //move to next item 00729 current = current->nextItem(); 00730 } 00731 00732 if(numSelected == 0) 00733 { 00734 removeImage->setEnabled(false); 00735 rotate90Image->setEnabled(false); 00736 rotate270Image->setEnabled(false); 00737 if(setDesktopBtn) { setDesktopBtn->setEnabled(false); } 00738 layout->setEditTabEnabled(false); 00739 } 00740 else 00741 { 00742 removeImage->setEnabled(true); 00743 rotate90Image->setEnabled(true); 00744 rotate270Image->setEnabled(true); 00745 if(setDesktopBtn) { setDesktopBtn->setEnabled(true); } 00746 layout->setEditTabEnabled(true); 00747 } 00748 00749 if(setDesktopBtn) { setDesktopBtn->setEnabled( numSelected == 1 ); } 00750 } 00751 //============================================== 00752 void SubalbumWidget::updateButtons(bool enable) 00753 { 00754 if(!enable) 00755 { 00756 buttonsState = rotate90Image->isEnabled(); 00757 addImage->setEnabled(enable && true); 00758 removeImage->setEnabled(enable && true); 00759 rotate90Image->setEnabled(enable); 00760 rotate270Image->setEnabled(enable); 00761 if(setDesktopBtn) 00762 { 00763 wallpaperButtonState = setDesktopBtn->isEnabled(); 00764 setDesktopBtn->setEnabled(enable); 00765 } 00766 layout->setEditTabEnabled(enable); 00767 } 00768 else 00769 { 00770 addImage->setEnabled(enable && true); 00771 removeImage->setEnabled(buttonsState && true); 00772 rotate90Image->setEnabled(buttonsState); 00773 rotate270Image->setEnabled(buttonsState); 00774 if(setDesktopBtn) { setDesktopBtn->setEnabled(wallpaperButtonState); } 00775 layout->setEditTabEnabled(buttonsState); 00776 } 00777 } 00778 //============================================== 00779 void SubalbumWidget::deselectAll() 00780 { 00781 photos->selectAll(false); 00782 } 00783 //==============================================