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