X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/54dfdc930a5511eae2b15f3e87e5d1cd425bdbe4..3d4e6938f57fcf010b4fda7255384098327eb67d:/src/dolphincolumnwidget.cpp diff --git a/src/dolphincolumnwidget.cpp b/src/dolphincolumnwidget.cpp index a559e3098..ba5632502 100644 --- a/src/dolphincolumnwidget.cpp +++ b/src/dolphincolumnwidget.cpp @@ -23,35 +23,34 @@ #include "dolphincolumnview.h" #include "dolphincontroller.h" #include "dolphindirlister.h" -#include "dolphinmodel.h" #include "dolphinsortfilterproxymodel.h" #include "dolphinsettings.h" #include "dolphin_columnmodesettings.h" +#include "dolphin_generalsettings.h" #include "draganddrophelper.h" +#include "selectionmanager.h" -#include #include #include #include #include #include +#include #include #include -#include +#include "iconmanager.h" + #include #include +#include #include -#include -#include -#include DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, DolphinColumnView* columnView, const KUrl& url) : QListView(parent), m_active(true), - m_showPreview(false), m_view(columnView), m_url(url), m_childUrl(), @@ -60,17 +59,19 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, m_dirLister(0), m_dolphinModel(0), m_proxyModel(0), + m_iconManager(0), m_dragging(false), m_dropRect() { setMouseTracking(true); viewport()->setAttribute(Qt::WA_Hover); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); setSelectionBehavior(SelectItems); setSelectionMode(QAbstractItemView::ExtendedSelection); setDragDropMode(QAbstractItemView::DragDrop); setDropIndicatorShown(false); + setSelectionRectVisible(true); // TODO: Remove this check when 4.3.2 is released and KDE requires it... this // check avoids a division by zero happening on versions before 4.3.1. @@ -90,7 +91,7 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, m_font.setBold(settings->boldFont()); const int iconSize = settings->iconSize(); - m_decorationSize = QSize(iconSize, iconSize); + setDecorationSize(QSize(iconSize, iconSize)); KFileItemDelegate* delegate = new KFileItemDelegate(this); setItemDelegate(delegate); @@ -109,8 +110,6 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, m_dirLister->setDelayedMimeTypes(true); const bool showHiddenFiles = m_view->m_controller->dolphinView()->showHiddenFiles(); m_dirLister->setShowingDotFiles(showHiddenFiles); - connect(m_dirLister, SIGNAL(newItems(const KFileItemList&)), - this, SLOT(generatePreviews(const KFileItemList&))); m_dolphinModel = new DolphinModel(this); m_dolphinModel->setDirLister(m_dirLister); @@ -118,15 +117,32 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, m_proxyModel = new DolphinSortFilterProxyModel(this); m_proxyModel->setSourceModel(m_dolphinModel); + m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); + const DolphinView* dolphinView = m_view->m_controller->dolphinView(); + m_proxyModel->setSorting(dolphinView->sorting()); + m_proxyModel->setSortOrder(dolphinView->sortOrder()); setModel(m_proxyModel); + const bool useSelManager = KGlobalSettings::singleClick() && + DolphinSettings::instance().generalSettings()->showSelectionToggle(); + if (useSelManager) { + SelectionManager* selManager = new SelectionManager(this); + connect(selManager, SIGNAL(selectionChanged()), + this, SLOT(requestActivation())); + connect(m_view->m_controller, SIGNAL(urlChanged(const KUrl&)), + selManager, SLOT(reset())); +} new KMimeTypeResolver(this, m_dolphinModel); + m_iconManager = new IconManager(this, m_proxyModel); + m_iconManager->setShowPreview(m_view->m_controller->dolphinView()->showPreview()); m_dirLister->openUrl(url, KDirLister::NoFlags); } DolphinColumnWidget::~DolphinColumnWidget() { + delete m_proxyModel; + m_proxyModel = 0; delete m_dolphinModel; m_dolphinModel = 0; m_dirLister = 0; // deleted by m_dolphinModel @@ -134,6 +150,7 @@ DolphinColumnWidget::~DolphinColumnWidget() void DolphinColumnWidget::setDecorationSize(const QSize& size) { + setIconSize(size); m_decorationSize = size; doItemsLayout(); } @@ -159,6 +176,16 @@ void DolphinColumnWidget::reload() m_dirLister->openUrl(m_url, KDirLister::Reload); } +void DolphinColumnWidget::setSorting(DolphinView::Sorting sorting) +{ + m_proxyModel->setSorting(sorting); +} + +void DolphinColumnWidget::setSortOrder(Qt::SortOrder order) +{ + m_proxyModel->setSortOrder(order); +} + void DolphinColumnWidget::setShowHiddenFiles(bool show) { if (show != m_dirLister->showingDotFiles()) { @@ -170,20 +197,24 @@ void DolphinColumnWidget::setShowHiddenFiles(bool show) void DolphinColumnWidget::setShowPreview(bool show) { - if (show != m_showPreview) { - m_dirLister->stop(); - m_dirLister->openUrl(m_url, KDirLister::Reload); - } + m_iconManager->setShowPreview(show); + + m_dirLister->stop(); + m_dirLister->openUrl(m_url, KDirLister::Reload); } void DolphinColumnWidget::updateBackground() { - QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color(); - if (!m_active || !m_view->m_active) { - color.setAlpha(150); - } + // TODO: The alpha-value 150 is copied from DolphinView::setActive(). When + // cleaning up the cut-indication of DolphinColumnWidget with the code from + // DolphinView a common helper-class should be available which can be shared + // by all view implementations -> no hardcoded value anymore + const QPalette::ColorRole role = viewport()->backgroundRole(); + QColor color = viewport()->palette().color(role); + color.setAlpha((m_active && m_view->m_active) ? 255 : 150); + QPalette palette = viewport()->palette(); - palette.setColor(viewport()->backgroundRole(), color); + palette.setColor(role, color); viewport()->setPalette(palette); update(); @@ -243,6 +274,11 @@ void DolphinColumnWidget::dragMoveEvent(QDragMoveEvent* event) } } setDirtyRegion(m_dropRect); + + if (event->mimeData()->hasUrls()) { + // accept url drops, independently from the destination item + event->acceptProposedAction(); + } } void DolphinColumnWidget::dropEvent(QDropEvent* event) @@ -286,18 +322,13 @@ void DolphinColumnWidget::paintEvent(QPaintEvent* event) // TODO: remove this code when the issue #160611 is solved in Qt 4.4 if (m_dragging) { const QBrush& brush = viewOptions().palette.brush(QPalette::Normal, QPalette::Highlight); - DragAndDropHelper::drawHoverIndication(viewport(), m_dropRect, brush); + DragAndDropHelper::drawHoverIndication(this, m_dropRect, brush); } } void DolphinColumnWidget::mousePressEvent(QMouseEvent* event) { - m_view->m_controller->requestActivation(); - if (!m_active) { - m_view->requestActivation(this); - m_view->m_controller->triggerUrlChangeRequest(m_url); - } - + requestActivation(); QListView::mousePressEvent(event); } @@ -333,6 +364,16 @@ void DolphinColumnWidget::contextMenuEvent(QContextMenuEvent* event) } } +void DolphinColumnWidget::wheelEvent(QWheelEvent* event) +{ + // let Ctrl+wheel events propagate to the DolphinView for icon zooming + if ((event->modifiers() & Qt::ControlModifier) == Qt::ControlModifier) { + event->ignore(); + return; + } + QListView::wheelEvent(event); +} + void DolphinColumnWidget::selectionChanged(const QItemSelection& selected, const QItemSelection& deselected) { QListView::selectionChanged(selected, deselected); @@ -348,43 +389,6 @@ void DolphinColumnWidget::triggerItem(const QModelIndex& index) m_view->m_controller->triggerItem(item); } -void DolphinColumnWidget::generatePreviews(const KFileItemList& items) -{ - // TODO: same implementation as in DolphinView; create helper class - // for generatePreviews(), showPreview() and isCutItem() - - if (m_view->m_controller->dolphinView()->showPreview()) { - KIO::PreviewJob* job = KIO::filePreview(items, 128); - connect(job, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)), - this, SLOT(showPreview(const KFileItem&, const QPixmap&))); - } -} - -void DolphinColumnWidget::showPreview(const KFileItem& item, const QPixmap& pixmap) -{ - // TODO: same implementation as in DolphinView; create helper class - // for generatePreviews(), showPreview() and isCutItem() - - Q_ASSERT(!item.isNull()); - if (item.url().directory() != m_dirLister->url().path()) { - // the preview job is still working on items of an older URL, hence - // the item is not part of the directory model anymore - return; - } - - 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, KIconLoader::Desktop, KIconLoader::DisabledState); - m_dolphinModel->setData(idx, QIcon(cutPixmap), Qt::DecorationRole); - } else { - m_dolphinModel->setData(idx, QIcon(pixmap), Qt::DecorationRole); - } - } -} - void DolphinColumnWidget::slotEntered(const QModelIndex& index) { const QModelIndex dirIndex = m_proxyModel->mapToSource(index); @@ -392,6 +396,16 @@ void DolphinColumnWidget::slotEntered(const QModelIndex& index) m_view->m_controller->emitItemEntered(item); } +void DolphinColumnWidget::requestActivation() +{ + m_view->m_controller->requestActivation(); + if (!m_active) { + m_view->requestActivation(this); + m_view->m_controller->triggerUrlChangeRequest(m_url); + selectionModel()->clear(); + } +} + void DolphinColumnWidget::activate() { setFocus(Qt::OtherFocusReason); @@ -407,13 +421,8 @@ void DolphinColumnWidget::activate() this, SLOT(triggerItem(const QModelIndex&))); } - if (!m_childUrl.isEmpty()) { - // assure that the current index is set on the index that represents - // the child URL - const QModelIndex dirIndex = m_dolphinModel->indexForUrl(m_childUrl); - const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex); - selectionModel()->setCurrentIndex(proxyIndex, QItemSelectionModel::Current); - } + if (selectionModel() && selectionModel()->currentIndex().isValid()) + selectionModel()->setCurrentIndex(selectionModel()->currentIndex(), QItemSelectionModel::SelectCurrent); updateBackground(); } @@ -433,31 +442,12 @@ void DolphinColumnWidget::deactivate() this, SLOT(triggerItem(const QModelIndex&))); } + const QModelIndex current = selectionModel()->currentIndex(); selectionModel()->clear(); + selectionModel()->setCurrentIndex(current, QItemSelectionModel::NoUpdate); updateBackground(); } -bool DolphinColumnWidget::isCutItem(const KFileItem& item) const -{ - // TODO: same implementation as in DolphinView; create helper class - // for generatePreviews(), showPreview() and isCutItem() - - const QMimeData* mimeData = QApplication::clipboard()->mimeData(); - const KUrl::List cutUrls = KUrl::List::fromMimeData(mimeData); - - const KUrl& itemUrl = item.url(); - KUrl::List::const_iterator it = cutUrls.begin(); - const KUrl::List::const_iterator end = cutUrls.end(); - while (it != end) { - if (*it == itemUrl) { - return true; - } - ++it; - } - - return false; -} - KFileItem DolphinColumnWidget::itemForIndex(const QModelIndex& index) const { const QModelIndex dirIndex = m_proxyModel->mapToSource(index);