From 24f8ae41567182dc1ba3521b5738ea34b87bb4f2 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Mon, 13 Jul 2020 14:57:11 +0200 Subject: [PATCH] DataTranslations: sort by supertype before name Fixes #9618 (which suggested using a tree view, but I think that's not useful, just proper sorting of the items seems fine to me) Change-Id: Ie1298eec048f9cb42528b8420a91e807e8f00eab Reviewed-on: https://review.haiku-os.org/c/haiku/+/3030 Reviewed-by: waddlesplash --- .../datatranslations/TranslatorListView.cpp | 26 ++++++++++++++++--- .../datatranslations/TranslatorListView.h | 3 +++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/preferences/datatranslations/TranslatorListView.cpp b/src/preferences/datatranslations/TranslatorListView.cpp index d7cf40a9c6..b4a9df8f6d 100644 --- a/src/preferences/datatranslations/TranslatorListView.cpp +++ b/src/preferences/datatranslations/TranslatorListView.cpp @@ -14,15 +14,22 @@ #include #include +#include +#include static int compare_items(const void* a, const void* b) { - const BStringItem* stringA = *(const BStringItem**)a; - const BStringItem* stringB = *(const BStringItem**)b; + const TranslatorItem* itemA = *(const TranslatorItem**)a; + const TranslatorItem* itemB = *(const TranslatorItem**)b; - return strcmp(stringA->Text(), stringB->Text()); + // Compare by supertype, then by name + int typeDiff = itemA->Supertype().Compare(itemB->Supertype()); + if (typeDiff != 0) + return typeDiff; + + return strcmp(itemA->Text(), itemB->Text()); } @@ -34,6 +41,19 @@ TranslatorItem::TranslatorItem(translator_id id, const char* name) BStringItem(name), fID(id) { + static BTranslatorRoster* roster = BTranslatorRoster::Default(); + + const translation_format* format; + int32 count; + roster->GetOutputFormats(id, &format, &count); + + // Find a supertype to categorize the item in ("application" is too generic, + // so exclude it unless it's the only one available) + do { + fSupertype = format->MIME; + int32 slash = fSupertype.FindFirst('/'); + fSupertype.Truncate(slash); + } while (fSupertype == "application" && --count != 0); } diff --git a/src/preferences/datatranslations/TranslatorListView.h b/src/preferences/datatranslations/TranslatorListView.h index 60400d8ca8..ad9c06c006 100644 --- a/src/preferences/datatranslations/TranslatorListView.h +++ b/src/preferences/datatranslations/TranslatorListView.h @@ -12,6 +12,7 @@ #include +#include #include @@ -21,9 +22,11 @@ public: virtual ~TranslatorItem(); translator_id ID() const { return fID; } + const BString& Supertype() const { return fSupertype; } private: translator_id fID; + BString fSupertype; };