You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdevelop/buildtools/autotools/kfiledndiconview.cpp

195 lines
6.6 KiB

/***************************************************************************
* kfiledndiconview.cpp - description
* -------------------
* begin : Wed Nov 1 2000
* copyright : (C) 2000 by Bj<42>rn Sahlstr<74>m
* email : kbjorn@users.sourceforge.net
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
//////////////////////////////////////////////////////
// TQt specific includes
#include <tqptrlist.h>
#include <tqapplication.h>
//////////////////////////////////////////////////////
// KDE specific includes
#include <kfileitem.h>
#include <kiconloader.h>
#include <kdebug.h>
//////////////////////////////////////////////////////
// Application specific includes
#include "kfiledndiconview.h"
#ifndef AUTO_OPEN_TIME
#define AUTO_OPEN_TIME
static int autoOpenTime = 750;
#endif
//-----------------------------------------------
KFileDnDIconView::KFileDnDIconView( TQWidget *parent, const char *name )
: KFileIconView(parent,name), m_autoOpenTimer( this ),
m_autoOpenTime( autoOpenTime ), m_useAutoOpenTimer( true ),
m_dropItem(0), m_dndEnabled( true )
{
setDnDEnabled( true );
setAutoUpdate( true );
useAutoOpenTimer( true );
}
//-----------------------------------------------
KFileDnDIconView::~KFileDnDIconView(){
}
//-----------------------------------------------
void KFileDnDIconView::readConfig( KConfig* config, const TQString& group ) {
KConfigGroupSaver cs( config, group );
bool dnd = config->readBoolEntry("EnableDND", true );
setDnDEnabled( dnd );
KFileIconView::readConfig( config, group );
}
//-----------------------------------------------
void KFileDnDIconView::writeConfig( KConfig* config, const TQString& group ) {
KConfigGroupSaver cs( config, group );
config->writeEntry("EnableDND", m_dndEnabled );
KFileIconView::writeConfig( config, group );
}
//-----------------------------------------------
void KFileDnDIconView::slotOpenFolder(){
if( m_useAutoOpenTimer ) {
m_autoOpenTimer.stop();
if( !m_dropItem )
return;
}
KFileItemListIterator it( * KFileView::items() );
for( ; it.current() ;++it ){
if( (*it)->name() == m_dropItem->text() ) {
if( (*it)->isFile() )
return;
else if( (*it)->isDir() || (*it)->isLink()) {
sig->activate( (*it) );
return;
}
}
}
}
//-----------------------------------------------
void KFileDnDIconView::contentsDragEnterEvent( TQDragEnterEvent *e ) {
if ( ! acceptDrag( e ) ) { // can we decode this ?
e->accept( false ); // No
return;
}
e->acceptAction(); // Yes
TQIconViewItem *i = findItem( contentsToViewport( e->pos() ) );
if ( i && m_useAutoOpenTimer) { // are we over an item ?
m_dropItem = i; // set new m_dropItem
m_autoOpenTimer.start( m_autoOpenTime ); // restart timer
}
}
//-----------------------------------------------
void KFileDnDIconView::contentsDragMoveEvent( TQDragMoveEvent *e ) {
if ( ! acceptDrag( e ) ) { // can we decode this ?
e->accept( false ); // No
return;
}
e->acceptAction(); // Yes
TQIconViewItem *i = findItem( contentsToViewport( e->pos() ) );
if( ! m_useAutoOpenTimer )
return;
if ( i ) { // are we over an item ?
if ( i != m_dropItem ) { // if so, is it a new one ?
m_autoOpenTimer.stop(); // stop timer
m_dropItem = i; // set new m_dropItem
m_autoOpenTimer.start( m_autoOpenTime ); // restart timer
}
}
else
m_autoOpenTimer.stop(); // stop timer
}
//-----------------------------------------------
void KFileDnDIconView::contentsDragLeaveEvent( TQDragLeaveEvent* ) {
if( m_useAutoOpenTimer ) {
m_autoOpenTimer.stop();
m_dropItem = 0L;
}
}
//-----------------------------------------------
void KFileDnDIconView::contentsDropEvent( TQDropEvent* e ) {
if( m_useAutoOpenTimer ) {
m_autoOpenTimer.stop();
m_dropItem = 0L;
}
if( ! acceptDrag( e ) ) {
e->acceptAction( false );
return;
}
e->acceptAction();
// the drop was accepted so lets emit this
KURL::List urls;
KURLDrag::decode( e, urls );
emit dropped( e );
}
//-----------------------------------------------
void KFileDnDIconView::startDrag(){
if ( ! currentItem() ) // is there any selected items ?
return; // nope
dragObject()->dragCopy(); // start the drag
}
//-----------------------------------------------
TQDragObject* KFileDnDIconView::dragObject() {
// create a list of the URL:s that we want to drag
KURL::List urls;
KFileItemListIterator it( * KFileView::selectedItems() );
for ( ; it.current(); ++it ){
urls.append( (*it)->url() );
}
TQPixmap pixmap;
if( urls.count() > 1 )
pixmap = DesktopIcon( "kmultiple", iconSize() );
if( pixmap.isNull() )
pixmap = currentFileItem()->pixmap( iconSize() );
TQPoint hotspot;
hotspot.setX( pixmap.width() / 2 );
hotspot.setY( pixmap.height() / 2 );
TQDragObject* myDragObject = KURLDrag::newDrag( urls, widget() );
myDragObject->setPixmap( pixmap, hotspot );
return myDragObject;
}
//-----------------------------------------------
void KFileDnDIconView::setAutoOpenTime( const int& time ){
m_autoOpenTime = time;
useAutoOpenTimer();
}
//-----------------------------------------------
void KFileDnDIconView::useAutoOpenTimer( bool use ){
m_useAutoOpenTimer = use;
if ( use )
connect( &m_autoOpenTimer, TQT_SIGNAL( timeout() ),this, TQT_SLOT( slotOpenFolder() ) );
else {
disconnect( &m_autoOpenTimer, TQT_SIGNAL( timeout() ),this, TQT_SLOT( slotOpenFolder() ) );
m_dropItem = 0L;
m_autoOpenTimer.stop();
}
}
//-----------------------------------------------
void KFileDnDIconView::setDnDEnabled( bool useDnD ){
m_dndEnabled = useDnD;
setAcceptDrops( useDnD );
viewport()->setAcceptDrops( useDnD );
}
//-----------------------------------------------
bool KFileDnDIconView::acceptDrag(TQDropEvent* e ) const {
return KURLDrag::canDecode( e ) &&
( e->action() == TQDropEvent::Copy
|| e->action() == TQDropEvent::Move
|| e->action() == TQDropEvent::Link );
}
//-----------------------------------------------
#ifndef NO_INCLUDE_MOCFILES
#include "kfiledndiconview.moc"
#endif