static KDesktopFile *copyDesktopFile(MenuEntryInfo *entryInfo, QString *menuId, QStringList *excludeList) { QString result = createDesktopFile(entryInfo->file(), menuId, excludeList); KDesktopFile *df = entryInfo->desktopFile()->copyTo(result); df->desktopGroup().deleteEntry("Categories"); // Don't set any categories! return df; }
bool ItemHandle::createMenuEntry() { gcString tmpPath = createDesktopFile(getItemInfo()); // just in case we pass --novendor to xdg-desktop-menu, so games without a proper publisher entry will accepted std::ostringstream cmd; cmd << "xdg-desktop-menu install --novendor \"" << tmpPath.c_str() << '"'; bool result = system(cmd.str().c_str()) == 0; // if something is going wrong, we don't delete the created desktop file if (result) UTIL::FS::delFile(tmpPath); else { Msg("Desktop file could not be installed.\n"); Msg(gcString("The file is located here: {0}\n", tmpPath)); } return result; }
void TreeView::slotDropped (QDropEvent * e, Q3ListViewItem *parent, Q3ListViewItem*after) { if(!e) return; // get destination folder TreeItem *parentItem = static_cast<TreeItem*>(parent); QString folder = parentItem ? parentItem->directory() : QString(); MenuFolderInfo *parentFolderInfo = parentItem ? parentItem->folderInfo() : m_rootFolder; if (e->source() != this) { // External drop KUrl::List urls; if (!K3URLDrag::decode(e, urls) || (urls.count() != 1) || !urls[0].isLocalFile()) return; QString path = urls[0].path(); if (!path.endsWith(".desktop")) return; QString menuId; QString result = createDesktopFile(path, &menuId, &m_newMenuIds); KDesktopFile orig_df(path); KDesktopFile *df = orig_df.copyTo(result); df->desktopGroup().deleteEntry("Categories"); // Don't set any categories! KService::Ptr s(new KService(df)); s->setMenuId(menuId); MenuEntryInfo *entryInfo = new MenuEntryInfo(s, df); QString oldCaption = entryInfo->caption; QString newCaption = parentFolderInfo->uniqueItemCaption(oldCaption, oldCaption); entryInfo->setCaption(newCaption); // Add file to menu // m_menuFile->addEntry(folder, menuId); m_menuFile->pushAction(MenuFile::ADD_ENTRY, folder, menuId); // create the TreeItem if(parentItem) parentItem->setOpen(true); // update fileInfo data parentFolderInfo->add(entryInfo); TreeItem *newItem = createTreeItem(parentItem, after, entryInfo, true); setSelected ( newItem, true); itemSelected( newItem); m_drag = 0; setLayoutDirty(parentItem); return; } // is there content in the clipboard? if (!m_drag) return; if (m_dragItem == after) return; // Nothing to do int command = m_drag; if (command == MOVE_FOLDER) { MenuFolderInfo *folderInfo = m_dragInfo; if (e->action() == QDropEvent::Copy) { // Ugh.. this is hard :) // * Create new .directory file // Add } else { TreeItem *tmpItem = static_cast<TreeItem*>(parentItem); while ( tmpItem ) { if ( tmpItem == m_dragItem ) { m_drag = 0; return; } tmpItem = static_cast<TreeItem*>(tmpItem->parent() ); } // Remove MenuFolderInfo TreeItem *oldParentItem = static_cast<TreeItem*>(m_dragItem->parent()); MenuFolderInfo *oldParentFolderInfo = oldParentItem ? oldParentItem->folderInfo() : m_rootFolder; oldParentFolderInfo->take(folderInfo); // Move menu QString oldFolder = folderInfo->fullId; QString folderName = folderInfo->id; QString newFolder = m_menuFile->uniqueMenuName(folder, folderName, parentFolderInfo->existingMenuIds()); folderInfo->id = newFolder; // Add file to menu //m_menuFile->moveMenu(oldFolder, folder + newFolder); m_menuFile->pushAction(MenuFile::MOVE_MENU, oldFolder, folder + newFolder); // Make sure caption is unique QString newCaption = parentFolderInfo->uniqueMenuCaption(folderInfo->caption); if (newCaption != folderInfo->caption) { folderInfo->setCaption(newCaption); } // create the TreeItem if(parentItem) parentItem->setOpen(true); // update fileInfo data folderInfo->updateFullId(parentFolderInfo->fullId); folderInfo->setInUse(true); parentFolderInfo->add(folderInfo); if ((parentItem != oldParentItem) || !after) { if (oldParentItem) oldParentItem->takeItem(m_dragItem); else takeItem(m_dragItem); if (parentItem) parentItem->insertItem(m_dragItem); else insertItem(m_dragItem); } m_dragItem->moveItem(after); m_dragItem->setName(folderInfo->caption); m_dragItem->setDirectoryPath(folderInfo->fullId); setSelected(m_dragItem, true); itemSelected(m_dragItem); } } else if (command == MOVE_FILE) { MenuEntryInfo *entryInfo = m_dragItem->entryInfo(); QString menuId = entryInfo->menuId(); if (e->action() == QDropEvent::Copy) { // Need to copy file and then add it KDesktopFile *df = copyDesktopFile(entryInfo, &menuId, &m_newMenuIds); // Duplicate //UNDO-ACTION: NEW_MENU_ID (menuId) KService::Ptr s(new KService(df)); s->setMenuId(menuId); entryInfo = new MenuEntryInfo(s, df); QString oldCaption = entryInfo->caption; QString newCaption = parentFolderInfo->uniqueItemCaption(oldCaption, oldCaption); entryInfo->setCaption(newCaption); } else { del(m_dragItem, false); QString oldCaption = entryInfo->caption; QString newCaption = parentFolderInfo->uniqueItemCaption(oldCaption); entryInfo->setCaption(newCaption); entryInfo->setInUse(true); } // Add file to menu // m_menuFile->addEntry(folder, menuId); m_menuFile->pushAction(MenuFile::ADD_ENTRY, folder, menuId); // create the TreeItem if(parentItem) parentItem->setOpen(true); // update fileInfo data parentFolderInfo->add(entryInfo); TreeItem *newItem = createTreeItem(parentItem, after, entryInfo, true); setSelected ( newItem, true); itemSelected( newItem); } else if (command == COPY_SEPARATOR) { if (e->action() != QDropEvent::Copy) del(m_dragItem, false); TreeItem *newItem = createTreeItem(parentItem, after, m_separator, true); setSelected ( newItem, true); itemSelected( newItem); } else { // Error } m_drag = 0; setLayoutDirty(parentItem); }
void TreeView::newitem() { TreeItem *parentItem = 0; TreeItem *item = (TreeItem*)selectedItem(); bool ok; QString caption = KInputDialog::getText( i18n( "New Item" ), i18n( "Item name:" ), QString(), &ok, this ); if (!ok) return; QString menuId; QString file = caption; file.replace('/', '-'); file = createDesktopFile(file, &menuId, &m_newMenuIds); // Create KDesktopFile *df = new KDesktopFile(file); KConfigGroup desktopGroup = df->desktopGroup(); desktopGroup.writeEntry("Name", caption); desktopGroup.writeEntry("Type", "Application"); // get destination folder QString folder; if(!item) { parentItem = 0; folder.clear(); } else if(item->isDirectory()) { parentItem = item; item = 0; folder = parentItem->directory(); } else { parentItem = static_cast<TreeItem*>(item->parent()); folder = parentItem ? parentItem->directory() : QString(); } MenuFolderInfo *parentFolderInfo = parentItem ? parentItem->folderInfo() : m_rootFolder; // Add file to menu // m_menuFile->addEntry(folder, menuId); m_menuFile->pushAction(MenuFile::ADD_ENTRY, folder, menuId); KService::Ptr s(new KService(df)); s->setMenuId(menuId); MenuEntryInfo *entryInfo = new MenuEntryInfo(s, df); // create the TreeItem if(parentItem) parentItem->setOpen(true); // update fileInfo data parentFolderInfo->add(entryInfo); TreeItem *newItem = createTreeItem(parentItem, item, entryInfo, true); setSelected ( newItem, true); itemSelected( newItem); setLayoutDirty(parentItem); }