Branch: master

485ab965 2014-09-24 23:13:44 Timothy Pearson
Fix khelpcenter service group entry appearing when no child service items have documentation
This relates to Bug 1968
Fix khelpcenter services showing tree expansion hints
M khelpcenter/application.cpp
M khelpcenter/docentry.cpp
M khelpcenter/navigator.cpp
M khelpcenter/navigatorappitem.cpp
M khelpcenter/navigatorappitem.h
diff --git a/khelpcenter/application.cpp b/khelpcenter/application.cpp
index 7adafeb..631818d 100644
--- a/khelpcenter/application.cpp
+++ b/khelpcenter/application.cpp
@@ -34,7 +34,7 @@
 int Application::newInstance()
 {
   if (restoringSession()) return 0;
-  
+
   TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
 
   KURL url;
diff --git a/khelpcenter/docentry.cpp b/khelpcenter/docentry.cpp
index 05f3ffa..e2feedc 100644
--- a/khelpcenter/docentry.cpp
+++ b/khelpcenter/docentry.cpp
@@ -269,7 +269,7 @@
     if ( i == 0 ) {
       if ( entry->weight() < mChildren.first()->weight() ) {
         entry->setNextSibling( mChildren.first() );
-        mChildren.prepend( entry );        
+        mChildren.prepend( entry );
         break;
       }
     }
diff --git a/khelpcenter/navigator.cpp b/khelpcenter/navigator.cpp
index e05671e..7d865d9 100644
--- a/khelpcenter/navigator.cpp
+++ b/khelpcenter/navigator.cpp
@@ -225,8 +225,9 @@
   KServiceGroup::List::ConstIterator end = entries.end();
   for ( ; it != end; ++it ) {
     TQString desktopFile = ( *it )->entryPath();
-    if ( TQDir::isRelativePath( desktopFile ) )
+    if ( TQDir::isRelativePath( desktopFile ) ) {
         desktopFile = locate( "apps", desktopFile );
+    }
     createItemFromDesktopFile( topItem, desktopFile );
   }
 }
diff --git a/khelpcenter/navigatorappitem.cpp b/khelpcenter/navigatorappitem.cpp
index b2bee73..2c17538 100644
--- a/khelpcenter/navigatorappitem.cpp
+++ b/khelpcenter/navigatorappitem.cpp
@@ -78,20 +78,21 @@
   TQListViewItem::setOpen(open); 
 }
 
-void NavigatorAppItem::populate( bool recursive )
+bool NavigatorAppItem::populate( bool recursive )
 {
-  if ( mPopulated ) return;
+  bool entriesAdded = false;
+
+  if ( mPopulated ) return false;
 
   KServiceGroup::Ptr root = KServiceGroup::group(mRelpath);
   if ( !root ) {
     kdWarning() << "No Service groups\n";
-    return;
+    return false;
   }
   KServiceGroup::List list = root->entries();
 
 
-  for ( KServiceGroup::List::ConstIterator it = list.begin();
-        it != list.end(); ++it )
+  for ( KServiceGroup::List::ConstIterator it = list.begin(); it != list.end(); ++it )
   {
     KSycocaEntry * e = *it;
     KService::Ptr s;
@@ -108,20 +109,41 @@
           DocEntry *entry = new DocEntry( s->name(), url, s->icon() );
           item = new NavigatorItem( entry, this );
           item->setAutoDeleteDocEntry( true );
-          item->setExpandable( true );
+          item->setExpandable( false );
+          entriesAdded = true;
         }
         break;
       }
       case KST_KServiceGroup:
       {
         g = static_cast<KServiceGroup*>(e);
-        if ( ( g->childCount() == 0 ) || g->name().startsWith( "." ) )
+        if ( ( g->childCount() == 0 ) || g->name().startsWith( "." ) ) {
           continue;
-        DocEntry *entry = new DocEntry( g->caption(), "", g->icon() );              
-        NavigatorAppItem *appItem;
-        appItem = new NavigatorAppItem( entry, this, g->relPath() );
-        appItem->setAutoDeleteDocEntry( true );
-        if ( recursive ) appItem->populate( recursive );
+        }
+        KServiceGroup::List entryList = g->entries(false, true, false, false);
+        if (entryList.count() > 0) {
+          int entryCount = 0;
+          for( KServiceGroup::List::ConstIterator it2 = entryList.begin(); it2 != entryList.end(); it2++)
+          {
+            KSycocaEntry *p = (*it2);
+            if (p->isType(KST_KService))
+            {
+              KService *s = static_cast<KService *>(p);
+              url = documentationURL( s );
+              if ( !url.isEmpty() ){
+                entryCount++;
+              }
+            }
+          }
+          if (entryCount > 0) {
+            DocEntry *entry = new DocEntry( g->caption(), "", g->icon() );
+            NavigatorAppItem *appItem;
+            appItem = new NavigatorAppItem( entry, this, g->relPath() );
+            appItem->setAutoDeleteDocEntry( true );
+            if ( recursive ) appItem->populate( recursive );
+            entriesAdded = true;
+          }
+        }
         break;
       }
       default:
@@ -130,6 +152,8 @@
   }
   sortChildItems( 0, true /* ascending */ );
   mPopulated = true;
+
+  return entriesAdded;
 }
 
 TQString NavigatorAppItem::documentationURL( KService *s )
diff --git a/khelpcenter/navigatorappitem.h b/khelpcenter/navigatorappitem.h
index 8ae3eac..ddebe96 100644
--- a/khelpcenter/navigatorappitem.h
+++ b/khelpcenter/navigatorappitem.h
@@ -42,7 +42,7 @@
     void setRelpath( const TQString & );
 
     virtual void setOpen(bool);
-    void populate( bool recursive = false );
+    bool populate( bool recursive = false );
 
   protected:
     TQString documentationURL( KService *s );