X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e46003aca365ca66ce7c7cccd47fb52d1da2fb91..56836b0e7a9d466db6412534f2bdb5ed546d0cb7:/src/dolphincolumnwidget.cpp diff --git a/src/dolphincolumnwidget.cpp b/src/dolphincolumnwidget.cpp index 1a7f712f3..3bb1f36c2 100644 --- a/src/dolphincolumnwidget.cpp +++ b/src/dolphincolumnwidget.cpp @@ -23,42 +23,41 @@ #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 "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(), - m_viewOptions(), + m_font(), + m_decorationSize(), m_dirLister(0), m_dolphinModel(0), m_proxyModel(0), + m_iconManager(0), m_dragging(false), m_dropRect() { @@ -70,6 +69,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. @@ -84,17 +84,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); @@ -113,8 +108,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); @@ -122,22 +115,28 @@ 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_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_dirLister; - m_dirLister = 0; + delete m_proxyModel; + m_proxyModel = 0; + delete m_dolphinModel; + m_dolphinModel = 0; + m_dirLister = 0; // deleted by m_dolphinModel } void DolphinColumnWidget::setDecorationSize(const QSize& size) { - m_viewOptions.decorationSize = size; + m_decorationSize = size; doItemsLayout(); } @@ -173,20 +172,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(); @@ -197,6 +200,16 @@ void DolphinColumnWidget::setNameFilter(const QString& nameFilter) m_proxyModel->setFilterRegExp(nameFilter); } + +QStyleOptionViewItem DolphinColumnWidget::viewOptions() const +{ + 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); @@ -227,12 +240,20 @@ 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); - if (itemForIndex(index).isDir()) { - m_dropRect = visualRect(index); - } else { - m_dropRect.setSize(QSize()); // set as invalid + + 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) @@ -275,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); - DragAndDropHelper::drawHoverIndication(viewport(), m_dropRect, brush); + const QBrush& brush = viewOptions().palette.brush(QPalette::Normal, QPalette::Highlight); + DragAndDropHelper::drawHoverIndication(this, m_dropRect, brush); } } @@ -338,43 +359,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); @@ -397,13 +381,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(); } @@ -423,31 +402,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);