void DolphinContextMenu::openTrashContextMenu() { Q_ASSERT(m_context & TrashContext); QAction* emptyTrashAction = new QAction(QIcon::fromTheme(QStringLiteral("trash-empty")), i18nc("@action:inmenu", "Empty Trash"), this); KConfig trashConfig(QStringLiteral("trashrc"), KConfig::SimpleConfig); emptyTrashAction->setEnabled(!trashConfig.group("Status").readEntry("Empty", true)); addAction(emptyTrashAction); addCustomActions(); QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties")); addAction(propertiesAction); addShowMenuBarAction(); if (exec(m_pos) == emptyTrashAction) { KIO::JobUiDelegate uiDelegate; uiDelegate.setWindow(m_mainWindow); if (uiDelegate.askDeleteConfirmation(QList<QUrl>(), KIO::JobUiDelegate::EmptyTrash, KIO::JobUiDelegate::DefaultConfirmation)) { KIO::Job* job = KIO::emptyTrash(); KJobWidgets::setWindow(job, m_mainWindow); job->ui()->setAutoErrorHandlingEnabled(true); } } }
static QVariantMap createEmptyTrashItem() { QVariantMap map = createActionItem( i18nc("@action:inmenu", "Empty Trash"), "_homerun_fileItem_emptyTrash"); map["icon"] = KIcon("trash-empty"); KConfig trashConfig("trashrc", KConfig::SimpleConfig); const bool isEmpty = trashConfig.group("Status").readEntry("Empty", true); map["enabled"] = !isEmpty; return map; }
static QString iconFromDesktopFile(const QString &path) { KDesktopFile cfg(path); const QString icon = cfg.readIcon(); if (cfg.hasLinkType()) { const KConfigGroup group = cfg.desktopGroup(); const QString emptyIcon = group.readEntry("EmptyIcon"); const QString type = cfg.readPath(); if (!emptyIcon.isEmpty()) { const QString u = cfg.readUrl(); const QUrl url(u); if (url.scheme() == QLatin1String("trash")) { // We need to find if the trash is empty, preferably without using a KIO job. // So instead kio_trash leaves an entry in its config file for us. KConfig trashConfig(QStringLiteral("trashrc"), KConfig::SimpleConfig); if (trashConfig.group("Status").readEntry("Empty", true)) { return emptyIcon; } } } } return icon; }
bool KrTrashHandler::isTrashEmpty() { KConfig trashConfig("trashrc"); KConfigGroup cfg(&trashConfig, "Status"); return cfg.readEntry("Empty", false); }
void IconView::init() { KConfig config; KConfigGroup generalGroup( &config, "General" ); m_wallpaper = generalGroup.readEntry( "Wallpaper", DEFAULT_WALLPAPER ); delete m_pixmap; m_pixmap = new QPixmap( m_wallpaper ); QPalette p; p.setBrush( QPalette::Base, QBrush( *m_pixmap ) ); setPalette( p ); m_model = new KDirModel( this ); KDirLister* lister = new KDirLister( this ); lister->openUrl( KUrl( QDir::homePath() ) ); m_model->setDirLister( lister ); m_delegate = new KFileItemDelegate( this ); m_delegate->setMaximumSize( QSize( 64, 64 ) ); m_delegate->setShadowOffset( QPointF( 1, 1 ) ); m_delegate->setShadowColor( QColor( 0xff, 0xff, 0xff ) ); m_delegate->setShadowBlur( 1 ); m_delegate->setWrapMode( QTextOption::WrapAtWordBoundaryOrAnywhere ); m_proxyModel = new KDirSortFilterProxyModel( this ); m_proxyModel->setSourceModel( m_model ); setModel( m_proxyModel ); setItemDelegate( m_delegate ); m_selectionModel = new QItemSelectionModel( m_proxyModel ); setSelectionModel( m_selectionModel ); /// create actions KAction* cut = KStandardAction::cut( this, SLOT(cut()), this ); KAction* copy = KStandardAction::copy( this, SLOT(copy()), this ); KIO::FileUndoManager* manager = KIO::FileUndoManager::self(); KAction* undo = KStandardAction::undo( manager, SLOT(undo()), this ); connect( manager, SIGNAL(undoAvailable(bool)), undo, SLOT(setEnabled(bool)) ); connect( manager, SIGNAL(undoTextChanged(const QString&)), SLOT(undoTextChanged(const QString&)) ); undo->setEnabled( manager->undoAvailable() ); KAction* paste = KStandardAction::paste( this, SLOT(paste()), this ); KAction* pasteTo = KStandardAction::paste( this, SLOT(pasteTo()), this ); pasteTo->setEnabled( false ); // Only enabled during popupMenu() QString actionText = KIO::pasteActionText(); if ( !actionText.isEmpty() ) paste->setText( actionText ); else paste->setEnabled( false ); KAction* refresh = new KAction(KIcon("user-desktop"), i18n("&Refresh Desktop"), this); connect( refresh, SIGNAL(triggered()), this, SLOT(refresh()) ); KAction* wallpaper = new KAction(KIcon("tools-wizard"), i18n("&Change Wallpaper..."), this); connect( wallpaper, SIGNAL(triggered()), this, SLOT(changeWallpaper()) ); KAction* rename = new KAction(KIcon("edit-rename"), i18n("&Rename"), this); rename->setShortcut( Qt::Key_F2 ); connect( rename, SIGNAL(triggered()), SLOT(rename()) ); KAction* trash = new KAction(KIcon("user-trash"), i18n("&Move to Trash"), this); trash->setShortcut( Qt::Key_Delete ); connect( trash, SIGNAL(triggered(Qt::MouseButtons, Qt::KeyboardModifiers)), this, SLOT(moveToTrash(Qt::MouseButtons, Qt::KeyboardModifiers)) ); KAction* del = new KAction(KIcon("edit-delete"), i18n("&Delete"), this); del->setShortcut( Qt::SHIFT + Qt::Key_Delete ); connect( del, SIGNAL(triggered()), this, SLOT(deleteSelectedItems()) ); KAction* emptyTrash = new KAction(KIcon("trash-empty"), i18n("&Empty Trash Bin"), this); KConfig trashConfig( "trashrc", KConfig::SimpleConfig ); emptyTrash->setEnabled( !trashConfig.group( "Status" ).readEntry( "Empty", true ) ); connect( emptyTrash, SIGNAL(triggered()), this, SLOT(emptyTrashBin()) ); // Create the new menu m_newMenu = new KNewFileMenu(&m_actionCollection, "new_menu", this); connect( m_newMenu->menu(), SIGNAL(aboutToShow()), this, SLOT(aboutToShowCreateNew()) ); m_actionCollection.addAction( "undo", undo ); m_actionCollection.addAction( "cut", cut ); m_actionCollection.addAction( "copy", copy ); m_actionCollection.addAction( "paste", paste ); m_actionCollection.addAction( "pasteto", pasteTo ); m_actionCollection.addAction( "refresh", refresh ); m_actionCollection.addAction( "wallpaper", wallpaper ); m_actionCollection.addAction( "rename", rename ); m_actionCollection.addAction( "trash", trash ); m_actionCollection.addAction( "del", del ); m_actionCollection.addAction( "empty_trash", emptyTrash ); }
void KonqPopupMenuPrivate::init(KonqPopupMenu::Flags kpf, KParts::BrowserExtension::PopupFlags flags) { m_itemFlags = flags; q->setFont(KGlobalSettings::menuFont()); Q_ASSERT(m_popupItemProperties.items().count() >= 1); bool bTrashIncluded = false; const KFileItemList lstItems = m_popupItemProperties.items(); KFileItemList::const_iterator it = lstItems.constBegin(); const KFileItemList::const_iterator kend = lstItems.constEnd(); for ( ; it != kend; ++it ) { const KUrl url = (*it).url(); if ( !bTrashIncluded && ( ( url.protocol() == "trash" && url.path().length() <= 1 ) ) ) { bTrashIncluded = true; } } const bool isDirectory = m_popupItemProperties.isDirectory(); const bool sReading = m_popupItemProperties.supportsReading(); bool sDeleting = (m_itemFlags & KParts::BrowserExtension::NoDeletion) == 0 && m_popupItemProperties.supportsDeleting(); const bool sWriting = m_popupItemProperties.supportsWriting(); const bool sMoving = sDeleting && m_popupItemProperties.supportsMoving(); const bool isLocal = m_popupItemProperties.isLocal(); KUrl url = m_sViewURL; url.cleanPath(); bool isTrashLink = false; bool isCurrentTrash = false; bool currentDir = false; bool isSymLink = false; bool isSymLinkInSameDir = false; // true for "ln -s foo bar", false for links to foo/sub or /foo //check if url is current directory if ( lstItems.count() == 1 ) { KFileItem firstPopupItem( lstItems.first() ); if (firstPopupItem.isLink()) { isSymLink = true; isSymLinkInSameDir = !firstPopupItem.linkDest().contains('/'); } KUrl firstPopupURL( firstPopupItem.url() ); firstPopupURL.cleanPath(); //kDebug(1203) << "View path is " << url.url(); //kDebug(1203) << "First popup path is " << firstPopupURL.url(); currentDir = firstPopupURL.equals( url, KUrl::CompareWithoutTrailingSlash ); if ( firstPopupItem.isDesktopFile() ) { KDesktopFile desktopFile( firstPopupItem.localPath() ); const KConfigGroup cfg = desktopFile.desktopGroup(); isTrashLink = ( cfg.readEntry("Type") == "Link" && cfg.readEntry("URL") == "trash:/" ); } if (isTrashLink) { sDeleting = false; } // isCurrentTrash: popup on trash:/ itself, or on the trash.desktop link isCurrentTrash = (firstPopupURL.protocol() == "trash" && firstPopupURL.path().length() <= 1) || isTrashLink; } const bool isIntoTrash = (url.protocol() == "trash") && !isCurrentTrash; // trashed file, not trash:/ itself const bool bIsLink = (m_itemFlags & KParts::BrowserExtension::IsLink); //kDebug() << "isLocal=" << isLocal << " url=" << url << " isCurrentTrash=" << isCurrentTrash << " isIntoTrash=" << isIntoTrash << " bTrashIncluded=" << bTrashIncluded; ////////////////////////////////////////////////////////////////////////// addGroup( "topactions" ); // used e.g. for ShowMenuBar. includes a separator at the end KAction * act; KAction *actNewWindow = 0; #if 0 // TODO in the desktop code itself. if (( flags & KParts::BrowserExtension::ShowProperties ) && isOnDesktop && !KAuthorized::authorizeKAction("editable_desktop_icons")) { flags &= ~KParts::BrowserExtension::ShowProperties; // remove flag } #endif // Either 'newview' is in the actions we're given (probably in the tabhandling group) // or we need to insert it ourselves (e.g. for the desktop). // In the first case, actNewWindow must remain 0. if ( ((kpf & KonqPopupMenu::ShowNewWindow) != 0) && sReading ) { const QString openStr = i18n("&Open"); actNewWindow = new KAction(m_parentWidget /*for status tips*/); m_ownActions.append(actNewWindow); actNewWindow->setIcon( KIcon("window-new") ); actNewWindow->setText( openStr ); QObject::connect(actNewWindow, SIGNAL(triggered()), q, SLOT(slotPopupNewView())); } if ( isDirectory && sWriting && !isCurrentTrash ) // A dir, and we can create things into it { const bool mkdirRequested = m_itemFlags & KParts::BrowserExtension::ShowCreateDirectory; if ( (currentDir || mkdirRequested) && m_pMenuNew ) // Current dir -> add the "new" menu { // As requested by KNewFileMenu : m_pMenuNew->checkUpToDate(); m_pMenuNew->setPopupFiles(m_popupItemProperties.urlList()); q->addAction( m_pMenuNew ); q->addSeparator(); } else if (mkdirRequested) { KAction *actNewDir = new KAction(m_parentWidget); m_ownActions.append(actNewDir); actNewDir->setIcon( KIcon("folder-new") ); actNewDir->setText( i18n( "Create &Folder..." ) ); QObject::connect(actNewDir, SIGNAL(triggered()), q, SLOT(slotPopupNewDir())); q->addAction( actNewDir ); q->addSeparator(); } } else if ( isIntoTrash ) { // Trashed item, offer restoring act = new KAction(m_parentWidget /*for status tips*/); m_ownActions.append(act); act->setText( i18n( "&Restore" ) ); act->setHelpText(i18n("Restores this file or directory, back to the location where it was deleted from initially")); QObject::connect(act, SIGNAL(triggered()), q, SLOT(slotPopupRestoreTrashedItems())); q->addAction(act); } if (m_itemFlags & KParts::BrowserExtension::ShowNavigationItems) { if (m_itemFlags & KParts::BrowserExtension::ShowUp) addNamedAction( "go_up" ); addNamedAction( "go_back" ); addNamedAction( "go_forward" ); if (m_itemFlags & KParts::BrowserExtension::ShowReload) addNamedAction( "reload" ); q->addSeparator(); } if (!currentDir && isSymLink && !isSymLinkInSameDir) { // #65151: offer to open the target's parent dir act = new KAction(m_parentWidget); m_ownActions.append(act); act->setText(isDirectory ? i18n("Show Original Directory") : i18n("Show Original File")); act->setHelpText(i18n("Opens a new file manager window showing the target of this link, in its parent directory.")); QObject::connect(act, SIGNAL(triggered()), q, SLOT(slotShowOriginalFile())); q->addAction(act); } // "open in new window" is either provided by us, or by the tabhandling group if (actNewWindow) { q->addAction(actNewWindow); q->addSeparator(); } addGroup( "tabhandling" ); // includes a separator at the end if (m_itemFlags & KParts::BrowserExtension::ShowUrlOperations) { if ( !currentDir && sReading ) { if ( sDeleting ) { addNamedAction( "cut" ); } addNamedAction( "copy" ); } if ( isDirectory && sWriting ) { if ( currentDir ) addNamedAction( "paste" ); else addNamedAction( "pasteto" ); } } if ( isCurrentTrash ) { act = new KAction(m_parentWidget); m_ownActions.append(act); act->setIcon( KIcon("trash-empty") ); act->setText( i18n( "&Empty Trash Bin" ) ); KConfig trashConfig( "trashrc", KConfig::SimpleConfig); act->setEnabled( !trashConfig.group("Status").readEntry( "Empty", true ) ); QObject::connect(act, SIGNAL(triggered()), q, SLOT(slotPopupEmptyTrashBin())); q->addAction(act); } if ( isCurrentTrash ) { act = new KAction(m_parentWidget); m_ownActions.append(act); act->setIcon( KIcon("trash-empty") ); act->setText( i18n( "&Configure Trash Bin" ) ); QObject::connect(act, SIGNAL(triggered()), q, SLOT(slotConfigTrashBin())); q->addAction(act); } // This is used by KHTML, see khtml_popupmenu.rc (copy, selectAll, searchProvider etc.) // and by DolphinPart (rename, trash, delete) addGroup( "editactions" ); if (m_itemFlags & KParts::BrowserExtension::ShowTextSelectionItems) { // OK, we have to stop here. // Anything else that is provided by the part addGroup( "partactions" ); return; } if ( !isCurrentTrash && !isIntoTrash && (m_itemFlags & KParts::BrowserExtension::ShowBookmark)) { QString caption; if (currentDir) { const bool httpPage = m_sViewURL.protocol().startsWith("http", Qt::CaseInsensitive); if (httpPage) caption = i18n("&Bookmark This Page"); else caption = i18n("&Bookmark This Location"); } else if (isDirectory) caption = i18n("&Bookmark This Folder"); else if (bIsLink) caption = i18n("&Bookmark This Link"); else caption = i18n("&Bookmark This File"); act = new KAction(m_parentWidget); m_ownActions.append(act); act->setObjectName( QLatin1String("bookmark_add" )); // for unittest act->setIcon( KIcon("bookmark-new") ); act->setText( caption ); QObject::connect(act, SIGNAL(triggered()), q, SLOT(slotPopupAddToBookmark())); if (lstItems.count() > 1) act->setEnabled(false); if (KAuthorized::authorizeKAction("bookmarks")) q->addAction( act ); if (bIsLink) addGroup( "linkactions" ); // see khtml } // "Open With" actions m_menuActions.setItemListProperties(m_popupItemProperties); if ( sReading ) { m_menuActions.addOpenWithActionsTo(q, "DesktopEntryName != 'kfmclient' and DesktopEntryName != 'kfmclient_dir' and DesktopEntryName != 'kfmclient_html'"); QList<QAction *> previewActions = m_actionGroups.value("preview"); if (!previewActions.isEmpty()) { if (previewActions.count() == 1) { q->addAction(previewActions.first()); } else { QMenu* subMenu = new QMenu(i18n("Preview In"), q); subMenu->menuAction()->setObjectName( QLatin1String("preview_submenu" )); // for the unittest q->addMenu(subMenu); subMenu->addActions(previewActions); } } } // Second block, builtin + user m_menuActions.addServiceActionsTo(q); q->addSeparator(); // Use the Dolphin setting for showing the "Copy To" and "Move To" actions KSharedConfig::Ptr dolphin = KSharedConfig::openConfig("dolphinrc"); // CopyTo/MoveTo menus if (m_itemFlags & KParts::BrowserExtension::ShowUrlOperations && KConfigGroup(dolphin, "General").readEntry("ShowCopyMoveMenu", false)) { m_copyToMenu.setItems(lstItems); m_copyToMenu.setReadOnly(sMoving == false); m_copyToMenu.addActionsTo(q); q->addSeparator(); } if (!isCurrentTrash && !isIntoTrash && sReading && (kpf & KonqPopupMenu::NoPlugins) == 0) { addPlugins(); // now it's time to add plugins } if ( (m_itemFlags & KParts::BrowserExtension::ShowProperties) && KPropertiesDialog::canDisplay( lstItems ) ) { act = new KAction(m_parentWidget); m_ownActions.append(act); act->setObjectName( QLatin1String("properties" )); // for unittest act->setText( i18n( "&Properties" ) ); QObject::connect(act, SIGNAL(triggered()), q, SLOT(slotPopupProperties())); q->addAction(act); } while ( !q->actions().isEmpty() && q->actions().last()->isSeparator() ) delete q->actions().last(); if ( isDirectory && isLocal ) { if ( KFileShare::authorization() == KFileShare::Authorized ) { q->addSeparator(); act = new KAction(m_parentWidget); m_ownActions.append(act); act->setText( i18n("Share") ); QObject::connect(act, SIGNAL(triggered()), q, SLOT(slotOpenShareFileDialog())); q->addAction(act); } } // Anything else that is provided by the part addGroup( "partactions" ); }
void PopupView::createActions() { // Remove the Shift+Delete shortcut from the cut action, since it's used for deleting files KAction *cut = KStandardAction::cut(this, SLOT(cut()), this); KShortcut cutShortCut = cut->shortcut(); cutShortCut.remove(Qt::SHIFT + Qt::Key_Delete); cut->setShortcut(cutShortCut); KAction *copy = KStandardAction::copy(this, SLOT(copy()), this); KIO::FileUndoManager *manager = KIO::FileUndoManager::self(); KAction *undo = KStandardAction::undo(manager, SLOT(undo()), this); connect(manager, SIGNAL(undoAvailable(bool)), undo, SLOT(setEnabled(bool))); connect(manager, SIGNAL(undoTextChanged(QString)), SLOT(undoTextChanged(QString))); undo->setEnabled(manager->undoAvailable()); KAction *paste = KStandardAction::paste(this, SLOT(paste()), this); KAction *pasteTo = KStandardAction::paste(this, SLOT(pasteTo()), this); pasteTo->setEnabled(false); // Only enabled during popupMenu() QString actionText = KIO::pasteActionText(); if (!actionText.isEmpty()) { paste->setText(actionText); } else { paste->setEnabled(false); } KAction *rename = new KAction(KIcon("edit-rename"), i18n("&Rename"), this); rename->setShortcut(Qt::Key_F2); connect(rename, SIGNAL(triggered()), SLOT(renameSelectedIcon())); KAction *trash = new KAction(KIcon("user-trash"), i18n("&Move to Trash"), this); trash->setShortcut(Qt::Key_Delete); connect(trash, SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)), SLOT(moveToTrash(Qt::MouseButtons,Qt::KeyboardModifiers))); KAction *emptyTrash = new KAction(KIcon("trash-empty"), i18n("&Empty Trash Bin"), this); KConfig trashConfig("trashrc", KConfig::SimpleConfig); emptyTrash->setEnabled(!trashConfig.group("Status").readEntry("Empty", true)); connect(emptyTrash, SIGNAL(triggered()), SLOT(emptyTrashBin())); KAction *del = new KAction(i18n("&Delete"), this); del->setIcon(KIcon("edit-delete")); del->setShortcut(Qt::SHIFT + Qt::Key_Delete); connect(del, SIGNAL(triggered()), SLOT(deleteSelectedIcons())); // Create the new menu m_newMenu = new KNewFileMenu(&m_actionCollection, "new_menu", this); connect(m_newMenu->menu(), SIGNAL(aboutToShow()), this, SLOT(aboutToShowCreateNew())); m_actionCollection.addAction("undo", undo); m_actionCollection.addAction("cut", cut); m_actionCollection.addAction("copy", copy); m_actionCollection.addAction("paste", paste); m_actionCollection.addAction("pasteto", pasteTo); m_actionCollection.addAction("rename", rename); m_actionCollection.addAction("trash", trash); m_actionCollection.addAction("del", del); m_actionCollection.addAction("empty_trash", emptyTrash); }