#include <KStringHandler>
#include <KDebug>
+#include <KIcon>
#include <QTextLine>
#include <QTimer>
m_updateIconSizeTimer(0),
m_minimumRolesWidths()
{
+ setAcceptDrops(true);
+
setScrollOrientation(Qt::Vertical);
setWidgetCreator(new KItemListWidgetCreator<KFileItemListWidget>());
setGroupHeaderCreator(new KItemListGroupHeaderCreator<KItemListGroupHeader>());
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);
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);
#include <KStringHandler>
#include <KDebug>
+#include <QMimeData>
#include <QTimer>
#define KFILEITEMMODEL_DEBUG
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()) {
*/
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
#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>
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);
}
void slotRubberBandChanged();
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.
*/
m_mousePos()
{
setAcceptHoverEvents(true);
- setAcceptDrops(true);
m_sizeHintResolver = new KItemListSizeHintResolver(this);
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);
void endTransaction();
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);
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);
#include <QSet>
#include <QVariant>
+class QMimeData;
+
struct KItemRange
{
KItemRange(int index, int count);
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