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 <[email protected]>
This commit is contained in:
Adrien Destugues
2020-07-18 19:35:19 +00:00
committed by waddlesplash
parent ebcb6f5f4f
commit 24f8ae4156
2 changed files with 26 additions and 3 deletions
@@ -14,15 +14,22 @@
#include <string.h> #include <string.h>
#include <Application.h> #include <Application.h>
#include <String.h>
#include <TranslatorRoster.h>
static int static int
compare_items(const void* a, const void* b) compare_items(const void* a, const void* b)
{ {
const BStringItem* stringA = *(const BStringItem**)a; const TranslatorItem* itemA = *(const TranslatorItem**)a;
const BStringItem* stringB = *(const BStringItem**)b; 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), BStringItem(name),
fID(id) 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);
} }
@@ -12,6 +12,7 @@
#include <ListView.h> #include <ListView.h>
#include <String.h>
#include <TranslationDefs.h> #include <TranslationDefs.h>
@@ -21,9 +22,11 @@ public:
virtual ~TranslatorItem(); virtual ~TranslatorItem();
translator_id ID() const { return fID; } translator_id ID() const { return fID; }
const BString& Supertype() const { return fSupertype; }
private: private:
translator_id fID; translator_id fID;
BString fSupertype;
}; };