X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/88f17ca75add13baf3ac633e57865136deba02cc..c6992dd7f898a5c92b52d54a032efd1beef40980:/src/dolphincolumnwidget.cpp diff --git a/src/dolphincolumnwidget.cpp b/src/dolphincolumnwidget.cpp index 7bf644a95..195d0fc01 100644 --- a/src/dolphincolumnwidget.cpp +++ b/src/dolphincolumnwidget.cpp @@ -23,27 +23,24 @@ #include "dolphincolumnview.h" #include "dolphincontroller.h" #include "dolphindirlister.h" -#include "dolphinmodel.h" #include "dolphinsortfilterproxymodel.h" #include "dolphinsettings.h" - #include "dolphin_columnmodesettings.h" +#include "draganddrophelper.h" -#include #include #include #include #include #include +#include +#include #include -#include #include #include +#include #include -#include -#include -#include DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, DolphinColumnView* columnView, @@ -54,10 +51,12 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, m_view(columnView), m_url(url), m_childUrl(), - m_viewOptions(), + m_font(), + m_decorationSize(), m_dirLister(0), m_dolphinModel(0), m_proxyModel(0), + m_previewJob(0), m_dragging(false), m_dropRect() { @@ -69,6 +68,7 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, 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. @@ -83,17 +83,12 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, const ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); Q_ASSERT(settings != 0); - m_viewOptions = QListView::viewOptions(); - - QFont font(settings->fontFamily(), settings->fontSize()); - font.setItalic(settings->italicFont()); - font.setBold(settings->boldFont()); - m_viewOptions.font = font; + m_font = QFont(settings->fontFamily(), settings->fontSize()); + m_font.setItalic(settings->italicFont()); + m_font.setBold(settings->boldFont()); const int iconSize = settings->iconSize(); - m_viewOptions.decorationSize = QSize(iconSize, iconSize); - - m_viewOptions.showDecorationSelected = true; + m_decorationSize = QSize(iconSize, iconSize); KFileItemDelegate* delegate = new KFileItemDelegate(this); setItemDelegate(delegate); @@ -110,7 +105,8 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, m_dirLister->setAutoUpdate(true); m_dirLister->setMainWindow(this); m_dirLister->setDelayedMimeTypes(true); - m_dirLister->setShowingDotFiles(m_view->m_controller->showHiddenFiles()); + 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&))); @@ -120,21 +116,31 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, m_proxyModel = new DolphinSortFilterProxyModel(this); m_proxyModel->setSourceModel(m_dolphinModel); + m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); setModel(m_proxyModel); + new KMimeTypeResolver(this, m_dolphinModel); m_dirLister->openUrl(url, KDirLister::NoFlags); } DolphinColumnWidget::~DolphinColumnWidget() { - delete m_dirLister; - m_dirLister = 0; + delete m_proxyModel; + m_proxyModel = 0; + delete m_dolphinModel; + m_dolphinModel = 0; + m_dirLister = 0; // deleted by m_dolphinModel + + if (m_previewJob != 0) { + m_previewJob->kill(); + m_previewJob = 0; + } } void DolphinColumnWidget::setDecorationSize(const QSize& size) { - m_viewOptions.decorationSize = size; + m_decorationSize = size; doItemsLayout(); } @@ -191,22 +197,22 @@ void DolphinColumnWidget::updateBackground() void DolphinColumnWidget::setNameFilter(const QString& nameFilter) { - // The name filter of KDirLister does a 'hard' filtering, which - // means that only the items are shown where the names match - // exactly the filter. This is non-transparent for the user, which - // just wants to have a 'soft' filtering: does the name contain - // the filter string? - QString adjustedFilter(nameFilter); - adjustedFilter.insert(0, '*'); - adjustedFilter.append('*'); - - m_dirLister->setNameFilter(adjustedFilter); - m_dirLister->emitChanges(); + m_proxyModel->setFilterRegExp(nameFilter); } -QString DolphinColumnWidget::nameFilter() const + +QStyleOptionViewItem DolphinColumnWidget::viewOptions() const { - return m_dirLister->nameFilter(); + QStyleOptionViewItem viewOptions = QListView::viewOptions(); + viewOptions.font = m_font; + viewOptions.decorationSize = m_decorationSize; + viewOptions.showDecorationSelected = true; + return viewOptions; +} + +void DolphinColumnWidget::startDrag(Qt::DropActions supportedActions) +{ + DragAndDropHelper::startDrag(this, supportedActions); } void DolphinColumnWidget::dragEnterEvent(QDragEnterEvent* event) @@ -234,19 +240,32 @@ void DolphinColumnWidget::dragMoveEvent(QDragMoveEvent* event) // TODO: remove this code when the issue #160611 is solved in Qt 4.4 const QModelIndex index = indexAt(event->pos()); setDirtyRegion(m_dropRect); - m_dropRect = visualRect(index); + + m_dropRect.setSize(QSize()); // set as invalid + if (index.isValid()) { + const KFileItem item = itemForIndex(index); + if (!item.isNull() && item.isDir()) { + m_dropRect = visualRect(index); + } + } setDirtyRegion(m_dropRect); + + if (event->mimeData()->hasUrls()) { + // accept url drops, independently from the destination item + event->acceptProposedAction(); + } } void DolphinColumnWidget::dropEvent(QDropEvent* event) { const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); if (!urls.isEmpty()) { - event->acceptProposedAction(); + const QModelIndex index = indexAt(event->pos()); + const KFileItem item = itemForIndex(index); m_view->m_controller->indicateDroppedUrls(urls, url(), - indexAt(event->pos()), - event->source()); + item); + event->acceptProposedAction(); } QListView::dropEvent(event); m_dragging = false; @@ -277,8 +296,8 @@ 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 = m_viewOptions.palette.brush(QPalette::Normal, QPalette::Highlight); - DolphinController::drawHoverIndication(viewport(), m_dropRect, brush); + const QBrush& brush = viewOptions().palette.brush(QPalette::Normal, QPalette::Highlight); + DragAndDropHelper::drawHoverIndication(this, m_dropRect, brush); } } @@ -333,9 +352,10 @@ void DolphinColumnWidget::selectionChanged(const QItemSelection& selected, const selModel->select(selected, QItemSelectionModel::Select); selModel->select(deselected, QItemSelectionModel::Deselect); } + void DolphinColumnWidget::triggerItem(const QModelIndex& index) { - const KFileItem item = m_dolphinModel->itemForIndex(m_proxyModel->mapToSource(index)); + const KFileItem item = itemForIndex(index); m_view->m_controller->triggerItem(item); } @@ -344,20 +364,28 @@ 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->showPreview()) { - KIO::PreviewJob* job = KIO::filePreview(items, 128); - connect(job, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)), - this, SLOT(showPreview(const KFileItem&, const QPixmap&))); + if (m_view->m_controller->dolphinView()->showPreview()) { + if (m_previewJob != 0) { + m_previewJob->kill(); + m_previewJob = 0; + } + + m_previewJob = KIO::filePreview(items, 128); + connect(m_previewJob, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)), + this, SLOT(replaceIcon(const KFileItem&, const QPixmap&))); + connect(m_previewJob, SIGNAL(finished(KJob*)), + this, SLOT(slotPreviewJobFinished(KJob*))); } } -void DolphinColumnWidget::showPreview(const KFileItem& item, const QPixmap& pixmap) +void DolphinColumnWidget::replaceIcon(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()) { + const bool showPreview = m_view->m_controller->dolphinView()->showPreview(); + if (!showPreview || (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; @@ -383,6 +411,12 @@ void DolphinColumnWidget::slotEntered(const QModelIndex& index) m_view->m_controller->emitItemEntered(item); } +void DolphinColumnWidget::slotPreviewJobFinished(KJob* job) +{ + Q_ASSERT(job == m_previewJob); + m_previewJob = 0; +} + void DolphinColumnWidget::activate() { setFocus(Qt::OtherFocusReason); @@ -449,4 +483,11 @@ bool DolphinColumnWidget::isCutItem(const KFileItem& item) const return false; } +KFileItem DolphinColumnWidget::itemForIndex(const QModelIndex& index) const +{ + const QModelIndex dirIndex = m_proxyModel->mapToSource(index); + return m_dolphinModel->itemForIndex(dirIndex); +} + + #include "dolphincolumnwidget.moc"