00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <qlayout.h>
00019 #include <qlabel.h>
00020 #include <qfont.h>
00021 #include <qframe.h>
00022 #include <qpushbutton.h>
00023 #include <qpixmap.h>
00024 #include <qlineedit.h>
00025 #include <qfiledialog.h>
00026 #include <qcursor.h>
00027 #include <qapplication.h>
00028
00029
00030 #include "../backend/subalbum.h"
00031 #include "../backend/photo.h"
00032 #include "window.h"
00033 #include "titleWidget.h"
00034 #include "layoutWidget.h"
00035 #include "subalbumWidget.h"
00036 #include "subalbumsWidget.h"
00037 #include "photoWidget.h"
00038 #include "questionDialog.h"
00039 #include "photosIconView.h"
00040 #include "../config.h"
00041
00042 #include <iostream.h>
00043
00044 SubalbumWidget::SubalbumWidget(Subalbum* salbum,
00045 QWidget *parent,
00046 const char* name ) :
00047 QWidget(parent,name)
00048 {
00049
00050 subalbum = salbum;
00051
00052
00053 layout = (LayoutWidget*)parent;
00054
00055
00056 subalbumName = new QLabel( this );
00057 subalbumName->setText( "Subalbum Name:" );
00058 subalbumName->setFont( QFont( "Times", 12, QFont::Bold ) );
00059 subalbumNameVal = new QLineEdit( this );
00060 subalbumNameVal->setFont( QFont( "Times", 12, QFont::Bold ) );
00061 subalbumNameVal->setText( subalbum->getName() );
00062 connect( subalbumNameVal, SIGNAL(textChanged(const QString&)),
00063 SLOT(updateName(const QString&)) );
00064
00065 subalbumDescription = new QLabel( this );
00066 subalbumDescription->setText( "Description:" );
00067 subalbumDescription->setFont( QFont( "Times", 12, QFont::Bold ) );
00068 subalbumDescriptionVal = new QLineEdit( this );
00069 subalbumDescriptionVal->setFont( QFont( "Times", 12, QFont::Bold ) );
00070 subalbumDescriptionVal->setText( subalbum->getDescription() );
00071 connect( subalbumDescriptionVal, SIGNAL(textChanged(const QString&)),
00072 SLOT(updateDescription(const QString&)) );
00073
00074
00075 representativeImageText = new QLabel( this );
00076 representativeImageText->setText( "Thumbnail:" );
00077 representativeImageText->setFont( QFont( "Times", 12, QFont::Bold ) );
00078 setImageImage = new QPixmap( QString(IMAGE_PATH)+"set.png" );
00079 setImage = new QPushButton( this );
00080 setImage->setPixmap( *setImageImage );
00081 setImage->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
00082 setImage->setEnabled(false);
00083 connect( setImage, SIGNAL(clicked()), SLOT(setImageAction()) );
00084
00085
00086 representativeImage = subalbum->getRepresentativeImage(SMALL);
00087 representativeLogo = new QLabel( this );
00088 representativeLogo->setPixmap( *representativeImage );
00089
00090
00091 photos = new PhotosIconView( this );
00092
00093
00094 photos->setArrangement( QIconView::LeftToRight );
00095 photos->setVScrollBarMode( QScrollView::AlwaysOn );
00096
00097
00098 photos->setSelectionMode( QIconView::Extended ) ;
00099
00100
00101 photos->setDragAutoScroll(true);
00102 photos->setAcceptDrops(true);
00103
00104
00105 connect( photos, SIGNAL(itemRenamed( QIconViewItem *)),
00106 this, SLOT(rearrangeAndSaveCurrent( QIconViewItem *)));
00107
00108
00109 connect( photos, SIGNAL(selectionChanged()),
00110 SLOT(updateButtons()) );
00111
00112
00113 connect( photos, SIGNAL(rightButtonClicked(QIconViewItem*, const QPoint&)),
00114 SLOT(updateButtons()) );
00115
00116
00117 connect( setImage, SIGNAL(clicked()), SLOT(setImageAction()) );
00118
00119
00120 connect( photos, SIGNAL(itemHasMoved()), SLOT(reorder()) );
00121
00122 buttons = new QFrame(this);
00123
00124 addImageImage = new QPixmap( QString(IMAGE_PATH)+"add.png" );
00125 addImage = new QPushButton( buttons );
00126 addImage->setPixmap( *addImageImage );
00127 addImage->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
00128 connect( addImage, SIGNAL(clicked()), SLOT(addImageAction()) );
00129
00130 removeImageImage = new QPixmap( QString(IMAGE_PATH)+"remove.png" );
00131 removeImage = new QPushButton( buttons );
00132 removeImage->setPixmap( *removeImageImage );
00133 removeImage->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
00134 connect( removeImage, SIGNAL(clicked()), SLOT(removeImageAction()) );
00135
00136 rotate90ImageImage = new QPixmap( QString(IMAGE_PATH)+"rotate90.png" );
00137 rotate90Image = new QPushButton( buttons );
00138 rotate90Image->setPixmap( *rotate90ImageImage );
00139 rotate90Image->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
00140 connect( rotate90Image, SIGNAL(clicked()), SLOT(rotate90ImageAction()) );
00141
00142 rotate270ImageImage = new QPixmap( QString(IMAGE_PATH)+"rotate270.png" );
00143 rotate270Image = new QPushButton( buttons );
00144 rotate270Image->setPixmap( *rotate270ImageImage );
00145 rotate270Image->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
00146 connect( rotate270Image, SIGNAL(clicked()), SLOT(rotate270ImageAction()) );
00147
00148 flipHorizontallyImageImage = new QPixmap( QString(IMAGE_PATH)+"flipHorizontally.png" );
00149 flipHorizontallyImage = new QPushButton( buttons );
00150 flipHorizontallyImage->setPixmap( *flipHorizontallyImageImage );
00151 flipHorizontallyImage->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
00152 connect( flipHorizontallyImage, SIGNAL(clicked()), SLOT(flipHorizontallyImageAction()) );
00153
00154 flipVerticallyImageImage = new QPixmap( QString(IMAGE_PATH)+"flipVertically.png" );
00155 flipVerticallyImage = new QPushButton( buttons );
00156 flipVerticallyImage->setPixmap( *flipVerticallyImageImage );
00157 flipVerticallyImage->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
00158 connect( flipVerticallyImage, SIGNAL(clicked()), SLOT(flipVerticallyImageAction()) );
00159
00160 editImage = new QPixmap( QString(IMAGE_PATH)+"editPhoto.png" );
00161 editButton = new QPushButton( buttons );
00162 editButton->setPixmap( *editImage );
00163 editButton->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
00164 connect( editButton, SIGNAL(clicked()), SLOT(editAction()) );
00165
00166
00167 grid = new QGridLayout( this, 5, 5, 0 );
00168 grid->addWidget( subalbumName, 0, 0, Qt::AlignLeft );
00169 grid->addWidget( subalbumNameVal, 0, 1 );
00170 grid->addWidget( subalbumDescription, 1, 0, Qt::AlignLeft );
00171 grid->addWidget( subalbumDescriptionVal, 1, 1 );
00172 grid->addWidget( representativeImageText, 0, 2, Qt::AlignLeft );
00173 grid->addMultiCellWidget( setImage, 1, 1, 2, 2 );
00174 grid->addMultiCellWidget( representativeLogo, 0, 2, 3, 3 );
00175 grid->addMultiCellWidget( photos, 3, 3, 0, 4 );
00176
00177 grid2 = new QGridLayout( buttons, 1, 9, 0 );
00178 grid2->addWidget( addImage, 0, 1, Qt::AlignLeft );
00179 grid2->addWidget( removeImage, 0, 2, Qt::AlignLeft );
00180 grid2->addWidget( rotate90Image, 0, 3, Qt::AlignLeft );
00181 grid2->addWidget( rotate270Image, 0, 4, Qt::AlignLeft );
00182 grid2->addWidget( flipHorizontallyImage, 0, 5, Qt::AlignLeft );
00183 grid2->addWidget( flipVerticallyImage, 0, 6, Qt::AlignLeft );
00184 grid2->addWidget( editButton, 0, 7, Qt::AlignLeft );
00185
00186
00187 grid2->setColStretch( 0, 1 );
00188 grid2->setColStretch( 8, 1 );
00189 grid->addMultiCellWidget( buttons, 4, 4, 0, 4 );
00190
00191
00192 grid->setColStretch( 4, 1 );
00193
00194
00195 grid->setRowStretch( 3, 1 );
00196
00197
00198
00199 grid->addColSpacing(1, 300 );
00200
00201
00202 setPaletteBackgroundColor( QColor(255, 255, 255) );
00203
00204
00205 removeImage->setEnabled(false);
00206 rotate90Image->setEnabled(false);
00207 rotate270Image->setEnabled(false);
00208 flipHorizontallyImage->setEnabled(false);
00209 flipVerticallyImage->setEnabled(false);
00210 editButton->setEnabled(false);
00211 }
00212
00213 SubalbumWidget::~SubalbumWidget()
00214 {
00215 delete setImageImage;
00216 delete addImageImage;
00217 delete removeImageImage;
00218 delete rotate90ImageImage;
00219 delete rotate270ImageImage;
00220 delete flipHorizontallyImageImage;
00221 delete flipVerticallyImageImage;
00222 }
00223
00224 void SubalbumWidget::setSubalbum(Subalbum* salbum)
00225 {
00226
00227 subalbum = salbum;
00228
00229
00230 subalbumNameVal->setText( subalbum->getName() );
00231 subalbumDescriptionVal->setText( subalbum->getDescription() );
00232 representativeImage = subalbum->getRepresentativeImage(SMALL);
00233 representativeLogo->setPixmap( *representativeImage );
00234
00235
00236 refreshPhotos();
00237
00238
00239 updateButtons();
00240 }
00241
00242
00243 void SubalbumWidget::setImageAction()
00244 {
00245
00246
00247 Photo* selectedPhoto = getSelectedPhoto();
00248 if(selectedPhoto == NULL)
00249 return;
00250
00251
00252 subalbum->setRepresentativeImages( selectedPhoto->getImage(THUMBNAIL) );
00253
00254
00255 representativeLogo->setPixmap( *(subalbum->getRepresentativeImage(SMALL)) );
00256 layout->updateSubalbumImage( subalbum->getRepresentativeImage(MEDIUM) );
00257
00258 }
00259
00260 void SubalbumWidget::updateName( const QString& val )
00261 {
00262 subalbum->setName(val);
00263 layout->updateSubalbumName(val);
00264 }
00265
00266 void SubalbumWidget::updateDescription( const QString& val )
00267 {
00268 subalbum->setDescription(val);
00269 }
00270
00271 void SubalbumWidget::addImageAction()
00272 {
00273
00274 layout->getWindow()->getTitle()->setBusy(true);
00275 layout->getSubalbums()->updateButtons(false);
00276 updateButtons(false);
00277 photos->setSelectionMode( QIconView::NoSelection ) ;
00278
00279
00280 QStringList fileNames = QFileDialog::getOpenFileNames("Images (*.gif *.jpg *.jpeg *.png *.xpm *.GIF *.JPG *.JPEG *.PNG *.XPM)",
00281 NULL,
00282 this,
00283 "add photos dialog",
00284 "Select photos");
00285
00286 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00287
00288
00289 QStringList::iterator it;
00290 for(it = fileNames.begin(); it != fileNames.end(); it++ )
00291 {
00292
00293 if(subalbum->addPhoto(*it))
00294 {
00295 PhotoWidget* p = new PhotoWidget( photos, subalbum->getLast() );
00296 p->setRenameEnabled(true);
00297 photos->ensureItemVisible(p);
00298 qApp->processEvents();
00299 }
00300 }
00301 photos->arrangeItemsInGrid();
00302
00303
00304 layout->getWindow()->getTitle()->setBusy(false);
00305 layout->getSubalbums()->updateButtons(true);
00306 updateButtons(true);
00307 photos->setSelectionMode( QIconView::Extended ) ;
00308 qApp->restoreOverrideCursor();
00309 }
00310
00311 void SubalbumWidget::removeImageAction()
00312 {
00313
00314 layout->getWindow()->getTitle()->setBusy(true);
00315 layout->getSubalbums()->updateButtons(false);
00316 updateButtons(false);
00317 photos->setSelectionMode( QIconView::NoSelection ) ;
00318
00319
00320 QuestionDialog sure( "Remove selected photos?",
00321 "Once removed photos cannot be restored. Furthermore apon resaving they are physically removed from your album.",
00322 "warning.png",
00323 this );
00324
00325 if(sure.exec())
00326 {
00327 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00328
00329 QIconViewItem* current = photos->firstItem();
00330 QIconViewItem* temp;
00331 while(current != NULL)
00332 {
00333
00334 if(!current->isSelected())
00335 {
00336 current = current->nextItem();
00337 continue;
00338 }
00339
00340
00341 temp = current->nextItem();
00342
00343
00344 Photo* phto = ((PhotoWidget*)current)->getPhoto();
00345
00346
00347 delete current;
00348 current = temp;
00349
00350
00351 subalbum->removePhoto(phto);
00352
00353
00354 updateButtons();
00355 }
00356
00357 photos->arrangeItemsInGrid();
00358
00359
00360 qApp->restoreOverrideCursor();
00361 }
00362
00363 layout->getWindow()->getTitle()->setBusy(false);
00364 layout->getSubalbums()->updateButtons(true);
00365 updateButtons(true);
00366 photos->setSelectionMode( QIconView::Extended ) ;
00367 }
00368
00369 void SubalbumWidget::rotate90ImageAction()
00370 {
00371
00372 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00373 layout->getWindow()->getTitle()->setBusy(true);
00374 layout->getSubalbums()->updateButtons(false);
00375 photos->setSelectionMode( QIconView::NoSelection ) ;
00376 updateButtons(false);
00377
00378
00379 QIconViewItem* current = photos->firstItem();
00380 while(current != NULL)
00381 {
00382 if(current->isSelected())
00383 {
00384 ((PhotoWidget*)current)->getPhoto()->rotate90();
00385 photos->ensureItemVisible(((PhotoWidget*)current));
00386 ((PhotoWidget*)current)->updateImage();
00387 qApp->processEvents();
00388 }
00389
00390
00391 current = current->nextItem();
00392 }
00393
00394
00395 layout->getWindow()->getTitle()->setBusy(false);
00396 layout->getSubalbums()->updateButtons(true);
00397 updateButtons(true);
00398 photos->setSelectionMode( QIconView::Extended ) ;
00399 qApp->restoreOverrideCursor();
00400 }
00401
00402 void SubalbumWidget::rotate270ImageAction()
00403 {
00404
00405 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00406 layout->getWindow()->getTitle()->setBusy(true);
00407 layout->getSubalbums()->updateButtons(false);
00408 photos->setSelectionMode( QIconView::NoSelection ) ;
00409 updateButtons(false);
00410
00411
00412 QIconViewItem* current = photos->firstItem();
00413 while(current != NULL)
00414 {
00415 if(current->isSelected())
00416 {
00417 ((PhotoWidget*)current)->getPhoto()->rotate270();
00418 photos->ensureItemVisible(((PhotoWidget*)current));
00419 ((PhotoWidget*)current)->updateImage();
00420 qApp->processEvents();
00421 }
00422
00423
00424 current = current->nextItem();
00425 }
00426
00427
00428 layout->getWindow()->getTitle()->setBusy(false);
00429 layout->getSubalbums()->updateButtons(true);
00430 updateButtons(true);
00431 photos->setSelectionMode( QIconView::Extended ) ;
00432 qApp->restoreOverrideCursor();
00433 }
00434
00435 void SubalbumWidget::flipHorizontallyImageAction()
00436 {
00437
00438 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00439 layout->getWindow()->getTitle()->setBusy(true);
00440 layout->getSubalbums()->updateButtons(false);
00441 photos->setSelectionMode( QIconView::NoSelection ) ;
00442 updateButtons(false);
00443
00444
00445 QIconViewItem* current = photos->firstItem();
00446 while(current != NULL)
00447 {
00448 if(current->isSelected())
00449 {
00450 ((PhotoWidget*)current)->getPhoto()->flipHorizontally();
00451 photos->ensureItemVisible(((PhotoWidget*)current));
00452 ((PhotoWidget*)current)->updateImage();
00453 qApp->processEvents();
00454 }
00455
00456
00457 current = current->nextItem();
00458 }
00459
00460
00461 layout->getWindow()->getTitle()->setBusy(false);
00462 layout->getSubalbums()->updateButtons(true);
00463 updateButtons(true);
00464 photos->setSelectionMode( QIconView::Extended ) ;
00465 qApp->restoreOverrideCursor();
00466 }
00467
00468 void SubalbumWidget::flipVerticallyImageAction()
00469 {
00470
00471 qApp->setOverrideCursor( QCursor(Qt::WaitCursor));
00472 layout->getWindow()->getTitle()->setBusy(true);
00473 layout->getSubalbums()->updateButtons(false);
00474 photos->setSelectionMode( QIconView::NoSelection ) ;
00475 updateButtons(false);
00476
00477
00478 QIconViewItem* current = photos->firstItem();
00479 while(current != NULL)
00480 {
00481 if(current->isSelected())
00482 {
00483 ((PhotoWidget*)current)->getPhoto()->flipVertically();
00484 photos->ensureItemVisible(((PhotoWidget*)current));
00485 ((PhotoWidget*)current)->updateImage();
00486 qApp->processEvents();
00487 }
00488
00489
00490 current = current->nextItem();
00491 }
00492
00493
00494 layout->getWindow()->getTitle()->setBusy(false);
00495 layout->getSubalbums()->updateButtons(true);
00496 updateButtons(true);
00497 photos->setSelectionMode( QIconView::Extended ) ;
00498 qApp->restoreOverrideCursor();
00499 }
00500
00501 void SubalbumWidget::editAction()
00502 {
00503 Photo* selected = getSelectedPhoto();
00504 if(selected != NULL)
00505 layout->editPhoto( selected );
00506 else
00507 {
00508
00509 }
00510 }
00511
00512 void SubalbumWidget::refreshPhotos()
00513 {
00514
00515 photos->clear();
00516
00517
00518 Photo* currentPhoto = subalbum->getFirst();
00519 while(currentPhoto != NULL)
00520 {
00521 PhotoWidget* p = new PhotoWidget( photos, currentPhoto );
00522 p->setRenameEnabled(true);
00523 currentPhoto = currentPhoto->getNext();
00524 }
00525
00526 photos->arrangeItemsInGrid();
00527 }
00528
00529 void SubalbumWidget::refreshSelectedPhotos()
00530 {
00531 QIconViewItem* current = photos->firstItem();
00532 while(current != NULL)
00533 {
00534
00535 if(current->isSelected())
00536 {
00537 ((PhotoWidget*)current)->updateImage();
00538 ((PhotoWidget*)current)->updateDescription();
00539 }
00540
00541
00542 current = current->nextItem();
00543 }
00544 }
00545
00546 void SubalbumWidget::syncPhotos()
00547 {
00548 PhotoWidget* current = (PhotoWidget*)photos->firstItem();
00549 while(current != NULL)
00550 {
00551 current->sync();
00552 current = (PhotoWidget*)current->nextItem();
00553 }
00554 }
00555
00556 Subalbum* SubalbumWidget::getSubalbum()
00557 {
00558 return subalbum;
00559 }
00560
00561 Photo* SubalbumWidget::getSelectedPhoto()
00562 {
00563
00564 int numSelected = 0;
00565 QIconViewItem* current = photos->firstItem();
00566 QIconViewItem* selected = NULL;
00567 while(current != NULL)
00568 {
00569
00570 if(current->isSelected())
00571 {
00572 numSelected++;
00573 selected = current;
00574 }
00575
00576
00577 if(numSelected > 1)
00578 break;
00579
00580
00581 current = current->nextItem();
00582 }
00583
00584
00585 if(numSelected == 1)
00586 {
00587 return ((PhotoWidget*)selected)->getPhoto();
00588 }
00589 else
00590 {
00591 return NULL;
00592 }
00593 }
00594
00595 void SubalbumWidget::resizeEvent( QResizeEvent * )
00596 {
00597 photos->arrangeItemsInGrid();
00598 }
00599
00600 QIconView* SubalbumWidget::getPhotos()
00601 {
00602 return photos;
00603 }
00604
00605 void SubalbumWidget::rearrangeAndSaveCurrent(QIconViewItem* item)
00606 {
00607 ((PhotoWidget*)item)->sync();
00608 photos->arrangeItemsInGrid();
00609 }
00610
00611 void SubalbumWidget::reorder()
00612 {
00613
00614 photos->sort( true );
00615 photos->arrangeItemsInGrid();
00616
00617
00618 subalbum->syncPhotoList((PhotoWidget*)photos->firstItem());
00619 }
00620
00621 void SubalbumWidget::updateButtons()
00622 {
00623 bool anySelected = false;
00624 QIconViewItem* current = photos->firstItem();
00625 while(current != NULL)
00626 {
00627 if(current->isSelected())
00628 {
00629 anySelected = true;
00630 break;
00631 }
00632
00633
00634 current = current->nextItem();
00635 }
00636
00637 if(!anySelected)
00638 {
00639 removeImage->setEnabled(false);
00640 rotate90Image->setEnabled(false);
00641 rotate270Image->setEnabled(false);
00642 flipHorizontallyImage->setEnabled(false);
00643 flipVerticallyImage->setEnabled(false);
00644 editButton->setEnabled(false);
00645 layout->getWindow()->getTitle()->setSetButtonState(false);
00646 setImage->setEnabled(false);
00647 }
00648 else
00649 {
00650 removeImage->setEnabled(true);
00651 rotate90Image->setEnabled(true);
00652 rotate270Image->setEnabled(true);
00653 flipHorizontallyImage->setEnabled(true);
00654 flipVerticallyImage->setEnabled(true);
00655 editButton->setEnabled(true);
00656 layout->getWindow()->getTitle()->setSetButtonState(true);
00657 setImage->setEnabled(true);
00658 }
00659 }
00660
00661 void SubalbumWidget::updateButtons(bool enable)
00662 {
00663 if(!enable)
00664 {
00665 buttonsState = rotate90Image->isEnabled();
00666 addImage->setEnabled(enable);
00667 removeImage->setEnabled(enable);
00668 rotate90Image->setEnabled(enable);
00669 rotate270Image->setEnabled(enable);
00670 flipHorizontallyImage->setEnabled(enable);
00671 flipVerticallyImage->setEnabled(enable);
00672 editButton->setEnabled(enable);
00673 setImage->setEnabled(enable);
00674 }
00675 else
00676 {
00677 addImage->setEnabled(enable);
00678 removeImage->setEnabled(buttonsState);
00679 rotate90Image->setEnabled(buttonsState);
00680 rotate270Image->setEnabled(buttonsState);
00681 flipHorizontallyImage->setEnabled(buttonsState);
00682 flipVerticallyImage->setEnabled(buttonsState);
00683 editButton->setEnabled(buttonsState);
00684 setImage->setEnabled(buttonsState);
00685 }
00686 }
00687