summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--konq-plugins/dirfilter/dirfilterplugin.cpp77
-rw-r--r--konq-plugins/dirfilter/dirfilterplugin.h3
2 files changed, 54 insertions, 26 deletions
diff --git a/konq-plugins/dirfilter/dirfilterplugin.cpp b/konq-plugins/dirfilter/dirfilterplugin.cpp
index eee1284..3e16bf4 100644
--- a/konq-plugins/dirfilter/dirfilterplugin.cpp
+++ b/konq-plugins/dirfilter/dirfilterplugin.cpp
@@ -199,11 +199,18 @@ DirFilterPlugin::DirFilterPlugin (QObject* parent, const char* name,
KWidgetAction *filterAction = new KWidgetAction(hbox, i18n("Filter Field"),
0, 0, 0, actionCollection(), "toolbar_filter_field");
filterAction->setShortcutConfigurable(false);
+
+ m_refreshTimer = new QTimer( this );
+ connect( m_refreshTimer, SIGNAL(timeout()), this, SLOT(activateSearch()) );
+ m_refreshTimer->start( 200, FALSE ); // 200 millisecond continuous timer
+
}
DirFilterPlugin::~DirFilterPlugin()
{
+ m_refreshTimer->stop();
delete m_pFilterMenu;
+ delete m_refreshTimer;
}
void DirFilterPlugin::slotOpenURL ()
@@ -396,7 +403,6 @@ void DirFilterPlugin::slotItemsAdded (const KFileItemList& list)
{
static_cast<KIconViewSearchLine*>(m_searchWidget)->updateSearch();
}
- //m_searchWidget->updateSearch();
// Make sure the filter menu is enabled once a named
// filter is removed.
@@ -415,8 +421,7 @@ void DirFilterPlugin::slotItemsAdded (const KFileItemList& list)
{
MimeInfo& mimeInfo = m_pMimeInfo[mimeType];
QStringList filters = m_part->mimeFilter ();
- mimeInfo.useAsFilter = (!filters.isEmpty () &&
- filters.contains (mimeType));
+ mimeInfo.useAsFilter = (!filters.isEmpty () && filters.contains (mimeType));
mimeInfo.mimeComment = mime->comment();
mimeInfo.iconName = mime->icon(KURL(), false);
mimeInfo.filenames.insert(name, false);
@@ -430,30 +435,50 @@ void DirFilterPlugin::slotItemsAdded (const KFileItemList& list)
void DirFilterPlugin::slotItemRemoved (const KFileItem* item)
{
- if (!item || !m_part)
- return;
-
- QString mimeType = item->mimetype().stripWhiteSpace();
-
- if (m_pMimeInfo.contains (mimeType))
- {
- MimeInfo info = m_pMimeInfo [mimeType];
+ if (!item || !m_part)
+ return;
+
+ // Due to the poor implementation of qiconviewitem, there is no way for it to know if an item on the hidden list was deleted
+ // This *will* eventually cause the kiconviewsearchline to attempt to reference a deleted object, resulting in a crash
+ // This is illustrated well with two Konqueror windows. Open one, set the filter bar to filter out a file, then delete the filtered file from another window.
+ // Now clear the search bar (forcing injection of the deleted iconview object pointer from the hidden list). Konqueror will crash!
+ // If iconDeleted is called, it allows kiconviewsearchline to temporarily add the affected qiconviewitem(s) (by filename) to the iconview so that as far as
+ // qiconview is concerned the qiconviewitem objects never left.
+ // NOTE: This bug is NOT present in qlistviewitem
+
+ // HACK around it here...
+ if ( ::qt_cast<QIconView*>(m_part->scrollWidget()) ) {
+ static_cast<KIconViewSearchLine*>(m_searchWidget)->iconDeleted(item->name());
+ }
+
+ QString mimeType = item->mimetype().stripWhiteSpace();
+
+ if (m_pMimeInfo.contains (mimeType)) {
+ MimeInfo info = m_pMimeInfo [mimeType];
+
+ if (info.filenames.size () > 1)
+ m_pMimeInfo [mimeType].filenames.remove (item->name ());
+ else {
+ if (info.useAsFilter) {
+ QStringList filters = m_part->mimeFilter ();
+ filters.remove (mimeType);
+ m_part->setMimeFilter (filters);
+ SessionManager::self()->save (m_part->url(), filters);
+ QTimer::singleShot( 0, this, SLOT(slotTimeout()) );
+ }
+ m_pMimeInfo.remove (mimeType);
+ }
+ }
+}
- if (info.filenames.size () > 1)
- m_pMimeInfo [mimeType].filenames.remove (item->name ());
- else
- {
- if (info.useAsFilter)
- {
- QStringList filters = m_part->mimeFilter ();
- filters.remove (mimeType);
- m_part->setMimeFilter (filters);
- SessionManager::self()->save (m_part->url(), filters);
- QTimer::singleShot( 0, this, SLOT(slotTimeout()) );
- }
- m_pMimeInfo.remove (mimeType);
- }
- }
+void DirFilterPlugin::activateSearch()
+{
+ if ( ::qt_cast<KListView*>(m_part->scrollWidget()) ) {
+ static_cast<KListViewSearchLine*>(m_searchWidget)->updateSearch();
+ }
+ else if ( ::qt_cast<QIconView*>(m_part->scrollWidget()) ) {
+ static_cast<KIconViewSearchLine*>(m_searchWidget)->updateSearch();
+ }
}
void DirFilterPlugin::slotReset()
diff --git a/konq-plugins/dirfilter/dirfilterplugin.h b/konq-plugins/dirfilter/dirfilterplugin.h
index f1c5b44..74ad8e2 100644
--- a/konq-plugins/dirfilter/dirfilterplugin.h
+++ b/konq-plugins/dirfilter/dirfilterplugin.h
@@ -20,6 +20,7 @@
#define __DIR_FILTER_PLUGIN_H
#include <qmap.h>
+#include <qtimer.h>
#include <qstringlist.h>
@@ -119,10 +120,12 @@ private slots:
void slotItemSelected(int);
void slotItemRemoved(const KFileItem *);
void slotItemsAdded(const KFileItemList &);
+ void activateSearch();
private:
KURL m_pURL;
KonqDirPart* m_part;
+ QTimer *m_refreshTimer;
KActionMenu* m_pFilterMenu;
KLineEdit *m_searchWidget;