Branch: master

3e7ad37f 2014-09-27 18:49:29 Timothy Pearson
Repair all known Konqueror performance regressions caused by early calls to expensive mimetype operations
These accidental errors span most TDE releases and many KDE 3.x releases
This resolves Bug 699
M konqueror/iconview/konq_iconview.cc
M konqueror/listview/konq_infolistviewitem.cc
M konqueror/listview/konq_infolistviewitem.h
M konqueror/listview/konq_infolistviewwidget.cc
M konqueror/listview/konq_listview.cc
M konqueror/listview/konq_listviewitems.cc
M konqueror/listview/konq_listviewitems.h
M konqueror/listview/konq_listviewwidget.cc
M konqueror/listview/konq_textviewitem.cc
M konqueror/listview/konq_textviewitem.h
M konqueror/listview/konq_textviewwidget.cc
M libkonq/tdefileivi.cc
diff --git a/konqueror/iconview/konq_iconview.cc b/konqueror/iconview/konq_iconview.cc
index 04b2bfb..0e754b8 100644
--- a/konqueror/iconview/konq_iconview.cc
+++ b/konqueror/iconview/konq_iconview.cc
@@ -1008,7 +1008,7 @@
         if ( fileItem->isDir() && m_pProps->isShowingDirectoryOverlays() ) {
             showDirectoryOverlay(item);
         }
-        if ( fileItem->mimetype().startsWith("media/") && fileItem->mimetype().contains("_mounted") && m_pProps->isShowingFreeSpaceOverlays() ) {
+        if ( fileItem->mimetypeFast().startsWith("media/") && fileItem->mimetypeFast().contains("_mounted") && m_pProps->isShowingFreeSpaceOverlays() ) {
             showFreeSpaceOverlay(item);
         }
 
@@ -1207,8 +1207,8 @@
             if ( !bNeedRepaint && oldSize != ivi->pixmap()->size() ) {
                 bNeedRepaint = true;
             }
-            if ( (*rit)->mimetype().startsWith("media/") && m_pProps->isShowingFreeSpaceOverlays() ) {
-                if ((*rit)->mimetype().contains("_mounted")) {
+            if ( (*rit)->mimetypeFast().startsWith("media/") && m_pProps->isShowingFreeSpaceOverlays() ) {
+                if ((*rit)->mimetypeFast().contains("_mounted")) {
                     showFreeSpaceOverlay(ivi);
                 }
                 else {
diff --git a/konqueror/listview/konq_infolistviewitem.cc b/konqueror/listview/konq_infolistviewitem.cc
index 5f4a0f6..18efb3f 100644
--- a/konqueror/listview/konq_infolistviewitem.cc
+++ b/konqueror/listview/konq_infolistviewitem.cc
@@ -255,14 +255,14 @@
     TQListViewItem::paintFocus( _painter, cg, r );
 }
 
-#if 0
-void KonqBaseListViewItem::mimetypeFound()
+void KonqInfoListViewItem::mimetypeFound()
 {
+#if 0
     // Update icon
     setDisabled( m_bDisabled );
     uint done = 0;
-    KonqBaseListViewWidget * lv = static_cast<KonqBaseListViewWidget*>(listView());
-    for (unsigned int i=0; i<KonqBaseListViewWidget::NumberOfAtoms && done < 2; i++)
+    KonqBaseListViewWidget * lv = m_pListViewWidget;
+    for (unsigned int i=0; i<m_pListViewWidget->NumberOfAtoms && done < 2; i++)
     {
         ColumnInfo *tmpColumn=&lv->columnConfigInfo()[i];
         if (lv->columnConfigInfo()[i].udsId==TDEIO::UDS_FILE_TYPE && tmpColumn->displayThisOne)
@@ -276,6 +276,5 @@
             done++;
         }
     }
-}
-
 #endif
+}
diff --git a/konqueror/listview/konq_infolistviewitem.h b/konqueror/listview/konq_infolistviewitem.h
index e819281..f4ee2d3 100644
--- a/konqueror/listview/konq_infolistviewitem.h
+++ b/konqueror/listview/konq_infolistviewitem.h
@@ -58,6 +58,7 @@
       virtual void paintCell( TQPainter *_painter, const TQColorGroup & cg,
                               int column, int width, int alignment );
       virtual void paintFocus( TQPainter * _painter, const TQColorGroup & cg, const TQRect & r );
+      virtual void mimetypeFound();
       virtual void updateContents();
       virtual void setDisabled( bool disabled );
 
diff --git a/konqueror/listview/konq_infolistviewwidget.cc b/konqueror/listview/konq_infolistviewwidget.cc
index fab7989..e835f1c 100644
--- a/konqueror/listview/konq_infolistviewwidget.cc
+++ b/konqueror/listview/konq_infolistviewwidget.cc
@@ -208,8 +208,9 @@
            }
         }
 
-        if ( !(*kit)->isMimeTypeKnown() )
+        if ( !(*kit)->isMimeTypeKnown() ) {
             m_pBrowserView->lstPendingMimeIconItems().append( tmp );
+        }
     }
     m_pBrowserView->newItems( list );
 
diff --git a/konqueror/listview/konq_listview.cc b/konqueror/listview/konq_listview.cc
index 0e329f7..8c9369a 100644
--- a/konqueror/listview/konq_listview.cc
+++ b/konqueror/listview/konq_listview.cc
@@ -348,6 +348,10 @@
   //if ( oldSerial != newIcon.serialNumber() )
   //  item->setPixmap( 0, newIcon );
 
+  if (item->item()->isMimeTypeKnown()) {
+    item->mimetypeFound();
+  }
+
   // We also have columns to update, not only the icon
   item->updateContents();
 }
diff --git a/konqueror/listview/konq_listviewitems.cc b/konqueror/listview/konq_listviewitems.cc
index e9a14a8..d566531 100644
--- a/konqueror/listview/konq_listviewitems.cc
+++ b/konqueror/listview/konq_listviewitems.cc
@@ -106,10 +106,14 @@
             setText(tmpColumn->displayInColumn,m_fileitem->group());
             break;
          case TDEIO::UDS_FILE_TYPE:
-            setText(tmpColumn->displayInColumn,m_fileitem->mimeComment());
+            if (m_fileitem->isMimeTypeKnown()) {
+               setText(tmpColumn->displayInColumn,m_fileitem->mimeComment());
+            }
             break;
          case TDEIO::UDS_MIME_TYPE:
-            setText(tmpColumn->displayInColumn,m_fileitem->mimetype());
+            if (m_fileitem->isMimeTypeKnown()) {
+               setText(tmpColumn->displayInColumn,m_fileitem->mimetype());
+            }
             break;
          case TDEIO::UDS_URL:
             setText(tmpColumn->displayInColumn,m_fileitem->url().prettyURL());
diff --git a/konqueror/listview/konq_listviewitems.h b/konqueror/listview/konq_listviewitems.h
index 6a74432..f374daf 100644
--- a/konqueror/listview/konq_listviewitems.h
+++ b/konqueror/listview/konq_listviewitems.h
@@ -48,7 +48,7 @@
       /** @return the file item held by this instance */
       KFileItem * item() { return m_fileitem; }
 
-      void mimetypeFound();
+      virtual void mimetypeFound();
       virtual void updateContents() = 0;
       virtual void setDisabled( bool disabled ) { m_bDisabled = disabled; }
       virtual void setActive  ( bool active   ) { m_bActive   = active;   }
diff --git a/konqueror/listview/konq_listviewwidget.cc b/konqueror/listview/konq_listviewwidget.cc
index 858d7c9..1fdb86e 100644
--- a/konqueror/listview/konq_listviewwidget.cc
+++ b/konqueror/listview/konq_listviewwidget.cc
@@ -236,9 +236,9 @@
          lstColumns << column;
       const TQString type = (*extraFieldsIt).type; // ## TODO use when sorting
       TQVariant::Type t = TQVariant::Invalid;
-      if ( type.lower() == "qstring" )
+      if ( type.lower() == TQString(TQSTRING_OBJECT_NAME_STRING).lower() )
           t = TQVariant::String;
-      else if ( type.lower() == "qdatetime" )
+      else if ( type.lower() == TQString(TQDATETIME_OBJECT_NAME_STRING).lower() )
           t = TQVariant::DateTime;
       else
           kdWarning() << "Unsupported ExtraType '" << type << "'" << endl;
diff --git a/konqueror/listview/konq_textviewitem.cc b/konqueror/listview/konq_textviewitem.cc
index 3919d6c..1076e10 100644
--- a/konqueror/listview/konq_textviewitem.cc
+++ b/konqueror/listview/konq_textviewitem.cc
@@ -161,10 +161,14 @@
             setText(tmpColumn->displayInColumn,m_fileitem->linkDest());
             break;
          case TDEIO::UDS_FILE_TYPE:
-            setText(tmpColumn->displayInColumn,m_fileitem->mimeComment());
+            if (m_fileitem->isMimeTypeKnown()) {
+               setText(tmpColumn->displayInColumn,m_fileitem->mimeComment());
+            }
             break;
          case TDEIO::UDS_MIME_TYPE:
-            setText(tmpColumn->displayInColumn,m_fileitem->mimetype());
+            if (m_fileitem->isMimeTypeKnown()) {
+               setText(tmpColumn->displayInColumn,m_fileitem->mimetype());
+            }
             break;
          case TDEIO::UDS_URL:
             setText(tmpColumn->displayInColumn,m_fileitem->url().prettyURL());
@@ -230,3 +234,25 @@
    if ( h % 2 > 0 ) h++;
    setHeight(h);
 }
+
+void KonqTextViewItem::mimetypeFound()
+{
+    // Update icon
+    setDisabled( m_bDisabled );
+    uint done = 0;
+    KonqBaseListViewWidget * lv = m_pListViewWidget;
+    for (unsigned int i=0; i<m_pListViewWidget->NumberOfAtoms && done < 2; i++)
+    {
+        ColumnInfo *tmpColumn=&lv->columnConfigInfo()[i];
+        if (lv->columnConfigInfo()[i].udsId==TDEIO::UDS_FILE_TYPE && tmpColumn->displayThisOne)
+        {
+            setText(tmpColumn->displayInColumn, m_fileitem->mimeComment());
+            done++;
+        }
+        if (lv->columnConfigInfo()[i].udsId==TDEIO::UDS_MIME_TYPE && tmpColumn->displayThisOne)
+        {
+            setText(tmpColumn->displayInColumn, m_fileitem->mimetype());
+            done++;
+        }
+    }
+}
\ No newline at end of file
diff --git a/konqueror/listview/konq_textviewitem.h b/konqueror/listview/konq_textviewitem.h
index 506c1b5..57be5a7 100644
--- a/konqueror/listview/konq_textviewitem.h
+++ b/konqueror/listview/konq_textviewitem.h
@@ -59,6 +59,7 @@
        * on the view)*/
       virtual void paintCell( TQPainter *_painter, const TQColorGroup & _cg, int _column, int _width, int _alignment );
 //      virtual void paintFocus( TQPainter *_painter, const TQColorGroup & _cg, const TQRect & r );
+      virtual void mimetypeFound();
       virtual void updateContents();
 
    protected:
diff --git a/konqueror/listview/konq_textviewwidget.cc b/konqueror/listview/konq_textviewwidget.cc
index 32de253..ab22789 100644
--- a/konqueror/listview/konq_textviewwidget.cc
+++ b/konqueror/listview/konq_textviewwidget.cc
@@ -94,7 +94,8 @@
             setSelected( tmp, true );
          }
       }
-
+      if ( !(*kit)->isMimeTypeKnown() )
+         m_pBrowserView->lstPendingMimeIconItems().append( tmp );
    }
 
    m_pBrowserView->newItems( entries );
diff --git a/libkonq/tdefileivi.cc b/libkonq/tdefileivi.cc
index 629d9a2..08bd240 100644
--- a/libkonq/tdefileivi.cc
+++ b/libkonq/tdefileivi.cc
@@ -570,14 +570,9 @@
 
     KonqIconViewWidget* view = static_cast<KonqIconViewWidget*>( iconView() );
 
-    if ( view && view->canPreview( item() ) ) {
-        int previewSize = view->previewIconSize( size );
-        setPixmapSize( TQSize( previewSize, previewSize ) );
-    }
-    else {
-        TQSize pixSize = TQSize( size, size );
-        if ( pixSize != pixmapSize() )
-            setPixmapSize( pixSize );
+    TQSize pixSize = TQSize( size, size );
+    if ( pixSize != pixmapSize() ) {
+        setPixmapSize( pixSize );
     }
 }