mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-12 12:54:29 +00:00
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:
parent
d8ffea2476
commit
0aed243beb
|
@ -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 {
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()).
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue