X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e58aadd3e59df7d813ba6d4a92519a519adbe2c3..b1c9b5126d:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 72c06512e..4fc3248c8 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -57,12 +57,12 @@ #include "dolphindetailsview.h" #include "dolphin_detailsmodesettings.h" #include "dolphiniconsview.h" -#include "dolphinsettings.h" +#include "settings/dolphinsettings.h" #include "dolphin_generalsettings.h" #include "draganddrophelper.h" #include "folderexpander.h" #include "renamedialog.h" -#include "tooltipmanager.h" +#include "tooltips/tooltipmanager.h" #include "viewproperties.h" #include "zoomlevelinfo.h" @@ -87,6 +87,7 @@ DolphinView::DolphinView(QWidget* parent, m_storedCategorizedSorting(false), m_tabsForFiles(false), m_isContextMenuOpen(false), + m_ignoreViewProperties(false), m_mode(DolphinView::IconsView), m_topLayout(0), m_controller(0), @@ -102,7 +103,7 @@ DolphinView::DolphinView(QWidget* parent, m_toolTipManager(0), m_rootUrl(), m_currentItemUrl(), - m_expandedViews() + m_expandedDragSource(0) { m_topLayout = new QVBoxLayout(this); m_topLayout->setSpacing(0); @@ -116,8 +117,8 @@ DolphinView::DolphinView(QWidget* parent, 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&)), + this, SLOT(openContextMenu(const QPoint&, const QList&))); 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)), @@ -148,7 +149,9 @@ DolphinView::DolphinView(QWidget* parent, DolphinView::~DolphinView() { - deleteExpandedViews(); + kDebug() << "Deleted view " << m_expandedDragSource; + delete m_expandedDragSource; + m_expandedDragSource = 0; } const KUrl& DolphinView::url() const @@ -233,7 +236,7 @@ void DolphinView::setMode(Mode mode) } emit modeChanged(); - + updateZoomLevel(oldZoomLevel); if (m_showPreview) { loadDirectory(viewPropsUrl); @@ -455,6 +458,8 @@ void DolphinView::reload() void DolphinView::refresh() { + m_ignoreViewProperties = false; + const bool oldActivationState = m_active; const int oldZoomLevel = m_controller->zoomLevel(); m_active = true; @@ -550,7 +555,7 @@ QString DolphinView::statusBarText() const const QString name = list.first().name(); text = (folderCount == 1) ? i18nc("@info:status", "%1 selected", name) : i18nc("@info:status", "%1 selected (%2)", - name, KIO::convertSize(totalFileSize)); + name, KIO::convertSize(totalFileSize)); } else { // at least 2 items are selected const QString foldersText = i18ncp("@info:status", "1 Folder selected", "%1 Folders selected", folderCount); @@ -626,7 +631,7 @@ void DolphinView::renameSelectedItems() // TODO: check how this can be integrated into KIO::FileUndoManager/KonqOperations // as one operation instead of n rename operations like it is done now... Q_ASSERT(newName.contains('#')); - + // currently the items are sorted by the selection order, resort // them by the file name qSort(items.begin(), items.end(), lessThan); @@ -844,13 +849,16 @@ bool DolphinView::eventFilter(QObject* watched, QEvent* event) 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; @@ -860,6 +868,12 @@ bool DolphinView::eventFilter(QObject* watched, QEvent* event) } break; + case QEvent::KeyPress: + if ((watched == itemView()) && (m_toolTipManager != 0)) { + m_toolTipManager->hideTip(); + } + break; + default: break; } @@ -897,7 +911,8 @@ void DolphinView::emitSelectionChangedSignal() emit selectionChanged(DolphinView::selectedItems()); } -void DolphinView::openContextMenu(const QPoint& pos) +void DolphinView::openContextMenu(const QPoint& pos, + const QList& customActions) { KFileItem item; if (isColumnViewActive()) { @@ -915,7 +930,7 @@ void DolphinView::openContextMenu(const QPoint& pos) } m_isContextMenuOpen = true; // TODO: workaround for Qt-issue 207192 - emit requestContextMenu(item, url()); + emit requestContextMenu(item, url(), customActions); m_isContextMenuOpen = false; } @@ -1052,6 +1067,29 @@ bool DolphinView::itemsExpandable() const 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: @@ -1104,16 +1142,6 @@ void DolphinView::restoreCurrentItem() } } -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()) { @@ -1153,6 +1181,10 @@ KUrl DolphinView::viewPropertiesUrl() const void DolphinView::applyViewProperties(const KUrl& url) { + if (m_ignoreViewProperties) { + return; + } + if (isColumnViewActive() && rootUrl().isParentOf(url)) { // The column view is active, hence don't apply the view properties // of sub directories (represented by columns) to the view. The @@ -1222,6 +1254,13 @@ void DolphinView::applyViewProperties(const KUrl& url) // the used zoom level of the controller must be adjusted manually: updateZoomLevel(oldZoomLevel); } + + if (DolphinSettings::instance().generalSettings()->globalViewProps()) { + // During the lifetime of a DolphinView instance the global view properties + // should not be changed. This allows e. g. to split a view and use different + // view properties for each view. + m_ignoreViewProperties = true; + } } void DolphinView::createView() @@ -1253,6 +1292,7 @@ void DolphinView::createView() Q_ASSERT(view != 0); view->installEventFilter(this); view->viewport()->installEventFilter(this); + setFocusProxy(view); if (m_mode != ColumnView) { // Give the view the ability to auto-expand its directories on hovering @@ -1264,8 +1304,13 @@ void DolphinView::createView() 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); @@ -1315,34 +1360,28 @@ void DolphinView::deleteView() // before deleting the view: Otherwise when having a split // view the other view will get the focus and will request // an activation (see DolphinView::eventFilter()). + setFocusProxy(0); setFocus(); 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_iconsView = 0; m_detailsView = 0; m_columnView = 0; m_fileItemDelegate = 0; - m_previewGenerator = 0; m_toolTipManager = 0; } } @@ -1408,17 +1447,6 @@ KUrl::List DolphinView::simplifiedSelectedUrls() const 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()) {