</group>
<group name="Dolphin">
+ <entry name="Version" type="Int" >
+ <label context="@label">Version</label>
+ <whatsthis context="@info:whatsthis">This option defines the used version of the view properties.</whatsthis>
+ <default>1</default>
+ <min>1</min>
+ </entry>
+
<entry name="ViewMode" type="Int" >
<label context="@label">View Mode</label>
<whatsthis context="@info:whatsthis">This option controls the style of the view. Currently supported values include icons (0), details (1) and column (2) views.</whatsthis>
</entry>
<entry name="AdditionalInfo" type="Int">
- <label context="@label">Additional information</label>
+ <label context="@label">Additional information (deprecated, use AdditionInfoV2 instead)</label>
<default>0</default>
</entry>
+ <entry name="AdditionalInfoV2" type="StringList">
+ <label context="@label">Additional information</label>
+ <default></default>
+ </entry>
+
<entry name="Timestamp" type="DateTime" >
<label context="@label">Properties last changed</label>
<whatsthis context="@info:whatsthis">The last time these properties were changed by the user.</whatsthis>
return i18nc(m_map[info]->context, m_map[info]->translation);
}
+QString AdditionalInfoAccessor::value(KFileItemDelegate::Information info) const
+{
+ return m_map[info]->value;
+}
+
DolphinView::Sorting AdditionalInfoAccessor::sorting(KFileItemDelegate::Information info) const
{
return m_map[info]->sorting;
m_map()
{
static const AdditionalInfoAccessor::AdditionalInfo additionalInfos[] = {
- { "size", I18N_NOOP2_NOSTRIP("@label", "Size"), DolphinView::SortBySize, 1 },
- { "date", I18N_NOOP2_NOSTRIP("@label", "Date"), DolphinView::SortByDate, 2 },
- { "permissions", I18N_NOOP2_NOSTRIP("@label", "Permissions"), DolphinView::SortByPermissions, 4 },
- { "owner", I18N_NOOP2_NOSTRIP("@label", "Owner"), DolphinView::SortByOwner, 8 },
- { "group", I18N_NOOP2_NOSTRIP("@label", "Group"), DolphinView::SortByGroup, 16 },
- { "type", I18N_NOOP2_NOSTRIP("@label", "Type"), DolphinView::SortByType, 32 },
- { "destination", I18N_NOOP2_NOSTRIP("@label", "Link Destination"), DolphinView::SortByDestination, 64 },
- { "path", I18N_NOOP2_NOSTRIP("@label", "Path"), DolphinView::SortByPath, 128 }
+ // Entries for view-properties version 1:
+ { "size", I18N_NOOP2_NOSTRIP("@label", "Size"), "Size", DolphinView::SortBySize, 1 },
+ { "date", I18N_NOOP2_NOSTRIP("@label", "Date"), "Date", DolphinView::SortByDate, 2 },
+ { "permissions", I18N_NOOP2_NOSTRIP("@label", "Permissions"), "Permissions", DolphinView::SortByPermissions, 4 },
+ { "owner", I18N_NOOP2_NOSTRIP("@label", "Owner"), "Owner", DolphinView::SortByOwner, 8 },
+ { "group", I18N_NOOP2_NOSTRIP("@label", "Group"), "Group", DolphinView::SortByGroup, 16 },
+ { "type", I18N_NOOP2_NOSTRIP("@label", "Type"), "Type", DolphinView::SortByType, 32 },
+ { "destination", I18N_NOOP2_NOSTRIP("@label", "Link Destination"), "LinkDestination", DolphinView::SortByDestination, 64 },
+ { "path", I18N_NOOP2_NOSTRIP("@label", "Path"), "Path", DolphinView::SortByPath, 128 }
+ // Entries for view-properties version >= 2 (the last column can be set to 0):
};
m_map.insert(KFileItemDelegate::Size, &additionalInfos[0]);
QString translation(KFileItemDelegate::Information info) const;
+ /**
+ * @return String representation of the value that is stored in the .directory
+ * by ViewProperties.
+ */
+ QString value(KFileItemDelegate::Information info) const;
+
DolphinView::Sorting sorting(KFileItemDelegate::Information info) const;
/**
* @return Bitvalue for \p info that is stored in a ViewProperties instance.
+ * Is required only for backward compatibility with the version 1 of
+ * the view-properties.
*/
int bitValue(KFileItemDelegate::Information info) const;
const char* const actionCollectionName;
const char* const context;
const char* const translation;
+ const char* const value;
const DolphinView::Sorting sorting;
- const int bitValue;
+ const int bitValue; // for backward compatibility with version 1 of view-properties
};
KFileItemDelegate::InformationList m_informations;
{
if (m_node->viewMode() != mode) {
m_node->setViewMode(mode);
- updateTimeStamp();
+ update();
}
}
{
if (m_node->showPreview() != show) {
m_node->setShowPreview(show);
- updateTimeStamp();
+ update();
}
}
{
if (m_node->showHiddenFiles() != show) {
m_node->setShowHiddenFiles(show);
- updateTimeStamp();
+ update();
}
}
{
if (m_node->categorizedSorting() != categorized) {
m_node->setCategorizedSorting(categorized);
- updateTimeStamp();
+ update();
}
}
{
if (m_node->sorting() != sorting) {
m_node->setSorting(sorting);
- updateTimeStamp();
+ update();
}
}
{
if (m_node->sortOrder() != sortOrder) {
m_node->setSortOrder(sortOrder);
- updateTimeStamp();
+ update();
}
}
{
if (m_node->sortFoldersFirst() != foldersFirst) {
m_node->setSortFoldersFirst(foldersFirst);
- updateTimeStamp();
+ update();
}
}
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();
}
}
{
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;
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()
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()) {
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;
}
void setAutoSaveEnabled(bool autoSave);
bool isAutoSaveEnabled() const;
- void updateTimeStamp();
+ void update();
/**
* Saves the view properties for the directory specified
QString destinationDir(const QString& subDir) const;
/**
- * Returns the encoded additional information that can be stored
- * in the .directory file. See ViewProperties::decodedAdditionalInfo()
- * for the coding format.
- * @param info Additional information for the current view mode.
+ * Helper method for ViewProperties::additionalInfo(): Returns
+ * the additional info for the outdated version 1 of the view-properties.
*/
- int encodedAdditionalInfo(int info) const;
+ KFileItemDelegate::InformationList additionalInfoV1() const;
/**
- * Returns the decoded additional information from the .directory
- * file by respecting the current set view mode. The additional
- * information from the .directory file is an integer value, where:
- * - Byte 0 stores the additional info for the details view
- * - Byte 1 stores the additional info for the icons view
- * - Byte 2 stores the additional info for the column view
- * The additional information property is the only property that is
- * dependent from another property (in this case the view-mode).
+ * Helper method for ViewProperties::additionalInfo(): Returns
+ * the additional info for the current version 2 of the view-properties.
*/
- int decodedAdditionalInfo() const;
+ KFileItemDelegate::InformationList additionalInfoV2() const;
+
+ /**
+ * Returns the view-mode prefix when storing additional properties for
+ * a view-mode.
+ */
+ QString viewModePrefix() const;
Q_DISABLE_COPY(ViewProperties)