X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/29402a79bc09945ccd96201cbb42027b4c581a00..c6992dd7f898a5c92b52d54a032efd1beef40980:/src/dolphincolumnwidget.cpp diff --git a/src/dolphincolumnwidget.cpp b/src/dolphincolumnwidget.cpp index 94bee2bee..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,7 +68,7 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent, setSelectionMode(QAbstractItemView::ExtendedSelection); setDragDropMode(QAbstractItemView::DragDrop); setDropIndicatorShown(false); - setFocusPolicy(Qt::NoFocus); + 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,30 +83,20 @@ 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); activate(); - connect(this, SIGNAL(entered(const QModelIndex&)), - m_view->m_controller, SLOT(emitItemEntered(const QModelIndex&))); - connect(this, SIGNAL(viewportEntered()), - m_view->m_controller, SLOT(emitViewportEntered())); connect(this, SIGNAL(viewportEntered()), m_view->m_controller, SLOT(emitViewportEntered())); - connect(this, SIGNAL(entered(const QModelIndex&)), this, SLOT(slotEntered(const QModelIndex&))); @@ -116,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&))); @@ -126,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(); } @@ -182,6 +182,39 @@ void DolphinColumnWidget::setShowPreview(bool show) } } +void DolphinColumnWidget::updateBackground() +{ + QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color(); + if (!m_active || !m_view->m_active) { + color.setAlpha(150); + } + QPalette palette = viewport()->palette(); + palette.setColor(viewport()->backgroundRole(), color); + viewport()->setPalette(palette); + + update(); +} + +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); +} + void DolphinColumnWidget::dragEnterEvent(QDragEnterEvent* event) { if (event->mimeData()->hasUrls()) { @@ -207,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; @@ -250,15 +296,17 @@ 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); } } void DolphinColumnWidget::mousePressEvent(QMouseEvent* event) { + m_view->m_controller->requestActivation(); if (!m_active) { m_view->requestActivation(this); + m_view->m_controller->triggerUrlChangeRequest(m_url); } QListView::mousePressEvent(event); @@ -282,6 +330,7 @@ void DolphinColumnWidget::contextMenuEvent(QContextMenuEvent* event) { if (!m_active) { m_view->requestActivation(this); + m_view->m_controller->triggerUrlChangeRequest(m_url); } QListView::contextMenuEvent(event); @@ -303,25 +352,11 @@ void DolphinColumnWidget::selectionChanged(const QItemSelection& selected, const selModel->select(selected, QItemSelectionModel::Select); selModel->select(deselected, QItemSelectionModel::Deselect); } + void DolphinColumnWidget::triggerItem(const QModelIndex& index) { - const Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers(); - if ((modifier & Qt::ShiftModifier) || (modifier & Qt::ControlModifier)) { - // items are selected by the user, hence don't trigger the - // item specified by 'index' - return; - } - - // TODO: check ZIP support (see DolphinViewContainer::triggerItem) - KFileItem item = m_dolphinModel->itemForIndex(m_proxyModel->mapToSource(index)); - if (item.isDir()) { - bool isLocal; - const KUrl url = item.mostLocalUrl(isLocal); - m_view->showColumn(url); - m_view->m_controller->setUrl(url); - } else if (item.isFile()) { - item.run(); - } + const KFileItem item = itemForIndex(index); + m_view->m_controller->triggerItem(item); } void DolphinColumnWidget::generatePreviews(const KFileItemList& items) @@ -329,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; @@ -368,12 +411,15 @@ 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() { - if (m_view->hasFocus()) { - setFocus(Qt::OtherFocusReason); - } - m_view->setFocusProxy(this); + setFocus(Qt::OtherFocusReason); // TODO: Connecting to the signal 'activated()' is not possible, as kstyle // does not forward the single vs. doubleclick to it yet (KDE 4.1?). Hence it is @@ -386,11 +432,6 @@ void DolphinColumnWidget::activate() this, SLOT(triggerItem(const QModelIndex&))); } - const QColor bgColor = KColorScheme(QPalette::Active, KColorScheme::View).background().color(); - QPalette palette = viewport()->palette(); - palette.setColor(viewport()->backgroundRole(), bgColor); - viewport()->setPalette(palette); - if (!m_childUrl.isEmpty()) { // assure that the current index is set on the index that represents // the child URL @@ -399,11 +440,13 @@ void DolphinColumnWidget::activate() selectionModel()->setCurrentIndex(proxyIndex, QItemSelectionModel::Current); } - update(); + updateBackground(); } void DolphinColumnWidget::deactivate() { + clearFocus(); + // TODO: Connecting to the signal 'activated()' is not possible, as kstyle // does not forward the single vs. doubleclick to it yet (KDE 4.1?). Hence it is // necessary connecting the signal 'singleClick()' or 'doubleClick'. @@ -415,11 +458,8 @@ void DolphinColumnWidget::deactivate() this, SLOT(triggerItem(const QModelIndex&))); } - const QPalette palette = m_view->viewport()->palette(); - viewport()->setPalette(palette); - selectionModel()->clear(); - update(); + updateBackground(); } bool DolphinColumnWidget::isCutItem(const KFileItem& item) const @@ -443,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"