From: Frank Reininghaus Date: Mon, 10 May 2010 12:49:41 +0000 (+0000) Subject: Provide the destination of a symbolic link as a column in Dolphin's X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/7e74c6f23beb06b9541508b91914a4f9b3ee3a62 Provide the destination of a symbolic link as a column in Dolphin's (and Konqueror's) Details View in KDE SC 4.5. This is based on the changes to KFileItemDelegate from commit 1124981. FEATURE: 211690 svn path=/trunk/KDE/kdebase/apps/; revision=1124982 --- diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index 8ea5e93e6..5545a6ede 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -645,30 +645,40 @@ void DolphinDetailsView::updateColumnVisibility() const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); const QList columnPositions = settings->columnPositions(); - + const KFileItemDelegate::InformationList list = m_dolphinViewController->view()->additionalInfo(); - for (int i = DolphinModel::Name; i <= DolphinModel::Version; ++i) { + for (int i = DolphinModel::Name; i < DolphinModel::ExtraColumnCount; ++i) { const KFileItemDelegate::Information info = infoForColumn(i); const bool hide = !list.contains(info) && (i != DolphinModel::Name); if (isColumnHidden(i) != hide) { setColumnHidden(i, hide); } - - const int from = headerView->visualIndex(i); - headerView->moveSection(from, columnPositions[i]); + + // If the list columnPositions has been written by an older Dolphin version, + // its length might be smaller than DolphinModel::ExtraColumnCount. Therefore, + // we have to check if item number i exists before accessing it. + if (i < columnPositions.length()) { + const int position = columnPositions[i]; + + // The position might be outside the correct range if the list columnPositions + // has been written by a newer Dolphin version with more columns. + if (position < DolphinModel::ExtraColumnCount) { + const int from = headerView->visualIndex(i); + headerView->moveSection(from, position); + } + } } - + resizeColumns(); connect(headerView, SIGNAL(sectionMoved(int, int, int)), this, SLOT(saveColumnPositions())); - } void DolphinDetailsView::saveColumnPositions() { QList columnPositions; - for (int i = DolphinModel::Name; i <= DolphinModel::Version; ++i) { + for (int i = DolphinModel::Name; i < DolphinModel::ExtraColumnCount; ++i) { columnPositions.append(header()->visualIndex(i)); } @@ -988,6 +998,7 @@ KFileItemDelegate::Information DolphinDetailsView::infoForColumn(int columnIndex case DolphinModel::Owner: info = KFileItemDelegate::Owner; break; case DolphinModel::Group: info = KFileItemDelegate::OwnerAndGroup; break; case DolphinModel::Type: info = KFileItemDelegate::FriendlyMimeType; break; + case DolphinModel::LinkDestination: info = KFileItemDelegate::LinkDest; break; default: break; } @@ -1005,7 +1016,7 @@ void DolphinDetailsView::resizeColumns() QHeaderView* headerView = header(); QFontMetrics fontMetrics(viewport()->font()); - int columnWidth[DolphinModel::Version + 1]; + int columnWidth[DolphinModel::ExtraColumnCount]; columnWidth[DolphinModel::Size] = fontMetrics.width("00000 Items"); columnWidth[DolphinModel::ModifiedTime] = fontMetrics.width("0000-00-00 00:00"); columnWidth[DolphinModel::Permissions] = fontMetrics.width("xxxxxxxxxx"); @@ -1013,6 +1024,7 @@ void DolphinDetailsView::resizeColumns() columnWidth[DolphinModel::Group] = fontMetrics.width("xxxxxxxxxx"); columnWidth[DolphinModel::Type] = fontMetrics.width("XXXX Xxxxxxx"); columnWidth[DolphinModel::Version] = fontMetrics.width("xxxxxxxx"); + columnWidth[DolphinModel::LinkDestination] = fontMetrics.width("xxxxxxxx"); int requiredWidth = 0; for (int i = KDirModel::Size; i <= KDirModel::Type; ++i) { diff --git a/src/dolphinmodel.cpp b/src/dolphinmodel.cpp index 35a5fb8f1..d81e0c38b 100644 --- a/src/dolphinmodel.cpp +++ b/src/dolphinmodel.cpp @@ -113,6 +113,12 @@ QVariant DolphinModel::data(const QModelIndex& index, int role) const return i18nc("@item::intable", "Unversioned"); } } + else if (index.column() == DolphinModel::LinkDestination) { + const KDirModel *dirModel = qobject_cast(index.model()); + KFileItem item = dirModel->itemForIndex(index); + return item.linkDest(); + } + break; default: @@ -125,12 +131,14 @@ QVariant DolphinModel::data(const QModelIndex& index, int role) const QVariant DolphinModel::headerData(int section, Qt::Orientation orientation, int role) const { if ((orientation == Qt::Horizontal) && (role == Qt::DisplayRole)) { - if (section < KDirModel::ColumnCount) { + switch (section) { + case DolphinModel::Version: + return i18nc("@title::column", "Version"); + case DolphinModel::LinkDestination: + return i18nc("@title::column", "Link Destination"); + default: return KDirModel::headerData(section, orientation, role); } - - Q_ASSERT(section == DolphinModel::Version); - return i18nc("@title::column", "Version"); } return QVariant(); } diff --git a/src/dolphinmodel.h b/src/dolphinmodel.h index adb59a39f..5c43028c8 100644 --- a/src/dolphinmodel.h +++ b/src/dolphinmodel.h @@ -35,6 +35,7 @@ class LIBDOLPHINPRIVATE_EXPORT DolphinModel : public KDirModel public: enum AdditionalColumns { Version = KDirModel::ColumnCount, + LinkDestination, ExtraColumnCount }; diff --git a/src/panels/folders/paneltreeview.cpp b/src/panels/folders/paneltreeview.cpp index 6eefb6e6e..646115037 100644 --- a/src/panels/folders/paneltreeview.cpp +++ b/src/panels/folders/paneltreeview.cpp @@ -77,6 +77,7 @@ bool PanelTreeView::event(QEvent* event) hideColumn(DolphinModel::Group); hideColumn(DolphinModel::Type); hideColumn(DolphinModel::Version); + hideColumn(DolphinModel::LinkDestination); header()->hide(); break; diff --git a/src/settings/dolphin_detailsmodesettings.kcfg b/src/settings/dolphin_detailsmodesettings.kcfg index 49eced3e6..6c5674785 100644 --- a/src/settings/dolphin_detailsmodesettings.kcfg +++ b/src/settings/dolphin_detailsmodesettings.kcfg @@ -39,7 +39,7 @@ - 0,1,2,3,4,5,6,7 + 0,1,2,3,4,5,6,7,8