┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/kitemviews/kfileitemlistview.cpp23
-rw-r--r--src/kitemviews/kfileitemlistview.h6
-rw-r--r--src/kitemviews/kfileitemmodel.cpp22
-rw-r--r--src/kitemviews/kfileitemmodel.h3
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp67
-rw-r--r--src/kitemviews/kitemlistcontroller.h13
-rw-r--r--src/kitemviews/kitemlistview.cpp7
-rw-r--r--src/kitemviews/kitemlistview.h9
-rw-r--r--src/kitemviews/kitemmodelbase.cpp6
-rw-r--r--src/kitemviews/kitemmodelbase.h9
10 files changed, 92 insertions, 73 deletions
diff --git a/src/kitemviews/kfileitemlistview.cpp b/src/kitemviews/kfileitemlistview.cpp
index a7217d30c..d9742945a 100644
--- a/src/kitemviews/kfileitemlistview.cpp
+++ b/src/kitemviews/kfileitemlistview.cpp
@@ -27,6 +27,7 @@
#include <KStringHandler>
#include <KDebug>
+#include <KIcon>
#include <QTextLine>
#include <QTimer>
@@ -46,6 +47,8 @@ KFileItemListView::KFileItemListView(QGraphicsWidget* parent) :
m_updateIconSizeTimer(0),
m_minimumRolesWidths()
{
+ setAcceptDrops(true);
+
setScrollOrientation(Qt::Vertical);
setWidgetCreator(new KItemListWidgetCreator<KFileItemListWidget>());
setGroupHeaderCreator(new KItemListGroupHeaderCreator<KItemListGroupHeader>());
@@ -204,6 +207,26 @@ QHash<QByteArray, QSizeF> KFileItemListView::visibleRoleSizes() const
return sizes;
}
+QPixmap KFileItemListView::createDragPixmap(const QSet<int>& indexes) const
+{
+ QPixmap pixmap;
+
+ if (model()) {
+ QSetIterator<int> it(indexes);
+ while (it.hasNext()) {
+ const int index = it.next();
+ // TODO: Only one item is considered currently
+ pixmap = model()->data(index).value("iconPixmap").value<QPixmap>();
+ if (pixmap.isNull()) {
+ KIcon icon(model()->data(index).value("iconName").toString());
+ pixmap = icon.pixmap(itemSize().toSize());
+ }
+ }
+ }
+
+ return pixmap;
+}
+
void KFileItemListView::initializeItemListWidget(KItemListWidget* item)
{
KFileItemListWidget* fileItemListWidget = static_cast<KFileItemListWidget*>(item);
diff --git a/src/kitemviews/kfileitemlistview.h b/src/kitemviews/kfileitemlistview.h
index acd03ed22..4f7e84e29 100644
--- a/src/kitemviews/kfileitemlistview.h
+++ b/src/kitemviews/kfileitemlistview.h
@@ -48,9 +48,15 @@ public:
void setItemLayout(Layout layout);
Layout itemLayout() const;
+ /** @reimp */
virtual QSizeF itemSizeHint(int index) const;
+
+ /** @reimp */
virtual QHash<QByteArray, QSizeF> visibleRoleSizes() const;
+ /** @reimp */
+ virtual QPixmap createDragPixmap(const QSet<int>& indexes) const;
+
protected:
virtual void initializeItemListWidget(KItemListWidget* item);
virtual void onModelChanged(KItemModelBase* current, KItemModelBase* previous);
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp
index c54a982f6..5e3269799 100644
--- a/src/kitemviews/kfileitemmodel.cpp
+++ b/src/kitemviews/kfileitemmodel.cpp
@@ -24,6 +24,7 @@
#include <KStringHandler>
#include <KDebug>
+#include <QMimeData>
#include <QTimer>
#define KFILEITEMMODEL_DEBUG
@@ -132,6 +133,27 @@ bool KFileItemModel::supportsSorting() const
return true;
}
+QMimeData* KFileItemModel::createMimeData(const QSet<int>& indexes) const
+{
+ QMimeData* data = new QMimeData();
+
+ KUrl::List urls;
+ urls.reserve(indexes.count());
+
+ QSetIterator<int> it(indexes);
+ while (it.hasNext()) {
+ const int index = it.next();
+ const KUrl url = fileItem(index).url();
+ if (url.isValid() && !url.isEmpty()) {
+ urls.append(url);
+ }
+ }
+
+ urls.populateMimeData(data);
+
+ return data;
+}
+
KFileItem KFileItemModel::fileItem(int index) const
{
if (index >= 0 && index < count()) {
diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h
index e6c89d744..654c7dbeb 100644
--- a/src/kitemviews/kfileitemmodel.h
+++ b/src/kitemviews/kfileitemmodel.h
@@ -66,6 +66,9 @@ public:
*/
virtual bool supportsSorting() const;
+ /** @reimp */
+ virtual QMimeData* createMimeData(const QSet<int>& indexes) const;
+
/**
* @return The file-item for the index \a index. If the index is in a valid
* range it is assured that the file-item is not null. The runtime
diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp
index 15aab28d5..c3f3b36f4 100644
--- a/src/kitemviews/kitemlistcontroller.cpp
+++ b/src/kitemviews/kitemlistcontroller.cpp
@@ -26,11 +26,6 @@
#include "kitemlistrubberband_p.h"
#include "kitemlistselectionmanager.h"
-// TODO: Remove after moving mimeData() and createDropPixmap() into
-// KFileItemModel/KFileItemListView
-#include "kfileitemmodel.h"
-#include <KIcon>
-
#include <QApplication>
#include <QDrag>
#include <QEvent>
@@ -661,70 +656,26 @@ void KItemListController::slotRubberBandChanged()
m_selectionManager->setSelectedItems(selectedItems + m_oldSelection);
}
-QPixmap KItemListController::createDragPixmap(const QSet<int>& indexes) const
-{
- if (!m_model || !m_view) {
- return QPixmap();
- }
-
- // TODO: The current hack assumes a property "iconPixmap" in the model. The method
- // will get an interface of KFileItemList later.
- QSetIterator<int> it(indexes);
- while (it.hasNext()) {
- const int index = it.next();
- // TODO: Only one item is considered currently
- QPixmap pixmap = m_model->data(index).value("iconPixmap").value<QPixmap>();
- if (pixmap.isNull()) {
- KIcon icon(m_model->data(index).value("iconName").toString());
- const QSizeF size = m_view->itemSize();
- pixmap = icon.pixmap(size.toSize());
- }
- return pixmap;
- }
-
- return QPixmap();
-}
-
-QMimeData* KItemListController::createMimeData(const QSet<int>& indexes) const
+void KItemListController::startDragging()
{
- if (!m_model) {
- return 0;
+ if (!m_view || !m_model) {
+ return;
}
- QMimeData* data = new QMimeData();
-
- // TODO: Check KDirModel::mimeData() for a good reference implementation
- KUrl::List urls;
- QSetIterator<int> it(indexes);
- while (it.hasNext()) {
- const int index = it.next();
- // TODO: Big hack to use KFileItemModel here. Remove after moving mimeData()
- // into KFileItemModel.
- KFileItemModel* model = qobject_cast<KFileItemModel*>(m_model);
- Q_ASSERT(model);
- const KUrl url = model->fileItem(index).url();
- urls.append(url);
+ const QSet<int> selectedItems = m_selectionManager->selectedItems();
+ QMimeData* data = m_model->createMimeData(selectedItems);
+ if (!data) {
+ return;
}
- urls.populateMimeData(data);
-
- return data;
-}
-
-void KItemListController::startDragging()
-{
// The created drag object will be owned and deleted
// by QApplication::activeWindow().
QDrag* drag = new QDrag(QApplication::activeWindow());
+ drag->setMimeData(data);
- const QSet<int> selectedItems = m_selectionManager->selectedItems();
-
- const QPixmap pixmap = createDragPixmap(selectedItems);
+ const QPixmap pixmap = m_view->createDragPixmap(selectedItems);
drag->setPixmap(pixmap);
- QMimeData* data = createMimeData(selectedItems);
- drag->setMimeData(data);
-
drag->exec(Qt::MoveAction | Qt::CopyAction | Qt::LinkAction, Qt::IgnoreAction);
}
diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h
index b56087ce1..01d1b9408 100644
--- a/src/kitemviews/kitemlistcontroller.h
+++ b/src/kitemviews/kitemlistcontroller.h
@@ -134,19 +134,6 @@ private slots:
private:
/**
- * @return Pixmap that is used for a drag operation based on the
- * items given by \a indexes.
- * TODO: Will be moved to KItemListView later
- */
- QPixmap createDragPixmap(const QSet<int>& indexes) const;
-
- /**
- * @return MIME-data for the items given by \a indexes.
- * TODO: Will be moved to KItemListView or KItemModelBase/KFileItemModel later.
- */
- QMimeData* createMimeData(const QSet<int>& indexes) const;
-
- /**
* Creates a QDrag object to start a drag-operation.
*/
void startDragging();
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index 4bf7159d6..3435e3f65 100644
--- a/src/kitemviews/kitemlistview.cpp
+++ b/src/kitemviews/kitemlistview.cpp
@@ -66,7 +66,6 @@ KItemListView::KItemListView(QGraphicsWidget* parent) :
m_mousePos()
{
setAcceptHoverEvents(true);
- setAcceptDrops(true);
m_sizeHintResolver = new KItemListSizeHintResolver(this);
@@ -359,6 +358,12 @@ bool KItemListView::isTransactionActive() const
return m_activeTransactions > 0;
}
+QPixmap KItemListView::createDragPixmap(const QSet<int>& indexes) const
+{
+ Q_UNUSED(indexes);
+ return QPixmap();
+}
+
void KItemListView::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
QGraphicsWidget::paint(painter, option, widget);
diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h
index 2a07dbb23..344221e40 100644
--- a/src/kitemviews/kitemlistview.h
+++ b/src/kitemviews/kitemlistview.h
@@ -156,9 +156,16 @@ public:
bool isTransactionActive() const;
/**
+ * @return Pixmap that is used for a drag operation based on the
+ * items given by \a indexes. The default implementation returns
+ * a null-pixmap.
+ */
+ virtual QPixmap createDragPixmap(const QSet<int>& indexes) const;
+
+ /**
* @reimp
*/
- virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
+ virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
signals:
void offsetChanged(qreal current, qreal previous);
diff --git a/src/kitemviews/kitemmodelbase.cpp b/src/kitemviews/kitemmodelbase.cpp
index 2b9623d89..fc604e729 100644
--- a/src/kitemviews/kitemmodelbase.cpp
+++ b/src/kitemviews/kitemmodelbase.cpp
@@ -103,6 +103,12 @@ QString KItemModelBase::roleDescription(const QByteArray& role) const
return role;
}
+QMimeData* KItemModelBase::createMimeData(const QSet<int>& indexes) const
+{
+ Q_UNUSED(indexes);
+ return 0;
+}
+
void KItemModelBase::onGroupRoleChanged(const QByteArray& current, const QByteArray& previous)
{
Q_UNUSED(current);
diff --git a/src/kitemviews/kitemmodelbase.h b/src/kitemviews/kitemmodelbase.h
index 08f723ced..467046959 100644
--- a/src/kitemviews/kitemmodelbase.h
+++ b/src/kitemviews/kitemmodelbase.h
@@ -30,6 +30,8 @@
#include <QSet>
#include <QVariant>
+class QMimeData;
+
struct KItemRange
{
KItemRange(int index, int count);
@@ -107,6 +109,13 @@ public:
virtual QString roleDescription(const QByteArray& role) const;
+ /**
+ * @return MIME-data for the items given by \a indexes. The default implementation
+ * returns 0. The ownership of the returned instance is in the hand of the
+ * caller of this method.
+ */
+ virtual QMimeData* createMimeData(const QSet<int>& indexes) const;
+
signals:
/**
* Is emitted if one or more items have been inserted. Each item-range consists