X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/1cbe55b97c3b8fd9265ad6b40ce6cc169d4451c1..40c71d5ce0f6978ce48eb67fd73ed211bab4e887:/src/views/dolphinview.cpp diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 8672b531b..3fbe56eba 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -20,6 +20,8 @@ #include "dolphinview.h" +#include + #include #include #include @@ -33,7 +35,6 @@ #include #include -#include #include #include #include @@ -57,7 +58,6 @@ #include #include -#include "dolphindirlister.h" #include "dolphinnewfilemenuobserver.h" #include "dolphin_detailsmodesettings.h" #include "dolphin_generalsettings.h" @@ -70,6 +70,10 @@ #include "views/tooltips/tooltipmanager.h" #include "zoomlevelinfo.h" +#ifdef HAVE_NEPOMUK + #include +#endif + namespace { const int MaxModeEnum = DolphinView::CompactView; }; @@ -85,7 +89,6 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : m_mode(DolphinView::IconsView), m_visibleRoles(), m_topLayout(0), - m_dirLister(0), m_container(0), m_toolTipManager(0), m_selectionChangedTimer(0), @@ -111,24 +114,7 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : connect(m_selectionChangedTimer, SIGNAL(timeout()), this, SLOT(emitSelectionChangedSignal())); - m_dirLister = new DolphinDirLister(this); - m_dirLister->setAutoUpdate(true); - m_dirLister->setDelayedMimeTypes(true); - - connect(m_dirLister, SIGNAL(redirection(KUrl,KUrl)), this, SLOT(slotRedirection(KUrl,KUrl))); - connect(m_dirLister, SIGNAL(started(KUrl)), this, SLOT(slotDirListerStarted(KUrl))); - connect(m_dirLister, SIGNAL(refreshItems(QList >)), - this, SLOT(slotRefreshItems())); - - connect(m_dirLister, SIGNAL(clear()), this, SIGNAL(itemCountChanged())); - connect(m_dirLister, SIGNAL(newItems(KFileItemList)), this, SIGNAL(itemCountChanged())); - connect(m_dirLister, SIGNAL(infoMessage(QString)), this, SIGNAL(infoMessage(QString))); - connect(m_dirLister, SIGNAL(errorMessage(QString)), this, SIGNAL(infoMessage(QString))); - connect(m_dirLister, SIGNAL(percent(int)), this, SIGNAL(pathLoadingProgress(int))); - connect(m_dirLister, SIGNAL(urlIsFileError(KUrl)), this, SIGNAL(urlIsFileError(KUrl))); - connect(m_dirLister, SIGNAL(itemsDeleted(KFileItemList)), this, SIGNAL(itemCountChanged())); - - m_container = new DolphinItemListContainer(m_dirLister, this); + m_container = new DolphinItemListContainer(this); m_container->setVisibleRoles(QList() << "name"); m_container->installEventFilter(this); setFocusProxy(m_container); @@ -150,9 +136,17 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : connect(controller, SIGNAL(modelChanged(KItemModelBase*,KItemModelBase*)), this, SLOT(slotModelChanged(KItemModelBase*,KItemModelBase*))); KFileItemModel* model = fileItemModel(); - if (model) { - connect(model, SIGNAL(loadingCompleted()), this, SLOT(slotLoadingCompleted())); - } + connect(model, SIGNAL(directoryLoadingStarted()), this, SLOT(slotDirectoryLoadingStarted())); + connect(model, SIGNAL(directoryLoadingCompleted()), this, SLOT(slotDirectoryLoadingCompleted())); + connect(model, SIGNAL(directoryLoadingProgress(int)), this, SIGNAL(directoryLoadingProgress(int))); + connect(model, SIGNAL(directorySortingProgress(int)), this, SIGNAL(directorySortingProgress(int))); + connect(model, SIGNAL(itemsChanged(KItemRangeList,QSet)), + this, SLOT(slotItemsChanged())); + connect(model, SIGNAL(itemsRemoved(KItemRangeList)), this, SIGNAL(itemCountChanged())); + connect(model, SIGNAL(itemsInserted(KItemRangeList)), this, SIGNAL(itemCountChanged())); + connect(model, SIGNAL(infoMessage(QString)), this, SIGNAL(infoMessage(QString))); + connect(model, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); + connect(model, SIGNAL(directoryRedirection(KUrl,KUrl)), this, SLOT(slotDirectoryRedirection(KUrl,KUrl))); KItemListView* view = controller->view(); view->installEventFilter(this); @@ -262,7 +256,8 @@ bool DolphinView::previewsShown() const void DolphinView::setHiddenFilesShown(bool show) { - if (m_dirLister->showingDotFiles() == show) { + KFileItemModel* model = fileItemModel(); + if (model->showHiddenFiles() == show) { return; } @@ -273,13 +268,13 @@ void DolphinView::setHiddenFilesShown(bool show) ViewProperties props(url()); props.setHiddenFilesShown(show); - fileItemModel()->setShowHiddenFiles(show); + model->setShowHiddenFiles(show); emit hiddenFilesShownChanged(show); } bool DolphinView::hiddenFilesShown() const { - return m_dirLister->showingDotFiles(); + return fileItemModel()->showHiddenFiles(); } void DolphinView::setGroupedSorting(bool grouped) @@ -304,7 +299,21 @@ bool DolphinView::groupedSorting() const KFileItemList DolphinView::items() const { - return m_dirLister->items(); + KFileItemList list; + const KFileItemModel* model = fileItemModel(); + const int itemCount = model->count(); + list.reserve(itemCount); + + for (int i = 0; i < itemCount; ++i) { + list.append(model->fileItem(i)); + } + + return list; +} + +int DolphinView::itemsCount() const +{ + return fileItemModel()->count(); } KFileItemList DolphinView::selectedItems() const @@ -338,7 +347,7 @@ void DolphinView::markUrlAsCurrent(const KUrl& url) m_currentItemUrl = url; } -void DolphinView::setItemSelectionEnabled(const QRegExp& pattern, bool enabled) +void DolphinView::selectItems(const QRegExp& pattern, bool enabled) { const KItemListSelectionManager::SelectionMode mode = enabled ? KItemListSelectionManager::Select @@ -408,7 +417,7 @@ void DolphinView::setSortFoldersFirst(bool foldersFirst) bool DolphinView::sortFoldersFirst() const { KFileItemModel* model = fileItemModel(); - return model->sortFoldersFirst(); + return model->sortDirectoriesFirst(); } void DolphinView::setVisibleRoles(const QList& roles) @@ -448,7 +457,7 @@ void DolphinView::reload() void DolphinView::stopLoading() { - m_dirLister->stop(); + fileItemModel()->cancelDirectoryLoading(); } void DolphinView::readSettings() @@ -481,20 +490,6 @@ QString DolphinView::nameFilter() const return fileItemModel()->nameFilter(); } -void DolphinView::calculateItemCount(int& fileCount, - int& folderCount, - KIO::filesize_t& totalFileSize) const -{ - foreach (const KFileItem& item, m_dirLister->items()) { - if (item.isDir()) { - ++folderCount; - } else { - ++fileCount; - totalFileSize += item.size(); - } - } -} - QString DolphinView::statusBarText() const { QString summary; @@ -505,7 +500,7 @@ QString DolphinView::statusBarText() const int fileCount = 0; KIO::filesize_t totalFileSize = 0; - if (hasSelection()) { + if (m_container->controller()->selectionManager()->hasSelection()) { // Give a summary of the status of the selected files const KFileItemList list = selectedItems(); foreach (const KFileItem& item, list) { @@ -533,9 +528,12 @@ QString DolphinView::statusBarText() const if (fileCount > 0 && folderCount > 0) { summary = i18nc("@info:status folders, files (size)", "%1, %2 (%3)", - foldersText, filesText, fileSizeText(totalFileSize)); + foldersText, filesText, + KGlobal::locale()->formatByteSize(totalFileSize)); } else if (fileCount > 0) { - summary = i18nc("@info:status files (size)", "%1 (%2)", filesText, fileSizeText(totalFileSize)); + summary = i18nc("@info:status files (size)", "%1 (%2)", + filesText, + KGlobal::locale()->formatByteSize(totalFileSize)); } else if (folderCount > 0) { summary = foldersText; } @@ -618,8 +616,9 @@ void DolphinView::renameSelectedItems() dialog->activateWindow(); //} - // assure that the current index remains visible when KDirLister - // will notify the view about changed items + // Assure that the current index remains visible when KFileItemModel + // will notify the view about changed items (which might result in + // a changed sorting). m_assureVisibleCurrentIndex = true; } @@ -784,6 +783,16 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) KItemListView* view = m_container->controller()->view(); const QSet visibleRolesSet = view->visibleRoles().toSet(); + bool nepomukRunning = false; + bool indexingEnabled = false; +#ifdef HAVE_NEPOMUK + nepomukRunning = (Nepomuk::ResourceManager::instance()->init() == 0); + if (nepomukRunning) { + KConfig config("nepomukserverrc"); + indexingEnabled = config.group("Service-nepomukfileindexer").readEntry("autostart", false); + } +#endif + QString groupName; QMenu* groupMenu = 0; @@ -811,6 +820,11 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) action->setCheckable(true); action->setChecked(visibleRolesSet.contains(info.role)); action->setData(info.role); + + const bool enable = (!info.requiresNepomuk && !info.requiresIndexer) || + (info.requiresNepomuk && nepomukRunning) || + (info.requiresIndexer && indexingEnabled); + action->setEnabled(enable); } menu->addSeparator(); @@ -844,7 +858,6 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) foreach (const QByteArray& role, view->visibleRoles()) { columnWidths.append(header->columnWidth(role)); } - props.setHeaderColumnWidths(columnWidths); header->setAutomaticColumnResizing(false); } else { @@ -861,10 +874,13 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) view->setVisibleRoles(visibleRoles); props.setVisibleRoles(visibleRoles); - // Reset the stored column-widths, so that automatic resizing is - // used again. - props.setHeaderColumnWidths(QList()); - header->setAutomaticColumnResizing(true); + QList columnWidths; + if (!header->automaticColumnResizing()) { + foreach (const QByteArray& role, view->visibleRoles()) { + columnWidths.append(header->columnWidth(role)); + } + } + props.setHeaderColumnWidths(columnWidths); } } @@ -942,16 +958,21 @@ void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even if (!error.isEmpty()) { emit errorMessage(error); } + + if (destUrl == url()) { + // Mark the dropped urls as selected. + markPastedUrlsAsSelected(event->mimeData()); + } } void DolphinView::slotModelChanged(KItemModelBase* current, KItemModelBase* previous) { if (previous != 0) { - disconnect(previous, SIGNAL(loadingCompleted()), this, SLOT(slotLoadingCompleted())); + disconnect(previous, SIGNAL(directoryLoadingCompleted()), this, SLOT(slotDirectoryLoadingCompleted())); } Q_ASSERT(qobject_cast(current)); - connect(current, SIGNAL(loadingCompleted()), this, SLOT(slotLoadingCompleted())); + connect(current, SIGNAL(loadingCompleted()), this, SLOT(slotDirectoryLoadingCompleted())); KFileItemModel* fileItemModel = static_cast(current); m_versionControlObserver->setModel(fileItemModel); @@ -1021,7 +1042,7 @@ void DolphinView::updateSortFoldersFirst(bool foldersFirst) props.setSortFoldersFirst(foldersFirst); KFileItemModel* model = fileItemModel(); - model->setSortFoldersFirst(foldersFirst); + model->setSortDirectoriesFirst(foldersFirst); emit sortFoldersFirstChanged(foldersFirst); } @@ -1057,7 +1078,7 @@ void DolphinView::restoreState(QDataStream& stream) // Restore expanded folders (only relevant for the details view - will be ignored by the view in other view modes) QSet urls; stream >> urls; - fileItemModel()->restoreExpandedUrls(urls); + fileItemModel()->restoreExpandedDirectories(urls); } void DolphinView::saveState(QDataStream& stream) @@ -1079,17 +1100,12 @@ void DolphinView::saveState(QDataStream& stream) stream << QPoint(x, y); // Save expanded folders (only relevant for the details view - the set will be empty in other view modes) - stream << fileItemModel()->expandedUrls(); -} - -bool DolphinView::hasSelection() const -{ - return m_container->controller()->selectionManager()->hasSelection(); + stream << fileItemModel()->expandedDirectories(); } KFileItem DolphinView::rootItem() const { - return m_dirLister->rootItem(); + return fileItemModel()->rootItem(); } void DolphinView::observeCreatedItem(const KUrl& url) @@ -1115,7 +1131,7 @@ void DolphinView::selectAndScrollToCreatedItem() m_createdItemUrl = KUrl(); } -void DolphinView::slotRedirection(const KUrl& oldUrl, const KUrl& newUrl) +void DolphinView::slotDirectoryRedirection(const KUrl& oldUrl, const KUrl& newUrl) { if (oldUrl.equals(url(), KUrl::CompareWithoutTrailingSlash)) { emit redirection(oldUrl, newUrl); @@ -1146,6 +1162,8 @@ void DolphinView::updateViewState() } if (!m_selectedUrls.isEmpty()) { + clearSelection(); + KItemListSelectionManager* selectionManager = m_container->controller()->selectionManager(); QSet selectedItems = selectionManager->selectedItems(); const KFileItemModel* model = fileItemModel(); @@ -1169,6 +1187,23 @@ void DolphinView::hideToolTip() } } +void DolphinView::calculateItemCount(int& fileCount, + int& folderCount, + KIO::filesize_t& totalFileSize) const +{ + const KFileItemModel* model = fileItemModel(); + const int itemCount = model->count(); + for (int i = 0; i < itemCount; ++i) { + const KFileItem item = model->fileItem(i); + if (item.isDir()) { + ++folderCount; + } else { + ++fileCount; + totalFileSize += item.size(); + } + } +} + void DolphinView::showHoverInformation(const KFileItem& item) { emit requestItemInfo(item); @@ -1188,7 +1223,7 @@ void DolphinView::slotDeleteFileFinished(KJob* job) } } -void DolphinView::slotDirListerStarted(const KUrl& url) +void DolphinView::slotDirectoryLoadingStarted() { // Disable the writestate temporary until it can be determined in a fast way // in DolphinView::slotLoadingCompleted() @@ -1197,29 +1232,23 @@ void DolphinView::slotDirListerStarted(const KUrl& url) emit writeStateChanged(m_isFolderWritable); } - emit startedPathLoading(url); + emit directoryLoadingStarted(); } -void DolphinView::slotLoadingCompleted() +void DolphinView::slotDirectoryLoadingCompleted() { - // Update the view-state. This has to be done using a Qt::QueuedConnection + // Update the view-state. This has to be done asynchronously // because the view might not be in its final state yet. QTimer::singleShot(0, this, SLOT(updateViewState())); - emit finishedPathLoading(url()); + emit directoryLoadingCompleted(); updateWritableState(); } -void DolphinView::slotRefreshItems() +void DolphinView::slotItemsChanged() { - if (m_assureVisibleCurrentIndex) { - m_assureVisibleCurrentIndex = false; - //QAbstractItemView* view = m_viewAccessor.itemView(); - //if (view) { - // m_viewAccessor.itemView()->scrollTo(m_viewAccessor.itemView()->currentIndex()); - //} - } + m_assureVisibleCurrentIndex = false; } void DolphinView::slotSortOrderChangedByHeader(Qt::SortOrder current, Qt::SortOrder previous) @@ -1277,7 +1306,12 @@ void DolphinView::loadDirectory(const KUrl& url, bool reload) return; } - m_dirLister->openUrl(url, reload ? KDirLister::Reload : KDirLister::NoFlags); + KFileItemModel* model = fileItemModel(); + if (reload) { + model->refreshDirectory(url); + } else { + model->loadDirectory(url); + } } void DolphinView::applyViewProperties() @@ -1336,8 +1370,8 @@ void DolphinView::applyViewProperties() } const bool sortFoldersFirst = props.sortFoldersFirst(); - if (sortFoldersFirst != model->sortFoldersFirst()) { - model->setSortFoldersFirst(sortFoldersFirst); + if (sortFoldersFirst != model->sortDirectoriesFirst()) { + model->setSortDirectoriesFirst(sortFoldersFirst); emit sortFoldersFirstChanged(sortFoldersFirst); } @@ -1417,8 +1451,13 @@ QMimeData* DolphinView::selectionMimeData() const void DolphinView::markPastedUrlsAsSelected(const QMimeData* mimeData) { - const KUrl::List urls = KUrl::List::fromMimeData(mimeData); - markUrlsAsSelected(urls); + const KUrl::List sourceUrls = KUrl::List::fromMimeData(mimeData); + KUrl::List destUrls; + foreach (const KUrl& source, sourceUrls) { + KUrl destination(url().url() + "/" + source.fileName()); + destUrls << destination; + } + markUrlsAsSelected(destUrls); } void DolphinView::updateWritableState() @@ -1426,7 +1465,7 @@ void DolphinView::updateWritableState() const bool wasFolderWritable = m_isFolderWritable; m_isFolderWritable = true; - const KFileItem item = m_dirLister->rootItem(); + const KFileItem item = fileItemModel()->rootItem(); if (!item.isNull()) { KFileItemListProperties capabilities(KFileItemList() << item); m_isFolderWritable = capabilities.supportsWriting(); @@ -1436,27 +1475,4 @@ void DolphinView::updateWritableState() } } -QString DolphinView::fileSizeText(KIO::filesize_t fileSize) -{ - const KLocale* locale = KGlobal::locale(); - const unsigned int multiplier = (locale->binaryUnitDialect() == KLocale::MetricBinaryDialect) - ? 1000 : 1024; - - QString text; - if (fileSize < multiplier) { - // Show the size in bytes - text = locale->formatByteSize(fileSize, 0, KLocale::DefaultBinaryDialect, KLocale::UnitByte); - } else if (fileSize < multiplier * multiplier) { - // Show the size in kilobytes and always round up. This is done - // for consistency with the values shown e.g. in the "Size" column - // of the details-view. - fileSize += (multiplier / 2) - 1; - text = locale->formatByteSize(fileSize, 0, KLocale::DefaultBinaryDialect, KLocale::UnitKiloByte); - } else { - // Show the size in the best fitting unit having one decimal - text = locale->formatByteSize(fileSize, 1); - } - return text; -} - #include "dolphinview.moc"