X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/253c3c87a8a1b6418125f6fd90864c8daa76a0c1..c8072005fada01d772595ec64adca449134f421e:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 7fc727475..31ee64fed 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -29,7 +29,6 @@ #include #include -#include #include #include #include @@ -42,21 +41,22 @@ #include #include +#include "dolphinmodel.h" #include "dolphincolumnview.h" #include "dolphincontroller.h" #include "dolphinsortfilterproxymodel.h" #include "dolphindetailsview.h" #include "dolphiniconsview.h" -#include "dolphinitemcategorizer.h" #include "renamedialog.h" #include "viewproperties.h" #include "dolphinsettings.h" #include "dolphin_generalsettings.h" +#include "dolphincategorydrawer.h" DolphinView::DolphinView(QWidget* parent, const KUrl& url, KDirLister* dirLister, - KDirModel* dirModel, + DolphinModel* dolphinModel, DolphinSortFilterProxyModel* proxyModel) : QWidget(parent), m_active(true), @@ -69,7 +69,7 @@ DolphinView::DolphinView(QWidget* parent, m_detailsView(0), m_columnView(0), m_fileItemDelegate(0), - m_dirModel(dirModel), + m_dolphinModel(dolphinModel), m_dirLister(dirLister), m_proxyModel(proxyModel) { @@ -84,8 +84,8 @@ DolphinView::DolphinView(QWidget* parent, connect(m_dirLister, SIGNAL(completed()), this, SLOT(updateCutItems())); - connect(m_dirLister, SIGNAL(newItems(const KFileItemList&)), - this, SLOT(generatePreviews(const KFileItemList&))); + connect(m_dirLister, SIGNAL(newItems(const QList&)), + this, SLOT(generatePreviews(const QList&))); m_controller = new DolphinController(this); m_controller->setUrl(url); @@ -134,19 +134,7 @@ void DolphinView::setActive(bool active) m_active = active; - QColor color = KColorScheme(KColorScheme::View).background(); - if (active) { - emit urlChanged(url()); - emit selectionChanged(selectedItems()); - } else { - color.setAlpha(0); - } - - QWidget* viewport = itemView()->viewport(); - QPalette palette; - palette.setColor(viewport->backgroundRole(), color); - viewport->setPalette(palette); - + updateViewportColor(); update(); if (active) { @@ -236,30 +224,20 @@ void DolphinView::setCategorizedSorting(bool categorized) } Q_ASSERT(m_iconsView != 0); - if (categorized) { - Q_ASSERT(m_iconsView->itemCategorizer() == 0); - m_iconsView->setItemCategorizer(new DolphinItemCategorizer()); - } else { - KItemCategorizer* categorizer = m_iconsView->itemCategorizer(); - m_iconsView->setItemCategorizer(0); - delete categorizer; - } ViewProperties props(viewPropertiesUrl()); props.setCategorizedSorting(categorized); props.save(); + m_proxyModel->setCategorizedModel(categorized); + m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder()); + emit categorizedSortingChanged(); } bool DolphinView::categorizedSorting() const { - if (!supportsCategorizedSorting()) { - return false; - } - - Q_ASSERT(m_iconsView != 0); - return m_iconsView->itemCategorizer() != 0; + return m_proxyModel->isCategorizedModel(); } bool DolphinView::supportsCategorizedSorting() const @@ -269,12 +247,20 @@ bool DolphinView::supportsCategorizedSorting() const void DolphinView::selectAll() { - selectAll(QItemSelectionModel::Select); + itemView()->selectAll(); } void DolphinView::invertSelection() { - selectAll(QItemSelectionModel::Toggle); + 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, QItemSelectionModel::Toggle); } bool DolphinView::hasSelection() const @@ -287,24 +273,21 @@ void DolphinView::clearSelection() itemView()->selectionModel()->clear(); } -KFileItemList DolphinView::selectedItems() const +QList DolphinView::selectedItems() const { const QAbstractItemView* view = itemView(); - // Our view has a selection, we will map them back to the DirModel + // Our view has a selection, we will map them back to the DolphinModel // and then fill the KFileItemList. Q_ASSERT((view != 0) && (view->selectionModel() != 0)); const QItemSelection selection = m_proxyModel->mapSelectionToSource(view->selectionModel()->selection()); - KFileItemList itemList; + QList 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) { + foreach (QModelIndex index, indexList) { + KFileItem item = m_dolphinModel->itemForIndex(index); + if (!item.isNull()) { itemList.append(item); } } @@ -315,29 +298,28 @@ KFileItemList DolphinView::selectedItems() const KUrl::List DolphinView::selectedUrls() const { 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; + const QList list = selectedItems(); + for ( QList::const_iterator it = list.begin(), end = list.end(); + it != end; ++it ) { + urls.append((*it).url()); } - return urls; } -KFileItem* DolphinView::fileItem(const QModelIndex index) const +KFileItem DolphinView::fileItem(const QModelIndex& index) const { - const QModelIndex dirModelIndex = m_proxyModel->mapToSource(index); - return m_dirModel->itemForIndex(dirModelIndex); + const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index); + return m_dolphinModel->itemForIndex(dolphinModelIndex); } void DolphinView::setContentsPosition(int x, int y) { QAbstractItemView* view = itemView(); - view->horizontalScrollBar()->setValue(x); + + // the ColumnView takes care itself for the horizontal scrolling + if (!isColumnViewActive()) { + view->horizontalScrollBar()->setValue(x); + } view->verticalScrollBar()->setValue(y); m_loadingDirectory = false; @@ -423,6 +405,7 @@ void DolphinView::refresh() createView(); applyViewProperties(m_controller->url()); reload(); + updateViewportColor(); } void DolphinView::setUrl(const KUrl& url) @@ -431,12 +414,12 @@ void DolphinView::setUrl(const KUrl& url) return; } - m_controller->setUrl(url); + m_controller->setUrl(url); // emits urlChanged, which we forward applyViewProperties(url); startDirLister(url); - emit urlChanged(url); + itemView()->setFocus(); } void DolphinView::mouseReleaseEvent(QMouseEvent* event) @@ -451,11 +434,7 @@ void DolphinView::activate() void DolphinView::triggerItem(const QModelIndex& index) { - if (!isValidNameIndex(index)) { - clearSelection(); - showHoverInformation(index); - return; - } + Q_ASSERT(index.isValid()); const Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers(); if ((modifier & Qt::ShiftModifier) || (modifier & Qt::ControlModifier)) { @@ -464,50 +443,19 @@ void DolphinView::triggerItem(const QModelIndex& index) return; } - KFileItem* item = m_dirModel->itemForIndex(m_proxyModel->mapToSource(index)); - if (item == 0) { + const KFileItem item = m_dolphinModel->itemForIndex(m_proxyModel->mapToSource(index)); + + if (item.isNull()) { return; } - // 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); - } else if (item->isFile()) { - // allow to browse through ZIP and tar files - KMimeType::Ptr mime = item->mimeTypePtr(); - if (mime->is("application/zip")) { - url.setProtocol("zip"); - setUrl(url); - } else if (mime->is("application/x-tar") || - mime->is("application/x-tarz") || - mime->is("application/x-bzip-compressed-tar") || - mime->is("application/x-compressed-tar") || - mime->is("application/x-tzo")) { - url.setProtocol("tar"); - setUrl(url); - } else { - item->run(); - } - } else { - item->run(); - } + emit itemTriggered(item); // caught by DolphinViewContainer or DolphinPart } -void DolphinView::generatePreviews(const KFileItemList& items) +void DolphinView::generatePreviews(const QList& items) { if (m_controller->showPreview()) { - - // Must turn QList to QList... - QList itemsToPreview; - foreach( KFileItem* it, items ) - itemsToPreview.append( *it ); - - KIO::PreviewJob* job = KIO::filePreview(itemsToPreview, 128); + KIO::PreviewJob* job = KIO::filePreview(items, 128); connect(job, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)), this, SLOT(showPreview(const KFileItem&, const QPixmap&))); } @@ -522,15 +470,15 @@ void DolphinView::showPreview(const KFileItem& item, const QPixmap& pixmap) return; } - const QModelIndex idx = m_dirModel->indexForItem(item); + const QModelIndex idx = m_dolphinModel->indexForItem(item); if (idx.isValid() && (idx.column() == 0)) { const QMimeData* mimeData = QApplication::clipboard()->mimeData(); if (KonqMimeData::decodeIsCutSelection(mimeData) && isCutItem(item)) { KIconEffect iconEffect; const QPixmap cutPixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState); - m_dirModel->setData(idx, QIcon(cutPixmap), Qt::DecorationRole); + m_dolphinModel->setData(idx, QIcon(cutPixmap), Qt::DecorationRole); } else { - m_dirModel->setData(idx, QIcon(pixmap), Qt::DecorationRole); + m_dolphinModel->setData(idx, QIcon(pixmap), Qt::DecorationRole); } } } @@ -583,7 +531,7 @@ void DolphinView::startDirLister(const KUrl& url, bool reload) const KUrl& dirListerUrl = m_dirLister->url(); if ((dirListerUrl == url) || !m_dirLister->url().isParentOf(url)) { // The current URL is not a child of the dir lister - // URL. This may happen when e. g. a bookmark has been selected + // URL. This may happen when e. g. a place has been selected // and hence the view must be reset. keepOldDirs = false; } @@ -643,17 +591,7 @@ void DolphinView::applyViewProperties(const KUrl& url) const bool categorized = props.categorizedSorting(); if (categorized != categorizedSorting()) { - if (supportsCategorizedSorting()) { - Q_ASSERT(m_iconsView != 0); - if (categorized) { - Q_ASSERT(m_iconsView->itemCategorizer() == 0); - m_iconsView->setItemCategorizer(new DolphinItemCategorizer()); - } else { - KItemCategorizer* categorizer = m_iconsView->itemCategorizer(); - m_iconsView->setItemCategorizer(0); - delete categorizer; - } - } + m_proxyModel->setCategorizedModel(categorized); emit categorizedSortingChanged(); } @@ -683,7 +621,7 @@ void DolphinView::applyViewProperties(const KUrl& url) } } -void DolphinView::changeSelection(const KFileItemList& selection) +void DolphinView::changeSelection(const QList& selection) { clearSelection(); if (selection.isEmpty()) { @@ -692,10 +630,10 @@ void DolphinView::changeSelection(const KFileItemList& selection) const KUrl& baseUrl = url(); KUrl url; QItemSelection new_selection; - foreach(KFileItem* item, selection) { - url = item->url().upUrl(); + foreach(const KFileItem& item, selection) { + url = item.url().upUrl(); if (baseUrl.equals(url, KUrl::CompareWithoutTrailingSlash)) { - QModelIndex index = m_proxyModel->mapFromSource(m_dirModel->indexForItem(*item)); + QModelIndex index = m_proxyModel->mapFromSource(m_dolphinModel->indexForItem(item)); new_selection.select(index, index); } } @@ -706,7 +644,7 @@ void DolphinView::changeSelection(const KFileItemList& selection) void DolphinView::openContextMenu(const QPoint& pos) { - KFileItem* item = 0; + KFileItem item; const QModelIndex index = itemView()->indexAt(pos); if (isValidNameIndex(index)) { @@ -720,24 +658,24 @@ void DolphinView::dropUrls(const KUrl::List& urls, const QModelIndex& index, QWidget* source) { - KFileItem* directory = 0; + KFileItem directory; if (isValidNameIndex(index)) { - KFileItem* item = fileItem(index); - Q_ASSERT(item != 0); - if (item->isDir()) { + KFileItem item = fileItem(index); + Q_ASSERT(!item.isNull()); + if (item.isDir()) { // the URLs are dropped above a directory directory = item; } } - if ((directory == 0) && (source == itemView())) { + if ((directory.isNull()) && (source == itemView())) { // The dropping is done into the same viewport where // the dragging has been started. Just ignore this... return; } - const KUrl& destination = (directory == 0) ? - url() : directory->url(); + const KUrl& destination = (directory.isNull()) ? + url() : directory.url(); dropUrls(urls, destination); } @@ -787,9 +725,9 @@ void DolphinView::updateCutItems() QList::const_iterator it = m_cutItemsCache.begin(); QList::const_iterator end = m_cutItemsCache.end(); while (it != end) { - const QModelIndex index = m_dirModel->indexForUrl((*it).url); + const QModelIndex index = m_dolphinModel->indexForUrl((*it).url); if (index.isValid()) { - m_dirModel->setData(index, QIcon((*it).pixmap), Qt::DecorationRole); + m_dolphinModel->setData(index, QIcon((*it).pixmap), Qt::DecorationRole); } ++it; } @@ -805,9 +743,9 @@ void DolphinView::showHoverInformation(const QModelIndex& index) return; } - const KFileItem* item = fileItem(index); - if (item != 0) { - emit requestItemInfo(*item); + const KFileItem item = fileItem(index); + if (!item.isNull()) { + emit requestItemInfo(item); } } @@ -824,11 +762,6 @@ void DolphinView::createView() if (view != 0) { m_topLayout->removeWidget(view); view->close(); - if (view == m_iconsView) { - KItemCategorizer* categorizer = m_iconsView->itemCategorizer(); - m_iconsView->setItemCategorizer(0); - delete categorizer; - } view->deleteLater(); view = 0; m_iconsView = 0; @@ -845,6 +778,7 @@ void DolphinView::createView() switch (m_mode) { case IconsView: m_iconsView = new DolphinIconsView(this, m_controller); + m_iconsView->setCategoryDrawer(new DolphinCategoryDrawer()); view = m_iconsView; break; @@ -867,7 +801,7 @@ void DolphinView::createView() view->setModel(m_proxyModel); view->setSelectionMode(QAbstractItemView::ExtendedSelection); - new KMimeTypeResolver(view, m_dirModel); + new KMimeTypeResolver(view, m_dolphinModel); m_topLayout->insertWidget(1, view); connect(view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), @@ -876,19 +810,7 @@ void DolphinView::createView() this, SLOT(emitContentsMoved())); connect(view->horizontalScrollBar(), SIGNAL(valueChanged(int)), 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); + view->setFocus(); } QAbstractItemView* DolphinView::itemView() const @@ -904,7 +826,7 @@ QAbstractItemView* DolphinView::itemView() const bool DolphinView::isValidNameIndex(const QModelIndex& index) const { - return index.isValid() && (index.column() == KDirModel::Name); + return index.isValid() && (index.column() == DolphinModel::Name); } bool DolphinView::isCutItem(const KFileItem& item) const @@ -938,10 +860,11 @@ void DolphinView::applyCutItemEffect() while (it != end) { KFileItem* item = *it; if (isCutItem(*item)) { - const QModelIndex index = m_dirModel->indexForItem(*item); - const KFileItem* item = m_dirModel->itemForIndex(index); - const QVariant value = m_dirModel->data(index, Qt::DecorationRole); - if ((value.type() == QVariant::Icon) && (item != 0)) { + const QModelIndex index = m_dolphinModel->indexForItem(*item); + // Huh? the item is already known + //const KFileItem item = m_dolphinModel->itemForIndex(index); + const QVariant value = m_dolphinModel->data(index, Qt::DecorationRole); + if (value.type() == QVariant::Icon) { const QIcon icon(qvariant_cast(value)); QPixmap pixmap = icon.pixmap(128, 128); @@ -955,11 +878,27 @@ void DolphinView::applyCutItemEffect() // apply icon effect to the cut item KIconEffect iconEffect; pixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState); - m_dirModel->setData(index, QIcon(pixmap), Qt::DecorationRole); + m_dolphinModel->setData(index, QIcon(pixmap), Qt::DecorationRole); } } ++it; } } +void DolphinView::updateViewportColor() +{ + QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color(); + if (m_active) { + emit urlChanged(url()); // Hmm, this is a hack; the url hasn't really changed. + emit selectionChanged(selectedItems()); + } else { + color.setAlpha(0); + } + + QWidget* viewport = itemView()->viewport(); + QPalette palette; + palette.setColor(viewport->backgroundRole(), color); + viewport->setPalette(palette); +} + #include "dolphinview.moc"