Change "Date" to "Modified" and allow access to new "Accessed" time field

This is merge of #128964 and #128942.  This will impelement changing the "Date" field to "Modified" and allow a new "Accessed" time field to be available.  This also includes changes to update configuration files.

REVIEW: 129077
This commit is contained in:
Don Nguyen 2017-01-21 00:04:38 +01:00 committed by Albert Astals Cid
parent d8ffea2476
commit 0aed243beb
8 changed files with 78 additions and 35 deletions

View file

@ -80,7 +80,7 @@ QString KFileItemListWidgetInformant::roleText(const QByteArray& role,
const KIO::filesize_t size = roleValue.value<KIO::filesize_t>();
text = KFormat().formatByteSize(size);
}
} else if (role == "date") {
} else if (role == "modificationtime" || role == "accesstime") {
const QDateTime dateTime = roleValue.toDateTime();
text = QLocale().toString(dateTime, QLocale::ShortFormat);
} else {

View file

@ -328,7 +328,8 @@ QList<QPair<int, QVariant> > KFileItemModel::groups() const
switch (typeForRole(sortRole())) {
case NameRole: m_groups = nameRoleGroups(); break;
case SizeRole: m_groups = sizeRoleGroups(); break;
case DateRole: m_groups = dateRoleGroups(); break;
case ModificationTimeRole: m_groups = timeRoleGroups(KFileItem::ModificationTime); break;
case AccessTimeRole: m_groups = timeRoleGroups(KFileItem::AccessTime); break;
case PermissionsRole: m_groups = permissionRoleGroups(); break;
case RatingRole: m_groups = ratingRoleGroups(); break;
default: m_groups = genericStringRoleGroups(sortRole()); break;
@ -1532,12 +1533,20 @@ QHash<QByteArray, QVariant> KFileItemModel::retrieveData(const KFileItem& item,
data.insert(sharedValue("size"), item.size());
}
if (m_requestRole[DateRole]) {
if (m_requestRole[ModificationTimeRole]) {
// Don't use KFileItem::timeString() as this is too expensive when
// having several thousands of items. Instead the formatting of the
// date-time will be done on-demand by the view when the date will be shown.
const QDateTime dateTime = item.time(KFileItem::ModificationTime);
data.insert(sharedValue("date"), dateTime);
data.insert(sharedValue("modificationtime"), dateTime);
}
if (m_requestRole[AccessTimeRole]) {
// Don't use KFileItem::timeString() as this is too expensive when
// having several thousands of items. Instead the formatting of the
// date-time will be done on-demand by the view when the date will be shown.
const QDateTime dateTime = item.time(KFileItem::AccessTime);
data.insert(sharedValue("accesstime"), dateTime);
}
if (m_requestRole[PermissionsRole]) {
@ -1762,7 +1771,7 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const
break;
}
case DateRole: {
case ModificationTimeRole: {
const QDateTime dateTimeA = itemA.time(KFileItem::ModificationTime);
const QDateTime dateTimeB = itemB.time(KFileItem::ModificationTime);
if (dateTimeA < dateTimeB) {
@ -1942,7 +1951,7 @@ QList<QPair<int, QVariant> > KFileItemModel::sizeRoleGroups() const
return groups;
}
QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
QList<QPair<int, QVariant> > KFileItemModel::timeRoleGroups(KFileItem::FileTimes which) const
{
Q_ASSERT(!m_itemData.isEmpty());
@ -1951,26 +1960,26 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
const QDate currentDate = QDate::currentDate();
QDate previousModifiedDate;
QDate previousFileDate;
QString groupValue;
for (int i = 0; i <= maxIndex; ++i) {
if (isChildItem(i)) {
continue;
}
const QDateTime modifiedTime = m_itemData.at(i)->item.time(KFileItem::ModificationTime);
const QDate modifiedDate = modifiedTime.date();
if (modifiedDate == previousModifiedDate) {
const QDateTime fileTime = m_itemData.at(i)->item.time(which);
const QDate fileDate = fileTime.date();
if (fileDate == previousFileDate) {
// The current item is in the same group as the previous item
continue;
}
previousModifiedDate = modifiedDate;
previousFileDate = fileDate;
const int daysDistance = modifiedDate.daysTo(currentDate);
const int daysDistance = fileDate.daysTo(currentDate);
QString newGroupValue;
if (currentDate.year() == modifiedDate.year() &&
currentDate.month() == modifiedDate.month()) {
if (currentDate.year() == fileDate.year() &&
currentDate.month() == fileDate.month()) {
switch (daysDistance / 7) {
case 0:
@ -1978,7 +1987,7 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
case 0: newGroupValue = i18nc("@title:group Date", "Today"); break;
case 1: newGroupValue = i18nc("@title:group Date", "Yesterday"); break;
default:
newGroupValue = modifiedTime.toString(
newGroupValue = fileTime.toString(
i18nc("@title:group Date: The week day name: dddd", "dddd"));
newGroupValue = i18nc("Can be used to script translation of \"dddd\""
"with context @title:group Date", "%1", newGroupValue);
@ -2002,18 +2011,18 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
}
} else {
const QDate lastMonthDate = currentDate.addMonths(-1);
if (lastMonthDate.year() == modifiedDate.year() &&
lastMonthDate.month() == modifiedDate.month()) {
if (lastMonthDate.year() == fileDate.year() &&
lastMonthDate.month() == fileDate.month()) {
if (daysDistance == 1) {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"MMMM is full month name in current locale, and yyyy is "
"full year number", "'Yesterday' (MMMM, yyyy)"));
newGroupValue = i18nc("Can be used to script translation of "
"\"'Yesterday' (MMMM, yyyy)\" with context @title:group Date",
"%1", newGroupValue);
} else if (daysDistance <= 7) {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"The week day name: dddd, MMMM is full month name "
"in current locale, and yyyy is full year number",
"dddd (MMMM, yyyy)"));
@ -2021,28 +2030,28 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
"\"dddd (MMMM, yyyy)\" with context @title:group Date",
"%1", newGroupValue);
} else if (daysDistance <= 7 * 2) {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"MMMM is full month name in current locale, and yyyy is "
"full year number", "'One Week Ago' (MMMM, yyyy)"));
newGroupValue = i18nc("Can be used to script translation of "
"\"'One Week Ago' (MMMM, yyyy)\" with context @title:group Date",
"%1", newGroupValue);
} else if (daysDistance <= 7 * 3) {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"MMMM is full month name in current locale, and yyyy is "
"full year number", "'Two Weeks Ago' (MMMM, yyyy)"));
newGroupValue = i18nc("Can be used to script translation of "
"\"'Two Weeks Ago' (MMMM, yyyy)\" with context @title:group Date",
"%1", newGroupValue);
} else if (daysDistance <= 7 * 4) {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"MMMM is full month name in current locale, and yyyy is "
"full year number", "'Three Weeks Ago' (MMMM, yyyy)"));
newGroupValue = i18nc("Can be used to script translation of "
"\"'Three Weeks Ago' (MMMM, yyyy)\" with context @title:group Date",
"%1", newGroupValue);
} else {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"MMMM is full month name in current locale, and yyyy is "
"full year number", "'Earlier on' MMMM, yyyy"));
newGroupValue = i18nc("Can be used to script translation of "
@ -2050,7 +2059,7 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
"%1", newGroupValue);
}
} else {
newGroupValue = modifiedTime.toString(i18nc("@title:group "
newGroupValue = fileTime.toString(i18nc("@title:group "
"The month and year: MMMM is full month name in current locale, "
"and yyyy is full year number", "MMMM, yyyy"));
newGroupValue = i18nc("Can be used to script translation of "
@ -2221,7 +2230,8 @@ const KFileItemModel::RoleInfoMap* KFileItemModel::rolesInfoMap(int& count)
{ 0, NoRole, 0, 0, 0, 0, false, false },
{ "text", NameRole, I18N_NOOP2_NOSTRIP("@label", "Name"), 0, 0, false, false },
{ "size", SizeRole, I18N_NOOP2_NOSTRIP("@label", "Size"), 0, 0, false, false },
{ "date", DateRole, I18N_NOOP2_NOSTRIP("@label", "Date"), 0, 0, false, false },
{ "modificationtime", ModificationTimeRole, I18N_NOOP2_NOSTRIP("@label", "Modified"), 0, 0, false, false },
{ "accesstime", AccessTimeRole, I18N_NOOP2_NOSTRIP("@label", "Accessed"), 0, 0, false, false },
{ "type", TypeRole, I18N_NOOP2_NOSTRIP("@label", "Type"), 0, 0, false, false },
{ "rating", RatingRole, I18N_NOOP2_NOSTRIP("@label", "Rating"), 0, 0, true, false },
{ "tags", TagsRole, I18N_NOOP2_NOSTRIP("@label", "Tags"), 0, 0, true, false },

View file

@ -280,7 +280,7 @@ private slots:
private:
enum RoleType {
// User visible roles:
NoRole, NameRole, SizeRole, DateRole, PermissionsRole, OwnerRole,
NoRole, NameRole, SizeRole, ModificationTimeRole, AccessTimeRole, PermissionsRole, OwnerRole,
GroupRole, TypeRole, DestinationRole, PathRole,
// User visible roles available with Baloo:
CommentRole, TagsRole, RatingRole, ImageSizeRole, OrientationRole,
@ -383,7 +383,7 @@ private:
QList<QPair<int, QVariant> > nameRoleGroups() const;
QList<QPair<int, QVariant> > sizeRoleGroups() const;
QList<QPair<int, QVariant> > dateRoleGroups() const;
QList<QPair<int, QVariant> > timeRoleGroups(KFileItem::FileTimes which) const;
QList<QPair<int, QVariant> > permissionRoleGroups() const;
QList<QPair<int, QVariant> > ratingRoleGroups() const;
QList<QPair<int, QVariant> > genericStringRoleGroups(const QByteArray& typeForRole) const;

View file

@ -872,7 +872,7 @@ PlacesItem* PlacesItemModel::createSystemPlacesItem(const SystemBookmarkData& da
props.setVisibleRoles({"text"});
} else if (data.url.scheme() == QLatin1String("timeline")) {
props.setViewMode(DolphinView::DetailsView);
props.setVisibleRoles({"text", "date"});
props.setVisibleRoles({"text", "modificationtime"});
}
}
}

View file

@ -303,7 +303,7 @@ void ViewPropertiesDialog::configureAdditionalInfo()
visibleRoles.clear();
visibleRoles.append("text");
visibleRoles.append("size");
visibleRoles.append("date");
visibleRoles.append("modificationtime");
m_viewProps->setVisibleRoles(visibleRoles);
}

View file

@ -882,8 +882,8 @@ void KFileItemModelTest::testSorting()
// Sort by Date, descending
m_model->setSortDirectoriesFirst(true);
m_model->setSortRole("date");
QCOMPARE(m_model->sortRole(), QByteArray("date"));
m_model->setSortRole("modificationtime");
QCOMPARE(m_model->sortRole(), QByteArray("modificationtime"));
QCOMPARE(m_model->sortOrder(), Qt::DescendingOrder);
QCOMPARE(itemsInModel(), QStringList() << "c" << "c-2" << "c-3" << "c-1" << "b" << "d" << "a" << "e");
QCOMPARE(itemsMovedSpy.count(), 1);
@ -892,7 +892,7 @@ void KFileItemModelTest::testSorting()
// Sort by Date, ascending
m_model->setSortOrder(Qt::AscendingOrder);
QCOMPARE(m_model->sortRole(), QByteArray("date"));
QCOMPARE(m_model->sortRole(), QByteArray("modificationtime"));
QCOMPARE(m_model->sortOrder(), Qt::AscendingOrder);
QCOMPARE(itemsInModel(), QStringList() << "c" << "c-2" << "c-3" << "c-1" << "e" << "a" << "d" << "b");
QCOMPARE(itemsMovedSpy.count(), 1);
@ -901,7 +901,7 @@ void KFileItemModelTest::testSorting()
// Sort by Date, ascending, 'Sort Folders First' disabled
m_model->setSortDirectoriesFirst(false);
QCOMPARE(m_model->sortRole(), QByteArray("date"));
QCOMPARE(m_model->sortRole(), QByteArray("modificationtime"));
QCOMPARE(m_model->sortOrder(), Qt::AscendingOrder);
QVERIFY(!m_model->sortDirectoriesFirst());
QCOMPARE(itemsInModel(), QStringList() << "e" << "a" << "c" << "c-1" << "c-2" << "c-3" << "d" << "b");

View file

@ -35,7 +35,8 @@
namespace {
const int AdditionalInfoViewPropertiesVersion = 1;
const int NameRolePropertiesVersion = 2;
const int CurrentViewPropertiesVersion = 3;
const int DateRolePropertiesVersion = 4;
const int CurrentViewPropertiesVersion = 4;
// String representation to mark the additional properties of
// the details view as customized by the user. See
@ -123,6 +124,11 @@ ViewProperties::ViewProperties(const QUrl& url) :
Q_ASSERT(m_node->version() == NameRolePropertiesVersion);
}
if (m_node->version() < DateRolePropertiesVersion) {
convertDateRoleToModificationTimeRole();
Q_ASSERT(m_node->version() == DateRolePropertiesVersion);
}
m_node->setVersion(CurrentViewPropertiesVersion);
}
}
@ -309,7 +315,7 @@ QList<QByteArray> ViewProperties::visibleRoles() const
&& !visibleRoles.contains(CustomizedDetailsString);
if (useDefaultValues) {
roles.append("size");
roles.append("date");
roles.append("modificationtime");
}
return roles;
@ -448,6 +454,27 @@ void ViewProperties::convertNameRoleToTextRole()
update();
}
void ViewProperties::convertDateRoleToModificationTimeRole()
{
QStringList visibleRoles = m_node->visibleRoles();
for (int i = 0; i < visibleRoles.count(); ++i) {
if (visibleRoles[i].endsWith(QLatin1String("_date"))) {
const int leftLength = visibleRoles[i].length() - 5;
visibleRoles[i] = visibleRoles[i].left(leftLength) + "_modificationtime";
}
}
QString sortRole = m_node->sortRole();
if (sortRole == QLatin1String("date")) {
sortRole = QStringLiteral("modificationtime");
}
m_node->setVisibleRoles(visibleRoles);
m_node->setSortRole(sortRole);
m_node->setVersion(DateRolePropertiesVersion);
update();
}
bool ViewProperties::isPartOfHome(const QString& filePath)
{
// For performance reasons cache the path in a static QString

View file

@ -153,6 +153,12 @@ private:
*/
void convertNameRoleToTextRole();
/**
* Provides backward compatibility with .directory files created with
* Dolphin < 16.11.70: Converts the old name-role "date" to "modificationtime"
*/
void convertDateRoleToModificationTimeRole();
/**
* Returns true, if \a filePath is part of the home-path (see QDir::homePath()).
*/