m_toolTipManager(0),
m_rootUrl(),
m_currentItemUrl(),
- m_expandedViews()
+ m_expandedDragSource(0)
{
m_topLayout = new QVBoxLayout(this);
m_topLayout->setSpacing(0);
DolphinView::~DolphinView()
{
- deleteExpandedViews();
+ kDebug() << "Deleted view " << m_expandedDragSource;
+ delete m_expandedDragSource;
+ m_expandedDragSource = 0;
}
const KUrl& DolphinView::url() const
break;
case QEvent::MouseButtonPress:
- if ((watched == itemView()->viewport()) && (m_expandedViews.count() > 0)) {
+ kDebug() << "m_expandedDragSource = " << m_expandedDragSource;
+ if ((watched == itemView()->viewport()) && (m_expandedDragSource != 0)) {
// Listening to a mousebutton press event to delete expanded views is a
// workaround, as it seems impossible for the FolderExpander to know when
// a dragging outside a view has been finished. However it works quite well:
// A mousebutton press event indicates that a drag operation must be
// finished already.
- deleteExpandedViews();
+ kDebug() << "Deleted view " << m_expandedDragSource;
+ m_expandedDragSource->deleteLater();
+ m_expandedDragSource = 0;
}
break;
return (m_detailsView != 0) && m_detailsView->itemsExpandable();
}
+void DolphinView::deleteWhenNotDragSource(QAbstractItemView *view)
+{
+ if (view == 0)
+ return;
+
+ if (DragAndDropHelper::instance().isDragSource(view)) {
+ kDebug() << "Is current drag source";
+ // We must store for later deletion.
+ if (m_expandedDragSource != 0) {
+ // The old stored view is obviously not the drag source anymore.
+ kDebug() << "Deleted old view " << m_expandedDragSource;
+ m_expandedDragSource->deleteLater();
+ m_expandedDragSource = 0;
+ }
+ view->hide();
+ m_expandedDragSource = view;
+ }
+ else {
+ kDebug() << "Deleted new view " << view;
+ view->deleteLater();
+ }
+}
+
void DolphinView::emitContentsMoved()
{
// only emit the contents moved signal if:
}
}
-void DolphinView::enterDir(const QModelIndex& index, QAbstractItemView* view)
-{
- // Deleting a view that is the root of a drag operation is not allowed, otherwise
- // the dragging gets automatically cancelled by Qt. So before entering a new
- // directory, the current view is remembered in m_expandedViews and deleted
- // later when the drag operation has been finished (see DolphinView::eventFilter()).
- m_expandedViews.append(view);
- m_controller->triggerItem(index);
-}
-
void DolphinView::loadDirectory(const KUrl& url, bool reload)
{
if (!url.isValid()) {
FolderExpander* folderExpander = new FolderExpander(view, m_proxyModel);
folderExpander->setEnabled(enabled);
- connect(folderExpander, SIGNAL(enterDir(const QModelIndex&, QAbstractItemView*)),
- this, SLOT(enterDir(const QModelIndex&, QAbstractItemView*)));
+ connect(folderExpander, SIGNAL(enterDir(const QModelIndex&)),
+ m_controller, SLOT(triggerItem(const QModelIndex&)));
+ }
+ else {
+ // Listen out for requests to delete the current column.
+ connect(m_columnView, SIGNAL(requestColumnDeletion(QAbstractItemView*)),
+ this, SLOT(deleteWhenNotDragSource(QAbstractItemView*)));
}
m_controller->setItemView(view);
m_topLayout->removeWidget(view);
view->close();
+ // m_previewGenerator's parent is not always destroyed, and we
+ // don't want two active at once - manually delete.
+ delete m_previewGenerator;
+ m_previewGenerator = 0;
+
disconnect(view);
m_controller->disconnect(view);
view->disconnect();
- bool deleteView = true;
- foreach (const QAbstractItemView* expandedView, m_expandedViews) {
- if (view == expandedView) {
- // the current view got already expanded and must stay alive
- // until the dragging has been completed
- deleteView = false;
- break;
- }
- }
- if (deleteView) {
- view->deleteLater();
- }
+ deleteWhenNotDragSource(view);
view = 0;
- // m_previewGenerator's parent is not always destroyed, and we
- // don't want two active at once - manually delete.
- delete m_previewGenerator;
- m_previewGenerator = 0;
-
m_iconsView = 0;
m_detailsView = 0;
m_columnView = 0;
return list;
}
-void DolphinView::deleteExpandedViews()
-{
- const QAbstractItemView* view = itemView();
- foreach (QAbstractItemView* expandedView, m_expandedViews) {
- if (expandedView != view) {
- expandedView->deleteLater();
- }
- }
- m_expandedViews.clear();
-}
-
QMimeData* DolphinView::selectionMimeData() const
{
if (isColumnViewActive()) {
void restoreCurrentItem();
/**
- * Is connected to the enterDir() signal from the FolderExpander
- * and triggers the entering of the directory indicated by \a index.
+ * If \a view can be positively identified as not being the source for the
+ * current drag operation, deleteLater() it immediately. Else stores
+ * it for later deletion.
*/
- void enterDir(const QModelIndex& index, QAbstractItemView* view);
+ void deleteWhenNotDragSource(QAbstractItemView* view);
private:
void loadDirectory(const KUrl& url, bool reload = false);
*/
bool isColumnViewActive() const;
- /**
- * Deletes all views from m_expandedViews except if the view
- * is currently shown.
- */
- void deleteExpandedViews();
-
/**
* Returns the MIME data for all selected items.
*/
KUrl m_rootUrl;
KUrl m_currentItemUrl;
- QList<QAbstractItemView*> m_expandedViews;
+ QAbstractItemView* m_expandedDragSource;
};
inline bool DolphinView::isColumnViewActive() const