From e77304562da050fbc739b99474f8b5bfad0cf5b2 Mon Sep 17 00:00:00 2001 From: Ryan Leavengood Date: Tue, 7 Aug 2012 00:29:32 -0400 Subject: [PATCH] Actually sort the translator menu used in ShowImage. There were two problems with the last commit: * the list needed to be outside of the top-level loop. * BList was just broken for sorting translation_format pointers. I fixed this by moving the loop outside and converting the translation_formats to translator_info, which has the translator_id, since that is needed to create the menu item, and would otherwise be unavailable outside the loop. I tried to get this working with BList, but the sorting was completely broken, and converting to BObjectList made the code much, much better and worked great. Screw BList and casting, hurray templated BObjectList. Really fixes #6782. --- headers/os/translation/TranslationUtils.h | 6 ++- src/kits/translation/TranslationUtils.cpp | 66 +++++++++++++++-------- 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/headers/os/translation/TranslationUtils.h b/headers/os/translation/TranslationUtils.h index 66c927af07..c501bbcb30 100644 --- a/headers/os/translation/TranslationUtils.h +++ b/headers/os/translation/TranslationUtils.h @@ -77,8 +77,10 @@ public: BTranslatorRoster* roster = NULL); private: - static int CompareTranslationFormatByName(const void* format1, - const void* format2); + static translator_info* _BuildTranslatorInfo(const translator_id id, + const translation_format* format); + static int _CompareTranslatorInfoByName(const translator_info* info1, + const translator_info* info2); static color_space sBitmapSpace; }; diff --git a/src/kits/translation/TranslationUtils.cpp b/src/kits/translation/TranslationUtils.cpp index 1d40796214..129a28dd95 100644 --- a/src/kits/translation/TranslationUtils.cpp +++ b/src/kits/translation/TranslationUtils.cpp @@ -17,9 +17,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -894,6 +894,8 @@ BTranslationUtils::AddTranslationItems(BMenu *intoMenu, uint32 fromType, if (err < B_OK) return err; + BObjectList infoList; + for (int tix = 0; tix < count; tix++) { const translation_format *formats = NULL; int32 numFormats = 0; @@ -911,34 +913,35 @@ BTranslationUtils::AddTranslationItems(BMenu *intoMenu, uint32 fromType, continue; // Get supported output formats - BList formatList; err = roster->GetOutputFormats(ids[tix], &formats, &numFormats); if (err == B_OK) { for (int oix = 0; oix < numFormats; oix++) { if (formats[oix].type != fromType) { - formatList.AddItem(const_cast( - &formats[oix])); + infoList.AddItem(_BuildTranslatorInfo(ids[tix], + const_cast(&formats[oix]))); } } } + } - // Sort alphabetically by name - formatList.SortItems(&CompareTranslationFormatByName); + // Sort alphabetically by name + infoList.SortItems(&_CompareTranslatorInfoByName); - // Now add the menu items - for (int i = 0; i < formatList.CountItems(); i++) { - translation_format* format = static_cast( - formatList.ItemAt(i)); + // Now add the menu items + for (int i = 0; i < infoList.CountItems(); i++) { + translator_info* info = infoList.ItemAt(i); - BMessage *itemmsg; - if (kModel) - itemmsg = new BMessage(*kModel); - else - itemmsg = new BMessage(B_TRANSLATION_MENU); - itemmsg->AddInt32(kTranslatorIdName, ids[tix]); - itemmsg->AddInt32(kTranslatorTypeName, format->type); - intoMenu->AddItem(new BMenuItem(format->name, itemmsg)); - } + BMessage *itemmsg; + if (kModel) + itemmsg = new BMessage(*kModel); + else + itemmsg = new BMessage(B_TRANSLATION_MENU); + itemmsg->AddInt32(kTranslatorIdName, info->translator); + itemmsg->AddInt32(kTranslatorTypeName, info->type); + intoMenu->AddItem(new BMenuItem(info->name, itemmsg)); + + // Delete object created in _BuildTranslatorInfo + delete info; } delete[] ids; @@ -946,9 +949,26 @@ BTranslationUtils::AddTranslationItems(BMenu *intoMenu, uint32 fromType, } -int -BTranslationUtils::CompareTranslationFormatByName(const void* format1, const void* format2) +translator_info* +BTranslationUtils::_BuildTranslatorInfo(const translator_id id, const translation_format* format) { - return strcasecmp(static_cast(format1)->name, - static_cast(format2)->name); + // Caller must delete + translator_info* info = new translator_info; + + info->translator = id; + info->type = format->type; + info->group = format->group; + info->quality = format->quality; + info->capability = format->capability; + strlcpy(info->name, format->name, sizeof(info->name)); + strlcpy(info->MIME, format->MIME, sizeof(info->MIME)); + + return info; +} + + +int +BTranslationUtils::_CompareTranslatorInfoByName(const translator_info* info1, const translator_info* info2) +{ + return strcasecmp(info1->name, info2->name); }