X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/7b42d2d6cbff82dc8adefc8e05f42a015f59cb03..233a08164f79d9909693c5de438f856467ad5b76:/src/dolphinpart.cpp diff --git a/src/dolphinpart.cpp b/src/dolphinpart.cpp index fbaa6fe49..35cc81503 100644 --- a/src/dolphinpart.cpp +++ b/src/dolphinpart.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include "settings/dolphinsettings.h" @@ -164,6 +165,26 @@ void DolphinPart::createActions() editMimeTypeAction->setText( i18nc("@action:inmenu Edit", "&Edit File Type..." ) ); connect(editMimeTypeAction, SIGNAL(triggered()), SLOT(slotEditMimeType())); + KAction* selectItemsMatching = actionCollection()->addAction("select_items_matching"); + selectItemsMatching->setText(i18nc("@action:inmenu Edit", "Select Items Matching...")); + selectItemsMatching->setShortcut(Qt::CTRL | Qt::Key_S); + connect(selectItemsMatching, SIGNAL(triggered()), this, SLOT(slotSelectItemsMatchingPattern())); + + KAction* unselectItemsMatching = actionCollection()->addAction("unselect_items_matching"); + unselectItemsMatching->setText(i18nc("@action:inmenu Edit", "Unselect Items Matching...")); + connect(unselectItemsMatching, SIGNAL(triggered()), this, SLOT(slotUnselectItemsMatchingPattern())); + + actionCollection()->addAction(KStandardAction::SelectAll, "select_all", m_view, SLOT(selectAll())); + + KAction* unselectAll = actionCollection()->addAction("unselect_all"); + unselectAll->setText(i18nc("@action:inmenu Edit", "Unselect All")); + connect(unselectAll, SIGNAL(triggered()), m_view, SLOT(clearSelection())); + + KAction* invertSelection = actionCollection()->addAction("invert_selection"); + invertSelection->setText(i18nc("@action:inmenu Edit", "Invert Selection")); + invertSelection->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_A); + connect(invertSelection, SIGNAL(triggered()), m_view, SLOT(invertSelection())); + // View menu: all done by DolphinViewActionHandler // Go menu @@ -358,6 +379,8 @@ void DolphinPart::slotOpenContextMenu(const KFileItem& _item, item = m_dirLister->rootItem(); if (item.isNull()) item = KFileItem( S_IFDIR, (mode_t)-1, url() ); + else + item.setUrl(url()); // ensure we use the view url, not the canonical path (#213799) } // TODO: We should change the signature of the slots (and signals) for being able @@ -444,6 +467,18 @@ void DolphinPart::slotRequestUrlChange(const KUrl& url) //// +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(); @@ -479,6 +514,53 @@ void DolphinPart::slotEditMimeType() } } +void DolphinPart::slotSelectItemsMatchingPattern() +{ + openSelectionDialog(i18nc("@title:window", "Select"), + i18n("Select all items matching this pattern:"), + QItemSelectionModel::Select); +} + +void DolphinPart::slotUnselectItemsMatchingPattern() +{ + openSelectionDialog(i18nc("@title:window", "Unselect"), + i18n("Unselect all items matching this pattern:"), + QItemSelectionModel::Deselect); +} + +void DolphinPart::openSelectionDialog(const QString& title, const QString& text, QItemSelectionModel::SelectionFlags command) +{ + bool okClicked; + QString pattern = KInputDialog::getText(title, text, "*", &okClicked, m_view); + + if (okClicked && !pattern.isEmpty()) { + QRegExp patternRegExp(pattern, Qt::CaseSensitive, QRegExp::Wildcard); + QItemSelection matchingIndexes = childrenMatchingPattern(QModelIndex(), patternRegExp); + m_view->selectionModel()->select(matchingIndexes, command); + } +} + +QItemSelection DolphinPart::childrenMatchingPattern(const QModelIndex& parent, const QRegExp& patternRegExp) +{ + QItemSelection matchingIndexes; + int numRows = m_proxyModel->rowCount(parent); + + for (int row = 0; row < numRows; row++) { + QModelIndex index = m_proxyModel->index(row, 0, parent); + QModelIndex sourceIndex = m_proxyModel->mapToSource(index); + + if (sourceIndex.isValid() && patternRegExp.exactMatch(m_dolphinModel->data(sourceIndex).toString())) { + matchingIndexes += QItemSelectionRange(index); + } + + if (m_proxyModel->hasChildren(index)) { + matchingIndexes += childrenMatchingPattern(index, patternRegExp); + } + } + + return matchingIndexes; +} + void DolphinPart::setCurrentViewMode(const QString& viewModeName) { QAction* action = actionCollection()->action(viewModeName); @@ -521,6 +603,7 @@ void DolphinPart::updateNewMenu() { // As requested by KNewMenu : m_newMenu->slotCheckUpToDate(); + m_newMenu->setViewShowsHiddenFiles(m_view->showHiddenFiles()); // And set the files that the menu apply on : m_newMenu->setPopupFiles(url()); } @@ -537,6 +620,7 @@ void DolphinPart::updateProgress(int percent) void DolphinPart::createDirectory() { + m_newMenu->setViewShowsHiddenFiles(m_view->showHiddenFiles()); m_newMenu->setPopupFiles(url()); m_newMenu->createDirectory(); }