X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/2a4f4c4b9ca1953f5859898b4e6bfc44cddd02be..008f524498475dd28717b1f3d65e2c99bbdb5b2a:/src/dolphinpart.cpp diff --git a/src/dolphinpart.cpp b/src/dolphinpart.cpp index 41c6ff3a3..bca9ee4a6 100644 --- a/src/dolphinpart.cpp +++ b/src/dolphinpart.cpp @@ -23,6 +23,7 @@ #include "dolphinview.h" #include "dolphinmodel.h" +#include #include #include @@ -37,13 +38,20 @@ #include #include #include +#include +#include +#include +#include +#include #include #include #include K_PLUGIN_FACTORY(DolphinPartFactory, registerPlugin();) -K_EXPORT_PLUGIN(DolphinPartFactory("dolphin")) +// The componentdata name must be dolphinpart so that dolphinpart.rc is found +// Alternatively we would have to install it as dolphin/dolphinpart.rc +K_EXPORT_PLUGIN(DolphinPartFactory("dolphinpart")) DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantList& args) : KParts::ReadOnlyPart(parent) @@ -75,6 +83,7 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantL m_dirLister, m_dolphinModel, m_proxyModel); + m_view->setTabsForFilesEnabled(true); setWidget(m_view); setXMLFile("dolphinpart.rc"); @@ -97,6 +106,8 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantL this, SLOT(slotRequestItemInfo(KFileItem))); connect(m_view, SIGNAL(urlChanged(KUrl)), this, SLOT(slotUrlChanged(KUrl))); + connect(m_view, SIGNAL(requestUrlChange(KUrl)), + this, SLOT(slotRequestUrlChange(KUrl))); connect(m_view, SIGNAL(modeChanged()), this, SIGNAL(viewModeChanged())); // relay signal @@ -126,6 +137,12 @@ DolphinPart::~DolphinPart() void DolphinPart::createActions() { + // Edit menu + + m_newMenu = new KNewMenu(actionCollection(), widget(), "new_menu"); + connect(m_newMenu->menu(), SIGNAL(aboutToShow()), + this, SLOT(updateNewMenu())); + KAction *editMimeTypeAction = actionCollection()->addAction( "editMimeType" ); editMimeTypeAction->setText( i18nc("@action:inmenu Edit", "&Edit File Type..." ) ); connect(editMimeTypeAction, SIGNAL(triggered()), SLOT(slotEditMimeType())); @@ -158,6 +175,16 @@ void DolphinPart::createActions() createGoAction("go_autostart", "", i18nc("@action:inmenu Go", "Autostart"), KGlobalSettings::autostartPath(), goActionGroup); + + // Tools menu + if (KAuthorized::authorizeKAction("shell_access")) { + KAction* action = actionCollection()->addAction("open_terminal"); + action->setIcon(KIcon("utilities-terminal")); + action->setText(i18nc("@action:inmenu Tools", "Open &Terminal")); + connect(action, SIGNAL(triggered()), SLOT(slotOpenTerminal())); + action->setShortcut(Qt::Key_F4); + } + } void DolphinPart::createGoAction(const char* name, const char* iconName, @@ -180,24 +207,37 @@ void DolphinPart::slotGoTriggered(QAction* action) void DolphinPart::slotSelectionChanged(const KFileItemList& selection) { const bool hasSelection = !selection.isEmpty(); + + QAction* renameAction = actionCollection()->action("rename"); + QAction* moveToTrashAction = actionCollection()->action("move_to_trash"); + QAction* deleteAction = actionCollection()->action("delete"); + QAction* editMimeTypeAction = actionCollection()->action("editMimeType"); + QAction* propertiesAction = actionCollection()->action("properties"); + if (!hasSelection) { stateChanged("has_no_selection"); + + emit m_extension->enableAction("cut", false); + emit m_extension->enableAction("copy", false); + renameAction->setEnabled(false); + moveToTrashAction->setEnabled(false); + deleteAction->setEnabled(false); + editMimeTypeAction->setEnabled(false); + propertiesAction->setEnabled(false); } else { stateChanged("has_selection"); - } - QStringList actions; - actions << "rename" << "move_to_trash" << "delete" << "editMimeType" << "properties"; - foreach(const QString& actionName, actions) { - QAction* action = actionCollection()->action(actionName); - Q_ASSERT(action); - if (action) { - action->setEnabled(hasSelection); - } - } + KonqFileItemCapabilities capabilities(selection); + const bool enableMoveToTrash = capabilities.isLocal() && capabilities.supportsMoving(); - emit m_extension->enableAction("cut", hasSelection); - emit m_extension->enableAction("copy", hasSelection); + renameAction->setEnabled(capabilities.supportsMoving()); + moveToTrashAction->setEnabled(enableMoveToTrash); + deleteAction->setEnabled(capabilities.supportsDeleting()); + editMimeTypeAction->setEnabled(true); + propertiesAction->setEnabled(true); + emit m_extension->enableAction("cut", capabilities.supportsMoving()); + emit m_extension->enableAction("copy", true); + } } void DolphinPart::updatePasteAction() @@ -214,15 +254,24 @@ KAboutData* DolphinPart::createAboutData() bool DolphinPart::openUrl(const KUrl& url) { - const bool reload = arguments().reload(); + bool reload = arguments().reload(); + // A bit of a workaround so that changing the namefilter works: force reload. + // Otherwise DolphinView wouldn't relist the URL, so nothing would happen. + if (m_nameFilter != m_dirLister->nameFilter()) + reload = true; if (m_view->url() == url && !reload) { // DolphinView won't do anything in that case, so don't emit started return true; } setUrl(url); // remember it at the KParts level - const QString prettyUrl = url.pathOrUrl(); + KUrl visibleUrl(url); + if (!m_nameFilter.isEmpty()) { + visibleUrl.addPath(m_nameFilter); + } + QString prettyUrl = visibleUrl.pathOrUrl(); emit setWindowCaption(prettyUrl); emit m_extension->setLocationBarUrl(prettyUrl); emit started(0); // get the wheel to spin + m_dirLister->setNameFilter(m_nameFilter); m_view->setUrl(url); emit aboutToOpenURL(); if (reload) @@ -273,7 +322,6 @@ void DolphinPart::createNewWindow(const KUrl& url) // TODO: Check issue N176832 for the missing QAIV signal; task 177399 - maybe this code // should be moved into DolphinPart::slotItemTriggered() KFileItem item(S_IFDIR, (mode_t)-1, url); - Q_ASSERT(item.mimeTypePtr()->is("inode/directory")); // the signal 'tabRequested' is only emitted for dirs KParts::OpenUrlArguments args; args.setMimeType(item.mimetype()); emit m_extension->createNewWindow(url, args); @@ -284,32 +332,44 @@ void DolphinPart::slotOpenContextMenu(const KFileItem& _item, const KUrl&) KParts::BrowserExtension::PopupFlags popupFlags = KParts::BrowserExtension::DefaultPopupItems | KParts::BrowserExtension::ShowProperties | KParts::BrowserExtension::ShowUrlOperations; - // TODO KonqKfmIconView had if ( !rootItem->isWritable() ) - // popupFlags |= KParts::BrowserExtension::NoDeletion; KFileItem item(_item); if (item.isNull()) { // viewport context menu popupFlags |= KParts::BrowserExtension::ShowNavigationItems | KParts::BrowserExtension::ShowUp; - // TODO get m_dirLister->rootItem if possible. or via kdirmodel? - // and use this as fallback: - item = KFileItem( S_IFDIR, (mode_t)-1, url() ); + item = m_dirLister->rootItem(); + if (item.isNull()) + item = KFileItem( S_IFDIR, (mode_t)-1, url() ); } KParts::BrowserExtension::ActionGroupMap actionGroups; QList editActions; - if (!item.isNull()) { // only for context menu on one or more items - // TODO if ( sMoving ) - editActions.append(actionCollection()->action("rename")); + if (!_item.isNull()) { // only for context menu on one or more items + bool sDeleting = true; + bool sMoving = true; + + // If the parent directory of the selected item is writable, moving + // and deleting are possible. + KFileItem parentDir = m_dirLister->rootItem(); + if (!parentDir.isWritable()) { + popupFlags |= KParts::BrowserExtension::NoDeletion; + sDeleting = false; + sMoving = false; + } + + if ( sMoving ) + editActions.append(actionCollection()->action("rename")); bool addTrash = false; bool addDel = false; - // TODO if ( sMoving && !isIntoTrash && !isTrashLink ) - addTrash = true; + bool isIntoTrash = _item.url().protocol() == "trash"; + + if ( sMoving && !isIntoTrash && item.isLocalFile() ) + addTrash = true; - /* TODO if ( sDeleting ) */ { + if ( sDeleting ) { if ( !item.isLocalFile() ) addDel = true; else if (QApplication::keyboardModifiers() & Qt::ShiftModifier) { @@ -328,21 +388,27 @@ void DolphinPart::slotOpenContextMenu(const KFileItem& _item, const KUrl&) if (addDel) editActions.append(actionCollection()->action("delete")); actionGroups.insert("editactions", editActions); - - // TODO: We should change the signature of the slots (and signals) for being able - // to tell for which items we want a popup. - KFileItemList items = (m_view->selectedItems().count() ? m_view->selectedItems() - : KFileItemList() << item); - emit m_extension->popupMenu(QCursor::pos(), - items, - KParts::OpenUrlArguments(), - KParts::BrowserArguments(), - popupFlags, - actionGroups); } + + // TODO: We should change the signature of the slots (and signals) for being able + // to tell for which items we want a popup. + KFileItemList items = (m_view->selectedItems().count() ? m_view->selectedItems() + : KFileItemList() << item); + emit m_extension->popupMenu(QCursor::pos(), + items, + KParts::OpenUrlArguments(), + KParts::BrowserArguments(), + popupFlags, + actionGroups); } void DolphinPart::slotUrlChanged(const KUrl& url) +{ + QString prettyUrl = url.pathOrUrl(); + emit m_extension->setLocationBarUrl(prettyUrl); +} + +void DolphinPart::slotRequestUrlChange(const KUrl& url) { if (m_view->url() != url) { // If the view URL is not equal to 'url', then an inner URL change has @@ -405,4 +471,38 @@ QString DolphinPart::currentViewMode() const return m_actionHandler->currentViewModeActionName(); } +void DolphinPart::setNameFilter(const QString& nameFilter) +{ + // This is the "/home/dfaure/*.diff" kind of name filter (KDirLister::setNameFilter) + // which is unrelated to DolphinView::setNameFilter which is substring filtering in a proxy. + m_nameFilter = nameFilter; + // TODO save/restore name filter in saveState/restoreState like KonqDirPart did in kde3? +} + +void DolphinPart::slotOpenTerminal() +{ + QString dir(QDir::homePath()); + + KUrl u(url()); + + // If the given directory is not local, it can still be the URL of an + // ioslave using UDS_LOCAL_PATH which to be converted first. + u = KIO::NetAccess::mostLocalUrl(u, widget()); + + //If the URL is local after the above conversion, set the directory. + if (u.isLocalFile()) { + dir = u.path(); + } + + KToolInvocation::invokeTerminal(QString(), dir); +} + +void DolphinPart::updateNewMenu() +{ + // As requested by KNewMenu : + m_newMenu->slotCheckUpToDate(); + // And set the files that the menu apply on : + m_newMenu->setPopupFiles(url()); +} + #include "dolphinpart.moc"