void NavigatorAppItem::populate( bool recursive ) { if ( mPopulated ) return; KServiceGroup::Ptr root = KServiceGroup::group(mRelpath); if ( !root ) { kWarning() << "No Service groups\n"; return; } KServiceGroup::List list = root->entries(); for ( KServiceGroup::List::ConstIterator it = list.constBegin(); it != list.constEnd(); ++it ) { const KSycocaEntry::Ptr e = *it; NavigatorItem *item; QString url; switch ( e->sycocaType() ) { case KST_KService: { const KService::Ptr s = KService::Ptr::staticCast(e); url = documentationURL( s.data() ); if ( !url.isEmpty() ) { DocEntry *entry = new DocEntry( s->name(), url, s->icon() ); item = new NavigatorItem( entry, this ); item->setAutoDeleteDocEntry( true ); } break; } case KST_KServiceGroup: { KServiceGroup::Ptr g = KServiceGroup::Ptr::staticCast(e); 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 ); break; } default: break; } } sortChildren( 0, Qt::AscendingOrder /* ascending */ ); mPopulated = true; }
void Navigator::insertParentAppDocs( const QString &name, NavigatorItem *topItem ) { kDebug(1400) << "Requested plugin documents for ID " << name; KServiceGroup::Ptr grp = KServiceGroup::childGroup( name ); if ( !grp ) return; KServiceGroup::List entries = grp->entries(); KServiceGroup::List::ConstIterator it = entries.constBegin(); KServiceGroup::List::ConstIterator end = entries.constEnd(); for ( ; it != end; ++it ) { QString desktopFile = ( *it )->entryPath(); if ( QDir::isRelativePath( desktopFile ) ) desktopFile = KStandardDirs::locate( "apps", desktopFile ); createItemFromDesktopFile( topItem, desktopFile ); } }
void GroupedInstalledAppsModel::loadRootEntries() { KServiceGroup::Ptr group = KServiceGroup::root(); KServiceGroup::List list = group->entries(false /* sorted: set to false as it does not seem to work */); QMap<QString, KServiceGroup::Ptr> groupMap; for( KServiceGroup::List::ConstIterator it = list.constBegin(); it != list.constEnd(); it++) { const KSycocaEntry::Ptr p = (*it); if (p->isType(KST_KServiceGroup)) { KServiceGroup::Ptr subGroup = KServiceGroup::Ptr::staticCast(p); if (!subGroup->noDisplay() && subGroup->childCount() > 0) { groupMap.insert(subGroup->caption().toLower(), subGroup); } } } m_pendingGroupList = groupMap.values(); QMetaObject::invokeMethod(this, "loadNextGroup", Qt::QueuedConnection); }
void ApplicationListModel::loadApplications() { auto cfg = KSharedConfig::openConfig("applications-blacklistrc"); auto blgroup = KConfigGroup(cfg, QStringLiteral("Applications")); // This is only temporary to get a clue what those apps' desktop files are called // I'll remove it once I've done a blacklist QStringList bl; QStringList blacklist = blgroup.readEntry("blacklist", QStringList()); beginResetModel(); m_applicationList.clear(); KServiceGroup::Ptr group = KServiceGroup::root(); if (!group || !group->isValid()) return; KServiceGroup::List subGroupList = group->entries(true); QMap<int, ApplicationData> orderedList; QList<ApplicationData> unorderedList; // Iterate over all entries in the group while (!subGroupList.isEmpty()) { KSycocaEntry::Ptr groupEntry = subGroupList.first(); subGroupList.pop_front(); if (groupEntry->isType(KST_KServiceGroup)) { KServiceGroup::Ptr serviceGroup(static_cast<KServiceGroup* >(groupEntry.data())); if (!serviceGroup->noDisplay()) { KServiceGroup::List entryGroupList = serviceGroup->entries(true); for(KServiceGroup::List::ConstIterator it = entryGroupList.constBegin(); it != entryGroupList.constEnd(); it++) { KSycocaEntry::Ptr entry = (*it); if (entry->isType(KST_KServiceGroup)) { KServiceGroup::Ptr serviceGroup(static_cast<KServiceGroup* >(entry.data())); subGroupList << serviceGroup; } else if (entry->property("Exec").isValid()) { KService::Ptr service(static_cast<KService* >(entry.data())); qDebug() << " desktopEntryName: " << service->desktopEntryName(); if (service->isApplication() && !blacklist.contains(service->desktopEntryName()) && service->showOnCurrentPlatform() && !service->property("Terminal", QVariant::Bool).toBool()) { bl << service->desktopEntryName(); ApplicationData data; data.name = service->name(); data.icon = service->icon(); data.storageId = service->storageId(); data.entryPath = service->exec(); auto it = m_appPositions.constFind(service->storageId()); if (it != m_appPositions.constEnd()) { orderedList[*it] = data; } else { unorderedList << data; } } } } } } } blgroup.writeEntry("allapps", bl); blgroup.writeEntry("blacklist", blacklist); cfg->sync(); std::sort(unorderedList.begin(), unorderedList.end(), appNameLessThan); m_applicationList << orderedList.values(); m_applicationList << unorderedList; endResetModel(); emit countChanged(); }