Source Code (Use browser search to find items of interest.)
Class Index
qt'QFileListView (./qt-2.1.0/src/dialogs/qfiledialog.cpp:597)
class QFileListView : public QListView
{
friend class QFileDialog;
Q_OBJECT
private:
QFileListView( QWidget *parent, QFileDialog *d );
void clear();
void startRename( bool check = TRUE );
void setSorting( int column, bool increasing = TRUE );
private:
void viewportMousePressEvent( QMouseEvent *e );
void viewportMouseDoubleClickEvent( QMouseEvent *e );
void keyPressEvent( QKeyEvent *e );
void viewportMouseReleaseEvent( QMouseEvent *e );
void viewportMouseMoveEvent( QMouseEvent *e );
void viewportDragEnterEvent( QDragEnterEvent *e );
void viewportDragMoveEvent( QDragMoveEvent *e );
void viewportDragLeaveEvent( QDragLeaveEvent *e );
void viewportDropEvent( QDropEvent *e );
bool acceptDrop( const QPoint &pnt, QWidget *source );
void setCurrentDropItem( const QPoint &pnt );
private slots:
void rename();
void cancelRename();
void changeSortColumn2( int column );
void doubleClickTimeout();
void changeDirDuringDrag();
void dragObjDestroyed();
void contentsMoved( int, int );
private:
QRenameEdit *lined;
QFileDialog *filedialog;
bool renaming;
QTimer* renameTimer;
QListViewItem *renameItem;
QPoint pressPos, oldDragPos;
bool mousePressed;
int urls;
QString startDragDir;
QListViewItem *currDropItem, *dragItem;
QTimer *changeDirTimer;
bool firstMousePressEvent;
bool ascending;
int sortcolumn;
QUrlOperator startDragUrl;
};
/****************************************************************************
*
* Classes for copy progress dialog
*
****************************************************************************/
qt'QFileListView::QFileListView() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1334)
QFileListView::QFileListView( QWidget *parent, QFileDialog *dlg )
: QListView( parent ), filedialog( dlg ), renaming( FALSE ),
renameItem( 0 ), mousePressed( FALSE ),
firstMousePressEvent( TRUE )
{
changeDirTimer = new QTimer( this );
QVBox *box = new QVBox( viewport() );
box->setFrameStyle( QFrame::Box | QFrame::Plain );
lined = new QRenameEdit( box );
lined->setFixedHeight( lined->sizeHint().height() );
box->hide();
box->setBackgroundMode( PaletteBase );
renameTimer = new QTimer( this );
connect( lined, SIGNAL( returnPressed() ),
this, SLOT (rename() ) );
connect( lined, SIGNAL( escapePressed() ),
this, SLOT( cancelRename() ) );
header()->setMovingEnabled( FALSE );
connect( renameTimer, SIGNAL( timeout() ),
this, SLOT( doubleClickTimeout() ) );
connect( changeDirTimer, SIGNAL( timeout() ),
this, SLOT( changeDirDuringDrag() ) );
disconnect( header(), SIGNAL( sectionClicked( int ) ),
this, SLOT( changeSortColumn( int ) ) );
connect( header(), SIGNAL( sectionClicked( int ) ),
this, SLOT( changeSortColumn2( int ) ) );
connect( this, SIGNAL( contentsMoving( int, int ) ),
this, SLOT( contentsMoved( int, int ) ) );
viewport()->setAcceptDrops( TRUE );
sortcolumn = 0;
ascending = TRUE;
dragItem = 0;
}
qt'QFileListView::setSorting() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1369)
void QFileListView::setSorting( int column, bool increasing )
{
if ( column == -1 ) {
QListView::setSorting( column, increasing );
return;
}
sortAscending = ascending = increasing;
sortcolumn = column;
switch ( column ) {
case 0:
sortFilesBy = QDir::Name;
break;
case 1:
sortFilesBy = QDir::Size;
break;
case 3:
sortFilesBy = QDir::Time;
break;
default:
sortFilesBy = QDir::Name; // #### ???
break;
}
filedialog->resortDir();
}
qt'QFileListView::changeSortColumn2() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1396)
void QFileListView::changeSortColumn2( int column )
{
int lcol = header()->mapToLogical( column );
setSorting( lcol, sortcolumn == lcol ? !ascending : TRUE );
}
qt'QFileListView::keyPressEvent() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1402)
void QFileListView::keyPressEvent( QKeyEvent *e )
{
if ( ( e->key() == Key_Enter ||
e->key() == Key_Return ) &&
renaming )
return;
cancelRename();
QListView::keyPressEvent( e );
}
qt'QFileListView::viewportMousePressEvent() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1413)
void QFileListView::viewportMousePressEvent( QMouseEvent *e )
{
pressPos = e->pos();
mousePressed = FALSE;
bool didRename = renaming;
cancelRename();
if ( !hasFocus() && !viewport()->hasFocus() )
setFocus();
if ( e->button() != LeftButton ) {
QListView::viewportMousePressEvent( e );
firstMousePressEvent = FALSE;
return;
}
QListViewItem *i = currentItem();
QListView::viewportMousePressEvent( e );
QFileDialogPrivate::File *i1 = (QFileDialogPrivate::File*)currentItem();
if ( i1 )
mousePressed = !i1->info.isDir();
if ( itemAt( e->pos() ) != i ||
e->x() + contentsX() > columnWidth( 0 ) ) {
firstMousePressEvent = FALSE;
return;
}
if ( !firstMousePressEvent && !didRename && i == currentItem() && currentItem() &&
filedialog->mode() != QFileDialog::ExistingFiles &&
QUrlInfo( filedialog->d->url, "." ).isWritable() && currentItem()->text( 0 ) != ".." ) {
renameTimer->start( QApplication::doubleClickInterval(), TRUE );
renameItem = currentItem();
}
firstMousePressEvent = FALSE;
}
qt'QFileListView::viewportMouseDoubleClickEvent() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1452)
void QFileListView::viewportMouseDoubleClickEvent( QMouseEvent *e )
{
renameTimer->stop();
QListView::viewportMouseDoubleClickEvent( e );
}
qt'QFileListView::viewportMouseReleaseEvent() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1458)
void QFileListView::viewportMouseReleaseEvent( QMouseEvent *e )
{
QListView::viewportMouseReleaseEvent( e );
mousePressed = FALSE;
dragItem = 0;
}
qt'QFileListView::viewportMouseMoveEvent() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1465)
void QFileListView::viewportMouseMoveEvent( QMouseEvent *e )
{
renameTimer->stop();
if ( !dragItem )
dragItem = itemAt( e->pos() );
if ( ( pressPos - e->pos() ).manhattanLength() > QApplication::startDragDistance() && mousePressed ) {
QListViewItem *item = dragItem;
dragItem = 0;
if ( item ) {
QUriDrag* drag = new QUriDrag( viewport() );
drag->setUnicodeUris( filedialog->selectedFiles() );
if ( lined->isVisible() )
cancelRename();
connect( drag, SIGNAL( destroyed() ),
this, SLOT( dragObjDestroyed() ) );
drag->drag();
mousePressed = FALSE;
}
}
}
qt'QFileListView::dragObjDestroyed() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1490)
void QFileListView::dragObjDestroyed()
{
//######
//filedialog->rereadDir();
}
qt'QFileListView::viewportDragEnterEvent() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1496)
void QFileListView::viewportDragEnterEvent( QDragEnterEvent *e )
{
startDragUrl = filedialog->d->url;
startDragDir = filedialog->dirPath();
currDropItem = 0;
if ( !QUriDrag::canDecode( e ) ) {
e->ignore();
return;
}
QStringList l;
QUriDrag::decodeLocalFiles( e, l );
urls = l.count();
if ( acceptDrop( e->pos(), e->source() ) ) {
e->accept();
setCurrentDropItem( e->pos() );
} else {
e->ignore();
setCurrentDropItem( QPoint( -1, -1 ) );
}
oldDragPos = e->pos();
}
qt'QFileListView::viewportDragMoveEvent() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1522)
void QFileListView::viewportDragMoveEvent( QDragMoveEvent *e )
{
if ( acceptDrop( e->pos(), e->source() ) ) {
if ( oldDragPos != e->pos() )
setCurrentDropItem( e->pos() );
switch ( e->action() ) {
case QDropEvent::Copy:
e->acceptAction();
break;
case QDropEvent::Move:
e->acceptAction();
break;
case QDropEvent::Link:
break;
default:
;
}
} else {
changeDirTimer->stop();
e->ignore();
setCurrentDropItem( QPoint( -1, -1 ) );
}
oldDragPos = e->pos();
}
qt'QFileListView::viewportDragLeaveEvent() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1548)
void QFileListView::viewportDragLeaveEvent( QDragLeaveEvent * )
{
changeDirTimer->stop();
setCurrentDropItem( QPoint( -1, -1 ) );
//########
// if ( startDragDir != filedialog->d->url )
// filedialog->setUrl( startDragUrl );
}
qt'QFileListView::viewportDropEvent() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1557)
void QFileListView::viewportDropEvent( QDropEvent *e )
{
changeDirTimer->stop();
if ( !QUriDrag::canDecode( e ) ) {
e->ignore();
return;
}
QStringList l;
QUrlDrag::decodeToUnicodeUris( e, l );
bool move = FALSE;
bool supportAction = TRUE;
if ( e->action() == QDropEvent::Move )
move = TRUE;
else if ( e->action() == QDropEvent::Copy )
;
else
supportAction = FALSE;
QUrlOperator dest;
if ( currDropItem )
dest = QUrlOperator( filedialog->d->url, currDropItem->text( 0 ) );
else
dest = filedialog->d->url;
filedialog->d->url.copy( l, dest, move );
// ##### what is supportAction for?
e->acceptAction();
currDropItem = 0;
}
qt'QFileListView::acceptDrop() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1590)
bool QFileListView::acceptDrop( const QPoint &pnt, QWidget *source )
{
QListViewItem *item = itemAt( pnt );
if ( !item || item && !itemRect( item ).contains( pnt ) ) {
if ( source == viewport() && startDragDir == filedialog->dirPath() )
return FALSE;
return TRUE;
}
QUrlInfo fi( filedialog->d->url, item->text( 0 ) );
if ( fi.isDir() && itemRect( item ).contains( pnt ) )
return TRUE;
return FALSE;
}
qt'QFileListView::setCurrentDropItem() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1606)
void QFileListView::setCurrentDropItem( const QPoint &pnt )
{
changeDirTimer->stop();
QListViewItem *item = itemAt( pnt );
if ( pnt == QPoint( -1, -1 ) )
item = 0;
if ( item && !QUrlInfo( filedialog->d->url, item->text( 0 ) ).isDir() )
item = 0;
if ( item && !itemRect( item ).contains( pnt ) )
item = 0;
currDropItem = item;
if ( currDropItem )
setCurrentItem( currDropItem );
changeDirTimer->start( 750 );
}
qt'QFileListView::changeDirDuringDrag() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1627)
void QFileListView::changeDirDuringDrag()
{
if ( !currDropItem )
return;
changeDirTimer->stop();
QUrl u( filedialog->d->url, currDropItem->text( 0 ) );
filedialog->setDir( u );
currDropItem = 0;
}
qt'QFileListView::doubleClickTimeout() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1637)
void QFileListView::doubleClickTimeout()
{
startRename();
renameTimer->stop();
}
qt'QFileListView::startRename() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1643)
void QFileListView::startRename( bool check )
{
if ( check && ( !renameItem || renameItem != currentItem() ) )
return;
QListViewItem *i = currentItem();
setSelected( i, TRUE );
QRect r = itemRect( i );
int bdr = i->pixmap( 0 ) ?
i->pixmap( 0 )->width() : 16;
int x = r.x() + bdr;
int y = r.y();
int w = columnWidth( 0 ) - bdr;
int h = QMAX( lined->height() + 2, r.height() );
y = y + r.height() / 2 - h / 2;
lined->parentWidget()->setGeometry( x, y, w + 6, h );
lined->setFocus();
lined->setText( i->text( 0 ) );
lined->selectAll();
lined->setFrame( FALSE );
lined->parentWidget()->show();
viewport()->setFocusProxy( lined );
renaming = TRUE;
}
qt'QFileListView::clear() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1670)
void QFileListView::clear()
{
cancelRename();
QListView::clear();
}
qt'QFileListView::rename() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1676)
void QFileListView::rename()
{
if ( !lined->text().isEmpty() ) {
QString file = currentItem()->text( 0 );
if ( lined->text() != file )
filedialog->d->url.rename( file, lined->text() );
}
cancelRename();
}
qt'QFileListView::cancelRename() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1687)
void QFileListView::cancelRename()
{
renameItem = 0;
lined->parentWidget()->hide();
viewport()->setFocusProxy( this );
renaming = FALSE;
if ( currentItem() )
currentItem()->repaint();
if ( lined->hasFocus() )
viewport()->setFocus();
}
qt'QFileListView::contentsMoved() (./qt-2.1.0/src/dialogs/qfiledialog.cpp:1699)
void QFileListView::contentsMoved( int, int )
{
changeDirTimer->stop();
setCurrentDropItem( QPoint( -1, -1 ) );
}
QFileDialogPrivate::File::~File()
{
if ( d->pendingItems.findRef( this ) )
d->pendingItems.removeRef( this );
}
QString QFileDialogPrivate::File::text( int column ) const
{
makeVariables();
switch( column ) {
case 0:
return info.name();
case 1:
if ( info.isFile() )
return QString::number(info.size());
else
return QString::fromLatin1("");
case 2:
if ( info.isFile() && info.isSymLink() ) {
return d->symLinkToFile;
} else if ( info.isFile() ) {
return d->file;
} else if ( info.isDir() && info.isSymLink() ) {
return d->symLinkToDir;
} else if ( info.isDir() ) {
return d->dir;
} else if ( info.isSymLink() ) {
return d->symLinkToSpecial;
} else {
return d->special;
}
case 3: {
QDateTime epoch;
epoch.setTime_t( 0 );
char a[256];
time_t t1 = epoch.secsTo( info.lastModified() );
struct tm * t2 = ::localtime( &t1 );
// looks wrong for the last hour of the day...
if ( t2 && t2->tm_hour != info.lastModified().time().hour() )
t2->tm_hour = info.lastModified().time().hour();
// use a static const char here, so that egcs will not see
// the formatting string and give an incorrect warning.
if ( t2 && strftime( a, 255, egcsWorkaround, t2 ) > 0 )
return QString::fromLatin1(a);
else
return QString::fromLatin1("????");
}
case 4:
if ( info.isReadable() )
return info.isWritable() ? d->rw : d->ro;
else
return info.isWritable() ? d->wo : d->inaccessible;
}
return QString::fromLatin1("<--->");
}
const QPixmap * QFileDialogPrivate::File::pixmap( int column ) const
{
if ( column ) {
return 0;
} else if ( QListViewItem::pixmap( column ) ) {
return QListViewItem::pixmap( column );
} else if ( info.isSymLink() ) {
if ( info.isFile() )
return symLinkFileIcon;
else
return symLinkDirIcon;
} else if ( info.isDir() ) {
return closedFolderIcon;
} else if ( info.isFile() ) {
return fileIcon;
} else {
return fifteenTransparentPixels;
}
}
QFileDialogPrivate::MCItem::MCItem( QListBox * lb, QListViewItem * item )
: QListBoxItem()
{
i = item;
if ( lb )
lb->insertItem( this );
}
QFileDialogPrivate::MCItem::MCItem( QListBox * lb, QListViewItem * item, QListBoxItem *after )
: QListBoxItem()
{
i = item;
if ( lb )
lb->insertItem( this, after );
}
QString QFileDialogPrivate::MCItem::text() const
{
return i->text( 0 );
}
const QPixmap *QFileDialogPrivate::MCItem::pixmap() const
{
return i->pixmap( 0 );
}
int QFileDialogPrivate::MCItem::height( const QListBox * lb ) const
{
if ( pixmap() )
return QMAX( lb->fontMetrics().height(), pixmap()->height()) + 2;
return lb->fontMetrics().height() + 2;
}
int QFileDialogPrivate::MCItem::width( const QListBox * lb ) const
{
QFontMetrics fm = lb->fontMetrics();
int w = 2;
if ( pixmap() )
w += pixmap()->width() + 4;
else
w += 18;
w += fm.width( text() );
w += -fm.minLeftBearing();
w += -fm.minRightBearing();
w += 6;
return w;
}
void QFileDialogPrivate::MCItem::paint( QPainter * ptr )
{
QFontMetrics fm = ptr->fontMetrics();
int h;
if ( pixmap() )
h = QMAX( fm.height(), pixmap()->height()) + 2;
else
h = fm.height() + 2;
const QPixmap * pm = pixmap();
if ( pm )
ptr->drawPixmap( 2, 1, *pm );
ptr->drawText( pm ? pm->width() + 4 : 22, h - fm.descent() - 2,
text() );
}