]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemmodel.cpp
Add "Aspect Ratio" and "Frame Rate" to additional video information columns
[dolphin.git] / src / kitemviews / kfileitemmodel.cpp
index d2c8429ac3aa9404d777519cdbbe5c333591c5a4..b14647b42bd28e77114b8afda6ccdad64e0b7a85 100644 (file)
@@ -304,6 +304,9 @@ QString KFileItemModel::roleDescription(const QByteArray& role) const
         int count = 0;
         const RoleInfoMap* map = rolesInfoMap(count);
         for (int i = 0; i < count; ++i) {
+           if (!map[i].roleTranslation) {
+                   continue;
+           }
             description.insert(map[i].role, i18nc(map[i].roleTranslationContext, map[i].roleTranslation));
         }
     }
@@ -786,7 +789,7 @@ void KFileItemModel::onGroupedSortingChanged(bool current)
     m_groups.clear();
 }
 
-void KFileItemModel::onSortRoleChanged(const QByteArray& current, const QByteArray& previous)
+void KFileItemModel::onSortRoleChanged(const QByteArray& current, const QByteArray& previous, bool resortItems)
 {
     Q_UNUSED(previous);
     m_sortRole = typeForRole(current);
@@ -797,7 +800,9 @@ void KFileItemModel::onSortRoleChanged(const QByteArray& current, const QByteArr
         setRoles(newRoles);
     }
 
-    resortAllItems();
+    if (resortItems) {
+        resortAllItems();
+    }
 }
 
 void KFileItemModel::onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous)
@@ -1119,7 +1124,7 @@ void KFileItemModel::slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >&
     }
 
     // Extract the item-ranges out of the changed indexes
-    qSort(indexes);
+    std::sort(indexes.begin(), indexes.end());
     const KItemRangeList itemRangeList = KItemRangeList::fromSortedContainer(indexes);
     emitItemsChangedAndTriggerResorting(itemRangeList, changedRoles);
 }
@@ -1550,8 +1555,8 @@ QHash<QByteArray, QVariant> KFileItemModel::retrieveData(const KFileItem& item,
         data.insert(sharedValue("isLink"), true);
     }
 
-    if (m_requestRole[IsHiddenRole] && item.isHidden()) {
-        data.insert(sharedValue("isHidden"), true);
+    if (m_requestRole[IsHiddenRole]) {
+        data.insert(sharedValue("isHidden"), item.isHidden());
     }
 
     if (m_requestRole[NameRole]) {
@@ -1563,26 +1568,26 @@ QHash<QByteArray, QVariant> KFileItemModel::retrieveData(const KFileItem& item,
     }
 
     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);
+        // Don't use KFileItem::timeString() or KFileItem::time() as this is too expensive when
+        // having several thousands of items. Instead read the raw number from UDSEntry directly
+        // and the formatting of the date-time will be done on-demand by the view when the date will be shown.
+        const long long dateTime = item.entry().numberValue(KIO::UDSEntry::UDS_MODIFICATION_TIME, -1);
         data.insert(sharedValue("modificationtime"), dateTime);
     }
 
     if (m_requestRole[CreationTimeRole]) {
-        // 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::CreationTime);
+        // Don't use KFileItem::timeString() or KFileItem::time() as this is too expensive when
+        // having several thousands of items. Instead read the raw number from UDSEntry directly
+        // and the formatting of the date-time will be done on-demand by the view when the date will be shown.
+        const long long dateTime = item.entry().numberValue(KIO::UDSEntry::UDS_CREATION_TIME, -1);
         data.insert(sharedValue("creationtime"), 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);
+        // Don't use KFileItem::timeString() or KFileItem::time() as this is too expensive when
+        // having several thousands of items. Instead read the raw number from UDSEntry directly
+        // and the formatting of the date-time will be done on-demand by the view when the date will be shown.
+        const long long dateTime = item.entry().numberValue(KIO::UDSEntry::UDS_ACCESS_TIME, -1);
         data.insert(sharedValue("accesstime"), dateTime);
     }
 
@@ -1712,8 +1717,8 @@ bool KFileItemModel::lessThan(const ItemData* a, const ItemData* b, const QColla
     return (sortOrder() == Qt::AscendingOrder) ? result < 0 : result > 0;
 }
 
-void KFileItemModel::sort(QList<KFileItemModel::ItemData*>::iterator begin,
-                          QList<KFileItemModel::ItemData*>::iterator end) const
+void KFileItemModel::sort(const QList<KFileItemModel::ItemData*>::iterator &begin,
+                          const QList<KFileItemModel::ItemData*>::iterator &end) const
 {
     auto lambdaLessThan = [&] (const KFileItemModel::ItemData* a, const KFileItemModel::ItemData* b)
     {
@@ -1977,7 +1982,7 @@ QList<QPair<int, QVariant> > KFileItemModel::sizeRoleGroups() const
     return groups;
 }
 
-QList<QPair<int, QVariant> > KFileItemModel::timeRoleGroups(std::function<QDateTime(const ItemData *)> fileTimeCb) const
+QList<QPair<int, QVariant> > KFileItemModel::timeRoleGroups(const std::function<QDateTime(const ItemData *)> &fileTimeCb) const
 {
     Q_ASSERT(!m_itemData.isEmpty());
 
@@ -2041,12 +2046,20 @@ QList<QPair<int, QVariant> > KFileItemModel::timeRoleGroups(std::function<QDateT
                  lastMonthDate.month() == fileDate.month()) {
 
                 if (daysDistance == 1) {
-                    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);
+                    const KLocalizedString format = ki18nc("@title:group Date: "
+                                                    "MMMM is full month name in current locale, and yyyy is "
+                                                    "full year number", "'Yesterday' (MMMM, yyyy)");
+                    const QString translatedFormat = format.toString();
+                    if (translatedFormat.count(QLatin1Char('\'')) == 2) {
+                        newGroupValue = fileTime.toString(translatedFormat);
+                        newGroupValue = i18nc("Can be used to script translation of "
+                            "\"'Yesterday' (MMMM, yyyy)\" with context @title:group Date",
+                            "%1", newGroupValue);
+                    } else {
+                        qCWarning(DolphinDebug).nospace() << "A wrong translation was found: " << translatedFormat << ". Please file a bug report at bugs.kde.org";
+                        const QString untranslatedFormat = format.toString({ QLatin1String("en_US") });
+                        newGroupValue = fileTime.toString(untranslatedFormat);
+                    }
                 } else if (daysDistance <= 7) {
                     newGroupValue = fileTime.toString(i18nc("@title:group Date: "
                         "The week day name: dddd, MMMM is full month name "
@@ -2056,33 +2069,65 @@ QList<QPair<int, QVariant> > KFileItemModel::timeRoleGroups(std::function<QDateT
                         "\"dddd (MMMM, yyyy)\" with context @title:group Date",
                         "%1", newGroupValue);
                 } else if (daysDistance <= 7 * 2) {
-                    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);
+                    const KLocalizedString format = ki18nc("@title:group Date: "
+                                                           "MMMM is full month name in current locale, and yyyy is "
+                                                           "full year number", "'One Week Ago' (MMMM, yyyy)");
+                    const QString translatedFormat = format.toString();
+                    if (translatedFormat.count(QLatin1Char('\'')) == 2) {
+                        newGroupValue = fileTime.toString(translatedFormat);
+                        newGroupValue = i18nc("Can be used to script translation of "
+                            "\"'One Week Ago' (MMMM, yyyy)\" with context @title:group Date",
+                            "%1", newGroupValue);
+                    } else {
+                        qCWarning(DolphinDebug).nospace() << "A wrong translation was found: " << translatedFormat << ". Please file a bug report at bugs.kde.org";
+                        const QString untranslatedFormat = format.toString({ QLatin1String("en_US") });
+                        newGroupValue = fileTime.toString(untranslatedFormat);
+                    }
                 } else if (daysDistance <= 7 * 3) {
-                    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);
+                    const KLocalizedString format = ki18nc("@title:group Date: "
+                                                           "MMMM is full month name in current locale, and yyyy is "
+                                                           "full year number", "'Two Weeks Ago' (MMMM, yyyy)");
+                    const QString translatedFormat = format.toString();
+                    if (translatedFormat.count(QLatin1Char('\'')) == 2) {
+                        newGroupValue = fileTime.toString(translatedFormat);
+                        newGroupValue = i18nc("Can be used to script translation of "
+                            "\"'Two Weeks Ago' (MMMM, yyyy)\" with context @title:group Date",
+                            "%1", newGroupValue);
+                    } else {
+                        qCWarning(DolphinDebug).nospace() << "A wrong translation was found: " << translatedFormat << ". Please file a bug report at bugs.kde.org";
+                        const QString untranslatedFormat = format.toString({ QLatin1String("en_US") });
+                        newGroupValue = fileTime.toString(untranslatedFormat);
+                    }
                 } else if (daysDistance <= 7 * 4) {
-                    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);
+                    const KLocalizedString format = ki18nc("@title:group Date: "
+                                                           "MMMM is full month name in current locale, and yyyy is "
+                                                           "full year number", "'Three Weeks Ago' (MMMM, yyyy)");
+                    const QString translatedFormat = format.toString();
+                    if (translatedFormat.count(QLatin1Char('\'')) == 2) {
+                        newGroupValue = fileTime.toString(translatedFormat);
+                        newGroupValue = i18nc("Can be used to script translation of "
+                            "\"'Three Weeks Ago' (MMMM, yyyy)\" with context @title:group Date",
+                            "%1", newGroupValue);
+                    } else {
+                        qCWarning(DolphinDebug).nospace() << "A wrong translation was found: " << translatedFormat << ". Please file a bug report at bugs.kde.org";
+                        const QString untranslatedFormat = format.toString({ QLatin1String("en_US") });
+                        newGroupValue = fileTime.toString(untranslatedFormat);
+                    }
                 } else {
-                    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 "
-                        "\"'Earlier on' MMMM, yyyy\" with context @title:group Date",
-                        "%1", newGroupValue);
+                    const KLocalizedString format = ki18nc("@title:group Date: "
+                                                           "MMMM is full month name in current locale, and yyyy is "
+                                                           "full year number", "'Earlier on' MMMM, yyyy");
+                    const QString translatedFormat = format.toString();
+                    if (translatedFormat.count(QLatin1Char('\'')) == 2) {
+                        newGroupValue = fileTime.toString(translatedFormat);
+                        newGroupValue = i18nc("Can be used to script translation of "
+                            "\"'Earlier on' MMMM, yyyy\" with context @title:group Date",
+                            "%1", newGroupValue);
+                    } else {
+                        qCWarning(DolphinDebug).nospace() << "A wrong translation was found: " << translatedFormat << ". Please file a bug report at bugs.kde.org";
+                        const QString untranslatedFormat = format.toString({ QLatin1String("en_US") });
+                        newGroupValue = fileTime.toString(untranslatedFormat);
+                    }
                 }
             } else {
                 newGroupValue = fileTime.toString(i18nc("@title:group "
@@ -2277,6 +2322,8 @@ const KFileItemModel::RoleInfoMap* KFileItemModel::rolesInfoMap(int& count)
         { "bitrate",     BitrateRole,     I18N_NOOP2_NOSTRIP("@label", "Bitrate"),          I18N_NOOP2_NOSTRIP("@label", "Audio"),    true,  true  },
         { "track",       TrackRole,       I18N_NOOP2_NOSTRIP("@label", "Track"),            I18N_NOOP2_NOSTRIP("@label", "Audio"),    true,  true  },
         { "releaseYear", ReleaseYearRole, I18N_NOOP2_NOSTRIP("@label", "Release Year"),     I18N_NOOP2_NOSTRIP("@label", "Audio"),    true,  true  },
+        { "aspectRatio", AspectRatioRole, I18N_NOOP2_NOSTRIP("@label", "Aspect Ratio"),     I18N_NOOP2_NOSTRIP("@label", "Video"),    true,  true  },
+        { "frameRate",   FrameRateRole,   I18N_NOOP2_NOSTRIP("@label", "Frame Rate"),       I18N_NOOP2_NOSTRIP("@label", "Video"),    true,  true  },
         { "path",        PathRole,        I18N_NOOP2_NOSTRIP("@label", "Path"),             I18N_NOOP2_NOSTRIP("@label", "Other"),    false, false },
         { "deletiontime",DeletionTimeRole,I18N_NOOP2_NOSTRIP("@label", "Deletion Time"),    I18N_NOOP2_NOSTRIP("@label", "Other"),    false, false },
         { "destination", DestinationRole, I18N_NOOP2_NOSTRIP("@label", "Link Destination"), I18N_NOOP2_NOSTRIP("@label", "Other"),    false, false },