|
AlbumShaper
1.0a3
|
Extension of iconview, used to list all photos in a subalbum. supports drag-n-drop within iconview. More...
#include <photosIconView.h>
Public Slots | |
| void | clearPseudoSelection () |
| void | repaintGroup (QIconViewItem *pseudoSelection) |
Signals | |
| void | itemHasMoved () |
| void | addPhotos (QStringList) |
| void | removeSelectedPhotos () |
| void | rotate90SelectedPhotos () |
| void | rotate270SelectedPhotos () |
| void | editSelectedPhoto () |
Public Member Functions | |
| PhotosIconView (QWidget *parent) | |
| int | numSelected () |
Protected Member Functions | |
| QDragObject * | dragObject () |
| void | drawContents (QPainter *p, int clipx, int clipy, int clipw, int cliph) |
| void | drawBackground (QPainter *p, const QRect &r) |
| void | contextMenuEvent (QContextMenuEvent *e) |
| void | contentsMouseMoveEvent (QMouseEvent *e) |
| void | contentsMousePressEvent (QMouseEvent *e) |
| void | keyPressEvent (QKeyEvent *e) |
Private Slots | |
| void | setAlbumImage () |
| void | setSubalbumImage () |
| void | captureClick (QIconViewItem *, const QPoint &) |
Private Member Functions | |
| void | contentsDropEvent (QDropEvent *e) |
| bool | findNearestUnselectedPhoto (const QPoint &pos, QIconViewItem **nearestItem, bool &posIsleftOfItem) |
Private Attributes | |
| PhotoPreviewWidget * | rightClickedPhoto |
| QPixmap * | backgroundImage |
| QPixmap | bufferPixmap |
| QPixmap * | dragIcon |
| PhotoPreviewWidget * | currentPseudoSelection |
| bool | handCursorShown |
| QPoint | dragStartPos |
| PhotoDescEdit * | curPhotoDescEdit |
Extension of iconview, used to list all photos in a subalbum. supports drag-n-drop within iconview.
Definition at line 29 of file photosIconView.h.
| PhotosIconView::PhotosIconView | ( | QWidget * | parent | ) |
Definition at line 46 of file photosIconView.cpp.
References backgroundImage, captureClick(), clearPseudoSelection(), curPhotoDescEdit, currentPseudoSelection, dragIcon, handCursorShown, IMAGE_PATH, repaintGroup(), and rightClickedPhoto.
: QIconView( parent, "iconView", WNoAutoErase ) { viewport()->setBackgroundMode( Qt::NoBackground ); currentPseudoSelection = NULL; handCursorShown = false; curPhotoDescEdit = NULL; //by default no photo has been right clicked on rightClickedPhoto = NULL; //load background image backgroundImage = new QPixmap( QString(IMAGE_PATH)+"miscImages/backgroundImage.png" ); //load drag icon dragIcon = new QPixmap( QString(IMAGE_PATH)+"miscImages/moveImage.png" ); //connect mouse over events to paint pseudo selection in ligher blue connect( this, SIGNAL(onItem(QIconViewItem*)), this, SLOT(repaintGroup(QIconViewItem*)) ); //clear any pseudo selection when mouse moves off icons connect( this, SIGNAL(onViewport()), this, SLOT(clearPseudoSelection()) ); connect( this, SIGNAL(pressed( QIconViewItem*, const QPoint& )), this, SLOT(captureClick(QIconViewItem*, const QPoint&)) ); }
| void PhotosIconView::addPhotos | ( | QStringList | ) | [signal] |
Referenced by contentsDropEvent().
| void PhotosIconView::captureClick | ( | QIconViewItem * | item, |
| const QPoint & | point | ||
| ) | [private, slot] |
Definition at line 394 of file photosIconView.cpp.
References curPhotoDescEdit, and topLeft.
Referenced by PhotosIconView().
{
//if no item has been clicked then ignore
if(item == NULL)
return;
//get info button rect
QRect infoButtonRec = ((PhotoPreviewWidget*)item)->getPhotoInfoRect();
//remove scroll offset
infoButtonRec.moveBy( -contentsX(), -contentsY() );
//convert to screen coordinates by shifting by offset of topleft of widget
QPoint topLeft = mapToGlobal( QPoint(0,0) );
infoButtonRec.moveBy( topLeft.x(), topLeft.y() );
//if screen coordinates of mouse click are in rectangle then button pressed
if( infoButtonRec.contains( point.x(), point.y() ) )
{
//make sure all events have been processed first. if were just
//editing a differnt photo description it is first necessary to
//repaint before we start editing the next
qApp->processEvents();
if( curPhotoDescEdit != NULL ) { delete curPhotoDescEdit; }
PhotoPreviewWidget* ppw = (PhotoPreviewWidget*)item;
curPhotoDescEdit = new PhotoDescEdit( ppw,
((Window*)qApp->mainWidget())->getConfig()->getBool( "layout", "animation" ) );
}
}
| void PhotosIconView::clearPseudoSelection | ( | ) | [slot] |
Definition at line 376 of file photosIconView.cpp.
References currentPseudoSelection, and PhotoPreviewWidget::setMousedOver().
Referenced by PhotosIconView(), and repaintGroup().
{
//check to make sure mouse is still off item. when a user expands an image to edit
//it's description, the selection is cleard (since hte mouse is over a new window). however,
//when that window disappears repaintGroup never got recalled (if the mouse was still on the original window),
//so just ignore the original clear (it was invalid anyways right?)
if( findItem( viewport()->mapFromGlobal( QCursor::pos() )+=QPoint( contentsX(), contentsY() ) ) == currentPseudoSelection )
return;
//if old pseudo selection unselect it
if(currentPseudoSelection != NULL)
{
currentPseudoSelection->setMousedOver(false);
repaintItem(currentPseudoSelection);
currentPseudoSelection = NULL;
}
}
| void PhotosIconView::contentsDropEvent | ( | QDropEvent * | e | ) | [private] |
Definition at line 223 of file photosIconView.cpp.
References addPhotos(), findNearestUnselectedPhoto(), and itemHasMoved().
{
QIconView::contentsDropEvent( e );
//if item is from the viewport emit item moved signal
if(e->source() == viewport() )
{
//find nearest unselected item
QIconViewItem* item; bool leftOf;
if( !findNearestUnselectedPhoto( e->pos(), &item, leftOf ) )
{
//unable to find nearest item. this should be impossible
// cout << "ERROR! Failed to find nearest item!\n";
emit itemHasMoved();
}
//selected photos dropped on LEFT of nearest item
if( leftOf )
{
//count number of items being moved
int num=0;
QIconViewItem* current = firstItem();
while(current != NULL)
{
if(current->isSelected()) { num++; }
current = current->nextItem();
}
//move items to their new locations
int xpos = item->x() - num;
current = firstItem();
while(current != NULL)
{
if(current->isSelected())
{
current->move(xpos, item->y());
xpos++;
}
current = current->nextItem();
}
}
//selected phtos dropped on RIGHT of nearest item
else
{
//move items to their new locations
int xpos = item->x() + (item->width()/2) + 1;
QIconViewItem* current = firstItem();
while(current != NULL)
{
if(current->isSelected())
{
current->move(xpos, item->y());
xpos++;
}
current = current->nextItem();
}
}
//items have moved!
emit itemHasMoved();
}
//else it's from off the viewport, if we can get filename then try adding photos being added to subalbum
else
{
QStringList fileNames;
if( QUriDrag::decodeLocalFiles( e, fileNames ) )
{
//for some reason the order in which we receive file names is entire illogical.
//it does not appear to be based on filename, data, modified data, size, anything!
//thus, before adding files, first sort by ascending filename
fileNames.sort();
emit addPhotos(fileNames);
}
}
}
| void PhotosIconView::contentsMouseMoveEvent | ( | QMouseEvent * | e | ) | [protected] |
Definition at line 432 of file photosIconView.cpp.
References currentPseudoSelection, PhotoPreviewWidget::getPhotoInfoRect(), and handCursorShown.
{
QIconView::contentsMouseMoveEvent( e );
//if no item is under mouse then return
if(currentPseudoSelection == NULL)
{
if(handCursorShown)
{
setCursor( QCursor( Qt::ArrowCursor ) );
handCursorShown = false;
}
return;
}
QRect photoInfoRect = currentPseudoSelection->getPhotoInfoRect();
//if hand not shown but over hover over image then turn hand cursor on
if( !handCursorShown && photoInfoRect.contains( e->x(), e->y() ) )
{
setCursor( QCursor( Qt::PointingHandCursor ) );
handCursorShown = true;
return;
}
//if hand cursor shown but nolonger over hover over image set cursor back to normal
if( handCursorShown && !photoInfoRect.contains( e->x(), e->y() ) )
{
setCursor( QCursor( Qt::ArrowCursor ) );
handCursorShown = false;
return;
}
}
| void PhotosIconView::contentsMousePressEvent | ( | QMouseEvent * | e | ) | [protected] |
Definition at line 426 of file photosIconView.cpp.
References dragStartPos.
{
dragStartPos = e->pos();
QIconView::contentsMousePressEvent( e );
}
| void PhotosIconView::contextMenuEvent | ( | QContextMenuEvent * | e | ) | [protected] |
Definition at line 313 of file photosIconView.cpp.
References IMAGE_PATH, rightClickedPhoto, setAlbumImage(), and setSubalbumImage().
{
rightClickedPhoto = (PhotoPreviewWidget*) findItem( QPoint(e->x(), e->y()+contentsY()) );
if(rightClickedPhoto == NULL)
return;
QPopupMenu contextMenu( this );
contextMenu.insertItem( QIconSet( QPixmap(QString(IMAGE_PATH)+"menuIcons/setAlbumImage.png") ),
tr("Set album image"), this, SLOT(setAlbumImage()) );
contextMenu.insertItem( QIconSet( QPixmap(QString(IMAGE_PATH)+"menuIcons/setSubalbumImage.png") ),
tr("Set collection image"), this, SLOT(setSubalbumImage()) );
contextMenu.exec( QPoint(e->globalX(), e->globalY()) );
}
| QDragObject * PhotosIconView::dragObject | ( | ) | [protected] |
!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!
Definition at line 76 of file photosIconView.cpp.
References dragIcon.
{
//no item selected?
if( !currentItem() )
return 0;
//create drag object
// PhotoDrag *drag = new PhotoDrag( viewport() );
QIconDrag *drag = new QIconDrag( viewport() );
//use small icon to represent drag, does not cover up too much of the screen
drag->setPixmap( *dragIcon );
//TODO find out how we can add filenames and PREVENT them from being MOVED to new location
//like whendropping photoson the desktop!!!
//create stringlist of all selected photo filenames
//QStringList filenames;
//QIconViewItem* current = firstItem();
//while(current != NULL)
//{
// if(current->isSelected())
// {
// filenames.append( ((PhotoPreviewWidget*)current)->getPhoto()->getImageFilename() );
// }
//
// current = current->nextItem();
//}
// drag->setFileNames( filenames );
return drag;
}
| void PhotosIconView::drawBackground | ( | QPainter * | p, |
| const QRect & | r | ||
| ) | [protected] |
Definition at line 342 of file photosIconView.cpp.
References backgroundImage.
{
QBrush brush;
brush.setPixmap( *backgroundImage );
p->fillRect( r, brush );
}
| void PhotosIconView::drawContents | ( | QPainter * | p, |
| int | clipx, | ||
| int | clipy, | ||
| int | clipw, | ||
| int | cliph | ||
| ) | [protected] |
Definition at line 349 of file photosIconView.cpp.
References bufferPixmap.
{
if( bufferPixmap.size() != size())
{ bufferPixmap.resize( size() ); }
QPainter bufferPainter( &bufferPixmap, viewport() );
int xOffset = clipx - contentsX();
int yOffset = clipy - contentsY();
bufferPainter.translate( -contentsX(), -contentsY() );
QIconView::drawContents( &bufferPainter, clipx, clipy, clipw, cliph );
bitBlt(p->device(), xOffset, yOffset, &bufferPixmap, xOffset, yOffset, clipw, cliph );
}
| void PhotosIconView::editSelectedPhoto | ( | ) | [signal] |
Referenced by keyPressEvent().
| bool PhotosIconView::findNearestUnselectedPhoto | ( | const QPoint & | pos, |
| QIconViewItem ** | nearestItem, | ||
| bool & | posIsleftOfItem | ||
| ) | [private] |
Definition at line 110 of file photosIconView.cpp.
References width.
Referenced by contentsDropEvent().
{
//if there are no items we can't find one now can we?
if ( firstItem() == NULL )
return false;
//------------------------------------------------
//first see if there is an unselected photo here
QIconViewItem* item = firstItem();
while(item != NULL)
{
if( !item->isSelected() && item->contains(pos) )
{
(*nearestItem) = item;
posIsleftOfItem = pos.x() < item->x() + (item->width()/2);
return true;
}
item = item->nextItem();
}
//------------------------------------------------
//see if drop occurred below the last unselected photo
//find last unselected photo
item = lastItem();
while( item != NULL && item->isSelected() )
{ item = item->prevItem(); }
//is point below last unselected photo?
if( item != NULL && pos.y() > (item->y() + item->height()) )
{
(*nearestItem) = item;
posIsleftOfItem = false;
return true;
}
//------------------------------------------------
//see if drop occurred above the first unselected photo
//find first unselected photo
item = firstItem();
while( item != NULL && item->isSelected() )
{ item = item->nextItem(); }
//is point below last unselected photo?
if( item != NULL && pos.y() < item->y() )
{
(*nearestItem) = item;
posIsleftOfItem = true;
return true;
}
//------------------------------------------------
//next try checking within this row, walk left first
int x;
for(x = pos.x()-1; x>=0; x--)
{
item = findItem( QPoint(x, pos.y()) );
if( item == NULL || item->isSelected() ) continue;
else
{
(*nearestItem) = item;
posIsleftOfItem = false;
return true;
}
}
//walking left failed, try walking right
for(x = pos.x()+1; x<width(); x++)
{
item = findItem( QPoint(x, pos.y()) );
if( item == NULL || item->isSelected() ) continue;
else
{
(*nearestItem) = item;
posIsleftOfItem = true;
return true;
}
}
//------------------------------------------------
//ok, no unselected item is at this point, to the left, to the right, and the point
//is not above the first unselected photo or below the last unselected photo. the
//only way this is possible is if the point is between two rows of photos in the margin.
//while it's certain there are photos both above and below, it is possible
//either of the adjacent rows of photos only contain selected photos so searching
//a single row will not necessarily find the nearest photo.
//however, we are guaranteed to find an unselected photo both above and below
//this point, somewhere, so only searching up or down is necessary. we'll search
//up and the first unselected photo we find we'll use as the nearst. All selects
//photos must come after (aka to the right of) this photo.
int itemWidth = firstItem()->width();
int itemHeight = firstItem()->height();
int y;
for(y = pos.y()-(itemHeight/2); y >= 0; y-=(itemHeight/2) )
{
for(x = width(); x >= 0; x-=(itemWidth/2))
{
item = findItem( QPoint(x, y) );
if( item == NULL || item->isSelected() ) { continue; }
else
{
(*nearestItem) = item;
posIsleftOfItem = false;
return true;
}
}
}
//------------------------------------------------
//unable to find nearest unselected item
return false;
}
| void PhotosIconView::itemHasMoved | ( | ) | [signal] |
Referenced by contentsDropEvent().
| void PhotosIconView::keyPressEvent | ( | QKeyEvent * | e | ) | [protected] |
Definition at line 466 of file photosIconView.cpp.
References curPhotoDescEdit, editSelectedPhoto(), numSelected(), removeSelectedPhotos(), rotate270SelectedPhotos(), and rotate90SelectedPhotos().
{
//next handle additional keys
switch( e->key() )
{
//edit selected photo
case Qt::Key_Enter:
case Qt::Key_Return:
//only edit photo if one is selected
if(numSelected() == 1)
{
if( curPhotoDescEdit != NULL ) { delete curPhotoDescEdit; }
PhotoPreviewWidget* ppw = (PhotoPreviewWidget*)currentItem();
curPhotoDescEdit = new PhotoDescEdit( ppw, ((Window*)qApp->mainWidget())->getConfig()->getBool
( "layout", "animation" ) );
}
break;
//delete - remove selected photos
case Qt::Key_Delete:
if(numSelected() > 0) emit removeSelectedPhotos();
break;
//ctrl + r - rotate photo right
case Qt::Key_R:
if( e->state() & Qt::ControlButton && numSelected() > 0)
emit rotate90SelectedPhotos();
break;
//ctrl + l - rotate photo left
case Qt::Key_L:
if(e->state() & Qt::ControlButton && numSelected() > 0)
emit rotate270SelectedPhotos();
break;
//e - edit photo using editing interface
case Qt::Key_E:
if(e->state() & Qt::ControlButton && numSelected() >= 1) emit editSelectedPhoto();
break;
//allow base class to handle key event
default:
QIconView::keyPressEvent(e);
break;
}
}
| int PhotosIconView::numSelected | ( | ) |
Definition at line 300 of file photosIconView.cpp.
Referenced by keyPressEvent(), SubalbumWidget::rotate270ImageAction(), and SubalbumWidget::rotate90ImageAction().
{
int num = 0;
QIconViewItem* current = firstItem();
while(current != NULL)
{
if(current->isSelected())
num++;
current = current->nextItem();
}
return num;
}
| void PhotosIconView::removeSelectedPhotos | ( | ) | [signal] |
Referenced by keyPressEvent().
| void PhotosIconView::repaintGroup | ( | QIconViewItem * | pseudoSelection | ) | [slot] |
Definition at line 362 of file photosIconView.cpp.
References clearPseudoSelection(), currentPseudoSelection, and PhotoPreviewWidget::setMousedOver().
Referenced by PhotosIconView().
{
//if old pseudo selection unselect it
clearPseudoSelection();
//paint new selection
if(pseudoSelection != NULL)
{
currentPseudoSelection = (PhotoPreviewWidget*)pseudoSelection;
currentPseudoSelection->setMousedOver(true);
repaintItem(currentPseudoSelection);
}
}
| void PhotosIconView::rotate270SelectedPhotos | ( | ) | [signal] |
Referenced by keyPressEvent().
| void PhotosIconView::rotate90SelectedPhotos | ( | ) | [signal] |
Referenced by keyPressEvent().
| void PhotosIconView::setAlbumImage | ( | ) | [private, slot] |
Definition at line 330 of file photosIconView.cpp.
References PhotoPreviewWidget::getPhoto(), and rightClickedPhoto.
Referenced by contextMenuEvent().
{
((Window*)qApp->mainWidget())->getTitle()->setAlbumImage( rightClickedPhoto->getPhoto() );
rightClickedPhoto = NULL;
}
| void PhotosIconView::setSubalbumImage | ( | ) | [private, slot] |
Definition at line 336 of file photosIconView.cpp.
References PhotoPreviewWidget::getPhoto(), and rightClickedPhoto.
Referenced by contextMenuEvent().
{
((Window*)qApp->mainWidget())->getTitle()->setSubalbumImage( rightClickedPhoto->getPhoto() );
rightClickedPhoto = NULL;
}
QPixmap* PhotosIconView::backgroundImage [private] |
Definition at line 72 of file photosIconView.h.
Referenced by drawBackground(), and PhotosIconView().
QPixmap PhotosIconView::bufferPixmap [private] |
Definition at line 73 of file photosIconView.h.
Referenced by drawContents().
PhotoDescEdit* PhotosIconView::curPhotoDescEdit [private] |
Definition at line 79 of file photosIconView.h.
Referenced by captureClick(), keyPressEvent(), and PhotosIconView().
Definition at line 75 of file photosIconView.h.
Referenced by clearPseudoSelection(), contentsMouseMoveEvent(), PhotosIconView(), and repaintGroup().
QPixmap* PhotosIconView::dragIcon [private] |
Definition at line 74 of file photosIconView.h.
Referenced by dragObject(), and PhotosIconView().
QPoint PhotosIconView::dragStartPos [private] |
Definition at line 77 of file photosIconView.h.
Referenced by contentsMousePressEvent().
bool PhotosIconView::handCursorShown [private] |
Definition at line 76 of file photosIconView.h.
Referenced by contentsMouseMoveEvent(), and PhotosIconView().
Definition at line 71 of file photosIconView.h.
Referenced by contextMenuEvent(), PhotosIconView(), setAlbumImage(), and setSubalbumImage().
1.7.5.1