X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/b80aed4e9fd5f0a0068a5da05f6ef970f1aa0b5c..1ef5434572d0289a160589395b8b80cd800bc195:/src/dolphinpart.cpp diff --git a/src/dolphinpart.cpp b/src/dolphinpart.cpp index d1626e55d..908173193 100644 --- a/src/dolphinpart.cpp +++ b/src/dolphinpart.cpp @@ -18,6 +18,7 @@ */ #include "dolphinpart.h" +#include "dolphinremoveaction.h" #include #include @@ -36,20 +37,28 @@ #include #include #include -#include #include #include #include +#include +#if KDE_IS_VERSION(4, 9, 2) +#include "dolphinpart_ext.h" +#endif + +#include "dolphinnewfilemenu.h" #include "views/dolphinview.h" #include "views/dolphinviewactionhandler.h" #include "views/dolphinnewfilemenuobserver.h" #include "views/dolphinremoteencoding.h" +#include "kitemviews/kfileitemmodel.h" +#include "kitemviews/private/kfileitemmodeldirlister.h" #include #include #include #include +#include K_PLUGIN_FACTORY(DolphinPartFactory, registerPlugin();) K_EXPORT_PLUGIN(DolphinPartFactory("dolphinpart", "dolphin")) @@ -57,11 +66,11 @@ K_EXPORT_PLUGIN(DolphinPartFactory("dolphinpart", "dolphin")) DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantList& args) : KParts::ReadOnlyPart(parent) ,m_openTerminalAction(0) + ,m_removeAction(0) { Q_UNUSED(args) setComponentData(DolphinPartFactory::componentData(), false); m_extension = new DolphinPartBrowserExtension(this); - new DolphinPartFileInfoExtension(this); // make sure that other apps using this part find Dolphin's view-file-columns icons KIconLoader::global()->addAppDir("dolphin"); @@ -70,6 +79,9 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantL m_view->setTabsForFilesEnabled(true); setWidget(m_view); + connect(&DolphinNewFileMenuObserver::instance(), SIGNAL(errorMessage(QString)), + this, SLOT(slotErrorMessage(QString))); + connect(m_view, SIGNAL(directoryLoadingCompleted()), this, SIGNAL(completed())); connect(m_view, SIGNAL(directoryLoadingProgress(int)), this, SLOT(updateProgress(int))); connect(m_view, SIGNAL(errorMessage(QString)), this, SLOT(slotErrorMessage(QString))); @@ -84,6 +96,8 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantL this, SLOT(slotErrorMessage(QString))); connect(m_view, SIGNAL(itemActivated(KFileItem)), this, SLOT(slotItemActivated(KFileItem))); + connect(m_view, SIGNAL(itemsActivated(KFileItemList)), + this, SLOT(slotItemsActivated(KFileItemList))); connect(m_view, SIGNAL(tabRequested(KUrl)), this, SLOT(createNewWindow(KUrl))); connect(m_view, SIGNAL(requestContextMenu(QPoint,KFileItem,KUrl,QList)), @@ -116,29 +130,47 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantL connect(clipboard, SIGNAL(dataChanged()), this, SLOT(updatePasteAction())); + // Create file info and listing filter extensions. + // NOTE: Listing filter needs to be instantiated after the creation of the view. + new DolphinPartFileInfoExtension(this); + +#if KDE_IS_VERSION(4, 9, 2) + new DolphinPartListingFilterExtension(this); + + KDirLister* lister = m_view->m_model->m_dirLister; + if (lister) { + DolphinPartListingNotificationExtension* notifyExt = new DolphinPartListingNotificationExtension(this); + connect(lister, SIGNAL(newItems(KFileItemList)), notifyExt, SLOT(slotNewItems(KFileItemList))); + connect(lister, SIGNAL(itemsDeleted(KFileItemList)), notifyExt, SLOT(slotItemsDeleted(KFileItemList))); + } else { + kWarning() << "NULL KDirLister object! KParts::ListingNotificationExtension will NOT be supported"; + } +#endif + createActions(); m_actionHandler->updateViewActions(); slotSelectionChanged(KFileItemList()); // initially disable selection-dependent actions + // Listen to events from the app so we can update the remove key by + // checking for a Shift key press. + qApp->installEventFilter(this); + // TODO there was a "always open a new window" (when clicking on a directory) setting in konqueror // (sort of spacial navigation) loadPlugins(this, this, componentData()); - } DolphinPart::~DolphinPart() { - DolphinNewFileMenuObserver::instance().detach(m_newFileMenu); } void DolphinPart::createActions() { // Edit menu - m_newFileMenu = new KNewFileMenu(actionCollection(), "new_menu", this); + m_newFileMenu = new DolphinNewFileMenu(actionCollection(), this); m_newFileMenu->setParentWidget(widget()); - DolphinNewFileMenuObserver::instance().attach(m_newFileMenu); connect(m_newFileMenu->menu(), SIGNAL(aboutToShow()), this, SLOT(updateNewMenu())); @@ -325,7 +357,8 @@ void DolphinPart::slotRequestItemInfo(const KFileItem& item) if (item.isNull()) { updateStatusBar(); } else { - ReadOnlyPart::setStatusBarText(item.getStatusBarInfo()); + const QString escapedText = Qt::convertFromPlainText(item.getStatusBarInfo()); + ReadOnlyPart::setStatusBarText(QString("%1").arg(escapedText)); } } @@ -345,6 +378,13 @@ void DolphinPart::slotItemActivated(const KFileItem& item) emit m_extension->openUrlRequest(item.targetUrl(), args, browserArgs); } +void DolphinPart::slotItemsActivated(const KFileItemList& items) +{ + foreach (const KFileItem& item, items) { + slotItemActivated(item); + } +} + void DolphinPart::createNewWindow(const KUrl& url) { // TODO: Check issue N176832 for the missing QAIV signal; task 177399 - maybe this code @@ -389,10 +429,27 @@ void DolphinPart::slotOpenContextMenu(const QPoint& pos, editActions += customActions; if (!_item.isNull()) { // only for context menu on one or more items - bool supportsDeleting = capabilities.supportsDeleting(); - bool supportsMoving = capabilities.supportsMoving(); - - if (!supportsDeleting) { + const bool supportsMoving = capabilities.supportsMoving(); + + if (capabilities.supportsDeleting()) { + const bool showDeleteAction = (KGlobal::config()->group("KDE").readEntry("ShowDeleteCommand", false) || + !item.isLocalFile()); + const bool showMoveToTrashAction = capabilities.isLocal() && supportsMoving; + + if (showDeleteAction && showMoveToTrashAction) { + delete m_removeAction; + m_removeAction = 0; + editActions.append(actionCollection()->action("move_to_trash")); + editActions.append(actionCollection()->action("delete")); + } else if (showDeleteAction && !showMoveToTrashAction) { + editActions.append(actionCollection()->action("delete")); + } else { + if (!m_removeAction) + m_removeAction = new DolphinRemoveAction(this, actionCollection()); + editActions.append(m_removeAction); + m_removeAction->update(); + } + } else { popupFlags |= KParts::BrowserExtension::NoDeletion; } @@ -400,27 +457,6 @@ void DolphinPart::slotOpenContextMenu(const QPoint& pos, editActions.append(actionCollection()->action("rename")); } - bool addTrash = capabilities.isLocal() && supportsMoving; - bool addDel = false; - if (supportsDeleting) { - if ( !item.isLocalFile() ) - addDel = true; - else if (QApplication::keyboardModifiers() & Qt::ShiftModifier) { - addTrash = false; - addDel = true; - } - else { - KSharedConfig::Ptr globalConfig = KSharedConfig::openConfig("kdeglobals", KConfig::IncludeGlobals); - KConfigGroup configGroup(globalConfig, "KDE"); - addDel = configGroup.readEntry("ShowDeleteCommand", false); - } - } - - if (addTrash) - editActions.append(actionCollection()->action("move_to_trash")); - if (addDel) - editActions.append(actionCollection()->action("delete")); - // Normally KonqPopupMenu only shows the "Create new" submenu in the current view // since otherwise the created file would not be visible. // But in treeview mode we should allow it. @@ -537,7 +573,8 @@ void DolphinPart::updateNewMenu() void DolphinPart::updateStatusBar() { - emit ReadOnlyPart::setStatusBarText(m_view->statusBarText()); + const QString escapedText = Qt::convertFromPlainText(m_view->statusBarText()); + emit ReadOnlyPart::setStatusBarText(QString("%1").arg(escapedText)); } void DolphinPart::updateProgress(int percent) @@ -554,92 +591,29 @@ void DolphinPart::createDirectory() void DolphinPart::setFilesToSelect(const KUrl::List& files) { - m_view->markUrlsAsSelected(files); -} - -//// - -void DolphinPartBrowserExtension::restoreState(QDataStream &stream) -{ - KParts::BrowserExtension::restoreState(stream); - m_part->view()->restoreState(stream); -} - -void DolphinPartBrowserExtension::saveState(QDataStream &stream) -{ - KParts::BrowserExtension::saveState(stream); - m_part->view()->saveState(stream); -} - -void DolphinPartBrowserExtension::cut() -{ - m_part->view()->cutSelectedItems(); -} - -void DolphinPartBrowserExtension::copy() -{ - m_part->view()->copySelectedItems(); -} - -void DolphinPartBrowserExtension::paste() -{ - m_part->view()->paste(); -} - -void DolphinPartBrowserExtension::pasteTo(const KUrl&) -{ - m_part->view()->pasteIntoFolder(); -} - -void DolphinPartBrowserExtension::reparseConfiguration() -{ - m_part->view()->readSettings(); -} - -//// - -DolphinPartFileInfoExtension::DolphinPartFileInfoExtension(DolphinPart* part) - : KParts::FileInfoExtension(part) -{ -} - -DolphinPart* DolphinPartFileInfoExtension::part() const -{ - return static_cast(parent()); -} - -bool DolphinPartFileInfoExtension::hasSelection() const -{ - return part()->view()->selectedItemsCount() > 0; -} + if (files.isEmpty()) { + return; + } -KParts::FileInfoExtension::QueryModes DolphinPartFileInfoExtension::supportedQueryModes() const -{ - return (KParts::FileInfoExtension::AllItems | KParts::FileInfoExtension::SelectedItems); + m_view->markUrlsAsSelected(files); + m_view->markUrlAsCurrent(files.at(0)); } -KFileItemList DolphinPartFileInfoExtension::queryFor(KParts::FileInfoExtension::QueryMode mode) const +bool DolphinPart::eventFilter(QObject* obj, QEvent* event) { - KFileItemList list; + const int type = event->type(); - if (mode == KParts::FileInfoExtension::None) - return list; - - if (!(supportedQueryModes() & mode)) - return list; - - switch (mode) { - case KParts::FileInfoExtension::SelectedItems: - if (hasSelection()) - return part()->view()->selectedItems(); - break; - case KParts::FileInfoExtension::AllItems: - return part()->view()->items(); - default: - break; + if ((type == QEvent::KeyPress || type == QEvent::KeyRelease) && m_removeAction) { + QMenu* menu = qobject_cast(obj); + if (menu && menu->parent() == m_view) { + QKeyEvent* ev = static_cast(event); + if (ev->key() == Qt::Key_Shift) { + m_removeAction->update(); + } + } } - return list; + return KParts::ReadOnlyPart::eventFilter(obj, event); } #include "dolphinpart.moc"