kfiledndiconview.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00019
00020 #include <qptrlist.h>
00021 #include <qapplication.h>
00023
00024 #include <kfileitem.h>
00025 #include <kiconloader.h>
00026 #include <kdebug.h>
00028
00029 #include "kfiledndiconview.h"
00030
00031 #ifndef AUTO_OPEN_TIME
00032 #define AUTO_OPEN_TIME
00033 static int autoOpenTime = 750;
00034 #endif
00035
00036 KFileDnDIconView::KFileDnDIconView( QWidget *parent, const char *name )
00037 : KFileIconView(parent,name), m_autoOpenTimer( this ),
00038 m_autoOpenTime( autoOpenTime ), m_useAutoOpenTimer( true ),
00039 m_dropItem(0), m_dndEnabled( true )
00040 {
00041 setDnDEnabled( true );
00042 setAutoUpdate( true );
00043 useAutoOpenTimer( true );
00044 }
00045
00046 KFileDnDIconView::~KFileDnDIconView(){
00047 }
00048
00049 void KFileDnDIconView::readConfig( KConfig* config, const QString& group ) {
00050 KConfigGroupSaver cs( config, group );
00051 bool dnd = config->readBoolEntry("EnableDND", true );
00052 setDnDEnabled( dnd );
00053 KFileIconView::readConfig( config, group );
00054 }
00055
00056 void KFileDnDIconView::writeConfig( KConfig* config, const QString& group ) {
00057 KConfigGroupSaver cs( config, group );
00058 config->writeEntry("EnableDND", m_dndEnabled );
00059 KFileIconView::writeConfig( config, group );
00060 }
00061
00062 void KFileDnDIconView::slotOpenFolder(){
00063 if( m_useAutoOpenTimer ) {
00064 m_autoOpenTimer.stop();
00065 if( !m_dropItem )
00066 return;
00067 }
00068 KFileItemListIterator it( * KFileView::items() );
00069 for( ; it.current() ;++it ){
00070 if( (*it)->name() == m_dropItem->text() ) {
00071 if( (*it)->isFile() )
00072 return;
00073 else if( (*it)->isDir() || (*it)->isLink()) {
00074 sig->activate( (*it) );
00075 return;
00076 }
00077 }
00078 }
00079 }
00080
00081 void KFileDnDIconView::contentsDragEnterEvent( QDragEnterEvent *e ) {
00082 if ( ! acceptDrag( e ) ) {
00083 e->accept( false );
00084 return;
00085 }
00086 e->acceptAction();
00087 QIconViewItem *i = findItem( contentsToViewport( e->pos() ) );
00088 if ( i && m_useAutoOpenTimer) {
00089 m_dropItem = i;
00090 m_autoOpenTimer.start( m_autoOpenTime );
00091 }
00092 }
00093
00094 void KFileDnDIconView::contentsDragMoveEvent( QDragMoveEvent *e ) {
00095 if ( ! acceptDrag( e ) ) {
00096 e->accept( false );
00097 return;
00098 }
00099 e->acceptAction();
00100 QIconViewItem *i = findItem( contentsToViewport( e->pos() ) );
00101 if( ! m_useAutoOpenTimer )
00102 return;
00103 if ( i ) {
00104 if ( i != m_dropItem ) {
00105 m_autoOpenTimer.stop();
00106 m_dropItem = i;
00107 m_autoOpenTimer.start( m_autoOpenTime );
00108 }
00109 }
00110 else
00111 m_autoOpenTimer.stop();
00112 }
00113
00114 void KFileDnDIconView::contentsDragLeaveEvent( QDragLeaveEvent* ) {
00115 if( m_useAutoOpenTimer ) {
00116 m_autoOpenTimer.stop();
00117 m_dropItem = 0L;
00118 }
00119 }
00120
00121 void KFileDnDIconView::contentsDropEvent( QDropEvent* e ) {
00122 if( m_useAutoOpenTimer ) {
00123 m_autoOpenTimer.stop();
00124 m_dropItem = 0L;
00125 }
00126 if( ! acceptDrag( e ) ) {
00127 e->acceptAction( false );
00128 return;
00129 }
00130 e->acceptAction();
00131
00132 KURL::List urls;
00133 KURLDrag::decode( e, urls );
00134 emit dropped( e );
00135 }
00136
00137 void KFileDnDIconView::startDrag(){
00138 if ( ! currentItem() )
00139 return;
00140 dragObject()->dragCopy();
00141 }
00142
00143 QDragObject* KFileDnDIconView::dragObject() {
00144
00145 KURL::List urls;
00146 KFileItemListIterator it( * KFileView::selectedItems() );
00147 for ( ; it.current(); ++it ){
00148 urls.append( (*it)->url() );
00149 }
00150 QPixmap pixmap;
00151 if( urls.count() > 1 )
00152 pixmap = DesktopIcon( "kmultiple", iconSize() );
00153 if( pixmap.isNull() )
00154 pixmap = currentFileItem()->pixmap( iconSize() );
00155 QPoint hotspot;
00156 hotspot.setX( pixmap.width() / 2 );
00157 hotspot.setY( pixmap.height() / 2 );
00158 QDragObject* myDragObject = KURLDrag::newDrag( urls, widget() );
00159 myDragObject->setPixmap( pixmap, hotspot );
00160 return myDragObject;
00161 }
00162
00163 void KFileDnDIconView::setAutoOpenTime( const int& time ){
00164 m_autoOpenTime = time;
00165 useAutoOpenTimer();
00166 }
00167
00168 void KFileDnDIconView::useAutoOpenTimer( bool use ){
00169 m_useAutoOpenTimer = use;
00170 if ( use )
00171 connect( &m_autoOpenTimer, SIGNAL( timeout() ),this, SLOT( slotOpenFolder() ) );
00172 else {
00173 disconnect( &m_autoOpenTimer, SIGNAL( timeout() ),this, SLOT( slotOpenFolder() ) );
00174 m_dropItem = 0L;
00175 m_autoOpenTimer.stop();
00176 }
00177 }
00178
00179 void KFileDnDIconView::setDnDEnabled( bool useDnD ){
00180 m_dndEnabled = useDnD;
00181 setAcceptDrops( useDnD );
00182 viewport()->setAcceptDrops( useDnD );
00183 }
00184
00185 bool KFileDnDIconView::acceptDrag(QDropEvent* e ) const {
00186 return KURLDrag::canDecode( e ) &&
00187 ( e->action() == QDropEvent::Copy
00188 || e->action() == QDropEvent::Move
00189 || e->action() == QDropEvent::Link );
00190 }
00191
00192 #ifndef NO_INCLUDE_MOCFILES
00193 #include "kfiledndiconview.moc"
00194 #endif
This file is part of the documentation for KDevelop Version 3.1.2.