void Configuration::setServiceMenu() { KMenu *menu = qobject_cast<KMenu*>(sender()); if (menu->actions().count() > 1) { return; } KServiceGroup::Ptr rootGroup = KServiceGroup::group(menu->actions()[0]->data().toString()); if (!rootGroup || !rootGroup->isValid() || rootGroup->noDisplay()) { return; } KServiceGroup::List list = rootGroup->entries(true, true, true, true); QAction *action = menu->addAction(KIcon("list-add"), i18n("Add This Menu")); action->setData(rootGroup->relPath()); menu->addSeparator(); for (int i = 0; i < list.count(); ++i) { if (list.at(i)->isType(KST_KService)) { const KService::Ptr service = KService::Ptr::staticCast(list.at(i)); action = menu->addAction(KIcon(service->icon()), service->name()); action->setEnabled(false); } else if (list.at(i)->isType(KST_KServiceGroup)) { const KServiceGroup::Ptr group = KServiceGroup::Ptr::staticCast(list.at(i)); if (group->noDisplay() || group->childCount() == 0) { continue; } KMenu *subMenu = new KMenu(menu); QAction *action = subMenu->addAction(QString()); action->setData(group->relPath()); action->setVisible(false); action = menu->addAction(KIcon(group->icon()), group->caption()); action->setMenu(subMenu); connect(subMenu, SIGNAL(aboutToShow()), this, SLOT(setServiceMenu())); } else if (list.at(i)->isType(KST_KServiceSeparator)) { menu->addSeparator(); } } }
void ApplicationsProtocol::stat(const KUrl& url) { KIO::UDSEntry entry; QString servicePath( url.path( KUrl::AddTrailingSlash ) ); servicePath.remove(0, 1); // remove starting '/' KServiceGroup::Ptr grp = KServiceGroup::group(servicePath); if (grp && grp->isValid()) { createDirEntry(entry, ((m_runMode==ApplicationsMode) ? i18n("Applications") : i18n("Programs")), url.url(), "inode/directory",grp->icon() ); } else { KService::Ptr service = KService::serviceByDesktopName( url.fileName() ); if (service && service->isValid()) { createFileEntry(entry, service, url ); } else { error(KIO::ERR_SLAVE_DEFINED,i18n("Unknown application folder")); return; } } statEntry(entry); finished(); }
void TIconView::setCategory( const QString& path ) { this->clear(); QPixmap _icon = DesktopIcon( "go", KIcon::SizeMedium ); // defaultIcon KServiceGroup::Ptr category = KServiceGroup::group( path ); if ( !category || !category->isValid() ) return; KServiceGroup::List list = category->entries( true, true ); KServiceGroup::List::ConstIterator it = list.begin(); for ( ; it != list.end(); ++it ) { KSycocaEntry *p = ( *it ); if ( p->isType( KST_KService ) ) { // KCModuleInfo(KService*) KCModuleInfo *minfo = new KCModuleInfo( static_cast<KService*>( p ) ); if ( minfo->icon() ) _icon = DesktopIcon( minfo->icon(), KIcon::SizeLarge ); TIconViewItem* _item = new TIconViewItem( this, minfo->moduleName(), _icon, minfo ); connect( this, SIGNAL( executed( QIconViewItem* ) ), this, SLOT( slotItemSelected( QIconViewItem* ) ) ); } // ignore second level subGroups! }
QString KCGlobal::baseGroup() { if ( _baseGroup.isEmpty() ) { KServiceGroup::Ptr group = KServiceGroup::baseGroup( _infocenter ? "info" : "settings" ); if (group) { _baseGroup = group->relPath(); kdDebug(1208) << "Found basegroup = " << _baseGroup << endl; return _baseGroup; } // Compatibility with old behaviour, in case of missing .directory files. if (_baseGroup.isEmpty()) { if (_infocenter) { kdWarning() << "No K menu group with X-KDE-BaseGroup=info found ! Defaulting to Settings/Information/" << endl; _baseGroup = QString::fromLatin1("Settings/Information/"); } else { kdWarning() << "No K menu group with X-KDE-BaseGroup=settings found ! Defaulting to Settings/" << endl; _baseGroup = QString::fromLatin1("Settings/"); } } } return _baseGroup; }
void ApplicationsProtocol::listDir(const KUrl& url) { QString groupPath = url.path( KUrl::AddTrailingSlash ); groupPath.remove(0, 1); // remove starting '/' KServiceGroup::Ptr grp = KServiceGroup::group(groupPath); if (!grp || !grp->isValid()) { error(KIO::ERR_DOES_NOT_EXIST, groupPath); return; } unsigned int count = 0; KIO::UDSEntry entry; foreach (const KSycocaEntry::Ptr &e, grp->entries(true, true)) { if (e->isType(KST_KServiceGroup)) { KServiceGroup::Ptr g(KServiceGroup::Ptr::staticCast(e)); QString groupCaption = g->caption(); kDebug() << "ADDING SERVICE GROUP WITH PATH " << g->relPath(); // Avoid adding empty groups. KServiceGroup::Ptr subMenuRoot = KServiceGroup::group(g->relPath()); if (subMenuRoot->childCount() == 0) continue; // Ignore dotfiles. if ((g->name().at(0) == '.')) continue; QString relPath = g->relPath(); KUrl dirUrl = url; // preserve protocol, whether that's programs:/ or applications:/ dirUrl.setPath('/' + relPath); dirUrl.adjustPath(KUrl::RemoveTrailingSlash); kDebug() << "ApplicationsProtocol: adding entry" << dirUrl; createDirEntry(entry, groupCaption, dirUrl.url(), "inode/directory", g->icon()); } else { KService::Ptr service(KService::Ptr::staticCast(e)); kDebug() << "the entry name is" << service->desktopEntryName() << "with path" << service->entryPath(); if (!service->isApplication()) // how could this happen? continue; createFileEntry(entry, service, url); } listEntry(entry, false); count++; } totalSize(count); listEntry(entry, true); finished(); }
AppGroupEntry::AppGroupEntry(KServiceGroup::Ptr group, AppsModel *parentModel, bool flat, int appNameFormat) { m_name = group->caption(); m_icon = QIcon::fromTheme(group->icon(), QIcon::fromTheme("unknown")); AppsModel* model = new AppsModel(group->entryPath(), flat, parentModel); model->setAppletInterface(parentModel->appletInterface()); model->setAppNameFormat(appNameFormat); m_model = model; QObject::connect(parentModel, SIGNAL(appletInterfaceChanged(QObject*)), model, SLOT(setAppletInterface(QObject*))); QObject::connect(parentModel, SIGNAL(refreshing()), m_model, SLOT(deleteLater())); QObject::connect(m_model, SIGNAL(appLaunched(QString)), parentModel, SIGNAL(appLaunched(QString))); }
void NavigatorAppItem::populate(bool recursive) { if(mPopulated) return; KServiceGroup::Ptr root = KServiceGroup::group(mRelpath); if(!root) { kdWarning() << "No Service groups\n"; return; } KServiceGroup::List list = root->entries(); for(KServiceGroup::List::ConstIterator it = list.begin(); it != list.end(); ++it) { KSycocaEntry *e = *it; KService::Ptr s; NavigatorItem *item; KServiceGroup::Ptr g; QString url; switch(e->sycocaType()) { case KST_KService: { s = static_cast< KService * >(e); url = documentationURL(s); if(!url.isEmpty()) { DocEntry *entry = new DocEntry(s->name(), url, s->icon()); item = new NavigatorItem(entry, this); item->setAutoDeleteDocEntry(true); item->setExpandable(true); } break; } case KST_KServiceGroup: { g = static_cast< KServiceGroup * >(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; } } sortChildItems(0, true /* 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 PanelAddButtonMenu::slotExec(int id) { if(!entryMap_.contains(id)) return; KSycocaEntry *e = entryMap_[id]; if(e->isType(KST_KServiceGroup)) { KServiceGroup::Ptr g = static_cast< KServiceGroup * >(e); containerArea->addServiceMenuButton(g->relPath()); } else if(e->isType(KST_KService)) { KService::Ptr service = static_cast< KService * >(e); containerArea->addServiceButton(service->desktopEntryPath()); } }
AppGroupEntry::AppGroupEntry(AppsModel *parentModel, KServiceGroup::Ptr group, bool flat, bool separators, int appNameFormat) : AbstractGroupEntry(parentModel) { m_name = group->caption(); m_icon = QIcon::fromTheme(group->icon(), QIcon::fromTheme("unknown")); AppsModel* model = new AppsModel(group->entryPath(), flat, separators, parentModel); model->setAppNameFormat(appNameFormat); m_childModel = model; QObject::connect(parentModel, &AppsModel::cleared, model, &AppsModel::deleteLater); QObject::connect(model, &AppsModel::countChanged, [parentModel, this] { if (parentModel) { parentModel->entryChanged(this); } } ); QObject::connect(model, &AppsModel::hiddenEntriesChanged, [parentModel, this] { if (parentModel) { parentModel->entryChanged(this); } } ); }
void TIconView::setCategory( const QString& path ) { clear(); QPixmap _icon = DesktopIcon( "go", KIcon::SizeMedium ); // defaultIcon KServiceGroup::Ptr category = KServiceGroup::group( path ); if ( !category || !category->isValid() ) return; TIconViewItem *_item; KServiceGroup::List list = category->entries( true, true ); KServiceGroup::List::ConstIterator it = list.begin(); KServiceGroup::List::ConstIterator end = list.end(); for ( ; it != end; ++it ) { KSycocaEntry *p = ( *it ); if ( p->isType( KST_KService ) ) { // KCModuleInfo(KService*) KCModuleInfo *minfo = new KCModuleInfo( static_cast<KService*>( p ) ); if (showExtras == false) { KSimpleConfig cfg(minfo->fileName()); cfg.setDesktopGroup(); if ( cfg.readEntry("Categories").contains("X-KDE-tasma-extra") ) continue; } if ( minfo->icon() ) _icon = DesktopIcon( minfo->icon(), KIcon::SizeLarge ); _item = new TIconViewItem( this, minfo->moduleName(), _icon, minfo , minfo->comment()); } // ignore second level subGroups! } list.clear(); }
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; }
static void findMenuEntry(KServiceGroup::Ptr parent, const QString &name, const QString &menuId) { KServiceGroup::List list = parent->entries(true, true, false); KServiceGroup::List::ConstIterator it = list.begin(); for (; it != list.end(); ++it) { KSycocaEntry * e = *it; if (e->isType(KST_KServiceGroup)) { KServiceGroup::Ptr g(static_cast<KServiceGroup *>(e)); findMenuEntry(g, name.isEmpty() ? g->caption() : name+"/"+g->caption(), menuId); } else if (e->isType(KST_KService)) { KService::Ptr s(static_cast<KService *>(e)); if (s->menuId() == menuId) { if (bPrintMenuId) { result(parent->relPath()); } if (bPrintMenuName) { result(name); } if (bHighlight) { DCOPRef kicker( "kicker", "kicker" ); bool result = kicker.call( "highlightMenuItem", menuId ); if (!result) error(3, i18n("Menu item '%1' could not be highlighted.").arg(menuId).local8Bit()); } exit(0); } } } }
void ModuleTreeItem::setGroup(const QString &path) { KServiceGroup::Ptr group = KServiceGroup::group(path); QString defName = path.left(path.length()-1); int pos = defName.findRev('/'); if (pos >= 0) defName = defName.mid(pos+1); if (group && group->isValid()) { _icon = group->icon(); setPixmap(0, appIcon(_icon)); setText(0, " " + group->caption()); setTag(defName); setCaption(group->caption()); } else { // Should not happen: Installation problem // Let's try to fail softly. setText(0, " " + defName); setTag(defName); } }
void TreeView::readMenuFolderInfo(MenuFolderInfo *folderInfo, KServiceGroup::Ptr folder, const QString &prefix) { if (!folderInfo) { folderInfo = m_rootFolder; if (m_controlCenter) folder = KServiceGroup::baseGroup("settings"); else folder = KServiceGroup::root(); } if (!folder || !folder->isValid()) return; folderInfo->caption = folder->caption(); folderInfo->comment = folder->comment(); // Item names may contain ampersands. To avoid them being converted // to accelerators, replace them with two ampersands. folderInfo->hidden = folder->noDisplay(); folderInfo->directoryFile = folder->directoryEntryPath(); folderInfo->icon = folder->icon(); QString id = folder->relPath(); int i = id.lastIndexOf('/', -2); id = id.mid(i+1); folderInfo->id = id; folderInfo->fullId = prefix + id; foreach(const KSycocaEntry::Ptr &e, folder->entries(true, !m_showHidden, true, m_detailedMenuEntries && !m_detailedEntriesNamesFirst)) { if (e->isType(KST_KServiceGroup)) { KServiceGroup::Ptr g(KServiceGroup::Ptr::staticCast(e)); MenuFolderInfo *subFolderInfo = new MenuFolderInfo(); readMenuFolderInfo(subFolderInfo, g, folderInfo->fullId); folderInfo->add(subFolderInfo, true); } else if (e->isType(KST_KService)) { folderInfo->add(new MenuEntryInfo(KService::Ptr::staticCast(e)), true); } else if (e->isType(KST_KServiceSeparator)) { folderInfo->add(m_separator, true); } } }
AppGroupEntry::AppGroupEntry(AppsModel *parentModel, KServiceGroup::Ptr group, bool paginate, int pageSize, bool flat, bool sorted, bool separators, int appNameFormat) : AbstractGroupEntry(parentModel), m_group(group) { AppsModel* model = new AppsModel(group->entryPath(), paginate, pageSize, flat, sorted, separators, parentModel); model->setAppNameFormat(appNameFormat); m_childModel = model; QObject::connect(parentModel, &AppsModel::cleared, model, &AppsModel::deleteLater); QObject::connect(model, &AppsModel::countChanged, [parentModel, this] { if (parentModel) { parentModel->entryChanged(this); } } ); QObject::connect(model, &AppsModel::hiddenEntriesChanged, [parentModel, this] { if (parentModel) { parentModel->entryChanged(this); } } ); }
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(); }