#include <konq_fileitemcapabilities.h>
#include <konq_operations.h>
#include <konqmimedata.h>
-#include <kstringhandler.h>
#include <ktoggleaction.h>
#include <kurl.h>
#include "dolphinviewcontroller.h"
#include "dolphindetailsview.h"
#include "dolphinfileitemdelegate.h"
-#include "dolphinnewmenuobserver.h"
+#include "dolphinnewfilemenuobserver.h"
#include "dolphinsortfilterproxymodel.h"
#include "dolphin_detailsmodesettings.h"
#include "dolphiniconsview.h"
#include "zoomlevelinfo.h"
#include "dolphindetailsviewexpander.h"
-/**
- * Helper function for sorting items with qSort() in
- * DolphinView::renameSelectedItems().
- */
-bool lessThan(const KFileItem& item1, const KFileItem& item2)
-{
- return KStringHandler::naturalCompare(item1.name(), item2.name()) < 0;
-}
-
DolphinView::DolphinView(QWidget* parent,
const KUrl& url,
DolphinSortFilterProxyModel* proxyModel) :
m_storedCategorizedSorting(false),
m_tabsForFiles(false),
m_isContextMenuOpen(false),
- m_ignoreViewProperties(false),
m_assureVisibleCurrentIndex(false),
m_mode(DolphinView::IconsView),
m_topLayout(0),
// When a new item has been created by the "Create New..." menu, the item should
// get selected and it must be assured that the item will get visible. As the
// creation is done asynchronously, several signals must be checked:
- connect(&DolphinNewMenuObserver::instance(), SIGNAL(itemCreated(const KUrl&)),
+ connect(&DolphinNewFileMenuObserver::instance(), SIGNAL(itemCreated(const KUrl&)),
this, SLOT(observeCreatedItem(const KUrl&)));
m_selectionChangedTimer = new QTimer(this);
return itemList;
}
-KUrl::List DolphinView::selectedUrls() const
-{
- KUrl::List urls;
- const KFileItemList list = selectedItems();
- foreach (const KFileItem &item, list) {
- urls.append(item.url());
- }
- return urls;
-}
-
int DolphinView::selectedItemsCount() const
{
const QAbstractItemView* view = m_viewAccessor.itemView();
restoreState(restoreStream);
}
-void DolphinView::refresh()
+void DolphinView::stopLoading()
{
- m_ignoreViewProperties = false;
+ m_viewAccessor.dirLister()->stop();
+}
+void DolphinView::refresh()
+{
const bool oldActivationState = m_active;
const int oldZoomLevel = m_viewModeController->zoomLevel();
m_active = true;
// The selection model might change in the case of the column view. Disconnect
// from the current selection model and reconnect later after the URL switch.
+ const bool hadSelection = hasSelection();
QAbstractItemView* view = m_viewAccessor.itemView();
disconnect(view->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection)));
view = m_viewAccessor.itemView();
connect(view->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection)));
+ if (hadSelection || hasSelection()) {
+ emitSelectionChangedSignal();
+ }
}
void DolphinView::selectAll()
return;
}
- if (itemCount > 1) {
- // More than one item has been selected for renaming. Open
- // a rename dialog and rename all items afterwards.
- QPointer<RenameDialog> dialog = new RenameDialog(this, items);
- if (dialog->exec() == QDialog::Rejected) {
- delete dialog;
- return;
- }
-
- const QString newName = dialog->newName();
- if (newName.isEmpty()) {
- emit errorMessage(dialog->errorString());
- delete dialog;
- return;
- }
- delete dialog;
-
- // the selection would be invalid after renaming the items, so just clear
- // it before
- clearSelection();
-
- // 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);
-
- // iterate through all selected items and rename them...
- int index = 1;
- foreach (const KFileItem& item, items) {
- const KUrl& oldUrl = item.url();
- QString number;
- number.setNum(index++);
-
- QString name = newName;
- name.replace('#', number);
-
- if (oldUrl.fileName() != name) {
- KUrl newUrl = oldUrl;
- newUrl.setFileName(name);
- KonqOperations::rename(this, oldUrl, newUrl);
- }
- }
- } else if (DolphinSettings::instance().generalSettings()->renameInline()) {
- Q_ASSERT(itemCount == 1);
+ if ((itemCount == 1) && DolphinSettings::instance().generalSettings()->renameInline()) {
const QModelIndex dirIndex = m_viewAccessor.dirModel()->indexForItem(items.first());
const QModelIndex proxyIndex = m_viewAccessor.proxyModel()->mapFromSource(dirIndex);
m_viewAccessor.itemView()->edit(proxyIndex);
} else {
- Q_ASSERT(itemCount == 1);
-
- QPointer<RenameDialog> dialog = new RenameDialog(this, items);
- if (dialog->exec() == QDialog::Rejected) {
- delete dialog;
- return;
- }
-
- const QString newName = dialog->newName();
- if (newName.isEmpty()) {
- emit errorMessage(dialog->errorString());
- delete dialog;
- return;
- }
- delete dialog;
-
- const KUrl& oldUrl = items.first().url();
- KUrl newUrl = oldUrl;
- newUrl.setFileName(newName);
- KonqOperations::rename(this, oldUrl, newUrl);
+ RenameDialog* dialog = new RenameDialog(this, items);
+ dialog->setAttribute(Qt::WA_DeleteOnClose);
+ dialog->show();
+ dialog->raise();
+ dialog->activateWindow();
}
-
- // assure that the current index remains visible when KDirLister
- // will notify the view about changed items
- m_assureVisibleCurrentIndex = true;
}
void DolphinView::trashSelectedItems()
emit categorizedSortingChanged();
}
-void DolphinView::toggleSortOrder()
-{
- const Qt::SortOrder order = (sortOrder() == Qt::AscendingOrder) ?
- Qt::DescendingOrder :
- Qt::AscendingOrder;
- setSortOrder(order);
-}
-
-void DolphinView::toggleSortFoldersFirst()
-{
- setSortFoldersFirst(!sortFoldersFirst());
-}
-
-void DolphinView::toggleAdditionalInfo(QAction* action)
-{
- const KFileItemDelegate::Information info =
- static_cast<KFileItemDelegate::Information>(action->data().toInt());
-
- KFileItemDelegate::InformationList list = additionalInfo();
-
- const bool show = action->isChecked();
-
- const int index = list.indexOf(info);
- const bool containsInfo = (index >= 0);
- if (show && !containsInfo) {
- list.append(info);
- setAdditionalInfo(list);
- } else if (!show && containsInfo) {
- list.removeAt(index);
- setAdditionalInfo(list);
- Q_ASSERT(list.indexOf(info) < 0);
- }
-}
-
void DolphinView::mouseReleaseEvent(QMouseEvent* event)
{
QWidget::mouseReleaseEvent(event);
void DolphinView::emitSelectionChangedSignal()
{
- emit selectionChanged(DolphinView::selectedItems());
+ m_selectionChangedTimer->stop();
+ emit selectionChanged(selectedItems());
}
void DolphinView::openContextMenu(const QPoint& pos,
// Restore the contents position. This has to be done using a Qt::QueuedConnection
// because the view might not be in its final state yet.
QMetaObject::invokeMethod(this, "restoreContentsPosition", Qt::QueuedConnection);
+
+ emit finishedPathLoading(url());
}
void DolphinView::slotRefreshItems()
void DolphinView::applyViewProperties()
{
- if (m_ignoreViewProperties) {
- return;
- }
-
const ViewProperties props(rootUrl());
const Mode mode = props.viewMode();
// 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()
{
- QAbstractItemView* view = m_viewAccessor.itemView();
- if ((view != 0) && (view->selectionModel() != 0)) {
- disconnect(view->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
- this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection)));
- }
-
deleteView();
Q_ASSERT(m_viewAccessor.itemView() == 0);
+ Q_ASSERT(m_dolphinViewController->itemView() == 0);
m_viewAccessor.createView(this, m_dolphinViewController, m_viewModeController, m_mode);
- view = m_viewAccessor.itemView();
+ QAbstractItemView* view = m_viewAccessor.itemView();
Q_ASSERT(view != 0);
view->installEventFilter(this);
view->viewport()->installEventFilter(this);
void DolphinView::deleteView()
{
QAbstractItemView* view = m_viewAccessor.itemView();
+ Q_ASSERT((m_dolphinViewController->itemView() == 0) || (m_dolphinViewController->itemView() == view));
+ m_dolphinViewController->setItemView(0);
+
if (view != 0) {
+ if (view->selectionModel() != 0) {
+ disconnect(view->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+ this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection)));
+ }
+
// It's important to set the keyboard focus to the parent
// before deleting the view: Otherwise when having a split
// view the other view will get the focus and will request
setFocusProxy(0);
setFocus();
- m_topLayout->removeWidget(view);
- view->close();
-
- // disconnect all signal/slots
- disconnect(view);
m_viewModeController->disconnect(view);
- view->disconnect();
m_viewAccessor.deleteView();
}
KUrl::List DolphinView::simplifiedSelectedUrls() const
{
- KUrl::List list = selectedUrls();
- if (itemsExpandable() ) {
- list = KDirModel::simplifiedUrlList(list);
+ KUrl::List urls;
+
+ const KFileItemList items = selectedItems();
+ foreach (const KFileItem &item, items) {
+ urls.append(item.url());
+ }
+
+
+ if (itemsExpandable()) {
+ urls = KDirModel::simplifiedUrlList(urls);
}
- return list;
+
+ return urls;
}
QMimeData* DolphinView::selectionMimeData() const
void DolphinView::ViewAccessor::deleteView()
{
- QAbstractItemView* view = itemView();
- if (view != 0) {
- if (DragAndDropHelper::instance().isDragSource(view)) {
- // The view is a drag source (the feature "Open folders
- // during drag operations" is used). Deleting the view
- // during an ongoing drag operation is not allowed, so
- // this will postponed.
- if (m_dragSource != 0) {
- // the old stored view is obviously not the drag source anymore
- m_dragSource->deleteLater();
- m_dragSource = 0;
+ if (m_columnsContainer != 0) {
+ m_columnsContainer->close();
+ m_columnsContainer->disconnect();
+ m_columnsContainer->deleteLater();
+ m_columnsContainer = 0;
+ } else {
+ QAbstractItemView* view = itemView();
+ if (view != 0) {
+ view->close();
+ view->disconnect();
+
+ if (DragAndDropHelper::instance().isDragSource(view)) {
+ // The view is a drag source (the feature "Open folders
+ // during drag operations" is used). Deleting the view
+ // during an ongoing drag operation is not allowed, so
+ // this will postponed.
+ if (m_dragSource != 0) {
+ // the old stored view is obviously not the drag source anymore
+ m_dragSource->deleteLater();
+ m_dragSource = 0;
+ }
+ view->hide();
+ m_dragSource = view;
+ } else {
+ view->deleteLater();
+ view = 0;
}
- view->hide();
- m_dragSource = view;
- } else {
- view->deleteLater();
}
- }
-
- m_iconsView = 0;
- m_detailsView = 0;
- if (m_columnsContainer != 0) {
- m_columnsContainer->deleteLater();
+ m_iconsView = 0;
+ m_detailsView = 0;
}
- m_columnsContainer = 0;
}