]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphincolumnwidget.cpp
So I guess that is the behaviour that we really want :)
[dolphin.git] / src / dolphincolumnwidget.cpp
index 4c6faaceae00d1c27109a24a280b77750ea3cfa3..75d83bd0f9e7dd3278ea3c07e5f0a8e34575b26c 100644 (file)
 #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 <kcolorutils.h>
 #include <kcolorscheme.h>
 #include <kdirlister.h>
 #include <kfileitem.h>
 #include <kio/previewjob.h>
 #include <kiconeffect.h>
+#include <kjob.h>
+#include <kmimetyperesolver.h>
 #include <konqmimedata.h>
 
-#include <QAbstractProxyModel>
 #include <QApplication>
 #include <QClipboard>
+#include <QPainter>
 #include <QPoint>
-#include <QScrollBar>
-#include <QTimer>
-#include <QTimeLine>
 
 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,6 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent,
     setSelectionMode(QAbstractItemView::ExtendedSelection);
     setDragDropMode(QAbstractItemView::DragDrop);
     setDropIndicatorShown(false);
-    setFocusPolicy(Qt::NoFocus);
 
 // 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 +82,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);
@@ -111,7 +104,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&)));
 
@@ -123,19 +117,28 @@ DolphinColumnWidget::DolphinColumnWidget(QWidget* parent,
     m_proxyModel->setSourceModel(m_dolphinModel);
 
     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();
 }
 
@@ -177,6 +180,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()) {
@@ -202,19 +238,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;
@@ -245,15 +294,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);
@@ -277,6 +328,7 @@ void DolphinColumnWidget::contextMenuEvent(QContextMenuEvent* event)
 {
     if (!m_active) {
         m_view->requestActivation(this);
+        m_view->m_controller->triggerUrlChangeRequest(m_url);
     }
 
     QListView::contextMenuEvent(event);
@@ -298,28 +350,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 KFileItem item = m_dolphinModel->itemForIndex(m_proxyModel->mapToSource(index));
+    const KFileItem item = itemForIndex(index);
     m_view->m_controller->triggerItem(item);
-    /*
-    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();
-    }*/
 }
 
 void DolphinColumnWidget::generatePreviews(const KFileItemList& items)
@@ -327,20 +362,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;
@@ -366,12 +409,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
@@ -384,11 +430,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
@@ -397,11 +438,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'.
@@ -413,11 +456,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
@@ -441,4 +481,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"