#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"
m_storedCategorizedSorting(false),
m_tabsForFiles(false),
m_isContextMenuOpen(false),
+ m_ignoreViewProperties(false),
m_mode(DolphinView::IconsView),
m_topLayout(0),
m_controller(0),
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
}
emit modeChanged();
-
+
updateZoomLevel(oldZoomLevel);
if (m_showPreview) {
loadDirectory(viewPropsUrl);
} else if (level > ZoomLevelInfo::maximumLevel()) {
level = ZoomLevelInfo::maximumLevel();
}
-
+
if (level != zoomLevel()) {
m_controller->setZoomLevel(level);
m_previewGenerator->updatePreviews();
void DolphinView::refresh()
{
+ m_ignoreViewProperties = false;
+
const bool oldActivationState = m_active;
const int oldZoomLevel = m_controller->zoomLevel();
m_active = true;
int folderCount = 0;
int fileCount = 0;
KIO::filesize_t totalFileSize = 0;
-
+
if (hasSelection()) {
// give a summary of the status of the selected files
const KFileItemList list = selectedItems();
}
++it;
}
-
+
if (folderCount + fileCount == 1) {
// if only one item is selected, show the filename
const QString name = list.first().name();
text = (folderCount == 1) ? i18nc("@info:status", "<filename>%1</filename> selected", name) :
i18nc("@info:status", "<filename>%1</filename> 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);
if (itemCount < 1) {
return;
}
-
+
if (itemCount > 1) {
// More than one item has been selected for renaming. Open
// a rename dialog and rename all items afterwards.
// 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);
}
} else if (DolphinSettings::instance().generalSettings()->renameInline()) {
Q_ASSERT(itemCount == 1);
-
+
if (isColumnViewActive()) {
m_columnView->editItem(items.first());
} else {
}
} else {
Q_ASSERT(itemCount == 1);
-
+
RenameDialog dialog(this, items);
if (dialog.exec() == QDialog::Rejected) {
return;
void DolphinView::cutSelectedItems()
{
QMimeData* mimeData = selectionMimeData();
- const KUrl::List kdeUrls = simplifiedSelectedUrls();
- const KUrl::List mostLocalUrls;
- KonqMimeData::populateMimeData(mimeData, kdeUrls, mostLocalUrls, true);
+ KonqMimeData::addIsCutSelection(mimeData, true);
QApplication::clipboard()->setMimeData(mimeData);
}
void DolphinView::copySelectedItems()
{
QMimeData* mimeData = selectionMimeData();
- const KUrl::List kdeUrls = selectedUrls();
- const KUrl::List mostLocalUrls;
- KonqMimeData::populateMimeData(mimeData, kdeUrls, mostLocalUrls, false);
QApplication::clipboard()->setMimeData(mimeData);
}
m_showPreview = show;
m_previewGenerator->setPreviewShown(show);
-
+
const int oldZoomLevel = m_controller->zoomLevel();
emit showPreviewChanged();
-
+
// Enabling or disabling the preview might change the icon size of the view.
// As the view does not emit a signal when the icon size has been changed,
// the used zoom level of the controller must be adjusted manually:
m_controller->requestActivation();
}
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;
-
+
case QEvent::DragEnter:
if (watched == itemView()->viewport()) {
setActive(true);
}
break;
-
+
+ case QEvent::KeyPress:
+ if ((watched == itemView()) && (m_toolTipManager != 0)) {
+ m_toolTipManager->hideTip();
+ }
+ break;
+
default:
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_tabsForFiles;
}
+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:
}
}
-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()) {
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
const Mode mode = props.viewMode();
if (m_mode != mode) {
const int oldZoomLevel = m_controller->zoomLevel();
-
+
m_mode = mode;
createView();
emit modeChanged();
-
+
updateZoomLevel(oldZoomLevel);
}
if (itemView() == 0) {
if (showPreview != m_showPreview) {
m_showPreview = showPreview;
m_previewGenerator->setPreviewShown(showPreview);
-
+
const int oldZoomLevel = m_controller->zoomLevel();
emit showPreviewChanged();
-
+
// Enabling or disabling the preview might change the icon size of the view.
// As the view does not emit a signal when the icon size has been changed,
// 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()
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
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);
// 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;
}
}
{
KUrl::List list = selectedUrls();
if (itemsExpandable() ) {
- list = KonqOperations::simplifiedUrlList(list);
+ list = KDirModel::simplifiedUrlList(list);
}
return list;
}
-void DolphinView::deleteExpandedViews()
-{
- const QAbstractItemView* view = itemView();
- foreach (QAbstractItemView* expandedView, m_expandedViews) {
- if (expandedView != view) {
- expandedView->deleteLater();
- }
- }
- m_expandedViews.clear();
-}
-
-bool DolphinView::itemsExpandable() const
-{
- return (m_detailsView != 0) && m_detailsView->itemsExpandable();
-}
-
QMimeData* DolphinView::selectionMimeData() const
{
if (isColumnViewActive()) {