[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    visibility of child items with klistviewsearchline
From:       Jakob Schroeter <js () camaya ! net>
Date:       2004-11-11 23:07:58
Message-ID: 200411112308.02793.js () camaya ! net
[Download RAW message or body]

[Attachment #2 (multipart/mixed)]


Hi,

I had a look at http://bugs.kde.org/88512 (KMail shows similar behaviour) and 
it seems to me this is actually an issue with KListViewSearchLine. The 
attached patch makes KListViewSearchLine show children of matched items by 
default.
What do you think?

cheers,
Jakob

["klistviewsearchline-showchildren.diff" (text/x-diff)]

Index: klistviewsearchline.h
===================================================================
RCS file: /home/kde/kdelibs/kdeui/klistviewsearchline.h,v
retrieving revision 1.9
diff -u -3 -p -r1.9 klistviewsearchline.h
--- klistviewsearchline.h	22 Oct 2004 12:39:34 -0000	1.9
+++ klistviewsearchline.h	11 Nov 2004 22:30:01 -0000
@@ -84,6 +84,15 @@ public:
     bool keepParentsVisible() const;
 
     /**
+     * If this is true (the default) then the children of matched items will also
+     * be shown.
+     *
+     * @see setKeepChildrenVisible()
+     * @since 3.4
+     */
+    bool keepChildrenVisible() const;
+
+    /**
      * Returns the listview that is currently filtered by the search.
      *
      * @see setListView()
@@ -117,6 +126,14 @@ public slots:
     void setKeepParentsVisible(bool v);
 
     /**
+     * If this is set to true (the default) then the children of matching items
+     * will be shown.
+     *
+     * @see keepChildrenVisible
+     */
+    void setKeepChildrenVisible(bool v);
+
+    /**
      * Sets the list of columns to be searched.  The default is to search all,
      * visible columns which can be restored by passing \a columns as an empty
      * list.
@@ -190,6 +207,18 @@ private:
      */
     bool checkItemParentsVisible(QListViewItem *item);
 
+    /**
+     * This is used in case child items of matching items should be visible.
+     * It makes a recursive call to all children.
+     */
+    void ensureChildrenVisible(QListViewItem *item);
+
+    /**
+     * This is used in case child items of matching items shouldn't be visible.
+     */
+    void ensureChildrenNotVisible(QListViewItem *item);
+
+
 private slots:
     void itemAdded(QListViewItem *item) const;
     void listViewDeleted();
Index: klistviewsearchline.cpp
===================================================================
RCS file: /home/kde/kdelibs/kdeui/klistviewsearchline.cpp,v
retrieving revision 1.10
diff -u -3 -p -r1.10 klistviewsearchline.cpp
--- klistviewsearchline.cpp	22 Oct 2004 13:18:40 -0000	1.10
+++ klistviewsearchline.cpp	11 Nov 2004 22:30:01 -0000
@@ -35,12 +35,14 @@ public:
         caseSensitive(false),
         activeSearch(false),
         keepParentsVisible(true),
+        keepChildrenVisible(true),
         queuedSearches(0) {}
 
     KListView *listView;
     bool caseSensitive;
     bool activeSearch;
     bool keepParentsVisible;
+    bool keepChildrenVisible;
     QString search;
     int queuedSearches;
     QValueList<int> searchColumns;
@@ -104,6 +106,11 @@ bool KListViewSearchLine::keepParentsVis
     return d->keepParentsVisible;
 }
 
+bool KListViewSearchLine::keepChildrenVisible() const
+{
+  return d->keepChildrenVisible;
+}
+
 KListView *KListViewSearchLine::listView() const
 {
     return d->listView;
@@ -164,6 +171,11 @@ void KListViewSearchLine::setKeepParents
     d->keepParentsVisible = v;
 }
 
+void KListViewSearchLine::setKeepChildrenVisible(bool v)
+{
+  d->keepChildrenVisible = v;
+}
+
 void KListViewSearchLine::setSearchColumns(const QValueList<int> &columns)
 {
     d->searchColumns = columns;
@@ -325,9 +337,17 @@ void KListViewSearchLine::checkItemParen
     {
         QListViewItem *item = it.current();
         if(itemMatches(item, d->search))
+        {
             item->setVisible(true);
+            if(d->keepChildrenVisible)
+                ensureChildrenVisible( item->firstChild() );
+        }
         else
+        {
             item->setVisible(false);
+            if(!d->keepChildrenVisible)
+                ensureChildrenNotVisible( item->firstChild() );
+        }
     }
 }
 
@@ -339,12 +359,31 @@ bool KListViewSearchLine::checkItemParen
            itemMatches(item, d->search))
         {
             item->setVisible( true );
+            if(d->keepChildrenVisible)
+                ensureChildrenVisible( item->firstChild() );
             visible = true;
         }
         else
+        {
             item->setVisible(false);
+            if(!d->keepChildrenVisible)
+                ensureChildrenNotVisible( item->firstChild() );
+        }
     }
     return visible;
 }
 
+void KListViewSearchLine::ensureChildrenNotVisible(QListViewItem *item)
+{
+  for(; item; item = item->nextSibling())
+    item->setVisible( false );
+
+}
+
+void KListViewSearchLine::ensureChildrenVisible(QListViewItem *item)
+{
+  for(; item; item = item->nextSibling())
+      item->setVisible( true );
+}
+
 #include "klistviewsearchline.moc"

[Attachment #6 (application/pgp-signature)]

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic