***************************************************************************/
#include "dolphinview.h"
+#include <ktoggleaction.h>
+#include <kactioncollection.h>
#include <QApplication>
#include <QClipboard>
#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"
DolphinView::DolphinView(QWidget* parent,
const KUrl& url,
KDirLister* dirLister,
- KDirModel* dirModel,
+ DolphinModel* dolphinModel,
DolphinSortFilterProxyModel* proxyModel) :
QWidget(parent),
m_active(true),
+ m_showPreview(false),
m_loadingDirectory(false),
- m_initializeColumnView(false),
+ m_storedCategorizedSorting(false),
m_mode(DolphinView::IconsView),
m_topLayout(0),
m_controller(0),
m_detailsView(0),
m_columnView(0),
m_fileItemDelegate(0),
- m_dirModel(dirModel),
+ m_dolphinModel(dolphinModel),
m_dirLister(dirLister),
m_proxyModel(proxyModel)
{
m_controller = new DolphinController(this);
m_controller->setUrl(url);
+
+ // Receiver of the DolphinView signal 'urlChanged()' don't need
+ // to care whether the internal controller changed the URL already or whether
+ // the controller just requested an URL change and will be updated later.
+ // In both cases the URL has been changed:
connect(m_controller, SIGNAL(urlChanged(const KUrl&)),
this, SIGNAL(urlChanged(const KUrl&)));
+ connect(m_controller, SIGNAL(requestUrlChange(const KUrl&)),
+ 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 KFileItem&, QWidget*)),
+ this, SLOT(dropUrls(const KUrl::List&, const KUrl&, const KFileItem&, QWidget*)));
connect(m_controller, SIGNAL(sortingChanged(DolphinView::Sorting)),
this, SLOT(updateSorting(DolphinView::Sorting)));
connect(m_controller, SIGNAL(sortOrderChanged(Qt::SortOrder)),
this, SLOT(updateSortOrder(Qt::SortOrder)));
- connect(m_controller, SIGNAL(itemTriggered(const QModelIndex&)),
- this, SLOT(triggerItem(const QModelIndex&)));
+ connect(m_controller, SIGNAL(additionalInfoChanged(const KFileItemDelegate::InformationList&)),
+ this, SLOT(updateAdditionalInfo(const KFileItemDelegate::InformationList&)));
+ connect(m_controller, SIGNAL(itemTriggered(const KFileItem&)),
+ this, SLOT(triggerItem(const KFileItem&)));
connect(m_controller, SIGNAL(activated()),
this, SLOT(activate()));
- connect(m_controller, SIGNAL(itemEntered(const QModelIndex&)),
- this, SLOT(showHoverInformation(const QModelIndex&)));
+ connect(m_controller, SIGNAL(itemEntered(const KFileItem&)),
+ this, SLOT(showHoverInformation(const KFileItem&)));
connect(m_controller, SIGNAL(viewportEntered()),
this, SLOT(clearHoverInformation()));
KUrl DolphinView::rootUrl() const
{
- return isColumnViewActive() ? m_dirLister->url() : url();
+ return isColumnViewActive() ? m_columnView->rootUrl() : url();
}
void DolphinView::setActive(bool active)
m_active = active;
- updateViewportColor();
+ QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color();
+ if (active) {
+ // TODO: emitting urlChanged() is a hack, as the URL hasn't really changed. It
+ // bypasses the problem when having a split view and changing the active view to
+ // update the some URL dependent states. A nicer approach should be no big deal...
+ emit urlChanged(url());
+ emit selectionChanged(selectedItems());
+ } else {
+ color.setAlpha(150);
+ }
+
+ QWidget* viewport = itemView()->viewport();
+ QPalette palette;
+ palette.setColor(viewport->backgroundRole(), color);
+ viewport->setPalette(palette);
+
update();
if (active) {
emit activated();
}
+
+ m_controller->indicateActivationChange(active);
}
bool DolphinView::isActive() const
// to go back to the root URL of the column view automatically.
// Otherwise there it would not be possible to turn off the column view
// without focusing the first column.
- setUrl(m_dirLister->url());
- m_controller->setUrl(m_dirLister->url());
+ const KUrl root = rootUrl();
+ setUrl(root);
+ m_controller->setUrl(root);
}
const KUrl viewPropsUrl = viewPropertiesUrl();
props.setViewMode(m_mode);
createView();
- startDirLister(viewPropsUrl);
+
+ // the file item delegate has been recreated, apply the current
+ // additional information manually
+ const KFileItemDelegate::InformationList infoList = props.additionalInfo();
+ m_fileItemDelegate->setShowInformation(infoList);
+ emit additionalInfoChanged(infoList);
+
+ // Not all view modes support categorized sorting. Adjust the sorting model
+ // if changing the view mode results in a change of the categorized sorting
+ // capabilities.
+ m_storedCategorizedSorting = props.categorizedSorting();
+ const bool categorized = m_storedCategorizedSorting && supportsCategorizedSorting();
+ if (categorized != m_proxyModel->isCategorizedModel()) {
+ m_proxyModel->setCategorizedModel(categorized);
+ emit categorizedSortingChanged();
+ }
+
+ loadDirectory(viewPropsUrl);
emit modeChanged();
}
void DolphinView::setShowPreview(bool show)
{
+ if (m_showPreview == show) {
+ return;
+ }
+
const KUrl viewPropsUrl = viewPropertiesUrl();
ViewProperties props(viewPropsUrl);
props.setShowPreview(show);
- m_controller->setShowPreview(show);
+ m_showPreview = show;
+
emit showPreviewChanged();
- startDirLister(viewPropsUrl, true);
+ loadDirectory(viewPropsUrl, true);
}
bool DolphinView::showPreview() const
{
- return m_controller->showPreview();
+ return m_showPreview;
}
void DolphinView::setShowHiddenFiles(bool show)
m_dirLister->setShowingDotFiles(show);
emit showHiddenFilesChanged();
- startDirLister(viewPropsUrl, true);
+ loadDirectory(viewPropsUrl, true);
}
bool DolphinView::showHiddenFiles() const
void DolphinView::setCategorizedSorting(bool categorized)
{
- if (!supportsCategorizedSorting() || (categorized == categorizedSorting())) {
+ if (categorized == categorizedSorting()) {
return;
}
- 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;
- }
+ // setCategorizedSorting(true) may only get invoked
+ // if the view supports categorized sorting
+ Q_ASSERT(!categorized || supportsCategorizedSorting());
ViewProperties props(viewPropertiesUrl());
props.setCategorizedSorting(categorized);
props.save();
+ m_storedCategorizedSorting = categorized;
+ m_proxyModel->setCategorizedModel(categorized);
+
emit categorizedSortingChanged();
}
bool DolphinView::categorizedSorting() const
{
- if (!supportsCategorizedSorting()) {
- return false;
- }
-
- Q_ASSERT(m_iconsView != 0);
- return m_iconsView->itemCategorizer() != 0;
+ // If all view modes would support categorized sorting, returning
+ // m_proxyModel->isCategorizedModel() would be the way to go. As
+ // currently only the icons view supports caterized sorting, we remember
+ // the stored view properties state in m_storedCategorizedSorting and
+ // return this state. The application takes care to disable the corresponding
+ // checkbox by checking DolphinView::supportsCategorizedSorting() to indicate
+ // that this setting is not applied to the current view mode.
+ return m_storedCategorizedSorting;
}
bool DolphinView::supportsCategorizedSorting() const
void DolphinView::invertSelection()
{
if (isColumnViewActive()) {
- // In opposite to QAbstractItemView::selectAll() there is no virtual method
- // for adjusting the invertion of a selection. As the generic approach by using
- // the selection model does not work for the column view, we delegate this task:
+ // QAbstractItemView does not offer a virtual method invertSelection()
+ // as counterpart to QAbstractItemView::selectAll(). This makes it
+ // necessary to delegate the inverting of the selection to the
+ // column view, as only the selection of the active column should
+ // get inverted.
m_columnView->invertSelection();
} else {
QItemSelectionModel* selectionModel = itemView()->selectionModel();
const QModelIndex bottomRight = itemModel->index(itemModel->rowCount() - 1,
itemModel->columnCount() - 1);
- QItemSelection selection(topLeft, bottomRight);
+ const QItemSelection selection(topLeft, bottomRight);
selectionModel->select(selection, QItemSelectionModel::Toggle);
}
}
{
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));
KFileItemList itemList;
const QModelIndexList indexList = selection.indexes();
- QModelIndexList::const_iterator end = indexList.end();
- for (QModelIndexList::const_iterator it = indexList.begin(); it != end; ++it) {
- Q_ASSERT((*it).isValid());
-
- KFileItem* item = m_dirModel->itemForIndex(*it);
- if (item != 0) {
+ foreach (QModelIndex index, indexList) {
+ KFileItem item = m_dolphinModel->itemForIndex(index);
+ if (!item.isNull()) {
itemList.append(item);
}
}
KUrl::List DolphinView::selectedUrls() const
{
KUrl::List urls;
-
const KFileItemList list = selectedItems();
- KFileItemList::const_iterator it = list.begin();
- const KFileItemList::const_iterator end = list.end();
- while (it != end) {
- KFileItem* item = *it;
- urls.append(item->url());
- ++it;
+ foreach (KFileItem item, list) {
+ urls.append(item.url());
}
-
return urls;
}
-KFileItem* DolphinView::fileItem(const QModelIndex index) const
+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)
{
QAbstractItemView* view = itemView();
- view->horizontalScrollBar()->setValue(x);
+
+ // the ColumnView takes care itself for the horizontal scrolling
+ if (!isColumnViewActive()) {
+ view->horizontalScrollBar()->setValue(x);
+ }
view->verticalScrollBar()->setValue(y);
m_loadingDirectory = false;
return m_proxyModel->sortOrder();
}
-void DolphinView::setAdditionalInfo(KFileItemDelegate::AdditionalInformation info)
+void DolphinView::setAdditionalInfo(KFileItemDelegate::InformationList info)
{
const KUrl viewPropsUrl = viewPropertiesUrl();
ViewProperties props(viewPropsUrl);
props.setAdditionalInfo(info);
-
- m_controller->setShowAdditionalInfo(info != KFileItemDelegate::NoInformation);
- m_fileItemDelegate->setAdditionalInformation(info);
+ m_fileItemDelegate->setShowInformation(info);
emit additionalInfoChanged(info);
- startDirLister(viewPropsUrl, true);
+
+ if (itemView() != m_detailsView) {
+ // the details view requires no reloading of the directory, as it maps
+ // the file item delegate info to its columns internally
+ loadDirectory(viewPropsUrl, true);
+ }
}
-KFileItemDelegate::AdditionalInformation DolphinView::additionalInfo() const
+KFileItemDelegate::InformationList DolphinView::additionalInfo() const
{
- return m_fileItemDelegate->additionalInformation();
+ return m_fileItemDelegate->showInformation();
}
void DolphinView::reload()
{
setUrl(url());
- startDirLister(url(), true);
+ loadDirectory(url(), true);
}
void DolphinView::refresh()
{
+ const bool oldActivationState = m_active;
+ m_active = true;
+
createView();
applyViewProperties(m_controller->url());
reload();
- updateViewportColor();
+
+ setActive(oldActivationState);
}
-void DolphinView::setUrl(const KUrl& url)
+void DolphinView::updateView(const KUrl& url, const KUrl& rootUrl)
{
if (m_controller->url() == url) {
return;
}
- m_controller->setUrl(url);
+ m_controller->setUrl(url); // emits urlChanged, which we forward
- applyViewProperties(url);
+ if (!rootUrl.isEmpty() && rootUrl.isParentOf(url)) {
+ applyViewProperties(rootUrl);
+ loadDirectory(rootUrl);
+ if (itemView() == m_columnView) {
+ m_columnView->setRootUrl(rootUrl);
+ m_columnView->showColumn(url);
+ }
+ } else {
+ applyViewProperties(url);
+ loadDirectory(url);
+ }
+
+ emit startedPathLoading(url);
+}
+
+void DolphinView::setNameFilter(const QString& nameFilter)
+{
+ m_proxyModel->setFilterRegExp(nameFilter);
+
+ if (isColumnViewActive()) {
+ // adjusting the directory lister is not enough in the case of the
+ // column view, as each column has its own directory lister internally...
+ m_columnView->setNameFilter(nameFilter);
+ }
+}
+
+void DolphinView::calculateItemCount(int& fileCount, int& folderCount)
+{
+ foreach (KFileItem item, m_dirLister->items()) {
+ if (item.isDir()) {
+ ++folderCount;
+ } else {
+ ++fileCount;
+ }
+ }
+}
- startDirLister(url);
- emit urlChanged(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()
{
setActive(true);
}
-void DolphinView::triggerItem(const QModelIndex& index)
+void DolphinView::triggerItem(const KFileItem& item)
{
- if (!isValidNameIndex(index)) {
- clearSelection();
- showHoverInformation(index);
- return;
- }
-
const Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers();
if ((modifier & Qt::ShiftModifier) || (modifier & Qt::ControlModifier)) {
// items are selected by the user, hence don't trigger the
return;
}
- KFileItem* item = m_dirModel->itemForIndex(m_proxyModel->mapToSource(index));
- if (item == 0) {
+ if (item.isNull()) {
return;
}
- // The stuff below should be moved to ViewContainer and be just a signal?
-
- // Prefer the local path over the URL.
- bool isLocal;
- KUrl url = item->mostLocalUrl(isLocal);
-
- if (item->isDir()) {
- setUrl(url);
- } else if (item->isFile()) {
- // allow to browse through ZIP and tar files
- KMimeType::Ptr mime = item->mimeTypePtr();
- if (mime->is("application/zip")) {
- url.setProtocol("zip");
- setUrl(url);
- } else if (mime->is("application/x-tar") ||
- mime->is("application/x-tarz") ||
- mime->is("application/x-bzip-compressed-tar") ||
- mime->is("application/x-compressed-tar") ||
- mime->is("application/x-tzo")) {
- url.setProtocol("tar");
- setUrl(url);
- } else {
- item->run();
- }
- } else {
- item->run();
- }
+ emit itemTriggered(item); // caught by DolphinViewContainer or DolphinPart
}
void DolphinView::generatePreviews(const KFileItemList& items)
{
- if (m_controller->showPreview()) {
-
- // Must turn QList<KFileItem *> to QList<KFileItem>...
- QList<KFileItem> itemsToPreview;
- foreach( KFileItem* it, items )
- itemsToPreview.append( *it );
-
- KIO::PreviewJob* job = KIO::filePreview(itemsToPreview, 128);
+ if (m_controller->dolphinView()->showPreview()) {
+ KIO::PreviewJob* job = KIO::filePreview(items, 128);
connect(job, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)),
this, SLOT(showPreview(const KFileItem&, const QPixmap&)));
}
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);
+ const QPixmap cutPixmap = iconEffect.apply(pixmap, KIconLoader::Desktop, KIconLoader::DisabledState);
+ 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);
}
}
}
emit selectionChanged(DolphinView::selectedItems());
}
-void DolphinView::startDirLister(const KUrl& url, bool reload)
+void DolphinView::loadDirectory(const KUrl& url, bool reload)
{
if (!url.isValid()) {
const QString location(url.pathOrUrl());
m_loadingDirectory = true;
m_dirLister->stop();
+ m_dirLister->openUrl(url, reload ? KDirLister::Reload : KDirLister::NoFlags);
- bool openDir = true;
- bool keepOldDirs = isColumnViewActive() && !m_initializeColumnView;
- m_initializeColumnView = false;
-
- if (keepOldDirs) {
+ if (isColumnViewActive()) {
+ // adjusting the directory lister is not enough in the case of the
+ // column view, as each column has its own directory lister internally...
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;
- }
- } else if (m_dirLister->directories().contains(url)) {
- // The dir lister contains the directory already, so
- // KDirLister::openUrl() may not been invoked twice.
- m_dirLister->updateDirectory(url);
- openDir = false;
+ m_columnView->reload();
} 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 bookmark has been selected
- // and hence the view must be reset.
- keepOldDirs = false;
- }
+ m_columnView->showColumn(url);
}
}
-
- if (openDir) {
- m_dirLister->openUrl(url, keepOldDirs, reload);
- }
}
KUrl DolphinView::viewPropertiesUrl() const
void DolphinView::applyViewProperties(const KUrl& url)
{
- if (isColumnViewActive() && m_dirLister->url().isParentOf(url)) {
+ 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
// view always represents the properties of the first column.
m_mode = mode;
createView();
emit modeChanged();
-
- if (m_mode == ColumnView) {
- // The mode has been changed to the Column View. When starting the dir
- // lister with DolphinView::startDirLister() it is important to give a
- // hint that the dir lister may not keep the current directory
- // although this is the default for showing a hierarchy.
- m_initializeColumnView = true;
- }
}
if (itemView() == 0) {
createView();
emit showHiddenFilesChanged();
}
- 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_storedCategorizedSorting = props.categorizedSorting();
+ const bool categorized = m_storedCategorizedSorting && supportsCategorizedSorting();
+ if (categorized != m_proxyModel->isCategorizedModel()) {
+ m_proxyModel->setCategorizedModel(categorized);
emit categorizedSortingChanged();
}
emit sortOrderChanged(sortOrder);
}
- KFileItemDelegate::AdditionalInformation info = props.additionalInfo();
- if (info != m_fileItemDelegate->additionalInformation()) {
- m_controller->setShowAdditionalInfo(info != KFileItemDelegate::NoInformation);
- m_fileItemDelegate->setAdditionalInformation(info);
+ KFileItemDelegate::InformationList info = props.additionalInfo();
+ if (info != m_fileItemDelegate->showInformation()) {
+ m_fileItemDelegate->setShowInformation(info);
emit additionalInfoChanged(info);
}
const bool showPreview = props.showPreview();
- if (showPreview != m_controller->showPreview()) {
- m_controller->setShowPreview(showPreview);
+ if (showPreview != m_showPreview) {
+ m_showPreview = showPreview;
emit showPreviewChanged();
}
}
const KUrl& baseUrl = url();
KUrl url;
QItemSelection new_selection;
- foreach(KFileItem* item, selection) {
- url = item->url().upUrl();
+ 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::openContextMenu(const QPoint& pos)
{
- KFileItem* item = 0;
+ KFileItem item;
const QModelIndex index = itemView()->indexAt(pos);
- if (isValidNameIndex(index)) {
+ if (index.isValid() && (index.column() == DolphinModel::Name)) {
item = fileItem(index);
}
}
void DolphinView::dropUrls(const KUrl::List& urls,
- const QModelIndex& index,
+ const KUrl& destPath,
+ const KFileItem& destItem,
QWidget* source)
{
- KFileItem* directory = 0;
- if (isValidNameIndex(index)) {
- KFileItem* item = fileItem(index);
- Q_ASSERT(item != 0);
- if (item->isDir()) {
- // the URLs are dropped above a directory
- directory = item;
+ bool dropAboveDir = false;
+ if (!destItem.isNull()) {
+ dropAboveDir = destItem.isDir();
+ if (!dropAboveDir) {
+ // the dropping is done above a file
+ return;
}
- }
-
- if ((directory == 0) && (source == itemView())) {
- // The dropping is done into the same viewport where
- // the dragging has been started. Just ignore this...
+ } else if (source == itemView()) {
+ // the dropping is done into the same viewport where the dragging
+ // has been started
return;
}
- const KUrl& destination = (directory == 0) ?
- url() : directory->url();
+ const KUrl& destination = dropAboveDir ? destItem.url() : destPath;
dropUrls(urls, destination);
}
emit sortOrderChanged(order);
}
+void DolphinView::updateAdditionalInfo(const KFileItemDelegate::InformationList& info)
+{
+ ViewProperties props(viewPropertiesUrl());
+ props.setAdditionalInfo(info);
+
+ m_fileItemDelegate->setShowInformation(info);
+
+ emit additionalInfoChanged(info);
+
+}
+
void DolphinView::emitContentsMoved()
{
// only emit the contents moved signal if:
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;
}
applyCutItemEffect();
}
-void DolphinView::showHoverInformation(const QModelIndex& index)
+void DolphinView::showHoverInformation(const KFileItem& item)
{
if (hasSelection()) {
return;
}
- const KFileItem* item = fileItem(index);
- if (item != 0) {
- emit requestItemInfo(*item);
- }
+ emit requestItemInfo(item);
}
void DolphinView::clearHoverInformation()
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;
// ... and recreate it representing the current mode
switch (m_mode) {
- case IconsView:
+ case IconsView: {
m_iconsView = new DolphinIconsView(this, m_controller);
view = m_iconsView;
break;
+ }
case DetailsView:
m_detailsView = new DolphinDetailsView(this, m_controller);
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&)),
return m_iconsView;
}
-bool DolphinView::isValidNameIndex(const QModelIndex& index) const
-{
- return index.isValid() && (index.column() == KDirModel::Name);
-}
-
bool DolphinView::isCutItem(const KFileItem& item) const
{
const QMimeData* mimeData = QApplication::clipboard()->mimeData();
KFileItemList::const_iterator it = items.begin();
const KFileItemList::const_iterator end = items.end();
while (it != end) {
- KFileItem* item = *it;
- if (isCutItem(*item)) {
- const QModelIndex index = m_dirModel->indexForItem(*item);
- const KFileItem* item = m_dirModel->itemForIndex(index);
- const QVariant value = m_dirModel->data(index, Qt::DecorationRole);
- if ((value.type() == QVariant::Icon) && (item != 0)) {
+ const KFileItem item = *it;
+ if (isCutItem(item)) {
+ const QModelIndex index = m_dolphinModel->indexForItem(item);
+ 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);
// remember current pixmap for the item to be able
// to restore it when other items get cut
CutItem cutItem;
- cutItem.url = item->url();
+ cutItem.url = item.url();
cutItem.pixmap = pixmap;
m_cutItemsCache.append(cutItem);
// 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);
+ pixmap = iconEffect.apply(pixmap, KIconLoader::Desktop, KIconLoader::DisabledState);
+ m_dolphinModel->setData(index, QIcon(pixmap), Qt::DecorationRole);
}
}
++it;
}
}
-void DolphinView::updateViewportColor()
+KToggleAction* DolphinView::iconsModeAction(KActionCollection* actionCollection)
{
- QColor color = KColorScheme(KColorScheme::View).background();
- if (m_active) {
- emit urlChanged(url());
- emit selectionChanged(selectedItems());
- } else {
- color.setAlpha(0);
- }
+ KToggleAction* iconsView = actionCollection->add<KToggleAction>("icons");
+ iconsView->setText(i18nc("@action:inmenu View Mode", "Icons"));
+ iconsView->setShortcut(Qt::CTRL | Qt::Key_1);
+ iconsView->setIcon(KIcon("fileview-icon"));
+ iconsView->setData(QVariant::fromValue(IconsView));
+ return iconsView;
+}
- QWidget* viewport = itemView()->viewport();
- QPalette palette;
- palette.setColor(viewport->backgroundRole(), color);
- viewport->setPalette(palette);
+KToggleAction* DolphinView::detailsModeAction(KActionCollection* actionCollection)
+{
+ KToggleAction* detailsView = actionCollection->add<KToggleAction>("details");
+ detailsView->setText(i18nc("@action:inmenu View Mode", "Details"));
+ detailsView->setShortcut(Qt::CTRL | Qt::Key_2);
+ detailsView->setIcon(KIcon("fileview-detailed"));
+ detailsView->setData(QVariant::fromValue(DetailsView));
+ return detailsView;
+}
+
+KToggleAction* DolphinView::columnsModeAction(KActionCollection* actionCollection)
+{
+ KToggleAction* columnView = actionCollection->add<KToggleAction>("columns");
+ columnView->setText(i18nc("@action:inmenu View Mode", "Columns"));
+ columnView->setShortcut(Qt::CTRL | Qt::Key_3);
+ columnView->setIcon(KIcon("fileview-column"));
+ columnView->setData(QVariant::fromValue(ColumnView));
+ return columnView;
+}
+
+QString DolphinView::currentViewModeActionName() const
+{
+ switch (m_mode) {
+ case DolphinView::IconsView:
+ return "icons";
+ case DolphinView::DetailsView:
+ return "details";
+ case DolphinView::ColumnView:
+ return "columns";
+ }
+ return QString(); // can't happen
}
#include "dolphinview.moc"