X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/be9746e87bb6a42e641dbf36c528a60fb564420a..f45ef05f4d59cc022fcf19fe3a342abcb3daa24f:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 8d3bf1e2f..a9f160d00 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -28,10 +28,10 @@ #include #include +#include #include #include #include -#include #include #include #include @@ -57,14 +57,12 @@ DolphinView::DolphinView(QWidget* parent, const KUrl& url, KDirLister* dirLister, KDirModel* dirModel, - DolphinSortFilterProxyModel* proxyModel, - Mode mode, - bool showHiddenFiles) : + DolphinSortFilterProxyModel* proxyModel) : QWidget(parent), m_active(true), - m_blockContentsMovedSignal(false), + m_loadingDirectory(false), m_initializeColumnView(false), - m_mode(mode), + m_mode(DolphinView::IconsView), m_topLayout(0), m_controller(0), m_iconsView(0), @@ -84,8 +82,6 @@ DolphinView::DolphinView(QWidget* parent, connect(clipboard, SIGNAL(dataChanged()), this, SLOT(updateCutItems())); - connect(m_dirLister, SIGNAL(completed()), - this, SLOT(restoreContentsPos())); connect(m_dirLister, SIGNAL(completed()), this, SLOT(updateCutItems())); connect(m_dirLister, SIGNAL(newItems(const KFileItemList&)), @@ -93,6 +89,8 @@ DolphinView::DolphinView(QWidget* parent, m_controller = new DolphinController(this); m_controller->setUrl(url); + connect(m_controller, SIGNAL(urlChanged(const KUrl&)), + this, SIGNAL(urlChanged(const KUrl&))); connect(m_controller, SIGNAL(requestContextMenu(const QPoint&)), this, SLOT(openContextMenu(const QPoint&))); connect(m_controller, SIGNAL(urlsDropped(const KUrl::List&, const QModelIndex&, QWidget*)), @@ -110,7 +108,7 @@ DolphinView::DolphinView(QWidget* parent, connect(m_controller, SIGNAL(viewportEntered()), this, SLOT(clearHoverInformation())); - createView(); + applyViewProperties(url); m_topLayout->addWidget(itemView()); } @@ -136,7 +134,7 @@ void DolphinView::setActive(bool active) m_active = active; - QColor color = KGlobalSettings::baseColor(); + QColor color = KColorScheme(KColorScheme::View).background(); if (active) { emit urlChanged(url()); emit selectionChanged(selectedItems()); @@ -174,16 +172,16 @@ void DolphinView::setMode(Mode mode) // to go back to the root URL of the column view automatically. // Otherwise there it would not be possible to turn off the column view // without focusing the first column. - // TODO: reactivate again after DolphinView/DolphinViewController split works - //setUrl(m_dirLister->url()); - //m_controller->setUrl(m_dirLister->url()); + setUrl(m_dirLister->url()); + m_controller->setUrl(m_dirLister->url()); } - ViewProperties props(url()); + const KUrl viewPropsUrl = viewPropertiesUrl(); + ViewProperties props(viewPropsUrl); props.setViewMode(m_mode); createView(); - startDirLister(url()); + startDirLister(viewPropsUrl); emit modeChanged(); } @@ -195,13 +193,14 @@ DolphinView::Mode DolphinView::mode() const void DolphinView::setShowPreview(bool show) { - ViewProperties props(url()); + const KUrl viewPropsUrl = viewPropertiesUrl(); + ViewProperties props(viewPropsUrl); props.setShowPreview(show); m_controller->setShowPreview(show); emit showPreviewChanged(); - startDirLister(url(), true); + startDirLister(viewPropsUrl, true); } bool DolphinView::showPreview() const @@ -215,13 +214,14 @@ void DolphinView::setShowHiddenFiles(bool show) return; } - ViewProperties props(url()); + const KUrl viewPropsUrl = viewPropertiesUrl(); + ViewProperties props(viewPropsUrl); props.setShowHiddenFiles(show); m_dirLister->setShowingDotFiles(show); emit showHiddenFilesChanged(); - startDirLister(url(), true); + startDirLister(viewPropsUrl, true); } bool DolphinView::showHiddenFiles() const @@ -245,7 +245,7 @@ void DolphinView::setCategorizedSorting(bool categorized) delete categorizer; } - ViewProperties props(url()); + ViewProperties props(viewPropertiesUrl()); props.setCategorizedSorting(categorized); props.save(); @@ -267,96 +267,102 @@ bool DolphinView::supportsCategorizedSorting() const return m_iconsView != 0; } -void DolphinView::renameSelectedItems() +void DolphinView::selectAll() { - // TODO: temporary deactivate due to DolphinView/DolphinViewController split - - /*DolphinView* view = 0; //mainWindow()->activeView(); - const KUrl::List urls = selectedUrls(); - if (urls.count() > 1) { - // More than one item has been selected for renaming. Open - // a rename dialog and rename all items afterwards. - RenameDialog dialog(urls); - if (dialog.exec() == QDialog::Rejected) { - return; - } + itemView()->selectAll(); +} - const QString& newName = dialog.newName(); - if (newName.isEmpty()) { - view->statusBar()->setMessage(dialog.errorString(), - DolphinStatusBar::Error); - } else { - // TODO: check how this can be integrated into KonqUndoManager/KonqOperations - // as one operation instead of n rename operations like it is done now... - Q_ASSERT(newName.contains('#')); - - // iterate through all selected items and rename them... - const int replaceIndex = newName.indexOf('#'); - Q_ASSERT(replaceIndex >= 0); - int index = 1; - - KUrl::List::const_iterator it = urls.begin(); - KUrl::List::const_iterator end = urls.end(); - while (it != end) { - const KUrl& oldUrl = *it; - QString number; - number.setNum(index++); - - QString name(newName); - name.replace(replaceIndex, 1, number); - - if (oldUrl.fileName() != name) { - KUrl newUrl = oldUrl; - newUrl.setFileName(name); - m_mainWindow->rename(oldUrl, newUrl); - } - ++it; - } - } +void DolphinView::invertSelection() +{ + if (isColumnViewActive()) { + // In opposite to QAbstractItemView::selectAll() there is no virtual method + // for adjusting the invertion of a selection. As the generic approach by using + // the selection model does not work for the column view, we delegate this task: + m_columnView->invertSelection(); } else { - // Only one item has been selected for renaming. Use the custom - // renaming mechanism from the views. - Q_ASSERT(urls.count() == 1); - - // TODO: Think about using KFileItemDelegate as soon as it supports editing. - // Currently the RenameDialog is used, but I'm not sure whether inline renaming - // is a benefit for the user at all -> let's wait for some input first... - RenameDialog dialog(urls); - if (dialog.exec() == QDialog::Rejected) { - return; - } + QItemSelectionModel* selectionModel = itemView()->selectionModel(); + const QAbstractItemModel* itemModel = selectionModel->model(); - const QString& newName = dialog.newName(); - if (newName.isEmpty()) { - view->statusBar()->setMessage(dialog.errorString(), - DolphinStatusBar::Error); - } else { - const KUrl& oldUrl = urls.first(); - KUrl newUrl = oldUrl; - newUrl.setFileName(newName); - m_mainWindow->rename(oldUrl, newUrl); + const QModelIndex topLeft = itemModel->index(0, 0); + const QModelIndex bottomRight = itemModel->index(itemModel->rowCount() - 1, + itemModel->columnCount() - 1); + + QItemSelection selection(topLeft, bottomRight); + selectionModel->select(selection, QItemSelectionModel::Toggle); + } +} + +bool DolphinView::hasSelection() const +{ + return itemView()->selectionModel()->hasSelection(); +} + +void DolphinView::clearSelection() +{ + itemView()->selectionModel()->clear(); +} + +KFileItemList DolphinView::selectedItems() const +{ + const QAbstractItemView* view = itemView(); + + // Our view has a selection, we will map them back to the DirModel + // and then fill the KFileItemList. + Q_ASSERT((view != 0) && (view->selectionModel() != 0)); + + const QItemSelection selection = m_proxyModel->mapSelectionToSource(view->selectionModel()->selection()); + KFileItemList itemList; + + const QModelIndexList indexList = selection.indexes(); + QModelIndexList::const_iterator end = indexList.end(); + for (QModelIndexList::const_iterator it = indexList.begin(); it != end; ++it) { + Q_ASSERT((*it).isValid()); + + KFileItem* item = m_dirModel->itemForIndex(*it); + if (item != 0) { + itemList.append(item); } - }*/ + } + + return itemList; } -void DolphinView::selectAll() +KUrl::List DolphinView::selectedUrls() const { - selectAll(QItemSelectionModel::Select); + KUrl::List urls; + + const KFileItemList list = selectedItems(); + KFileItemList::const_iterator it = list.begin(); + const KFileItemList::const_iterator end = list.end(); + while (it != end) { + KFileItem* item = *it; + urls.append(item->url()); + ++it; + } + + return urls; } -void DolphinView::invertSelection() +KFileItem* DolphinView::fileItem(const QModelIndex index) const { - selectAll(QItemSelectionModel::Toggle); + const QModelIndex dirModelIndex = m_proxyModel->mapToSource(index); + return m_dirModel->itemForIndex(dirModelIndex); } -int DolphinView::contentsX() const +void DolphinView::setContentsPosition(int x, int y) { - return itemView()->horizontalScrollBar()->value(); + QAbstractItemView* view = itemView(); + view->horizontalScrollBar()->setValue(x); + view->verticalScrollBar()->setValue(y); + + m_loadingDirectory = false; } -int DolphinView::contentsY() const +QPoint DolphinView::contentsPosition() const { - return itemView()->verticalScrollBar()->value(); + const int x = itemView()->horizontalScrollBar()->value(); + const int y = itemView()->verticalScrollBar()->value(); + return QPoint(x, y); } void DolphinView::zoomIn() @@ -405,14 +411,15 @@ Qt::SortOrder DolphinView::sortOrder() const void DolphinView::setAdditionalInfo(KFileItemDelegate::AdditionalInformation info) { - ViewProperties props(url()); + const KUrl viewPropsUrl = viewPropertiesUrl(); + ViewProperties props(viewPropsUrl); props.setAdditionalInfo(info); m_controller->setShowAdditionalInfo(info != KFileItemDelegate::NoInformation); m_fileItemDelegate->setAdditionalInformation(info); emit additionalInfoChanged(info); - startDirLister(url(), true); + startDirLister(viewPropsUrl, true); } KFileItemDelegate::AdditionalInformation DolphinView::additionalInfo() const @@ -420,130 +427,31 @@ KFileItemDelegate::AdditionalInformation DolphinView::additionalInfo() const return m_fileItemDelegate->additionalInformation(); } -bool DolphinView::hasSelection() const -{ - return itemView()->selectionModel()->hasSelection(); -} - -void DolphinView::clearSelection() -{ - itemView()->selectionModel()->clear(); -} - -KFileItemList DolphinView::selectedItems() const -{ - const QAbstractItemView* view = itemView(); - - // Our view has a selection, we will map them back to the DirModel - // and then fill the KFileItemList. - Q_ASSERT((view != 0) && (view->selectionModel() != 0)); - - const QItemSelection selection = m_proxyModel->mapSelectionToSource(view->selectionModel()->selection()); - KFileItemList itemList; - - const QModelIndexList indexList = selection.indexes(); - QModelIndexList::const_iterator end = indexList.end(); - for (QModelIndexList::const_iterator it = indexList.begin(); it != end; ++it) { - Q_ASSERT((*it).isValid()); - - KFileItem* item = m_dirModel->itemForIndex(*it); - if (item != 0) { - itemList.append(item); - } - } - - return itemList; -} - -KUrl::List DolphinView::selectedUrls() const +void DolphinView::reload() { - KUrl::List urls; - - const KFileItemList list = selectedItems(); - KFileItemList::const_iterator it = list.begin(); - const KFileItemList::const_iterator end = list.end(); - while (it != end) { - KFileItem* item = *it; - urls.append(item->url()); - ++it; - } - - return urls; + setUrl(url()); + startDirLister(url(), true); } -KFileItem* DolphinView::fileItem(const QModelIndex index) const +void DolphinView::refresh() { - const QModelIndex dirModelIndex = m_proxyModel->mapToSource(index); - return m_dirModel->itemForIndex(dirModelIndex); + createView(); + applyViewProperties(m_controller->url()); + reload(); } -void DolphinView::rename(const KUrl& source, const QString& newName) +void DolphinView::setUrl(const KUrl& url) { - bool ok = false; - - if (newName.isEmpty() || (source.fileName() == newName)) { + if (m_controller->url() == url) { return; } - KUrl dest(source.upUrl()); - dest.addPath(newName); - - const bool destExists = KIO::NetAccess::exists(dest, false, this); - if (destExists) { - // the destination already exists, hence ask the user - // how to proceed... - KIO::RenameDialog renameDialog(this, - i18n("File Already Exists"), - source.path(), - dest.path(), - KIO::M_OVERWRITE); - switch (renameDialog.exec()) { - case KIO::R_OVERWRITE: - // the destination should be overwritten - ok = KIO::NetAccess::file_move(source, dest, -1, true); - break; - - case KIO::R_RENAME: { - // a new name for the destination has been used - KUrl newDest(renameDialog.newDestUrl()); - ok = KIO::NetAccess::file_move(source, newDest); - break; - } - - default: - // the renaming operation has been canceled - return; - } - } else { - // no destination exists, hence just move the file to - // do the renaming - ok = KIO::NetAccess::file_move(source, dest); - } - - const QString destFileName = dest.fileName(); - if (ok) { - // XYDZ - //m_statusBar->setMessage(i18n("Renamed file '%1' to '%2'.", source.fileName(), destFileName), - // DolphinStatusBar::OperationCompleted); - - KonqOperations::rename(this, source, destFileName); - } else { - // XYDZ - //m_statusBar->setMessage(i18n("Renaming of file '%1' to '%2' failed.", source.fileName(), destFileName), - // DolphinStatusBar::Error); - } -} + m_controller->setUrl(url); -void DolphinView::reload() -{ - setUrl(url()); - startDirLister(url(), true); -} + applyViewProperties(url); -void DolphinView::refresh() -{ - createView(); - reload(); + startDirLister(url); + emit urlChanged(url); } void DolphinView::mouseReleaseEvent(QMouseEvent* event) @@ -576,18 +484,11 @@ void DolphinView::triggerItem(const QModelIndex& index) return; } - // Prefer the local path over the URL. This assures that the - // volume space information is correct. Assuming that the URL is media:/sda1, - // and the local path is /windows/C: For the URL the space info is related - // to the root partition (and hence wrong) and for the local path the space - // info is related to the windows partition (-> correct). - const QString localPath(item->localPath()); - KUrl url; - if (localPath.isEmpty()) { - url = item->url(); - } else { - url = localPath; - } + // The stuff below should be moved to ViewContainer and be just a signal? + + // Prefer the local path over the URL. + bool isLocal; + KUrl url = item->mostLocalUrl(isLocal); if (item->isDir()) { setUrl(url); @@ -649,20 +550,6 @@ void DolphinView::showPreview(const KFileItem& item, const QPixmap& pixmap) } } -void DolphinView::restoreContentsPos() -{ - m_blockContentsMovedSignal = false; - if (!url().isEmpty()) { - QAbstractItemView* view = itemView(); - // TODO #1: view->setCurrentItem(m_urlNavigator->currentFileName()); - // TODO #2: temporary deactivated due to DolphinView/DolphinViewController split - //QPoint pos = m_urlNavigator->savedPosition(); - QPoint pos(0, 0); - view->horizontalScrollBar()->setValue(pos.x()); - view->verticalScrollBar()->setValue(pos.y()); - } -} - void DolphinView::emitSelectionChangedSignal() { emit selectionChanged(DolphinView::selectedItems()); @@ -671,33 +558,18 @@ void DolphinView::emitSelectionChangedSignal() void DolphinView::startDirLister(const KUrl& url, bool reload) { if (!url.isValid()) { - // TODO: temporary deactivated due to DolphinView/DolphinViewController split - - //const QString location(url.pathOrUrl()); - //if (location.isEmpty()) { - // m_statusBar->setMessage(i18n("The location is empty."), DolphinStatusBar::Error); - //} else { - // m_statusBar->setMessage(i18n("The location '%1' is invalid.", location), - // DolphinStatusBar::Error); - //} + const QString location(url.pathOrUrl()); + if (location.isEmpty()) { + emit errorMessage(i18nc("@info:status", "The location is empty.")); + } else { + emit errorMessage(i18nc("@info:status", "The location '%1' is invalid.", location)); + } return; } - // Only show the directory loading progress if the status bar does - // not contain another progress information. This means that - // the directory loading progress information has the lowest priority. - - // TODO: temporary deactivated due to DolphinView/DolphinViewController split - //const QString progressText(m_statusBar->progressText()); - //m_showProgress = progressText.isEmpty() || - // (progressText == i18n("Loading folder...")); - //if (m_showProgress) { - // m_statusBar->setProgressText(i18n("Loading folder...")); - // m_statusBar->setProgress(0); - //} - m_cutItemsCache.clear(); - m_blockContentsMovedSignal = true; + m_loadingDirectory = true; + m_dirLister->stop(); bool openDir = true; @@ -738,27 +610,28 @@ void DolphinView::startDirLister(const KUrl& url, bool reload) } } -void DolphinView::setUrl(const KUrl& url) +KUrl DolphinView::viewPropertiesUrl() const { - if (m_controller->url() == url) { - return; + if (isColumnViewActive()) { + return m_dirLister->url(); } - m_controller->setUrl(url); + return url(); +} + +void DolphinView::applyViewProperties(const KUrl& url) +{ + if (isColumnViewActive() && m_dirLister->url().isParentOf(url)) { + // The column view is active, hence don't apply the view properties + // of sub directories (represented by columns) to the view. The + // view always represents the properties of the first column. + return; + } const ViewProperties props(url); const Mode mode = props.viewMode(); - bool changeMode = (m_mode != mode); - if (changeMode && isColumnViewActive()) { - // The column view is active. Only change the - // mode if the current URL is no child of the column view. - if (m_dirLister->url().isParentOf(url)) { - changeMode = false; - } - } - - if (changeMode) { + if (m_mode != mode) { m_mode = mode; createView(); emit modeChanged(); @@ -771,6 +644,11 @@ void DolphinView::setUrl(const KUrl& url) m_initializeColumnView = true; } } + if (itemView() == 0) { + createView(); + } + Q_ASSERT(itemView() != 0); + Q_ASSERT(m_fileItemDelegate != 0); const bool showHiddenFiles = props.showHiddenFiles(); if (showHiddenFiles != m_dirLister->showingDotFiles()) { @@ -818,12 +696,6 @@ void DolphinView::setUrl(const KUrl& url) m_controller->setShowPreview(showPreview); emit showPreviewChanged(); } - - startDirLister(url); - emit urlChanged(url); - - // TODO: temporary deactivated due to DolphinView/DolphinViewController split - //m_statusBar->clear(); } void DolphinView::changeSelection(const KFileItemList& selection) @@ -892,7 +764,7 @@ void DolphinView::dropUrls(const KUrl::List& urls, void DolphinView::updateSorting(DolphinView::Sorting sorting) { - ViewProperties props(url()); + ViewProperties props(viewPropertiesUrl()); props.setSorting(sorting); m_proxyModel->setSorting(sorting); @@ -902,7 +774,7 @@ void DolphinView::updateSorting(DolphinView::Sorting sorting) void DolphinView::updateSortOrder(Qt::SortOrder order) { - ViewProperties props(url()); + ViewProperties props(viewPropertiesUrl()); props.setSortOrder(order); m_proxyModel->setSortOrder(order); @@ -912,8 +784,14 @@ void DolphinView::updateSortOrder(Qt::SortOrder order) void DolphinView::emitContentsMoved() { - if (!m_blockContentsMovedSignal) { - emit contentsMoved(contentsX(), contentsY()); + // only emit the contents moved signal if: + // - no directory loading is ongoing (this would reset the contents position + // always to (0, 0)) + // - if the Column View is active: the column view does an automatic + // positioning during the loading operation, which must be remembered + if (!m_loadingDirectory || isColumnViewActive()) { + const QPoint pos(contentsPosition()); + emit contentsMoved(pos.x(), pos.y()); } } @@ -944,17 +822,13 @@ void DolphinView::showHoverInformation(const QModelIndex& index) const KFileItem* item = fileItem(index); if (item != 0) { - // TODO: temporary deactivated due to DolphinView/DolphinViewController split - //m_statusBar->setMessage(item->getStatusBarInfo(), DolphinStatusBar::Default); - emit requestItemInfo(item->url()); + emit requestItemInfo(*item); } } void DolphinView::clearHoverInformation() { - // TODO: temporary deactivated due to DolphinView/DolphinViewController split - //m_statusBar->clear(); - emit requestItemInfo(KUrl()); + emit requestItemInfo(KFileItem()); } @@ -1019,19 +893,6 @@ void DolphinView::createView() this, SLOT(emitContentsMoved())); } -void DolphinView::selectAll(QItemSelectionModel::SelectionFlags flags) -{ - QItemSelectionModel* selectionModel = itemView()->selectionModel(); - const QAbstractItemModel* itemModel = selectionModel->model(); - - const QModelIndex topLeft = itemModel->index(0, 0); - const QModelIndex bottomRight = itemModel->index(itemModel->rowCount() - 1, - itemModel->columnCount() - 1); - - QItemSelection selection(topLeft, bottomRight); - selectionModel->select(selection, flags); -} - QAbstractItemView* DolphinView::itemView() const { if (m_detailsView != 0) {