┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/views/viewproperties.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2010-09-21 19:03:04 +0000
committerPeter Penz <[email protected]>2010-09-21 19:03:04 +0000
commit1e8e05e81f50a7567cc67666ffb8bccab9a10199 (patch)
treef7860df72a1e9f09c6ae006caeaea883bb15a38f /src/views/viewproperties.cpp
parentfcef5f7721dbcb2fa5d672ff123edfed078c0006 (diff)
It was a bad idea to store the enabled additional-information as bit-values: With the current setup only up to 8 additional informations are possible. This restriction is bypassed now:
- Backward compatibility for old .directorry files is provided - A version-information has been added for possible future changes - As "side-effect" it also allows to have a details-view with only one column (#238140) BUG: 238140 FIXED-IN: 4.6.0 svn path=/trunk/KDE/kdebase/apps/; revision=1177944
Diffstat (limited to 'src/views/viewproperties.cpp')
-rw-r--r--src/views/viewproperties.cpp170
1 files changed, 125 insertions, 45 deletions
diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp
index 11b2404a9..483fc0be7 100644
--- a/src/views/viewproperties.cpp
+++ b/src/views/viewproperties.cpp
@@ -101,7 +101,7 @@ void ViewProperties::setViewMode(DolphinView::Mode mode)
{
if (m_node->viewMode() != mode) {
m_node->setViewMode(mode);
- updateTimeStamp();
+ update();
}
}
@@ -114,7 +114,7 @@ void ViewProperties::setShowPreview(bool show)
{
if (m_node->showPreview() != show) {
m_node->setShowPreview(show);
- updateTimeStamp();
+ update();
}
}
@@ -127,7 +127,7 @@ void ViewProperties::setShowHiddenFiles(bool show)
{
if (m_node->showHiddenFiles() != show) {
m_node->setShowHiddenFiles(show);
- updateTimeStamp();
+ update();
}
}
@@ -135,7 +135,7 @@ void ViewProperties::setCategorizedSorting(bool categorized)
{
if (m_node->categorizedSorting() != categorized) {
m_node->setCategorizedSorting(categorized);
- updateTimeStamp();
+ update();
}
}
@@ -153,7 +153,7 @@ void ViewProperties::setSorting(DolphinView::Sorting sorting)
{
if (m_node->sorting() != sorting) {
m_node->setSorting(sorting);
- updateTimeStamp();
+ update();
}
}
@@ -166,7 +166,7 @@ void ViewProperties::setSortOrder(Qt::SortOrder sortOrder)
{
if (m_node->sortOrder() != sortOrder) {
m_node->setSortOrder(sortOrder);
- updateTimeStamp();
+ update();
}
}
@@ -179,7 +179,7 @@ void ViewProperties::setSortFoldersFirst(bool foldersFirst)
{
if (m_node->sortFoldersFirst() != foldersFirst) {
m_node->setSortFoldersFirst(foldersFirst);
- updateTimeStamp();
+ update();
}
}
@@ -190,17 +190,42 @@ bool ViewProperties::sortFoldersFirst() const
void ViewProperties::setAdditionalInfo(const KFileItemDelegate::InformationList& list)
{
+ // See ViewProperties::additionalInfoV2() for the storage format
+ // of the additional information.
+
+ // Remove the old values stored for the current view-mode
+ const QStringList oldInfoStringList = m_node->additionalInfoV2();
+ const QString prefix = viewModePrefix();
+ QStringList newInfoStringList = oldInfoStringList;
+ for (int i = newInfoStringList.count() - 1; i >= 0; --i) {
+ if (newInfoStringList.at(i).startsWith(prefix)) {
+ newInfoStringList.removeAt(i);
+ }
+ }
+
+ // Add the updated values for the current view-mode
AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance();
+ foreach (KFileItemDelegate::Information info, list) {
+ newInfoStringList.append(prefix + infoAccessor.value(info));
+ }
- int infoMask = 0;
- foreach (KFileItemDelegate::Information currentInfo, list) {
- infoMask = infoMask | infoAccessor.bitValue(currentInfo);
+ // Only update the information if it has been changed
+ bool changed = oldInfoStringList.count() != newInfoStringList.count();
+ if (!changed) {
+ foreach (const QString& oldInfoString, oldInfoStringList) {
+ if (!newInfoStringList.contains(oldInfoString)) {
+ changed = true;
+ break;
+ }
+ }
}
- const int encodedInfo = encodedAdditionalInfo(infoMask);
- if (m_node->additionalInfo() != encodedInfo) {
- m_node->setAdditionalInfo(encodedInfo);
- updateTimeStamp();
+ if (changed) {
+ if (m_node->version() < 2) {
+ m_node->setVersion(2);
+ }
+ m_node->setAdditionalInfoV2(newInfoStringList);
+ update();
}
}
@@ -208,15 +233,10 @@ KFileItemDelegate::InformationList ViewProperties::additionalInfo() const
{
KFileItemDelegate::InformationList usedInfos;
- const int decodedInfo = decodedAdditionalInfo();
-
- AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance();
- const KFileItemDelegate::InformationList infoKeys = infoAccessor.keys();
-
- foreach (const KFileItemDelegate::Information info, infoKeys) {
- if (decodedInfo & infoAccessor.bitValue(info)) {
- usedInfos.append(info);
- }
+ switch (m_node->version()) {
+ case 1: usedInfos = additionalInfoV1(); break;
+ case 2: usedInfos = additionalInfoV2(); break;
+ default: kWarning() << "Unknown version of the view properties";
}
return usedInfos;
@@ -245,10 +265,26 @@ bool ViewProperties::isAutoSaveEnabled() const
return m_autoSave;
}
-void ViewProperties::updateTimeStamp()
+void ViewProperties::update()
{
m_changedProps = true;
m_node->setTimestamp(QDateTime::currentDateTime());
+
+ // If the view-properties are stored in an older format, take
+ // care to update them to the current format.
+ switch (m_node->version()) {
+ case 1: {
+ const KFileItemDelegate::InformationList infoList = additionalInfoV1();
+ m_node->setVersion(2);
+ setAdditionalInfo(infoList);
+ break;
+ }
+ case 2:
+ // Current version. Nothing needs to get converted.
+ break;
+ default:
+ kWarning() << "Unknown version of the view properties";
+ }
}
void ViewProperties::save()
@@ -272,28 +308,10 @@ QString ViewProperties::destinationDir(const QString& subDir) const
return KStandardDirs::locateLocal("data", basePath);
}
-int ViewProperties::encodedAdditionalInfo(int info) const
+KFileItemDelegate::InformationList ViewProperties::additionalInfoV1() const
{
- int encodedInfo = m_node->additionalInfo();
-
- switch (viewMode()) {
- case DolphinView::DetailsView:
- encodedInfo = (encodedInfo & 0xFFFF00) | info;
- break;
- case DolphinView::IconsView:
- encodedInfo = (encodedInfo & 0xFF00FF) | (info << 8);
- break;
- case DolphinView::ColumnView:
- encodedInfo = (encodedInfo & 0x00FFFF) | (info << 16);
- break;
- default: break;
- }
-
- return encodedInfo;
-}
+ KFileItemDelegate::InformationList usedInfos;
-int ViewProperties::decodedAdditionalInfo() const
-{
int decodedInfo = m_node->additionalInfo();
switch (viewMode()) {
@@ -316,5 +334,67 @@ int ViewProperties::decodedAdditionalInfo() const
default: break;
}
- return decodedInfo;
+ AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance();
+ const KFileItemDelegate::InformationList infoKeys = infoAccessor.keys();
+
+ foreach (const KFileItemDelegate::Information info, infoKeys) {
+ if (decodedInfo & infoAccessor.bitValue(info)) {
+ usedInfos.append(info);
+ }
+ }
+
+ return usedInfos;
+}
+
+KFileItemDelegate::InformationList ViewProperties::additionalInfoV2() const
+{
+ // The shown additional information is stored for each view-mode separately as
+ // string with the view-mode as prefix. Example:
+ //
+ // AdditionalInfoV2=Details_Size,Details_Date,Details_Owner,Icon_Size
+ //
+ // To get the representation as KFileItemDelegate::InformationList, the current
+ // view-mode must be checked and the values of this mode added to the list.
+
+ KFileItemDelegate::InformationList usedInfos;
+
+ // infoHash allows to get the mapped KFileItemDelegate::Information value
+ // for a stored string-value in a fast way
+ static QHash<QString, KFileItemDelegate::Information> infoHash;
+ if (infoHash.isEmpty()) {
+ AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance();
+ const KFileItemDelegate::InformationList keys = infoAccessor.keys();
+ foreach (const KFileItemDelegate::Information key, keys) {
+ infoHash.insert(infoAccessor.value(key), key);
+ }
+ }
+
+ // Iterate through all stored keys stored as strings and map them to
+ // the corresponding KFileItemDelegate::Information values.
+ const QString prefix = viewModePrefix();
+ const int prefixLength = prefix.length();
+ const QStringList infoStringList = m_node->additionalInfoV2();
+ foreach (const QString& infoString, infoStringList) {
+ if (infoString.startsWith(prefix)) {
+ const QString key = infoString.right(infoString.length() - prefixLength);
+ Q_ASSERT(infoHash.contains(key));
+ usedInfos.append(infoHash.value(key));
+ }
+ }
+
+ return usedInfos;
+}
+
+QString ViewProperties::viewModePrefix() const
+{
+ QString prefix;
+
+ switch (m_node->viewMode()) {
+ case DolphinView::DetailsView: prefix = "Details_"; break;
+ case DolphinView::IconsView: prefix = "Icons_"; break;
+ case DolphinView::ColumnView: prefix = "Column_"; break;
+ default: kWarning() << "Unknown view-mode of the view properties";
+ }
+
+ return prefix;
}