m_toolTipManager(0),
m_rootUrl(),
m_currentItemUrl(),
- m_expandedViews()
+ m_expandedDragSource(0)
{
m_topLayout = new QVBoxLayout(this);
m_topLayout->setSpacing(0);
connect(m_controller, SIGNAL(requestUrlChange(const KUrl&)),
this, SLOT(slotRequestUrlChange(const KUrl&)));
- connect(m_controller, SIGNAL(requestContextMenu(const QPoint&)),
- this, SLOT(openContextMenu(const QPoint&)));
+ connect(m_controller, SIGNAL(requestContextMenu(const QPoint&, const QList<QAction*>&)),
+ this, SLOT(openContextMenu(const QPoint&, const QList<QAction*>&)));
connect(m_controller, SIGNAL(urlsDropped(const KFileItem&, const KUrl&, QDropEvent*)),
this, SLOT(dropUrls(const KFileItem&, const KUrl&, QDropEvent*)));
connect(m_controller, SIGNAL(sortingChanged(DolphinView::Sorting)),
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;
emit selectionChanged(DolphinView::selectedItems());
}
-void DolphinView::openContextMenu(const QPoint& pos)
+void DolphinView::openContextMenu(const QPoint& pos,
+ const QList<QAction*>& customActions)
{
KFileItem item;
if (isColumnViewActive()) {
}
m_isContextMenuOpen = true; // TODO: workaround for Qt-issue 207192
- emit requestContextMenu(item, url());
+ emit requestContextMenu(item, url(), customActions);
m_isContextMenuOpen = false;
}
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()) {