Fix various dirlister sidebar problems

This resolves Bug 1764
pull/2/head
Timothy Pearson 11 years ago
parent cf8c83d7cd
commit ec12f4850a

@ -261,7 +261,7 @@ int KonqLogoAction::plug( TQWidget *widget, int index )
int id_ = getToolButtonID(); int id_ = getToolButtonID();
bar->insertAnimatedWidget( id_, this, TQT_SIGNAL(activated()), TQString("kde"), index ); bar->insertAnimatedWidget( id_, this, TQT_SIGNAL(activated()), TQString("trinity"), index );
bar->alignItemRight( id_ ); bar->alignItemRight( id_ );
addContainer( bar, id_ ); addContainer( bar, id_ );

@ -124,7 +124,7 @@ void KonqListViewItem::updateContents()
setText(tmpColumn->displayInColumn,TDEIO::convertSize(m_fileitem->size())+" "); setText(tmpColumn->displayInColumn,TDEIO::convertSize(m_fileitem->size())+" ");
break; break;
case TDEIO::UDS_ACCESS: case TDEIO::UDS_ACCESS:
setText(tmpColumn->displayInColumn,m_fileitem->permissionsString()); setText(tmpColumn->displayInColumn,m_fileitem->permissionsString());
break; break;
case TDEIO::UDS_MODIFICATION_TIME: case TDEIO::UDS_MODIFICATION_TIME:
case TDEIO::UDS_ACCESS_TIME: case TDEIO::UDS_ACCESS_TIME:

Before

Width:  |  Height:  |  Size: 880 B

After

Width:  |  Height:  |  Size: 880 B

Before

Width:  |  Height:  |  Size: 867 B

After

Width:  |  Height:  |  Size: 867 B

Before

Width:  |  Height:  |  Size: 880 B

After

Width:  |  Height:  |  Size: 880 B

Before

Width:  |  Height:  |  Size: 867 B

After

Width:  |  Height:  |  Size: 867 B

Before

Width:  |  Height:  |  Size: 880 B

After

Width:  |  Height:  |  Size: 880 B

Before

Width:  |  Height:  |  Size: 867 B

After

Width:  |  Height:  |  Size: 867 B

@ -28,7 +28,6 @@
#include <kdirlister.h> #include <kdirlister.h>
#include "konqsidebariface_p.h" #include "konqsidebariface_p.h"
KonqSidebarDirTreeModule::KonqSidebarDirTreeModule( KonqSidebarTree * parentTree , bool showHidden) KonqSidebarDirTreeModule::KonqSidebarDirTreeModule( KonqSidebarTree * parentTree , bool showHidden)
: KonqSidebarTreeModule( parentTree, showHidden ), m_dirLister(0L), m_topLevelItem(0L) : KonqSidebarTreeModule( parentTree, showHidden ), m_dirLister(0L), m_topLevelItem(0L)
{ {
@ -136,10 +135,11 @@ void KonqSidebarDirTreeModule::addSubDir( KonqSidebarTreeItem *item )
TQString id = item->externalURL().url(-1); TQString id = item->externalURL().url(-1);
kdDebug(1201) << this << " KonqSidebarDirTreeModule::addSubDir " << id << endl; kdDebug(1201) << this << " KonqSidebarDirTreeModule::addSubDir " << id << endl;
m_dictSubDirs.insert(id, item ); m_dictSubDirs.insert(id, item );
KonqSidebarDirTreeItem *ditem = dynamic_cast<KonqSidebarDirTreeItem*>(item); KonqSidebarDirTreeItem *ditem = dynamic_cast<KonqSidebarDirTreeItem*>(item);
if (ditem) if (ditem) {
m_ptrdictSubDirs.insert(ditem->fileItem(), item); m_ptrdictSubDirs.insert(ditem->fileItem(), item);
}
} }
// Remove <key, item> from dict, taking into account that there maybe // Remove <key, item> from dict, taking into account that there maybe
@ -147,15 +147,15 @@ void KonqSidebarDirTreeModule::addSubDir( KonqSidebarTreeItem *item )
static void remove(TQDict<KonqSidebarTreeItem> &dict, const TQString &key, KonqSidebarTreeItem *item) static void remove(TQDict<KonqSidebarTreeItem> &dict, const TQString &key, KonqSidebarTreeItem *item)
{ {
TQPtrList<KonqSidebarTreeItem> *otherItems = 0; TQPtrList<KonqSidebarTreeItem> *otherItems = 0;
while(true) { while (true) {
KonqSidebarTreeItem *takeItem = dict.take(key); KonqSidebarTreeItem *takeItem = dict.take(key);
if (!takeItem || (takeItem == item)) if (!takeItem || (takeItem == item)) {
{ if (!otherItems) {
if (!otherItems)
return; return;
}
// Insert the otherItems back in // Insert the otherItems back in
for(KonqSidebarTreeItem *otherItem; (otherItem = otherItems->take(0));) for (KonqSidebarTreeItem *otherItem; (otherItem = otherItems->take(0));)
{ {
dict.insert(key, otherItem); dict.insert(key, otherItem);
} }
@ -163,8 +163,9 @@ static void remove(TQDict<KonqSidebarTreeItem> &dict, const TQString &key, KonqS
return; return;
} }
// Not the item we are looking for // Not the item we are looking for
if (!otherItems) if (!otherItems) {
otherItems = new TQPtrList<KonqSidebarTreeItem>(); otherItems = new TQPtrList<KonqSidebarTreeItem>();
}
otherItems->prepend(takeItem); otherItems->prepend(takeItem);
} }
@ -177,27 +178,25 @@ static void lookupItems(TQDict<KonqSidebarTreeItem> &dict, const TQString &key,
{ {
itemList = 0; itemList = 0;
item = dict.take(key); item = dict.take(key);
if (!item) if (!item) {
return; return;
}
while(true) while (true) {
{
KonqSidebarTreeItem *takeItem = dict.take(key); KonqSidebarTreeItem *takeItem = dict.take(key);
if (!takeItem) if (!takeItem) {
{
//
// Insert itemList back in // Insert itemList back in
if (itemList) if (itemList) {
{ for (KonqSidebarTreeItem *otherItem = itemList->first(); otherItem; otherItem = itemList->next()) {
for(KonqSidebarTreeItem *otherItem = itemList->first(); otherItem; otherItem = itemList->next())
dict.insert(key, otherItem); dict.insert(key, otherItem);
}
} }
dict.insert(key, item); dict.insert(key, item);
return; return;
} }
if (!itemList) if (!itemList) {
itemList = new TQPtrList<KonqSidebarTreeItem>(); itemList = new TQPtrList<KonqSidebarTreeItem>();
}
itemList->prepend(takeItem); itemList->prepend(takeItem);
} }
} }
@ -207,19 +206,18 @@ static void lookupItems(TQDict<KonqSidebarTreeItem> &dict, const TQString &key,
static void remove(TQPtrDict<KonqSidebarTreeItem> &dict, void *key, KonqSidebarTreeItem *item) static void remove(TQPtrDict<KonqSidebarTreeItem> &dict, void *key, KonqSidebarTreeItem *item)
{ {
TQPtrList<KonqSidebarTreeItem> *otherItems = 0; TQPtrList<KonqSidebarTreeItem> *otherItems = 0;
while(true) { while (true) {
KonqSidebarTreeItem *takeItem = dict.take(key); KonqSidebarTreeItem *takeItem = dict.take(key);
if (!takeItem || (takeItem == item)) if (!takeItem || (takeItem == item)) {
{ if (!otherItems) {
if (!otherItems)
return; return;
}
// Insert the otherItems back in // Insert the otherItems back in
for(KonqSidebarTreeItem *otherItem; (otherItem = otherItems->take(0));) for (KonqSidebarTreeItem *otherItem; (otherItem = otherItems->take(0));) {
{
dict.insert(key, otherItem); dict.insert(key, otherItem);
} }
delete otherItems; delete otherItems;
return; return;
} }
// Not the item we are looking for // Not the item we are looking for
@ -237,27 +235,25 @@ static void lookupItems(TQPtrDict<KonqSidebarTreeItem> &dict, void *key, KonqSid
{ {
itemList = 0; itemList = 0;
item = dict.take(key); item = dict.take(key);
if (!item) if (!item) {
return; return;
}
while(true)
{ while(true) {
KonqSidebarTreeItem *takeItem = dict.take(key); KonqSidebarTreeItem *takeItem = dict.take(key);
if (!takeItem) if (!takeItem) {
{
//
// Insert itemList back in // Insert itemList back in
if (itemList) if (itemList) {
{ for(KonqSidebarTreeItem *otherItem = itemList->first(); otherItem; otherItem = itemList->next()) {
for(KonqSidebarTreeItem *otherItem = itemList->first(); otherItem; otherItem = itemList->next())
dict.insert(key, otherItem); dict.insert(key, otherItem);
}
} }
dict.insert(key, item); dict.insert(key, item);
return; return;
} }
if (!itemList) if (!itemList) {
itemList = new TQPtrList<KonqSidebarTreeItem>(); itemList = new TQPtrList<KonqSidebarTreeItem>();
}
itemList->prepend(takeItem); itemList->prepend(takeItem);
} }
} }
@ -327,7 +323,7 @@ void KonqSidebarDirTreeModule::openSubFolder( KonqSidebarTreeItem *item )
{ {
int size = TDEGlobal::iconLoader()->currentSize( TDEIcon::Small ); int size = TDEGlobal::iconLoader()->currentSize( TDEIcon::Small );
TQPixmap pix = DesktopIcon( "folder_open", size ); TQPixmap pix = DesktopIcon( "folder_open", size );
m_pTree->startAnimation( item, "kde", 6, &pix ); m_pTree->startAnimation( item, "trinity", 6, &pix );
} }
else else
m_pTree->startAnimation( item ); m_pTree->startAnimation( item );
@ -345,24 +341,21 @@ void KonqSidebarDirTreeModule::listDirectory( KonqSidebarTreeItem *item )
KonqSidebarTreeItem * openItem; KonqSidebarTreeItem * openItem;
lookupItems(m_dictSubDirs, strUrl, openItem, itemList); lookupItems(m_dictSubDirs, strUrl, openItem, itemList);
while(openItem) while (openItem) {
{ if (openItem->childCount()) {
if (openItem->childCount())
break; break;
}
openItem = itemList ? itemList->take(0) : 0; openItem = itemList ? itemList->take(0) : 0;
} }
delete itemList; delete itemList;
if (openItem) if (openItem) {
{
// We have this directory listed already, just copy the entries as we // We have this directory listed already, just copy the entries as we
// can't use the dirlister, it would invalidate the old entries // can't use the dirlister, it would invalidate the old entries
int size = TDEGlobal::iconLoader()->currentSize( TDEIcon::Small ); int size = TDEGlobal::iconLoader()->currentSize( TDEIcon::Small );
KonqSidebarTreeItem * parentItem = item; KonqSidebarTreeItem * parentItem = item;
KonqSidebarDirTreeItem *oldItem = static_cast<KonqSidebarDirTreeItem *> (openItem->firstChild()); KonqSidebarDirTreeItem *oldItem = static_cast<KonqSidebarDirTreeItem *> (openItem->firstChild());
while(oldItem) while (oldItem) {
{
KFileItem * fileItem = oldItem->fileItem(); KFileItem * fileItem = oldItem->fileItem();
if (! fileItem->isDir() ) if (! fileItem->isDir() )
{ {
@ -386,12 +379,16 @@ void KonqSidebarDirTreeModule::listDirectory( KonqSidebarTreeItem *item )
return; return;
} }
m_dirLister->setShowingDotFiles( showHidden()); m_dirLister->setShowingDotFiles( showHidden());
if (tree()->isOpeningFirstChild()) m_dirLister->setAutoErrorHandlingEnabled(false,0); if (tree()->isOpeningFirstChild()) {
else m_dirLister->setAutoErrorHandlingEnabled(true,tree()); m_dirLister->setAutoErrorHandlingEnabled(false,0);
}
else {
m_dirLister->setAutoErrorHandlingEnabled(true,tree());
}
m_dirLister->openURL( url, true /*keep*/ ); m_dirLister->openURL( url, true /*keep*/ );
} }
@ -400,7 +397,7 @@ void KonqSidebarDirTreeModule::slotNewItems( const KFileItemList& entries )
kdDebug(1201) << this << " KonqSidebarDirTreeModule::slotNewItems " << entries.count() << endl; kdDebug(1201) << this << " KonqSidebarDirTreeModule::slotNewItems " << entries.count() << endl;
Q_ASSERT(entries.count()); Q_ASSERT(entries.count());
KFileItem * firstItem = const_cast<KFileItemList&>(entries).last(); // qlist sucks for constness KFileItem * firstItem = const_cast<KFileItemList&>(entries).last(); // TQList sucks for constness
// Find parent item - it's the same for all the items // Find parent item - it's the same for all the items
KURL dir( firstItem->url().url(-1) ); KURL dir( firstItem->url().url(-1) );
@ -411,45 +408,40 @@ void KonqSidebarDirTreeModule::slotNewItems( const KFileItemList& entries )
KonqSidebarTreeItem * parentItem; KonqSidebarTreeItem * parentItem;
lookupItems(m_dictSubDirs, dir.url(-1), parentItem, parentItemList); lookupItems(m_dictSubDirs, dir.url(-1), parentItem, parentItemList);
if ( !parentItem ) // hack for dnssd://domain/type/service listed in dnssd:/type/ dir if ( !parentItem ) { // hack for dnssd://domain/type/service listed in dnssd:/type/ dir
{ dir.setHost( TQString::null );
dir.setHost( TQString::null ); lookupItems( m_dictSubDirs, dir.url(-1), parentItem, parentItemList );
lookupItems( m_dictSubDirs, dir.url(-1), parentItem, parentItemList );
} }
if( !parentItem ) if ( !parentItem ) {
{ // Use the top level item as the parent
KMessageBox::error( tree(), i18n("Cannot find parent item %1 in the tree. Internal error.").arg( dir.url(-1) ) ); parentItem = m_topLevelItem;
return;
} }
kdDebug()<<"number of additional parent items:"<< (parentItemList?parentItemList->count():0)<<endl; kdDebug()<<"number of additional parent items:"<< (parentItemList?parentItemList->count():0)<<endl;
int size = TDEGlobal::iconLoader()->currentSize( TDEIcon::Small ); int size = TDEGlobal::iconLoader()->currentSize( TDEIcon::Small );
do do {
{ kdDebug()<<"Parent Item URL:"<<parentItem->externalURL()<<endl;
kdDebug()<<"Parent Item URL:"<<parentItem->externalURL()<<endl;
TQPtrListIterator<KFileItem> kit ( entries ); TQPtrListIterator<KFileItem> kit ( entries );
for( ; kit.current(); ++kit ) for( ; kit.current(); ++kit ) {
{
KFileItem * fileItem = *kit; KFileItem * fileItem = *kit;
if (! fileItem->isDir() ) if (! fileItem->isDir() ) {
{ KMimeType::Ptr ptr;
KMimeType::Ptr ptr;
if ( fileItem->url().isLocalFile() && (( (ptr=fileItem->determineMimeType())!=0) && (ptr->is("inode/directory") || m_showArchivesAsFolders) && ((!ptr->property("X-TDE-LocalProtocol").toString().isEmpty()) ))) {
if ( fileItem->url().isLocalFile() && (( (ptr=fileItem->determineMimeType())!=0) && (ptr->is("inode/directory") || m_showArchivesAsFolders) && ((!ptr->property("X-TDE-LocalProtocol").toString().isEmpty()) ))) { kdDebug()<<"Something really a directory"<<endl;
kdDebug()<<"Something really a directory"<<endl; }
} else { else {
//kdError() << "Item " << fileItem->url().prettyURL() << " is not a directory!" << endl; //kdError() << "Item " << fileItem->url().prettyURL() << " is not a directory!" << endl;
continue; continue;
} }
} }
KonqSidebarDirTreeItem *dirTreeItem = new KonqSidebarDirTreeItem( parentItem, m_topLevelItem, fileItem ); KonqSidebarDirTreeItem *dirTreeItem = new KonqSidebarDirTreeItem( parentItem, m_topLevelItem, fileItem );
dirTreeItem->setPixmap( 0, fileItem->pixmap( size ) ); dirTreeItem->setPixmap( 0, fileItem->pixmap( size ) );
dirTreeItem->setText( 0, TDEIO::decodeFileName( fileItem->name() ) ); dirTreeItem->setText( 0, TDEIO::decodeFileName( fileItem->name() ) );
} }
} while ((parentItem = parentItemList ? parentItemList->take(0) : 0)); } while ((parentItem = parentItemList ? parentItemList->take(0) : 0));
delete parentItemList; delete parentItemList;
} }
@ -520,11 +512,9 @@ void KonqSidebarDirTreeModule::slotDeleteItem( KFileItem *fileItem )
TQPtrList<KonqSidebarTreeItem> *itemList; TQPtrList<KonqSidebarTreeItem> *itemList;
KonqSidebarTreeItem * item; KonqSidebarTreeItem * item;
lookupItems(m_ptrdictSubDirs, fileItem, item, itemList); lookupItems(m_ptrdictSubDirs, fileItem, item, itemList);
while(item) while (item) {
{
removeSubDir( item ); removeSubDir( item );
delete item; delete item;
item = itemList ? itemList->take(0) : 0; item = itemList ? itemList->take(0) : 0;
} }
delete itemList; delete itemList;
@ -541,22 +531,20 @@ void KonqSidebarDirTreeModule::slotRedirection( const KURL & oldUrl, const KURL
KonqSidebarTreeItem * item; KonqSidebarTreeItem * item;
lookupItems(m_dictSubDirs, oldUrlStr, item, itemList); lookupItems(m_dictSubDirs, oldUrlStr, item, itemList);
if (!item) if (!item) {
{
kdWarning(1201) << "NOT FOUND oldUrl=" << oldUrlStr << endl; kdWarning(1201) << "NOT FOUND oldUrl=" << oldUrlStr << endl;
return; return;
} }
do do {
{ if (item->alias.contains(newUrlStr)) continue;
if (item->alias.contains(newUrlStr)) continue; kdDebug()<<"Redirectiong element"<<endl;
kdDebug()<<"Redirectiong element"<<endl;
// We need to update the URL in m_dictSubDirs // We need to update the URL in m_dictSubDirs
m_dictSubDirs.insert( newUrlStr, item ); m_dictSubDirs.insert( newUrlStr, item );
item->alias << newUrlStr; item->alias << newUrlStr;
kdDebug(1201) << "Updating url of " << item << " to " << newUrlStr << endl; kdDebug(1201) << "Updating url of " << item << " to " << newUrlStr << endl;
} while ((item = itemList ? itemList->take(0) : 0)); } while ((item = itemList ? itemList->take(0) : 0));
delete itemList; delete itemList;
} }
@ -565,26 +553,29 @@ void KonqSidebarDirTreeModule::slotListingStopped( const KURL & url )
{ {
kdDebug(1201) << "KonqSidebarDirTree::slotListingStopped " << url.url(-1) << endl; kdDebug(1201) << "KonqSidebarDirTree::slotListingStopped " << url.url(-1) << endl;
// Use internal reference URL if present
// Otherwise, the dirlister animation may never stop on redirected URLs such as system:/documents
TQString urlToStop = url.internalReferenceURL();
if (urlToStop == "") {
urlToStop = url.url(-1);
}
TQPtrList<KonqSidebarTreeItem> *itemList; TQPtrList<KonqSidebarTreeItem> *itemList;
KonqSidebarTreeItem * item; KonqSidebarTreeItem * item = NULL;
lookupItems(m_dictSubDirs, url.url(-1), item, itemList); lookupItems(m_dictSubDirs, urlToStop, item, itemList);
while(item) while (item) {
{ if ( item->childCount() == 0 ) {
if ( item->childCount() == 0 )
{
item->setExpandable( false ); item->setExpandable( false );
item->repaint(); item->repaint();
} }
m_pTree->stopAnimation( item ); m_pTree->stopAnimation( item );
item = itemList ? itemList->take(0) : 0; item = itemList ? itemList->take(0) : 0;
} }
delete itemList; delete itemList;
kdDebug(1201) << "m_selectAfterOpening " << m_selectAfterOpening.prettyURL() << endl; kdDebug(1201) << "m_selectAfterOpening " << m_selectAfterOpening.prettyURL() << endl;
if ( !m_selectAfterOpening.isEmpty() && url.isParentOf( m_selectAfterOpening ) ) if ( !m_selectAfterOpening.isEmpty() && url.isParentOf( m_selectAfterOpening ) ) {
{
KURL theURL( m_selectAfterOpening ); KURL theURL( m_selectAfterOpening );
m_selectAfterOpening = KURL(); m_selectAfterOpening = KURL();
followURL( theURL ); followURL( theURL );
@ -595,8 +586,7 @@ void KonqSidebarDirTreeModule::followURL( const KURL & url )
{ {
// Check if we already know this URL // Check if we already know this URL
KonqSidebarTreeItem * item = m_dictSubDirs[ url.url(-1) ]; KonqSidebarTreeItem * item = m_dictSubDirs[ url.url(-1) ];
if (item) // found it -> ensure visible, select, return. if (item) { // found it -> ensure visible, select, return.
{
m_pTree->ensureItemVisible( item ); m_pTree->ensureItemVisible( item );
m_pTree->setSelected( item, true ); m_pTree->setSelected( item, true );
return; return;
@ -605,30 +595,26 @@ void KonqSidebarDirTreeModule::followURL( const KURL & url )
KURL uParent( url ); KURL uParent( url );
KonqSidebarTreeItem * parentItem = 0L; KonqSidebarTreeItem * parentItem = 0L;
// Go up to the first known parent // Go up to the first known parent
do do {
{
uParent = uParent.upURL(); uParent = uParent.upURL();
parentItem = m_dictSubDirs[ uParent.url(-1) ]; parentItem = m_dictSubDirs[ uParent.url(-1) ];
} while ( !parentItem && !uParent.path().isEmpty() && uParent.path() != "/" ); } while ( !parentItem && !uParent.path().isEmpty() && uParent.path() != "/" );
// Not found !?! // Not found !?!
if (!parentItem) if (!parentItem) {
{
kdDebug() << "No parent found for url " << url.prettyURL() << endl; kdDebug() << "No parent found for url " << url.prettyURL() << endl;
return; return;
} }
kdDebug(1202) << "Found parent " << uParent.prettyURL() << endl; kdDebug(1202) << "Found parent " << uParent.prettyURL() << endl;
// That's the parent directory we found. Open if not open... // That's the parent directory we found. Open if not open...
if ( !parentItem->isOpen() ) if ( !parentItem->isOpen() ) {
{
parentItem->setOpen( true ); parentItem->setOpen( true );
if ( parentItem->childCount() && m_dictSubDirs[ url.url(-1) ] ) if ( parentItem->childCount() && m_dictSubDirs[ url.url(-1) ] ) {
{
// Immediate opening, if the dir was already listed // Immediate opening, if the dir was already listed
followURL( url ); // equivalent to a goto-beginning-of-method followURL( url ); // equivalent to a goto-beginning-of-method
} else }
{ else {
m_selectAfterOpening = url; m_selectAfterOpening = url;
kdDebug(1202) << "KonqSidebarDirTreeModule::followURL: m_selectAfterOpening=" << m_selectAfterOpening.url() << endl; kdDebug(1202) << "KonqSidebarDirTreeModule::followURL: m_selectAfterOpening=" << m_selectAfterOpening.url() << endl;
} }

@ -87,7 +87,7 @@ public:
*/ */
KonqSidebarTreeItem * currentItem() const; KonqSidebarTreeItem * currentItem() const;
void startAnimation( KonqSidebarTreeItem * item, const char * iconBaseName = "kde", uint iconCount = 6, const TQPixmap * originalPixmap = 0L ); void startAnimation( KonqSidebarTreeItem * item, const char * iconBaseName = "trinity", uint iconCount = 6, const TQPixmap * originalPixmap = 0L );
void stopAnimation( KonqSidebarTreeItem * item ); void stopAnimation( KonqSidebarTreeItem * item );
// Reimplemented from KDirNotify // Reimplemented from KDirNotify

Loading…
Cancel
Save