#include <QScrollBar>
#include <kcolorscheme.h>
-#include <kdirmodel.h>
#include <kdirlister.h>
#include <kfileitemdelegate.h>
#include <klocale.h>
#include <konq_operations.h>
#include <kurl.h>
+#include "dolphinmodel.h"
#include "dolphincolumnview.h"
#include "dolphincontroller.h"
#include "dolphinsortfilterproxymodel.h"
#include "dolphindetailsview.h"
#include "dolphiniconsview.h"
-#include "dolphinitemcategorizer.h"
#include "renamedialog.h"
#include "viewproperties.h"
#include "dolphinsettings.h"
#include "dolphin_generalsettings.h"
+#include "dolphincategorydrawer.h"
DolphinView::DolphinView(QWidget* parent,
const KUrl& url,
KDirLister* dirLister,
- KDirModel* dirModel,
+ DolphinModel* dolphinModel,
DolphinSortFilterProxyModel* proxyModel) :
QWidget(parent),
m_active(true),
m_detailsView(0),
m_columnView(0),
m_fileItemDelegate(0),
- m_dirModel(dirModel),
+ m_dolphinModel(dolphinModel),
m_dirLister(dirLister),
m_proxyModel(proxyModel)
{
this, SIGNAL(urlChanged(const KUrl&)));
connect(m_controller, SIGNAL(requestContextMenu(const QPoint&)),
this, SLOT(openContextMenu(const QPoint&)));
- connect(m_controller, SIGNAL(urlsDropped(const KUrl::List&, const QModelIndex&, QWidget*)),
- this, SLOT(dropUrls(const KUrl::List&, const QModelIndex&, QWidget*)));
+ connect(m_controller, SIGNAL(urlsDropped(const KUrl::List&, const KUrl&, const QModelIndex&, QWidget*)),
+ this, SLOT(dropUrls(const KUrl::List&, const KUrl&, const QModelIndex&, QWidget*)));
connect(m_controller, SIGNAL(sortingChanged(DolphinView::Sorting)),
this, SLOT(updateSorting(DolphinView::Sorting)));
connect(m_controller, SIGNAL(sortOrderChanged(Qt::SortOrder)),
}
Q_ASSERT(m_iconsView != 0);
- if (categorized) {
- Q_ASSERT(m_iconsView->itemCategorizer() == 0);
- m_iconsView->setItemCategorizer(new DolphinItemCategorizer());
- } else {
- KItemCategorizer* categorizer = m_iconsView->itemCategorizer();
- m_iconsView->setItemCategorizer(0);
- delete categorizer;
- }
ViewProperties props(viewPropertiesUrl());
props.setCategorizedSorting(categorized);
props.save();
+ m_proxyModel->setCategorizedModel(categorized);
+ m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder());
+
emit categorizedSortingChanged();
}
bool DolphinView::categorizedSorting() const
{
- if (!supportsCategorizedSorting()) {
- return false;
- }
-
- Q_ASSERT(m_iconsView != 0);
- return m_iconsView->itemCategorizer() != 0;
+ return m_proxyModel->isCategorizedModel();
}
bool DolphinView::supportsCategorizedSorting() const
{
const QAbstractItemView* view = itemView();
- // Our view has a selection, we will map them back to the DirModel
+ // Our view has a selection, we will map them back to the DolphinModel
// and then fill the KFileItemList.
Q_ASSERT((view != 0) && (view->selectionModel() != 0));
const QModelIndexList indexList = selection.indexes();
foreach (QModelIndex index, indexList) {
- KFileItem item = m_dirModel->itemForIndex(index);
+ KFileItem item = m_dolphinModel->itemForIndex(index);
if (!item.isNull()) {
itemList.append(item);
}
KFileItem DolphinView::fileItem(const QModelIndex& index) const
{
- const QModelIndex dirModelIndex = m_proxyModel->mapToSource(index);
- return m_dirModel->itemForIndex(dirModelIndex);
+ const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index);
+ return m_dolphinModel->itemForIndex(dolphinModelIndex);
}
void DolphinView::setContentsPosition(int x, int y)
updateViewportColor();
}
-void DolphinView::setUrl(const KUrl& url)
+void DolphinView::updateView(const KUrl& url, const KUrl& rootUrl)
{
if (m_controller->url() == url) {
return;
}
+ const bool restoreColumnView = !rootUrl.isEmpty()
+ && !rootUrl.equals(url, KUrl::CompareWithoutTrailingSlash)
+ && rootUrl.isParentOf(url);
+
m_controller->setUrl(url); // emits urlChanged, which we forward
- applyViewProperties(url);
+ if (restoreColumnView) {
+ applyViewProperties(rootUrl);
+ Q_ASSERT(itemView() == m_columnView);
+ startDirLister(rootUrl);
+ m_columnView->showColumn(url);
+ } else {
+ applyViewProperties(url);
+ startDirLister(url);
+ }
- startDirLister(url);
itemView()->setFocus();
+
+ emit startedPathLoading(url);
+}
+
+void DolphinView::setUrl(const KUrl& url)
+{
+ updateView(url, KUrl());
}
void DolphinView::mouseReleaseEvent(QMouseEvent* event)
{
QWidget::mouseReleaseEvent(event);
- setActive(true);;
+ setActive(true);
}
void DolphinView::activate()
{
return;
}
- const KFileItem item = m_dirModel->itemForIndex(m_proxyModel->mapToSource(index));
+ const KFileItem item = m_dolphinModel->itemForIndex(m_proxyModel->mapToSource(index));
+
if (item.isNull()) {
return;
}
return;
}
- const QModelIndex idx = m_dirModel->indexForItem(item);
+ const QModelIndex idx = m_dolphinModel->indexForItem(item);
if (idx.isValid() && (idx.column() == 0)) {
const QMimeData* mimeData = QApplication::clipboard()->mimeData();
if (KonqMimeData::decodeIsCutSelection(mimeData) && isCutItem(item)) {
KIconEffect iconEffect;
const QPixmap cutPixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState);
- m_dirModel->setData(idx, QIcon(cutPixmap), Qt::DecorationRole);
+ m_dolphinModel->setData(idx, QIcon(cutPixmap), Qt::DecorationRole);
} else {
- m_dirModel->setData(idx, QIcon(pixmap), Qt::DecorationRole);
+ m_dolphinModel->setData(idx, QIcon(pixmap), Qt::DecorationRole);
}
}
}
m_dirLister->stop();
- bool openDir = true;
bool keepOldDirs = isColumnViewActive() && !m_initializeColumnView;
m_initializeColumnView = false;
if (keepOldDirs) {
+ // keeping old directories is only necessary for hierarchical views
+ // like the column view
if (reload) {
- keepOldDirs = false;
-
- const KUrl& dirListerUrl = m_dirLister->url();
- if (dirListerUrl.isValid()) {
- const KUrl::List dirs = m_dirLister->directories();
- KUrl url;
- foreach(url, dirs) {
- m_dirLister->updateDirectory(url);
- }
- openDir = false;
- }
+ // for the column view it is not enough to reload the directory lister,
+ // so this task is delegated to the column view directly
+ m_columnView->reload();
} else if (m_dirLister->directories().contains(url)) {
// The dir lister contains the directory already, so
- // KDirLister::openUrl() may not been invoked twice.
+ // KDirLister::openUrl() may not get invoked twice.
m_dirLister->updateDirectory(url);
- openDir = false;
} else {
const KUrl& dirListerUrl = m_dirLister->url();
if ((dirListerUrl == url) || !m_dirLister->url().isParentOf(url)) {
// The current URL is not a child of the dir lister
// URL. This may happen when e. g. a place has been selected
// and hence the view must be reset.
- keepOldDirs = false;
+ m_dirLister->openUrl(url, false, false);
}
}
- }
-
- if (openDir) {
- m_dirLister->openUrl(url, keepOldDirs, reload);
+ } else {
+ m_dirLister->openUrl(url, false, reload);
}
}
const bool categorized = props.categorizedSorting();
if (categorized != categorizedSorting()) {
- if (supportsCategorizedSorting()) {
- Q_ASSERT(m_iconsView != 0);
- if (categorized) {
- Q_ASSERT(m_iconsView->itemCategorizer() == 0);
- m_iconsView->setItemCategorizer(new DolphinItemCategorizer());
- } else {
- KItemCategorizer* categorizer = m_iconsView->itemCategorizer();
- m_iconsView->setItemCategorizer(0);
- delete categorizer;
- }
- }
+ m_proxyModel->setCategorizedModel(categorized);
emit categorizedSortingChanged();
}
foreach(const KFileItem& item, selection) {
url = item.url().upUrl();
if (baseUrl.equals(url, KUrl::CompareWithoutTrailingSlash)) {
- QModelIndex index = m_proxyModel->mapFromSource(m_dirModel->indexForItem(item));
+ QModelIndex index = m_proxyModel->mapFromSource(m_dolphinModel->indexForItem(item));
new_selection.select(index, index);
}
}
}
void DolphinView::dropUrls(const KUrl::List& urls,
- const QModelIndex& index,
+ const KUrl& destPath,
+ const QModelIndex& destIndex,
QWidget* source)
{
KFileItem directory;
- if (isValidNameIndex(index)) {
- KFileItem item = fileItem(index);
+ if (isValidNameIndex(destIndex)) {
+ KFileItem item = fileItem(destIndex);
Q_ASSERT(!item.isNull());
if (item.isDir()) {
// the URLs are dropped above a directory
}
const KUrl& destination = (directory.isNull()) ?
- url() : directory.url();
+ destPath : directory.url();
dropUrls(urls, destination);
}
QList<CutItem>::const_iterator it = m_cutItemsCache.begin();
QList<CutItem>::const_iterator end = m_cutItemsCache.end();
while (it != end) {
- const QModelIndex index = m_dirModel->indexForUrl((*it).url);
+ const QModelIndex index = m_dolphinModel->indexForUrl((*it).url);
if (index.isValid()) {
- m_dirModel->setData(index, QIcon((*it).pixmap), Qt::DecorationRole);
+ m_dolphinModel->setData(index, QIcon((*it).pixmap), Qt::DecorationRole);
}
++it;
}
if (view != 0) {
m_topLayout->removeWidget(view);
view->close();
- if (view == m_iconsView) {
- KItemCategorizer* categorizer = m_iconsView->itemCategorizer();
- m_iconsView->setItemCategorizer(0);
- delete categorizer;
- }
view->deleteLater();
view = 0;
m_iconsView = 0;
switch (m_mode) {
case IconsView:
m_iconsView = new DolphinIconsView(this, m_controller);
+ m_iconsView->setCategoryDrawer(new DolphinCategoryDrawer());
view = m_iconsView;
break;
view->setModel(m_proxyModel);
view->setSelectionMode(QAbstractItemView::ExtendedSelection);
- new KMimeTypeResolver(view, m_dirModel);
+ new KMimeTypeResolver(view, m_dolphinModel);
m_topLayout->insertWidget(1, view);
connect(view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
bool DolphinView::isValidNameIndex(const QModelIndex& index) const
{
- return index.isValid() && (index.column() == KDirModel::Name);
+ return index.isValid() && (index.column() == DolphinModel::Name);
}
bool DolphinView::isCutItem(const KFileItem& item) const
while (it != end) {
KFileItem* item = *it;
if (isCutItem(*item)) {
- const QModelIndex index = m_dirModel->indexForItem(*item);
+ const QModelIndex index = m_dolphinModel->indexForItem(*item);
// Huh? the item is already known
- //const KFileItem item = m_dirModel->itemForIndex(index);
- const QVariant value = m_dirModel->data(index, Qt::DecorationRole);
+ //const KFileItem item = m_dolphinModel->itemForIndex(index);
+ const QVariant value = m_dolphinModel->data(index, Qt::DecorationRole);
if (value.type() == QVariant::Icon) {
const QIcon icon(qvariant_cast<QIcon>(value));
QPixmap pixmap = icon.pixmap(128, 128);
// apply icon effect to the cut item
KIconEffect iconEffect;
pixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState);
- m_dirModel->setData(index, QIcon(pixmap), Qt::DecorationRole);
+ m_dolphinModel->setData(index, QIcon(pixmap), Qt::DecorationRole);
}
}
++it;